Excel VBA質問箱 IV

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

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


1916 / 13645 ツリー ←次へ | 前へ→

【70845】ユーザフォームのコマンドボタンとスピンボタンの連動のさせ方について Jto 12/1/6(金) 9:45 質問[未読]
【70846】Re:ユーザフォームのコマンドボタンとスピ... UO3 12/1/6(金) 10:30 発言[未読]
【70847】Re:ユーザフォームのコマンドボタンとスピ... UO3 12/1/6(金) 10:40 回答[未読]
【70848】Re:ユーザフォームのコマンドボタンとスピ... Jto 12/1/6(金) 12:00 質問[未読]
【70850】Re:ユーザフォームのコマンドボタンとスピ... UO3 12/1/6(金) 17:10 発言[未読]
【70851】Re:ユーザフォームのコマンドボタンとスピ... UO3 12/1/6(金) 18:04 発言[未読]
【70852】Re:ユーザフォームのコマンドボタンとスピ... UO3 12/1/6(金) 21:11 発言[未読]
【70857】Re:ユーザフォームのコマンドボタンとスピ... UO3 12/1/7(土) 10:27 発言[未読]
【70866】Re:ユーザフォームのコマンドボタンとスピ... UO3 12/1/9(月) 15:35 回答[未読]
【70903】Re:ユーザフォームのコマンドボタンとスピ... Jto 12/1/13(金) 21:49 質問[未読]
【70908】Re:ユーザフォームのコマンドボタンとスピ... UO3 12/1/16(月) 17:07 発言[未読]
【71052】Re:ユーザフォームのコマンドボタンとスピ... Jto 12/1/27(金) 10:19 質問[未読]
【71054】Re:ユーザフォームのコマンドボタンとスピ... UO3 12/1/27(金) 10:32 発言[未読]
【71055】Re:ユーザフォームのコマンドボタンとスピ... UO3 12/1/27(金) 10:58 発言[未読]

【70845】ユーザフォームのコマンドボタンとスピン...
質問  Jto  - 12/1/6(金) 9:45 -

引用なし
パスワード
   名簿の検索をユーザーフォームで作成しています

A列に検索したい名簿の「あ」「か」「さ」・・・のインデックスが打たれています。
これを手がかりに、コマンドボタン「あ」「か」・・・「わ」の10個のボタンで
そのセル位置までスクロールさせ、ユーザーフォームのリストボックス連動させ、その後の移動はスピンボタン粗送りでボタンを押してリストで細かく送り正しい氏名に到達したく
コマンドボタンとスピンボタンを連動させたいのですが・・・

コードを書きましたが・・・
例えば「た」の付く氏名までは、コマンドボタンでスクロール出来るのですが
スピンボタンに反映させる方法を教えてください。
リストボックスはスピンボタン1刻みで10刻みにしています。

Private Sub CommandButton5_Click()
Dim i As Long
 For i = 2 To Cells(Rows.Count, 1).End(xlUp).row
 If Cells(i, 1) Like "た*" Then
   Cells(i, 1).Select
   ActiveWindow.ScrollRow = Cells(i, 1).row
   Exit For
 End If
 Next i
 SpinButton1_Change
End Sub
Private Sub CommandButton10_Click()
Dim i As Long
 For i = 2 To Cells(Rows.Count, 1).End(xlUp).row
 If Cells(i, 1) Like "わ*" Then
   Cells(i, 1).Select
   ActiveWindow.ScrollRow = Cells(i, 1).row
 End If
 Next i
End Sub


Private Sub UserForm_Initialize()
Dim itemCount As Long
 itemCount = Worksheets("sheet2").Range("B" & Rows.Count).End(xlUp).row
   Me.SpinButton1.Max = WorksheetFunction.RoundUp(itemCount / 10, 0) - 1
 itemCount = Worksheets("sheet2").Range("B" & Rows.Count).End(xlUp).row
   Me.SpinButton1.Max = WorksheetFunction.RoundUp(itemCount / 10, 0) - 1
 SpinButton1_Change
End Sub

Private Sub SpinButton1_Change()
Dim num As Long
Dim itemCount As Long

 With Me.SpinButton1
   num = 10
  If .Value = .Max Then
   If itemCount Mod 10 <> 0 Then
    num = itemCount Mod 10
   End If
  End If
Me.ListBox1.List = Worksheets("sheet2").Range("B" & .Value * 10 + 1).Resize(num, 2).Value
End With
End Sub

【70846】Re:ユーザフォームのコマンドボタンとス...
発言  UO3  - 12/1/6(金) 10:30 -

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

