powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Excel->Access
17 сообщений из 17, страница 1 из 1
Excel->Access
    #32650076
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения, это не моя проблема. Знакомый попросил узнать.
Я бы сам разобрался, но и дома, и на работе у меня Access глючит при запуске. Поскольку я на нем не работаю, то и разбиратся с этими глюками мне в лом.

Вопрос.

В таблице Excel есть текстовая колонка. Значения в ней могут быть похожими на числа.
Например.

1.234
1.234-А
АН-14

Если в первой строке стоит значение, похожее на число, то при импорте в Access такое поле опознается, как числовое. Явное указание формата в Excel не помогает.

Знакомый утверждает, что у него при импорте недоступна опция "Указать тип поля". К сожалению, проверить это я не могу.
Импортировать приходится разные таблы, периодичность: два-три раза в неделю.

Решения, котрые о которых мы подумали.
1. Отсортировать таблу по этому полю в обратном порядке (он предложил).
2. Вставить в таблицу фиктивную первую строку с однозначными значениями полей, а после импорта - удалить ее (он предложил).
3. Написать кусок кода, который бы по форматам первой строки Excel-таблицы строил бы Access-таблицу, а потом импортироывал бы в нее данные.(я предложил, но по каким-то религиозным соображениям это ему не очень понравилось. Хотя с написанем кода у него проблем не возникнет)

Может быть мы не знаем каких-то "секретных" опций?

==========
Еще раз прошу прощения за тупой вопрос, но я ОБЕЩАЛ спросить об этом.
...
Рейтинг: 0 / 0
Excel->Access
    #32650090
Фотография Темный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я дествую в таком случае по 2-му варианту. Просто ставлю апострофы в первой строке, которую потом удаляю.
...
Рейтинг: 0 / 0
Excel->Access
    #32650101
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Cat2Еще раз прошу прощения за тупой вопрос, но я ОБЕЩАЛ спросить об этом.
Совершенно неуместный комплекс и совершенно нормальный вопрос. :^)
...
Рейтинг: 0 / 0
Excel->Access
    #32650123
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(А_XP+E_XP)

варианты 1) и 2) скорее всего не прокатят ( по крайней мере в офис икспи) по причине того, что найденные в клетках числовые значения все равно будут в акцессе отображаться как (!#не число)

я попробовал бы присоветовать такой заход:

а) заказать у столбца в екселе формат - текст и + б) зарисовать (в екселе) макрос, который будет который будет приводить числа к строковому виду

малость коряво, у меня вышло так (работает на текущем выделении)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
Sub Test2()
  Dim tR As Range, subRange As Range, tArs As Areas
  Dim LastRow As Long, LastCol, I As Long, J As Long
  
  Dim vM
  
  Set tR = Selection
  Set tArs = tR.SpecialCells(xlCellTypeConstants, xlNumbers).Areas
  
  For Each subRange In tArs
    vM = subRange.Value
    If IsArray(vM) Then
     'массив 
      LastRow = UBound(vM,  1 )
      LastCol = UBound(vM,  2 )
       
      For I =  1  To LastRow
        For J =  1  To LastCol
          vM(I, J) = "'" & vM(I, J)
        Next
      Next
      subRange.Value = vM
    Else
      'одиночная клетка 
      subRange.Value = "'" & CStr(vM)
    End If
  Next
  
  
End Sub

(с выражением лица)
...
Рейтинг: 0 / 0
Excel->Access
    #32650124
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дополнение
обнаружилось, что если числовых клеток в выделенном диапазоне нет, то

Код: plaintext
Set tArs = tR.SpecialCells(xlCellTypeConstants, xlNumbers).Areas

даст ошибку времени исполнения.

поэтому перед нужно включить обработчик ошибок
типа

Код: plaintext
On Error GoTo ENDSUB

и по концу цикла

Код: plaintext
1.
2.
3.
4.
Next
ENDSUB:
  If Err.Number <>  0  Then
    Err.Clear
  End If

