1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

あるブックの任意の範囲を別のブックの指定した箇所にコピペする 振り返り

Last updated at Posted at 2019-03-03

##はじめに
今回は
『あるブックの任意の範囲を別のブックの指定した箇所にコピペする』
のマクロの作成についての振り返りをします。
このマクロが私が初めて最初から最後まで一人で作成したマクロです。
なので反省も含め「その1」~「その4」までの計4回を下記4項目について記述します。
##項目
1. 目的
2. 解決方法
3. 躓いた箇所
4. その他
##振り返り
その1
1. とにかく動くマクロを作ること
2. マクロの記録を実行でコードを記録し編集
  「ブックを指定し開く」→「シートを指定しアクティブ」→「セルA1を選択」→「コピー・貼り付け」
   をひたすら記述
3. すべて。何をやってもエラーが続いた。Activeを多用し強引に作成した
4. 特になし

その2
1. コピペの作業で繰り返し構文を使う
2. 配列を使用。
3. 配列を実際使ってみると、意外とすんなりできた。配列の苦手意識が薄れた。
4. 下記のコードを()内を(i)にして繰り返し構文を適用した


'シート名を配列に入れる ※ブック名は「シート名YYMMDD」とする
    Dim sheetName(1) As String
    sheetName(0) = "商品マスタ"
    sheetName(1) = "顧客マスタ"

その3
1. セルを参照して繰り返し構文を使う
2. 変数を使用
3. どのタイミングで変数を宣言・定義すればいいのか試行錯誤した
4. 下記のコードは応用が利くと思った
  あと、初めて記事にコメントをいただき、そこには私のやりたかったことが
  「オブジェクト指向なコード」が記述されていて大変勉強になった

'変数の宣言
    Dim i As Long
    Dim maxSheetCount As Long
    Dim sheetName As String

'参照するセルの一番右の位置を確認する
    maxSheetCount = Cells(1, Columns.Count).End(xlToLeft).Column

'転記用シートからシート名の入っているセルを指定する
    For i = 2 To maxSheetCount
        Worksheets("転記用").Activate
        sheetName = Cells(1, i)

その4
1. 転記をするための条件を満たさないときメッセージを出してマクロを止める
2. Boolean型でtrue・flaseで場合分け
  Dir関数でファイルを検索→Len関数で見つからないときは0を返すので、0か否かで場合分け
3. 繰り返し構文で1回目にtrueがかえって来ないとflase扱いになってしまい、繰り返しされなかった。
  trueが出るまで繰り返し、最後までtrueが出なかったらflase判定になるように調整するのが難しかった 
  if構文で「trueだったらif構文から抜ける方法」がわからなかった(まさか空白でよかったとは・・・) 
4. ひたすらgoogleで調べてコードにはめ込みした。
  検索結果はたくさんあり、単体では同じ結果になるコードでも、
  実際にこのマクロにはめて思った通りの挙動をしないものが多かった(私の応用力が足りないだけですが)

'判定2
'対象シートの有無を判定→一致するシートがあれば次へ進む。なければマクロ終了
            Dim ws As Worksheet
            Dim flag As Boolean

            For Each ws In Worksheets
                If ws.Name = sheetName Then flag = True
            Next ws
            If flag = True Then

            Else
                MsgBox sheetName & "シートがありません"
                Exit Sub
            End If

'判定3
'対象ファイルの有無を判定→一致するファイルがあれば次へ進む。なければマクロ終了
            Dim filepath As String
            Dim fileName As String

'検索対象のファイル名
            fileName = sheetName & "YYMMDD.xlsx"

'ファイルのパスを取得
            filepath = Dir(ThisWorkbook.Path & "\" & fileName)

'ファイルの存在有無を判定→一致するファイルがあれば次へ進む。なければマクロ終了
            If Len(filepath) <> 0 Then

            Else
                MsgBox fileName & "は存在しません"
                Exit Sub
            End If

##最後に
実際の業務でマクロが使われるのは「同じ動作を繰り返す」「コピペ」が多いと思います。
今回作成したマクロはどちらも使われているので、今後はこのマクロ作成の経験を活かし、
仕事で使えるマクロを作成していきたいです。(主に自分の業務用ですが(笑))
まだまだ基本的な部分が不安定なので数をこなしつつ、勉強していきたいと思います。
そして、きれいなコードが書けるようになったらこのマクロの「その5」で改修したいですね。

##リンク
あるブックの任意の範囲を別のブックの指定した箇所にコピペする
その1
https://qiita.com/megane55/items/2f972241921ceac716fa
その2
https://qiita.com/megane55/items/a56e89d90e1a09d0bd62
その3
https://qiita.com/megane55/items/65d57a9a010645549ab6
その4
https://qiita.com/megane55/items/a0811de26355d26fdb3e

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?