回答の前に確認させてください。

>A列に検索したい名簿の「あ」「か」「さ」・・・のインデックスが打たれています。

ということですから、A列は、ひらがな1文字ですよね。
コードでは "た*" といったワイルドカードでLike判定をされていますが?

>コマンドボタンとスピンボタンを連動させたいのですが・・・

意図はわかりそうな気がしますが、コマンドボタンで選んだ氏名がリストボックスに表示され
そのリストボックスから選ぶんですよね。
シートをスクロールさせる意味はないと思うのですが?
(したがって、スピンボタンそのものが必要ないのでは?)

【70847】Re:ユーザフォームのコマンドボタンとス...
回答  UO3  - 12/1/6(金) 10:40 -

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

もし上の理解が正しければ、アップされたコードの
Initializeルーティンも、SpinButton1_Changeルーティンも不要かと。
ユーザーフォームモジュールを以下だけにするとどうでしょうか。

Private Sub CommandButton1_Click()
  Call ListSet(1)
End Sub

Private Sub CommandButton2_Click()
  Call ListSet(2)
End Sub

Private Sub CommandButton3_Click()
  Call ListSet(3)
End Sub

Private Sub CommandButton4_Click()
  Call ListSet(4)
End Sub

Private Sub CommandButton5_Click()
  Call ListSet(5)
End Sub

Private Sub CommandButton6_Click()
  Call ListSet(6)
End Sub

Private Sub CommandButton7_Click()
  Call ListSet(7)
End Sub

Private Sub CommandButton8_Click()
  Call ListSet(8)
End Sub

Private Sub CommandButton9_Click()
  Call ListSet(9)
End Sub

Private Sub CommandButton10_Click()
  Call ListSet(10)
End Sub

Private Sub ListSet(idx As Long)
  Dim ch As String
  Dim pos As Long
  Dim cnt As Long
  Dim myR As Range
  
  ch = Array("あ", "か", "さ", "た", "な", "は", "ま", "や", "ら", "わ")(idx - 1)
  Set myR = Range("A2", Range("A" & Rows.Count).End(xlUp))
  cnt = WorksheetFunction.CountIf(myR, ch)
  If cnt = 0 Then
    MsgBox "[" & ch & "]から始まる名前は登録されていません"
  Else
    pos = WorksheetFunction.Match(ch, myR, 0) + 1
    ListBox1.Clear
    ListBox1.List = Cells(pos, 1).Resize(cnt, 2).Value
  End If
    
  Set myR = Nothing

End Sub

【70848】Re:ユーザフォームのコマンドボタンとス...
質問  Jto  - 12/1/6(金) 12:00 -

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

ありがとうございます。
「あ」行の中での氏名がかなりあり、
その「あ」行の中でスピンを掛けて求める氏名にたどり着きたいのです。

>もし上の理解が正しければ、アップされたコードの
>Initializeルーティンも、SpinButton1_Changeルーティンも不要かと。
>ユーザーフォームモジュールを以下だけにするとどうでしょうか。

リストボックスには氏名が入り、2列目でこれで行けますが
>  ListBox1.List = Cells(pos, 2).Resize(cnt, 2).Value

そのほか諸々のデータも付随してテキストボックスに出す予定です。

スピンとの連動の方法を教えていただけませんでしょうか。

【70850】Re:ユーザフォームのコマンドボタンとス...
発言  UO3  - 12/1/6(金) 17:10 -

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

要件、ようやく理解しました。
リストボックス内の膨大なライン数を10行ずつ進めたいということですね。
今、エクセルのない環境ですので回答案アップは、早くて、3日後になります。
その前に、ほかの方から回答があるといいのですが。

【70851】Re:ユーザフォームのコマンドボタンとス...
発言  UO3  - 12/1/6(金) 18:04 -

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

こんばんは
お伝えしたとおりコードを作る環境がないのですが対応案を2つほど。

1.意図されているスピンボタンの値と連動させる方式。
 これは、たとえば手動でリストを先送りしていった状態でスピンボタンで進めると
 実際には、後戻りすることもありえますので自分がやるなら使わない方法ですが。
 1)まずMax,Minのセットは、私がアップしたListSetで該当のリストをセットした後。
   ListCountを10でわった商がMAx(ただしあまりがゼロなら、商 - 1)
   で、MinとValueを1。
 2)SpinButtonのChangeイベントで (Value -1)*10 をTopIndexに。

2.別案
  スピンボタンの値は使いません。
 1)Downイベントで
   現在のTopIndex-10 と 0 のいずれか大きいほうをTopIndexに。
 2)Upイベントで
   現在のTopIndex+10 と Count-1 のいずれか小さいほうをTopIndexに。

【70852】Re:ユーザフォームのコマンドボタンとス...
発言  UO3  - 12/1/6(金) 21:11 -

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

こんばんは
アップしてから気がつきました。
ユーザーフォームを表示した時点ではリストボックスに何もセットされていません。
この状態でスピンボタンを押すと障害が発生します。
なので、
●Initializeルーティンで、たとえば"あ"でListSetしておく。
●あるいは、プロパティでスピンボタンのEnabledプロパティかLockedプロパティで
 選択無効にしておいて、ListSetでリストボックスにリストがセットされた時点で選択有効にする。
いずれかの手当てが必要ですね。

【70857】Re:ユーザフォームのコマンドボタンとス...
発言  UO3  - 12/1/7(土) 10:27 -

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

おはようございます

アップされたこーどをよく読みましたら、私がアップした2つの対応案のいずれでもなく、
"あ"行なら"あ"行で、それをさらに10行ずつのリストにわけ、それをスピンボタンで順番に表示させるということですね。
であれば、アップした対応案の最初のものを、応用すればOKになると思います。
いずれにしましても、私からコード案をお届けできるのはあさってになりまさう。
それまでに、ご自分で完成できるかもしれませんんね。

【70866】Re:ユーザフォームのコマンドボタンとス...
回答  UO3  - 12/1/9(月) 15:35 -

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

以下ではいかがでしょうか。
サンプルとしてリストボックスにはシートから3列、B,C,D列をセットするコードにしてあります。
またリスト元ネタシート名を"Sheet1"としています。
このあたりは、実際のものにチューニングしてください。
プロパティでListBox1のColumnCountを適切なものに、またSpinButton1のEnableをFalseに
設定しておいてください。

Option Explicit

Dim pos As Long
Dim cnt As Long
Dim skip As Boolean

Private Sub CommandButton1_Click()
  Call ListGet(1)
End Sub

Private Sub CommandButton2_Click()
  Call ListGet(2)
End Sub

Private Sub CommandButton3_Click()
  Call ListGet(3)
End Sub

Private Sub CommandButton4_Click()
  Call ListGet(4)
End Sub

Private Sub CommandButton5_Click()
  Call ListGet(5)
End Sub

Private Sub CommandButton6_Click()
  Call ListGet(6)
End Sub

Private Sub CommandButton7_Click()
  Call ListGet(7)
End Sub

Private Sub CommandButton8_Click()
  Call ListGet(8)
End Sub

Private Sub CommandButton9_Click()
  Call ListGet(9)
End Sub

Private Sub CommandButton10_Click()
  Call ListGet(10)
End Sub

Private Sub ListGet(idx As Long)
  Dim ch As String
  Dim myR As Range
  
  With Sheets("Sheet1")  'リストがあるシート名
  
    ch = Array("あ", "か", "さ", "た", "な", "は", "ま", "や", "ら", "わ")(idx - 1)
    Set myR = .Range("A2", .Range("A" & Rows.Count).End(xlUp))
    cnt = WorksheetFunction.CountIf(myR, ch)
    If cnt = 0 Then
      MsgBox "[" & ch & "]から始まる名前は登録されていません"
    Else
      pos = WorksheetFunction.Match(ch, myR, 0) + 1
      With SpinButton1
        skip = True
        SpinButton1.Enabled = True
        .Min = 1
        .Max = cnt \ 10 + 1
        If cnt Mod 10 = 0 Then .Max = .Max - 1
        .Value = 1
        skip = False
      End With
      Call ListSet
    End If
  
  End With
  
  Set myR = Nothing

End Sub


Private Sub SpinButton1_Change()
  
  If Not skip Then ListSet
  
End Sub

Private Sub ListSet()
  Dim f As Long
  Dim t As Long
  Dim z As Long
  Dim i As Long
  Dim tbl() As String

  If SpinButton1.Value = 0 Then Exit Sub
  
  f = (SpinButton1.Value - 1) * 10 + pos
  t = f + 10 - 1
  z = pos + cnt - 1
  If t > z Then t = z
    
  ReDim tbl(1 To t - f + 1, 1 To 3)  'リストを仮に3列とする
  
  With Sheets("Sheet1")  'リストがあるシート名
    For i = f To t
      tbl(i - f + 1, 1) = .Cells(i, "B").Value 'リストの1列目にB列を
      tbl(i - f + 1, 2) = .Cells(i, "C").Value 'リストの1列目にC列を
      tbl(i - f + 1, 3) = .Cells(i, "D").Value 'リストの1列目にD列を
    Next
  End With
  
  ListBox1.List = tbl

