Excel VBA質問箱 IV

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

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


3758 / 13646 ツリー ←次へ | 前へ→

【60320】スクロールについて質問 もものき 09/2/9(月) 18:55 質問[未読]
【60321】Re:スクロールについて質問 ichinose 09/2/9(月) 19:37 発言[未読]
【60323】Re:スクロールについて質問 もものき 09/2/10(火) 9:06 発言[未読]
【60325】Re:スクロールについて質問 SS 09/2/10(火) 10:20 発言[未読]
【60328】Re:スクロールについて質問 neptune 09/2/10(火) 11:06 発言[未読]
【60335】Re:スクロールについて質問 SS 09/2/10(火) 19:06 発言[未読]
【60333】Re:スクロールについて質問 もものき 09/2/10(火) 15:49 発言[未読]
【60334】Re:スクロールについて質問 SS 09/2/10(火) 18:48 発言[未読]
【60338】Re:スクロールについて質問 neptune 09/2/10(火) 21:45 発言[未読]

【60320】スクロールについて質問
質問  もものき  - 09/2/9(月) 18:55 -

引用なし
パスワード
   はじめまして。
エクセルを利用してまだ初心者なのですが
VBAの便利さに魅了され一生懸命勉強中です。

仕事でエクセルをしょっちゅう使ってる社員がおり
エンターキーで任意の項目に飛ぶようにしたいと
言ったので、フォームを作りテキスト入力した物を
最後にシートに貼り付けるといった簡単なプログラム(?)を作り
差し上げたところ大変感謝されいい気になってました。

すると、もう少し改良して欲しいと言われ
難しくなければできるよと請けました。

現状、30行の入力項目があります。
30行もの項目を1画面で表示できないので
タブで分けて10行づつ表示し、入力完了したら次のタブに
移動して追記していくイメージのフォームです。

これをスクロールで表示して欲しいと言われたので
フォームを細長い物にすれば自動的にウインドウズが
スクロールバーを付けてくれるだろうと安請け合いしました。

ですが、実際はスクロールバーが表示されず
ウインドウの長さも制限があると知りました。

ツールボックスにスクロールバーのアイテムがあるので
これを利用すればできるのだろうと推測はできますが
ビジュアル操作で簡単に設置できるのでしょうか?

または簡単な構文で処理できるものでしょうか。

よろしくご指導をお願いします。

【60321】Re:スクロールについて質問
発言  ichinose  - 09/2/9(月) 19:37 -

引用なし
パスワード
   ▼もものき さん:
こんばんは。

こんなイメージですか?

新規ブックにて、試してください。

ユーザーフォームを一つ作成してください(UserForm1)

コントロールはコードで作成しますから、何も配置しないでください。

UserForm1のモジュールに

'=============================================================
Private Sub UserForm_Initialize()
  Dim g0 As Long
  With Me
    .Width = 250
    .Height = 250
    .ScrollBars = fmScrollBarsVertical
    .ScrollHeight = 1000
    For g0 = 1 To 30
     With .Controls.Add("Forms.TextBox.1", , True)
       .Left = 20
       .Width = 100
       .Top = 30 * g0
     End With
    Next
  End With
End Sub


標準モジュールに

'=======================================================
Sub sample()
  UserForm1.Show
End Sub


これでsampleを実行してみてください。

30個のテキストボックスがスクロールして入力可能になると思います。


実際には、UserForm_Initializeで行っていることは
全て、事前設定が可能です。

キーポイントは、

    .Height = 250
    .ScrollBars = fmScrollBarsVertical
    .ScrollHeight = 1000

この辺りのコードです。

調べてみてください。

【60323】Re:スクロールについて質問
発言  もものき  - 09/2/10(火) 9:06 -

引用なし
パスワード
   ▼ichinose さん:
>▼もものき さん:
>こんばんは。
>
>こんなイメージですか?
>
>新規ブックにて、試してください。
>
>ユーザーフォームを一つ作成してください(UserForm1)
>
>コントロールはコードで作成しますから、何も配置しないでください。
>
>UserForm1のモジュールに
>
>'=============================================================
>Private Sub UserForm_Initialize()
>  Dim g0 As Long
>  With Me
>    .Width = 250
>    .Height = 250
>    .ScrollBars = fmScrollBarsVertical
>    .ScrollHeight = 1000
>    For g0 = 1 To 30
>     With .Controls.Add("Forms.TextBox.1", , True)
>       .Left = 20
>       .Width = 100
>       .Top = 30 * g0
>     End With
>    Next
>  End With
>End Sub
>
>
>標準モジュールに
>
>'=======================================================
>Sub sample()
>  UserForm1.Show
>End Sub
>
>
>これでsampleを実行してみてください。
>
>30個のテキストボックスがスクロールして入力可能になると思います。
>
>
>実際には、UserForm_Initializeで行っていることは
>全て、事前設定が可能です。
>
>キーポイントは、
>
>    .Height = 250
>    .ScrollBars = fmScrollBarsVertical
>    .ScrollHeight = 1000
>
>この辺りのコードです。
>
>調べてみてください。


ありがとうございます。
意味わからないまま、指示通りにやればスクロールバー付きの
窓が現れました。

ですがサッパリ意味わからないです><

やっぱりマウス操作でビジュアル処理は無理でしょうか?

【60325】Re:スクロールについて質問
発言  SS  - 09/2/10(火) 10:20 -

引用なし
パスワード
   ▼もものき さん:
▼ichinose さん:

横から失礼します
>やっぱりマウス操作でビジュアル処理は無理でしょうか?
現状の物の何処が不満なのか、どのような処理がしたいのかを
示さないと対応のしようがありませんよ。

>>>ですが、実際はスクロールバーが表示されず
>>>ウインドウの長さも制限があると知りました。

>>>ツールボックスにスクロールバーのアイテムがあるので
>>>これを利用すればできるのだろうと推測はできますが
>>>ビジュアル操作で簡単に設置できるのでしょうか?

私がichinose さんの回答を参考に作るとしたらこんな感じです。

UserFormのプロパティで
ScrollBarsを 2 - fmScrollBarsVertical (縦方向スクロールバーを表示する)
ScrollHeightを 1050 (スクロール領域の高さを指定する)
UserFormにTextBoxを30個自分で準備する。(ichinose さんのは高度すぎて自分には扱いきれませんでした。イベントが発生しない?)
UserFormのHeightを 350。(1度に表示されるのが10個に調整)

切替操作は、UserForm1のモジュールに以下を記述
Private Sub UserForm_Initialize()
  '特に記述無し
End Sub

Private Sub TextBox10_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  Me.ScrollTop = 350
End Sub

Private Sub TextBox20_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  Me.ScrollTop = 700
End Sub

【60328】Re:スクロールについて質問
発言  neptune  - 09/2/10(火) 11:06 -

引用なし
パスワード
   ▼SS さん:
横のその又横から失礼

>UserFormにTextBoxを30個自分で準備する。(ichinose さんのは高度すぎて自分には扱いきれませんでした。イベントが発生しない?)

ht tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=53313;id=excel
に以前サンプルを書いたのでよかったら参考にしてください。

動的に、新たに作成したTextBoxをClassにセットしていけばいけると思います。

【60333】Re:スクロールについて質問
発言  もものき  - 09/2/10(火) 15:49 -

引用なし
パスワード
   ▼SS さん:
>▼もものき さん:
>▼ichinose さん:
>
>横から失礼します
>>やっぱりマウス操作でビジュアル処理は無理でしょうか?
>現状の物の何処が不満なのか、どのような処理がしたいのかを
>示さないと対応のしようがありませんよ。
>
>>>>ですが、実際はスクロールバーが表示されず
>>>>ウインドウの長さも制限があると知りました。
>
>>>>ツールボックスにスクロールバーのアイテムがあるので
>>>>これを利用すればできるのだろうと推測はできますが
>>>>ビジュアル操作で簡単に設置できるのでしょうか?
>
>私がichinose さんの回答を参考に作るとしたらこんな感じです。
>
>UserFormのプロパティで
>ScrollBarsを 2 - fmScrollBarsVertical (縦方向スクロールバーを表示する)
>ScrollHeightを 1050 (スクロール領域の高さを指定する)
>UserFormにTextBoxを30個自分で準備する。(ichinose さんのは高度すぎて自分には扱いきれませんでした。イベントが発生しない?)
>UserFormのHeightを 350。(1度に表示されるのが10個に調整)
>
>切替操作は、UserForm1のモジュールに以下を記述
>Private Sub UserForm_Initialize()
>  '特に記述無し
>End Sub
>
>Private Sub TextBox10_Exit(ByVal Cancel As MSForms.ReturnBoolean)
>  Me.ScrollTop = 350
>End Sub
>
>Private Sub TextBox20_Exit(ByVal Cancel As MSForms.ReturnBoolean)
>  Me.ScrollTop = 700
>End Sub


色々ご指導有難うございます。
ですがサッパリなので断念しなくてはいけない様子です。

やりたい事をきちんと説明するように言われましたので
たぶん私にはできない世界と承知の上で記載します。

