あるメーカーのWeb発注システムに放り込むデータを作るために2種類のテキストファイルを読まなければなりません、うちのオフコンはそれらをまとめて吐き出すことができないからですが・・。
それで取りあえず急ぎ作ったのが以下のコードで見ての通りの力ずくでコーディングしたもの、マクロ記録に少し手を加えただけの安直仕上げ「Rough And Ready(粗製乱造)」です。
Sub Sample1()
Dim ブック, 都度データ, コピー先, 在庫データ As String
ブック = ActiveWorkbook.Name
With Workbooks
.Open Filename:="C:idectempIDECHDATA.csv"
都度データ = ActiveWorkbook.Name
コピー先 = Range("A1").End(xlDown).Address
.Open Filename:="C:idectempIDECHDATAZ.csv"
在庫データ = ActiveWorkbook.Name
End With
ActiveSheet.UsedRange.Copy
Workbooks(都度データ).Activate
Range(コピー先).Select
ActiveSheet.Paste
Range("H:K").Delete
Windows(在庫データ).Close
ActiveSheet.UsedRange.Copy
Windows(ブック).Activate
Range("A1").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Windows(都度データ).Close SaveChanges:=False
End Sub
ほんとに美しくないですね、スマートに見えないのでそこで少しは増しにと書いたやつが下のやつなんですけどループ処理をどうしても2度書きする羽目になるのです、何とか1度ですまないかといろいろやったのですがなかなかできなかったのです。
Sub Sample2()
Dim tmPLine As String
Dim tmp As Variant
Dim nHFile As Long
ブック = ActiveWorkbook.Name
nHFile = FreeFile
Open "C:idectempIDECHDATA.csv" For Input As #nHFile
On Error GoTo Fin
dTa = 1
Do While Not EOF(nHFile)
Line Input #nHFile, tmPLine
tmPLine = Replace(tmPLine, """", "")
tmp = Split(tmPLine, ",")
Range(Cells(dTa, 1), Cells(dTa, UBound(tmp) + 1)) = tmp
dTa = dTa + 1
Loop
Close #nHFile
Open "C:idectempIDECHDATAZ.csv" For Input As #nHFile
On Error GoTo Fin
Do While Not EOF(nHFile)
Line Input #nHFile, tmPLine
tmPLine = Replace(tmPLine, """", "")
tmp = Split(tmPLine, ",")
Range(Cells(dTa, 1), Cells(dTa, UBound(tmp) + 1)) = tmp
dTa = dTa + 1
Loop
Fin:
Close #nHFile
End Sub
配列を変数に入れてそれを順に取り出せばいいことは分かっているのですがその方法がわからないのです、たとえば
f_name = Application.GetOpenFilename _
( _
FileFilter:="CSVファイル(*.csv),*.csv" _
, FilterIndex:=1 _
, Title:="複数ファイルオープン" _
, MultiSelect:=True _
)
のようにダイアログボックスから選択すれば簡単に入れられますが読み込むファイル名は常に決まっているのでダイアログボックスは使いたくありません。
でも一生懸命考えたらどうにかできました、それがこれ。
Sub Sample3()
Dim f_name(1), tmPLine As String
Dim tmp As Variant
Dim nHFile As Long
f_name(0) = "C:idectempIDECHDATA.csv"
f_name(1) = "C:idectempIDECHDATAZ.csv"
nHFile = FreeFile
dTa = 1
' For k = 1 To UBound(f_name) 変数の要素数が不明の場合
For k = 0 To 1
Open f_name(k) For Input As #nHFile
On Error GoTo Fin
Do While Not EOF(nHFile)
Line Input #nHFile, tmPLine
tmPLine = Replace(tmPLine, """", "")
tmp = Split(tmPLine, ",")
Range(Cells(dTa, 1), Cells(dTa, UBound(tmp) + 1)) = tmp
dTa = dTa + 1
Loop
Close #nHFile
Next
Fin:
Close #nHFile
End Sub
これで見た目がすっきりしたし分かりやすくなりました。
でも、考えてみると早さ的には力技でコピペを繰り返したSample1の方が早いんじゃないかなと思うのです、Sample2とSample3は一行一行読み込んでいるから。
なので実は今、まだSample1を使っているんです。
それで取りあえず急ぎ作ったのが以下のコードで見ての通りの力ずくでコーディングしたもの、マクロ記録に少し手を加えただけの安直仕上げ「Rough And Ready(粗製乱造)」です。
Sub Sample1()
Dim ブック, 都度データ, コピー先, 在庫データ As String
ブック = ActiveWorkbook.Name
With Workbooks
.Open Filename:="C:idectempIDECHDATA.csv"
都度データ = ActiveWorkbook.Name
コピー先 = Range("A1").End(xlDown).Address
.Open Filename:="C:idectempIDECHDATAZ.csv"
在庫データ = ActiveWorkbook.Name
End With
ActiveSheet.UsedRange.Copy
Workbooks(都度データ).Activate
Range(コピー先).Select
ActiveSheet.Paste
Range("H:K").Delete
Windows(在庫データ).Close
ActiveSheet.UsedRange.Copy
Windows(ブック).Activate
Range("A1").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Windows(都度データ).Close SaveChanges:=False
End Sub
ほんとに美しくないですね、スマートに見えないのでそこで少しは増しにと書いたやつが下のやつなんですけどループ処理をどうしても2度書きする羽目になるのです、何とか1度ですまないかといろいろやったのですがなかなかできなかったのです。
Sub Sample2()
Dim tmPLine As String
Dim tmp As Variant
Dim nHFile As Long
ブック = ActiveWorkbook.Name
nHFile = FreeFile
Open "C:idectempIDECHDATA.csv" For Input As #nHFile
On Error GoTo Fin
dTa = 1
Do While Not EOF(nHFile)
Line Input #nHFile, tmPLine
tmPLine = Replace(tmPLine, """", "")
tmp = Split(tmPLine, ",")
Range(Cells(dTa, 1), Cells(dTa, UBound(tmp) + 1)) = tmp
dTa = dTa + 1
Loop
Close #nHFile
Open "C:idectempIDECHDATAZ.csv" For Input As #nHFile
On Error GoTo Fin
Do While Not EOF(nHFile)
Line Input #nHFile, tmPLine
tmPLine = Replace(tmPLine, """", "")
tmp = Split(tmPLine, ",")
Range(Cells(dTa, 1), Cells(dTa, UBound(tmp) + 1)) = tmp
dTa = dTa + 1
Loop
Fin:
Close #nHFile
End Sub
配列を変数に入れてそれを順に取り出せばいいことは分かっているのですがその方法がわからないのです、たとえば
f_name = Application.GetOpenFilename _
( _
FileFilter:="CSVファイル(*.csv),*.csv" _
, FilterIndex:=1 _
, Title:="複数ファイルオープン" _
, MultiSelect:=True _
)
のようにダイアログボックスから選択すれば簡単に入れられますが読み込むファイル名は常に決まっているのでダイアログボックスは使いたくありません。
でも一生懸命考えたらどうにかできました、それがこれ。
Sub Sample3()
Dim f_name(1), tmPLine As String
Dim tmp As Variant
Dim nHFile As Long
f_name(0) = "C:idectempIDECHDATA.csv"
f_name(1) = "C:idectempIDECHDATAZ.csv"
nHFile = FreeFile
dTa = 1
' For k = 1 To UBound(f_name) 変数の要素数が不明の場合
For k = 0 To 1
Open f_name(k) For Input As #nHFile
On Error GoTo Fin
Do While Not EOF(nHFile)
Line Input #nHFile, tmPLine
tmPLine = Replace(tmPLine, """", "")
tmp = Split(tmPLine, ",")
Range(Cells(dTa, 1), Cells(dTa, UBound(tmp) + 1)) = tmp
dTa = dTa + 1
Loop
Close #nHFile
Next
Fin:
Close #nHFile
End Sub
これで見た目がすっきりしたし分かりやすくなりました。
でも、考えてみると早さ的には力技でコピペを繰り返したSample1の方が早いんじゃないかなと思うのです、Sample2とSample3は一行一行読み込んでいるから。
なので実は今、まだSample1を使っているんです。