Discussion:
Excel VBA: Import wybranych danych z pliku .csv (.txt)
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
Marcin R.
2006-03-10 23:02:51 UTC
Permalink
Witam!
Jak zmodyfikować poniższy kod (mam go z książki) aby pobrać dane ze
wskazanego pliku .csv lub .txt - ale nie wszystkie, tylko od wiersza 1 do 24
z "3 kolumny" (czyli dane za 2 a przed 3 średnikiem"
Ponadto są to dane liczbowe podane w systemie amerykańskim, czyli dziesiętna
część liczby jest po kropce. Jak dokonać automatycznej zmiany na system
europejski tak aby np. 10.34 zamieniło na 10,34

Sub ImportRange()
Dim ImpRng As Range
Dim FileName As String
Dim r As Long, c As Integer
Dim txt As String, Char As String * 1
Dim Data
Dim i As Integer

Set ImpRng = ActiveCell
On Error Resume Next
FileName = "d:\Marti\Marti.csv"
Open FileName For Input As #1
If Err <> 0 Then
MsgBox "Nie znaleziono pliku: " & FileName, vbCritical, "BŁĄD"
Exit Sub
End If
r = 0
c = 0
txt = ""
Application.ScreenUpdating = False
Do Until EOF(1)
Line Input #1, Data
For i = 1 To Len(Data)
Char = Mid(Data, i, 1)
If Char = "," Then 'przecinek
ActiveCell.Offset(r, c) = txt
c = c + 1
txt = ""
ElseIf i = Len(Data) Then 'znak końca wiersza
If Char <> Chr(34) Then txt = txt & Char
ActiveCell.Offset(r, c) = txt
txt = ""
ElseIf Char <> Chr(34) Then
txt = txt & Char
End If
Next i
c = 0
r = r + 1
Loop
Close #1
Application.ScreenUpdating = True
End Sub
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Marcin R.
2006-03-10 23:22:58 UTC
Permalink
Post by Marcin R.
Jak zmodyfikować poniższy kod (mam go z książki) aby pobrać dane ze
wskazanego pliku .csv lub .txt - ale nie wszystkie, tylko od wiersza 1 do 24
z "3 kolumny" (czyli dane za 2 a przed 3 średnikiem"
Jakiej należy jeszcze dokonać modyfikacji żeby dane importowały się nie do
aktywnej komórki tylko do innej wskazanej komórki w innym otwartym pliku np.
Workbooks("110_Vn.xls").Sheets("01").Range("B4")
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Tajan
2006-03-11 11:24:04 UTC
Permalink
Witam!
Jak zmodyfikowaæ poni¿szy kod (mam go z ksi±¿ki) aby pobraæ dane ze
wskazanego pliku .csv lub .txt - ale nie wszystkie, tylko od wiersza
1 do 24 z "3 kolumny" (czyli dane za 2 a przed 3 ¶rednikiem"
Jakiej nale¿y jeszcze dokonaæ modyfikacji ¿eby dane importowa³y siê
nie do aktywnej komórki tylko do innej wskazanej komórki w innym
otwartym pliku np. Workbooks("110_Vn.xls").Sheets("01").Range("B4")
Przyk³ad modyfikacji, zgodnie z Twoimi potrzebami masz poni¿ej. Jednak,
gdyby co¶ nie dzia³a³o, wklej fragment pliku tekstowego, który przetwarzasz.
Mam bowiem pewne w±tpliwo¶ci. Przyk³adowo, piszesz, ¿e separatorem pól jest
¶rednik, natomiast w kodzie przedstawionego przez Ciebie makra jest nim
przecinek. W makrze zastosowa³em ¶rednik.
W sumie makro mog³oby byæ prostsze, ale nie chcia³em za bardzo odbiegaæ od
pierwowzoru :-)

Sub ImportRange()
Dim ImpRng As Range
Dim FileName As String
Dim r As Long, c As Integer
Dim txt As String, Char As String * 1
Dim Data
Dim i As Integer
Dim linia As Integer, nrPola As Integer

Set ImpRng = Workbooks("110_Vn.xls").Sheets("01"). _
Range("B4")

'On Error Resume Next
FileName = "d:\Marti\Marti.csv"
Open FileName For Input As #1
If Err <> 0 Then
MsgBox "Nie znaleziono pliku: " & FileName, vbCritical, "B£¡D"
Exit Sub
End If

r = 0
c = 0

Application.ScreenUpdating = False

linia = 1

Do Until EOF(1) Or linia = 25
txt = ""
nrPola = 0
Line Input #1, Data
For i = 1 To Len(Data)
Char = Mid(Data, i, 1)
If Char <> Chr(34) And Char <> ";" Then
txt = txt & Char
End If
If Char = ";" Or i = Len(Data) Then
nrPola = nrPola + 1
If nrPola = 3 Then
ImpRng.Offset(r, c) = Val(txt)
Exit For
End If
txt = ""
End If
Next i
c = 0
r = r + 1
linia = linia + 1
Loop
Close #1
Application.ScreenUpdating = True
End Sub

Tajan
--
Tadeusz Jankowski (MS Excel MVP)
Marcin R.
2006-03-11 14:27:30 UTC
Permalink
Post by Tajan
Do Until EOF(1) Or linia = 25
txt = ""
nrPola = 0
Line Input #1, Data
For i = 1 To Len(Data)
Char = Mid(Data, i, 1)
If Char <> Chr(34) And Char <> ";" Then
txt = txt & Char
End If
If Char = ";" Or i = Len(Data) Then
nrPola = nrPola + 1
If nrPola = 3 Then
ImpRng.Offset(r, c) = Val(txt)
Exit For
End If
txt = ""
End If
Next i
c = 0
r = r + 1
linia = linia + 1
Loop
Close #1
Application.ScreenUpdating = True
End Sub
Tajan
Wielkie Dzięki za pomoc - wszycho działa aż miło
A tak z ciekawości - w którym miejscu dochodzi do zamiany "." na "," przed
dziesiątymi częściami liczby
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Tajan
2006-03-11 15:08:09 UTC
Permalink
Witam!
Wielkie Dziêki za pomoc - wszycho dzia³a a¿ mi³o
A tak z ciekawo¶ci - w którym miejscu dochodzi do zamiany "." na ","
przed dziesi±tymi czê¶ciami liczby
ImpRng.Offset(r, c) = Val(txt)

Funkcja Val zmienia ci±g tekstowy reprezentuj±cy liczbê na warto¶æ liczbow±
a jako separator dziesiêtny akceptuje wy³±cznie kropkê. Z warto¶ci± liczbow±
to ju¿ sobie Excel radzi, ustalaj±c separator zgodnie z ustawieniami
regionalnymi.

Tajan

Tadeusz Jankowski (MS Excel MVP)
Marcin R.
2006-03-13 15:14:06 UTC
Permalink
Witam ponownie!
Mam prośbę (w sumie to do Mistrza Tajana) - a jak zmodyfikować podany przez
Ciebie poprawiony kod (z książki) aby pobrać dane ze
wskazanego pliku .csv lub .txt - tylko od wiersza 1 do 24
z kolumn: od 3 do 6 (czyli dane za 2,3,4,5 średnikiem)

linia = 1

Do Until EOF(1) Or linia = 25
txt = ""
nrPola = 0
Line Input #1, Data
For i = 1 To Len(Data)
Char = Mid(Data, i, 1)
If Char <> Chr(34) And Char <> ";" Then
txt = txt & Char
End If
If Char = ";" Or i = Len(Data) Then
nrPola = nrPola + 1
If nrPola = 3 Then
ImpRng.Offset(r, c) = Val(txt)
Exit For
End If
txt = ""
End If
Next i
c = 0
r = r + 1
linia = linia + 1
Loop
Close #1
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Tajan
2006-03-13 17:47:30 UTC
Permalink
Witam!
Post by Marcin R.
Witam ponownie!
Mam pro¶bê (w sumie to do Mistrza Tajana) - a jak zmodyfikowaæ podany
przez Ciebie poprawiony kod (z ksi±¿ki) aby pobraæ dane ze
wskazanego pliku .csv lub .txt - tylko od wiersza 1 do 24
z kolumn: od 3 do 6 (czyli dane za 2,3,4,5 ¶rednikiem)
linia = 1
Do Until EOF(1) Or linia = 25
txt = ""
nrPola = 0
Line Input #1, Data
For i = 1 To Len(Data)
Char = Mid(Data, i, 1)
If Char <> Chr(34) And Char <> ";" Then
txt = txt & Char
End If
If Char = ";" Or i = Len(Data) Then
nrPola = nrPola + 1
If nrPola = 3 Then
ImpRng.Offset(r, c) = Val(txt)
Exit For
End If
txt = ""
End If
Next i
c = 0
r = r + 1
linia = linia + 1
Loop
Close #1
If Char = ";" Or i = Len(Data) Then
nrPola = nrPola + 1
If nrPola = 3 Then
ImpRng.Offset(r, c) = Val(txt)
Exit For
End If
txt = ""
End If
Zamieñ na:

If Char = ";" Or i = Len(Data) Then
nrPola = nrPola + 1
If nrPola = 3 Then
ImpRng.Offset(r, c) = Val(txt)
c = c +1
ElseIf nrPola = 4 Then
ImpRng.Offset(r, c) = txt
c = c +1
ElseIf nrPola = 5 Then
ImpRng.Offset(r, c) = txt
c = c +1
ElseIf nrPola = 6 Then
ImpRng.Offset(r, c) = txt
Exit For
End If
txt = ""
End If

Mo¿na by by³o nieco krócej, ale nie wiem jakiego typu s± dane z
poszczególnych pól. Na razie wpisywane s± do komórek w takiej formie, w
jakiej zosta³y pobrane z pliku (oczywi¶cie, oprócz pola 3) ale, w razie
potrzeby, mo¿na dostosowaæ format dla ka¿dego pola oddzielnie.

Tajan
--
Tadeusz Jankowski (MS Excel MVP)
Marcin R.
2006-03-15 23:06:19 UTC
Permalink
Post by Tajan
If Char = ";" Or i = Len(Data) Then
nrPola = nrPola + 1
If nrPola = 3 Then
ImpRng.Offset(r, c) = Val(txt)
c = c +1
ElseIf nrPola = 4 Then
ImpRng.Offset(r, c) = txt
c = c +1
ElseIf nrPola = 5 Then
ImpRng.Offset(r, c) = txt
c = c +1
ElseIf nrPola = 6 Then
ImpRng.Offset(r, c) = txt
Exit For
End If
txt = ""
End If
Można by było nieco krócej, ale nie wiem jakiego typu są dane z
poszczególnych pól. Na razie wpisywane są do komórek w takiej formie, w
jakiej zostały pobrane z pliku (oczywiście, oprócz pola 3) ale, w razie
potrzeby, można dostosować format dla każdego pola oddzielnie.
W sumie to coś mi to nie idzie.
Dla lepszego zrozumienia mam do Ciebie jeszcze jedną prośbę. Dla konkretnych
przykladowych n/w danych - czy mógłbyś podać mi całkowicie swoją propozycję
na zaimportowanie danych:
- z 31 plików d:\marti\dane060101.csv do d:\marti\dane060131.csv
- dane są tylko liczbowe (dziesiętna część licz po kropce)umieszczone w 6
kolumnach po 25 wierszy
- Interesują mnie dane z czterech kolumn: od kolumny 3 do 6(ostatniej) z
wierszy od 1 do 24.
- Importowane dane mają się znaleźć w pliku o nazwie d:\marti\marti.xls w
arkuszu 2006-01 począwszy od komorki B4:E27 (z dane060101.csv), następnie
F4:I27 (z dane060102.csv), itd.
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Tajan
2006-03-15 23:34:31 UTC
Permalink
Witam!
Post by Tajan
Mo¿na by by³o nieco krócej, ale nie wiem jakiego typu s± dane z
poszczególnych pól. Na razie wpisywane s± do komórek w takiej
formie, w jakiej zosta³y pobrane z pliku (oczywi¶cie, oprócz pola 3)
ale, w razie potrzeby, mo¿na dostosowaæ format dla ka¿dego pola
oddzielnie.
W sumie to co¶ mi to nie idzie.
Dla lepszego zrozumienia mam do Ciebie jeszcze jedn± pro¶bê. Dla
konkretnych przykladowych n/w danych - czy móg³by¶ podaæ mi
- z 31 plików d:\marti\dane060101.csv do d:\marti\dane060131.csv
- dane s± tylko liczbowe (dziesiêtna czê¶æ licz po kropce)umieszczone
w 6 kolumnach po 25 wierszy
- Interesuj± mnie dane z czterech kolumn: od kolumny 3 do
6(ostatniej) z wierszy od 1 do 24.
- Importowane dane maj± siê znaleŒæ w pliku o nazwie
d:\marti\marti.xls w arkuszu 2006-01 pocz±wszy od komorki B4:E27 (z
dane060101.csv), nastêpnie F4:I27 (z dane060102.csv), itd.
Wrzuæ mi na priv kilkana¶cie przyk³adowych linii z pliku csv. Ponadto, podaj
wersjê Excela, w której bêdziesz tego uzywa³.

Tajan
--
Tadeusz Jankowski (MS Excel MVP)
Tajan
2006-03-16 19:24:19 UTC
Permalink
Witam!
W sumie to co¶ mi to nie idzie.
Dla lepszego zrozumienia mam do Ciebie jeszcze jedn± pro¶bê. Dla
konkretnych przykladowych n/w danych - czy móg³by¶ podaæ mi
- z 31 plików d:\marti\dane060101.csv do d:\marti\dane060131.csv
- dane s± tylko liczbowe (dziesiêtna czê¶æ licz po kropce)umieszczone
w 6 kolumnach po 25 wierszy
- Interesuj± mnie dane z czterech kolumn: od kolumny 3 do
6(ostatniej) z wierszy od 1 do 24.
- Importowane dane maj± siê znaleŒæ w pliku o nazwie
d:\marti\marti.xls w arkuszu 2006-01 pocz±wszy od komorki B4:E27 (z
dane060101.csv), nastêpnie F4:I27 (z dane060102.csv), itd.
Opieraj±c siê na powy¿szym makrze mo¿na utworzyæ np. taki kod:

Sub ImportFromFile()
Dim FileName As String
Dim FilePath As String
Dim ImpRng As Range
Dim i As Integer

FilePath = "d:\Marti\"

Application.ScreenUpdating = False

For i = 1 To 31
FileName = "DF0601" & Format(i, "00") & ".CSV"
Set ImpRng = Workbooks("Zestawienie_zbiorcze").Sheets("01"). _
Range("B4").Offset(0, 4 * (i - 1))
SaveToRange FilePath & FileName, ImpRng
Next

Application.ScreenUpdating = True

End Sub


Sub SaveToRange(FileName As String, ImpRng As Range)

Dim r As Long, c As Integer
Dim txt As String, Char As String * 1
Dim Data
Dim i As Integer
Dim linia As Integer, nrPola As Integer


If Dir(FileName) = "" Then
MsgBox "Nie znaleziono pliku: " & FileName, vbCritical, "B£¡D"
Exit Sub
End If

Open FileName For Input As #1

r = 0
c = 0

linia = 1

Do Until EOF(1) Or linia = 25
txt = ""
nrPola = 0
Line Input #1, Data
For i = 1 To Len(Data)
Char = Mid(Data, i, 1)
If Char <> Chr(34) And Char <> ";" Then
txt = txt & Char
End If
If Char = ";" Or i = Len(Data) Then
nrPola = nrPola + 1
Select Case nrPola
Case 3, 4, 5, 6
ImpRng.Offset(r, c) = Val(txt)
c = c + 1
End Select
If nrPola = 6 Then
Exit For
End If
txt = ""
End If
Next i
c = 0
r = r + 1
linia = linia + 1
Loop
Close #1

End Sub

Kod rozdzieli³em na dwie procedury. Pierwsza, ImportFromFile, jest makrem
g³ownym. Za pomoc± pêtli, tworzone sa w niej kolejne nazwy plików do
wczytania oraz obliczany obszar, do którego trafi± wczytywane dane. U¿ywaj±c
tych warto¶ci jako argumentów, dla ka¿dego pliku wywo³ywane jest nastêpne
makro: SaveToRange, zadaniem którego jest wczytanie danych do arkusza
(u¿y³em tutaj, nieznacznie zmodyfikowanego, poprzednio rozpatrywanego makra)
Oczywi¶cie musisz odpowiednio dostosowaæ nazwy skoroszytu i arkusza
docelowego, w procedurze ImportFromFile.

Pozdrawiam
Tajan
--
Tadeusz Jankowski (MS Excel MVP)
Michal
2006-03-15 23:19:21 UTC
Permalink
Post by Marcin R.
Witam ponownie!
Mam pro¶bê (w sumie to do Mistrza Tajana) - a jak zmodyfikowaæ podany
przez
Post by Marcin R.
Ciebie poprawiony kod (z ksi±¿ki) aby pobraæ dane ze
wskazanego pliku .csv lub .txt - tylko od wiersza 1 do 24
z kolumn: od 3 do 6 (czyli dane za 2,3,4,5 ¶rednikiem)
linia = 1
Do Until EOF(1) Or linia = 25
txt = ""
nrPola = 0
Line Input #1, Data
For i = 1 To Len(Data)
Char = Mid(Data, i, 1)
If Char <> Chr(34) And Char <> ";" Then
txt = txt & Char
End If
If Char = ";" Or i = Len(Data) Then
nrPola = nrPola + 1
If nrPola = 3 Then
ImpRng.Offset(r, c) = Val(txt)
Exit For
End If
txt = ""
End If
Next i
c = 0
r = r + 1
linia = linia + 1
Loop
Close #1
wiesz, ty chyba sobie strasznie komplikujesz...
looknij sobie na funkcje split - zamiast calego for'a masz split + kilka
przypisan:
arrdata = split(data,";");
twojarkusz.cells(linia,"A").value=arrdata(2);
twojarkusz.cells(linia,"B").value=arrdata(3);
twojarkusz.cells(linia,"C").value=arrdata(4);
twojarkusz.cells(linia,"D").value=arrdata(5);

Wyglada prosciej, nie?
Pozdrawiam
Michal
Tajan
2006-03-16 19:35:18 UTC
Permalink
Witam!

Michal wrote:
(...)
Post by Michal
wiesz, ty chyba sobie strasznie komplikujesz...
looknij sobie na funkcje split - zamiast calego for'a masz split +
arrdata = split(data,";");
twojarkusz.cells(linia,"A").value=arrdata(2);
twojarkusz.cells(linia,"B").value=arrdata(3);
twojarkusz.cells(linia,"C").value=arrdata(4);
twojarkusz.cells(linia,"D").value=arrdata(5);
Wyglada prosciej, nie?
Oczywi¶cie, u¿ycie Split upraszcza sprawê, ale ta funkcja zosta³a
wprowadzona od wersji 2000, tymczasem Marcin chce makro wykorzystywaæ w
równie¿ w Excel 97.
Niebagateln± spraw± jest w±tek edukacyjny. Próba dostosowania ksi±¿kowego
makra do w³asnych potrzeb (nawet przez kogo¶ innego), mo¿e okazaæ sie bardzo
pouczaj±ca :-)

Tajan
--
Tadeusz Jankowski (MS Excel MVP)
Loading...