質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

2029閲覧

Excel VBA ドロップダウンリスト 連動について

Yoshikun_0945

総合スコア224

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/01/15 09:19

編集2020/01/16 02:57

##使用ソフト・プログラミング言語
使用ソフト:Excel2016
使用言語:VBA

前提・実現したいこと

Excel VBA ファイル(.xlsx)から別ブック(.xlsx)を起動して、セルに入力規則としてドロップダウンリストを作成いたしました。

ドロップダウンリストにて選択できる値を連動させたいのですが、ドロップダウンリストのファイルは.xlsxで可能でしょうか?

発生している問題・エラーメッセージ

各行の4列目の値を上限として、0から上限値までの整数をドロップダウンリストにて選択できるようにしましたが、
ドロップダウンリストの選択値の合計が4列目の値を超過する場合があることが判明しました。
6列目にて選択した値が4列目と等しい場合は、8列目・10列目を0とし、6列目にて選択した値が、4列目の値未満の場合は、6列目・8列目で選択できる値は、12列目【=4列目-6列目-8列目-10列目という演算列です。】の値を上限としたいです。

該当のソースコード

 Option Explicit Dim Row, Col, RMax, CMax, Cnt, Max, i As Integer Public CellList() As Variant Dim ListStr, Exf As String public sub List()  Cnt = 0 'カウント用変数を宣言し、初期値を格納する Exf = Dir(Path & "Q*.xlsx") '対象ファイルを取得する Do While Exf <> "" '対象ファイルがなくなるまで繰り返す If Ename(Cnt) = Exf Then '取得したファイル名と編集するファイル名が一致した場合 If Cnt < 7 And De(Cnt + 11) = True Then On Error Resume Next Workbooks.Open Path & Exf '当該ファイルを開く Worksheets(1).Select '左から1番目のシートを選択 Col = 1: Row = 1: CMax = 1: RMax = 1 '行番号 ・ 列番号の初期値を設定する CMax = Cells(1, 1).End(xlToRight).Column '右端の列番号を変数に格納する RMax = Cells(1, 1).End(xlDown).Row '下端の行番号を変数に格納する For Row = 2 To RMax '明細行の間繰り返す Max = Cells(Row, 4).Value '入庫数量を変数に格納する If Max > 40 Then '入庫数量が40超えの場合 Max = 40 '最大値を40とする End If ReDim CellList(Max) '入力規則用配列を設定する For i = 0 To Max '入庫数量の間繰り返す CellList(i) = i '現在のカウント数値を配列に格納する Next ListStr = Join(CellList, ",") '入力リストを文字列化する For Col = 6 To 10 Step 2 Cells(Row, Col).Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Formula1:=ListStr '入力規則を設定する Cells(Row, Col).Validation.ErrorTitle = "エラー" 'エラー発生時のタイトルを設定する Cells(Row, Col).Validation.ErrorMessage = "入荷数量以内で入力してください。" 'エラーメッセージを設定する Next Next Cells(1, 1).Select: ActiveWorkbook.Save 'A1セルに移動してここまでの作業を保存する Workbooks(Exf).Close 'Excelを終了する On Error GoTo 0 End If End If Exf = Dir(): Cnt = Cnt + 1 Loop end sub

###入力ファイル
入力ファイルにつきましては、配達数量の入力処理を実施する端末がマクロ非対応のため、Xlsx拡張子とさせていただいています。
######配達数量を入力する前の状態の例です。

日付届け先商品名入荷数量配達数量1配達数量2配達数量3残り
2020/02/01A部B課手提げ袋小1000010
2020/02/01C部D係手提げ袋中4000040

######配達数量1で入荷数量(最大値)を入力した場合

日付届け先商品名入荷数量配達数量1配達数量2配達数量3残り
2020/02/01A部B課手提げ袋小1010000
2020/02/01C部D係手提げ袋中4040000

配達数量2も3も1以上の値が入力できるようになっています。

######配達数量1と2のそれぞれに入荷数量(最大値)を入力した場合

日付届け先商品名入荷数量配達数量1配達数量2配達数量3残り
2020/02/01A部B課手提げ袋小1010100-10
2020/02/01C部D係手提げ袋中4040400-40

