Megoldva VBA makró

Sziasztok!

Van egy VBA kódom ami nem felhasználó biztos még. Egy excelből szeretném futatni, miszerint kitallóz egy fájlt majd amit megnyitott abból az átmásolja a tartalmat magába az xls be ahonnan indult.

Ez a tallozás része.

Sub megnyitás()
Dim fileName
fileName = Application.GetOpenFilename("Comma Separated Values (*.csv),*.csv")
If fileName <> "False" Then
Workbooks.Open fileName, Format:=2
End If
End Sub

Azt szeretném elérni, hogy amit kitallóz fájlt, annak az útja egy változóba legyen tárolva, amit később fel tudjak használni ebbe a tartalom kiolvasó programba a filpath helyére.
Nem tudom megoldani, hogy amit kitallóz fájlt a felhasználó annak az elérési útvonala elmentődjön és azt meg tudjam nyitni makróból.

Tartalom kiolvasó progi.

Sub Open_csv()
ImportCSVFile ("D:\valahol\x.csv") ' A csv fájl elérési útvonala
End Sub
Sub ImportCSVFile(filepath As String)
Dim line As String
Dim arrayOfElements
Dim linenumber As Integer
Dim elementnumber As Integer
Dim element As Variant
linenumber = 0
elementnumber = 0
Open filepath For Input As #1
Do While Not EOF(1)
linenumber = linenumber + 1
Line Input #1, line
arrayOfElements = Split(line, ";") 'A delimiter itt a pontosvessző
elementnumber = 0
For Each element In arrayOfElements
elementnumber = elementnumber + 1
Cells(linenumber, elementnumber).Value = element
Next
Loop
Close #1
End Sub
Akinek van ötlete kérem írjon.

köszönöm, üdv.

Hozzászólások

Public $filename As String

..

$filename = Application.GetOpenFilename

Szia
Köszi ezt értem, de az nem világos, hogy utána hogy tudom az eltárolt elérési utas fájlt megnyitni.
Rövden, felhasználó tallóz, fájl megnyílik és ennek a fájlnak a tartalma átmásolódik a az xls be.
Nem tudom megnyitni az elmentett eérési utat.

Üdv

Szia

Ez lenne a vége?
Sub megnyitás()
Dim fileName
fileName = Application.GetOpenFilename("Comma Separated Values (*.csv),*.csv")
If fileName <> "False" Then
Workbooks.Open fileName, Format:=2
End If
End Sub
Sub Open_csv()
ImportCSVFile (fileName) ' A csv fájl elérési útvonala
End Sub
Sub ImportCSVFile(filepath As String)
Dim line As String
Dim arrayOfElements
Dim linenumber As Integer
Dim elementnumber As Integer
Dim element As Variant
linenumber = 0
elementnumber = 0
Open filepath For Input As #1
Do While Not EOF(1)
linenumber = linenumber + 1
Line Input #1, line
arrayOfElements = Split(line, ";") 'A delimiter itt a pontosvessző
elementnumber = 0
For Each element In arrayOfElements
elementnumber = elementnumber + 1
Cells(linenumber, elementnumber).Value = element
Next
Loop
Close #1
End Sub

Ez sajna nem fut le, és egy makróba kellene raknom az egészet, nem háromba

Van rá ötleted?

Üdv

Lehet, a problémádból semmit nem értek...

Hátulról kezdve: Ha egy makrót/eljárást akarsz, mi akadályoz meg benne, hogy annyi legyen?

Ha az

Open_csv

-t a

megnyitás

után/végén akarod hívni, akkor miért nem teszed a

megnyitás

végére az

ImportCSVFile (fileName)

-t?

Az

Open_csv

-ben az

ImportCSVFile (fileName)

nem fog működni, mert a

fileName

változót a

megnyitás

eljáráson belül deklaráltad (más is ezt akarta kifejezni), vagyis, ha jól tudom, ha nincs külön megadva, hogy ne legyen automatikus változó-létrehozás (

Option Explicit

), akkor létrejön neked az

Open_csv

-n _belül_ egy üres

fileName

, amikor az

ImportCSVFile

megpróbálja használni. Az

Open_csv

nem látja a

megnyitás

-ban

Dim

utasítással létrehozott változókat. Ha jól értem, arra van szükség, amit az előző bekezdésben írtam.

Workbooks.Open fileName, Format:=2

– Ez elvileg megnyitja a kiválasztott CSV-t, nem? De minek, ha később manuálisan olvasod a CSV-t? Vagy minek olvasod be később külön? Azzal nem csak felülírod az Excel által beolvasott CSV celláit? Neked szerintem nem ez kell, hanem egy új üres munkalap, vagy pedig a jelenleg használt munkalap.

És hol van az eredeti XLS-be másoló rész? És miért nem egyből oda olvasod a CSV-t?

És miért nem a

Workbooks.OpenText

-et használod a soronkénti olvasgatás és cellába írás helyett? Ez létrehoz egy új munkalapot a CSV tartalmával. De szerintem olyan gyári megoldás is van, ami egyből a kívánt munkalapra (az XLS ugye) importálja az adatokat.

Sub megnyitás()
  Dim fileName

  fileName = Application.GetOpenFilename("Comma Separated Values (*.csv),*.csv")

  If fileName <> "False" Then
    Workbooks.Open fileName, Format:=2
  End If
' Az előző három sor helyett kellene:
' If fileName = "False" Then Exit Sub
'
' Aztán, ha új munkalapot akarsz, akkor azt kellene létrehozni.
' Vagy, ha az aktuális lapot akarod használni, akkor ki kell deríteni
'   a kurzor pozícióját, az utolsó használt sort, vagy bármit, ami után
'   a CSV adatai kerülnek, és ezzel kell eltolni később a *number
'   értékeit (akkor az Integer típus már nem lesz jó, gondolom, Long
'   kell majd).



  Dim line As String
  Dim arrayOfElements
  Dim linenumber As Integer
  Dim elementnumber As Integer
  Dim element As Variant

'  Ezek ide a jelenlegi állapotban nem kellenek, mert a létrehozás után 0-k.
'  linenumber = 0
'  elementnumber = 0
'
'  Ha az XLS munkalapra olvasod a CSV-t, akkor kell:
'  linenumber = sor száma
'  A CSV első sora ebbe a sorba kerüljön az XLS-ben.
'
'  elementnumber = oszlop száma
'  Csak akkor kell megadni, ha nem az első oszlopba akarod
'    a CSV-ből az első oszlopot. Természetesen akkor a későbbi
'    elementnumber = 0-t is erre kell cserélni.

'  Open filepath For Input As #1
'  Mi a fene az a filepath? fileName, nem?
  Open fileName For Input As #1

  Do While Not EOF(1)
    linenumber = linenumber + 1
    Line Input #1, line

    arrayOfElements = Split(line, ";") 'A delimiter itt a pontosvessző

    elementnumber = 0
'  elementnumber = csak akkor kell megadni, ha nem az első oszlopba akarod
'    a CSV-ből az adatokat
    For Each element In arrayOfElements
      elementnumber = elementnumber + 1
      Cells(linenumber, elementnumber).Value = element
    Next
  Loop

  Close #1

End Sub

:)