パソコンスキルの教科書

パソコンスキルの教科書

東京大学大学院卒。博士課程に進学を志すも、担当教授と折が合わず、無職になる。医者を目指すも結局断念。田舎で派遣社員として働く。「スキルがなければ、仕事ももらえない」と悟り、ビジネススキルを学ぶ。プログラミング、英語を学び、一部上場企業へ転職。年間100時間以上の業務効率化を行い、社内講師に抜擢。海外の案件を担当し、数億円のプロジェクトに携わる。個人の事業でも、月売上100万を達成。現在は、自分の価値を高めるためのスキル向上支援を行う

エクセルマクロVBA|データ項目別にシートを作成し自動転記する方法|無料ダウンロード可

f:id:gene320:20181022231106j:plain

エクセル内の情報を別シートへ転記する作業があります。例えば、以下のA列の「型式」の項目毎にシート別に情報を転記する作業です。

f:id:gene320:20181022224431p:plain

上記のA列の「型式」はバラバラの項目が順不同に並んでいます。

これを以下のように{a, b, c, d…}の型式毎にシート別に情報を格納します。

f:id:gene320:20181022224720p:plain

このとき、シートの名前も型式通りに変更します。

このような作業は、エクセルの機能を活用すれば、作業そのものは可能です。具体的には以下です。

[1] A列で「型式」別に並び替える
[2] フィルターをかける
[3] シートをコピー
[4] コピーしたシートに型式aの情報をコピペして貼り付ける
[5] コピーしたシートの名前を型式名に書き換える
[6] 型式の項目ごとに[3]~[5]を繰り返す

しかし、手作業のため面倒な作業です。しかも、コピペのミスや型式名の変更し忘れなどが発生しがちです。

このようなとき、マクロを使うと一瞬で仕事を終わらすことができます。

この記事で紹介するマクロは、具体的には以下の動画で解説しています。

youtu.be

実は、この事例は実際に私が依頼を受けて作成したマクロです。いただいた質問は以下です。

・仕事内容
⇒生産計画をしています。

・何に困っていて
⇒客先から、毎週 確定受注・内示の更新があります。
 自分で作成した管理表に受注・内示を手で入力しています。
 めんどうなので、自動で管理表に入力したいです。

・具体的にどんなVBAを作りたいか
⇒A列の型式ごとにワークシートに分けるVBAを作成したいです。

(一部改変)

このようなマクロは、手軽に作成できる上に地味に手間のかかる作業を自動化してくれます。

もし、自動化したい作業があれば、以下の問い合わせからご連絡ください。

お問い合わせ - パソコンスキルの教科書

全てに対応することはできませんが、簡単に作成できるものは作成して記事で紹介させていただくかもしれません。

自動でシート作成し転記するマクロの使い方

このマクロの使い方は以下のとおりです。

[1] ボタン「シート作成」を押すと、A列の型式ごとにシートが作成される。
[2] ボタン「シート削除」を押すと、[1]で作成されたシートを削除される。

注意点があります。

それは、「nouhin」 「template」といったシートを削除したり、シート名を変更したりしないことです。

「nouhin」 「template」といったシート名に手を加えるとエラーが出てしまう場合があります。

もし、シート名を変えたり、他の機能を追加したりしたいなら自力でプログラムを編集してみてください。

あなたの仕事に合わせてカスタムする力がつけば、きっとマクロが仕事をラクにしてくれるはずです。

マクロの使い方・始め方はこちらで紹介していますので参考にしてください。

www.fastclassinfo.com

動画で紹介した「自動でシート作成し転記するマクロ」の入ったエクセルはこちらからダウンロードできます

以下のフォームにメールアドレスを入力いただくと、返信メールからエクセルファイルをダウンロードできます。

自動でシート作成し転記するマクロのプログラム

この記事の動画で解説しているマクロのプログラムは以下です。参考にしてみてください。

Option Explicit

