Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / динамический импорт из excel / 25 сообщений из 51, страница 1 из 3
29.04.2018, 12:54
    #39638286
динамический импорт из excel
Привет всем.
Есть множество файлов приаттаченного вида с которыми приходится работать. Хочу облегчить себе работу и импортировать данные в Access и сделать более удобочитаемый вид, точнее форму. Но перед этим данные нужно импортировать из файла. Проблема в том, что количество ячеек динамическое от файла к файлу. Что не изменно, так это название полей в таблицах. Например, "Полный номер сектора". В данном файле это ячейка "A66".
Каким образом можно найти "Полный номер сектора", т.е. начало таблицы и определить её окончание по пустому значению этого же столбца? В данном случае это ячейка "A100". Прошу сильно не пинать, т.к. я в этом не силён. Работы меньше не становится и вот этим приходится заниматься в своё личное время :(
...
Рейтинг: 0 / 0
29.04.2018, 18:19
    #39638352
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамический импорт из excel
Не совсем вкурил ТЗ,но хочу сказать:
1.Если планируется импорт таблиц Ёкселя в Акцесс, то при их создании надо забыть об объединении ячеек и пропуске строк(пустых строках)
2.Свойство СurrentRegion определяет количество строк,столбцов в ПРАВИЛЬНО созданной таблице
...
Рейтинг: 0 / 0
29.04.2018, 19:21
    #39638355
динамический импорт из excel
Сижу, мозг кипит. На данном этапе пытаюсь программно получить диапазон таблицы A66:Z99

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
adr = XLWs.Cells.find(What:="Полный номер сектора", LookAt:=xlWhole).Address            ' находим строку (LookAt:=xlWhole <- полное совпадение)
XLWs.Cells.find(What:="Полный номер сектора", LookAt:=xlPart).Activate                  ' активируем ее
sRowNumber = XLWs.Cells.find(What:="Полный номер сектора", LookAt:=xlWhole).Row         ' получаем номер строки
sColunmNumber = XLWs.Cells.find(What:="Полный номер сектора", LookAt:=xlWhole).Column   ' получаем номер колонки
ToDown = XLWs.Range(XLAp.Selection, XLAp.Selection.End(xlDown)).Address                 ' получаем диапазон таблицы (сверху вниз)
ToRight = XLWs.Range(XLAp.Selection, XLAp.Selection.End(xlToRight)).Address             ' получаем диапазон таблицы (вправо)
Debug.Print adr & "  " & sRowNumber & " " & ToDown & "  " & "ToRight=" & ToRight & "  " & sColunmNumber


Из дебага получил это:
$A$66 66 $A$66:$A$99 ToRight=$A$66:$Z$66 1

Вижу, что если заменить A99=>Z99, то смогу использовать в запросе.
Код: vbnet
1.
strSQL = "SELECT * FROM [" & NameList & Диапазон & "$] IN '" & FilePath & "'[Excel 8.0;IMEX=1;]"


А нельзя ли как-то использовать XLWs.Range(XLAp.Selection, XLAp.Selection.End(****)).Address для получения итогового диапазона A66:Z99?
...
Рейтинг: 0 / 0
30.04.2018, 08:48
    #39638433
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамический импорт из excel
Не мучайтесь с анализом экселевской таблицы, это медленно и мутно. Просто импортируйте все данные листа в таблицу и анализируйте данные уже в таблице. Тут и пустые строки пригодиться могут для анализа.
...
Рейтинг: 0 / 0
30.04.2018, 09:13
    #39638434
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамический импорт из excel
MrShinНе мучайтесь с анализом экселевской таблицы, это медленно и мутно. Просто импортируйте все данные листа в таблицу и анализируйте данные уже в таблице. Тут и пустые строки пригодиться могут для анализа.
причем я все импортирую в рабочую таблицу в текстовом формате полей , чтобы меньше зависеть от самостийности каждой екселевской клетки
--все проверяю и исправляю в аксесс в рабочей таблице
--только затем дописываю в основную таблицу, преобразуя текстовый формат в требуемый
...
Рейтинг: 0 / 0
30.04.2018, 11:18
    #39638459
alecko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамический импорт из excel
А по мне так наоборот - можно и форматирование использовать (при анализе прайсов со строковой разбивкой по группам очень помогает).
ТС крутится вокруг да около, нашел номер строки создал range, да забрал. все.
искать можно и так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
что нить типа
Dim varCell(4) As Long, Lastrow As Long, Nomrow As Long, str$
Dim objExel As Excel.Application, objsheet As Excel.Worksheet, objbook As Excel.Workbook
Set objExel = New Excel.Application
Set objbook = objExel.Workbooks.Open(fname(0, i))' ну тут понятно файлы
      Set objsheet = objbook.Worksheets(1)' имена/индексы
varCell(2)-столбец по которому оцениваем размер таблицы
varCell(1) - столбец где ищем
str=""' искомое слово
 Lastrow = objsheet.Cells(objsheet.rows.Count, varCell(2)).End(xlUp).row ' наша последняя строка- до которой искать будем
Nomrow = varCell(1)' с какой строки начинается поиск
Do Until Nomrow > Lastrow
  If objsheet.Cells(Nomrow, varCell(1)) = str Then ' можно objsheet.Cells(Nomrow, varCell(1)) пообрабатывать
...
end if
                Nomrow = Nomrow + 1
            Loop


как Range создать надеюсь показывать не надо?
...
Рейтинг: 0 / 0
30.04.2018, 12:21
    #39638471
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамический импорт из excel
aleckoнашел номер строки создал range, да забрал. все
На больших файлах это работает очень медленно, в аксе будет на порядок быстрее
...
Рейтинг: 0 / 0
30.04.2018, 13:08
    #39638482
alecko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамический импорт из excel
MrShin, конечно, в аксе быстрее, однако
1. импорт .xls в 7-м аксе часто бывает некорректным -его надо контролировать (может в других версиях таких проблем нет), если открывать эксель как объект - проблем нет,
2. засорение базы ненужными данными
3. бывает необходимость искать с использованием форматирования, хотя конечно в этом случае когда количество строк тысяч от 10 - времени тратится заметно.
В данном конкретном случае мы видим номера адресов "А66", "А100" - что не указывает на большие объемы данных.
...
Рейтинг: 0 / 0
30.04.2018, 14:49
    #39638500
динамический импорт из excel
alecko,
как Range создать надеюсь показывать не надо? - Желательно :) Для меня акс - палочка выручалочка, часто спасает от рутиной работы.
П.С. Я инженер, а не программист. Многому научился благодаря этому форуму, но в рамках решения своих текущих задач. С обработкой экселя сталкивался только на уровне импорт простой таблицы или простой экспорт. Тут задачка посложнее, и желательно сразу правильно понять что к чему. В общем вопросов больше чем ответов.
...
Рейтинг: 0 / 0
30.04.2018, 16:28
    #39638520