(с выражением лица)
...
Рейтинг: 0 / 0
Excel->Access
    #32650128
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще дополнение - на всякий случай.
утверждение "не прокатят" основывалось на разглядывании линкованных, а не импортированных таблиц.



(с выражением лица)
...
Рейтинг: 0 / 0
Excel->Access
    #32650137
Ukraina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В свое время вел диспут по этому вопросу. Было много предложений, сделал гибридную версию. Скачивает с экселя спокойно, абсолютно не беспокоясь , какие там типы данных. Если в таблице указан тип «текстовой», то числовые экселевские данные преобразует в текстовой без всяких вопросов. Работает как часы. Спасибо Санычу, Темному и другим. Посмотри топик (хоть убей не помню, но называется "Можно ли оптимизировать этот код" № 852037, Саныч ! МОЖЕТ ПОДСКАЖИТЕ ГДЕ ОН?)

Dim xa As Excel.Application
Dim xw As Excel.Workbook
Dim xs As Excel.Worksheet
Dim z1, z2, z3, z4, z8, z10, z12 As String
Dim z5, z6, z7, z11 As Double
Dim z9 As Date
Dim i As Integer

Set xw = GetObject(CurrentProject.Path & "\contracts.xls", "Excel.sheet")
Dim r As Excel.Range
Dim V
Dim sss As String


Set r = xw.ActiveSheet.UsedRange

sss = "A1:K" & r.Rows.Count + 1 – (формирует диапазон типа «А1:К100», т.е. до конца занятых ячеек)

V = xw.ActiveSheet.Range(sss).Value – (забирает данные из Экселя в массив из соответствующего диапазона)

z12 = xw.ActiveSheet.Cells(2, 2) – (это у меня соответствующая постоянная для всех)

For i = 5 To r.Rows.Count + 1 – (считывание значений из экселя в цикле начиная с нужной строки, в данном случае «5», но нужно поиграть значениями)

If IsEmpty((V(i, 2))) Then – (проверяет на наличие пустой строки и заканчивает считывание если пустое, где i-строка экселя)

GoTo 777
End If

Set rst = CurrentDb.OpenRecordset("Поступления") – (вгоняет в таблицу Акцесса и абсолютно по-барабану, какие типы данных в экселе)
rst.AddNew
rst![Товар] = V(i, 1)
rst![Наименование] = V(i, 2)
rst![Категория] = V(i, 3)
rst![Единицы] = V(i, 4)
rst![Кол-во] = V(i, 5)
rst![Себестоимость] = IIf(V(i, 6) = "", 0, V(i, 6))
rst![Себестоимость TMM] = IIf(V(i, 7) = "", 0, V(i, 7))
rst![Валюта] = V(i, 8)
rst![Дата] = V(i, 9)
rst![Поставщик] = V(i, 10)
rst![Контра] = z12

rst.Update
rst.Close

Next i




777:

DoCmd.Close
DoCmd.OpenForm "Контракт"
Exit Sub

Привожу пример как выглядит у меня таблица экселя, в поле "Товар" можно писать и число "123" и текст "123Х", главное, что в таблице поступление поле товар прописано текстовым. Работает, клиенты не жалуются.
Избегайте прямого преобразования!!!
...
Рейтинг: 0 / 0
Excel->Access
    #32650140
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Ukraina
оформил бы ты это дело в мастер импорта. Хотя мое скромное мнение, что удобнее наверно было бы со стороны екселя - в мастер экспорта.

-----------------------------------

по поводу цикла преобразования в строку в приведенном мною коде - возможно умнее было бы цикл по столбцам сделать внешним. мерять лень.

(с выражением лица)
...
Рейтинг: 0 / 0
Excel->Access
    #32650142
Ukraina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victosha2 Ukraina
оформил бы ты это дело в мастер импорта. Хотя мое скромное мнение, что удобнее наверно было бы со стороны екселя - в мастер экспорта.

-----------------------------------

по поводу цикла преобразования в строку в приведенном мною коде - возможно умнее было бы цикл по столбцам сделать внешним. мерять лень.

