Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Загрузка данных из файлов excel разных по структуре - Мир MS Excel

Старая форма входа
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Загрузка данных из файлов excel разных по структуре (Макросы/Sub)
Загрузка данных из файлов excel разных по структуре
Ed_Vard Дата: Вторник, 26.06.2018, 10:44 | Сообщение № 1
Группа: Пользователи
Ранг: Участник
Сообщений: 82
Репутация: 0 ±
Замечаний: 0% ±

Доброго времени суток уважаемы форумчане! Прошу помощи в следующем вопросе:
Есть файл excel скажем так - эталонный, в который необходимо загружать данные из других файлов имеющих различное расположение столбцов с нужными значениями, а также могут отсутствовать некоторые столбцы.
Идея для загрузки такова - что перед как загружать файл оператор открывает загружаемый файл - смотрит глазами где-какой столбец по счету, все ли нужные столбцы присутствуют или какие то отсутствуют и с какой строки начинать чтение файла. После этого в эталонном файле запускает макрос - выбирает нужный для обработки файл, затем появляется форма в которой нужно или отметить или ввести значения столбцов и начальной ячейки. Если нужного столбца в файле нет - то не использовать это значение. После чего запускается обработка файла и значения дописываться к уже загруженным данным.
Вот сам макрос
[vba]
Код

Sub Макрос1()
Dim FilePath$, FileName As String, intPos%
Dim WbRead As Workbook
Dim sh As Worksheet
Dim x, z(), i As Long, k As Long

Set shd = ActiveWorkbook.ActiveSheet 'определяем активный лист
'выбираем книгу для загрузки
    With Application.FileDialog(msoFileDialogFilePicker)
        .Title = "Папка для работы с файлами"
        .ButtonName = "Select": .AllowMultiSelect = False
        If .Show Then FilePath = .SelectedItems(1) Else Exit Sub
    End With
'выбираем книгу для загрузки

    Application.ScreenUpdating = False 'отключаем обновление экрана
    
    Set WbRead = Nothing: Set WbRead = Workbooks.Open(FileName:=FilePath, ReadOnly:=True) 'открывем файл для чтения
    