配達数量の合計が入荷数量を超過しているため、残り数量がマイナスとなっています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2020/01/15 11:28

"使用ソフト:Access2016"とありますがExcelの話ではないのですか?
meg_

2020/01/15 11:44

文章を読みましたが理解できませんでした。シートとドロップダウンリストの画像を貼った方が分かりやすくなるかと思います。
guest

回答2

0

ベストアンサー

xlsmブックのThisWorkbookモジュールに下記コードを記述します。

VBA

1Option Explicit 2 3Private WithEvents XlA As Excel.Application 4 5Private Sub Workbook_Open() 6 Set XlA = Excel.Application 7End Sub 8 9Private Sub XlA_SheetChange(ByVal Sh As Object, ByVal Target As Range) 10 If Sh.Parent Is ThisWorkbook Then Exit Sub 11 Dim Rng As Range 12 For Each Rng In Target 13 If Rng.Row > 1 Then 14 Select Case Rng.Column 15 Case 4, 6, 8 16 Dim Qty As Long, Col As Long, Lst As String, i As Long 17 Qty = Sh.Cells(Rng.Row, 4).Value 18 For Col = 6 To 10 Step 2 19 If Col > Rng.Column Then 20 If Qty = 0 Then 21 Lst = "0" 22 Else 23 Lst = "1" 24 For i = 2 To Qty 25 Lst = Lst & "," & i 26 If i = 40 Then Exit For 27 Next i 28 End If 29 With Sh.Cells(Rng.Row, Col).Validation 30 .Delete 31 .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Formula1:=Lst '入力規則を設定する 32 .ErrorTitle = "エラー" 'エラー発生時のタイトルを設定する 33 If Col = 6 Then 34 .ErrorMessage = "入荷数量以内で入力してください。" 'エラーメッセージを設定する 35 Else 36 .ErrorMessage = "残数量以内で入力してください。" 37 End If 38 End With 39 End If 40 Qty = Qty - Sh.Cells(Rng.Row, Col).Value 41 Next Col 42 End Select 43 End If 44 Next Rng 45End Sub 46 47

投稿2020/01/16 02:02

iruyas

総合スコア1067

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yoshikun_0945

2020/01/16 02:41

回答いただきまして誠にありがとうございます。 上記のコードは、ドロップダウンリストをつけるExcelファイルでしょうか? Excelファイルの書式を操作するためのExcelVBAファイルでしょうか?
iruyas

2020/01/16 03:27

ドロップダウンリストを動的に設定するプログラムになります。 xlsmブックと同時に開いている別のブックのすべてのシートが対象になります。
Yoshikun_0945

2020/01/16 03:41

かしこまいりました。 後程試してみます。
guest

0

ドロップダウンリストにて選択できる値を連動させたいのですが、ドロップダウンリストのファイルは.xlsxで可能でしょうか?

マクロなんか使わなくても、名前の定義を可変の範囲に
設定することが可能です。
この辺は、掲示板で質問するくらいなら、
Webで検索した方が、いつ回答が得られるかわからない掲示板で質問するより、
画像付きの解説等がいくつかあると思うので
そちらを見た方が解決が早いかと思います。

それから、数字を入れるだけの為ににドロップダウンリスト的な
ものを使うのは賛成できかねます。
いろいろなサイトでそのような入力をさせられる場面がありますが、
数字のみならテンキーの方がよっぽど入力が楽かと。
あと、ドロップダウンということは、
最低限2回クリックしなければならず、
ましてや40個選択肢があるとしてそのうちの30を探すのも
一苦労ではないですか?
そして、リストのフォント大きさがセルのフォントの大きさ
になるので、選択肢の文字が小さくて選びにくくないですか?
そんなこんなで個人的にすごく使いづらいなという印象です。

なので、入力規則で注意を促すとともに、
条件付き書式設定で色を付けるなりして強調してやるくらいで、
いいのではないかなぁと思います。

あと、エクセルの使い方はエクセルのフォーラムとか掲示板等で、
された方が、VBAも含めて総合的にアドバイスが貰えるのではないか
と思います。

投稿2020/01/16 03:40

mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問