alecko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамический импорт из excel
АрхимедоффП.С. Я инженер, а не программист.
все оттуда. программеры кресты любят.
из ТЗ не ясно что Вы именно ходите сделать после того как нашли, то что хотели.
тем методом который был показан можно и без Range обойтись - просто проходите куда надо вверх, вниз по таблице, да забираете что хотите,
в общем случае если с range , то
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Dim Range1 as Range
set Range1=objsheet.range(objsheet.cells(varCell(1),1),objsheet.cells(Nomstrok,varCell(2))
' этот способ не нравится - но он широко распространен
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12, TableName(куда), FileName(откуда), False, Range1
' либо 
Dim i&, Mytbl as recordset, Massiv&(6)
'Massiv&(6)-это массив столбцов где находятся нужные данные
set  Mytbl =Currentdb.openrecordset("Mytbl", dbOpenDynaset)
with  Mytbl 
For i=1 to Range1.Rows.Count
.addnew' DAO
for j=1 to Ubound(Massiv)
' вроде так
.fields(j)=objsheet.cells(Range1.row, Massiv(j))
Next j
.update
Next
end with

p.s.
Код: vbnet
1.
2.
3.
4.
5.
6.
' --------------------------
в основном  Range использую когда надо наоборот делать экспорт в Эксель,т.е. 
sheet2Excel.Range("B6:R6").value = "Общий заказ от ООО ""...ис""(справочно)" ' сразу merge
' ---------------------------------------
а также очень удобен такой способ
Set Range1= objsheet.UsedRange.rows.Find(str , , xlValues, xlWhole, xlByRows, xlNext) '  нашли нужную строку

...
Рейтинг: 0 / 0
30.04.2018, 18:29
    #39638562
динамический импорт из excel
alecko,
1. Имеем диапазон секторов A66:Z99- импортируем с привязкой к ячейкам С2,С4,С5 (чтобы потом использовать в качестве поиска)
2. Далее импортируем из таблицы "Радиомодули распределенной БС (RRU)" A54:G63 Тип RRU
3. Далее импортируем из таблицы "Антенно-фидерное оборудование" (A102:S108) Электр. наклон, Механич. наклон Вот тут на мой взгляд самое сложное A102:J108.
Рассмотрим строку 103. Так в A103 видим D1,G1,L14,L4,L7. Это разные диапазоны, но в одном азимуте. Они фигурируют в столбце D66 и ниже, а левее есть конкретные диапазоны. Самое интересное начинается с F102. Т.к. данные идут через разделитель (800 | 900 | 1800 | 2100 | 2600) , то и углы (I102 и т.д.) также расписаны(0.0 | 4.0 | 3.0 | 0.0 | 3.0). Вот тут глаза очень часто "обламываются". Тяжело воспринимать, особенно к концу дня.

В итоге хотел бы получить вот такую таблицу (см. аттач), которую читать намного удобнее. А потом на основе этой таблицы сделать форму. Желтым выделил поля, которые присутствуют в Initial_Data_.xlsx. В результате подгрузил данные и фильтруй как хочешь. В общем работай себе в удовольствие не ломая глаза и не бегая за данными по нескольким источникам :)
Буду благодарен за любую помощь. Пока всё тяжко.
...
Рейтинг: 0 / 0
30.04.2018, 21:55
    #39638589
