[[20160629222233]] 『1-UserForm、ListBoxに指定の値の該当値を別のLis』(ひなの ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『1-UserForm、ListBoxに指定の値の該当値を別のListBoxに表示』(ひなの )

 また、作成中に躓いてしまい質問に参りました。
 また、教えていただけますと大変助かります。よろしくお願いします。

 Q1.フォーム1からフォーム2を開くとエクセルの編集ができないのでしょうか?

 Q2.あいまい検索で、大文字小文字漢字英数字を全文検索できるようになる方法ありますか?

 Q3.ListBox1の値をクリックするとListBox2に別の値を表示させる方法7
 (クリックでアクション起こせるならうれしいですが、できない場合はボタンを作りたいと思います。)

 例 ListBox1 あいまい検索結果
 1.ひなの UserForm
 2.たなか UserForm2 ←クリックして選択する
 3.すずき UserForm3

 ListBox2 (顧客のN列の値)
 頑固者

と表示させる方法が知りたいです。

 ◆顧客シート
          N列 注意事項
 ひなの UserForm   要注意
 たなか UserForm2   頑固者
 すずき UserForm3   普通 

 ◆コード
 あいまい検索のみ( ┰_┰)

 Private Sub CommandButton1_Click()
    Dim r As Range

    With ListBox1
        .RowSource = ""
        .ColumnHeads = False
    End With

    With Sheets("顧客")
        Set r = .Range("A1", .Range("A" & Rows.Count).End(xlUp)).Resize(, 14)
    End With

    With Sheets("作業")
        .UsedRange.ClearContents
        .Range("A1").Value = Sheets("顧客").Range("E1").Value 'タイトル
        .Range("A2").Value = TextBox1.Value

        r.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=.Range("A1:A2"), CopyToRange:=.Range("C1"), Unique:=False

        If Not IsEmpty(.Range("C2")) Then
            With .Range("C1").CurrentRegion
                ListBox1.RowSource = .Offset(1).Resize(.Rows.Count - 1).Address(External:=True)
                ListBox1.ColumnHeads = True
            End With
        End If
    End With

    End Sub
 ******************************************************************
  Private Sub UserForm_Initialize()
    Dim lRow As Long

    With Worksheets("顧客")
        lRow = .Range("A" & Rows.Count).End(xlUp).Row

    With ListBox1
    'リストBOXの中の列数と↓ここの列数が異なると実行後エラーになる
        .ColumnCount = 14
        .ColumnWidths = "30;90;0;0;150;80;200;0;0;0;0;0;0;0"
        'スクロールするのはA2から
        .RowSource = "顧客!A2:N" & lRow
        'A2の一行前の見出しを固定する
        .ColumnHeads = True
    End With
    End With

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 とりあえず Q1 です。
 (でも、質問の意味がよくわかっていませんが)

 Q2 については、意味が全くわからないので、具体的な例で説明してもらえませんか。
 具体的なシートレイアウトサンプルと、それに対する検索文字として何を(あるいは何と何を)指定するのか。
 そうすると、結果はどうなって、それは、どこに、どのように表示するのか。

 Q2 が明確になれば Q3 の回答もできるかと思います。

 エクセルの編集とは シート上での入力等のことですか?

 新規ブックに、UserForm1,UserForm2,UserForm3 をつくり、UserForm1 に CommandButton1 と CommandButton2 を配置してください。

 ●標準モジュール

 Sub Test1()
    UserForm1.Show vbModeless
 End Sub

 Sub Test2()
    UserForm1.Show
 End Sub

 ●UserForm1 のモジュール

 Private Sub CommandButton1_Click()
    UserForm2.Show vbModeless
 End Sub

 Private Sub CommandButton2_Click()
    UserForm3.Show
 End Sub

 ●テスト

 ・Test1 を実行してください。この時点では シートの編集ができますね。
 ・CommandButton1 をクリックしてください。UserForm2が表示されますが、この時点でもシートの編集ができますね。
 ・UserForm2をXボタンで閉じて、CommandButton2 をクリックしてください。
 ・UserForm3が表示されますが、この時点では、シートの編集が不可能になっていますね。

 ・ユーザーフォームを、Xボタンですべて閉じて、今度は Test2 を実行してください。
 ・UserForm1 が表示されますが、この時点で、シートの編集はできませんね。

 質問されているのは、こういうことでしょうか?
 であれば Showメソッドの引数を見比べてみれば、その理由がわかると思いますが。

(β) 2016/06/29(水) 23:40


(β) 様ありがとうございます。説明不足で済みません。。・゚・(pゝД;`q)・゚・

 まず Q1.

 UserForm2.Show vbModeless と  UserForm3.Show の違いはわかります。
 以前教えていただいたので、

 現状は 
 ▼請求書シート
  [メニュー画面]のボタンをクリックするとエクセルが編集できます。

   ○標準モジュール
      Sub メニュー開く()
         メニュー.Show vbModeles
      End Sub

 ▼「メニュー画面」のフォームを開くと
   「商品」「顧客」「仕入入力」「顧客情報入力」「購入履歴」「合計」があります。

     ○UserForm1 のモジュール 変数が定義されていませんとエラー発生
    Private Sub CommandButton1_Click()
       商品.Show vbModeles
     End Sub

     ○UserForm1 のモジュール 現在問題なく使用してますが、請求書のセルが触れません。値段を直したかったんです。
    Private Sub CommandButton1_Click()
       商品.Show
     End Sub
(ひなの ) 2016/06/30(木) 06:47

 Q2.現状
 TextBox1 で顧客の[E]列の会社名であいまい検索してます。
 現在は「A会社」なら TextBox1に「a」を入れる検索値が表示されない
 「A」と大文字を入れると「A」から始まる会社がどっと表示されます。
 私がほしいのは「A」「a」「A」とどれを TextBox1 入力しても該当の会社を  検索結果を表示させたいです。

 「A」「a」「A」を区別しなければいけないと、いちいち探したり、どれを入力 したか覚えなければいけない。あいまい検索の意味が・・・・・

 ▼請求書シート (発注書と同じかと)
 	[A]	[B]	[C]	[D]	[E]	[F]	[G]	[H]
 [12]	NO	品名	数量	単位	単価	金額	備考	KG
 [13]								
  :								
 [32]								

 ▼顧客シート
 	[A]	[B]	[C]	[D]	[E]	      [F]  	[G]	 [H]	         [I]	        [J]	[K]	[L]	[M]	[N]
 [1]	NO	電話	携帯	FAX	会社名	     郵便番号	住所	支払方法	送料有・無	送料1	送料2	送料3	注意	店の形態
 [2]					A会社									
 [3]					b会社								                        超几帳面	
 [4]					ひなのカンパニー								        商品理解してない	
 [5]					(株)β									

 ▼フォーム 顧客
  CommandButton1 'あいまい検索
  CommandButton2 ’入力 エクセルへ
  CommandButton3 ’終了
  CommandButton4 ’購入履歴
  TextBox1 'あいまい検索 ⇒ 顧客情報を引っ張ってくる
  ListBox2 ’購入履歴 ⇒ 売上から購入商品を引っ張ってくる
  ListBox3 ’注意 ⇒ 顧客から注意ランのデータを引っ張ってくる(データーは空欄のもある)
  ★今回の質問がここです。。

 ▼現在作ってるコード
 Private Sub CommandButton1_Click() 'あいまい検索
    Dim r As Range

    With ListBox1
        .RowSource = ""
        .ColumnHeads = False
    End With

    'If TextBox1.ListIndex < 0 Then Exit Sub

    With Sheets("顧客")
        Set r = .Range("A1", .Range("A" & Rows.Count).End(xlUp)).Resize(, 14)
    End With

    With Sheets("作業")
        .UsedRange.ClearContents
        .Range("A1").Value = Sheets("顧客").Range("E1").Value 'タイトル
        .Range("A2").Value = TextBox1.Value

        r.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=.Range("A1:A2"), CopyToRange:=.Range("C1"), Unique:=False

        If Not IsEmpty(.Range("C2")) Then
            With .Range("C1").CurrentRegion
                ListBox1.RowSource = .Offset(1).Resize(.Rows.Count - 1).Address(External:=True)
                ListBox1.ColumnHeads = True
            End With
        End If
    End With

    End Sub

 ***********************************************************************

 Private Sub CommandButton2_Click() '入力
 Dim lRow As Long, i As Long
 Dim ListNo As Long

   ListNo = ListBox1.ListIndex

   If ListNo < 0 Then
      MsgBox "いずれかの行を選択してください"
      Exit Sub
   End If

     With Worksheets("請求書")
            'listBoxは2次元配列なので、1列目は「0」から数える、エクセルは1列目[A]は[1]から数える
            'A列の値=listboxの0列目の値(NO)
            .Range("B4").Value = ListBox1.List(ListNo, 0) 'NO
            .Range("B5").Value = ListBox1.List(ListNo, 4) '会社名
            .Range("B6").Value = ListBox1.List(ListNo, 1) 'TEL
            .Range("B7").Value = ListBox1.List(ListNo, 2) '携帯
            .Range("B8").Value = ListBox1.List(ListNo, 5) & ListBox1.List(ListNo, 6) '郵便NO,住所
            .Range("F4").Value = ListBox1.List(ListNo, 7) '支払方法
            .Range("F5").Value = ListBox1.List(ListNo, 8) '送料
            .Range("F6").Value = ListBox1.List(ListNo, 9) '送料1
            .Range("F7").Value = ListBox1.List(ListNo, 10) '送料2
            .Range("F8").Value = ListBox1.List(ListNo, 11) '送料3
            .Range("F8").Value = ListBox1.List(ListNo, 13) '店形態

        End With

 End Sub
 *****************************************************************
 Private Sub UserForm_Initialize()
    Dim lRow As Long

    With Worksheets("顧客")
        lRow = .Range("A" & Rows.Count).End(xlUp).Row

    With ListBox1
    'リストBOXの中の列数と↓ここの列数が異なると実行後エラーになる
        .ColumnCount = 14
        .ColumnWidths = "30;90;0;0;150;80;200;0;0;0;0;0;0;0"
        'スクロールするのはA2から
        .RowSource = "顧客!A2:N" & lRow
        'A2の一行前の見出しを固定する
        .ColumnHeads = True
    End With
    End With

    With Worksheets("売上") ’まだ途中・・・・
        lRow = .Range("A" & Rows.Count).End(xlUp).Row
     With ListBox2
    'リストBOXの中の列数と↓ここの列数が異なると実行後エラーになる
        .ColumnCount = 11
        .ColumnWidths = "20;50;40;20;20;30;30;0;50;50;30"
        'スクロールするのはA2から
        .RowSource = "商品!A2:k" & lRow
        'A2の一行前の見出しを固定する
        .ColumnHeads = True
      End With
     End With

 End Sub

(ひなの ) 2016/06/30(木) 07:24


 Q2 については、もう一眠りしてから説明を読んでみますね。

 Q1 の件は

 ・変数が定義されていません。

  s が1つたりませんね。 vbModeles ---> vbModeless  

 ・商品フォームでセル編集ができない

  βがアップした CommandButton1 と CommandButton2 のコードでも同様の再現ができますが
  商品.Show だと 商品フォームは モーダルですから、アプリケーション(エクセル)がロックされます。
  商品.Show vbModeless ですよ。

(β) 2016/06/30(木) 07:27


 ≫s が1つたりませんね。 vbModeles ---> vbModeless

 ( ̄ ̄ ̄∇ ̄ ̄ ̄; アリャ? そんなオチが すんません。普通にできました。

 意味の前にスペルですね

 ありがとうございます。Q1.解決です。

 おやすみなさい〜♪

(ひなの ) 2016/06/30(木) 07:33


 一眠りする前にとりあえず。

 前トピでフィルターオプションの条件、縦に並べると OR 条件 と申し上げましたね。
 なので、A2 だけではなく A2〜A5 に 大文字・小文字 と 全角・半角 の 都合 4つの文字を入れましょう。

    Dim s1 As String
    Dim s2 As String

 こんな定義をしておいて

    s1 = StrConv(TextBox1.Value, vbUpperCase)
    s2 = StrConv(TextBox1.Value, vbLowerCase)

    .Range("A2").Value = StrConv(s1, vbWide)
    .Range("A3").Value = StrConv(s1, vbNarrow)
    .Range("A4").Value = StrConv(s2, vbWide)
    .Range("A5").Value = StrConv(s2, vbNarrow)

 で、 

   CriteriaRange:=.Range("A1:A5")

 こうして試してみてください。
 抜けがあるかもしれませんし、なにより、動かしていないので、NGなら、一眠りした後に対応します。

(β) 2016/06/30(木) 07:58


 Q2. 検証結果
   大文字・小文字 と 全角・半角で検索できました。ありがとうございます。
   コード設定の入れる場所はあってますか?

 ●さらなる問題。
  If Sheets("作業").Range("A2").Value Like "*" & TextBox1.Value & "*"  The のようなあいまい検索がしたいです。
 (イメージです。コードの実証はしてません。)

 現在コードでは
 ひなのカンパニー の場合 ⇒ 「ひ」をTextBox1入力すると検索結果は表示されます
 (株)ひなのカンパニーの場合 ⇒ 「ひ」とTextBox1入力すると検索結果でません

 ≫前トピでフィルターオプションの条件、縦に並べると OR 条件 と申し上げましたね。
 
 ということなので、フィルターオプションは OR で検索ていうことは、AND の検索方法はできないということでしょうか?

 エクセルで、マクロの記録では、できるような気がしますが、説明をもう一度読んできます。
 ActiveSheet.ListObjects("テーブル1").Range.AutoFilter Field:=4, Criteria1:= "=*忠*", Operator:=xlAnd

 ▼コード
 Private Sub CommandButton1_Click() 'あいまい検索
    Dim r As Range
    Dim s1 As String
    Dim s2 As String

    With ListBox1
        .RowSource = ""
        .ColumnHeads = False
    End With

    'If TextBox1.ListIndex < 0 Then Exit Sub

    With Sheets("顧客") '範囲
        Set r = .Range("A1", .Range("A" & Rows.Count).End(xlUp)).Resize(, 14)
    End With

     s1 = StrConv(TextBox1.Value, vbUpperCase) '文字列を大文字に変換
     s2 = StrConv(TextBox1.Value, vbLowerCase) '文字列を小文字に変換

    'フィルターオプションの条件、縦に並べると OR 条件 ANDはできない
    With Sheets("作業") 'フィルター結果を作業シートにコピーする
        .UsedRange.ClearContents
        .Range("A1").Value = Sheets("顧客").Range("E1").Value 'タイトル
        '大文字小文字等で検索したい場合は設定
        .Range("A2").Value = StrConv(s1, vbWide) '半角文字を全角文字に変換
        .Range("A3").Value = StrConv(s1, vbNarrow) '全角文字を半角文字に変換
        .Range("A4").Value = StrConv(s2, vbWide)
        .Range("A5").Value = StrConv(s2, vbNarrow)

        r.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=.Range("A1:A5"), CopyToRange:=.Range("C1"), Unique:=False

        If Not IsEmpty(.Range("C2")) Then
            With .Range("C1").CurrentRegion
                ListBox1.RowSource = .Offset(1).Resize(.Rows.Count - 1).Address(External:=True)
                ListBox1.ColumnHeads = True
            End With
        End If
    End With

    End Sub

(ひなの ) 2016/06/30(木) 09:43


 >>コード設定の入れる場所はあってますか?

 はい、これでOKですね。

 >> 現在コードでは
 >>ひなのカンパニー の場合 ⇒ 「ひ」をTextBox1入力すると検索結果は表示されます
 >>(株)ひなのカンパニーの場合 ⇒ 「ひ」とTextBox1入力すると検索結果でません

 それは おかしいですね?
 TextBox1 に ひ の前後に スペースなんかいれていたりすると、もちろん マッチしませんが。

 Sub Test()
    Dim s1 As String
    Dim s2 As String

    s1 = "ひ"

    s2 = "ひなのカンパニー"
    MsgBox s2 Like "*" & s1 & "*"

    s2 = "(株)ひなのカンパニー"
    MsgBox s2 Like "*" & s1 & "*"

 End Sub

 このコードを動かすと、どちらも True になりますけど??

 >>フィルターオプションの AND 条件

 前トピでもふれましたが、条件欄は右に増やして複数列にすることができます。
 たとえば

 項目1   項目2
 A     Z

 こうして、CriteriaRange を複数列領域指定してやると、項目1が Aから始まり、項目2が Zから始まるものが
 抽出されます。

 また、条件判定項目が数値の場合 
 項目1   項目1
 <100      >=10

 というように同じ項目を横に並べてAND抽出もできます。
 この例の場合は 項目1のデータで 10以上、100未満のものが抽出されます。

 もう1つ、便利な機能として 判定列タイトルを空白にして、条件として 【リストの2行目】に対する数式をいれることができます。

 (空白)
 =AND(A2="hoge",D2=10) といった指定です。

 なお、条件欄、現在は作業シートのA列のみ、C列から抽出結果にしていますので、もし、条件欄を2列(A,B)にするなら
 抽出場所は D列にしてくださいね。

 ところで、

 ActiveSheet.ListObjects("テーブル1").Range.AutoFilter Field:=4, Criteria1:= "=*忠*", Operator:=xlAnd

 これはフィルターオプション(AdvancedFilter)ではなくオートフィルター(AutoFilter)ですので、混同しないようにしてくださいね。

 それと、現在のリスト、テーブル設定しているんですね?(もちろん、それでも構いませんけど)

(β) 2016/06/30(木) 11:27


 あ!! あいまい検索、質問の意味を取り違えていましたね。
 Like 検索ではなく フィルターオプションで ひ を あいまい検索したかったということでしたか。

 もしそうであれば

    .Range("A2").Value = StrConv(s1, vbWide)
    .Range("A3").Value = StrConv(s1, vbNarrow)
    .Range("A4").Value = StrConv(s2, vbWide)
    .Range("A5").Value = StrConv(s2, vbNarrow)

 これを

    .Range("A2").Value = "*" & StrConv(s1, vbWide) & "*"
    .Range("A3").Value = "*" & StrConv(s1, vbNarrow) & "*"
    .Range("A4").Value = "*" & StrConv(s2, vbWide) & "*"
    .Range("A5").Value = "*" & StrConv(s2, vbNarrow) & "*"

 こうして試してみてください。

(β) 2016/06/30(木) 11:34


 (β)様 ありがとうございます(灬╹ω╹灬)ばっちりです。どの文字を入れても
 検索結果が表示されます。

 欲を言えば "*" & StrConv(s1, vbWide) & "*" は 「日本語入力」(漢字とひらがな) の時のみで
         StrConv(s1, vbWide) & "*" を英数字のあいまい検索にできたりしますか?

 なぜかといいますと、英数字のヒット件数が多くなってしまいます。なんでもかんでも値を引っ張ってくるので・・・
 難しいならこのまま使います。

 ●問題の
 Q3.私は、「ひなのカンパにー」の場合「商品理解してない」と表示させるにはどの方法でできますか?

  1.TextBox1の中の値をクリックした後にかアクションを起こす方法(できるかわからない?)

 CommandButton1 「ひ」
 検索値「ひなのカンパにー」
 TextBox2 「商品理解してない」 を表示する場所

 TextBox1 検索結果

 (有)ひなの
 (株)ひなの
 ひなのカンパニー  ← 該当の検索値クリックした後に ⇒ TextBox2 に 「商品理解してない」と表示させる
 ひなの(株)

  2.それとも、TextBox1の中の値をクリックした後に「アクションボタン」でアクションを起こすのですか?

 CommandButton1 「ひ」
 検索値「ひなのカンパにー」
 TextBox2 「商品理解してない」 を表示する場所
 TextBox2表示 させるボタン

 TextBox1 検索結果

 (有)ひなの
 (株)ひなの
 ひなのカンパニー  ← クリックした後に ⇒ [メッセージが表示]ボタンをクリック ⇒ 「商品理解してない」をTextBox2に表示させる 
 ひなの(株)

 ▼顧客シート
 	[A]	[B]	[C]	[D]	[E]	      [F]  	[G]	 [H]	         [I]	        [J]	[K]	[L]	[M]	[N]
 [1]	NO	電話	携帯	FAX	会社名	     郵便番号	住所	支払方法	送料有・無	送料1	送料2	送料3	注意	店の形態
 [2]					A会社									
 [3]					b会社								                        超几帳面	
 [4]					ひなのカンパニー								        商品理解してない	
 [5]					(株)β									

 ▼フォーム 顧客
  CommandButton1 'あいまい検索
  CommandButton2 ’入力 エクセルへ
  CommandButton3 ’終了
  CommandButton4 ’購入履歴
  TextBox1 'あいまい検索 ⇒ 顧客情報を引っ張ってくる
  ListBox2 ’購入履歴 ⇒ 売上から購入商品を引っ張ってくる
  ListBox3 ’注意 ⇒ 顧客から注意ランのデータを引っ張ってくる(データーは空欄のもある)
  ★今回の質問がここです。。
(ひなの ) 2016/06/30(木) 19:11

 Q3 わすれてました。
 ちょっと後回しにさせてください。(まだ、質問の理解が儒分ではないので)

 で、『「日本語入力」(漢字とひらがな) の時のみ』これを 半角、全角 大文字、小文字とわず、
 数字とアルファベット以外 と扱ってよければ。
 かつ、TextBoxの検索文字が1桁であれば、TextBoxの値を "[0-90−9A-ZA-Za-za-z]" と Like比較し
 もしマッチすれば英数字、マッチしなければ 漢字やひらがなとみなすことができます。

 ただし 記号( % や # )や カタカナもありうるなら、これだけではだめですけど。

 で、英数字かどうかでフィルターオプションに与える条件をかえてセットするということではいかがですか。

 以下、参考。(これを参考に、がんばって 組み込んでみてください。)

 Sub Test()
    Dim s As String

    s = "8"
    MsgBox s Like "[0-90−9A-ZA-Za-za-z]"

    s = "8"
    MsgBox s Like "[0-90−9A-ZA-Za-za-z]"

    s = "D"
    MsgBox s Like "[0-90−9A-ZA-Za-za-z]"

    s = "D"
    MsgBox s Like "[0-90−9A-ZA-Za-za-z]"

    s = "a"
    MsgBox s Like "[0-90−9A-ZA-Za-za-z]"

    s = "a"
    MsgBox s Like "[0-90−9A-ZA-Za-za-z]"

    s = "あ"
    MsgBox s Like "[0-90−9A-ZA-Za-za-z]"

 End Sub

(β) 2016/06/30(木) 20:16


 M列の値を TextBox2 に表示させる件、もしA列からはじまるListBox1の RowSource が M列も含んでいるとすれば
 (M列がListBox1 に表示されているかどうかは問わず)

 Private Sub ListBox1_Click()
    TextBox2.Value = ListBox1.List(ListBox1.ListIndex, 12)
 End Sub

 勘違いしていたら指摘願います。

(β) 2016/06/30(木) 20:25


 ≫ただし 記号( % や # )や カタカナもありうるなら、これだけではだめですけど。
 数字と記号はないです。英字、漢字、ひらがな、カタカナのみです。

 >M列の値を TextBox2 に表示させる件、もしA列からはじまるListBox1の RowSource が M列も含んでいるとすれば
 顧客シードの項目を全部 ListBox1 に入れてます(表示非表示とともに)

 ●検証結果
 何も結果でないです。
 後すみません。表示させるのは ListBox3 です。間違いました。
 なにかが違うのでしょうか?
 写真をここに張り付けれたらいいですけどね・・・・

 Private Sub ListBox1_Click()
    ListBox3.Value = ListBox1.List(ListBox1.ListIndex, 12)
 End Sub

 Initialize に ListBox3 のなんか設定しないといけないでしょうか?
(ひなの ) 2016/06/30(木) 20:58

 えっ? 表示先は TextBox2 じゃなかったですか?
 ListBox3 なんですか?

 どうも、βが要件を理解していないようです・・・・

 ListBox1 で何かを選ぶわけですよね? 選んだものは、当然【1件】ですよね。
 その1件のデータを リストボックスに書きこむのですか? そうすると ListBox3 は 1件のみ表示?
 本当に ListBox3 に 選んだものの M列の値を1件だけ表示するんだということであれば、

 ListBox3.Clear
 ListBox3.AddItem ListBox1.List(ListBox1.ListIndex, 12)

 ですけど。

 >>●オブジェが必要とエラーです

 どのコードでそうなりましたか?

 >>何も結果でないです

 これは どこに 何の結果が出ないのですか? あいまい検索の件ですか? Q3 の件ですか?

 >>写真をここに張り付けれたらいいですけどね・

 ユーザーフォームに写真を貼り付けることはできますよ。
 この場合はどの写真という情報が必要ですけど。

 ★部分部分にレスしてきましたので、現状、そちらのコードがどうなっているかがわからなくなっています。
  現在のコード、フルセットでアップいただきたいな。

(β) 2016/06/30(木) 21:10


 ListBox3.Clear
 ListBox3.AddItem ListBox1.List(ListBox1.ListIndex, 12)

 これは

 ListBox3.List = Array(ListBox1.List(ListBox1.ListIndex, 12))

 この1行でもよかったです。でも・・・なぜリストボックス?

 もしかして、ListBox1 で選んだ データに対する 超几帳面	 といった語句と、それに紐付く写真を
 表示したかった?

 であれば ListBox3 ではなく ImageコントロールとLabelコントロールを使います。
 で、顧客シートに項目を追加。そこに 紐付く写真のファイル名(xxxx.jpg 等)をセットしておきます。
 もし、写真のフォルダがマチマチなら 単にファイル名ではなくファイルフルパスにしておく必要はありますが。

(β) 2016/06/30(木) 21:31


 (β)様ありがとうございます。

 ●検証結果 ばっちりほしい結果が出ました。
    ListBox3.Clear
    ListBox3.AddItem ListBox1.List(ListBox1.ListIndex, 12)

 ≫なぜリストボックス?
   ここはトラブル内容を記載するところです。リストボックスにしたのはスペースが少ないので
   スクロールバーを使いたかったからです。

 ≫えっ? 表示先は TextBox2 じゃなかったですか?

  すみません、私が記入間違いしたんです。コピペと・・・・

 ≫>>●オブジェが必要とエラーです
     これはTextBox2にしたのが原因です。のもようです。

 ≫何の結果が出ないのですか? あいまい検索の件ですか? Q3 の件ですか?
   Q3 の 検証けっかです。
   ListBox3.Value = ListBox1.List(ListBox1.ListIndex, 12)
   のコードではほしい結果が得られなかったです。エラーもないので、
   原因は私にもわかりませんσ(馬゚д゚鹿)☆

 余談ですが、ユーザーフォームに写真を貼り付けることができるんですか?
 できるなら、作りたいのがあるんですよ〜
 写真を張り付ける、といってもいろいろやり方あると思いますが、

 1.エクセルのようにxxxx.jpgを画像として取り込んで、元の xxxx.jpg は移動させても
   シート上の写真が見れる。
 2.リンクのような張り方は、 xxxx.jpg をくっ付けて置かないと 開けない

 どちですか?

 1.ならやり方知りたいです。

(ひなの ) 2016/06/30(木) 22:30


こういうのですね?

http://www.239-programing.com/excel-vba/ufm/ufm02c.html
(ひなの ) 2016/06/30(木) 22:37


 >>こういうのですね?

 そうですね。わかりやすくまとまった良いページですね。

 >> 1.ならやり方知りたいです。

 ImageコントロールのPictureに画像をセットした後、その画像ファイルを削除して、フォームを表示すると
 すぐにわかりますが、1.ですね。
 リンクではなく、ビットマップでイメージとして取り込んでいますね。

 なお、

 >>ListBox3.Value = ListBox1.List(ListBox1.ListIndex, 12)

 ListBoxのValue は 選択されたものの値が入っているところです。
 ここに何をセットしても、ListBox上は 何の変化も発生しません。

(β) 2016/06/30(木) 23:04


 ≫ListBoxのValue は 選択されたものの値が入っているところです。
 ≫ここに何をセットしても、ListBox上は 何の変化も発生しません。

 そうなんですか?
 TextBox と ListBox のコードの書き方が違うのですね。

 ≫ビットマップでイメージとして取り込んでいますね。
 そうなんですか。それはうれしいですね。これ終わったら図面を作って画像を入れたいと思います。

 Q4.顧客別、ダブらない商品、単価とcs の出し方が知りたいです。
 これは Q3. と同じ Private Sub ListBox1_Click() の後に内容を表示させたいです。

 何を知りたいかというと、前回いくらで売ったのかを見たいだけです。
 値段は交渉次第なので、人によって微妙に違ってて、覚えきれないです。

 ListBox1 で
   (株)ひなの   ⇒ ここをクリックした場合は 欲しい結果 1. です。
   ひなのカンパニー ⇒ ここをクリックした場合は 欲しい結果 2. です。

 ListBox2 ほしい結果 1.

 名前   	NO	品名		単価	cs
 (株)ひなの	A01	みかん		100	5
 (株)ひなの	B02	りんご		90	4
 (株)ひなの	B02	りんご		90	4
 (株)ひなの	A01	みかん		110	1

 ListBox2 ほしい結果 2.
  
 名前	        NO	品名		単価	cs
 ひなのカンパニー	B02	りんご		120	1
 ひなのカンパニー    A01	みかん		100	5

 売上シート

 	[A]	[B]	[C]	           [D]	                [E]	[F]	[G]	[H]	[I]	[J]	[K]
 [1]	NO	日付	TEL	            名前	        NO	品名	数量	単価	cs	pc	金額
 [2]		2016/3/30		 (株)ひなの	       A01	みかん		100			
 [3]		2016/3/31		 (株)ひなの	       B02	りんご		90			
 [4]		2016/5/1		 (株)ひなの	        A01	みかん		110			
 [5]		2016/3/30		 ひなのカンパニー	B02	りんご		120			
 [6]		2016/3/31		 ひなのカンパニー	A01	みかん		120			
 [7]		2016/5/1		 ひなのカンパニー	B02	りんご		100			

 これは結構難しいです。
 絞る順番に悩みます。
(ひなの ) 2016/06/30(木) 23:44

 コメントしましたが、様々なケースの Q に対して部分的にレスしてきていますので、
 実際のそちらのコードの全貌が、こちらではわからなくなっています。

 たとえば、↑のケース、なにがしかの検索文字を与えて ListBox1 にデータを抽出し(もしかしたら、ここは抽出ではなく 固定で与えている?)
 ListBox1 を選ぶと ListBox2 に売上シートから抽出する、そのコードを(未完成や未対応のところがあってもOK)
 フルセット(ユーザーフォームモジュールすべて)でアップいただけませんか。

 それと、↑の例ですけど、(寝起きで寝ぼけているせいか)元データ(売上シート)と、ほしい結果 1. も 2. も
 その紐付き関係がよくわかりません。

 売上シートには (株)ひなの が 3件しかないのに 抽出結果は4件。cs 数も違っていますし。

 ★本日は、これから外出して、戻りは夜になりますので、それ以降の対応になります。

  

(β) 2016/07/01(金) 07:13


 なにがしたいか・・・・・

 お客さんの情報を見たいだけですよ  ( ┰_┰)
 ただ、やり方が一般と違うと思います。

 とりあえず、ほしい情報を全部画面に出しとけとしか思ってませんよ。
 フィルターでやって、説明しようとしたんですよ

 フィルターでダブってる項目を無視するところで躓いできないですよ、
 調べますので、少しお待ちください。

 データーは自分は過去のデーター使ってやってるんですが、ここに出してるのが
 適当に作ったダミなので・・・すみません。これも整理します。

 説明が下手で申し訳ないです。なのに、ながながと教えていただいてホントにありがとうございます。

 (β) 様が知りたいのは

 1.コードの全貌

 2.なにがしかの検索文字を与えて ListBox1 にデータを抽出し(もしかしたら、ここは抽出ではなく 固定で与えている?)

 3.元データ(売上シート)と、ほしい結果 1. も 2. 正確なもの

 2.はよくはからないですが。 Q3. と 同じフォームでやってますよ
 抽出?固定?
 これもちょっと調べてみます 。・゚・(pゝД;`q)・゚・

 こんなところですね。

(ひなの ) 2016/07/01(金) 07:40


 今から出かけますが、とりあえず

 >>フィルターでダブってる項目を無視するところで躓いできないですよ、

 フィルターオプションで重複を削除して抽出 という機能があります。
 操作でいいますと、最後にOKボタンを押すときに、その条件にチェックをつけるだけなんですが
 重複かどうかの比較は、抽出項目すべてに対して行われます。
 ある項目だけで判定ということになると、ちょっと細工が必要になります。

 この細工をするぐらいならフィルター機能を使わず、ゴリゴリ 自前コードで対処 ということも
 考えられますが、せっかく取り入れているフィルターオプション機能ですので、それを使う方法で
 進めていきましょうかね。

(β) 2016/07/01(金) 08:01


 ≫フィルターオプション機能
 今回のケースはできないですね、どっちかというとピポットテーブルに近いですね。
 それか途中までフィルター使って、最後の難関をコードにするかな?どうしよよよよよよよよよよよ。

 顧客とメニュー画面のコードです。
 至ってシンプルのコードしか使ってないですよ〜
 途中でホッタラカシノもあります (;¬д¬)
 要領も悪い部分ありますので、一般常識には当てはまらないかと・・・・・・

 ちなみに、前回の大文字小文字は 「あいまい検索」のコードのところです。
 今回のは、 「ListBox1クリック ⇒ ListBox3に注意事項を表示」
 そのコードに更に「購入履歴」を追加したいのです。

 1.コードの全貌

 Private Sub CommandButton1_Click() 'あいまい検索
    Dim r As Range
    Dim s1 As String
    Dim s2 As String

    With ListBox1
        .RowSource = ""
        .ColumnHeads = False
    End With

    'If TextBox1.ListIndex < 0 Then Exit Sub

    With Sheets("顧客") '範囲
        Set r = .Range("A1", .Range("A" & Rows.Count).End(xlUp)).Resize(, 14)
    End With

     s1 = StrConv(TextBox1.Value, vbUpperCase) '文字列を大文字に変換
     s2 = StrConv(TextBox1.Value, vbLowerCase) '文字列を小文字に変換

    'フィルターオプションの条件、縦に並べると OR 条件 ANDはできない
    With Sheets("作業") 'フィルター結果を作業シートにコピーする
        .UsedRange.ClearContents
        .Range("A1").Value = Sheets("顧客").Range("E1").Value 'タイトル
        '大文字小文字等で検索したい場合は設定
        .Range("A2").Value = "*" & StrConv(s1, vbWide) & "*" '半角文字を全角文字に変換
        .Range("A3").Value = "*" & StrConv(s1, vbNarrow) & "*" '全角文字を半角文字に変換
        .Range("A4").Value = "*" & StrConv(s2, vbWide) & "*"
        .Range("A5").Value = "*" & StrConv(s2, vbNarrow) & "*"

        r.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=.Range("A1:A5"), CopyToRange:=.Range("C1"), Unique:=False

        If Not IsEmpty(.Range("C2")) Then
            With .Range("C1").CurrentRegion
                ListBox1.RowSource = .Offset(1).Resize(.Rows.Count - 1).Address(External:=True)
                ListBox1.ColumnHeads = True
            End With
        End If
    End With

    End Sub

 Private Sub CommandButton2_Click() '入力
 Dim lRow As Long, i As Long
 Dim ListNo As Long

   ListNo = ListBox1.ListIndex

   If ListNo < 0 Then
      MsgBox "いずれかの行を選択してください"
      Exit Sub
   End If

     With Worksheets("請求書")
            'listBoxは2次元配列なので、1列目は「0」から数える、エクセルは1列目[A]は[1]から数える
            'A列の値=listboxの0列目の値(NO)
            .Range("B4").Value = ListBox1.List(ListNo, 0) 'NO
            .Range("B5").Value = ListBox1.List(ListNo, 4) '会社名
            .Range("B6").Value = ListBox1.List(ListNo, 1) 'TEL
            .Range("B7").Value = ListBox1.List(ListNo, 2) '携帯
            .Range("B8").Value = ListBox1.List(ListNo, 5) & ListBox1.List(ListNo, 6) '郵便NO,住所
            .Range("F4").Value = ListBox1.List(ListNo, 7) '支払方法
            .Range("F5").Value = ListBox1.List(ListNo, 8) '送料
            .Range("F6").Value = ListBox1.List(ListNo, 9) '送料2
            .Range("F7").Value = ListBox1.List(ListNo, 10) '距離
            .Range("F8").Value = ListBox1.List(ListNo, 11) '送料3
            .Range("F8").Value = ListBox1.List(ListNo, 13) '店形態

        End With

 End Sub

 Private Sub CommandButton4_Click()
   '現在選択されている(行、列)の箇所のデーターを取得 リストBOXの列番号は「0」から
   '顧客NOを取得する
   ListNo = ListBox1.ListIndex

    With Worksheets("売上")
       lRow = .Range("A" & Rows.Count).End(xlUp).Offset(1).Row

          'With .Rows(lRow)

   End With
 End Sub

 Private Sub ListBox1_Click()’ListBox1クリック ⇒ ListBox3に注意事項を表示

    ListBox3.Clear
    ListBox3.AddItem ListBox1.List(ListBox1.ListIndex, 12)

 End Sub

 Private Sub UserForm_Initialize()
    Dim lRow As Long

    With Worksheets("顧客")
        lRow = .Range("A" & Rows.Count).End(xlUp).Row

    With ListBox1
    'リストBOXの中の列数と↓ここの列数が異なると実行後エラーになる
        .ColumnCount = 14
        .ColumnWidths = "30;90;0;0;150;80;200;0;0;0;0;0;0;0"
        'スクロールするのはA2から
        .RowSource = "顧客!A2:N" & lRow
        'A2の一行前の見出しを固定する
        .ColumnHeads = True
    End With
    End With

    With Worksheets("売上")
        lRow = .Range("A" & Rows.Count).End(xlUp).Row

    With ListBox2
    'リストBOXの中の列数と↓ここの列数が異なると実行後エラーになる
        .ColumnCount = 11
        .ColumnWidths = "0;0;0;0;30;80;0;20;0;50;30"
        'スクロールするのはA2から
        .RowSource = "売上!A2:k" & lRow
        'A2の一行前の見出しを固定する
        .ColumnHeads = True
      End With
     End With

 End Sub

 ********メニューのフォーム*******************************************

 Private Sub CommandButton1_Click()
  商品.Show vbModeless
 End Sub

 Private Sub CommandButton2_Click()
    顧客情報修正.Show vbModeless
 End Sub

 Private Sub CommandButton3_Click()
    顧客.Show vbModeless
 End Sub

 Private Sub CommandButton4_Click()
    商品.Show vbModeless
 End Sub

 Private Sub CommandButton5_Click()
  合計.Show vbModeless
 End Sub

 Private Sub CommandButton6_Click()
    顧客.Show
 End Sub

 Private Sub UserForm_Initialize()
  With メニュー
    .StartUpPosition = 0
    .Top = 50
    .Left = 650
  End With
 End Sub

(ひなの ) 2016/07/01(金) 20:09


 コードアップ深謝。

 今から読みますが、このコードの理解を深めるためにも、このコードが相手にしているシートレイアウトの具体例と
 それを処理した場合、ListBox1 と ListBox2 は、どういった表示になるかという具体例もあわせてアップいただけませんか。

 (単なるレイアウトではなく、それぞれが、つじつまのあうサンプルでお願いします)

 ★このトピ、ずいぶん、長くなりました。閲覧や微修正のための編集にも骨が折れるようになりました。
  このトピを参照した形で NO2 として新しいトピを立ち上げてもらえませんか。
  で、お願いしたレイアウトは、そのトピに記載してください。

(β) 2016/07/01(金) 20:27


 次に

 ≫ 2.なにがしかの検索文字を与えて ListBox1 にデータを抽出し
 ≫(もしかしたら、ここは抽出ではなく 固定で与えている?)
 ≫3.元データ(売上シート)と、ほしい結果 1. も 2. 正確なもの

 ダミーの内容なので、あまり実感わかないと思いますが、
 とりあえず途中までフォールターを使います。
 最後の 「単価」 のところのみダブらない金額のコードを教えていただけると嬉しいです。

 ●フォームでやってること
   TextBox1 に 「ひ」とあいまい検索かける
   ListBox1 に 「結果を表示」 (顧客シートの情報をすべて格納してる、表示と非表示で)
         う(株)ひなの   ⇒ ここをクリックした場合 Sub Macro2()
         ひなのカンパニー 
   ListBox3  (株)ひなのの 顧客シートの.トラブルを表示
   ListBox2  売上シート.購入情報

 ◆私がほしい結果 (フィルターのコード + ダブらない単価 = 手動でやってみました。)

 	[A]	[B]	      [C]	    [D]	        [E]	[F]	[G]	[H]	[I]	[J]	[K]
 [1]	NO	日付	      TEL	   名前	        NO	品名	数量	単価	cs	pc	金額
 [2]		2016/6/4		 (株)ひなの	B03	マンゴ		500	1		
 [3]		2016/3/31		 (株)ひなの	A01	みかん		80	5		
 [4]		2016/5/2		 (株)ひなの     A01	みかん		50	10		
 [5]		2016/6/3		 (株)ひなの	A01	みかん		100	1		
 [6]		2016/5/1		 (株)ひなの	B02	りんご		200	1		

 ◆フィルターで作ったコード の結果
	[A]	[B]	   [C]           [D]	        [E]	[F]	[G]	[H]	[I]	[J]	[K]
 [1]	NO	日付	   TEL            名前	NO	品名	数量	単価	cs	pc	金額
 [2]		2016/6/4		 (株)ひなの	B03	マンゴ		500	1		
 [3]		2016/3/30		 (株)ひなの     A01	みかん		100	1		
 [4]		2016/3/31		 (株)ひなの     A01	みかん		80	5		
 [5]		2016/5/2		 (株)ひなの     A01	みかん		50	10		
 [6]		2016/6/3		 (株)ひなの     A01	みかん		100	1		
 [7]		2016/5/1		 (株)ひなの	B02	りんご		200	1		

 ◆フィルターで作ったコード

   Sub Macro2()

    Rows("1:1").Select
    Selection.AutoFilter
    ActiveSheet.Range("$A$1:$S$10").AutoFilter Field:=4, Criteria1:="(株)ひなの"
    ActiveWorkbook.Worksheets("売上").AutoFilter.Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("売上").AutoFilter.Sort.SortFields.Add Key:=Range( _
        "F2:F10"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    With ActiveWorkbook.Worksheets("売上").AutoFilter.Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply

    End With
 End Sub

 売上シート
	[A]	[B]	   [C]	    [D]	                [E]	[F]	[G]	[H]	[I]	[J]	[K]
 [1]	NO	日付	   TEL           名前	        NO	品名	数量	単価	cs	pc	金額
 [2]		2016/3/30		 (株)ひなの	        A01	みかん		100	1		
 [3]		2016/3/31		 (株)ひなの	        A01	みかん		80	5		
 [4]		2016/5/1		 (株)ひなの   	B02	りんご		200	1		
 [5]		2016/3/30		 ひなのカンパニー	B02	りんご		200	1		
 [6]		2016/5/1		 ひなのカンパニー	B02	りんご		150	10		
 [7]		2016/5/2		 (株)ひなの	        A01	みかん		50	10		
 [8]		2016/6/3		 (株)ひなの	        A01	みかん		100	1		
 [9]		2016/6/4		 (株)ひなの	     B03	マンゴ		500	1		
 [10]		2016/7/5		 ひなのカンパニー	B03	マンゴ		500	1		

(ひなの ) 2016/07/01(金) 20:45


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.