Excel VBA質問箱 IV

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

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


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

【20029】リストボックスで選択している数 ととりん 04/11/24(水) 21:41 質問[未読]
【20031】Re:リストボックスで選択している数 ichinose 04/11/24(水) 21:59 回答[未読]
【20033】Re:リストボックスで選択している数 ととりん 04/11/25(木) 6:35 質問[未読]
【20034】Re:リストボックスで選択している数 ichinose 04/11/25(木) 7:53 発言[未読]
【20045】Re:リストボックスで選択している数 ととりん 04/11/25(木) 18:39 お礼[未読]

【20029】リストボックスで選択している数
質問  ととりん  - 04/11/24(水) 21:41 -

引用なし
パスワード
   こんばんは。またまたわからないことがあり、お力をお借りしたくてやってきました。

Excelのブックには、取引先別に複数のシートがあります。(月間の取引先数によって異なります)
そのシート名をユーザーフォームのリストボックスに表示させ、複数選択が可能な状態にしています。

教えていただきたいのが、リストボックスで選択しているリストの数のカウントの方法です。

ワークシートの数は、下記のコードだとわかっているのですが、
   
  t = Worksheets.Count

リストボックスで選択しているリストの数の取得方法がわかりません。
どなたかわかる方教えていただけませんでしょうか?

よろしくお願いいたします。

【20031】Re:リストボックスで選択している数
回答  ichinose  - 04/11/24(水) 21:59 -

引用なし
パスワード
   ▼ととりん さん:
こんばんは。

>こんばんは。またまたわからないことがあり、お力をお借りしたくてやってきました。
>
>Excelのブックには、取引先別に複数のシートがあります。(月間の取引先数によって異なります)
>そのシート名をユーザーフォームのリストボックスに表示させ、複数選択が可能な状態にしています。
>
>教えていただきたいのが、リストボックスで選択しているリストの数のカウントの方法です。
>
>ワークシートの数は、下記のコードだとわかっているのですが、
>   
>  t = Worksheets.Count
>
>リストボックスで選択しているリストの数の取得方法がわかりません。
>どなたかわかる方教えていただけませんでしょうか?
>
>よろしくお願いいたします。
リストボックスがListbox1だとして、コマンドボタン(Commandbutton1)の
クリックイベントで処理する例で


'===================================================
Private Sub CommandButton1_Click()
  Dim cnt As Long
  With ListBox1
   MsgBox "リストの数:" & .ListCount
   cnt=0
   For idx = 0 To .ListCount - 1
     if .Selected(idx)=true then cnt = cnt + 1 
     'cnt = cnt + .Selected(idx) なんて方法もありますが・・
     Next
   MsgBox "選択している数:" & cnt
   'msgbox "選択している数:" & -cnt
   End With
End Sub

確認してみて下さい。

【20033】Re:リストボックスで選択している数
質問  ととりん  - 04/11/25(木) 6:35 -

引用なし
パスワード
   ichinose 様

おはようございます。早々の解答ありがとうございました。

選択しているリストの数は無事確認できました。
しかし。。。 どうもしてもやりたいと思っていたことができません。

実は、複数選択しているシートを新しいブックにコピーしたいのですが、
上手くいきません。

当初、下記のコードを考えたのですが、どうしてもワークシート枚数分ループするため
最終のシートを選択したときには、シート名の後に[,]はつきませんが、それ以外は付いてしまい、
シートの選択が上手くいかないのです。

そこで、選択したシート枚数分のループを行うことを考え、選択しているシートの数の数え方を質問しましたが、
どうも、根本的に間違っているのか...
こんがらがってしまいました。

よろしければ、どうすれば、リストボックスで複数選択したシートを
新しいブックにコピーすることが出来るのか教えていただけませんでしょうか?
よろしくお願いいたします。


'コマンドボタンクリック時
Private Sub CommandButton1_Click()
 
  Dim theItem As String
  Dim i, t As Integer

   
  t = Worksheets.Count
  i = 0
  
  Do
    If i <= t - 1 Then
     
      If ListBox1.Selected(i) = True Then
       theItem = theItem & ListBox1.List(i) + ","
      End If
    ElseIf i = t - 1 Then
      If ListBox1.Selected(i) = True Then
        theItem = theItem & ListBox1.List(i)
      End If
    End If
    i = i + 1
  Loop Until i = t

  Sheets(theItem).Select
  Sheets(theItem).Copy
 
End Sub