(с выражением лица)

2 Victosha Я бы с удовольствием, но честно говоря не понял как это дело оформить в "мастер импорта". Если не трудно, то можно развернуть эту тему. Я (если я правильно понял) с удовольствием сделал бы на основе этого всего некую функцию (dll?) и просто одной строкой как-то вгонял.
Давай продолжим тему, разъясни для чайника более детально "мастер экспорта"
...
Рейтинг: 0 / 0
Excel->Access
    #32650144
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Ukraina
для чайника - это для меня. потому что я чайник и есть. у меня и свисток в наличии имеется.

если говорить о мастере экспорта (в екселе), то делать грубо-приблиздительно так.

1) заводишь отдельный ексельный книг.
2) рисуешь в ей userForms для выбора диапазонов и вставляешь потребный код - для поиска файла/линковки-создания таблиц/экспорта данных
3) сохраняешь книг в xla
4) устанавливаешь надстройку через сервиз->надстройки

про надстройки для акцесса смотри у Гетса.

вот сидю, ковыряю в носу - думаю - нарисовать, что ли?


(с выражением лица)
...
Рейтинг: 0 / 0
Excel->Access
    #32650164
Ukraina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Victosha
Сильно ты тут наговорил. Раньше я думал, что только Акцесс плохо знаю, а теперь понял, что и Эксель... Из всего, что ты написал, понял только первый пункт (без приколов). Может лучше разделим функции, ты в экселе, я в акцессе. Ты вот в носу ковыряешь, а я после твоих слов рву волосы (ну понятно где).
Вообщем труба...
Жизнь меня не перестает удивлять...
Может все-таки более детально опишешь как это все в экселе, можно на почту, только как можно детальнее и проще (а то у тебя хоть свисток есть, а у меня и того нема)
Но в общем идея понятно, и было бы не плохо ее оформить в неком чем-то, для простого применения
...
Рейтинг: 0 / 0
Excel->Access
    #32650165
Ukraina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Victosha
Сильно ты тут наговорил. Раньше я думал, что только Акцесс плохо знаю, а теперь понял, что и Эксель... Из всего, что ты написал, понял только первый пункт (без приколов). Может лучше разделим функции, ты в экселе, я в акцессе. Ты вот в носу ковыряешь, а я после твоих слов рву волосы (ну понятно где).
Вообщем труба...
Жизнь меня не перестает удивлять...
Может все-таки более детально опишешь как это все в экселе, можно на почту, только как можно детальнее и проще (а то у тебя хоть свисток есть, а у меня и того нема)
Но в общем идея понятно, и было бы не плохо ее оформить в неком чем-то, для простого применения
...
Рейтинг: 0 / 0
Excel->Access
    #32650169
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забери примеров отсюда

http://archive.dialektika.com/cgi-bin/materials.cgi?isbn=5-8459-0541-9

вот страница с обложкой книжки
http://www.dialektika.com/books/5-8459-0541-9.html

получится и книжку прикупи, или закажи. Наверняка ведь кто-нибудь туда-сюда летает.

(с выражением лица)
...
Рейтинг: 0 / 0
Excel->Access
    #32650491
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а по существу первоначального вопроса, ответ, наверно, здесь

http://support.microsoft.com/default.aspx?scid=kb;en-us;194124

(с выражением лица)
...
Рейтинг: 0 / 0
Excel->Access
    #32650507
Витал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UkrainaВ свое время вел диспут по этому вопросу. Было много предложений, сделал гибридную версию. Скачивает с экселя спокойно, абсолютно не беспокоясь , какие там типы данных. Если в таблице указан тип «текстовой», то числовые экселевские данные преобразует в текстовой без всяких вопросов. Работает как часы. Спасибо Санычу, Темному и другим. Посмотри топик (хоть убей не помню, но называется "Можно ли оптимизировать этот код" № 852037, Саныч ! МОЖЕТ ПОДСКАЖИТЕ ГДЕ ОН?)