VBA画面で、フォームを用意し
そこにペタペタとテキストボックスやラベル等配置できます。
レイアウトセンスさえあれば誰でも操作でき
テキストの文字列や数値も単純な命令でセルに移行できます。

そんな程度のレベルでスクロールバーは取り扱えるのかが質問でした。

ツールボックスにスクロールバーがあるので
それを設置し、プロパティ欄の簡単な記載や、
スクロールバー設置後、テキストボックスをどこかに
放り込めば機能するものなんでしょうか?が問いです。

ですが、とてもそんな簡単なレベルのお話ではなかったようで
諦めようと思います。

これで伝わったでしょうか

【60334】Re:スクロールについて質問
発言  SS  - 09/2/10(火) 18:48 -

引用なし
パスワード
   ▼もものき さん:

私が発言したばかりに、VBAの技術向上を志す方がガッカリする結果になるのは、悲しいのでもう少しお付き合い下さい。

>ツールボックスにスクロールバーがあるので
>それを設置し、プロパティ欄の簡単な記載や、
>スクロールバー設置後、
UserFormのプロパティ(表示されていなければ、メニューバーの表示⇒プロパティ ウィンドウで表示する)でScrollBarsの項目を 
>>2 - fmScrollBarsVertical
に設定すると部品を貼り付けなくてもUserFormに縦方向スクロールバーが表示されます。手動スクロールさせるだけであればこれだけで出来ます。

>>Private Sub TextBox10_Exit(ByVal Cancel As MSForms.ReturnBoolean)
>>  Me.ScrollTop = 350
>>End Sub
この命令で10番目に作った(一般的にですが)TextBoxに入力しEnterを押すと
UserForm一面分スクロールUPし11番目のTextBoxが一番上に表示されるようになります。

【60335】Re:スクロールについて質問
発言  SS  - 09/2/10(火) 19:06 -

引用なし
パスワード
   ▼neptune さん:

ありがとうございます。
名前を確認して指定したExitイベントが発生しない時点でClassモジュールかな?
と考えたのですが、Classと聞いただけでしり込みしてしまう自分では
説明用に使うのは論外とのことで逃げましたが、これを機会に勉強してみます。

>▼SS さん:
>横のその又横から失礼
>
>>UserFormにTextBoxを30個自分で準備する。(ichinose さんのは高度すぎて自分には扱いきれませんでした。イベントが発生しない?)
>
>ht tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=53313;id=excel
>に以前サンプルを書いたのでよかったら参考にしてください。
>
>動的に、新たに作成したTextBoxをClassにセットしていけばいけると思います。

【60338】Re:スクロールについて質問
発言  neptune  - 09/2/10(火) 21:45 -

引用なし
パスワード
   皆さんこんにちは。

なんか止めを刺したようで、目覚めが悪いのでサンプルを1つ

新規UserForm

TextBox 8個 とScrollBar 1個を配置

TextBox は以下のように配置してください。

TextBox1    TextBox5
TextBox2    TextBox6
TextBox3    TextBox7
TextBox4    TextBox8

ScrollBar は矢印の右側。

以下をUserFormモジュールにコピペ
Option Explicit

Private Type Rec
  f1 As Long
  f2 As Long
End Type

Private mRec(1 To 10) As Rec

Private Sub ScrollBar1_Change()
  Call ShowData(ScrollBar1.Value)
End Sub

Private Sub UserForm_Initialize()
  Dim i As Long
  'データ作成
  For i = 1 To 10
    mRec(i).f1 = i
    mRec(i).f2 = i * 10
  Next i
  'スクロールバー設定
  With Me.ScrollBar1
    .Min = 1
    .Max = 10
    .SmallChange = 1
  End With
  
End Sub

'表示
Private Sub ShowData(pIndex As Long)
  If pIndex > 0 Then
    If pIndex < 8 Then
      TextBox1.Text = mRec(pIndex).f1
      TextBox2.Text = mRec(pIndex + 1).f1
      TextBox3.Text = mRec(pIndex + 2).f1
      TextBox4.Text = mRec(pIndex + 3).f1
      TextBox5.Text = mRec(pIndex).f2
      TextBox6.Text = mRec(pIndex + 1).f2
      TextBox7.Text = mRec(pIndex + 2).f2
      TextBox8.Text = mRec(pIndex + 3).f2
    End If
  End If
End Sub

実行してみて下さい。
力技ですが、こんな方法もあるという例です。

ちなみに、コントロールを数百個も使うのは止めた方が無難です。
動作が不安定になるらしいです。
ちなみにVBでは1windowで許されるのは255個?の制限があります。
Excelでも準拠しといた方が間違いないです。

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