powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / VBA; Лишние пробелы при импорте
11 сообщений из 11, страница 1 из 1
VBA; Лишние пробелы при импорте
    #39464696
Ataxy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток

Для импорта данных из Excell в Access использую процедуру:
Код: vbnet
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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
Public Sub Ex2Acc() ' Импорт данных
' Dim sheet As Excel.Worksheet
Dim book As Excel.Workbook
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim rstb As String
Dim rstEr As DAO.Recordset
Dim appXl As Excel.Application
Dim wrksheet As Excel.Worksheet
Dim i As Long

rstb = Forms![Form1].[Поле13].Value

Set appXl = CreateObject("Excel.Application")
Set book = appXl.Workbooks.Open(Forms![Form1].[Поле3].Value)
Set dbs = CurrentDb
Set rst = CurrentDb.OpenRecordset(rstb)
Set wrksheet = book.Sheets(1)

  With book.Sheets(1)
  For i = 5 To 100
  If InStr(1, wrksheet.Cells(i, "H").Value, "ns") > 0 Then
  With rst
     .AddNew
   '  On Error Resume Next
     ![OBSN] = RTrim(wrksheet.Cells(i, "B"))
     ![NAIM] = RTrim(wrksheet.Cells(i, "C"))
     ![ED_IZM] = RTrim(wrksheet.Cells(i, "D"))
     ![BRUTTO] = wrksheet.Cells(i, "E")
     ![C_BASE] = zamena(wrksheet.Cells(i, "F"))
     ![CLASS_GR] = zamena(wrksheet.Cells(i, "G"))
     ![COD_UZ] = zamena(wrksheet.Cells(i, "H"))
     ![C_OPT] = zamena(wrksheet.Cells(i, "I"))
     ![C_SMET] = zamena(wrksheet.Cells(i, "J"))
     ![IND] = zamena(wrksheet.Cells(i, "K"))
     .Update
  End With
  End If
   Next
   End With
   rst.Close: Set rst = Nothing
   dbs.Close: Set rst = Nothing
   book.Close: Set book = Nothing
   appXl.Quit: Set appXl = Nothing
 
MsgBox "Завершено"
   
  ' Exit Sub
  ' CurrentDb.Execute "CREATE TABLE Errors(RowNumbers CHAR(15))"
  ' Set rstEr = CurrentDb.OpenRecordset(Errors)
  ' With wrksheet
  ' With rstEr
  ' .AddNew
  ' ![RowNumbers] = wrksheet.Cells(i, "A")
  ' .Update
  ' End With
  ' End With
   
End Sub



При импорте данных из листа excel в поле таблицы access появляются лишние пробелы. В файле excel, тем не менее, этих пробелов нет.
Я пробовал и
Код: vbnet
1.
![OBSN] = RTrim(wrksheet.Cells(i, "B"))


И
Код: vbnet
1.
![OBSN] = replace(wrksheet.Cells(i, "B"), " ", "")


в т.ч. и функцию zamena, предоставленную мне ранее пользователем ПЕНСИОНЕРКА. Всё равно импортирует с пробелами.
Когда я сменил в одном из полей таблицы тип с текстового на мемо, данные в это поле занеслись без пробелов, как положено. Но это не выход, т.к. от меня требуются таблицы с полями определённого типа. Но и без этого считаю нужным понять проблему.
Помогите разобраться
...
Рейтинг: 0 / 0
VBA; Лишние пробелы при импорте
    #39464768
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ataxy,

попробуйте , немного изменила
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
function zamena(n1z)
dim s1
s1= n1z & ""

s1=replace(s1,chr(13)," ")
s1=replace(s1,chr(10)," ")
s1=replace(s1,chr(11)," ")
s1=replace(s1,chr(7)," ")
s1=replace(s1,chr(9)," ")
s1=replace(s1,"  "," ")
zamena=trim(s1)   ''''''''''''''''''''''''''''''''''
 end function
...
Рейтинг: 0 / 0
VBA; Лишние пробелы при импорте
    #39464772
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ataxy,
или в документе есть символы с кодами 12 или 14
...
Рейтинг: 0 / 0
VBA; Лишние пробелы при импорте
    #39464786
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если лишние символы в середине слова

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
function zamena(n1z)
dim s1
s1= n1z & ""

s1=replace(s1,chr(13)," ")
s1=replace(s1,chr(10)," ")
s1=replace(s1,chr(11)," ")
s1=replace(s1,chr(7)," ")
s1=replace(s1,chr(9)," ")
s1=replace(s1,"    "," ")  ''4 пробела на 1
s1=replace(s1,"   "," ")   ''3
s1=replace(s1,"  "," ")   ''2
zamena=trim(s1)   ''''''''''''''''''''''''''''''''''
 end function
...
Рейтинг: 0 / 0
VBA; Лишние пробелы при импорте
    #39464805
Ataxy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПЕНСИОНЕРКАAtaxy,

попробуйте , немного изменила
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
function zamena(n1z)
dim s1
s1= n1z & ""