Dim xa As Excel.Application
Dim xw As Excel.Workbook
Dim xs As Excel.Worksheet
Dim z1, z2, z3, z4, z8, z10, z12 As String
Dim z5, z6, z7, z11 As Double
Dim z9 As Date
Dim i As Integer

Set xw = GetObject(CurrentProject.Path & "\contracts.xls", "Excel.sheet")
Dim r As Excel.Range
Dim V
Dim sss As String


Set r = xw.ActiveSheet.UsedRange

sss = "A1:K" & r.Rows.Count + 1 – (формирует диапазон типа «А1:К100», т.е. до конца занятых ячеек)

V = xw.ActiveSheet.Range(sss).Value – (забирает данные из Экселя в массив из соответствующего диапазона)

z12 = xw.ActiveSheet.Cells(2, 2) – (это у меня соответствующая постоянная для всех)

For i = 5 To r.Rows.Count + 1 – (считывание значений из экселя в цикле начиная с нужной строки, в данном случае «5», но нужно поиграть значениями)

If IsEmpty((V(i, 2))) Then – (проверяет на наличие пустой строки и заканчивает считывание если пустое, где i-строка экселя)

GoTo 777
End If

Set rst = CurrentDb.OpenRecordset("Поступления") – (вгоняет в таблицу Акцесса и абсолютно по-барабану, какие типы данных в экселе)
rst.AddNew
rst![Товар] = V(i, 1)
rst![Наименование] = V(i, 2)
rst![Категория] = V(i, 3)
rst![Единицы] = V(i, 4)
rst![Кол-во] = V(i, 5)
rst![Себестоимость] = IIf(V(i, 6) = "", 0, V(i, 6))
rst![Себестоимость TMM] = IIf(V(i, 7) = "", 0, V(i, 7))
rst![Валюта] = V(i, 8)
rst![Дата] = V(i, 9)
rst![Поставщик] = V(i, 10)
rst![Контра] = z12

rst.Update
rst.Close

Next i




777:

DoCmd.Close
DoCmd.OpenForm "Контракт"
Exit Sub

Привожу пример как выглядит у меня таблица экселя, в поле "Товар" можно писать и число "123" и текст "123Х", главное, что в таблице поступление поле товар прописано текстовым. Работает, клиенты не жалуются.
Избегайте прямого преобразования!!!

ИМХО, до фига лишнего здесь у меня корректно работает просто
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
With Workbooks( 1 ).Worksheets("данные")
i= 2 
Do While .Cells(i, 1 ) <> ""
 rst.AddNew
        rst![Товар] = .Cells(i, 1 ).Value
        rst![Наименование] = .Cells(i, 2 ).Value
....        
 rst.Update
i = i+ 1 
Loop
End With

Причем юзеры у меня ушлые иногда в числовые поля текст шуруют, чтоб не забыть чего - "вес будет проставлен позже", например.
Так что еще и проверять приходится, что в ячейке...
...
Рейтинг: 0 / 0
Excel->Access
    #32651739
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо за ответы
...
Рейтинг: 0 / 0
Excel->Access
    #32652096
Galustov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А у меня простейший макросок уже года 3 колбасит

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Sub int_to_str()
For Each cell In Selection  'начало цикла по всем выделенным ячейкам 
    cell.NumberFormat = "@"  'так обозначается текстовый формат 
    
    str_Znach = CStr(cell.Value)  'тут идёт отлов значения в текущей ячейке 
                           'функция CStr преобразует значение в строковую переменную 
    cell.FormulaR1C1 = str_Znach   'присвоение текущей ячейке её собственного строкового значения 
   r = cell.Row  ' это просто для контроля на какой строке в данный момент прога работает 
    'End If 
Next  'это конец цикла 
End Sub

пометки писались для одного моего друга, который ничего не смыслит в программировании, но решил разобрать в этой "крутой" по его мнению штуке :)
изначально модуль был призван подготавливать данные для работы функции "ВПР" в екселе. Как ни странно - всё реально работает и щас.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Excel->Access
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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