プロが教える店舗&オフィスのセキュリティ対策術

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に一気に
 配列貼り付け

ご存知の方、いらっしゃいましたらアドバイスお願い致します

A 回答 (3件)

一例ですが、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メソッドを使ったほうが良いです。
    • good
    • 0

実行速度のことを言われると判断に困るが


#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は必須。
    • good
    • 0

ひとつの方法として、エクセルへ全て書き込んだ後


書き込まれた範囲を選択して、コピーし
同じ範囲に「形式選択して貼り付け」の「値のみ」で貼り付けてもOKだと思いますが。

簡単には下記のようにします。
 
ActiveSheet.UsedRange.Value = ActiveSheet.UsedRange.Value

Sheets("Sheet3").UsedRange.Value = Sheets("Sheet3").UsedRange.Value

 
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!