VBA初心者なのですが、参考書やインターネットを勉強しながら取り組んでいます。行き詰っているので助け舟を頂戴できればと思います。
やりたいのは1800アイテムほどある食品リストからコードと食品名を検索するプログラムです。
もとになるデータは、B食品群、C食品コード、D食品名、あとは成分値が右にずっと続いています。
コンボボックスを3つ作り、食品群、食品コード、食品名が表示されるようにしました。
これらを連動させ、
1食品群ー食品名で探す
2コードー食品名で探す
3食品名を直接入力して探す
いずれにも対応できるようなもの、最終的には任意のセルに選択した食品名及びその食品のコードを表示できるようにしたいのです。
リスト範囲は
Private Sub UserForm_Initialize()
'食品群のリスト範囲’(食品群は18種)
ComboBox1.RowSource = "処理!B3:B20"←リスト選択用に見出しの部分だけ別シートに作りました
'食品名のリスト範囲’
ComboBox2.RowSource = "食品成分表!D4:D1885"
'食品コードのリスト範囲’
ComboBox3.RowSource = "食品成分表!C4:C1885"
End Sub
とし、
Private Sub comboBox1_Change()
'食品群リスト、食品名リストを連動させる’
Dim selIndex As Integer
selIndex = Me.ComboBox1.ListIndex
Select Case selIndex
Case 0
Me.ComboBox2.RowSource = "食品成分表!D4:D146"
<以下Case 18まで続く>
End Select
End Sub
と、食品群と食品は連動できたのですが、食品群とコード、コードと食品名がつなげられません。
Addltemでひとつづつ書いてもみましたが、1800ともなると量が多すぎるようでエラーになってしまいます。
よろしければアドバイスをお願いします。
No.1
- 回答日時:
VBAは操作画面の所の調整に使って、本体の重要な部分はSQLで組んだほうがよろしいかと思います。
1800アイテムある食品名と食品コードを一覧表にされているのなら、SQLのSELECTで抽出できます。
後は抽出したデータを画面に表示するだけで完成です。
VBAはクライアントの端末で要求を貰ったり、その要求に対しての回答をフォームにきちんと表示する時に使ったりしますね。
ご参考まで
早速のご回答ありがとうございます。
勉強不足で申し訳ありません。SQLというのは、エクセルの中でVBAと組み合わせられるものなのでしょうか。
検索をしてみましたが、SQL Server というのが必要なのですか?
出来上がったら友人と使いたいので、比較的互換性のあるものがいいのですが・・。
私がやろうとしていることはマクロやVBAでは無謀なのでしょうか・・。
お礼ながら質問みたいですよね・・スミマセン
ありがとうございました
No.2
- 回答日時:
No1さんはたぶんAccessについて回答されていると思いますので、EXCELとは違います。
記入不足で申し訳ありません。お聞きしたいのはエクセルにおけるマクロ及びVBA活用上についてです。
Scotty_99さん フォローありがとうございました
No.3
- 回答日時:
VBとなっているが、エクセルVBAですね。
それならAddItemなど使わずに、ListFillRangeを活用しましょう。
18食品群があるということなので
A列にA1:A18まで
a
b
c
・
・
p
q
r
と食品群名リストを作る。
B列に
食品群に属する食品をまとめた食品名を固める
それを
c1:c3 a群の塊
c4:c8 b群の塊
c9:c13 c群の塊
c14:c17 d群の塊
・・・
のように入れる。文字列で入れる。
本当は各群が100近くあるからa群はC1:C102、b群は
C103:C208とかのようになる。
c1:c3セルにはa群の商品名
c4:c8セルにはb群の商品名
・・・
を入れる。
c1:c15(一部です)は
a1
a2
a3
b1
b2
b3
b4
b5
c1
c2
c3
c4
c5
d1
d2
を入れる。
Private Sub ComboBox1_Change()
i = ComboBox1.ListIndex
ComboBox2.ListFillRange = Cells(i + 1, "B")
End Sub
でCombobox1で群を選ぶと、Combobox2にその群の商品リストが現れる。
この場合だとコンボ1でaを選ぶと、コンボ2に
a1
a2
a3が現れる。
たった2行でテーブル方式の威力がわかる。
B列のテーブルを商品が増える都度メンテが必要だが。
丁寧な解説ありがとうございます。
No4さんの解説とあわせて取り組み、なんとか形になりそうです。
あとは結果をもとにした計算式を入れればなんとか自分のやりたいことができるかなと思います。
本当にありがとうございました。
No.4ベストアンサー
- 回答日時:
結果を別に持つ方がやりやすいかと思います。
UserForm に ComboBox を3つ、ListBox を1つ、CommandButton を1つ置いて
試してます。
AddItem でやってますのでソートされてなくても大丈夫ですが、ソート
されているなら #3さんのような工夫をされた方が速いでしょう。
読み取ったイメージだけで作ってますので、的外れかも知れませんし、
そのままでは動かないかも知れません。
試すなら元ブックのコピーを用意するなどテスト環境で。
'----------------------------------------------------------------
Private Sub UserForm_Initialize()
ComboBox1.RowSource = "処理!B3:B20"
ComboBox2.RowSource = "食品成分表!D4:D1885"
ComboBox3.RowSource = "食品成分表!C4:C1885"
ListBox1.ColumnCount = 3
CommandButton1.Enabled = False
End Sub
'----------------------------------------------------------------
Private Sub ComboBox1_Change()
Dim c, first As String
ListBox1.Clear
CommandButton1.Enabled = False
With Worksheets("食品成分表").Range("B3:B1885")
Set c = .Find(Me.ComboBox1.Text, LookIn:=xlValues)
If Not c Is Nothing Then
first = c.Address
Do
With Me.ListBox1
.AddItem c.Text
.List(.ListCount - 1, 1) = c.Offset(0, 1).Text
.List(.ListCount - 1, 2) = c.Offset(0, 2).Text
End With
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> first
End If
End With
End Sub
'----------------------------------------------------------------
Private Sub ComboBox2_Change()
Dim c, first As String
ListBox1.Clear
CommandButton1.Enabled = False
With Worksheets("食品成分表").Range("D3:D1885")
Set c = .Find(Me.ComboBox2.Text, LookIn:=xlValues)
If Not c Is Nothing Then
first = c.Address
Do
With Me.ListBox1
.AddItem c.Offset(0, -2).Text
.List(.ListCount - 1, 1) = c.Offset(0, -1).Text
.List(.ListCount - 1, 2) = c.Text
End With
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> first
End If
End With
End Sub
'----------------------------------------------------------------
Private Sub ComboBox3_Change()
Dim c, first As String
ListBox1.Clear
CommandButton1.Enabled = False
With Worksheets("食品成分表").Range("C3:C1885")
Set c = .Find(Me.ComboBox3.Text, LookIn:=xlValues)
If Not c Is Nothing Then
first = c.Address
Do
With Me.ListBox1
.AddItem c.Offset(0, -1).Text
.List(.ListCount - 1, 1) = c.Text
.List(.ListCount - 1, 2) = c.Offset(0, 1).Text
End With
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> first
End If
End With
End Sub
'----------------------------------------------------------------
Private Sub CommandButton1_Click()
With Me.ListBox1
MsgBox .List(.ListIndex, 0) & vbCrLf & _
.List(.ListIndex, 1) & vbCrLf & _
.List(.ListIndex, 2)
End With
End Sub
'----------------------------------------------------------------
Private Sub ListBox1_Click()
CommandButton1.Enabled = ListBox1.ListCount <> -1
End Sub
私の質問文を元に、あっという間にすらすら組めるなんて本当に凄い!びっくりしました。
ほぼ、私のイメージしていたとおりです。
今まで作ったものに追加し、最終的な結果は、セルに表示したかったので、MsgBox のあたりを、
With Me.ListBox1
Range("D10").Value = .List(.ListIndex, 1) & " " & .List(.ListIndex, 2)
End With
と置き換えたらセル表示することができました!
記述していただいたVBAの中にはわからないものもあるので、本を引き引き解読,勉強しています。
本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- SQL Server DBのテーブルの設計ができず困っています。 2 2023/06/29 16:43
- Excel(エクセル) エクセルで値ではなく関数を参照する方法 6 2023/03/19 00:50
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
- メルカリ <メルカリShops>消費者庁による販売許可の出ている機能性表示食品?の調べ方から 1 2022/11/24 17:46
- Excel(エクセル) 重複データの抽出について 2 2023/07/21 14:52
- Visual Basic(VBA) ユーザーフォームに2つのコンボボックス銀行名「ConboBox1」支店名を「ConboBox2」とし 4 2022/08/03 17:34
- 家政学 編入試験について 1 2022/08/22 03:00
- Visual Basic(VBA) VBA 税率を判定表する方法を教えて下さい。 10 2022/03/28 11:21
- スーパー・コンビニ 家事、1週間のうち、食品スーパーで何回買い物をしますか? 3 2023/05/01 17:36
- お菓子・スイーツ お菓子についての質問第2弾です!選択肢増やしてみました。 ①性別・年代 ②知らない店でお菓子を買う・ 1 2023/05/04 09:32
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
ユーザーフォーム 3つのコンボボックスの連動について教えてください。
Excel(エクセル)
-
【Excel VBA】コンボボックスで選択した値の取得
Excel(エクセル)
-
コンボボックスにリストが表示されません・・・
Excel(エクセル)
-
-
4
VBA コンボボックスで選んだ値を取得するには
その他(Microsoft Office)
-
5
コンボボックスのインデックスが不正
Visual Basic(VBA)
-
6
同じコンボボックスを二つ以上作る方法
Visual Basic(VBA)
-
7
エクセルVBA ユーザーフォーム 複数のコンボボックス 同一リスト
Excel(エクセル)
-
8
UserForm1.Showでエラーになります。
工学
-
9
コンボボックス ▼ボタンをクリックしたらイベント
PowerPoint(パワーポイント)
-
10
コンボボックス内の文字サイズ変更
Excel(エクセル)
-
11
エクセルVBA テキストボックスに3桁ごとにコンマ
Visual Basic(VBA)
-
12
EXCEL VBA コンボボックス、テキストボックスが未入力のときメッセージを表示する方法
Excel(エクセル)
-
13
エクセルvba (ByVal Target As Range)について
Excel(エクセル)
-
14
コンボボックスの文字によるif文の作成
Visual Basic(VBA)
-
15
エクセルVBA 別シートからのコンボボックス連動
Visual Basic(VBA)
-
16
ユーザーフォームに入力したデータを保持する方法
Visual Basic(VBA)
-
17
VBA フォームのテキストボックスにセルの値を表示させたいが改行していたら改行もあわせて表示させたい
Excel(エクセル)
-
18
Excel VBA ユーザーフォーム内のラベルにテキストボックスの小計を出す方法
Visual Basic(VBA)
-
19
エクセルVBA ユーザーフォームのTextBoxを日付にしたい
Excel(エクセル)
-
20
エクセルVBA オプションボタンのチェックを外したい
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
pythonにてseleniumを使うも、...
-
Exel VBA 別ブックから該当デ...
-
chatgptでつくってもらったコー...
-
ExcelのVBAコードについて教え...
-
パイソンプログラム
-
フィルターかけた後、重複を除...
-
1、Rstudioで回帰直線を求める...
-
vb6.0の実行時エラー'3075'につ...
-
Gitのクローンについて
-
特定行の背景色を変えたいのですが
-
Excel VBA素人です。VBAで図形...
-
コンパイルエラー 変数が定義...
-
access2003 クエリSQL文に...
-
楽観的排他処理のためViewState...
-
プレースホルダー
-
CFormViewでの印刷について
-
変数名「cur」について
-
文字コードについて
-
Excel VBAについて
-
SQL
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フィルターかけた後、重複を除...
-
access2003 クエリSQL文に...
-
1日に1人がこなせるプログラム...
-
Exel VBA 別ブックから該当デ...
-
pythonにてseleniumを使うも、...
-
ExcelのVBAコードについて教え...
-
ExcelのVBAコードについて教え...
-
chatgptでつくってもらったコー...
-
欠番の抽出について
-
JANコードとPOSコードは同じ?
-
JavaScriptの定数名が取り消し...
-
1、Rstudioで回帰直線を求める...
-
特定行の背景色を変えたいのですが
-
変数名「cur」について
-
PreviewKeyDownイベントが2回...
-
将来AIが進歩してくるにつれて...
-
ACCESSユニオンクエリでORDER B...
-
COBOLの文法
-
VBAでファイルオープン後にコー...
-
Nullの使い方が不正です。
おすすめ情報