'сразу определяем имя файла для дальнейшего использования
    intPos = InStrRev(FilePath, "\")
    FileName = Right(FilePath, Len(FilePath) - intPos)
    '  MsgBox FileName
'сразу определяем имя файла для дальнейшего использования

    Set sh = WbRead.Worksheets(1) 'берем данные с первого листа
    x = sh.Range(sh.Range("a2"), sh.Range("a" & sh.Rows.Count).End(xlUp)).Resize(, 8) 'берем диапазон ячеек до последней заполненой в столбце А
    WbRead.Close False: DoEvents 'закрываем прочитаный файл без изменений
    ReDim z(1 To UBound(x), 1 To 8)
    With CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(x): .Item(x(i, 1)) = i: Next i 'заполняем
    For i = 1 To UBound(x) 'идем по строкам
        If .exists(x(i, 1)) Then
            k = .Item(x(i, 1))  'номер строки
                z(k, 1) = x(i, 1) 'заполняем значения
                z(k, 2) = x(i, 2)
                z(k, 3) = x(i, 3)
                z(k, 4) = x(i, 4)
                z(k, 5) = x(i, 5)
                z(k, 6) = x(i, 6)
                z(k, 7) = FileName
                z(k, 8) = Date
            End If
        Next i
    End With
    
    'в этом месте не получается вернуть значения на лист с учетом того, что на листе есть данные (((:
    'и нужно дописывать в конец

    Application.DisplayAlerts = False
    Application.DisplayAlerts = True
End Sub
[/vba]

Прошу помощи в следующем:
1. Подскажите пожалуйста вернуть данные на лист с учетом ранее введенных данных - т.е. продолжить а не перезаписывать.
2. Как создать форму для ввода или выбора значений и передачи выбора в макрос

Заранее спасибо за ответ.
Файл с образцом прилагаю.
К сообщению приложен файл: 7764229.xls (36.5 Kb) · __.zip (18.2 Kb)


Сообщение отредактировал Ed_Vard - Вторник, 26.06.2018, 10:56
 
Ответить
СообщениеДоброго времени суток уважаемы форумчане! Прошу помощи в следующем вопросе:
Есть файл excel скажем так - эталонный, в который необходимо загружать данные из других файлов имеющих различное расположение столбцов с нужными значениями, а также могут отсутствовать некоторые столбцы.
Идея для загрузки такова - что перед как загружать файл оператор открывает загружаемый файл - смотрит глазами где-какой столбец по счету, все ли нужные столбцы присутствуют или какие то отсутствуют и с какой строки начинать чтение файла. После этого в эталонном файле запускает макрос - выбирает нужный для обработки файл, затем появляется форма в которой нужно или отметить или ввести значения столбцов и начальной ячейки. Если нужного столбца в файле нет - то не использовать это значение. После чего запускается обработка файла и значения дописываться к уже загруженным данным.
Вот сам макрос
[vba]
Код

Sub Макрос1()
Dim FilePath$, FileName As String, intPos%
Dim WbRead As Workbook
Dim sh As Worksheet
Dim x, z(), i As Long, k As Long

Set shd = ActiveWorkbook.ActiveSheet 'определяем активный лист
'выбираем книгу для загрузки
    With Application.FileDialog(msoFileDialogFilePicker)
        .Title = "Папка для работы с файлами"
        .ButtonName = "Select": .AllowMultiSelect = False
        If .Show Then FilePath = .SelectedItems(1) Else Exit Sub
    End With
'выбираем книгу для загрузки

    Application.ScreenUpdating = False 'отключаем обновление экрана
    
    Set WbRead = Nothing: Set WbRead = Workbooks.Open(FileName:=FilePath, ReadOnly:=True) 'открывем файл для чтения
    
'сразу определяем имя файла для дальнейшего использования
    intPos = InStrRev(FilePath, "\")
    FileName = Right(FilePath, Len(FilePath) - intPos)
    '  MsgBox FileName
'сразу определяем имя файла для дальнейшего использования

    Set sh = WbRead.Worksheets(1) 'берем данные с первого листа
    x = sh.Range(sh.Range("a2"), sh.Range("a" & sh.Rows.Count).End(xlUp)).Resize(, 8) 'берем диапазон ячеек до последней заполненой в столбце А
    WbRead.Close False: DoEvents 'закрываем прочитаный файл без изменений
    ReDim z(1 To UBound(x), 1 To 8)
    With CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(x): .Item(x(i, 1)) = i: Next i 'заполняем
    For i = 1 To UBound(x) 'идем по строкам
        If .exists(x(i, 1)) Then
            k = .Item(x(i, 1))  'номер строки
                z(k, 1) = x(i, 1) 'заполняем значения
                z(k, 2) = x(i, 2)
                z(k, 3) = x(i, 3)
                z(k, 4) = x(i, 4)
                z(k, 5) = x(i, 5)
                z(k, 6) = x(i, 6)
                z(k, 7) = FileName
                z(k, 8) = Date
            End If
        Next i
    End With
    
    'в этом месте не получается вернуть значения на лист с учетом того, что на листе есть данные (((:
    'и нужно дописывать в конец

    Application.DisplayAlerts = False
    Application.DisplayAlerts = True
End Sub
[/vba]

Прошу помощи в следующем:
1. Подскажите пожалуйста вернуть данные на лист с учетом ранее введенных данных - т.е. продолжить а не перезаписывать.
2. Как создать форму для ввода или выбора значений и передачи выбора в макрос

Заранее спасибо за ответ.
Файл с образцом прилагаю.

Автор - Ed_Vard
Дата добавления - 26.06.2018 в 10:44
Hugo Дата: Вторник, 26.06.2018, 10:55 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3250
Репутация: 707 ±
Замечаний: 0% ±

2019
По коду - похоже пытались переделывать что-то моё, я тоже люблю в одной строке словарь заполнять :)
Но словарь тут вообще и совершенно лишний, в этом конкретном коде.
По задаче - если уж оператор сперва открывает файл и на него смотрит - то можно тут же по Alt+F8 запустить код, а он уже посредством инпутбоксов типа8 попросит оператора ткнуть мышью в нужные заголовки столбцов - так сразу и файл укажете, и начало таблицы, и расположение столбцов, и каких столбцов нет можно определить.
Это как идея, писать не хочется...


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеПо коду - похоже пытались переделывать что-то моё, я тоже люблю в одной строке словарь заполнять :)
Но словарь тут вообще и совершенно лишний, в этом конкретном коде.
По задаче - если уж оператор сперва открывает файл и на него смотрит - то можно тут же по Alt+F8 запустить код, а он уже посредством инпутбоксов типа8 попросит оператора ткнуть мышью в нужные заголовки столбцов - так сразу и файл укажете, и начало таблицы, и расположение столбцов, и каких столбцов нет можно определить.
Это как идея, писать не хочется...