【20034】Re:リストボックスで選択している数
発言  ichinose  - 04/11/25(木) 7:53 -

引用なし
パスワード
   ▼ととりん さん:
おはようございます。

>
>おはようございます。早々の解答ありがとうございました。
>
>選択しているリストの数は無事確認できました。
>しかし。。。 どうもしてもやりたいと思っていたことができません。
>
>実は、複数選択しているシートを新しいブックにコピーしたいのですが、
>上手くいきません。
>
>当初、下記のコードを考えたのですが、どうしてもワークシート枚数分ループするため
>最終のシートを選択したときには、シート名の後に[,]はつきませんが、それ以外は付いてしまい、
>シートの選択が上手くいかないのです。
>
>そこで、選択したシート枚数分のループを行うことを考え、選択しているシートの数の数え方を質問しましたが、
>どうも、根本的に間違っているのか...
>こんがらがってしまいました。
>
>よろしければ、どうすれば、リストボックスで複数選択したシートを
>新しいブックにコピーすることが出来るのか教えていただけませんでしょうか?
>よろしくお願いいたします。
>
>
>'コマンドボタンクリック時
>Private Sub CommandButton1_Click()
> 
>  Dim theItem As String
>  Dim i, t As Integer
>
>   
>  t = Worksheets.Count
>  i = 0
>  
>  Do
>    If i <= t - 1 Then
>     
>      If ListBox1.Selected(i) = True Then
>       theItem = theItem & ListBox1.List(i) + ","
>      End If
>    ElseIf i = t - 1 Then
>      If ListBox1.Selected(i) = True Then
>        theItem = theItem & ListBox1.List(i) '---1
>      End If
>    End If
>    i = i + 1
>  Loop Until i = t
>
>  Sheets(theItem).Select
>  Sheets(theItem).Copy
> 
>End Sub
↑これだとリストボックスの最後のメンバを選択しない限り、1の処理はおこないませんよ。
又、Sheets()内は、シート名のカンマ区切りの文字列で選択できましたっけ?
(マクロの記録を使って確認して下さい)

以下のようにして確認して下さい。
'=========================================================
Private Sub CommandButton1_Click()
  Dim theItem() As String
  Dim i As Integer
  Dim sdx As Long
  sdx = 0 '選択してメンバ数
  With ListBox1
   For i = 0 To .ListCount - 1
    If .Selected(i) = True Then
      ReDim Preserve theItem(sdx)
      theItem(sdx) = .List(i)
      sdx = sdx + 1
      End If
    Next i
   End With
  If sdx > 0 Then
    With ThisWorkbook
     'コピーが目的ならSelectの必要はありませんよ
     .Sheets(theItem()).Copy
     End With
    End If
  Erase theItem()
End Sub

【20045】Re:リストボックスで選択している数
お礼  ととりん  - 04/11/25(木) 18:39 -

引用なし
パスワード
   ichinose さま

ありがとうございました!!

思うとおりの動作が確認できました。
私が、1日半悩んでいたことだったので、とてもすっきり致しました。
ありがとうございました。

それにしても...
本当にすぐに解答をよせてくださる、ichinoseさんに感謝です。
ありがとうございました。


>↑これだとリストボックスの最後のメンバを選択しない限り、1の処理はおこないませんよ。
>又、Sheets()内は、シート名のカンマ区切りの文字列で選択できましたっけ?
>(マクロの記録を使って確認して下さい)


実はまだ、確認段階だったのです。

>  Sheets(theItem).Select
>  Sheets(theItem).Copy

のコードの前で、メッセージボックスにtheItemの内容を表示させて
確認していた段階でした。
そこで、悶々と悩んでいたのです。

ほんとうにすっきりと致しました。
ありがとうございました。
私も、もっともっと勉強します。


>
>以下のようにして確認して下さい。
>'=========================================================
>Private Sub CommandButton1_Click()
>  Dim theItem() As String
>  Dim i As Integer
>  Dim sdx As Long
>  sdx = 0 '選択してメンバ数
>  With ListBox1
>   For i = 0 To .ListCount - 1
>    If .Selected(i) = True Then
>      ReDim Preserve theItem(sdx)
>      theItem(sdx) = .List(i)
>      sdx = sdx + 1
>      End If
>    Next i
>   End With
>  If sdx > 0 Then
>    With ThisWorkbook
>     'コピーが目的ならSelectの必要はありませんよ
>     .Sheets(theItem()).Copy
>     End With
>    End If
>  Erase theItem()
>End Sub

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