Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2016)
msgboxのyesnoボタンで処理切替え
投稿日時: 21/01/21 13:29:39
投稿者: 銀河

 回答者の皆様には、いつもお世話になっております。
 よろしくご指導お願いします。
 メッセージboxでyesnoボタンを押して、処理を分けたいのですが△の処理しか
 動作しません。いろいろなところを調べているのですがわかりません。
 何か大ぽかをしているのか。
Sub フッダー変更() 'フッダー変更マクロ
  Dim myWs As Worksheet
  Dim mybtn As Integer
   
  Application.ScreenUpdating = False
 
      Worksheets("表紙").Activate
        Range("a1").Activate
      MsgBox "この計算書は(公財)情報センター用ですか?", vbYesNo + vbQuestion
        
       For Each myWs In Worksheets
                If mybtn = vbYes Then⊷-------------------〇〇であればここの処理
                     myWs.Activate
                      With ActiveSheet.PageSetup
                         .CenterFooter = " ○○〇〇 "
                      End With
                Else-------------------------------------そうでない場合はここの処理
                      myWs.Activate
                      With ActiveSheet.PageSetup
                         .CenterFooter = " △△△ "
                      End With
                End If
         Debug.Print myWs.Name
       Next
      Worksheets("表紙").Activate
        Range("a1").Activate
       
  Application.ScreenUpdating = True
End Sub

回答
投稿日時: 21/01/21 13:43:50
投稿者: WinArrow
投稿者のウェブサイトに移動

 
>MsgBox "この計算書は(公財)情報センター用ですか?", vbYesNo + vbQuestion
   
これだけでは、無理です。
Msgboxの操作結果を取得する必要があります。
  

     myBtn = MsgBox("この計算書は(公財)情報センター用ですか?", vbYesNo + vbQuestion)
   
   If myBTN = vbYes Then
      ' はいをクリック時の処理
  Else
      ' いいえをクリック時の処理
  End If
 
 

回答
投稿日時: 21/01/21 13:51:09
投稿者: Suzu

引用:
 何か大ぽかをしているのか。

ですね。
 
分岐条件dの mybtn の値はどうなっていますかね。
確認してみましょう。
 
 
それと、質問には全く関係ありませんが、
 
For Each myWs In WorkSheets の中で、先の判定を行っており、分岐処理を行っていますが
中で行うと言う事は、ワークシートの枚数分だけ判定処理を行っています。
 
この判定処理は、ワークシート名等、ワークシートに由来する判定ではなく
ワークシートが変わろうと変わるまいと、不変の判定です。
 
ですので、その判定は For Each の外で行う事で判定は一度で済むことになりますよね。
また、myWs をアクティブにする必要はありません。
myWs.CenterFooter と直接指定すれば良いです。
 
 
引用:
Dim myWs As Worksheet
Dim mybtn As Integer
 
Dim strFooter As String
 
 :
 
(中略)
 
If mybtn = vbYes Then
  strFooter = "○○○○ "
Else
  strFooter = "△△△△ "
End If
 
For Each myWs In Worksheets
  myWs.CenterFooter = strFooter
  Debug.Print myWs.Name
Next
 :

回答
投稿日時: 21/01/21 15:12:30
投稿者: mattuwan44

Sub test()
    Dim flgYesNo As Long
    Dim myFooter As String
    
    flgYesNo = MsgBox("センター用? はい/いいえ", vbYesNo)
    myFooter = IIf(flgYesNo = vbYes, "センター用", "一般用")
    
    Worksheets.Select   '全シートのグループ化
    ActiveSheet.PageSetup.CenterFooter = myFooter
    ActiveSheet.Select  'グループ化の解除
End Sub

 
ヘルプ さんの引用:
MsgBox 関数
2019/08/14
 
ダイアログ ボックスにメッセージを表示し、ユーザーがボタンをクリックするのを待機し、ユーザーがどのボタンをクリックしたかを示す整数を返します。

 
関数が返す値を変数に受けて、その値を再利用するようにしましょう。
 
また、
全部のシートが対象なら
Worksheets.Select
で、全部のシートをグループ化できますので、
そうしたらループの必要はないかと思いました。
あと、不要なSelectやActivateはしないようにすると、いいかなと思いました。

回答
投稿日時: 21/01/21 16:11:08
投稿者: Suzu

mattuwan44さん
 

引用:
全部のシートが対象なら
Worksheets.Select
で、全部のシートをグループ化できますので、
そうしたらループの必要はないかと思いました。

 
引用:
Worksheets.Select '全シートのグループ化
    ActiveSheet.PageSetup.CenterFooter = myFooter

 
Excel2013 の環境にて手動で 全てのワークシートを Selectし、
グループ化の上でページ-フッターの設定を行っても
設定できるのはアクティブシートに対してのみでした。
提示頂いたコードでも同様でした。
 
・全シートをグループ化 しても、コードの中で指定しているのは、ActiveSheet であり
 グループ化されたシートに対してではない
・選択されたシートと言う意味であれば、ActiveWindow.SelectedSheets に対しての操作となりそうであるが
 PageSetUpプロパティーは、Sheetsコレクションではなく Sheetオブジェクトのプロパティー
 
なので、グループ化を行っても、コレクション一括での設定は難しいと考えています。
見落としがあればご教示ください。

投稿日時: 21/01/21 16:39:09
投稿者: 銀河

  回答者の皆様にはお世話様になります。
 ご指導ありがとうございます。
 メッセージBOXでyesを押したのか、NOを押したのか判別方法がわかりません。
 
Sub フッダー変更() 'フッダー変更マクロ
  Dim myWs As Worksheet
  Dim mybtn As Integer
  Dim strcf As String
   
  Application.ScreenUpdating = False
 
      Worksheets("表紙").Activate
        Range("a1").Activate
                                                    '4 '32
      MsgBox "この計算書は(公財)情報センター用ですか?", vbYesNo + vbQuestion
' ここでboxのvbyesだと6が戻り、vbNOだと7が戻ります。
'        この戻り値の取得の仕方がわかりません。
    mybtnの変数を6だと判別しなくなる、どうすれば良いでしょうか。
                          '戻り値6
                If mybtn = vbYes Then
                    strcf = " 〇〇〇〇 "
                                '戻り値7
                ElseIf mybtn <> vbNo Then
                    strcf = " △△△△ "
                End If
                 
         For Each myWs In Worksheets
                       
                   myWs.PageSetup.CenterFooter = strcf
                    
                  Debug.Print myWs.Name
         Next
      Worksheets("表紙").Activate
        Range("a1").Activate
       
  Application.ScreenUpdating = True
End Sub

回答
投稿日時: 21/01/21 17:07:57
投稿者: WinArrow
投稿者のウェブサイトに移動

銀河 さんの引用:

 
 メッセージBOXでyesを押したのか、NOを押したのか判別方法がわかりません。

操作者が操作したボタン情報を変数に取得する必要があります。
というアドバイスを読んでいませんか?
再掲
     myBtn = MsgBox("この計算書は(公財)情報センター用ですか?", vbYesNo + vbQuestion) 
    
    If myBTN = vbYes Then 

回答
投稿日時: 21/01/21 17:15:23
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:
MsgBox "この計算書は(公財)情報センター用ですか?", vbYesNo + vbQuestion
 ' ここでboxのvbyesだと6が戻り、vbNOだと7が戻ります。
'        この戻り値の取得の仕方がわかりません。
     mybtnの変数を6だと判別しなくなる、どうすれば良いでしょうか。
                          '戻り値6
                 If mybtn = vbYes Then
                     strcf = " 〇〇〇〇 "
                                 '戻り値7
                 ElseIf mybtn <> vbNo Then
                     strcf = " △△△△ "
                 End If
                  

 
別案
If vbyes = Msgbox("この計算書は(公財)情報センター用ですか?", vbYesNo + vbQuestion) Then
    strcf = " 〇〇〇〇 "
Else
    strcf = " △△△△ "
End If
 
こうすると、4行になります。すっきりすると思いますが・・・・

回答
投稿日時: 21/01/21 17:22:41
投稿者: mattuwan44

引用:
Excel2013 の環境にて手動で 全てのワークシートを Selectし、
グループ化の上でページ-フッターの設定を行っても
設定できるのはアクティブシートに対してのみでした。

 
あれー?
2019ではすべてのシートに設定できているように見えますが、、、、
(印刷までして確認してませんが。)

投稿日時: 21/01/21 17:47:52
投稿者: 銀河

  WinArrow様
 ご指導ありがとうございます。
 ご提案頂いたマクロで思った通りの判定をするようになりました。
 
 
 
 
  別案
  If vbyes = Msgbox("この計算書は(公財)情報センター用ですか?", vbYesNo + vbQuestion) Then
      この式の意味はvbyesの戻り値は6だからvbyesを押せば6で等しい。
    strcf = " 〇〇〇〇 "
  Else
      そうでない場合は
     strcf = " △△△△ "
  End If
  こうゆう意味と理解で宜しいでしょうか。
 
  明日にでも解決済みにします。
 
 回答者の皆様、ありがとうございます。