Автор - Hugo
Дата добавления - 26.06.2018 в 10:55
Ed_Vard Дата: Вторник, 26.06.2018, 11:08 | Сообщение № 3
Группа: Пользователи
Ранг: Участник
Сообщений: 82
Репутация: 0 ±
Замечаний: 0% ±

По коду - похоже пытались переделывать что-то моё, я тоже люблю в одной строке словарь заполнять

Добрый день!
Да - в качестве основы использовал несколько вариантов вашего кода, за что прошу прощения
Но словарь тут вообще и совершенно лишний, в этом конкретном коде.

Дело в том - что возможно в дальнейшем нужно будет производить какие то вычисления - поэтому использовал словарь. Простой перенос из файла проблем не вызывал.
то можно тут же по Alt+F8 запустить код, а он уже посредством инпутбоксов типа8 попросит оператора ткнуть мышью в нужные заголовки столбцов - так сразу и файл укажете, и начало таблицы, и расположение столбцов, и каких столбцов нет можно определить.

Немного не понял (:
 
Ответить
Сообщение
По коду - похоже пытались переделывать что-то моё, я тоже люблю в одной строке словарь заполнять

Добрый день!
Да - в качестве основы использовал несколько вариантов вашего кода, за что прошу прощения
Но словарь тут вообще и совершенно лишний, в этом конкретном коде.

Дело в том - что возможно в дальнейшем нужно будет производить какие то вычисления - поэтому использовал словарь. Простой перенос из файла проблем не вызывал.
то можно тут же по Alt+F8 запустить код, а он уже посредством инпутбоксов типа8 попросит оператора ткнуть мышью в нужные заголовки столбцов - так сразу и файл укажете, и начало таблицы, и расположение столбцов, и каких столбцов нет можно определить.

Немного не понял (:

Автор - Ed_Vard
Дата добавления - 26.06.2018 в 11:08
Hugo Дата: Вторник, 26.06.2018, 11:15 | Сообщение № 4
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3250
Репутация: 707 ±
Замечаний: 0% ±

2019
Разжую -
[vba]
Код
Set r1 = Application.InputBox(Prompt:="Выделите заголовок столбца Товар", Title:="Диапазон", Type:=8)
[/vba]
вернёт ссылку на указанную юзером мышью ячейку (заголовок столбца с например товарами). Т.е получаете сразу все нужные данные - файл, лист, ячейку с координатами.
Ну или пусть сразу выбирает весь диапазон с данными - так сразу и размер таблицы получите, у остальных столбцов достаточно указать только заголовок.


excel@nxt.ru
webmoney: E265281470651 Z422237915069


Сообщение отредактировал Hugo - Вторник, 26.06.2018, 11:17
 
Ответить
СообщениеРазжую -
[vba]
Код
Set r1 = Application.InputBox(Prompt:="Выделите заголовок столбца Товар", Title:="Диапазон", Type:=8)
[/vba]
вернёт ссылку на указанную юзером мышью ячейку (заголовок столбца с например товарами). Т.е получаете сразу все нужные данные - файл, лист, ячейку с координатами.
Ну или пусть сразу выбирает весь диапазон с данными - так сразу и размер таблицы получите, у остальных столбцов достаточно указать только заголовок.

Автор - Hugo
Дата добавления - 26.06.2018 в 11:15
Ed_Vard Дата: Вторник, 26.06.2018, 11:43 | Сообщение № 5
Группа: Пользователи
Ранг: Участник
Сообщений: 82
Репутация: 0 ±
Замечаний: 0% ±

Set r1 = Application.InputBox(Prompt:="Выделите заголовок столбца Товар", Title:="Диапазон", Type:=8)

Спасибо - документацию почитал.
Диапазон может быть и 10000-20000 строк - и указывать его мышкой...
Диапазон я и так скопирую - без словаря и этого диалога - а вот указать какому столбцу соответствует каждый столбец - это подойдет.
А вот по этому вопросу не подскажите?
1. Подскажите пожалуйста вернуть данные на лист с учетом ранее введенных данных - т.е. продолжить а не перезаписывать.


Сообщение отредактировал Ed_Vard - Вторник, 26.06.2018, 11:44
 
Ответить
Сообщение
Set r1 = Application.InputBox(Prompt:="Выделите заголовок столбца Товар", Title:="Диапазон", Type:=8)

Спасибо - документацию почитал.
Диапазон может быть и 10000-20000 строк - и указывать его мышкой...
Диапазон я и так скопирую - без словаря и этого диалога - а вот указать какому столбцу соответствует каждый столбец - это подойдет.
А вот по этому вопросу не подскажите?
1. Подскажите пожалуйста вернуть данные на лист с учетом ранее введенных данных - т.е. продолжить а не перезаписывать.

Автор - Ed_Vard
Дата добавления - 26.06.2018 в 11:43
Hugo Дата: Вторник, 26.06.2018, 12:18 | Сообщение № 6
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3250
Репутация: 707 ±
Замечаний: 0% ±

2019
Ну раз 10000-20000 тогда конечно не нужно заставлять юзера всё выделять, пусть укажет только заголовок, а далее кодом определите где данные заканчиваются.
И по п.1 - точно так же определите где данные заканчиваются, вот на строку ниже и выводите.
Вот же в коде выше применяете:
[vba]
Код
sh.Range("a" & sh.Rows.Count).End(xlUp)
[/vba] - вернёт ячейку по столбцу A


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеНу раз 10000-20000 тогда конечно не нужно заставлять юзера всё выделять, пусть укажет только заголовок, а далее кодом определите где данные заканчиваются.
И по п.1 - точно так же определите где данные заканчиваются, вот на строку ниже и выводите.
Вот же в коде выше применяете:
[vba]
Код
sh.Range("a" & sh.Rows.Count).End(xlUp)
[/vba] - вернёт ячейку по столбцу A

Автор - Hugo
Дата добавления - 26.06.2018 в 12:18
boa Дата: Вторник, 26.06.2018, 14:29 | Сообщение № 7
Группа: Друзья
Ранг: Ветеран
Сообщений: 549
Репутация: 167 ±
Замечаний: 0% ±

365
sh.Range("a" & sh.Rows.Count).End(xlUp)

позвольте поправить
[vba]
Код
sh.Range("a" & sh.Rows.Count).End(xlUp).offset(1)
[/vba]
что бы вернуло не последнюю заполненную, а первую свободную


 
Ответить
Сообщение
sh.Range("a" & sh.Rows.Count).End(xlUp)

позвольте поправить
[vba]
Код
sh.Range("a" & sh.Rows.Count).End(xlUp).offset(1)
[/vba]
что бы вернуло не последнюю заполненную, а первую свободную

Автор - boa
Дата добавления - 26.06.2018 в 14:29
Ed_Vard Дата: Вторник, 26.06.2018, 14:40 | Сообщение № 8
Группа: Пользователи
Ранг: Участник
Сообщений: 82
Репутация: 0 ±
Замечаний: 0% ±

Ну раз 10000-20000 тогда конечно не нужно заставлять юзера всё выделять, пусть укажет только заголовок, а далее кодом определите где данные заканчиваются.

Повторюсь - данные для загрузки имеют разную структуру - т.е. полностью не совпадают с эталонным - могут быть столбцы, а могут и не быть - могут идти в другой последовательности - они загружаются в один общий файл с однородной структурой. Весь диапазон выделить можно - но сопоставить каждый столбец загружаемого файла с эталонным - это нужно на каждый столбец вызывать этот метод?
вернёт ячейку по столбцу A

[vba]
Код

Range("a" & Cells(Rows.Count, 1).End(xlUp).Row + 1).Resize(, 8) = z
[/vba]
записывает только первую строку
 
Ответить
Сообщение
Ну раз 10000-20000 тогда конечно не нужно заставлять юзера всё выделять, пусть укажет только заголовок, а далее кодом определите где данные заканчиваются.

Повторюсь - данные для загрузки имеют разную структуру - т.е. полностью не совпадают с эталонным - могут быть столбцы, а могут и не быть - могут идти в другой последовательности - они загружаются в один общий файл с однородной структурой. Весь диапазон выделить можно - но сопоставить каждый столбец загружаемого файла с эталонным - это нужно на каждый столбец вызывать этот метод?
вернёт ячейку по столбцу A

[vba]
Код

Range("a" & Cells(Rows.Count, 1).End(xlUp).Row + 1).Resize(, 8) = z
[/vba]
записывает только первую строку

Автор - Ed_Vard
Дата добавления - 26.06.2018 в 14:40
Ed_Vard Дата: Вторник, 26.06.2018, 14:48 | Сообщение № 9
Группа: Пользователи
Ранг: Участник
Сообщений: 82
Репутация: 0 ±
Замечаний: 0% ±

позвольте поправить

sh.Range("a" & sh.Rows.Count).End(xlUp).offset(1)


такой вариант тоже одну первую строку записывает

[vba]
Код

Set shd = ActiveWorkbook.ActiveSheet
   
     Range("a" & shd.Rows.Count).End(xlUp).Offset(1).Resize(, 8).Value = z

[/vba]
 
Ответить
Сообщение
позвольте поправить

sh.Range("a" & sh.Rows.Count).End(xlUp).offset(1)


такой вариант тоже одну первую строку записывает

[vba]
Код

Set shd = ActiveWorkbook.ActiveSheet
   
     Range("a" & shd.Rows.Count).End(xlUp).Offset(1).Resize(, 8).Value = z

[/vba]

Автор - Ed_Vard
Дата добавления - 26.06.2018 в 14:48
boa Дата: Вторник, 26.06.2018, 14:54 | Сообщение № 10
Группа: Друзья
Ранг: Ветеран
Сообщений: 549
Репутация: 167 ±
Замечаний: 0% ±

365
Ed_Vard,
а так?
[vba]
Код
Range("a" & shd.Rows.Count).End(xlUp).Offset(1).Resize(UBound(z), 8).Value = z
[/vba]

это нужно на каждый столбец вызывать этот метод?

да


 
Ответить
СообщениеEd_Vard,
а так?
[vba]
Код
Range("a" & shd.Rows.Count).End(xlUp).Offset(1).Resize(UBound(z), 8).Value = z
[/vba]

это нужно на каждый столбец вызывать этот метод?

да

Автор - boa
Дата добавления - 26.06.2018 в 14:54
boa Дата: Вторник, 26.06.2018, 15:01 | Сообщение № 11
Группа: Друзья
Ранг: Ветеран
Сообщений: 549
Репутация: 167 ±
Замечаний: 0% ±

365
это нужно на каждый столбец вызывать этот метод?

если вы сможете идентифицировать каждый прайс(например по названию или по месту хранения или задав вопрос пользователю типа: "Чей прайс?"), то можно на отдельном листе сделать шаблон последовательности столбцов и брать потом номера столбцов для обработки из шаблона
К сообщению приложен файл: 8109755.xlsb (7.9 Kb)


 
Ответить
Сообщение
это нужно на каждый столбец вызывать этот метод?

если вы сможете идентифицировать каждый прайс(например по названию или по месту хранения или задав вопрос пользователю типа: "Чей прайс?"), то можно на отдельном листе сделать шаблон последовательности столбцов и брать потом номера столбцов для обработки из шаблона

Автор - boa
Дата добавления - 26.06.2018 в 15:01
Ed_Vard Дата: Вторник, 26.06.2018, 15:13 | Сообщение № 12
Группа: Пользователи
Ранг: Участник
Сообщений: 82
Репутация: 0 ±
Замечаний: 0% ±

boa,
Большое спасибо - да - это именно так!
А Вы не подскажите такой вопрос - читаю читаю про метод - и не могу понять как использовать его!
Я так думаю - что вызывается
[vba]
Код
Set r1 = Application.InputBox(Prompt:="Выделите заголовок столбца Товар", Title:="Диапазон", Type:=8)
[/vba]

оператор щелкает по заголовкам столбцов А или В и т.д. - выделяет столбец целиком, а как передать порядковый номер столбца например сюда z(k, 1) = x(i, 1) в поле x(i, 1) вместо 1? Переменной r1 присваивается при выделении всего столбца значение $А:$А, а вот как получить что номер столбца 1 со второй строки недопонимаю?
 
Ответить
Сообщениеboa,
Большое спасибо - да - это именно так!
А Вы не подскажите такой вопрос - читаю читаю про метод - и не могу понять как использовать его!
Я так думаю - что вызывается
[vba]
Код
Set r1 = Application.InputBox(Prompt:="Выделите заголовок столбца Товар", Title:="Диапазон", Type:=8)
[/vba]

оператор щелкает по заголовкам столбцов А или В и т.д. - выделяет столбец целиком, а как передать порядковый номер столбца например сюда z(k, 1) = x(i, 1) в поле x(i, 1) вместо 1? Переменной r1 присваивается при выделении всего столбца значение $А:$А, а вот как получить что номер столбца 1 со второй строки недопонимаю?

Автор - Ed_Vard
Дата добавления - 26.06.2018 в 15:13
Ed_Vard Дата: Вторник, 26.06.2018, 15:18 | Сообщение № 13
Группа: Пользователи
Ранг: Участник
Сообщений: 82
Репутация: 0 ±
Замечаний: 0% ±

если вы сможете идентифицировать каждый прайс(например по названию или по месту хранения или задав вопрос пользователю типа: "Чей прайс?"), то можно на отдельном листе сделать шаблон последовательности столбцов и брать потом номера столбцов для обработки из шаблона

Большое спасибо за помощь!
Их в принципе можно идентифицировать - но даже от одного и того же поставщика может прийти другой прайс - я думаю - это не благодарное занятие! Это нужно будет за этим постоянно следить! А так пользователь сопоставил столбцы - загрузил себе в файл и уже дальше с работает с этим файлом!
 
Ответить
Сообщение
если вы сможете идентифицировать каждый прайс(например по названию или по месту хранения или задав вопрос пользователю типа: "Чей прайс?"), то можно на отдельном листе сделать шаблон последовательности столбцов и брать потом номера столбцов для обработки из шаблона

Большое спасибо за помощь!
Их в принципе можно идентифицировать - но даже от одного и того же поставщика может прийти другой прайс - я думаю - это не благодарное занятие! Это нужно будет за этим постоянно следить! А так пользователь сопоставил столбцы - загрузил себе в файл и уже дальше с работает с этим файлом!

Автор - Ed_Vard
Дата добавления - 26.06.2018 в 15:18
boa Дата: Вторник, 26.06.2018, 15:27 | Сообщение № 14
Группа: Друзья
Ранг: Ветеран
Сообщений: 549
Репутация: 167 ±
Замечаний: 0% ±

365
[vba]
Код
iCol = r1.Column
iRow = r1.Row
[/vba]
номер столбца 1 со второй строки


x(2, iCol)




Сообщение отредактировал boa - Вторник, 26.06.2018, 15:32
 
Ответить
Сообщение[vba]
Код
iCol = r1.Column
iRow = r1.Row
[/vba]
номер столбца 1 со второй строки


x(2, iCol)

Автор - boa
Дата добавления - 26.06.2018 в 15:27
Hugo Дата: Вторник, 26.06.2018, 15:38 | Сообщение № 15
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3250
Репутация: 707 ±
Замечаний: 0% ±

2019
попросит оператора ткнуть мышью в нужные заголовки столбцов

вернёт ссылку на указанную юзером мышью ячейку (заголовок столбца с например товарами)

а хотел сказать по ЯЧЕЙКЕ :)


excel@nxt.ru
webmoney: E265281470651 Z422237915069


Сообщение отредактировал Hugo - Вторник, 26.06.2018, 15:41
 
Ответить
Сообщение
попросит оператора ткнуть мышью в нужные заголовки столбцов

вернёт ссылку на указанную юзером мышью ячейку (заголовок столбца с например товарами)

а хотел сказать по ЯЧЕЙКЕ :)

