Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7469 / 13644 ツリー ←次へ | 前へ→

【38837】同じ環境下に有るマクロが動きません。 06/6/12(月) 7:25 質問[未読]
【38857】Re:同じ環境下に有るマクロが動きません。 漂流民 06/6/12(月) 21:23 発言[未読]
【38869】Re:同じ環境下に有るマクロが動きません。 06/6/13(火) 7:42 質問[未読]
【38898】Re:同じ環境下に有るマクロが動きません。 漂流民 06/6/13(火) 22:53 発言[未読]
【38905】Re:同じ環境下に有るマクロが動きません。 06/6/14(水) 7:46 質問[未読]
【38942】Re:同じ環境下に有るマクロが動きません。 漂流民 06/6/14(水) 23:22 発言[未読]
【39006】Re:同じ環境下に有るマクロが動きません。 06/6/15(木) 19:35 お礼[未読]

【38837】同じ環境下に有るマクロが動きません。
質問    - 06/6/12(月) 7:25 -

引用なし
パスワード
   おはようございます。

いつもお世話になっています。

なぜか自分と同じ環境下であるパソコンでマクロが動きません。
(同じブックを5台のパソコンにコピーして使用している内、
1台のみマクロが動かない)

OS:ウインドウズXPホーム
ソフト:エクセル2003

あるブックのシートモジュール(?)に2つのイベントプロシージャが有るのですが、
下記の(2)のイベントは動きますが、(1)のイベントが動きません。
何かエクセルの設定、又はコマンドバーの呼び名が違うのでしょうか?

(1)
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
  If Target.Count = 1 And Target.Column = 5 Then
   Application.CommandBars("cell").Reset
   With Application.CommandBars("cell").Controls.Add
      .Caption = "最終行にコピー(&B)"
      .OnAction = "EndCopy"
      .BeginGroup = True
   End With
  Else
   Application.CommandBars("cell").Reset
  End If
End Sub

(2)
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Dim R, C As Integer
   R = ActiveCell.Row
   C = ActiveCell.Column
     Range("a1:iv65536").Interior.ColorIndex = 0
     Range("a1:b1").Interior.ColorIndex = 35
     Range("a3:n3").Interior.ColorIndex = 37
     Rows(R).Interior.ColorIndex = 34
     Columns(C).Interior.ColorIndex = 36
End Sub

ちなみに、そのブックの標準モジュールに

Sub EndCopy()
  Dim C, R As Long

  C = ActiveCell.Column
  R = ActiveCell.Row
 
  Application.EnableEvents = False
   Range(Cells(R, C), Cells(R, 256).End(xlToLeft)).Copy
   Cells(65536, C).End(xlUp).Offset(1, 0).Select
   ActiveSheet.Paste
   Application.CutCopyMode = False
  Application.EnableEvents = True
End Sub

どうかよろしくお願いします。

【38857】Re:同じ環境下に有るマクロが動きません。
発言  漂流民  - 06/6/12(月) 21:23 -

引用なし
パスワード
   ▼吉 さん:
こんばんわ

回答ではなくて申し訳ないのですが、

>あるブックのシートモジュール(?)に2つのイベントプロシージャが有るのですが、
>下記の(2)のイベントは動きますが、(1)のイベントが動きません。
>何かエクセルの設定、又はコマンドバーの呼び名が違うのでしょうか?
>
>(1)
>Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
その動かなかったパソコンでこのイベントの発生は確認されましたか?

もしされていなかったら、これを実行してみてください
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
  MsgBox "イベント発生OK"
End Sub

メッセージボックスが表示されたら私の予想はハズレなので振り出しです。

表示されなかったら以下の方法で確認してください。
VBAのテキストボックスを作ってコードを

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  MsgBox "キーボード" & KeyCode
End Sub

Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
  MsgBox "マウス" & Button
End Sub

としてそのテキストボックスを該当のパソコンで右クリックし、
メッセージボックスの内容をご連絡ください。