Sub Createsheet()
    
    Dim cmax
    cmax = Worksheets("nouhin").Range("A65536").End(xlUp).Row
    
    ActiveWorkbook.Worksheets("nouhin").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("nouhin").Sort.SortFields.Add Key:=Range("A1"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("nouhin").Sort
        .SetRange Range("A2:E" & cmax)
        .Header = xlNo
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    
    Dim i, j
    Dim torihiki
    
    For i = 2 To cmax
        If torihiki <> Worksheets("nouhin").Range("A" & i).Value Then
            torihiki = Worksheets("nouhin").Range("A" & i).Value
            Worksheets("template").Copy After:=Worksheets("nouhin")
            ActiveSheet.Name = torihiki
            j = 2
        End If
        
        Worksheets(torihiki).Range("A" & j).Value = Worksheets("nouhin").Range("A" & i).Value
        Worksheets(torihiki).Range("B" & j).Value = Worksheets("nouhin").Range("B" & i).Value
        Worksheets(torihiki).Range("C" & j).Value = Worksheets("nouhin").Range("C" & i).Value
        Worksheets(torihiki).Range("D" & j).Value = Worksheets("nouhin").Range("D" & i).Value
        Worksheets(torihiki).Range("E" & j).Value = Worksheets("nouhin").Range("E" & i).Value
        
        j = j + 1
    Next
    
End Sub
Sub DeleteSheets()
    Dim c
    Dim kazu
    
    kazu = Worksheets.Count
    For c = 0 To kazu - 1
        If Worksheets(kazu - c).Name <> "nouhin" Then
            If Worksheets(kazu - c).Name <> "template" Then
                Worksheets(kazu - c).Activate
                Application.DisplayAlerts = False
                Worksheets(kazu - c).Delete
                Application.DisplayAlerts = True
            End If
        End If
    Next
End Sub

以下で少し解説を加えます。

シートを作成して転記するマクロ

Option Explicit

Sub Createsheet()
    
    Dim cmax
    cmax = Worksheets("nouhin").Range("A65536").End(xlUp).Row
    
    ActiveWorkbook.Worksheets("nouhin").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("nouhin").Sort.SortFields.Add Key:=Range("A1"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("nouhin").Sort
        .SetRange Range("A2:E" & cmax)
        .Header = xlNo
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    
    Dim i, j
    Dim torihiki
    
    For i = 2 To cmax
        If torihiki <> Worksheets("nouhin").Range("A" & i).Value Then
            torihiki = Worksheets("nouhin").Range("A" & i).Value
            Worksheets("template").Copy After:=Worksheets("nouhin")
            ActiveSheet.Name = torihiki
            j = 2
        End If
        
        Worksheets(torihiki).Range("A" & j).Value = Worksheets("nouhin").Range("A" & i).Value
        Worksheets(torihiki).Range("B" & j).Value = Worksheets("nouhin").Range("B" & i).Value
        Worksheets(torihiki).Range("C" & j).Value = Worksheets("nouhin").Range("C" & i).Value
        Worksheets(torihiki).Range("D" & j).Value = Worksheets("nouhin").Range("D" & i).Value
        Worksheets(torihiki).Range("E" & j).Value = Worksheets("nouhin").Range("E" & i).Value
        
        j = j + 1
    Next
    
End Sub

今後、解説を入れていきます。

シートを削除するマクロ

以下シートを削除するマクロです。

Sub DeleteSheets()
    Dim c
    Dim kazu
    
    kazu = Worksheets.Count
    For c = 0 To kazu - 1
        If Worksheets(kazu - c).Name <> "nouhin" Then
            If Worksheets(kazu - c).Name <> "template" Then
                Worksheets(kazu - c).Activate
                Application.DisplayAlerts = False
                Worksheets(kazu - c).Delete
                Application.DisplayAlerts = True
            End If
        End If
    Next
End Sub

ブロックごとに解説します。

Sub DeleteSheets()
    Dim c
    Dim kazu

ここまではcとkazuを変数定義しています。

    kazu = Worksheets.Count

kazuの変数に、ワークシートの個数を入れ込みます

    For c = 0 To kazu - 1
        If Worksheets(kazu - c).Name <> "nouhin" Then
            If Worksheets(kazu - c).Name <> "template" Then
                Worksheets(kazu - c).Activate
                Application.DisplayAlerts = False
                Worksheets(kazu - c).Delete
                Application.DisplayAlerts = True
            End If
        End If
    Next
End Sub

cに0,1,2,3,4,,,kazu-1の変数を入れてfor next構文を用います。kazu-1としているのは、c=0から開始しているからです。

If Worksheets(kazu - c).Name <> "nouhin" Then → ワークシートの名前が"nouhin"ではないならば、

If Worksheets(kazu - c).Name <> "template" Then → ワークシートの名前が"template"ではないならば、

Worksheets(kazu - c).Activate →ワークシートを選択

Application.DisplayAlerts = False →エラーが出ないように設定を変更する(エラーが出てマクロが止まらないようにするため)

Worksheets(kazu - c).Delete →ワークシートを削除

Application.DisplayAlerts = True →エラーが出てもいいように設定を戻す

ここではマクロのプログラムを紹介しました。ただ、実はこのマクロのプログラムは可読性があまりよくありません。

マクロを書いてきた人ならすぐに分かると思いますが、メンテナンスはやりづらいです。

ぜひ、あなた自身が勉強して、自分で編集してもっといいものを作成できるようになってほしいと思います。

エクセルを自分用に編集アレンジして使いたいなら、エクセルマクロの無料動画で学ぼう

この記事では、データ項目別にシートを作成し自動転記するマクロについて紹介しました。ここで紹介したマクロを利用すれば、作業の自動化が可能になります。

しかしデメリットもあります。それはカスタムできないことです。

なぜなら、色々な要望が増えるからです。

この動画を見たとき、「もっと○○ができるのでは?」や「ここはなんとかならないのか」と感じる人は少なくないはずです。

例えば、「他の条件を付け加えたい」や「日付毎に条件を変えたい」といった要望が出るかもしれません。

このような要望を満たすには、マクロを勉強して自力でマクロを編集できるようになる必要があります

もし、自力でマクロを編集できるようになれば、今より仕事の効率はグッと上がります。

実際、私も自力でマクロを書けるようになってからは、仕事の生産性が一気に上がりました。

他の人が30分~1時間かけて行う仕事が、ボタン一つで終わらせることができるようになったのです。その結果、周囲からの信頼も増し、仕事で高い評価を得られるようになりました。

ただ、要望に応えるようになるためには、マクロを学ぶ必要があります。

まずは無料でマクロを勉強してみる

ウェブや書籍で勉強すれば、マクロを習得できると考えている人は少なくありません。

しかし、仕事で使えるマクロを習得したいなら、仕事で使える部分に特化した教材で学ぶことをお勧めします。

なぜなら、ウェブや書籍には仕事に関係しない部分まで提供していることが多いからです。

例えば、マクロ初心者なのに配列を学ぼうとする人がいます。実は配列なしでも仕事で使えるマクロを書くことは可能です。

しかし、マクロ初心者ほど「全ての知識が必要だ」と考えて、無駄な学習に時間を使ってしまうのです。詳しくは、こちらの記事で紹介しています。

www.fastclassinfo.com

www.fastclassinfo.com

そこで、私がお勧めするのは仕事に直結するマクロ教材です。とくにお勧めするのは、こちらの無料オンライン動画です。

なぜなら、仕事に直結する部分に絞って、エクセルマクロを学ぶことができるからです。

マクロの作り方・考え方から解説しているので、教材をしっかり学べばここで紹介したマクロをゼロから書けるようになります。

マクロ初心者が、仕事に直結したいマクロを学ぶなら、まずはこちらの無料オンライン動画を試すのがいいです。

興味がある人は、まずは無料でエクセルマクロの勉強を始めてみてください。

もっと学びたいと感じたら、さらに深く勉強をしてみることをお勧めします。