Автор - Hugo
Дата добавления - 26.06.2018 в 15:38
Hugo Дата: Вторник, 26.06.2018, 15:45 | Сообщение № 16
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3250
Репутация: 707 ±
Замечаний: 0% ±

2019
Я тут случайно при правке потёр пост - а было там примерно так:
Просите щёлкнуть по заголовку диапазона таблицы, где например написано "Товар" или даже лучше по первой ячейке с данными товаров (например это ячейка B3)- получаете точный адрес начала диапазона, высчитываете кодом конец товаров, далее просите щёлкнуть по ценам, количеству и т.д. - и тут уже не важно, хоть стобец F:F целиком выбирают, тут уже главное номер столбца получить.
И не нужно юзеру сперва смотреть на таблицу и на бумажке записывать где какие столбцы и как расположены, чтоб позже уже без этого файла (хотя не факт..) заводить в форму или куда там номера/адреса данных руками, что чревато разными ошибками.


excel@nxt.ru
webmoney: E265281470651 Z422237915069


Сообщение отредактировал Hugo - Вторник, 26.06.2018, 15:54
 
Ответить
СообщениеЯ тут случайно при правке потёр пост - а было там примерно так:
Просите щёлкнуть по заголовку диапазона таблицы, где например написано "Товар" или даже лучше по первой ячейке с данными товаров (например это ячейка B3)- получаете точный адрес начала диапазона, высчитываете кодом конец товаров, далее просите щёлкнуть по ценам, количеству и т.д. - и тут уже не важно, хоть стобец F:F целиком выбирают, тут уже главное номер столбца получить.
И не нужно юзеру сперва смотреть на таблицу и на бумажке записывать где какие столбцы и как расположены, чтоб позже уже без этого файла (хотя не факт..) заводить в форму или куда там номера/адреса данных руками, что чревато разными ошибками.

