2

いくつかの CSV を Excel スプレッドシートにインポートする必要があります。CSV の行/列番号はそれぞれ異なります。問題は、一部の値が のような長い数字の文字列であることです
341235387313289173719237217391

Excel はこれらの値を (2 倍の) 数値として扱い、データが失われます。

それを解決する私の方法は、次の関数を使用して仕事をすることです:

Sub readCSV(f As TextStream, sh As Worksheet)
    i = 1
    Do
        l = Trim(f.ReadLine)
        If l = "" Then Exit Sub 'skip the last empty line(s)
        l = Mid(l, 2, Len(l) - 1)
        ss = Split(l, """,""")
        For j = LBound(ss) To UBound(ss) 'j starts from 0
            Dim a As Range
            With sh.Cells(i, j + 1)
                .NumberFormat = "@" 'Force to text format
                .Value = ss(j)
            End With
            DoEvents 'Avoid blocking the GUI
        Next j
        i = i + 1
    Loop Until f.AtEndOfStream
End Sub

問題はパフォーマンスです。[データ] -> [テキストから] を介してデータをインポートしたり、CSV を直接開いたりするよりもはるかに時間がかかります。

より効率的に行う方法はありますか?

4

3 に答える 3

2

各行を1回のショットでフォーマット/書き込みできます。

Sub readCSV(f As TextStream, sh As Worksheet)

     Dim i As Long
     Dim ss, l
     i = 1

    With Application
        .ScreenUpdating = False
        .Calculation = xlCalculationManual
    End With

    Do
        l = Trim(f.ReadLine)
        If l = "" Then Exit Sub 'skip the last empty line(s)
        l = Mid(l, 2, Len(l) - 1)
        ss = Split(l, """,""")

        With sh.Cells(i, 1).Resize(1, (UBound(ss) - LBound(ss)) + 1)
            If (i-1) Mod 100 = 0 Then .Resize(100).NumberFormat = "@"
            .Value = ss
        End With

        i = i + 1
    Loop Until f.AtEndOfStream

    With Application
        .ScreenUpdating = True
        .Calculation = xlCalculationAutomatic
    End With


End Sub

編集:テスト後、実際のパフォーマンスキラーは、セル形式をテキスト改訂コードに設定して、これを各行ではなく100行のブロックに設定することです。

于 2012-08-09T00:22:41.210 に答える
1

Excel で (セルごとまたは行ごとに) 作業するのではなく、 を使用しRegexpて、16 文字を超える英数字のすべての文字列を前の .'

次に、Excel で新しい csv 全体をインポートまたは開くだけです。

StrIn例として、このパスを使用して CSV ファイルで実行されるサンプル コードは、次のとおりです。"c:\Temp\test.csv"

Sub Main()
Dim objFSO As Object
Dim objRegex As Object
Dim objTF As Object
Dim objTF2 As Object
Dim tf As Object
Dim strIn As String
Dim strOut As String
Dim strFile As String

strIn = "c:\Temp\test.csv"
strOut = "c:\Temp\test2.csv"

Set objFSO = CreateObject("scripting.filesystemobject")
Set objTF = objFSO.getfile(strIn)
Set objRegex = CreateObject("vbscript.regexp")
Set tf = objTF.OpenAsTextStream(ForReading)
strFile = tf.ReadAll

With objRegex
.Pattern = "(\w{16,})"
.Global = True
strFile = .Replace(strFile, "'" & "$1")
End With

Set objTF2 = objFSO.OpenTextFile(strOut, ForWriting, True)
objTF2.Write strFile
objTF2.Close
tf.Close
End Sub
于 2012-08-09T01:01:09.473 に答える
0

試す.Value = "'" & ss(j)

'値を強制的にExcelにテキスト文字列として表示します。

また、ss配列を文字列で宣言して、分割後に数値がlongとして格納されないようにしてください。何かのようなもの:

Dim ss() as String = Split(l, """,""")
于 2012-08-09T00:11:19.340 に答える