Excel VBA質問箱 IV

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

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


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

【58855】ListBox戻り値-1の時の条件設定 ねろろ 08/11/14(金) 13:30 質問[未読]
【58857】Re:ListBox戻り値-1の時の条件設定 Jaka 08/11/14(金) 13:57 発言[未読]
【58867】Re:ListBox戻り値-1の時の条件設定 ねろろ 08/11/14(金) 20:05 お礼[未読]
【58858】Re:ListBox戻り値-1の時の条件設定 kanabun 08/11/14(金) 14:00 発言[未読]
【58865】Re:ListBox戻り値-1の時の条件設定 ねろろ 08/11/14(金) 19:43 お礼[未読]
【58862】Re:ListBox戻り値-1の時の条件設定 SS 08/11/14(金) 17:19 発言[未読]
【58866】Re:ListBox戻り値-1の時の条件設定 ねろろ 08/11/14(金) 20:00 お礼[未読]
【58868】Re:ListBox戻り値-1の時の条件設定 Hirofumi 08/11/14(金) 20:39 回答[未読]
【58869】Re:ListBox戻り値-1の時の条件設定 ねろろ 08/11/14(金) 22:28 お礼[未読]
【58877】Re:ListBox戻り値-1の時の条件設定 Hirofumi 08/11/15(土) 18:59 発言[未読]
【58891】Re:ListBox戻り値-1の時の条件設定 ねろろ 08/11/16(日) 15:22 お礼[未読]

【58855】ListBox戻り値-1の時の条件設定
質問  ねろろ E-MAIL  - 08/11/14(金) 13:30 -

引用なし
パスワード
   完全に行き詰っております。良いお知恵をお願いします。
ユーザーホーム上にListBoxを10個用意して、それぞれの戻り値で対象リストを検索し、完全に合致した行の先頭番号を、別のリストに表示するという、絞込みマクロです。
悩ましいのは、戻り値-1(選ばれない)が発生するからです。
戻り値-1は、いくつ発生するかわかりません。

Dim A, B....

With ListBox1
  A = .List(.ListIndex)
End With
With ListBox2
  B = .List(.ListIndex)
End With
......

Application.Range("c3").Select
If A = Selection.Offset(1, 0) And B = Selection.Offset(2, 0)....
というような条件式を考えてみましたが、これで戻り値-1の時も表現するなら、1,023もの式を書かなければならなくなってしまいます。
フィルタオプションやピボットテーブル、Much関数を使うことも考えましたが、やはり戻り値-1の表現がわかりません。
どなたかお分かりになる方、よろしくお願いします。

【58857】Re:ListBox戻り値-1の時の条件設定
発言  Jaka  - 08/11/14(金) 13:57 -

引用なし
パスワード
   ▼ねろろ さん:
>悩ましいのは、戻り値-1(選ばれない)が発生するからです。
>戻り値-1は、いくつ発生するかわかりません。
普通は、前もってインデックス番号で振り分けますけど。
処理を終了させるとか・・・。

【58858】Re:ListBox戻り値-1の時の条件設定
発言  kanabun  - 08/11/14(金) 14:00 -

引用なし
パスワード
   ▼ねろろ さん:
こんにちは。

>完全に行き詰っております。良いお知恵をお願いします。
>ユーザーホーム上にListBoxを10個用意して、それぞれの戻り値で対象リストを検索し、完全に合致した行の先頭番号を、別のリストに表示するという、絞込みマクロです。
>悩ましいのは、戻り値-1(選ばれない)が発生するからです。
>戻り値-1は、いくつ発生するかわかりません。

条件設定リスト用のシートを用意して、
その1行目に 対象テーブルの項目見出しを転記しておきます。
2行目をクリアしてから、
各リストボックスのListIndexが 0以上のとき、対応する列見出しの2行目に
List(ListIndex)の値を転記します。

こうしておいて、
>フィルタオプション
で行けませんか?

【58862】Re:ListBox戻り値-1の時の条件設定
発言  SS  - 08/11/14(金) 17:19 -

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

If A <> Selection.Offset(1, 0) And A <> -1 Then tmp(1)=1
If B <> Selection.Offset(2, 0) And B <> -1 Then tmp(2)=1
             ・
             ・
             ・
If J <> Selection.Offset(10, 0) And B <> -1 Then tmp(10)=1
For i=1 To 10
  tmp = tmp + tmp(i)
Next i
If tmp=0 then 一致
ではダメなんでしょうか?