【38869】Re:同じ環境下に有るマクロが動きません。
質問    - 06/6/13(火) 7:42 -

引用なし
パスワード
   ▼漂流民 さん:

おはようございます。
返事が、遅くなりましたが確認しました。

>もしされていなかったら、これを実行してみてください
>Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
>  MsgBox "イベント発生OK"
>End Sub
>
>メッセージボックスが表示されたら私の予想はハズレなので振り出しです。

上記は正常に表示されました。

>表示されなかったら以下の方法で確認してください。
>VBAのテキストボックスを作ってコードを
>
>Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
>  MsgBox "キーボード" & KeyCode
>End Sub
>
>Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
>  MsgBox "マウス" & Button
>End Sub
>
>としてそのテキストボックスを該当のパソコンで右クリックし、
>メッセージボックスの内容をご連絡ください。

上記も一応確認してみました。
左クリックの場合 マウス1
右クリックの場合 マウス2 でした。

よろしくお願いします。

【38898】Re:同じ環境下に有るマクロが動きません。
発言  漂流民  - 06/6/13(火) 22:53 -

引用なし
パスワード
   ▼吉 さん:
こんばんわ

ハズレでしたか(笑) すみませんm(__)m
キーボードの右クリックが割り当てられているのかも?
と思ったのですが、よく考えたら挙動が違うのでそれはないですね!?
逆にイベントが発生してて良かったです。
(通常、ブックやシートではキーボードイベントは取得できない)

ということは、BeforeRightClick内のコードでトラブっているようです。
で一番クサいのは最初に吉 さんも言っていた”CommandBar”かと・・・
なので、下記を試してみてください。


新規ブック(他にマクロのない状態)で、標準モジュールに
このコードを入れてtest1を”動かなかったPC”で実行してください。

Sub test1()
  With Application.CommandBars("cell").Controls.Add
     .Caption = "Test(&T)"
  End With
End Sub

Sub test1r()
   Application.CommandBars("cell").Reset
End Sub

シートで右クリックを確認して”Test”メニューがあるようでしたら
またまた私の予想はハズレです。
※確認が終わったらtest1rを実行してください

表示されなかったら以下の方法を試してみてください。

同様にしてtest2を実行

Sub test2()
  Dim i As Long
  
  With Application
   For i = 1 To .CommandBars.Count
    With .CommandBars(i)
     If .Name = "Cell" Then
      With .Controls.Add
        .Caption = "Test(&T)"
      End With
     End If
    End With
   Next i
  End With
End Sub

Sub test2r()
  Dim i As Long
  
  With Application
   For i = 1 To .CommandBars.Count
    With .CommandBars(i)
     If .Name = "Cell" Then
      .Reset
     End If
    End With
   Next i
  End With
End Sub

シートで右クリックを確認して”Test”メニューの有無
をご連絡ください。
※確認が終わったらtest2rを実行してください

【38905】Re:同じ環境下に有るマクロが動きません。
質問    - 06/6/14(水) 7:46 -

引用なし
パスワード
   ▼漂流民 さん:

おはようございます。
下記のコードで正常に『Test』メニューが表示され、又、リセットも
正常に出来ました。

>Sub test2()
>  Dim i As Long
>  
>  With Application
>   For i = 1 To .CommandBars.Count
>    With .CommandBars(i)
>     If .Name = "Cell" Then
>      With .Controls.Add
>        .Caption = "Test(&T)"
>      End With
>     End If
>    End With
>   Next i
>  End With
>End Sub
>
>Sub test2r()
>  Dim i As Long
>  
>  With Application
>   For i = 1 To .CommandBars.Count
>    With .CommandBars(i)
>     If .Name = "Cell" Then
>      .Reset
>     End If
>    End With
>   Next i
>  End With
>End Sub

上記をどのように、Worksheet_BeforeRightClickイベントへ組み込めば、
良いのでしょうか?
For〜Nextステートメントで、CommandBars.Count(コマンドバーの数?)
If .Name = "Cell" Then(コマンドバーの数の名前がCellであれば・・・ですよね?)
初心者なためコードの意味がいまいち呑み込めません。
宜しければ、ご教授をよろしくお願いします。

【38942】Re:同じ環境下に有るマクロが動きません。
発言  漂流民  - 06/6/14(水) 23:22 -

引用なし
パスワード
   ▼吉 さん:
こんばんわ
書いているうちに文が長くなってしまいました。
■で区切られた下は時間がある時にでも読んでください^^


>下記のコードで正常に『Test』メニューが表示され、又、リセットも
>正常に出来ました。
今度は予想が当たったようです^^
実はちょっとカラクリがありまして「正常」とは言えないんです。

>上記をどのように、Worksheet_BeforeRightClickイベントへ組み込めば、
>良いのでしょうか?

とりあえず組み込んだコードです。

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
  Dim i As Long
  With Application
   For i = 1 To .CommandBars.Count
    With .CommandBars(i)
     If .Name = "Cell" Then
      .Reset
      If Target.Count = 1 And Target.Column = 5 Then
       With .Controls.Add
        .Caption = "最終行にコピー(&B)"
        .OnAction = "EndCopy"
        .BeginGroup = True
       End With
      End If
     End If
    End With
   Next i
  End With
End Sub


ただこのコードにはちょっと問題がありまして・・・
というのもエクセルの中には「Application.CommandBars("cell")」が
デフォルトで”2つ”あります。
下記コードを試してみてください
(エクセルで使用されているCommandBar全ての各項目情報を
表示します、たぶん100件ぐらい出るはずです)

Sub test()
  Dim i As Long
  With Application
   For i = 1 To .CommandBars.Count
    With .CommandBars(i)
     Cells(i, 1) = .Index
     Cells(i, 2) = .Name
     Cells(i, 3) = .NameLocal
    End With
   Next i
  End With
End Sub

環境によって違うと思うのですが、20行目台あたりに
”Cell”、”Column”、”Row”がそれぞれ2つあると思います。
これが意味するのは、
上は、シートの表示状態が”標準”時のコマンドバー、
下は、”改ページプレビュー”時のコマンドバー
ということになります。
なので、もしかしたら”改ページプレビュー”の”Cell”が認識されているのかも?
と当たりをつけて前回のようなテストコード作成しました。
つまりCommandBarの.Name が "Cell"のもの全てに.Controls.Addしてみたという訳です。
”改ページプレビュー”でも追加されていると思うので確認してみてください。
(吉 さんの最初のコードもそのPCでは”改ページプレビュー”で機能しているはずです)

という訳で、「”改ページプレビュー”にも追加される」のを承知の上で、
問題ないようでしたら使用してください。

ただ通常、Application.CommandBars("cell")で指定してやるとIndex順位が上の
”標準”時のコマンドバー、が選択されるはずですが、”改ページプレビュー”時のが
選択されるということはCommandBarのIndex順位が狂っている、
早い話、エクセルがバグってる可能性が高いので再セットアップされることをお奨めします。


■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

>初心者なためコードの意味がいまいち呑み込めません。
>宜しければ、ご教授をよろしくお願いします。
ではちょっと解説を^^

>For〜Nextステートメントで、CommandBars.Count(コマンドバーの数?)
そうです。
コマンドバーの数が100個なら
For i = 1 To 100
ということになります。

>If .Name = "Cell" Then(コマンドバーの数の名前がCellであれば・・・ですよね?)
たぶんこちらがよく分かっていないのでは?
If CommandBars(i).Name = "Cell" Then の
CommandBars(i) は Index が i の CommandBarsということで、
その Name が "Cell" ならば、ということになります。
で、たぶん Index がちょっと引っかかると思うので、

分かりやすくシートを例にすると(デフォルトのブック状態)
1. Worksheets("Sheet1").Select
2. Worksheets(1).Select
1.と2.は同じ動作をします。
1.はシートの名前で、2.はシートの Index番号でシートを指定しています。
シートの名前を変えると1.はエラーになりますが、2.は問題ありません。

逆に、"Sheet2"を削除すると"Sheet3"の Index番号が2になるので
3. Worksheets("Sheet3").Select
4. Worksheets(3).Select
3.は問題ありませんが4.がエラーになります。

つまり、(言い回しが合っているかは分かりませんが・・・)
Index番号はオブジェクトが作成された順に欠番なしで割り当てられている
ということです。

この理屈が分かれば、
例えば、不特定枚数のシートの中で有るか無いか分からない"test"という名前のシートを探し、
該当するシートが有ればセルのA1に”OK”と表示することができます
For i = 1 To ThisWorkbook.Worksheets.Count
  If Worksheets(i).Name = "test" Then
    Worksheets(i).Range("A1").Value = "OK"
  End If
Next i
これと同じ事をCommandBarでしたということです。


ついでに吉 さんのコードについて少し・・・

>Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
>  If Target.Count = 1 And Target.Column = 5 Then
>   Application.CommandBars("cell").Reset
>   With Application.CommandBars("cell").Controls.Add
>      .Caption = "最終行にコピー(&B)"
>      .OnAction = "EndCopy"
>      .BeginGroup = True
>   End With
>  Else
>   Application.CommandBars("cell").Reset
>  End If
>End Sub

これは条件を満たしていてもいなくても
>   Application.CommandBars("cell").Reset
が実行されているのでIf文の中に入れる必要はないと思います。

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
  Application.CommandBars("cell").Reset
  If Target.Count = 1 And Target.Column = 5 Then
   With Application.CommandBars("cell").Controls.Add
      .Caption = "最終行にコピー(&B)"
      .OnAction = "EndCopy"
      .BeginGroup = True
   End With
  End If
End Sub


あと、
>  Dim R, C As Integer
もそうですが
>  Dim C, R As Long
これは
  Dim C
  Dim R As Long
としているのと同じです。
これで確認してみてください
  MsgBox "Cのデータ型は" & TypeName(C) & " Rのデータ型は" & TypeName(R)
なので共にLong型にしたい場合は
  Dim C As Long, R As Long
のようにします。


なんだかダラダラと長文になってしまいスイマセン
意味が分からないところがあれば、また気軽に質問してください^^

【39006】Re:同じ環境下に有るマクロが動きません。
お礼    - 06/6/15(木) 19:35 -

引用なし
パスワード
   ▼漂流民 さん:
こんばんわ。
ありがとうございます!! 下記のコードで、思い通りの操作が出来ました。

>Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
>  Dim i As Long
>  With Application
>   For i = 1 To .CommandBars.Count
>    With .CommandBars(i)
>     If .Name = "Cell" Then
>      .Reset
>      If Target.Count = 1 And Target.Column = 5 Then
>       With .Controls.Add
>        .Caption = "最終行にコピー(&B)"
>        .OnAction = "EndCopy"
>        .BeginGroup = True
>       End With
>      End If
>     End If
>    End With
>   Next i
>  End With
>End Sub

ピボットテーブルなどで集計するためのデータなので、改ページプレビューにした場合でも、
問題ないので、使用させて頂きます。

漂流民 さんのおっしゃる通り、改ページプレビュー時に、自分が作った最初のコードで機能していました。

エクセル(Office)の再インストールを試みて見ましたが、駄目でした。
また、時間の有るときに再セットアップしてみようと思います。

Indexについての、分かりやすいご教授ありがとうございます。
今回のご教授のおかげで、Indexとはどういうものか分かりました。
今後ステップアップ出来るよう、いろいろやってみようと思います。
本当にありがとうございました。
今後もどうぞ、宜しくお願いします。

7469 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free