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

Excel2007 でVBA利用しています。

任意の範囲(B1:D4)を選択してコマンドボタンを押すと、
Userform.Show となるプログラムがあります。

このとき、コントロールがフォームに移ってしまい、
選択した範囲(B1:D4)を明示する枠が消えてしまいます。


複数範囲を選択したあと「セルの書式設定」を選んだときのように、
選択範囲が明示された状態を維持するには、どうしたらよいでしょうか?

分かる方、ご教示いただけないでしょうか。

A 回答 (2件)

こんにちは。



私は、マクロが未熟なせいか、変わった手順に思いました。

ふつうは、UserForm を立ち上げてから、選択します。
ただし、UserFormは、モードレスで立ち上げるのが通例です。
もちろん、ご質問者さんの方法もないとは言えません。

試行錯誤で確認できました。

>選択範囲が明示された状態を維持するには、どうしたらよいでしょうか?

まず、理由なのですが、それは、ActiveX コントロールを二重に使ったことが原因なのです。UserForm はActiveX コントロールですし、ボタンも同じですし、シートもそのひとつなので、オブジェクトによる取得が飛んでしまいます。

つまり、原因は、CommandButton にあります。対処法は、フォームコントロールのボタンに変えてください。また、マクロのコードも、そちら(標準モジュール側)に移してください。

立ち上げたモードが、モーダル/モードレスでも、選択範囲を失うような現象は現れません。ただ、Excel 2000以降では、通例モードレスが中心になることが多いようです。

なお、UserForm立ち上げの前に、選択範囲を確保するためにするコードは必要です。変数は、任意です。

'標準モジュール

Public myRng As Range  'これでユーザーフォームに橋渡し
Sub ボタン1_Click()
 If TypeName(Selection) = "Range" Then
   Set myRng = Selection
 End If
 UserForm1.Show 0  '0=vbModeless モードレス モード
End Sub
--------
UserFormモジュール

Private Sub CommandButton1_Click()
 If Not myRng Is Nothing Then
   myRng.Interior.ColorIndex = 3
 End If
End Sub
----------

Public myRng As Range これをパブリック変数と読んで、氷樹モジュールの一番上方のプロシージャの外に書くことです。そうすると、プロジェクト内で共通に使えるようになります。ただ、あまり多数は作らないほうがよいそうです。
    • good
    • 0
この回答へのお礼

フォームコントロールに変更で、求める結果が得られました(#^_^#)

ActiveXの使い方で、勉強になりました(^_^)/
ありがとう!

お礼日時:2016/05/10 13:07

フォームを呼び出す前に、罫線をつけたり、セルに網掛けをし、戻った時に元に戻す処理を行えば、それらしく見えると思います。

    • good
    • 0

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