エクセルマクロ・VBA発展編1フォローアップミニセミナーNo.05

この講座は有料講座です。
講座の購入後ご覧になれます。

ログインアカウントの新規作成

解説

●演習問題テーマ
:自動記録でできあがったマクロを修正する際の考え方について学ぶ。For Each構文を使ってワークシート間でループする際、Selectを使わないやり方に慣れる。
For Each構文を使って、すべてのシートを順番にSelectし、指定のセルをSelectするマクロと、シート名をヘッダーに挿入するマクロを書いていきます。「すべての○○」が出てきたら、For Each構文と思ってください。ヘッダー挿入など、わからないときはマクロの自動記録をどんどん活用してください。

この教材についての過去の質問・感想

11102 : 小川慶一の回答 (2019-02-09 23:20:37)

牧野千秋さん:

知っていれば何でもないことも、気づかないといつまでもハマり続けることがあります。
動画講座が、そういうことの回避になれば、と思います。

ひきつづき、お楽しみください☆

> 同じことでひっかかる人たくさんいるんですね。
> でもこれはやってしまうわ。
>
> > 一度、worksheetオブジェクトをSelectしてからじゃないと
> > RangeオブジェクトをSelectできないですね

Sub 問題1()
'[1] すべてのシートを順番にSelectし、
'SelectされたシートでセルA1をSelectするマクロを作りなさい
    Dim w As Worksheet
    For Each w In Worksheets
        w.Range("A1").Select
    NEXT
End Sub


11092 : 牧野千秋さんのコメント (2019-02-09 22:50:14)

同じことでひっかかる人たくさんいるんですね。
でもこれはやってしまうわ。

> 一度、worksheetオブジェクトをSelectしてからじゃないと
> RangeオブジェクトをSelectできないですね

Sub 問題1()
'[1] すべてのシートを順番にSelectし、
'SelectされたシートでセルA1をSelectするマクロを作りなさい
    Dim w As Worksheet
    For Each w In Worksheets
        w.Range("A1").Select
    NEXT
End Sub


10291 : 小川慶一の回答 (2018-07-26 13:54:54)

受講生 さん:

基礎編第1章で、worksheets, charts という言葉の意味の違いについて説明しています。
ご確認ください。

基礎講座第1章2 - オブジェクトの指定
https://online.pc5bai.com/movie/index/25/98

sheetsは、worksheets, charts のどちらに対しても使える言葉です。

↑で紹介したページに載せたサンプルコードとコメントをこの投稿末尾に転載しますので、参考にしてください。

なお、以下で「そのほうが、あとあと伸びます」と書いたのは、オブジェクトを示す言葉の違いに普段から敏感な方のほうが、あとあとの伸びが違うからです。
たとえばその典型は、「セルにデータ投入するとき、以下の[1], [2]のどちらの書き方でもいいのなら[2]でいいじゃないか」という方ですが、(オブジェクトとプロパティの何を指す言葉か?ということに敏感でないと、オブジェクト型変数の習得でひっかかる)、それと同様の趣旨です。

range("a1").value=1 '[1]
range("b1")=2 '[2]


'ワークシートを指定するときには、「Worksheets」と書きます。複数形です。
'単数形の「Worksheet」ではありませんので、注意してください。
Sub WorksheetsGraphShitei()
    Worksheets("Sheet2").Name = "test"   'ワークシート「Sheet2」の名前を「test」にします
    Worksheets("test").Tab.Color = vbRed 'ワークシート「test」のタブの色を赤にします
    Worksheets("test").Name = "Sheet2"   'ワークシート「test」の名前を「Sheet2」にします
End Sub

'グラフを指定するときには、「Charts」と書きます。複数形です。
'単数形の「Chart」ではありませんので、注意してください。
Sub ChartShitei()
    Charts("Graph1").Name = "renshu"       'グラフシート「Graph1」の名前を「test」にします
    Charts("renshu").Tab.Color = vbBlue    'グラフシート「test」のタブの色を青にします
    Charts("renshu").Name = "Graph1"       'グラフシート「test」の名前を「Graph1」にします
End Sub

'「Sheet」と書く書き方もあります。
'ワークシートのときもグラフのときも使えます。

'Worksheets, Charts, Sheets の使い分けについて。
'例えて言うと...以下のニュアンス。
'Worksheets : 牧場にいる羊の群れ  (羊は指すときには使える、山羊のときは使えない)
'Charts     : 牧場にいる山羊の群れ(山羊は指すときには使える、羊のときは使えない)
'Sheets     : 牧場にいる家畜の群れ(羊と山羊、どちらに対しても使える)

'手書きでマクロを書く際には、「Sheets」は使わず、「Worksheets」や「Charts」を
'使うようにしてください。(そのほうが、あとあと伸びます)

'ただし、「Sheets」は「エクセルマクロの自動記録機能」を使って書いたマクロには
'たびたび登場します。なので、「急に出てきてもびっくりしないように」という意味で
'いちおう紹介しておきます。
Sub SheetShitei()
    Sheets("Sheet5").Name = "hoge"
    Sheets("Graph2").Name = "piyo"

    Sheets("hoge").Tab.Color = vbGreen
    Sheets("piyo").Tab.Color = vbBlack
    
    Sheets("hoge").Name = "Sheet5"
    Sheets("piyo").Name = "Graph2"
End Sub


> 小川さん
> いつも大変お世話になっております。
> 自動記録したら「worksheets("sheet2")」でなく「sheets("sheet2")」と
> でてきました。worksheetsと、ただのsheets、挙動は同じでしたが
> 何か違いがあるのでしょうか。違いがないなら、短い方が楽だと思うのですが。ちなみに2016バージョンです。


10288 : 受講生さんのコメント (2018-07-26 05:07:55)

小川さん
いつも大変お世話になっております。
自動記録したら「worksheets("sheet2")」でなく「sheets("sheet2")」と
でてきました。worksheetsと、ただのsheets、挙動は同じでしたが
何か違いがあるのでしょうか。違いがないなら、短い方が楽だと思うのですが。ちなみに2016バージョンです。


8969 : 浦山大さんのコメント (2017-09-30 16:08:11)

sheet_sentaku_daijobu
↓プロシージャの名前が一緒でした。
コピペして作ったため、変更を忘れていました。
失礼しました。


8968 : 浦山大さんのコメント (2017-09-30 16:05:51)

エクセルの仕様のところで止まりました。
一度ワークシートオブジェクトをアクティブにしてあげないといけないのですね。

一つ一つに時間がかかってしまいますが、
ん?と思ったらヘルプやWEB等で調べる癖がついてきました。
F1を押す回数がとっても増えました。

オブジェクト、プロパティ等の用語の整理が曖昧です。
「○○の(ピリオド)、○○を、○○する(イコール)」
はコードを書きながら呟いています。

が、
オブジェクト…プロパティ…というカタカナで説明しようと思うと躓きます。
ふわふわしていて定着していない感じがします。

体で憶えていっている感覚はあるので進めることに問題はないのですが。
どこかで整理します(動画、テキスト、マインドマップ、活用致します)。

↓怒られる

Private Sub sheet_sentaku_daijobu()
    Dim ws As Worksheet
        For Each ws In Worksheets
            ws.Range("A1").Select
        Next
End Sub


↓大丈夫
Private Sub sheet_sentaku_daijobu()
    Dim ws As Worksheet
        For Each ws In Worksheets
            ws.Select
            Range("A1").select
        Next
End Sub


4325 : 山田 将之さんのコメント (2015-05-20 05:38:38)

「すべての○○」が出てきたら、For Each構文と思ってください。

ヘッダー挿入など、わからないときはマクロの自動記録をどんどん活用してください。

了解です。


2548 : 小川慶一の回答 (2014-09-24 07:38:28)

匿名 さん:

こういうのも、覚えるというより、そういうのがあるんだ、と知っておくくらいで。
僕自身は、かなり慣れるまで(というより、もっとはっきり言うと、講座をやるようになるまで)こんなの自分で書けませんでした。それでもぜんぜん困りませんでした。

基礎編のマインドマップで、冒頭に、「知識には2つのタイプがある。ひとつは物事を知っていること、もうひとつは、それをどこで見つけられるかを知っていること」という、サミュエル・ジョンソンの言葉を紹介しました。その感覚です。

>.PageSetup.LeftHeader等、使えそうな知識がどんどん増えて、嬉しい限りです。


2539 : 受講生さんのコメント (2014-09-23 20:26:19)

.PageSetup.LeftHeader等、使えそうな知識がどんどん増えて、嬉しい限りです。


852 : ガラパゴスタディー事務局の回答 (2013-11-08 00:00:00)

小俣さん:

> Withで指定したオブジェクトは右辺でも省略可能だったんですね。

です。講義本編の段階ではお伝えしても混乱する可能性が高いので、お伝えしていませんが(笑

ひきつづき、お楽しみを☆


647 : 小俣卓生さんのコメント (2013-11-06 00:00:00)

小川さん

添削ありがとうございます!

With...End With構文はまだ書き慣れてないので
インデントできなかったみたいです。

Withで指定したオブジェクトは右辺でも省略可能だったん
ですね。

これから自分の頭がすっきりして、かつ、自分以外の人も
読みやすいプログラムが書けるよう精進します!


646 : ガラパゴスタディー事務局の回答 (2013-11-04 00:00:00)

小俣さん:

For Each構文、慣れるとおもしろいでしょ。
カウンター変数の値の範囲を考える手間がない分、より抽象的な思考だけでプログラムを書ける感じがします。

> 一度、worksheetオブジェクトをSelectしてからじゃないと
> RangeオブジェクトをSelectできないですね。

ですね。それはエクセルの仕様。


With ... End With の中身は、一段インデントしてください。
あと、 .PageSetup.LeftHeader = sh.Name

のところは、以下で動きます。 With sh ... End With の中だから。(講座ではお伝えしていませんでしたが、実は対象となるオブジェクトメンバーが右辺に登場するときでもOKです)

.PageSetup.LeftHeader = .Name


645 : 小俣卓生さんのコメント (2013-11-03 00:00:00)

最初は↓のようなコードを書いてしまいエラーになってしまいました。

sh.Range("A1").Select

一度、worksheetオブジェクトをSelectしてからじゃないと
RangeオブジェクトをSelectできないですね。

たしかにFor Each構文は病みつきになりますね(^o^)
Sub test2()
    Dim sh As Worksheet
    For Each sh In Worksheets
        With sh
        .Select
        .Range("A1").Select
        .PageSetup.LeftHeader = sh.Name
        End With
    Next
End Sub


644 : ガラパゴスタディー事務局の回答 (2013-05-06 00:00:00)

藤掛さん:

よかったです。

行き詰まったときには、基本的な手法に戻って研究してみてください。

今回なら、「ピリオドは「~の」、イコールは「~を、○○にする」と読み替えて文字に起こしする」とかですね。

For Each構文、たしかに便利ですよ。ひきつづき、お楽しみを!


643 : 藤掛 広章さんのコメント (2013-05-05 00:02:00)

ありがとうございました。根本的な誤解は解決しました。
もっとプログラムの意味を研究してみます。結構意味が分かってくるといろんなケースのマクロが書けるようになると思うので。


642 : ガラパゴスタディー事務局の回答 (2013-05-05 00:01:00)

藤掛さん:

ん?無事解決かな?


641 : 藤掛 広章さんのコメント (2013-05-05 00:00:00)

w.PageSetup.LeftHeader = "&A"
→「w(worksheet)のPageSetupのLeftHeaderプロパティの値を"&A"とする。」
つまり、オブジェクト型の変数にプロパティ自体を入れているわけではないということだと理解しました。


640 : ガラパゴスタディー事務局の回答 (2013-05-04 00:02:00)

藤掛さん:

w.PageSetup.LeftHeader = "&A" ←ここでは指定した「オブジェクト型の変数」に「プロパティ」を入れるっていう理解でいいんですか?この構文の仕組みがいまいち理解できていません。



ピリオドは「~の」、イコールは「~を、○○にする」と読み替えて文字に起こしてみて。

「wの、ページセットアップの、レフトヘッダーを、&Aにする」ですよね。

この文章を、大きな声で最低3回読んでみてください。

さて、大きな声で3回読んでもらったところで、解説です。

wのところは変数ですが、通常だと、

「ワークシート"Sheet1"の、ページセットアップの、レフトヘッダーを、&Aにする」とか、そんな感じになるわけです。

Worksheets("Sheet1").PageSetup.LeftHeader = "&A"

ですね。

そうすると、少なくとも、

> ここでは指定した「オブジェクト型の変数」に「プロパティ」を入れるっていう理解でいいんですか?

てのは間違いだと分かるはず。

まずは、ここまで。
あとは、マインドマップ、セミナーで使ったサンプルデータ、テキストをあたって考えてみて。
それでどうなったか、ご報告ください。

必要そうでしたら、オブジェクト型変数について扱った発展編第1章のところにも戻ってみてください。


639 : 藤掛 広章さんのコメント (2013-05-04 00:01:00)

こんばんは

for each 構文って便利ですね。でも、ちょっと理解が追いついてないかも。以下に質問事項記載います。

Sub erabu()
    Dim w As Worksheet ←オブジェクト型変数を指定
    For Each w In Worksheets
        w.PageSetup.LeftHeader = "&A" ←ここでは指定した「オブジェクト型の変数」に「プロパティ」を入れるっていう理解でいいんですか?この構文の仕組みがいまいち理解できていません。
    Next
End Sub


よろしくお願いします。


638 : ガラパゴスタディー事務局の回答 (2013-05-04 00:00:00)

豊島さん:

> 今回は、問題の趣旨を取り間違えてばかりでした。

お気になさらず。実際には、上達してくると、そもそも select すること自体なくなりますので。


637 : 豊島 久博さんのコメント (2013-05-03 00:00:00)

今回は、問題の趣旨を取り間違えてばかりでした。

 1番は、「A1」セルは然ることながら、ワークシートもセレクトして、実行かけると、ワークシートが切り替わって行くようにすると言うのが趣旨なんですね!
 私は、団子の部分をw.Range("A1").Selectとやってました。

「ヘッダー」と言う言葉は聞いてましたが、ページ設定の所で、ワークシート名をつける設定があることすら知りませんでした。
エクセルの事も勉強になりました。


636 : ガラパゴスタディー事務局の回答 (2013-01-27 00:00:00)

山根さん:

For Eachは、慣れるとやみつきになりすよー (^^


635 : 山根信行さんのコメント (2013-01-26 00:00:00)

なんと必要なのは
.LeftHeader = "&A"
だけとは驚きました。
読み解く能力も養わないとならないなと感じました。
For Eachではなく最初For nextで書いてしまいました。ワークシートの数を取得して・・・と「そうか、オブジェクトはFor Eachだ」というのを思い出しました。


634 : ガラパゴスタディー事務局の回答 (2012-12-18 00:01:00)

佐藤さん:

> わからないことがあった時に調べたり、説明を読むことが前ほど「怖く」なくなったので。

「リテラシー」(読み書きの能力)が強化された、ということですね。

自動記録で作ったマクロの編集も For Each 構文も、パターンなので。
慣れちゃえば、すぐだと思いますよ!


633 : 佐藤 尚子さんのコメント (2012-12-18 00:00:00)

コメントありがとうございました。
ITリテラシーレベル、少しだけ上がったことが実感できています。わからないことがあった時に調べたり、説明を読むことが前ほど「怖く」なくなったので。以前は全く分からないので調べるのが嫌だ・怖いと思っていました。
問題1のコメントを参考に色の調整ができたときも感動しました。
自動記録で作ったマクロの編集とFor each 構文 にまずはもっと慣れたいと思います。


1246 : 小川慶一の回答 (2012-09-04 16:47:00)

達人養成塾 小川です。


> オブジェクトを指定するうま味が、この問題でよく分かりました。

あの例だけでピンと来てくれるとうれしいですね ^^


匿名さんからは、おもしろい(≒ interesting な)コメントが
いろいろ聞けるので僕も楽しいです。

今後とも、いろいろ取り上げさせてください。


1245 : 受講生さんのコメント (2012-09-04 15:11:00)

オブジェクトを指定するうま味が、この問題でよく分かりました。

いろいろな名前の付いたシートを、一つのニックネームから自由に扱えるのは便利で凄いですね!


3日がかりのその仕事、3分で終わらせる方法教えます。ガラパゴスタディーオンライン講座 ユーザー登録

本講座の動画一覧

  1. 【動画1】 エクセルマクロ・VBA発展編1フォローアップミニセミナーNo.01
    【動画1】 エクセルマクロ・VBA発展編1フォローアップミニセミナーNo.01 未習得
  2. 【動画2】 エクセルマクロ・VBA発展編1フォローアップミニセミナーNo.02
    【動画2】 エクセルマクロ・VBA発展編1フォローアップミニセミナーNo.02 未習得
  3. 【動画3】 エクセルマクロ・VBA発展編1フォローアップミニセミナーNo.03
    【動画3】 エクセルマクロ・VBA発展編1フォローアップミニセミナーNo.03 未習得
  4. 【動画4】 エクセルマクロ・VBA発展編1フォローアップミニセミナーNo.04
    【動画4】 エクセルマクロ・VBA発展編1フォローアップミニセミナーNo.04 未習得
  5. 【動画5】 エクセルマクロ・VBA発展編1フォローアップミニセミナーNo.05
    【動画5】 エクセルマクロ・VBA発展編1フォローアップミニセミナーNo.05 未習得
  6. 【動画6】 エクセルマクロ・VBA発展編1フォローアップミニセミナーNo.06
    【動画6】 エクセルマクロ・VBA発展編1フォローアップミニセミナーNo.06 未習得
  7. 【動画7】 エクセルマクロ・VBA発展編1フォローアップミニセミナーNo.07
    【動画7】 エクセルマクロ・VBA発展編1フォローアップミニセミナーNo.07 未習得
  8. 【動画8】 エクセルマクロ・VBA発展編1フォローアップミニセミナーNo.08
    【動画8】 エクセルマクロ・VBA発展編1フォローアップミニセミナーNo.08 未習得
  9. 【動画9】 エクセルマクロ・VBA発展編1フォローアップミニセミナーNo.09
    【動画9】 エクセルマクロ・VBA発展編1フォローアップミニセミナーNo.09 未習得
  10. 【動画10】 エクセルマクロ・VBA発展編1フォローアップミニセミナーNo.10
    【動画10】 エクセルマクロ・VBA発展編1フォローアップミニセミナーNo.10 未習得
  11. 【動画11】 エクセルマクロ・VBA発展編1フォローアップミニセミナーNo.11
    【動画11】 エクセルマクロ・VBA発展編1フォローアップミニセミナーNo.11 未習得
  12. 【動画12】 エクセルマクロ・VBA発展編1フォローアップミニセミナーNo.12
    【動画12】 エクセルマクロ・VBA発展編1フォローアップミニセミナーNo.12 未習得
  13. 【動画13】 エクセルマクロ・VBA発展編1フォローアップミニセミナーNo.13
    【動画13】 エクセルマクロ・VBA発展編1フォローアップミニセミナーNo.13 未習得

塾長 小川慶一

メニュー

コメント紹介

もっと見る

ページの先頭へ