Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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
Ну вот как то так, наверное:
Option Explicit

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, с помощью макроса:
Workbooks.OpenText FileName:="C:\form.txt", Origin:=xlWindows, _
        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: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
И хочется добавить проверку во время загрузки на совпадение значений в ячейках книги и записях в текстовом файле, и при совпадении загружать строку из текстового файла в строку книги Excel где совпали значения.

Гм... Дык, наверное и грузить тогда надо построчно, и в цикле проверять есть ли в загружаемой строчке нужное значение или нет. 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
Из твоего примера, я понял как можно произвести поиск, но там идет привязка к каким-то определенным символам, как я понял, это символы "S1", т.е. те, с которых начинается каждая строка. Можно ли написать цикл с проверкой, грубо говоря, по "координатам" в текстовике ? На случай если ключевые значения будет начинаться не с "S1". Например с самой первой записи в строке.


Мда... На самом деле проверка действительно есть, и привязывается все это дело не к конкретным символам, а именно к положению, Пример:

Dim  vTmpT, s as string
s="133;gfrt;464"
vTmpT = Split(s, ";";)
'vTmpT(0)=133
'vTmpT(1)=gfrt
'vTmpT(2)=464

 Т.е раздракониваем строку из тектовика, и сравниваем 2-ое значение со значением из екселя

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам