会社を卒業したのんちおじさん。

人生は知恵と工夫と思いやり!
優しさほど強いものはなく、本当の強さほど優しいものはない -ラルフ・W・ソックマン-

複数ファイルを変数に入れる。

2008-03-11 19:03:54 | Excelのお話
あるメーカーの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を使っているんです。

最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。