alecko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамический импорт из excel
как то так...
...
Рейтинг: 0 / 0
01.05.2018, 00:33
    #39638604
динамический импорт из excel
alecko,

Обалдеть. Я два дня голову ломаю. Буду смотреть и разбираться с кодом. Единственное что сразу бросилось в глаза в результатах - не корректные данные по переносу RRU.
В общем огромное спасибо. И позже будут вопросы :)
...
Рейтинг: 0 / 0
01.05.2018, 07:43
    #39638616
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамический импорт из excel
aleckoимпорт .xls в 7-м аксе часто бывает некорректным -его надо контролировать
Что значит некорректным? Если речь о неправильном распознавании типов данных - так и не нужно полагаться на автораспознавание. Я "грязные" данные всегда импортирую в существующую таблицу с текстовыми колонками, а проверки и распознавание уже потом.
...
Рейтинг: 0 / 0
01.05.2018, 10:37
    #39638637
alecko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамический импорт из excel
MrShin, нет - порядок нарушен обычно, часть данных которые должны быть в конце - оказываются впереди - часто это критично, поскольку нумерация делается позже. это бывает и само по себе и после сбоя. бывают файлы такие, что прям приходится "ловить" нужный импорт. перешел на открытие эксель как объекта - все как рукой сняло.
...
Рейтинг: 0 / 0
01.05.2018, 12:30
    #39638661
alecko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамический импорт из excel
Архимедофф, поправил, поиск не по тем полям велся - тип антенны не уникальный и тип MCU/RRU оказывается не то же самое что и тип RRU. зато надеюсь в сторону экселя будете теперь более уверенно смотреть :) Эх, если бы форматирование добавить, вот была бы веселуха (хотя принцип думаю понятен)- и Ваш случай как раз для вдумчивого ковыряния , сплиты, лайки...
...
Рейтинг: 0 / 0
01.05.2018, 13:08
    #39638668
alecko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамический импорт из excel
Не вникнул в суть объяснения про углы и диапазоны здесь 21380167 , оказывается каждому диапазону соответствует свой угол.
...
Рейтинг: 0 / 0
01.05.2018, 13:11
    #39638670
динамический импорт из excel
alecko,

