powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / динамический импорт из excel
25 сообщений из 51, страница 1 из 3
динамический импорт из excel
    #39638286
Привет всем.
Есть множество файлов приаттаченного вида с которыми приходится работать. Хочу облегчить себе работу и импортировать данные в Access и сделать более удобочитаемый вид, точнее форму. Но перед этим данные нужно импортировать из файла. Проблема в том, что количество ячеек динамическое от файла к файлу. Что не изменно, так это название полей в таблицах. Например, "Полный номер сектора". В данном файле это ячейка "A66".
Каким образом можно найти "Полный номер сектора", т.е. начало таблицы и определить её окончание по пустому значению этого же столбца? В данном случае это ячейка "A100". Прошу сильно не пинать, т.к. я в этом не силён. Работы меньше не становится и вот этим приходится заниматься в своё личное время :(
...
Рейтинг: 0 / 0
динамический импорт из excel
    #39638352
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не совсем вкурил ТЗ,но хочу сказать:
1.Если планируется импорт таблиц Ёкселя в Акцесс, то при их создании надо забыть об объединении ячеек и пропуске строк(пустых строках)
2.Свойство СurrentRegion определяет количество строк,столбцов в ПРАВИЛЬНО созданной таблице
...
Рейтинг: 0 / 0
динамический импорт из excel
    #39638355
Сижу, мозг кипит. На данном этапе пытаюсь программно получить диапазон таблицы 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
динамический импорт из excel
    #39638433
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не мучайтесь с анализом экселевской таблицы, это медленно и мутно. Просто импортируйте все данные листа в таблицу и анализируйте данные уже в таблице. Тут и пустые строки пригодиться могут для анализа.
...
Рейтинг: 0 / 0
динамический импорт из excel
    #39638434
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrShinНе мучайтесь с анализом экселевской таблицы, это медленно и мутно. Просто импортируйте все данные листа в таблицу и анализируйте данные уже в таблице. Тут и пустые строки пригодиться могут для анализа.
причем я все импортирую в рабочую таблицу в текстовом формате полей , чтобы меньше зависеть от самостийности каждой екселевской клетки
--все проверяю и исправляю в аксесс в рабочей таблице
--только затем дописываю в основную таблицу, преобразуя текстовый формат в требуемый
...
Рейтинг: 0 / 0
динамический импорт из excel
    #39638459
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А по мне так наоборот - можно и форматирование использовать (при анализе прайсов со строковой разбивкой по группам очень помогает).
ТС крутится вокруг да около, нашел номер строки создал 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
динамический импорт из excel
    #39638471
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleckoнашел номер строки создал range, да забрал. все
На больших файлах это работает очень медленно, в аксе будет на порядок быстрее
...
Рейтинг: 0 / 0
динамический импорт из excel
    #39638482
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrShin, конечно, в аксе быстрее, однако
1. импорт .xls в 7-м аксе часто бывает некорректным -его надо контролировать (может в других версиях таких проблем нет), если открывать эксель как объект - проблем нет,
2. засорение базы ненужными данными
3. бывает необходимость искать с использованием форматирования, хотя конечно в этом случае когда количество строк тысяч от 10 - времени тратится заметно.
В данном конкретном случае мы видим номера адресов "А66", "А100" - что не указывает на большие объемы данных.
...
Рейтинг: 0 / 0
динамический импорт из excel
    #39638500
alecko,
как Range создать надеюсь показывать не надо? - Желательно :) Для меня акс - палочка выручалочка, часто спасает от рутиной работы.
П.С. Я инженер, а не программист. Многому научился благодаря этому форуму, но в рамках решения своих текущих задач. С обработкой экселя сталкивался только на уровне импорт простой таблицы или простой экспорт. Тут задачка посложнее, и желательно сразу правильно понять что к чему. В общем вопросов больше чем ответов.
...
Рейтинг: 0 / 0
динамический импорт из excel
    #39638520
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АрхимедоффП.С. Я инженер, а не программист.
все оттуда. программеры кресты любят.
из ТЗ не ясно что Вы именно ходите сделать после того как нашли, то что хотели.
тем методом который был показан можно и без 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
динамический импорт из excel
    #39638562
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
динамический импорт из excel
    #39638589
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как то так...
...
Рейтинг: 0 / 0
динамический импорт из excel
    #39638604
alecko,

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

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

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

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

П.С. не пойму, на каком этапе Вы обращаетесь к полю Номер и Номер позиции ? А если надо добавить данные, например Наименование (A6) или Адрес (A7)?
Где то можно посмотреть через Debug.print?
...
Рейтинг: 0 / 0
динамический импорт из excel
    #39638704
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Архимедофф,
номер строки 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
динамический импорт из excel
    #39638705
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Архимедоффчто если данные по такому номеру есть, то выбрать действие: обновить(удалить и записать заново) или ни чего не делать. Хотя, это наверное, правильнее делать на более раннем этапе. И конечно упустил, в таком случае желательно иметь дату, когда данные внеслись в таблицу.
в базе 2 таблицы - 1-я куда вносятся данные импорта, пред каждым импортом она очищается 2-я где хранятся данные. проверять можно и во время импорта, однако спрашивать несколько десятков раз -как-то некомильфо
внести дату, в смысле текущую? .fields(27)=Date
...
Рейтинг: 0 / 0
динамический импорт из excel
    #39638781
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
динамический импорт из excel
    #39638795
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АрхимедоффВот тут Debug.Print воспользоваться не получилось :(

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


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