アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。
セルの選択について教えて下さい。

"Sheet1"がアクティブの時は以下のMacro1で動作します。
ところが、"Sheet1"がアクティブでなく、
他のワークシートを開いている時に
Macro1を実行するとエラーで動作しません。

作業中のワークブックの中にあるシートですし、
シート名も記載しているのに
何が原因でエラーになるのでしょうか?


記録マクロを利用したところ、
Macro2のようになり、
このコードなら、"Sheet1"以外の
ワークシートを開いている場合でも
エラーが出ないでマクロを実行できます。

すごく基本的なことなのですが、わからなくて不思議に思っています。

すいませんが詳しい方、説明の上手な方、直接、コードで説明できる方、
お手数ですが教えて下さい。よろしくお願いします

--------------------
Sub Macro1()

Worksheets("Sheet1").Range("A1").Select

End Sub

--------------------
Sub Macro2()

Sheets("Sheet1").Select
Range("A10").Select

End Sub

A 回答 (4件)

こんにちは。



>頂いたコードですが
>標準モジュールに貼り付けて実行してみたのですが、
>エラーで止まりました。

そうでしたか、その前提を言っていませんでしたから、しょうがなかったと思います。
「個人用マクロブック(PERSONAL.XLSB)」を対象にしていたのですが、「個人用マクロブック」がなければ、エラーが発生します。
その対象となるブックは、開いているブックで、今アクティブでない標準のブックなら、何でも良かったです。

ただ、アドインは、今、ためしてみましたが、ActiveSheet を持たないようです。

>VBAエキスパート
向学心がおありになるようですね。
広く浅くやっていて、その中で自分はこれだと思うものがあれば、深めればよいかと思います。

エキスパート試験は、お金が惜しくて受験はしませんでしたが、VBAエキスパートの本やアプリで勉強したことはあります。

ご紹介(私は、時々、忘れたころに、VBAテスト2 をやることにしています。)
作者、日経BP21 の芳坂氏
http://hp.vector.co.jp/authors/VA016119/excel/ex …

挑戦! Excel VBA テスト  (90点でした。引っ掛け問題があります。)
http://hp.vector.co.jp/authors/VA016119/excel/te …

Excel VBA テスト 2 (ベータ版)
http://hp.vector.co.jp/authors/VA016119/excel/te …
内容は古いし、正誤問題ではあっても、全部「誤」を選べばよいのですが、その理由が問題です。最初、一個たりとも理解できませんでした。

ただ、自分の上達に合わせて、芳坂氏の考え方が見えてくるのです。それに従う必要性はないものの、納得すれば、ある程度同じような書き方になることは間違いないのです。

私も、こうしたベテランの人たちから、「教えて!goo」で教わった書き方を含めて、今の私のVBAの考え方につながっています。もちろん、テスト2は、正解などありません。解説もありませんから、この解答を教えてくれる人も少ないだろうと思います。

例:
'選択セル範囲内の可視セルを取得します。
Sub Test1()
   Dim r As Range
   Set r = Selection.SpecialCells(xlVisible)
   If Not (r Is Nothing) Then MsgBox r.Address
End Sub

VBAエキスパートのスタンダードの項目をみると、何やら、だいぶ違うスタンスにあるような気がしますが、大村あつしさんが、新しくExcel のために、API の本を出版しましたね。さて、どうなるのか、書籍の内容も見ていませんから、よく分かりません。

VBAは、急に変わる可能性があります。一般的には、VBAは古臭くて嫌われているようにも聞いていますが、他に柔軟な対応でできるかというと、私自身怪しいです。

そこで、私が今、Excel関連で、気になるサイトを紹介します。
いずれ、何かの参考になると思います。

リボン
http://www.rondebruin.nl/

アドイン
https://excel-dna.net/

日本語:
https://www.ka-net.org/blog/?cat=4

なお、BAは不要ですから、ご遠慮無く。
    • good
    • 1
この回答へのお礼

ご解答ありがとうございます。
いつも詳しいコメントで楽しく読ませて頂いております。
(残念ながら理解出来る部分の方が少ないのですが)

前回のマクロの件、動作方法をアドバイスして頂きありがとうございます。
最初に「'//個人用マクロブック」と記載されていたのに、
この言葉に意味があるとは思いませんでした、、、というより、
初めて聞く言葉なので全くスルーしていました。

今回のアドバイスからネットで調べて
以下のリンク先を参考に処理しました。
http://www.officepro.jp/excelmacro/rec/index5.html

実行してみたところ、、、、???
という感じです。

メッセージの内容がムチャクチャですが、
本当にこんなのでいいのか?と思います。
VBAのMsgBoxの中の「" "」の中が文字列なのではないか?
と思い確認したのですが、そういうわけでもありませんし。
想像できる動作の枠外です。

それとエクセル、VBA関連の情報をいろいろありがとうございます。
いろんな事がマクロで出来るんですね。
タイトルの意味すら理解に苦しむものもあるので、
ほどほどに参考にしながら、自分のペースで勉強していこうと思います。

いつもご解答ありがとうございます。機会がありましたら、またお願いします。

お礼日時:2017/01/28 23:13

こんにちは。



>すごく基本的なことなのですが、わからなくて不思議に思っています。

私は、VBAを知ってから、もう十年以上経ちますが、今でも、そういうことが変だなって思う時があります。

Active というメソッドと、ActiveCell やらActiveSheet というものとは、根本的に違うものなのでしょうね。これに、Select というメソッドが加わると、またまたややこしくなりそうです。

Select メソッドにも、Worksheet.Select(オプション)というものがあります。Active は一つ選びますが、Select は、複数を選べます。

Workbook には、アクティブにしなくても、ActiveSheet いうものは存在するってご存知ですか?

また、当然、それぞれに、ActiveCell は存在するというわけです。多次元宇宙のようです。

以下のマクロは、結構驚きます。いままでの認識がガラッと変わるからです。
'//個人用マクロブック

Sub TestActive1()
Dim wb As Workbook
Dim sh As Worksheet
Dim rng As Range
'任意の常駐している、アクティブでないブック
Set wb = Workbooks("PERSONAL.XLSB")
Set sh = wb.ActiveSheet

MsgBox "1. アクティブシート" & vbCrLf & _
    sh.Name & " : " & sh.Parent.Name
Set rng = wb.Windows(1).ActiveCell  '*

MsgBox "2. アクティブセル、シート名、ブック名" & vbCrLf & _
 rng.Address & " : " & rng.Parent.Name & " : " & rng.Parent.Parent.Name
End Sub
'//

*ActiveSheet から取れればよいのですが、これも不思議ですが、ActiveSheet とActiveCell は、直接のつながりを持たないようです。おそらく、ActiveCell は、Worksheet という個別のものに存在するからで、Sheet とは必ずしも一致しないからだと思います。Sheet には、Dialogsheet, ChartSheet, MacroSheet, Worksheet の4種類ありますが、それを統合してしまうと、ActiveCell があるものとないものが出てきてしまいます。

Worksheets("Sheet1").Range("A1")
これに、Workbookから書くと「コンテナ」といわれますね。たんに、Select できないだけで、そこの値自体は取れます。なぜ直接できないのかは、Select 自身の機能とも言えるし、仕様ということしか言えないように思います。

VBAでは、さほど、その場所に飛ぶということを必要としないので、あまりクローズアップされません。
Application.Goto というのは、たぶん、Application という中でオブジェクトを包合して、マップのようなものがあるから、飛べるのだと思います。

また、[A1] っていう書き方は、何かご存知なのでしょうか。
これって、Evaluate メソッドの省略なのですね。ところが、Evaluate ととしては、変数が使えますが、このカギカッコ内は、どうも変数が使えなさそうで、少なくとも私は知りません。便利な部分もあるのですが、必ずしもそうでないこともあります。

何年たっても知らないことも残っているものです。
    • good
    • 1
この回答へのお礼

ご解答ありがとうございます。

私のレベルではコメントして頂いたことが断片的にしか
理解できないのですが、

>Active というメソッドと、ActiveCell やらActiveSheet というものとは、根本的に違うものなのでしょうね

>また、[A1] っていう書き方は、何かご存知なのでしょうか。
これって、Evaluate メソッドの省略なのですね。

この2つはよく覚えておきます。
特に、「[A1]」って何だろうと思っていましたから。

それと、、、、頂いたコードですが
標準モジュールに貼り付けて実行してみたのですが、
エラーで止まりました。

WindFallerさんが書かれたコードですので、エラー対策は講じてあると思います。
メッセージボックスがありますし。
なので、途中で止まるにしても何か表示されると思うのですが、、、
僕の知識ではどうにもなりません。

お手数でなければ、使い方を教えて頂ければ嬉しいです。
せっかくですので、動くところを見て実感してみたいと思っていますので。

※お手数の場合はスルーでOKです。

追記
いつも詳しいご解答ありがとうございます。
VBAの基礎を勉強したいと思い、VBAエキスパートの勉強を始めました。
http://vbae.odyssey-com.co.jp/index.html

今までと違い、時々、基礎的なことを尋ねると思います。
機会がありましたら、その時は、またお願いします。

※コードの件があるので、しばらく質問は開けておきます。
いつもご解答ありがとうございます。

お礼日時:2017/01/28 08:17

セルを選択する場合は、対象セルがあるシートがアクティブになっていなければなりません。


アクティブじゃないシートのセルをいきなり選択しようとすると今回のエラーが出ます。

#1 さんのコードを丁寧に 2回の処理(アクティブにして、選択する)に分けると以下のコードになります。
Worksheets("Sheet1").Activate
Worksheets("Sheet1").Range("A1").Select
    • good
    • 1
この回答へのお礼

ご解答ありがとうございます。

よくわかりました
何冊かガイドブックを読んだのですが、
初心者の感覚からすると

Worksheets("Sheet1").Range("A1").Select

で、いけそうな気がしますが、
シートをアクティブにする必要があるので、結局、

Worksheets("Sheet1").Activate

とか

Sheets("Sheet1").Select

がいるんですよね。
ちょっとですが基礎的なことがわかって嬉しいです。

ご解答ありがとうございました。機会がありましたらまたお願いします。

お礼日時:2017/01/27 14:55

> ところが、"Sheet1"がアクティブでなく


シートがアクティブでないからセルを選択できない。
ただそれだけのことですね。

Application.Goto Worksheets("Sheet1").[A1]
    • good
    • 1
この回答へのお礼

ご解答ありがとうございます。

ガイドブックの指示に従って場所を指定してコードを書いてみたのですが、
実際にやってみるとエラーが出る場合と出ない場合があるので、
戸惑っていました。

Application.Goto
こんなのが必要なんですね。ありがとうございました。

ベストアンサーですが、ほかの人の話も聞いてみたいので、
質問はしばらく開けておきますね。

今回はご解答ありがとうございます。機会がありましたらまたお願いします。

お礼日時:2017/01/27 13:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!