回答
投稿日時: 21/01/21 19:00:41
投稿者: WinArrow
投稿者のウェブサイトに移動

銀河 さんの引用:

  別案
  If vbyes = Msgbox("この計算書は(公財)情報センター用ですか?", vbYesNo + vbQuestion) Then
      この式の意味はvbyesの戻り値は6だからvbyesを押せば6で等しい。
    strcf = " 〇〇〇〇 "
  Else
      そうでない場合は
     strcf = " △△△△ "
  End If
  こうゆう意味と理解で宜しいでしょうか。

 
理解としては、OKでしょう。
>  If vbyes = Msgbox("この計算書は(公財)情報センター用ですか?", vbYesNo + vbQuestion) Then
は、
  If 6 = Msgbox("この計算書は(公財)情報センター用ですか?", vbYesNo + vbQuestion) Then
 
とか
  If Msgbox("この計算書は(公財)情報センター用ですか?", vbYesNo + vbQuestion) = 6 Then
と記述しても同じです。
 
通常
コメントを記述する場合は、
戻り値 = 6
と記述した場合、その意味をコメントしておく
と思いますが、
戻り値 = vbYes
を値が「6」である・・・というようなコメントはしつこくないでしょうか?
それより
YesNo
というボタンはありません。
「はい」「いいえ」の2つのボタンが表示されます。
ですから、「はい」を押すと「vbYes」が返る
と書いた方がよいのでは?

回答
投稿日時: 21/01/21 22:54:12
投稿者: たらのり

こんばんは
 
MsgBox関数は,第二引数に vbYesNo を指定すると,
ダイアログにメッセージとともに,2つのボタン
[はい] と [いいえ] を表示します。
 
そこで [はい] を押下すると 6 が,[いいえ] を押下
すると 7 が返されます。
この関数が返す値を「戻り値」といいます。
 
その「戻り値」を判定すればよいわけですが,戻り値を
受け取るには以下のようにします:
 

ret = MsgBox("メッセージ", vbYesNo)

ダイアログで [はい] を押下したとき,ret には 6 が
格納されるので,以下のような判定が可能です:
 
If ret = 6 Then
    ' [はい] が押下されたときの処理
Else
    ' それ以外のときの処理
End If

 
ここで 6 のことなのですけど,他にも 7 やらあるそう
ですが,[はい] → 6 とか,[いいえ] → 7 とか,
一々読み替えるのが大変です。
 
そこで,6 には vbYes という名前を,7 には vbNo という
名前を付けました。
名前を付けるとはピンとこないかもしれませんが,
とにかく,vbYes と書いた場合,その vbYes は 6 を直接
書いたことと同じ意味になります(強引w)。
 
 
以下のコードを実行すると,「vbYes は 6 だ!!」のダイア
ログが表示されるはずです。
 
If vbYes = 6 Then
   Call MsgBox("vbYes は 6 だ!!")
End If

なぜなら,vbYes は 6 を直接書いたことと同じなので,
上のコードは以下のコードと同じ意味だからです:
 
If 6 = 6 Then
   Call MsgBox("vbYes は 6 だ!!")
End If

 
最初のコードを少しだけ修正するとどうでしょうか:
 
ret = MsgBox("メッセージ", vbYesNo)

If ret = vbYes Then    ' 修正前は If ret = 6 Then
    ' [はい] が押下されたときの処理
Else
    ' それ以外のときの処理
End If

どうですかね。右辺に 6 と記述するより vbYes を使用した
方がずいぶんプログラムの意味が分かりやすくなりませんか?
 
ていすう。いや,何でもないです。。。

回答
投稿日時: 21/01/22 08:57:56
投稿者: Suzu

mattuwan44 さんの引用:
引用:
Excel2013 の環境にて手動で 全てのワークシートを Selectし、
グループ化の上でページ-フッターの設定を行っても
設定できるのはアクティブシートに対してのみでした。

 
あれー?
2019ではすべてのシートに設定できているように見えますが、、、、
(印刷までして確認してませんが。)

 
当方でも印刷までは確認していません。
プレビューでは アクティブシートのみでした。
 
 
グループ化を行っても ActiveSheet は 1シートのみ の認識でしたので
 
ActiveSheet.PageSetup.CenterFooter = myFooter
 
で 複数シートの設定が行えるのは 釈然としないですが、
確認されたとの事ですので、仕様として何か変わったのでしょうね。

投稿日時: 21/01/22 09:07:32
投稿者: 銀河

 回答者の皆様方
 丁寧なご説明ありがとうございました。msgboxの戻り値の取得の仕方
 理解できました。
 これからも分からない事ばかりだと思いますので、ご指導をお願いし
 解決させて頂きます。