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件)
- 最新から表示
- 回答順に表示
No.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メソッドを使ったほうが良いです。
No.2
- 回答日時:
実行速度のことを言われると判断に困るが
#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は必須。
No.1
- 回答日時:
ひとつの方法として、エクセルへ全て書き込んだ後
書き込まれた範囲を選択して、コピーし
同じ範囲に「形式選択して貼り付け」の「値のみ」で貼り付けてもOKだと思いますが。
簡単には下記のようにします。
ActiveSheet.UsedRange.Value = ActiveSheet.UsedRange.Value
Sheets("Sheet3").UsedRange.Value = Sheets("Sheet3").UsedRange.Value
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Visual Basic(VBA) VBA横データを縦にしたいです 2 2023/08/08 19:38
- Visual Basic(VBA) 【VBA】写真の縦横比を変えずに貼り付ける 5 2023/06/13 11:42
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Visual Basic(VBA) Excel VBA 書式変更で困ってます。 オートフィルターの日付フィルターを用いて データの絞り込 2 2022/07/26 22:16
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Excel(エクセル) csvに別のExcelの文章を差し込む 2 2023/04/01 16:06
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Excel(エクセル) csvファイルをExcel形式で読み込むには 2 2023/07/03 13:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで、絶対値の平均を算...
-
Excel オートフィルタのリスト...
-
Excelのセルの色指定をVBAから...
-
SUMPRODUCT関数を用いた最小値
-
VBA listBoxについて
-
ExcelのINDEXとMATCH関数でスピ...
-
配列がとびとびである場合の書き方
-
【VBA】ユーザーフォーム リス...
-
配列の受け渡しについて
-
【VBScript】Dictionaryの項目(...
-
読み込みで一行おきに配列に格納
-
ノーツのデータをVBScriptで取...
-
Access VBA Split利用方法
-
[エクセル]連続する指定範囲か...
-
ExcelVBAの配列変数で一括でセ...
-
エクセルでエラーを無視して一...
-
エクセルの行の削除を配列で高...
-
エクセルVBAで変数をセルに一行...
-
[VBA]改行入りのセルの値を配列...
-
C#で配列のフィールドを取得したい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelのセルの色指定をVBAから...
-
ExcelのINDEXとMATCH関数でスピ...
-
array関数で格納した配列の型を...
-
[エクセル]連続する指定範囲か...
-
表にフィルターをかけ、絞った...
-
VBA listBoxについて
-
エクセルで、絶対値の平均を算...
-
配列がとびとびである場合の書き方
-
DataSetから、DataTableを取得...
-
[VBA]改行入りのセルの値を配列...
-
VBA 配列に格納した値の平均の...
-
配列のSession格納、及び取得方...
-
【VBA】ユーザーフォーム リス...
-
エクセルでエラーを無視して一...
-
SUMPRODUCT関数を用いた最小値
-
Excel VBA 配列の分割について
-
Excelのオートフィルタで抽出し...
-
VB6.0 ファイルの一括読込み
-
Excel オートフィルタのリスト...
-
VBAで指定期間の範囲を抽出し、...
おすすめ情報