Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/14: Рейтинг темы: голосов - 14, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 12.04.2011
Сообщений: 16

Возможно ли перегнать данные из текстового файла по ячейкам в Excel?

09.10.2011, 11:30. Показов 2814. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возможно ли перегнать данные из TXT файла по ячейкам в Excel?

Структура TXT - это по сути база данных фирм, выглядет она вот как:
~ 01
~ 1'ERGONOMIC DESIGN'
~ 2101000, Россия, г. Москва
~ 3(095)255-34-84, 728-84-74, 795-18-95, 253-56-08
~ 6(095)255-34-84
~ 7welcome@ergonomic.ru, welcome@ergonomics.ru
~ 11http://www.ergonomic.ru
~ 9столы компьютерные эргономичные.
~ 10Услуги: проектирование эргономичной мебели. Отдел 'Эргономик Дизайн' - 'МДО ЭЛИТ': 123022, Москва, ул. Красная Пресня, влад. 24.
~ 02
~ 1'АТУМ ДИЗАЙН ГРУПП'
~ 2101000, Россия, г. Москва
~ 3(095)264-01-63
~ 6(095)264-01-63
~ 9мебель высокохудожественная; мебель эксклюзивная.
~ 10Проектирование и изготовление мебели, витражей, люстр и бра.
~ и тд...

А мне надо, чтобы данные выстраивались в строчку поячейка в Excel.
Логически мне представляется это возможным, а вот практически, за не имением особых навыков программирования, не получается...

Очень буду благодарен, если мне распишут и объяснят...
Заранее благодарен!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.10.2011, 11:30
Ответы с готовыми решениями:

Вставить данные из текстового файла в Excel
Коллеги, помогите, зависаю вместе с Экселем. Необходимо из открытой книги лист "П" скриптом открыть текстовый файл, выбрать...

Записать все данные из текстового файла в файл Excel
Здарова. Можете помочь: Есть ли скрипт который скопирует содержимое из блокнота в эксель? Структура файла txt: 02.09.2015;ауди;15:00 ...

Как перегнать данные из txt-файла в текущую базу?
Проблема кроется в считывании данных из текстового файла (*.TXT), где предпологаемые поля данных разделены точкой с запятой ";" и...

19
0 / 0 / 0
Регистрация: 12.04.2011
Сообщений: 16
09.10.2011, 11:52  [ТС]
забыл уточнить - распределение данных должно быть по столбцам
0
2 / 2 / 1
Регистрация: 18.10.2007
Сообщений: 1,748
09.10.2011, 12:54
Ну вариант №1 - обычный парсинг (left, right, mid, inStr, ...), второ вариант - регулярные выражения. Пиши макрос на экселе.
0
0 / 0 / 0
Регистрация: 01.09.2009
Сообщений: 46
09.10.2011, 12:57
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Dim objExcel As Excel.Application
 
Set objExcel = New Excel.Application
objExcel.Workbooks.Add ('...Путь к файлу')
 
'открывайте Ваш файл
 
'Обьеденяйте в масив
VarFull = Split(ret, '~')
    cnt = UBound(VarFull)
    MEdit.MousePointer = vbDefault
    For rec = 0 To cnt
    ret = VarFull(rec)
 
      With objExcel.ActiveSheet
.Cells(n, 1).value = n1 '
.Cells(n, 2).value = Piece(rc, ' ', 1)
.Cells(n, 3).value = Piece(rc, ' ', 2)
.Cells(n, 4).value = Piece(rc, ' ', 3)
. итд
 
 End With
0
0 / 0 / 0
Регистрация: 01.09.2009
Сообщений: 46
09.10.2011, 13:19
Прошу извенения , нажал случайно и отправил не соответствующий
код , а то что выделил из разных проектов
Где-tо около так:

Visual Basic
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
Dim objExcel As Excel.Application
 
Set objExcel = New Excel.Application
objExcel.Workbooks.Add ('...Путь к файлу')  'здесь будете хранить данные excel
 
'открывайте Ваш файл
 
sTemp = 'D:M3   empglo.txt' 'что-то в этом роде
 FileHandle% = FreeFile
ret=''
Open sTemp For Input As #FileHandle%
While Not EOF(1)
Line Input #FileHandle%, emp
If InStr(emp, '~') Then
ret=ret  & emp
 
      End If
    Wend
    Close #1
 
'Обьеденяйте в масив 
 
VarFull = Split(ret, '~')
cnt = UBound(VarFull)
For rec = 0 To cnt
ret = VarFull(rec)
 
'Распределяй в Excel:
for n=0 to cnt
With objExcel.ActiveSheet
 .Cells(n, 2).value = Piece(ret, '~', 1)
 .Cells(n, 3).value = Piece(rc, '~', 2)
 .Cells(n, 4).value = Piece(rc, '~', 3)
. итд
 
End With
 next n
Я бы поступил примерно так, может быть еще что-то придется поправлять..
0
CepbIu
09.10.2011, 13:26
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Sub sExcel(FilePath As String)
'открываем файл txt
Set fso = New Scripting.FileSystemObject
Set txtStream = fso.OpenTextFile(FilePath, ForReading)
'создаём лист Excel
Set objExcel = New Excel.Application 
Excel.Application
objExcel.Visible = True 
objExcel.SheetsInNewWorkbook = 1
objExcel.Workbooks.Add
'читаем данные из txt файла и заносим в Excel
i = 1
j = 1
While Not txtStream.AtEndOfStream
    txtLine = txtStream.ReadLine
    If IsNumeric(Mid(txtLine, 4)) = True Then
        i = 1
        j = j + 1
    End If
    objExcel.ActiveSheet.Cells(j, i) = Mid(txtLine, 4)
    i = i + 1
Wend
End Sub
0 / 0 / 0
Регистрация: 12.04.2011
Сообщений: 16
09.10.2011, 15:16  [ТС]
Вы уж извините меня, но чего то не хочет получаться...
Руки не из того места ростут наверное...

Я вставяю код в модуль, запускаю процедуру, а она начинает ругаться на Piece

Visual Basic
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
Dim objExcel As Excel.Application
 
Set objExcel = New Excel.Application
objExcel.Workbooks.Add ('...Путь к файлу') 'здесь будете хранить данные excel
 
'открывайте Ваш файл
 
sTemp = 'D:M3   empglo.txt' 'что-то в этом роде
FileHandle% = FreeFile
ret=''
Open sTemp For Input As #FileHandle%
While Not EOF(1)
Line Input #FileHandle%, emp
If InStr(emp, '~') Then
ret=ret & emp
 
End If
Wend
Close #1
 
'Обьеденяйте в масив 
 
VarFull = Split(ret, '~')
cnt = UBound(VarFull)
For rec = 0 To cnt
ret = VarFull(rec)
 
'Распределяй в Excel:
for n=0 to cnt
With objExcel.ActiveSheet
.Cells(n, 2).value = Piece(ret, '~', 1)
.Cells(n, 3).value = Piece(rc, '~', 2)
.Cells(n, 4).value = Piece(rc, '~', 3)
0
0 / 0 / 0
Регистрация: 01.09.2009
Сообщений: 46
09.10.2011, 15:20
Прошу извенения , забыл что это нестандартная функция...
В модуле (.bas) припиши:

Visual Basic
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
Function Piece(chars As String, delimiter As String, position As Long)
   
    If position < 1 Then
        Piece = ''
        Exit Function
    End If
    ReDim Where(0 To position + 1) As Long
    Where(0) = 1
    Current = 1
    Length = Len(delimiter)
    For Count = 1 To position
        Where(Count) = InStr(Current, chars, delimiter)
        If Where(Count) = 0 Then Where(Count) = Len(chars) + 1
        Current = Where(Count) + Len(delimiter)
    Next Count
    If position = 1 Then
        Length = 0
    End If
    If (Where(position) = Where(position - 1)) Then
        back = ''
    Else
        back = Mid(chars, (Where(position - 1) + Length), (Where(position) - Where(position - 1) - Length))
    End If
    Piece = back
