人に聞けない痔の悩み、これでスッキリ >>

お世話になります。

エクセルで、上下に長いのでスクロールさせて使うユーザーフォームを作成しています。

このユーザーフォームが、ホイールでスクロールできないので、できるようにしたいのですがどうしたら良いでしょうか?

フリーソフトはインストールできない環境ですので、できればVBAで行いたいのですが方法はありますでしょうか。
よろしくお願いします。

A 回答 (1件)

こんにちは。

KenKen_SP です。

>ホイールでスクロールできないので、できるようにしたいのですが
>どうしたら良いでしょうか?

VBA のユーザーフォームはコントロールを含めてマウスホイールには
対応していません。

したがって、フリーソフトを使うか、どうしても Excel 単体で実現し
ようと思えば、下記のような方法をとることになります。

簡単に方法を説明すると、、、

ユーザーフォームをサブクラス化して、WM_MOUSEWHEEL メッセージを
をフックします。そして、コールバックプロシージャ内で wParam 値
を使ってユーザーフォームの ScrollTop プロパティーを操作します。

ただ、、

この方法は、OS の発するメッセージを横取り(フック)して、そこに
独自の処理を挟み込むわけですから、制御の仕方を間違えると最悪 OS
ごとハングアップしかねません。

難易度は高いのですが、ご希望があれば、サンプルコードを書きます。
どうでしょうか?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
お礼が遅くなりましてすみません。
ユーザーの方にアンケートしたところ、何か別の方策をたてる方がいいということでしたので、また代案を考えることになりました。
とても難しいということが分かって勉強になりました。
どうもありがとうございました。

お礼日時:2005/11/18 12:04

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QエクセルVBAでのマウススクロールの可否

エクセルVBA、具体的にはエクセル2000のVBAを使っています。そこで、マウススクロールができる場合とできない場合があって、どうしたらできるようになるのか知りたく思います。(マウススクロール、というのは、プログラミングの画面でマウスのスクロールをぐりぐりまわして、画面をスクロールさせること、を指しています)
使うPC、使うマウス、マウスドライバに因るものなのか、個々で設定可能なのか不可能なのか、について、どなたか何か教えていただけないでしょうか?

あと、少し別件になりますが、似たようなものとして、エクセル(ワークシート画面)で、コントロールを押しながらマウススクロールをすると拡大縮小、コントロール&シフトを押しながらマウススクロールで左右に移動(スクロール)ができる、というのがあります。前者は大抵の環境でできますが、私が試したところでは、後者ができる環境は、今回の質問のVBAスクロールができる環境と同じでした。

Aベストアンサー

VBE画面のスクロールはLogicoolのver9.0以前のマウスドライバーで出来てました。
バージョンアップに従い出来なくなり、不便だったのでわざわざ古いバージョンのドライバーを使ってましたが、OSをXPにした時にはついに使用不可となり、現在はフリーソフトの「どこでもホイール」を使ってます。

http://www2k.biglobe.ne.jp/~araken/index.htm

QエクセルVBAでフォームのListboxをスクロールするには?

エクセルVBAでフォームのListboxをスクロールするには?
ワークシート上に貼り付けたリストボックスがあります。
このリストボックスはOLEObjectではなくフォームのリストボックスです。

For Each lb In .ListBoxes
If lb.ListCount <= 4 Then
lb.ListIndex = 1
Else
lb.ListIndex = 16
ここで16番目が見えるようにスクロールしたいのです。
End If
Next lb

このスクロールさせる方法がわかりません。
ご教示いただければ幸いです。

Aベストアンサー

>手動スクロールの動きが変ですし
失礼。
'-----------------------------------------------------------------
Sub sbChange()
  'ListBoxes(1)の表示行数でMXを設定
  Const MX As Long = 11
  Dim x As Long
  With ActiveSheet
    x = n - .ScrollBars(1).Value + 1
    If x < 1 Or x > MX Then
      .ListBoxes(1).ListIndex = 0
    Else
      .ListBoxes(1).ListIndex = x
    End If
  End With
End Sub
'-----------------------------------------------------------------
Sub test()
  Dim x
  x = InputBox("ListIndex")
  With ActiveSheet
    .ListBoxes(1).ListIndex = 1
    .ScrollBars(1).Value = x
    n = x
  End With
End Sub
'-----------------------------------------------------------------
Sub LbChange()
  With ActiveSheet
    n = .ListBoxes(1).ListIndex + .ScrollBars(1).Value - 1
  End With
End Sub
'-----------------------------------------------------------------
上記に差し替え&追加してsbChangeのMXを設定し、
LbChangeをListBoxes(1)にマクロ登録すれば少しはマシになります。
ですが、手が込み過ぎておすすめしないのは変わりありません。

また、
>モードレスなUserFormにListBoxを配置して使う方が良いと思います。
ここで書いたListBoxはActiveXコントロール(コントロールツールボックス)のListBoxの事です。
#もちろんExcel.ListBoxはUserFormに置けませんから
#お判りでしょうけど念のため。
#ActiveXコントロールは直接ワークシート上に配置するよりも
#UserFormに配置して使ったほうが不具合少なく、良いかと思ったもので。

>手動スクロールの動きが変ですし
失礼。
'-----------------------------------------------------------------
Sub sbChange()
  'ListBoxes(1)の表示行数でMXを設定
  Const MX As Long = 11
  Dim x As Long
  With ActiveSheet
    x = n - .ScrollBars(1).Value + 1
    If x < 1 Or x > MX Then
      .ListBoxes(1).ListIndex = 0
    Else
      .ListBoxes(1).ListIndex = x
    End If
  End With