>完全に行き詰っております。良いお知恵をお願いします。
>ユーザーホーム上にListBoxを10個用意して、それぞれの戻り値で対象リストを検索し、完全に合致した行の先頭番号を、別のリストに表示するという、絞込みマクロです。
>悩ましいのは、戻り値-1(選ばれない)が発生するからです。
>戻り値-1は、いくつ発生するかわかりません。
>
>Dim A, B....
>
>With ListBox1
>  A = .List(.ListIndex)
>End With
>With ListBox2
>  B = .List(.ListIndex)
>End With
>......
>
>Application.Range("c3").Select
>If A = Selection.Offset(1, 0) And B = Selection.Offset(2, 0)....
>というような条件式を考えてみましたが、これで戻り値-1の時も表現するなら、1,023もの式を書かなければならなくなってしまいます。
>フィルタオプションやピボットテーブル、Much関数を使うことも考えましたが、やはり戻り値-1の表現がわかりません。
>どなたかお分かりになる方、よろしくお願いします。

【58865】Re:ListBox戻り値-1の時の条件設定
お礼  ねろろ E-MAIL  - 08/11/14(金) 19:43 -

引用なし
パスワード
   ▼kanabun さんへ:
こんばんは。
早速のご指摘、ありがとうございます。
伺ったやり方でうまくいきそうです。
考えてみれば、-1のときは項目見出しに転記しないようにしておけば、フォルダオプション併用で対応できますね。
どうも、煮詰まりすぎていたようです。
本当にありがとうございました。

【58866】Re:ListBox戻り値-1の時の条件設定
お礼  ねろろ E-MAIL  - 08/11/14(金) 20:00 -

引用なし
パスワード
   ▼SS さん:
>▼ねろろ さん:
>
>If A <> Selection.Offset(1, 0) And A <> -1 Then tmp(1)=1
>If B <> Selection.Offset(2, 0) And B <> -1 Then tmp(2)=1
>             ・
>             ・
>             ・
>If J <> Selection.Offset(10, 0) And B <> -1 Then tmp(10)=1
>For i=1 To 10
>  tmp = tmp + tmp(i)
>Next i
>If tmp=0 then 一致
>ではダメなんでしょうか?
>
▼SS さんへ:
ありがとうございます。
複数の条件結果統合して、新しい変数に格納して、再度評価するんですね。
勉強になりました。
この記述方法なら、プロシージャをずいぶん小さくできそうです。
助かりました。

【58867】Re:ListBox戻り値-1の時の条件設定
お礼  ねろろ E-MAIL  - 08/11/14(金) 20:05 -

引用なし
パスワード
   ▼Jaka さん:
>▼ねろろ さん:
>>悩ましいのは、戻り値-1(選ばれない)が発生するからです。
>>戻り値-1は、いくつ発生するかわかりません。
>普通は、前もってインデックス番号で振り分けますけど。
>処理を終了させるとか・・・。


▼Jaka さんへ:
ご指摘ありがとうございました。
ほかの皆さんからのご指導もあって、何とか解決できそうです。

【58868】Re:ListBox戻り値-1の時の条件設定
回答  Hirofumi  - 08/11/14(金) 20:39 -

引用なし
パスワード
   ListIndexが-1の時、変数に"*"が入るようにして
比較をLike演算子で行ったらいいかも

UserFormにListBox1〜3が有るとします
データはSheet1に有り、C2:E2は列見出しとします
転記先はSheet2とします

Option Explicit

Private rngList As Range
Private lngRows As Long
Private vntA As Variant
Private vntB As Variant
Private vntC As Variant
Private rngResult As Range
Private lngWrite As Long

Private Sub CommandButton1_Click()

  Dim i As Long
  
  With rngList
    For i = 1 To lngRows
      If .Offset(i, 0).Value Like vntA Then
        If .Offset(i, 1).Value Like vntB Then
          If .Offset(i, 2).Value Like vntC Then
            lngWrite = lngWrite + 1
            rngResult.Offset(lngWrite).Resize(, 3).Value _
                = .Offset(i).Resize(, 3).Value
          End If
        End If
      End If
    Next i
  End With
  
End Sub

Private Sub CommandButton2_Click()

  Unload Me
  
End Sub

Private Sub ListBox1_Click()

  With ListBox1
    If .ListIndex > -1 Then
      vntA = .List(.ListIndex)
    End If
  End With
  
End Sub

Private Sub ListBox2_Click()

  With ListBox2
    If .ListIndex > -1 Then
      vntB = .List(.ListIndex)
    End If
  End With
  
End Sub

Private Sub ListBox3_Click()

  With ListBox3
    If .ListIndex > -1 Then
      vntC = .List(.ListIndex)
    End If
  End With
  
