- 締切済み
EXCEL(2003)VBAで配列貼り付け
EXCEL2003を使用してます VBAでCSVファイルを読み込み セルに書き込む動きを作成しました 当初、FOR~NEXTでまわしてセルに一つ一つ書き込んで ましたが、速度向上の為 配列に格納して貼り付けをしています 例: Dim aryStrings() As String ReDim aryStrings(16) 'デリミタ[,]でデータ分割 aryStrings = Split(rec, ",") .Range(Cells(1, 3), Cells(1, 18)) = aryStrings() EXCEL上では数値として扱いたいのですが CSV読み込み時に文字列として扱うため配列は String型になっております ※セルの書式設定は数値型を設定済 配列貼り付け後確認するともちろんですが文字列として張り付いてます (該当セルで編集+ENTERでEXCELが数値に変換してくれますが) 下記の3つの方法で可能な事はありますか? (1)CSV読み込み時に数値に変換して配列に格納 (2)配列を一気に数値型に変換 (3)文字列配列を数値型に変換しながらEXCELに一気に 配列貼り付け ご存知の方、いらっしゃいましたらアドバイスお願い致します
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- end-u
- ベストアンサー率79% (496/625)
一例ですが、Clipboard経由で書き出す方法もありかも。(カンマ区切りの状態にもよりますが) 'Microsoft Forms 2.0 Object Libraryを参照設定 Dim n As Long Dim buf n = FreeFile Open "D:\test.csv" For Input As #n buf = StrConv(InputB(LOF(n), #n), vbUnicode) Close #n With New DataObject .SetText Replace$(buf, ",", vbTab) .PutInClipboard End With ActiveSheet.Paste Range("A1") #データ量が多い場合はReplace関数ではなく"VBScript.RegExp"のReplaceメソッドを使ったほうが良いです。
- imogasi
- ベストアンサー率27% (4737/17069)
実行速度のことを言われると判断に困るが #1と似ているが, 全セル数値文字が確実なら Sub Macro2() Range("F1")=1 Range("F1").Select Selection.Copy Range("A1:C3").Select Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlMultiply, _ SkipBlanks:=False, Transpose:=False End Sub マクロの記録で出来たもの。 形式を選択して貼り付けー乗算 範囲Range("A1:C3").Selectの範囲の一般化は色々ある。UsedRangeを使うとか。略。 ーー VALしてセルに代入する方式では、 ScreenUpdatingをFalseにしても、そんなに時間がかかりますか? 時間がかかるのは、ディスクを読むCSVファイルの入力処理時間ではないのかな。 == Sub test01() Close #1 Dim aryString As Variant Open "test01.csv" For Input As #1 i = 1 While Not EOF(1) Line Input #1, rec 'MsgBox rec aryStrings = Split(rec, ",") ActiveSheet.Range(Cells(i, 3), Cells(i, 18)) = aryStrings i = i + 1 Wend Close #1 MsgBox VarType(Range("C1")) End Sub のように質問のコードと同じことはバリアント変数でも出来る。 しかし、やってみると = Val(aryStrings) =Val(aryStrings) はできないようだ。 どちらかの段階で個別セルごとにValをかけないとダメでしょう。 ForNextのループなどを使うことになろう。 == 実際に処理時間がどれが短いかやってみないとわからないだろう。 我々レベルでコードを見て計算出来る理論など持ち合わせている人は居ないだろう。2,3の方法で試行錯誤せよということ。 == ScreenUpdatingをFalseは必須。
- myRange
- ベストアンサー率71% (339/472)
ひとつの方法として、エクセルへ全て書き込んだ後 書き込まれた範囲を選択して、コピーし 同じ範囲に「形式選択して貼り付け」の「値のみ」で貼り付けてもOKだと思いますが。 簡単には下記のようにします。 ActiveSheet.UsedRange.Value = ActiveSheet.UsedRange.Value Sheets("Sheet3").UsedRange.Value = Sheets("Sheet3").UsedRange.Value