Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / VBA; Лишние пробелы при импорте / 11 сообщений из 11, страница 1 из 1
02.06.2017, 14:31
    #39464696
Ataxy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA; Лишние пробелы при импорте
Доброго времени суток

Для импорта данных из 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
02.06.2017, 15:17
    #39464768
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA; Лишние пробелы при импорте
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
02.06.2017, 15:18
    #39464772
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA; Лишние пробелы при импорте
Ataxy,
или в документе есть символы с кодами 12 или 14
...
Рейтинг: 0 / 0
02.06.2017, 15:26
    #39464786
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA; Лишние пробелы при импорте
если лишние символы в середине слова

Код: 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
02.06.2017, 15:33
    #39464805
Ataxy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA; Лишние пробелы при импорте
ПЕНСИОНЕРКА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
02.06.2017, 16:10
    #39464835
Ataxy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA; Лишние пробелы при импорте
Подумал было, что не пробелы это вовсе, а что-то ещё. Скопировал данные одной из ячеек, вставил в word, отобразил символы - отобразило пробелы!
Но если это они, что ж они тримом и реплейсом не убираются?...
...
Рейтинг: 0 / 0
02.06.2017, 17:16
    #39464893
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA; Лишние пробелы при импорте
Ataxy,

видимо их подряд больше 2
...
Рейтинг: 0 / 0
02.06.2017, 17:18
    #39464897
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA; Лишние пробелы при импорте
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
02.06.2017, 23:20
    #39465040
char,
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA; Лишние пробелы при импорте
имхо, у ТС поля в таблицы типа char (а не varchar)

Код: sql
1.
create table T (txt1 char(10), txt2 varchar(10))
...
Рейтинг: 0 / 0
04.06.2017, 15:02
    #39465475
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA; Лишние пробелы при импорте
ПЕНСИОНЕРКА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
06.06.2017, 11:29
    #39466549
Ataxy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA; Лишние пробелы при импорте
авторимхо, у ТС поля в таблицы типа 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
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / VBA; Лишние пробелы при импорте / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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