End Function
0
0 / 0 / 0
Регистрация: 01.09.2009
Сообщений: 46
09.10.2011, 15:24
Еще не дописал цикл до конця (я !)
For rec = 0 To cnt
ret = VarFull(rec)
next rec

0
0 / 0 / 0
Регистрация: 12.04.2011
Сообщений: 16
09.10.2011, 15:36  [ТС]
Поправьте меня

вот как я написал

Visual Basic
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
60
61
62
63
Sub bas()
Function Piece(chars As String, delimiter As String, position As Long)
 
If position < 1 Then
Piece = ''
Exit Function
End If
ReDim Where(0 To position + 1) As Long
Where(0) = 1
Current = 1
Length = Len(delimiter)
For Count = 1 To position
Where(Count) = InStr(Current, chars, delimiter)
If Where(Count) = 0 Then Where(Count) = Len(chars) + 1
Current = Where(Count) + Len(delimiter)
Next Count
If position = 1 Then
Length = 0
End If
If (Where(position) = Where(position - 1)) Then
back = ''
Else
back = Mid(chars, (Where(position - 1) + Length), (Where(position) - Where(position - 1) - Length))
End If
Piece = back
End Function
For rec = 0 To cnt
ret = VarFull(rec)
Next rec
End Function
 
Dim objExcel As Excel.Application
 
Set objExcel = New Excel.Application
objExcel.Workbooks.Add ('d:ase') 
 
sTemp = 'F:data
ewbase.txt' FileHandle% = FreeFile
ret = ''
Open sTemp For Input As #FileHandle%
While Not EOF(1)
Line Input #FileHandle%, emp
If InStr(emp, '~') Then
ret = ret & emp
 
End If
Wend
Close #1
 
VarFull = Split(ret, '~')
cnt = UBound(VarFull)
For rec = 0 To cnt
ret = VarFull(rec)
 
For n = 0 To cnt
With objExcel.ActiveSheet
.Cells(n, 2).Value = Piece(ret, '~', 1)
.Cells(n, 3).Value = Piece(rc, '~', 2)
.Cells(n, 4).Value = Piece(rc, '~', 3)
 
End With
Next n
End Function
0
0 / 0 / 0
Регистрация: 01.09.2009
Сообщений: 46
09.10.2011, 16:19
То что было до сих пор - обьявляется для ФОРМЫ !!! (кнопки и т д т п)
В вашем проекте добовляй еще модуль !!!
Poject -> Add Module !!!
Кроме Forms должно появлятся еще рубрика Modules ...

Там и пропиши Function !!!
0
0 / 0 / 0
Регистрация: 01.09.2009
Сообщений: 46
09.10.2011, 17:54
Самый простой код, Этот кусочек точно рабочий даже без модуля !!!
А вот Функция из модуля понадобится для дальнейшей
разбиние строк

1.Project -> Add References -> Microsoft Excel 9.0 Object Library поставь галочку !!!

2.Форма и кнопка:
Для кнопки:

Visual Basic
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
Private Sub Command1_Click()
Dim ret As String
Dim n as integer
 
Dim objExcel As Excel.Application
Set objExcel = New Excel.Application
objExcel.Workbooks.Add ('C: est.xls') 'excel
sTemp = 'C: est.txt' 'text
FileHandle% = FreeFile
ret = ''
Open sTemp For Input As #FileHandle%
While Not EOF(1)
Line Input #FileHandle%, emp
If InStr(emp, '~') Then
ret = ret & emp
End If
Wend
Close #1
 
n = 0
VarFull = Split(ret, '~')
cnt = UBound(VarFull)
For rec = 0 To cnt
n = n + 1
ret = VarFull(rec)
 
With objExcel.ActiveSheet
objExcel.Cells(n, 1) = ret
End With
Next rec
objExcel.Visible = True
 
'Set objExcel = Nothing
End Sub
0
0 / 0 / 0
Регистрация: 12.04.2011
Сообщений: 16
10.10.2011, 10:49  [ТС]
to gontiaval
мб я дам вам мой TXT файл, а вы мне на его основании, продемонстрируете как всё должно быть, а то что то ни как...

изложу суть:
в TXT файле данные приведены построчно, а мне надо их перегнать в excel по столбцам
фирма/адрес/тел/факс и тд...

если вы вдруг согласитесь уделить ваше драгоценное время моей проблеме, которую я точно сам не решу - надо идти на курсы..., дайте свой e-mail, и я вышлю вам базу...
просто мне срочно надо...

Заранее благодарен
0
0 / 0 / 0
Регистрация: 01.09.2009
Сообщений: 46
10.10.2011, 17:00
Я согласен, чем смогу помогу. Адрес мой , достаточно нажать на мое имя- gontiaval
Ваш почему-то переслал ошибку...
0
0 / 0 / 0
Регистрация: 12.04.2011
Сообщений: 16
17.10.2011, 17:46  [ТС]
to Автор: gontiaval
Вы мне обещали помочь, я выслал файл...
0
Сумрак
17.10.2011, 19:14
Вышли мне на rollor@mail.primorye.ru
Гляну что там у тебя... А то уже неделю ждешь :-)
0 / 0 / 0
Регистрация: 01.09.2009
Сообщений: 46
18.10.2011, 10:28
К сожелению я ничего не получил, а
Ваша почта вот что мне возвращает :

Reporting-MTA: dns;hotmail.com
Received-From-MTA: dns;mail.hotmail.com
Arrival-Date: Tue, 9 Aug 2005 22:35:00 -0700

Final-Recipient: rfc822;finnsky@gmail.com
Action: failed
Status: 5.7.1
Diagnostic-Code: smtp;550 5.7.1 No such user 14si13759143wrl


Я не знаю как связатся с Вами !!!
0
Сумрак
18.10.2011, 17:38
Лана.. попробуем решить тут...
Разложим на составляющие.
1.Открытие и перебор строк в ТХТ файле.
>> [bold]CepbIu[/bold] его вариант мне по душе, я тоже FSO использую для TXT.
Если вы не против возмем его процедуру...
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sub sExcel(FilePath As String)
''открываем файл txt
Set fso = New Scripting.FileSystemObject
Set txtStream = fso.OpenTextFile(FilePath, ForReading)
''создаём лист Excel
Set objExcel = New Excel.Application
Excel.Application
objExcel.Visible = True
objExcel.SheetsInNewWorkbook = 1
objExcel.Workbooks.Add
''читаем данные из txt файла и заносим в Excel
i = 1
j = 1
While Not txtStream.AtEndOfStream
txtLine = txtStream.ReadLine
''Тут мы сталкиваемся с пунктом 2.
If IsNumeric(Mid(txtLine, 4)) = True Then
''дело в том что этот вариант не совсем рабочий...
что будет если "~ 33333"?
судя по примеру в начале... количество строк не всегда одинаково между базовыми строками.
Ваши предложения...
CepbIu
19.10.2011, 16:43
Visual Basic
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
Dim fso As Scripting.FileSystemObject
Dim txtStream As TextStream
Private Type tField
    id As Long
    value As String
End Type
Sub sExcel(FilePath As String)
Dim txtLine As String
Dim fValue As tField
 
Set fso = New Scripting.FileSystemObject
Set txtStream = fso.OpenTextFile(FilePath, ForReading)
Set objExcel = New Excel.Application ''ñîçäàåì ýêçåìïëÿð îáúåêòà Excel.Application
objExcel.Visible = True ''äåëàåì åãî âèäèìûì (îòêðûâàåì Excel)
objExcel.SheetsInNewWorkbook = 1 ''óñòàíàâëèâàåì êîëè÷åñòâî ëèñòîâ â îòêðûâàåìîé êíèãå
objExcel.Workbooks.Add
 
j = 1
While Not txtStream.AtEndOfStream
    txtLine = txtStream.ReadLine
    If IsNumeric(Mid(txtLine, 3)) = True Then j = j + 1
    fValue = fCheckField(txtLine)
    objExcel.ActiveSheet.Cells(j, fValue.id + 1) = fValue.value
Wend
 
End Sub
Private Function fCheckField(value As String) As tField
Dim v As String
If IsNumeric(Mid(value, 3)) = True Then
    fCheckField.id = 0
    fCheckField.value = Mid(value, 3)
ElseIf IsNumeric(Mid(value, 3, 6)) = True And InStr(1, value, "@") = 0 Then
    fCheckField.id = 2
    fCheckField.value = Mid(value, 3)
Else
    v = Mid(value, 3)
    While IsNumeric(v) = False
        v = Left(v, Len(v) - 1)
    Wend
    fCheckField.id = CLng(v)
    fCheckField.value = Mid(value, 3 + Len(v))
End If
    
End Function
в функции fCheckField идёт определение номера поля и значения, чтоб её дописать надо видеть какие могут принимать значения другия поля
Сумрак
24.10.2011, 21:29
На всякий случай и сюда выложу.
Visual Basic
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 txtExcel()
Dim TS As TextStream, FSO As Scripting.FileSystemObject
Dim Rw As Long, Cl As Long, x As Integer, y As Integer
Set FSO = New Scripting.FileSystemObject
Set TS = FSO.OpenTextFile("c:123.txt", ForReading)
Rw = 1
Do
    txtLine = TS.ReadLine
    DoEvents
    If Left(Replace(txtLine, " ", ""), 2) = "~0" Then
        Rw = Rw + 1
        Cl = 1
    Else
        Cl = Cl + 1
        If Cl > 2 And Left(Trim(Mid(txtLine, 2)), 1) = 1 Then
            x = Val(Left(Trim(Mid(txtLine, 2)), 2))
            y = InStr(1, txtLine, CStr(x)) + 2
        Else
            x = Val(Left(Trim(Mid(txtLine, 2)), 1))
            y = InStr(1, txtLine, CStr(x)) + 1
        End If
        ActiveSheet.Cells(Rw, x) = Mid(txtLine, y)
    End If
Loop While Not TS.AtEndOfStream
TS.Close
Set TS = Nothing
Set FSO = Nothing
MsgBox "Все готово"
End Sub
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.10.2011, 21:29
Помогаю со студенческими работами здесь

Как получить/записать данные в документ Excel с разноской по ячейкам?
Кто знает как получить/записать данные в документ Excel с разноской по ячейкам. спсибо.

Как считать из файла Excel по ячейкам?
Нужно соединится с файлом Excel и считывать из него информацию по ячеечно. Кусочек кода бы или где почитать.

Перегнать данные из любого файла с разделителями в таблицу базы данных (без повторов)
Здравствуйте. В университете дали задание по sql. СУБД Oracle. Необходимо перегнать данные из любого файла с разделителями в таблицу...

Excel. Как, перемещаясь по ячейкам столбца,вводить в них данные из определенного списка?
Как, перемещаясь по ячейкам столбца,вводить в них данные из определенного списка?

Описать структуру с полями, считать данные из текстового файла, вывести данные, подсчитать количество
Доброе утро. С C# я знаком весьма посредственно, однако появилась необходимость выполнить на нем следующее задание: Описать структуру с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru