|
▼エクセルホーリー さん:
こんばんわ
>VC++ で作成したCSVファイルAをVC++でマクロを組んだエクセルBに
>読み込ませて、エクセルBに書き込み名前をつけて保存する処理を考えています。
ちょっと良く分かりませんが、
>このケースの場合VBAの中で構造体を作りカンマ区切りで読み込ませて、
>そのデータをセルに書き込むとゆうのが普通なのでしょうか?
>過去ログを見るとCSVファイルのデータを直接エクセルに書き込んでるように
>思えてしまいまして・・・
>
>どなたかアドバイスなどありましたらよろしくお願い致します。
エクセルVBAの場合、セルが利用できれば構造体・配列を作成するのは二度手間になります。
特に処理が必要なければ、
列(A〜IV)を構造体、行(1〜65536)を配列とみなして
直接エクセルに書き込むのが普通です。
(列:1byte、行:2byte)
「カンマ区切り」については過去ログを参照してください。
Split関数を使うと良いでしょう。
>プログラムの書き方についてのアドバイスもありましたらお願いします。
ザっと見ただけですが、
> For count2 = 1 To 2
>'*************************************************************************
>' ("B2:AF2") と ("B17:AF17")
>'*************************************************************************
> If count2 = 1 Then
> Range(Cells(2 + 31 * (count1 - 1), "B"), Cells(2 + 31 * (count1 - 1), "AF")).Select
> Else
> Range(Cells(17 + 31 * (count1 - 1), "B"), Cells(17 + 31 * (count1 - 1), "AF")).Select
> End If
せっかくループで回しているのにこの条件分岐はムダです。
count2を上手く利用しましょう。
あと、
> Selection.Borders(xlDiagonalDown).LineStyle = xlNone
> Selection.Borders(xlDiagonalUp).LineStyle = xlNone
> With Selection.Borders(xlEdgeLeft)
> .LineStyle = xlContinuous
> .Weight = xlThin
> .ColorIndex = xlAutomatic
> End With
> With Selection.Borders(xlEdgeTop)
> .LineStyle = xlContinuous
> .Weight = xlThin
> .ColorIndex = xlAutomatic
> End With
> With Selection.Borders(xlEdgeBottom)
> .LineStyle = xlContinuous
> .Weight = xlThin
> .ColorIndex = xlAutomatic
> End With
> With Selection.Borders(xlEdgeRight)
> .LineStyle = xlContinuous
> .Weight = xlThin
> .ColorIndex = xlAutomatic
> End With
ループ中、マクロ記録されたと思われるこれが良く使われているので
関数化した方が良いでしょう。
やりたいことはこれで済むのでは?
Sub Macro1()
Dim count1 As Integer 'カウンター
Dim count2 As Integer 'カウンター
Dim count3 As Integer 'カウンター
Dim cellpos As Long
For count1 = 1 To 3
For count2 = 1 To 2
cellpos = 15 * (count2 - 1) + 31 * (count1 - 1)
Call setcell(Range(Cells(2 + cellpos, "B"), Cells(2 + cellpos, "AF")))
Call setcell(Range(Cells(3 + cellpos, "C"), Cells(3 + cellpos, "AF")))
Call setcell(Range(Cells(4 + cellpos, "D"), Cells(4 + cellpos, "AF")))
For count3 = 5 To 16
Call setcell(Range(Cells(count3 + cellpos, "E"), Cells(5 + cellpos, "AF")))
Next count3
Call setcell(Range(Cells(3 + cellpos, "B"), Cells(16 + cellpos, "B")))
Call setcell(Range(Cells(4 + cellpos, "C"), Cells(16 + cellpos, "C")))
Call setcell(Range(Cells(5 + cellpos, "D"), Cells(16 + cellpos, "D")))
Call setcell(Range(Cells(5 + cellpos, "G"), Cells(16 + cellpos, "G")))
Call setcell(Range(Cells(5 + cellpos, "AB"), Cells(16 + cellpos, "AB")))
Next count2
Range(Cells(2 + 31 * (count1 - 1), "B"), Cells(31 + 31 * (count1 - 1), "AF")).Interior.ColorIndex = 2
Next count1
ActiveWorkbook.Save
End Sub
Function setcell(cel As Range)
With cel
.Borders(xlEdgeLeft).Weight = xlThin
.Borders(xlEdgeTop).Weight = xlThin
.Borders(xlEdgeBottom).Weight = xlThin
.Borders(xlEdgeRight).Weight = xlThin
End With
End Function
※count3は使用されていないようなので再利用しました。
><CSVのデータ>
>1,"AAA"
>2,"BBB"
>L,aaa,"あいうえお(0"シングル"/1"ツイン")",0
>L,bbb,"かきくけこ(0"指定OFF"/1"指定ON")",1
>L,ccc,"さしすせそ(0"指定OFF"/1"指定ON")",0
>2,"CCC"
>3,"DDD"
>L,ddd,"たちつてと(m/inch)(0"m"/1"inch")",1
>
>1の時 AAAは "B2" に書き込む
>2の時 BBBは "C3" に書き込む
>Lの時 aaaは "E5", "あいうえお(0"シングル"/1"ツイン")" "H5", 0 "AC5" に書き込む
>Lの時 bbbは "E6", "かきくけこ(0"指定OFF"/1"指定ON")" "H6", 1 "AC6" に書き込む
>Lの時 cccは "E7", "さしすせそ(0"指定OFF"/1"指定ON")", "H7", 0 "AC7" に書き込む
>2の時,CCCは "C18" に書き込む
>3の時,DDDは "D19" に書き込む
>Lの時,dddは "E20" "たちつてと(m/inch)(0"m"/1"inch")" "H20", 1 AC20に書き込む
>
>データがなくなるまで繰り返す
すいません、ちょっと条件判定が良く分かりません。
|
|