s1=replace(s1,chr(13)," ")
s1=replace(s1,chr(10)," ")
s1=replace(s1,chr(11)," ")
s1=replace(s1,chr(7)," ")
s1=replace(s1,chr(9)," ")
s1=replace(s1,"  "," ")
zamena=trim(s1)   ''''''''''''''''''''''''''''''''''
 end function



авторили в документе есть символы с кодами 12 или 14

ПЕНСИОНЕРКА, я попробовал
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Function zamena(n1z) 
Dim s
s1 = n1z & ""

s1 = Replace(s1, Chr(14), "")
s1 = Replace(s1, Chr(13), "")
s1 = Replace(s1, Chr(10), "")
s1 = Replace(s1, Chr(12), "")
s1 = Replace(s1, Chr(11), "")
s1 = Replace(s1, Chr(7), "")
s1 = Replace(s1, Chr(9), "")
s1 = Replace(s1, " ", "")
zamena = Trim(s1)
End Function


не помогло...

авторесли лишние символы в середине слова
Не, пробелы возникают справа
...
Рейтинг: 0 / 0
VBA; Лишние пробелы при импорте
    #39464835
Ataxy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подумал было, что не пробелы это вовсе, а что-то ещё. Скопировал данные одной из ячеек, вставил в word, отобразил символы - отобразило пробелы!
Но если это они, что ж они тримом и реплейсом не убираются?...
...
Рейтинг: 0 / 0
VBA; Лишние пробелы при импорте
    #39464893
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ataxy,

видимо их подряд больше 2
...
Рейтинг: 0 / 0
VBA; Лишние пробелы при импорте
    #39464897
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ataxy,

примените
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
function zamena(n1z)
dim s1
s1= n1z & ""

s1=replace(s1,chr(13)," ")
s1=replace(s1,chr(10)," ")
s1=replace(s1,chr(11)," ")
s1=replace(s1,chr(7)," ")
s1=replace(s1,chr(9)," ")
s1=replace(s1,"    "," ")  ''4 пробела на 1
s1=replace(s1,"   "," ")   ''3
s1=replace(s1,"  "," ")   ''2
zamena=trim(s1)   ''''''''''''''''''''''''''''''''''
 end function
...
Рейтинг: 0 / 0
VBA; Лишние пробелы при импорте
    #39465040
char,
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
имхо, у ТС поля в таблицы типа char (а не varchar)

Код: sql
1.
create table T (txt1 char(10), txt2 varchar(10))
...
Рейтинг: 0 / 0
VBA; Лишние пробелы при импорте
    #39465475
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПЕНСИОНЕРКАAtaxy,

примените
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
function zamena(n1z)
dim s1
s1= n1z & ""

s1=replace(s1,chr(13)," ")
s1=replace(s1,chr(10)," ")
s1=replace(s1,chr(11)," ")
s1=replace(s1,chr(7)," ")
s1=replace(s1,chr(9)," ")
s1=replace(s1,"    "," ")  ''4 пробела на 1
s1=replace(s1,"   "," ")   ''3
s1=replace(s1,"  "," ")   ''2
zamena=trim(s1)   ''''''''''''''''''''''''''''''''''
 end function

Вот этот участок:
Код: vbnet
1.
2.
3.
s1=replace(s1,"    "," ")  ''4 пробела на 1
s1=replace(s1,"   "," ")   ''3
s1=replace(s1,"  "," ")   ''2

будет давать верный результат, если длина исходного участка пробелов <=10.
Если же длина 11, 14, 17, 19, 20, 22, 23 - длина участка пробелов в результирующей строке будет >1.
А если длина исходного участка пробелов >24, все результаты будут неверными.

Предлагаю вот такое универсальное решение (замена участка пробелов на единичный пробел):
Код: vbnet
1.
2.
3.
 Do Until Len(S) = Len(Replace(S, "  ", " "))
  S = Replace(S, "  ", " ")
 Loop
...
Рейтинг: 0 / 0
VBA; Лишние пробелы при импорте
    #39466549
Ataxy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторимхо, у ТС поля в таблицы типа char (а не varchar)
Да, я действительно использовал CHAR. Поменял тип, пробелы не появляются. Спасибо большое за совет.

Я предположил, что трим и реплейс не срабатывали, т.к. были прописаны в цикле добавления, а пробелы появлялись уже после завершения добавления. Однако, в одном из полей первоначальная функция замены "склеила" значение, где пробел в середине (1 шт - 1шт), хотя также была прописана в цикле. Не понимаю почему...


авторпримените
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
function zamena(n1z)
dim s1
s1= n1z & ""

s1=replace(s1,chr(13)," ")
s1=replace(s1,chr(10)," ")
s1=replace(s1,chr(11)," ")
s1=replace(s1,chr(7)," ")
s1=replace(s1,chr(9)," ")
s1=replace(s1,"    "," ")  ''4 пробела на 1
s1=replace(s1,"   "," ")   ''3
s1=replace(s1,"  "," ")   ''2
zamena=trim(s1)   ''''''''''''''''''''''''''''''''''
 end function




авторВот этот участок:
Код: vbnet
1.
2.
3.
s1=replace(s1,"    "," ")  ''4 пробела на 1
s1=replace(s1,"   "," ")   ''3
s1=replace(s1,"  "," ")   ''2


будет давать верный результат, если длина исходного участка пробелов <=10.
Если же длина 11, 14, 17, 19, 20, 22, 23 - длина участка пробелов в результирующей строке будет >1.
А если длина исходного участка пробелов >24, все результаты будут неверными.

Предлагаю вот такое универсальное решение (замена участка пробелов на единичный пробел):
Код: vbnet
1.
2.
3.
Do Until Len(S) = Len(Replace(S, "  ", " "))
  S = Replace(S, "  ", " ")
 Loop




ПЕНСИОНЕРКА , Michelle , спасибо вам за решения, записал себе
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / VBA; Лишние пробелы при импорте
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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