End Sub
'--------------------------------------------------...続きを読む

Qエクセル VBA ユーザーフォームを閉じる

ユーザーフォームを開く時は
UserForm1.Showですが
閉じる時は?
UserForm1.Close
だとコンパイルエラーになります。
End
にするしかないですか?

Aベストアンサー

Unload Me とか Unload UserForm1 でユーザーフォームを閉じることができます。

Qユーザーフォームを表示中にシートの操作をさせるには

ユーザーフォームを表示中にシートの操作をさせる事はできるのでしょうか。
セルへの入力、画面のスクロールなどは、ユーザーフォームからマクロを実行させたり、.hideでユーザーフォームを一時的に隠すなどすればいいのでしょうが、そういう手段をとらないでユーザーフォームを表示中にシートの操作をさせる事はできるのでしょうか。

Aベストアンサー

ユーザフォームの
ShowModalプロパティを
falseにすればよいかと。

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

Qエクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?

エクセルのVBAでユーザーフォームの中に
テキストボックスとラベルがあります。

ラベルの縦幅とテキストボックスの縦幅は
同じです。(文字1行分くらい)

そのテキストボックスの左隣にラベルを置いて、
項目名的なものを表示させたいと思うのですが
ラベルの値が上に寄っているので、垂直方向に
中央揃えさせたいのですが、設定の仕方が
分からず困っています。

ちなみにエクセルはXPで、VBAは詳しくありません。
詳しくないけど調べながらちょっとずついろいろ
作業しています。

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

Aベストアンサー

文字の上下中央設定は、確かにできませんね。
代案ですが、次のような操作はいかがでしょうか。

1.双方を選択した状態でプロパティを表示し、AutuSize の値を True にする。
2.前回のようにコントロールの位置を上下中央で揃える。
3.各コントロールの長さ(幅)や文字サイズを調整する。

QExcel VBAで、ユーザーフォームの値を、モジュールで使用したい。

VBA初心者です。(おそらく)基本的な質問で、申し訳ありません。
ユーザーフォーム1には、テキストボックス1とコマンドボタン1が配置されているとします。

Sub TEST ()
Dim N
Userform1.Show
MsgBox N
End Sub

Private Sub CommandButton1_Click()
Dim N
N = TextBox1.Text
UserForm1.Hide
End Sub

Sub TESTを実行した時に、ユーザーフォーム1からNの値を引き継ぐには、どうしたら良いのでしょうか?よろしくお願いします。

Aベストアンサー

'モジュールに変数宣言(グローバル変数)
'Public 宣言すると他のモジュールやフォームと
'共有できる変数になります。
Public AA As String

'sample
'A1 を実行する。

Sub A1()
Call A2
AA = InputBox("input", , AA)
End Sub

Sub A2()
AA = InputBox("input", , AA)
End Sub

QエクセルVBAでテキストボックスの値の取得と変更について

エクセルのVBAを使ってシート上のテキストボックスのテキストを取得・変更するマクロを作成したいと思っていますがうまく行きませんので、お知恵を拝借したいとおもいます。

環境:WindowsXPでオフィス2002
状況:
エクセルブックa.xlsのシートに「コントロールツールボックス」のテキストボックスを配置(オブジェクト名はTEXTBOX_C)
エクセルブックb.xlsにコードを書き、a.xlsのTEXTBOX_CのプロパティのValueかTextを取りだしたい

試した事:
コントロールを配置したシートに次のマクロ
TEXTBOX_C.Text = "これはコントロールのテキストボックス"
を書くとテキストボックスに文字を入れ込めますが、別のエクセルブックからだと上手く行きません。

また、オートシェイプのテキストボックスの場合は簡単に出きるのですが、コントロールツールボックスではどうしても上手く行きませんので、対象法などご存知の方いらっしゃいましたら教えてください

Aベストアンサー

エクセルを新規に開きました。
そのSheet1に(コントロールツールボックスの)TextBoxを貼りつけました。
そのBook1から、ファイル-開くで別ブックを開きました。
別ブックのMojule1側に下記を書いて
Sub test02()
MsgBox Workbooks("book1").Worksheets("sheet1").textbox1.Text
End Sub
を実行すると、Book1のTextBoxに入れた文字列が表示
されました。
がそんな質問ではないのですか。

QExcelVBA でリストリストボックスに列見出しをコーディングでつける

エクセルVBAのフォームにリストボックスを作り、データーベースから読み出したデータを表示させています。

この時、各列にテーブル名とはちがう列名をつけたいのですが、シートに記述するのではなく、コーディングでつける事は出来ませんか?

ControlTipTextに「test1;test;test3;」と指定してみたりしましたが、駄目でした。

どなたかご教授、あるいは出来ません、シートに隠しか方法はありません、と全否定をしてください。

Aベストアンサー

Wendy02 です。配列で入れる方法を考えてみましたが、できませんでした。

結局、他の方法としては、ListBox の 上に、白のLabel をそれぞれのColumnにあわせて、表示するぐらいしか、思いつきません。(これは、論外でしょうね)

列見出し(フィールド)は、もともと、Excelのワークシートの、データベース用の仕様のひとつだから、Rangeオブジェクトでしか、ListBox の Header に入れることは、出来ないようです。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング