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

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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q「どんなときも。」のバラード

以前にとある場所で流れていたのですが、槙原敬之の「どんなときも。」にバラードが存在したのです。
原曲はマーチ調の曲ですが、このバージョンは特に癒されました。
このバラードバージョンの「どんなときも。」が収録されているアルバムがあったら教えて下さい。

Aベストアンサー

 3rdシングルの「どんなときも。」のC/Wとして収録されていますが、アルバムには入っていませんね。インストゥルメンタル・ヴァージョンとして一部なら入っていますが。とてもいい曲調なので、入っていても良さそうですけどねぇ。
 

参考URL:http://st.sakura.ne.jp/~masawo/nm/review_single.html

Q「Cell( n , "A" )よりも10上のセルに1 or 2 が記入されていなければ、Cell( n , "A" )に1を記入する」

「Cell( n , "A" )よりも10上のセルに1 or 2 が記入されていなければ、Cell( n , "A" )に1を記入する」
というコードを作ってみましたが、メチャクチャな動きになってしまいます(動きが読めません)。
どこが間違っているのか教えてください。
また、もし、よりわかりやすいコードがありましたら教えていただけると嬉しいです。
よろしくお願いいたします。

Sub Cell( n , "A" )に1を記入する()

Dim n As Long
Dim m As Long
Dim s As Long

'現在のセル( n , "A" )より14行上に数値がないことを確認するために
'14行上のセルを全て足し算しています。
For m = n - 14 To n - 1
s = s + Worksheets("Sheet1").Cells(m, "A").Value
Next

'足し算結果がゼロならば何も記入していないと判断し、
'数字の「1」を記入します。
If s >= 1 Then
Worksheets("Sheet1").Cells(n - 1, "A").Value = 0
ElseIf s = 0 Then
Worksheets("Sheet1").Cells(n - 1, "A").Value = 1
End If
End Sub

「Cell( n , "A" )よりも10上のセルに1 or 2 が記入されていなければ、Cell( n , "A" )に1を記入する」
というコードを作ってみましたが、メチャクチャな動きになってしまいます(動きが読めません)。
どこが間違っているのか教えてください。
また、もし、よりわかりやすいコードがありましたら教えていただけると嬉しいです。
よろしくお願いいたします。

Sub Cell( n , "A" )に1を記入する()

Dim n As Long
Dim m As Long
Dim s As Long

'現...続きを読む

Aベストアンサー

はいはい了解。

今着目しているセルが (n,1)であるとする。

条件: 今いるところから上に14行サーチして、一度でも1か2の値が見つかったら
     回答を0とする。14行すべてに1・2の値がひとつも含まれていなければ1とする。



Ans = 1

for i = 1 to 14

x = cells ( n - i , 1 ).value

if x = 1 or x = 2
then
Ans = 0
endif
next i


cells ( n , 1 ) = Ans


デフォルトの回答値=1としておき、一回でも条件にヒットしたら回答値=0にする。
ヒットしたらfor~nextを強制的に閉じてもいいけど、面倒なのでそのまま14回検索する。

Q槇原敬之「どんなときも。」について

不思議でいつもカラオケに行くと気になることがあります。
「どんなときも。」にはかならずどんなときものあとに。があります。
これって何の。なんでしょうね?
いつも気になってしょうがないのでおしえてください。
お願いします。

Aベストアンサー

この「。」は槇原さん自身が意図的に付けたものです。
「どんなときも」の言葉の後に、何の言葉も続かないように、言い切った言葉にしたかったから、曲のタイトルは「。」を付けたとご本人が言っていたと思います。

うまく説明出来なくてごめんなさい。
確かそうだったと思います。

余談ですがこれは映画「就職戦線異常なし」の主題歌で、「人生の応援歌」みたいのを作って下さいと依頼されて作った曲だそうです。ちなみにコンサートではこの曲、すごい盛り上がります!

QExcelVBAでCells(Row,Column)を使用してセルの範囲を指定する方法

Excelのプログラムで例えば、セル「A」から「F」までの範囲の場合、

Range("A:F")

セル「A1」から「F3」の場合、

Range("A1:F3")

となりますが、これをCells(Row,Column)を使用した方法はあるでしょうか?
回答よろしくお願いします。

Aベストアンサー

>Range("A1:F3")

これを、Cells(Row,Column)のみで表すことはできません。
同じRangeプロパティを使って

Range( Cells(1,1), Cells(3,6) )

Range( Cells(1,"A"), Cells(3,"F") )

Row1 = 1 :Clm1 = 1
Row2 = 3 :Clm2 = 6
Range( Cells(Row1,Clm1), Cells(Row2,Clm2) )

見れば分かると思いますが、
Cells(Row,Column)では、ひとつのセルしか指定できない、
即ちRangeプロパティみたいに範囲指定は出来ないということです。


ところで、
ComboBoxの▲云々の質問が削除されてませんか?
夜にでも回答しようかと思っていたのですが。(^^;;;
自己解決したのでしょうね。たぶん。
 

Q「どんなときも。」のLiveバージョン

槇原敬之さんの「どんなときも。」のLiveバージョンの収録されているCDタイトルを教えてください。

Aベストアンサー

live版三枚共に「どんなときも。」は入っているはず。

THE CONCERT CONCERT TOUR 2002~Home Sweet Home~
SYMPHONY ORCHESTRA“cELEBRATION”
SYMPHONY ORCHESTRA“cELEBRATION 2005”~Heart Beat~

QGeneric.Listに1次元配列の配列を格納したい(VB2005)

VB2005の質問です。

変数ghogeにString型の1次元配列の配列を格納したいと考えています。
-----------------------------------------------
'a)
Dim hoge()() As string = _
      {New string() {"a1", "b1", "c1"}, _
      New string() {"a2", "b2", "c2"}, _
      New string() {"a3", "b3", "c3"}}

Dim ghoge As New Generic.List(of )   'b)
MessageBox.Show(ghoge(1)(1))      ' "b2"と表示したい
-----------------------------------------------
質問内容は、(a)を(b)の初期値として設定するにはどのようにすればよいか、ということです。


(b)がGeneric.ListでなくArrayListの場合だと、
  Dim ghoge As New ArrayList(hoge)
でhoge配列を格納できますが、Generic.Listの場合はどのような構文にすればよいでしょうか。

現在は、下記のような処理でghogeに値を格納しています。
------------------------------------------------------------
Dim ghoge As New Generic.List(Of Generic.List(Of String))
Dim aryhoge1 As New Generic.List(Of String)(New String() {"a1", "b1", "c1"})
Dim aryhoge2 As New Generic.List(Of String)(New String() {"a2", "b2", "c2"})

gary_hoge.Add(ary_hoge1)
gary_hoge.Add(ary_hoge2)
MessageBox.Show(gary_hoge(1)(1))    ' "b2"と表示される
------------------------------------------------------------

どうぞよろしくお願い致します。

VB2005の質問です。

変数ghogeにString型の1次元配列の配列を格納したいと考えています。
-----------------------------------------------
'a)
Dim hoge()() As string = _
      {New string() {"a1", "b1", "c1"}, _
      New string() {"a2", "b2", "c2"}, _
      New string() {"a3", "b3", "c3"}}

Dim ghoge As New Generic.List(of )   'b)
MessageBox.Show(ghoge(1)(1))      ' "b2"と表示したい
-----------------------------------------------
質問内容...続きを読む

Aベストアンサー

こんな感じでもできます。
List(Of String) のAddRangeを使えばいいと思います。
また、宣言は、Generic.List(Of String()) になります。

# Of Stringの後に() をつけます

Dim hoge()() As String = _
{New String() {"a1", "b1", "c1"}, _
New String() {"a2", "b2", "c2"}, _
New String() {"a3", "b3", "c3"}}

'b)
Dim ghoge As New Generic.List(Of String())
ghoge.AddRange(hoge)

MessageBox.Show(ghoge(1)(1))  'b2と表示される

ご参考までに

Q槇原敬之『どんなときも。』のカヴァー

先日、有線で槇原敬之の『どんなときも。』がカバーバージョンで流れていました。

男性ボーカルでパンクバンドっぽい感じだったと思います。
誰が歌っているのかわかる方教えてください!

Aベストアンサー

「HEAVY HITTER All Stars」ですね。

「どんなときも。」ここで試聴できます。

http://www.sonymusic.co.jp/Music/Arch/SR/HeavyHitterAllStars/

Qエクセル cellから配列への取り込み

お世話になります。

環境は、WindowsXpSp3、VB6sp6、MS-excel2003です。

処理内容は「エクセルのセル情報を元に条件判定を行い、結果を出力する」ものです。

現状、cellsオブジェクトの値と色からAND判定を行っています。
cells(r,c).value
cells(r,c).Interior.ColorIndex

色々と調べたところ、配列にすると「劇的に速くなる」ということがわかりました。
想像してみて「確かに」と思い、試してみたところ、range().valueとvariant配列で試したところ約30倍の速度になりました。
(この時はvalueのみで試しました。)

「色情報もインデックスだから・・・」と思い、合わせて試してみました。
しかし、セルの色情報となると、これを配列にすることができません。
エクセルの仕様上どうにもならないものなのでしょうか。
もし「裏技」的なものがあればお願いします。

欲しい情報はcellのvalueとColorIndexが対応した配列です。

ソースは関連する部分だけ書きました。
--------------------------------------
Dim varValueRange As Variant
Dim varColorRange As Variant

varValueRange = Range(Cells(1, 1), Cells(10000,1)).Value
varColorRange = Range(Cells(1,1),Cells(10000,1)).Interior.ColorIndex
--------------------------------------
varValueRangeの方は問題なく配列になります。
varColorRangeがNullになってしまい、配列になりません。

お世話になります。

環境は、WindowsXpSp3、VB6sp6、MS-excel2003です。

処理内容は「エクセルのセル情報を元に条件判定を行い、結果を出力する」ものです。

現状、cellsオブジェクトの値と色からAND判定を行っています。
cells(r,c).value
cells(r,c).Interior.ColorIndex

色々と調べたところ、配列にすると「劇的に速くなる」ということがわかりました。
想像してみて「確かに」と思い、試してみたところ、range().valueとvariant配列で試したところ約30倍の速度になりました。
(この時はval...続きを読む

Aベストアンサー

Interiorの配列は取れない、と決め打ちして・・・(細かく調べていません)

取得する値(A1:A10000)の隣(B1:B10000)に、背景色のインデックス値を並べておく、というのはどうでしょうか?
これなら、背景色のインデックスもA列同様に値の配列として取得することができます。B列は非表示にでもしておけばよいかと。B列がダメならもっと離れたところや別シートでもかまいません。

背景色のインデックスを取得する関数があるかどうかは探していません。私は標準モジュールを追加して、GetBackColorという関数を自作して試してみました。

[Module1]
Function GetBackColor(target As Range) As Long
GetBackColor = target.Interior.ColorIndex
End Function

B1に「=GetBackColor(A1)」と書いてB10000までフィルすればA列の背景インデックスのリストが出来上がります。

Q槇原敬之さんの「どんなときも。」のversion4って?

今年1月1日に発売された槇原敬之さんのアルバムCD「Best LIFE」に収録されている「どんなときも。Renewed(version4)」がありますが、この「version4」というのは、アレンジ第4作目という意味でしょうか。それとも違う意味でしょうか。アレンジ第4作目である場合、アレンジ第1作~第3作目であるversion1~3の収録されているCDタイトルをそれぞれ教えてください。

Aベストアンサー

「どんなときも。Renewed(version4)」はまだ聴いたことがありませんが、Liveバージョンを別にして3バージョン(+カラオケ)が存在します。
まず、シングル『どんなときも』には「どんなときも。」とオーケストラ編成の「どんなときも。 [ballad version]」が収録。
それと、10周年記念アルバム『10.Y.O. ~THE ANNIVERSARY COLLECTION~』に収録されている「どんなときも。(10.Y.O.Version)」

なお、シングルに収録されていた「どんなときも。 [ballad version]」のカラオケ部分のショートバージョンがアルバム『君は誰と幸せなあくびをしますか。』に収録されています。

QVBの配列 IsNull, IsNuthing, ...? 用途がわかりません。

以下の場合、(1)で範囲エラーとなります。
redim a(0)とすると、a配列に1個データがあるということで、for文が実行されますが。
Redimしないまま(データが無い意味としたいので)で、このFor文をパスするには、どのように記述すればよいのでしょうか?

dim a() as string

'----->(2)
for i=LBound(a) to UBound(a) '---->(1)
msgbox(a(i))
next i

Aベストアンサー

string限定ですが、
a=split("","A")
とか、ありえないsplitを行うとか・・・
ubound(a)=-1になります。

ちなみに、SafeArrayAllocDescriptor は、excelやaccessのvbaでもOKです。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報