Автор - Hugo
Дата добавления - 26.06.2018 в 15:45
Ed_Vard Дата: Вторник, 26.06.2018, 17:03 | Сообщение № 17
Группа: Пользователи
Ранг: Участник
Сообщений: 82
Репутация: 0 ±
Замечаний: 0% ±

Hugo,
Да - спасибо!
Правильно ли я думаю алгоритм действий?
При запуске макроса открывается выбор файла, а затем метод [vba]
Код
Set r1 = Application.InputBox(Prompt:="Выделите заголовок столбца Товар", Title:="Диапазон", Type:=8)
[/vba] для определения начальной ячейки для переменной вместо sh.Range("a2") - а как получить переменную для sh.Range("a") и как ее тогда записать в код?
А если столбец с данными не первый а третий например - это весь диапазон съедет на 8 и не захватит первые два столбца в которых тоже будут какие то данные?

[vba]
Код
x = sh.Range(sh.Range("a2"), sh.Range("a" & sh.Rows.Count).End(xlUp)).Resize(, 8)
[/vba]

А уже затем последовательно для каждого столбца для определения его номера для x(i, 1-6).
А вот если искомого столбца нет - в ответ методу можно передать 0 или он свалиться в ошибку?

Да Вы правы - гораздо удобней визуально выбирать, чем через бумажку.