End Sub

【70903】Re:ユーザフォームのコマンドボタンとス...
質問  Jto  - 12/1/13(金) 21:49 -

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

大変お世話になります。
色々とご検討いただきありがとうございます。

以下のコードで
indexが有効範囲ではありません
>      tbl(i - f + 1, 1) = .Cells(i, "B").Value 'リストの1列目にB列を
>      tbl(i - f + 1, 2) = .Cells(i, "C").Value 'リストの1列目にC列を
>      tbl(i - f + 1, 3) = .Cells(i, "D").Value 'リストの1列目にD列を

となって、リストボックスに表示がされません。
何かが問題ではないかと思いますが・・・
お時間がありましたら、また、よろしくお願いします

【70908】Re:ユーザフォームのコマンドボタンとス...
発言  UO3  - 12/1/16(月) 17:07 -

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

ちょっと旅に出ていたので返事が遅れました。
こちらでは、提示したコードで問題なく動いていますので、当方で認識したシートレイアウトと
そちらのシートレイアウトが異なっているのかもしれません。

こちらのSheet1は1行目がタイトル行、A列はあ、か、さ、た・・・・等のインデックス。
で、「あ」なら「あ」が連続しています。(とびとびのデータは想定していません)
テストデータとしては、そのほかにB,C,D列にデータを配置しています。

【71052】Re:ユーザフォームのコマンドボタンとス...
質問  Jto  - 12/1/27(金) 10:19 -

引用なし
パスワード
   ▼UO3 さん:
お忙しい中、ご返事ありがとうございます。

>「あ」なら「あ」が連続しています。(とびとびのデータは想定していません)
>テストデータとしては、そのほかにB,C,D列にデータを配置しています。

エクセルのシート1の表は、ご指示にしたがって
.....A.....B.....C.....D
1...検索..氏名...年齢...住所
2...あ....安部...35.....東京都
3...あ....
:
このような表にしています。
B列はリストに出ますが、C・D列は表示されません。
表に問題あるでしょうか


With Sheets("Sheet1")  'リストがあるシート名
   For i = f To t
     tbl(i - f + 1, 1) = .Cells(i, "B").Value 'リストの1列目にB列を
     tbl(i - f + 1, 2) = .Cells(i, "C").Value 'リストの1列目にC列を
     tbl(i - f + 1, 3) = .Cells(i, "D").Value 'リストの1列目にD列を
    Next
End With


このコード上ではB・C・D列の1行ずつ拾っていることが、ステップインで確認できていますが。
最後の表示ではリストボックス1では1列(A列)だけになります。
スピンボタンは、うまく連動していて感心しています、ありがとうございます 

それから、A列に例えば「あ」を埋めると、体裁がいまいちですので、一つだけにすることはできませんでしょうか。

急ぎませんので、お時間が許せば、回答をお願いします。

【71054】Re:ユーザフォームのコマンドボタンとス...
発言  UO3  - 12/1/27(金) 10:32 -

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

こんにちは

>このコード上ではB・C・D列の1行ずつ拾っていることが、ステップインで確認できていますが。
>最後の表示ではリストボックス1では1列(A列)だけになります。

コードでも書くこともできたんですが、このリストボックスのColumnCountには列数を設定してあるということを
想定しています。
プロパティで設定されましたか?

>それから、A列に例えば「あ」を埋めると、体裁がいまいちですので、一つだけにすることはできませんでしょうか。

上記回答をいただいたあと、コードを考えてみます。

【71055】Re:ユーザフォームのコマンドボタンとス...
発言  UO3  - 12/1/27(金) 10:58 -

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

リストボックスの3列表示についてはプロパティ設定でOKになると思います。
で、ご要望のA列の件ですが・・・・
できないことはないのですが、コードを大幅に変更することが必要で、かつ、やや煩雑なものになりそうです。

「体裁」だけのことでしたら、以下で妥協いただけませんか?

・A列には ,必ず全行、あ、か、さ・・・を記入。
・条件付書式で
 1)A列を選択
 2)その状態(A1がアクティブセル)で、以下の条件付書式を設定。
  「数式」が =AND(ROW()<>1,A1=OFFSET(A1,-1,0))
  書式で文字色を「白」に。

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