[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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
まず 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.