Огромное спасибо.


Сообщение отредактировал Ed_Vard - Вторник, 26.06.2018, 17:09
 
Ответить
СообщениеHugo,
Да - спасибо!
Правильно ли я думаю алгоритм действий?
При запуске макроса открывается выбор файла, а затем метод [vba]
Код
Set r1 = Application.InputBox(Prompt:="Выделите заголовок столбца Товар", Title:="Диапазон", Type:=8)
[/vba] для определения начальной ячейки для переменной вместо sh.Range("a2") - а как получить переменную для sh.Range("a") и как ее тогда записать в код?
А если столбец с данными не первый а третий например - это весь диапазон съедет на 8 и не захватит первые два столбца в которых тоже будут какие то данные?

[vba]
Код
x = sh.Range(sh.Range("a2"), sh.Range("a" & sh.Rows.Count).End(xlUp)).Resize(, 8)
[/vba]

А уже затем последовательно для каждого столбца для определения его номера для x(i, 1-6).
А вот если искомого столбца нет - в ответ методу можно передать 0 или он свалиться в ошибку?

Да Вы правы - гораздо удобней визуально выбирать, чем через бумажку.



Огромное спасибо.

Автор - Ed_Vard
Дата добавления - 26.06.2018 в 17:03
Hugo Дата: Вторник, 26.06.2018, 17:31 | Сообщение № 18
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3250
Репутация: 707 ±
Замечаний: 0% ±

2019
Когда юзер укажет на товар (он ведь основной столбец) - Вы получите строку начала таблицы, и строку конца (вычислите по наличию товара), ну и позицию этого столбца.
Далее юзер покажет позиции других столбцов, а больше ничего и не нужно.
Если чего-то нет - пусть жмёт отмену, получите в переменной nothing.
Нужно конечно всё обработать кодом, для каждого значимого столбца свою переменную можно завести, а можно просто собирать например коллекцию номеров столбцов, если количество не определено.
Например знаете что должны быть выделены товары, количество, цена, адрес доставки, получаете коллекцию 3, 2, 0, 1 - значит в таблице порядок такой: адрес, количество, товар, а цены нет :(
Ну или если коллекция - то вообще можно к столбцам обращаться по индексу коллекции, а не по номерам что дал юзер - ибо всегда в коллекции будет правильный порядок, ну разве что что-то может быть в столбце 0
Т.е. когда нужен адрес - берёте из коллекции четвёртый элемент, и не важно что там прописано - туда и идёте в таблице. Сейчас на примере в первый столбец.


excel@nxt.ru
webmoney: E265281470651 Z422237915069


Сообщение отредактировал Hugo - Вторник, 26.06.2018, 17:37
 
Ответить
СообщениеКогда юзер укажет на товар (он ведь основной столбец) - Вы получите строку начала таблицы, и строку конца (вычислите по наличию товара), ну и позицию этого столбца.
Далее юзер покажет позиции других столбцов, а больше ничего и не нужно.
Если чего-то нет - пусть жмёт отмену, получите в переменной nothing.
Нужно конечно всё обработать кодом, для каждого значимого столбца свою переменную можно завести, а можно просто собирать например коллекцию номеров столбцов, если количество не определено.
Например знаете что должны быть выделены товары, количество, цена, адрес доставки, получаете коллекцию 3, 2, 0, 1 - значит в таблице порядок такой: адрес, количество, товар, а цены нет :(
Ну или если коллекция - то вообще можно к столбцам обращаться по индексу коллекции, а не по номерам что дал юзер - ибо всегда в коллекции будет правильный порядок, ну разве что что-то может быть в столбце 0
Т.е. когда нужен адрес - берёте из коллекции четвёртый элемент, и не важно что там прописано - туда и идёте в таблице. Сейчас на примере в первый столбец.

Автор - Hugo
Дата добавления - 26.06.2018 в 17:31
Ed_Vard Дата: Среда, 27.06.2018, 00:16 | Сообщение № 19
Группа: Пользователи
Ранг: Участник
Сообщений: 82
Репутация: 0 ±
Замечаний: 0% ±

при выполнении кода

[vba]
Код

Set r1 = Application.InputBox(Prompt:="Выберете начальную ячеку", Title:="ß÷åéêà", Type:=8)
n = r1.Address
[/vba]

Получаю адрес ячейки $A$2
Не понимаю - а как его применить в

[vba]
Код
x = sh.Range(sh.Range("a2"), sh.Range("a" & sh.Rows.Count).End(xlUp)).Resize(, 8)
[/vba]

вместо sh.Range("a2") и sh.Range("a" ?

и еще

Если чего-то нет - пусть жмёт отмену, получите в переменной nothing.


При нажатии на Отмена валиться в ошибку


Сообщение отредактировал Ed_Vard - Среда, 27.06.2018, 01:25
 
Ответить
Сообщениепри выполнении кода

[vba]
Код

Set r1 = Application.InputBox(Prompt:="Выберете начальную ячеку", Title:="ß÷åéêà", Type:=8)
n = r1.Address
[/vba]

Получаю адрес ячейки $A$2
Не понимаю - а как его применить в

[vba]
Код
x = sh.Range(sh.Range("a2"), sh.Range("a" & sh.Rows.Count).End(xlUp)).Resize(, 8)
[/vba]

вместо sh.Range("a2") и sh.Range("a" ?

и еще

Если чего-то нет - пусть жмёт отмену, получите в переменной nothing.


При нажатии на Отмена валиться в ошибку

Автор - Ed_Vard
Дата добавления - 27.06.2018 в 00:16
Hugo Дата: Среда, 27.06.2018, 07:45 | Сообщение № 20
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3250
Репутация: 707 ±
Замечаний: 0% ±

2019
Ну вот примерно так, можете тасовать столбцы как угодно.
Первый msgbox просто информация, второй показывает данные.
Но нет обработки отказа от выбора чего-либо, кроме товара! Это некогда делать, убегаю.
К сообщению приложен файл: Ed_Vard.xlsm (25.3 Kb)


excel@nxt.ru
webmoney: E265281470651 Z422237915069


Сообщение отредактировал Hugo - Среда, 27.06.2018, 07:46
 
Ответить
СообщениеНу вот примерно так, можете тасовать столбцы как угодно.
Первый msgbox просто информация, второй показывает данные.
Но нет обработки отказа от выбора чего-либо, кроме товара! Это некогда делать, убегаю.

Автор - Hugo
Дата добавления - 27.06.2018 в 07:45
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Загрузка данных из файлов excel разных по структуре (Макросы/Sub)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!