0

一度に 1 つずつではなく、セット、グループ、または複数の個々のファイルで Excel VBA を介して CSV ファイルをインポートするにはどうすればよいですか?

4

6 に答える 6

2

ほとんどのバージョンの Excel で .csv ファイルを問題なく開くことができることに少し戸惑っています。

strPath = "C:\Docs\"
strFile = Dir(strPath & "*.csv")

Do While strFile <> ""
    Workbooks.Open Filename:=strPath & strFile
    ActiveWorkbook.SaveAs Filename:=strPath & Mid(strFile, 1, InStr(strFile, ".") - 1) _
        & "Conv.xls", FileFormat:=xlNormal

    strFile = Dir
Loop
于 2008-10-23T21:41:42.203 に答える
1

これにより、ファイルが1次元配列にすばやく取得されます

Open "myfile.csv" For Input As 1
Dim Txt As String
Txt = Input(LOF(1), 1)
Close #1
Dim V As Variant
V = Split(Txt, ",")

次に、V にはすべての項目が 1 つの列に含まれます。NB の最初の項目は V(0) です。

于 2008-10-23T08:36:26.920 に答える
1

これは、Excel で csv ファイルを開くときに発生する再計算を回避する別の方法です。

ワークブックに空白のシートを追加し、次のコードをシートのオブジェクトに追加します

Function getCsv(fn)
    Dim d, scrup As Boolean
    scrup = Application.ScreenUpdating
    Application.ScreenUpdating = False
    With Me.QueryTables.Add( _
            Connection:="TEXT;" & fn, _
            Destination:=Me.Range("A1") _
        )
        .Name = "data"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshStyle = xlOverwriteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = False
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 850
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileCommaDelimiter = True
        .Refresh BackgroundQuery:=False
    End With

    d = Me.Names(1).RefersToRange.Value

    Me.Names(1).Delete
    Me.UsedRange.Rows.Delete

    Application.ScreenUpdating = scrup
    getCsv = d
End Function

シートを非表示にして、誤って使用しないようにすることもできます。次に、このように使用できます

dim d
d = getCsv("C:\temp\some.csv")

少し気になる点は、関数を使用するたびに Name がインクリメントされることです (例: data_1、data_2、...)。これらの名前がどこかに保存されると、安定性の問題が発生する可能性があります。

于 2011-06-17T11:15:18.020 に答える
0

csvファイルのバッチを解析してExcelファイルに保存する簡単なコンソールアプリケーションを作成できます。
最も簡単な解決策ではありませんが、それはオプションである可能性があります。

于 2008-10-23T06:26:30.630 に答える
0

私が当初持っていたアイデアは次のとおりでした。このデータを考えると

Dog Names,Dog Ages,Collar Size
Woof,3,4
Bowser,2,5
Ruffy,4.5,6
Angel,1,7
Demon,7,8
Dog,9,2

と呼ばれる 3 つのグローバル配列を作成しDog_Names、それらに CSV ファイルのデータを入力します。Dog_AgesCollar_Size

この VBScript のビットがその仕事を行い、結果を表示します。サブルーチンの からコメント マークを削除して、wscript.echoすべてが発生することを確認します。x

Option Explicit

Dim FSO
Set FSO = CreateObject( "Scripting.FileSystemObject" )

Dim oStream
Dim sData
Dim aData

Set oStream = fso.OpenTextFile("data.csv")
sData       = oStream.ReadAll
aData       = Split( sData, vbNewLine )

Dim sLine
sLine = aData(0)

Dim aContent
aContent = Split( sLine, "," )

Dim aNames()
Dim nArrayCount
nArrayCount = UBound( aContent )
ReDim aNames( nArrayCount )

Dim i

For i = 0 To nArrayCount
  aNames(i) = Replace( aContent( i ), " ", "_" )
  x "dim " & aNames(i) & "()"
Next

For j = 0 To nArrayCount
  x "redim " & aNames(j) & "( " & UBound( aData ) - 1 & " )"
Next

Dim j
Dim actual
actual = 0

For i = 1 To UBound( aData )
  sLine = aData( i )
  If sLine <> vbnullstring Then
    actual = actual + 1
    aContent = Split( sLine, "," )
    For j = 0 To nArrayCount
      x aNames(j) & "(" & i - 1 & ")=" & Chr(34) & aContent(j) & Chr(34)
    Next
  End If
Next

For j = 0 To nArrayCount
  x "redim preserve " & aNames(j) & "(" & actual - 1 & ")"
Next

For i = 0 To actual - 1
  For j = 0 To nArrayCount
    x "wscript.echo aNames(" & j & ")," & aNames(j) & "(" & i & ")"
  Next
Next

Sub x( s )
  'wscript.echo s
  executeglobal s
End Sub

結果はこんな感じ

>cscript "C:\Documents and Settings\Bruce\Desktop\datathing.vbs"
Dog_Names Woof
Dog_Ages 3
Collar_Size 4
Dog_Names Bowser
Dog_Ages 2
Collar_Size 5
Dog_Names Ruffy
Dog_Ages 4.5
Collar_Size 6
Dog_Names Angel
Dog_Ages 1
Collar_Size 7
Dog_Names Demon
Dog_Ages 7
Collar_Size 8
Dog_Names Dog
Dog_Ages 9
Collar_Size 2
>Exit code: 0    Time: 0.338
于 2008-10-29T02:59:06.437 に答える
0

workbooks.opentext も使用できます

于 2008-10-25T00:38:12.957 に答える