End Sub

Private Sub UserForm_Initialize()

  Dim i As Long
  Dim vntData As Variant
  
  Set rngList = Worksheets("Sheet1").Cells(2, "C")
  
  Set rngResult = Worksheets("Sheet2").Cells(2, "C")
  
  vntA = "*"
  vntB = "*"
  vntC = "*"

  With rngList
    lngRows = .Offset(Rows.Count - .Row).End(xlUp).Row - .Row
    For i = 0 To 2
      vntData = .Offset(1, i).Resize(lngRows).Value
      Unique Me.Controls("ListBox" & (i + 1)), vntData
    Next i
  End With
  
End Sub

Private Sub UserForm_Terminate()

  Set rngList = Nothing
  Set rngResult = Nothing
  
End Sub

Private Sub Unique(lstBox As MSForms.ListBox, vntData As Variant)

  Dim i As Long
  Dim j As Long
  Dim k As Long
  Dim vntList As Variant
  
  ReDim vntList(0)
  k = -1
  For i = 1 To UBound(vntData, 1)
    For j = 0 To k
      If vntData(i, 1) = vntList(j) Then
        Exit For
      End If
    Next j
    If j > k Then
      k = k + 1
      ReDim Preserve vntList(k)
      vntList(k) = vntData(i, 1)
    End If
  Next i
  
  lstBox.List = vntList

End Sub

【58869】Re:ListBox戻り値-1の時の条件設定
お礼  ねろろ E-MAIL  - 08/11/14(金) 22:28 -

引用なし
パスワード
   ▼Hirofumi さんへ:
長文でのご回答、ありがとうございます。
すばらしい内容だと思うのですが、私の知識レベルでは、半分程度しか理解できないようです。
冒頭ご案内いただいたLike演算子を使う方法ですが、ここでワイルドカードを使う必然性が、私にはプロシージャから読み取れませんでした。
また、最後に動的配列を使われていますが、格納した配列の吐き出し先がListoboxである点も良くわかりませんでした。
せっかくご案内いただきましたのに、こちらの理解不足で誠に申し訳ありません。
しばらく時間をかけて、送って頂いたプロシージャを分析させていただきます。
本当にありがとうございました。

【58877】Re:ListBox戻り値-1の時の条件設定
発言  Hirofumi  - 08/11/15(土) 18:59 -

引用なし
パスワード
   詳しく説明しないで、ごめんなさいね

>冒頭ご案内いただいたLike演算子を使う方法ですが、ここでワイルドカードを使う必然性が、
>私にはプロシージャから読み取れませんでした。

ListIndexが-1のListBoxが有る時、そのListBoxの項目を抽出条件から除外すると言う意味で考えています
今回提示したコードでは、ListBoxが3つ(本当は10との事ですが)として書いています
例えば、もしListBox1とListBox3が選択されて居て、ListBox2が選択されて居ない場合
抽出は、ListBox1の条件とListBox3の条件だけで抽出が行われます
理由は、「vntB = "*"」と成る為

        If .Offset(i, 1).Value Like vntB Then

の「.Offset(i, 1).Value Like vntB」の結果が常に「True」成る為、
「.Offset(i, 1).Value」の項目は、抽出条件から除外された事に成ります
今回はListBoxなので、UserFormが起動した状態では、一度選択されたListBoxを、
「ListIndex = -1」にコード上以外では出来ないと思いましたので
「UserForm_Initialize()」の中だけで行っています、
もし「ListIndex = -1」にする操作が有るならば、その時点で、変数に"*"を入れる操作を加えて下さい

>また、最後に動的配列を使われていますが、格納した配列の吐き出し先がListoboxである点も良くわかりませんでした。
>せっかくご案内いただきましたのに、こちらの理解不足で誠に申し訳ありません。
>しばらく時間をかけて、送って頂いたプロシージャを分析させていただきます。

迷わせてしまってごめん
此れは、Testが出来る様に、UserFormの形を整える為に行っている事で
特に本題には関係有りません
ただ内容は、このコードではListBoxに表示する項目をリストから取得している為
データの重複取りを行っているコードです

【58891】Re:ListBox戻り値-1の時の条件設定
お礼  ねろろ E-MAIL  - 08/11/16(日) 15:22 -

引用なし
パスワード
   ▼Hirofumi さんへ:
詳しい解説までつけていただいて、本当にありがとうございます。
私はLike演算子を使用することが少なく、このような考え方での条件式作りは大変参考になりました。
とはいえ、まだご案内いただいた構文すべてが理解できているわけでもありませんので、引き続きこれを元に勉強させていただきます。

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