Остался последний штрих. Вы для одного Cellid делаете несколько записей, а реально нужна только одна, с правильным эл.углом наклона. Ячейка A103 с данными (D1,G1,L14,L4,L7) .
Так D1 - это диапазон DCS 1800 из ячейки C67.
...
Рейтинг: 0 / 0
01.05.2018, 13:13
    #39638673
динамический импорт из excel
Вот еще картинка
...
Рейтинг: 0 / 0
01.05.2018, 13:16
    #39638676
динамический импорт из excel
alecko,

Опередили меня на пару минут, сейчас посмотрю :)
...
Рейтинг: 0 / 0
01.05.2018, 14:03
    #39638693
динамический импорт из excel
alecko,

Как обратиться к ячейки C4 исходного файла?
Хочу дописать проверку в bSave_Click , чтобы выскакивал диалог с предложением, что если данные по такому номеру есть, то выбрать действие: обновить(удалить и записать заново) или ни чего не делать. Хотя, это наверное, правильнее делать на более раннем этапе. И конечно упустил, в таком случае желательно иметь дату, когда данные внеслись в таблицу.

П.С. не пойму, на каком этапе Вы обращаетесь к полю Номер и Номер позиции ? А если надо добавить данные, например Наименование (A6) или Адрес (A7)?
Где то можно посмотреть через Debug.print?
...
Рейтинг: 0 / 0
01.05.2018, 15:05
    #39638704
alecko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамический импорт из excel
Архимедофф,
номер строки 61 в модуле класса
Код: vbnet
1.
MassivConst(1) = objsheet.Cells(2, 3): MassivConst(2) = objsheet.Cells(4, 3): MassivConst(3) = objsheet.Cells(5, 3) ' постоянные позиции - для поиска в том числе


сюда добавлены позиции, которые постоянны, а можно сразу в поле рекордсета добавить данные этих ячеек
т.е. добавляете поля в таблицу, если не хватает, и строку 109 модуля класса
Код: vbnet
1.
 .Fields(1) = MassivConst(1): .Fields(2) = MassivConst(2): .Fields(3) = MassivConst(3): 


продолжаете
Код: vbnet
1.
 .Fields(24) = objsheet.Cells(6, 3):  .Fields(25) = objsheet.Cells(7, 3)  ' и так далее


через debug.print можно смотреть везде :) все.
можно по другому: делаем точку останова и в immediate используя оператор print получаем данные нужных переменных, затем можно пройтись по F8 по интересующим строкам
...
Рейтинг: 0 / 0
01.05.2018, 15:18
    #39638705
alecko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамический импорт из excel
Архимедоффчто если данные по такому номеру есть, то выбрать действие: обновить(удалить и записать заново) или ни чего не делать. Хотя, это наверное, правильнее делать на более раннем этапе. И конечно упустил, в таком случае желательно иметь дату, когда данные внеслись в таблицу.
в базе 2 таблицы - 1-я куда вносятся данные импорта, пред каждым импортом она очищается 2-я где хранятся данные. проверять можно и во время импорта, однако спрашивать несколько десятков раз -как-то некомильфо
внести дату, в смысле текущую? .fields(27)=Date
...
Рейтинг: 0 / 0
01.05.2018, 18:15
    #39638781
динамический импорт из excel
alecko,
Спасибо огромное.
Вот тут Debug.Print воспользоваться не получилось :(
Код: vbnet
1.
2.
3.
4.
5.
6.
     mess = Split(objsheet.Cells(Nomstrok(1), 1), ",") ' получили массив секторов
     ' Debug.Print mess
      Ugol = Split(objsheet.Cells(Nomstrok(1), 9), delimtr) ' массив углов электронных
      diap = Split(objsheet.Cells(Nomstrok(1), 6), delimtr)
      UgolMehan = objsheet.Cells(Nomstrok(1), 12) ' механический угол
      'Debug.Print diap
...
Рейтинг: 0 / 0
01.05.2018, 19:46
    #39638795
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамический импорт из excel
АрхимедоффВот тут Debug.Print воспользоваться не получилось :(

diap--это массив
debug.print diap(0)
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / динамический импорт из excel / 25 сообщений из 51, страница 1 из 3
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]