Страница: 1 |
Страница: 1 |
Вопрос: Загрузка в Excel из txt
Добавлено: 02.06.08 21:26
Автор вопроса: Kines
Добрый день !
Есть текстовый файл в котором содержатся записи вида:
;S11112;1552874.00;0.00;
;S11115;8780.00;0.00;
;S11118;600876.00;2506.00;
;S11302;0.00;2948.00;
;S11501;58572.00;0.00;
;S11505;12334.00;0.00;
;S11603;265542.00;0.00;
;S12101;31779.00;0.00;
;S12102;472576.00;4111.00;
;S12201;462945.00;0.00;
;S12301;105000.00;0.00;
Количество строк все время разное, разделитель символ ";"
В книге есть ячейки с постоянными значениями:S11112, S11114, S11115...
Подскажите, как можно при загрузке данных из тестовика сделать сравнение ячеек в книге и записей в тестовом файле? Если, например, ячейка A3 равна S12101, то строка в текстовике, которая содержит S12101 записывается в строку 3.
Ответы
Всего ответов: 8
Номер ответа: 1
Автор ответа:
s12
Вопросов: 24
Ответов: 363
Профиль | | #1
Добавлено: 03.06.08 01:12
Ну вот как то так, наверное:
Private Sub Command1_Click()
Dim ExA As Excel.Application
Dim wb As Workbook
Dim vTmpT As Variant, vTmpE As Variant, vTmpS As Variant
Dim s As String, s1 As String
Dim i As Long, t As Long
Set ExA = CreateObject("Excel.Application"
With ExA
Set wb = .Workbooks.Add(App.Path & "\tmp.xlsx" 'открываем рабочую книгу, если офис<2007 то расширение .xls
.Visible = True 'чтобы потом лишние процессы ручками не выгружать
s = vbNullString: i = 1
Do
If Len(.Cells(i, 1)) = 0 Then Exit Do 'перебираем 1 столбец пока он не "кончится"
s = s & .Cells(i, 1).Value & Chr(2)
i = i + 1
Loop
'Получаем список заголовков
vTmpE = Split(s, Chr(2)) 'список номеров по порядку из книги
Open App.Path & "\tmp.txt" For Input As #1 'открываем текстовый файл
Do While Not EOF(1)
Line Input #1, s
s1 = s1 & s & vbCrLf
Loop
vTmpS = Split(s1, vbCrLf) 'строки из тектового файла
s = vbNullString
For i = 0 To UBound(vTmpS) - 1 'перебираем все строки еще раз, с целью выдрать из них номера
vTmpT = Split(vTmpS(i), ";"
s = s & vTmpT(1) & Chr(2)
Next
Erase vTmpT
vTmpT = Split(s, Chr(2)) 'список номеров из тектового файла
'Упорядочиваем все как в книге
s = vbNullString
For i = 0 To UBound(vTmpE)
For t = 0 To UBound(vTmpT)
If vTmpE(i) = vTmpT(t) Then s = s & vTmpS(t) & vbCrLf: t = UBound(vTmpT) '
Next
Next
Close 'закрываем все потоки
Open App.Path & "\out.txt" For Output As #1
Print #1, s 'выводим результат
End With
End Sub
Не забудь библиотеку екселя подключить.
ЗЫ: Код далеко не совершенен, без половины циклов и переменных можно обойтись, но оптимизация это уже совсем другая история...
Номер ответа: 2
Автор ответа:
s12
Вопросов: 24
Ответов: 363
Профиль | | #2
Добавлено: 03.06.08 01:15
Ооп, блин, конфуз... перечитал сабж, фигню написал.
Ну да ладно, для примера подойдет и это, наверное.
Номер ответа: 3
Автор ответа:
Kines
Вопросов: 1
Ответов: 3
Профиль | | #3
Добавлено: 03.06.08 11:46
Спасибо. Но, дело в том, что я загружаю данные прямо из Excel, с помощью макроса:
StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=True, Comma:=False _
, Space:=False, Other:=False, FieldInfo:=Array(Array(1, 2), Array(2, 1), _
Array(3, 1), Array(4, 1))
Range("A1:K1372".Select
Selection.Copy
Windows("form1.xls".Activate
Range("A3".Select
ActiveSheet.Paste
Windows("form.txt".Activate
Range("A7".Select
Application.CutCopyMode = False
Selection.Copy
ActiveWorkbook.Close SaveChanges:=False
Columns("A:A".Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
Columns("B:B".Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
Columns("C:C".Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
Columns(":D".Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
Columns("E:E".Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
Columns("F:F".Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
Columns("H:H".Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
Columns("I:I".Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
Columns("J:J".Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
Columns("K:K".Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
Selection.Borders(xlEdgeTop).LineStyle = xlNone
Selection.Borders(xlEdgeBottom).LineStyle = xlNone
Range("A9".Select
Range("F3:K1398".Select
Selection.NumberFormat = "#,##0.00"
Range("F3".Select
End Sub
И хочется добавить проверку во время загрузки на совпадение значений в ячейках книги и записях в текстовом файле, и при совпадении загружать строку из текстового файла в строку книги Excel где совпали значения.
Номер ответа: 4
Автор ответа:
s12
Вопросов: 24
Ответов: 363
Профиль | | #4
Добавлено: 04.06.08 00:24
Гм... Дык, наверное и грузить тогда надо построчно, и в цикле проверять есть ли в загружаемой строчке нужное значение или нет. VBA ИМХО и не такое позволяет
Номер ответа: 5
Автор ответа:
Kines
Вопросов: 1
Ответов: 3
Профиль | | #5
Добавлено: 04.06.08 00:46
Угу Вот я и был бы рад узнать как это можно реализовать Я VBA только начал изучать, поэтому возникают проблемы, кроме загрузки "в лоб" я не могу понять как сделать цикл с проверкой на нужное значение.
Номер ответа: 6
Автор ответа:
Kines
Вопросов: 1
Ответов: 3
Профиль | | #6
Добавлено: 04.06.08 00:53
Из твоего примера, я понял как можно произвести поиск, но там идет привязка к каким-то определенным символам, как я понял, это символы "S1", т.е. те, с которых начинается каждая строка. Можно ли написать цикл с проверкой, грубо говоря, по "координатам" в текстовике ? На случай если ключевые значения будет начинаться не с "S1". Например с самой первой записи в строке.
Номер ответа: 7
Автор ответа:
Smith
ICQ: adamis@list.ru
Вопросов: 153
Ответов: 3632
Профиль | | #7
Добавлено: 04.06.08 05:29
Запросто. Но лучше:
Объяви массив строк
Вгрузи в него все строки текстовика
Разбей строки в массиве на столбцы по разделителю
А там уже сравнивай ячейки массива с ячейками листа и делай нужные присвоения сколько душе угодно
Номер ответа: 8
Автор ответа:
s12
Вопросов: 24
Ответов: 363
Профиль | | #8
Добавлено: 05.06.08 10:15
Мда... На самом деле проверка действительно есть, и привязывается все это дело не к конкретным символам, а именно к положению, Пример:
Dim vTmpT, s as string
s="133;gfrt;464"
vTmpT = Split(s, ";"
'vTmpT(0)=133
'vTmpT(1)=gfrt
'vTmpT(2)=464
Т.е раздракониваем строку из тектовика, и сравниваем 2-ое значение со значением из екселя