プロが教える店舗&オフィスのセキュリティ対策術

在庫管理で、ワークシート”入出庫表”で①在庫を補充し入庫したいとき、摘要欄A列に”在庫補充”を 棚№B列に棚№を 入庫数C列に数を入力し、[在庫更新ボタン]を押すとE列、F列、G列、H列、I列に自動入力され ワークシート”型式表”に在庫数が反映される仕組みです。②在庫から出庫したいとき、①との違いは摘要欄A列に”現品票から蔵出し” と 入庫数ではなく、出庫数D列に数を入力します。
①と②以外の動作をするとメッセージボックスをだして更新できないようにしております。

これをユーザーフォームにし入力制ではなく、選択制にして操作性あげたいのです。とてもややこしいことを質問しておりますが、よろしくお願いいたします。以下が[在庫更新ボタン]のコードになります。
Sub 在庫更新()

Dim k, i, m, cmax1, cmax2, rowsData As Long
Dim ws1, ws2 As Worksheet
Dim str As String

Set ws1 = Worksheets("型式表")
Set ws2 = Worksheets("入出庫表")

cmax1 = ws1.Range("A65536").End(xlUp).Row
cmax2 = ws2.Range("A65536").End(xlUp).Row

For i = 6 To cmax2

'---記入漏れ対策---
If ws2.Range("A" & i).Value = "" Then
MsgBox "摘要を記入してください"
Exit For

ElseIf ws2.Range("B" & i).Value = "" Then
MsgBox "棚№を記入してください"
Exit For

ElseIf ws2.Range("C" & i).Value <> "" And ws2.Range("D" & i).Value <> "" Then

MsgBox "入庫数と出庫数のどちらかを削除してください"
Exit For

ElseIf ws2.Range("C" & i).Value = "" And ws2.Range("D" & i).Value = "" Then
MsgBox "入庫数と出庫数のどちらかを記入してください"
Exit For

End If

'---I列の更新状況をチェック。更新済ならスキップ---
If ws2.Range("I" & i).Value <> "更新済" Then
MsgBox "更新しました"

str = ws2.Range("B" & i).Value

'---E列|日時の計算---
ws2.Range("E" & i).Value = Now


'---F列|型式名の自動出力---
For k = 2 To cmax1
If str = ws1.Range("A" & k).Value Then
ws2.Range("F" & i).Value = ws1.Range("B" & k).Value
Exit For
End If
Next


'---G列|入庫数を入れ込む---
If ws2.Range("C" & i).Value <> "" Then
ws2.Range("G" & i).Value = ws2.Range("C" & i).Value

ElseIf Range("D" & i).Value <> "" Then
ws2.Range("G" & i).Value = ws2.Range("D" & i).Value * (-1)

End If

'---H列|現在の在庫数を計算---
If i > 6 Then
For m = i - 1 To 6 Step -1
If str = ws2.Range("B" & m).Value Then
ws2.Range("H" & i).Value = ws2.Range("H" & m).Value + _
ws2.Range("G" & i).Value
Exit For
End If
Next
End If

If i = 6 Or m = 5 Then
ws2.Range("H" & i).Value = ws2.Range("G" & i).Value
End If


'---I列|更新済を入力---
Range("I" & i).Value = "更新済"
Range("A" & i & ":I" & i).Interior.ColorIndex = 15

'---「型式表」のF列を更新---
ws1.Range("F" & k).Value = Range("H" & i).Value

'---「現在の在庫数」が「最低保管在庫」を下回ったら黄色にする---
If ws1.Range("E" & k).Value > ws1.Range("F" & k).Value Then
ws1.Range("A" & k & ":G" & k).Interior.ColorIndex = 6
End If


'---「現在の在庫数」が「最低保管在庫」を上回ったら無色にする---
If ws1.Range("E" & k).Value <= ws1.Range("F" & k).Value Then
ws1.Range("A" & k & ":G" & k).Interior.ColorIndex = 0
End If



End If

Next

End Sub

「VBA ユーザーフォームにしたい」の質問画像

質問者からの補足コメント

  • うーん・・・

    お二方のご指摘を参考にユーザーフォームをどう使いたいかを説明させて頂きたいのですが文字数制限の為、補足内容文を画像にて添付させてもらってますことをご了承ください。

    操作性を上げたいと申しましたのは、他の者が操作するので手打ちで入力するより選択できるようにすることで入力ミスなどを少しでも防ぎたいのです。

    以降の補足に画像を添付させて頂きます。よろしくお願いいたします。

    「VBA ユーザーフォームにしたい」の補足画像1
      補足日時:2020/09/20 03:09
  • 画像内容を説明させて頂きます。
    6行目の内容です。
    ワークシート”入出庫表”  A列適用に在庫補充。B列棚№に111。C列入庫数に1。 を手動で入力し在庫更新ボタンを押すと E,F,G,H,I列に情報が自動入力され、ワークシート”型式表”に在庫数が反映される仕組みです。

    この手動で入力してしたのをまず在庫更新ボタンを押しユーザーフォームを出し1⃣適用2⃣棚№3⃣・4⃣入庫数OR出庫数  
    1⃣、2⃣、3⃣・4⃣を選択しOKボタンでそれぞれの列入力されるようにしたいのです。

    ※2⃣に関しましては画像のように棚№・型式・図番・符号が見えて選べるようにしたいのです。

    「VBA ユーザーフォームにしたい」の補足画像2
      補足日時:2020/09/20 03:32
  • どう思う?

    画像内容を説明させて頂きます。
    こちらのワークシート”型式表”はワークシート”入出庫表”で入力されたものが反映される仕組みなっております。よろしくお願いいたします。

    「VBA ユーザーフォームにしたい」の補足画像3
      補足日時:2020/09/20 03:38
  • どう思う?

    おはようございます。Qchan1962様。補足をさせて頂きます。

    これは、おかしいように思いますが、、手動で入力してしたデータでユーザーフォームを出しているのに、2⃣で変更してしまうと言う事でしょうか?

    変更する可能性があるのであれば、初めからユーザーフォームで選択してデータを書き込めば良いと思います。

    まさにその通りで、ユーザーフォームで選択した情報が入出庫表の6行目からA列、B列、C列orD列に書き込まれる。といった方法で進めたいのです。説明が足らず申し訳ございません。

    No.4の回答に寄せられた補足コメントです。 補足日時:2020/09/21 09:26

A 回答 (11件中1~10件)

#10です。


その通りです。
挿入場所は、少しIF文の書き方が良くある形で無かったので
見つけにくかったのかも知れませんね。
ご自身で探す事は、大事です。もし仕様を変更したい場合やリストを
追加したくなった時など、QAサイトでも人が書いたコードを丸っと示されて
直したいと言っても中々回答は付きません。ご自身で調べた内容や分からない点を含めるとスムースにアドバイスしてもらえる事が多いように思います。

従って、教えてもらったコードは、ご自身で理解する必要があります。
いきなりは無理でもステップ実行などで処理の流れや処理内容を確認するようにしてください。その積み重ねで理解やデバッグスキルが付いてくると思いますので。

こんな感じに纏めてみました。

Private Sub ComboBox1_Change()
With CommandButton1
If ComboBox1.Value = "在庫補充" Then
.Caption = "在庫補充"
.ForeColor = &HC00000 '入庫 青 .ForeColor = RGB(0, 0, 255)
End If
If ComboBox1.Value = "出庫" Then
.Caption = "出庫"
.ForeColor = &HFF& '出庫 赤 .ForeColor = RGB(255, 0, 0)
End If
End With
ComboBox2.Value = ""
ComboBox3.Value = ""
Label1.Caption = ""
End Sub

コメント部分の .ForeColor = RGB(0, 0, 255)は、この様な書き方でもOKと
言う意味ですが、せっかく調べて頂いたのでそのまま、使いました。

オブジェクトの名前などを変更した方がわかり易くなるかもしれません。
この辺は、調べて挑戦してみても良いかも知れませんね。
    • good
    • 0
この回答へのお礼

ありがとうございます。このコードを理解できるように努力したいと思います。
こんな未熟な私に優しくご指導くださり、ありがとうございます。

今後ともよろしくお願いいたします。

今回も本当にありがとうございました。

お礼日時:2020/09/23 01:36

こんばんは、


なるほど、、
意地悪する訳ではありませんが、聞いてばかりいると、ご自身のスキルも向上しませんし、調べる習慣がなくなります。
もっとも、勉強が目的でなく作成が1番だと思いますし、私みたいに自身使う為のVBAの作成は年に1度くらいでプロでないのでスキルアップも必要ないかもですが、、

ユーザーフォームはもっといろいろと細かい設定も出来ます。
ボタン自体を出さないとか、色を変えるとか、、なので
プロパティを参考にしてください。
オフィシャルが良いかと思いましたが、
わかり易い説明のある参考サイトです。

https://kosapi.com/post-3650/

プロパティのForeColorを設定してください。
フォーム作成時でも良いですし、VBAで設定しても良いです。

コード自体書いた方が、早かったのですが、
処理に影響する部分では無いですし、ご理解ください。
    • good
    • 2
この回答へのお礼

私のスキル向上まで心配してくださり有り難い限りです。
サイト拝見させてもらいました。
自分で色々試した結果分からずでアドバイスを頂きたく思います。
commandボタン1が入庫になる時は青
commandボタン1が出庫になる時は赤
になるようにするには
Private Sub ComboBox1_Change()
If ComboBox1.Value = "入庫" Then CommandButton1.Caption = "入庫"
If ComboBox1.Value = "出庫" Then CommandButton1.Caption = "出庫"
ComboBox2.Value = ""
ComboBox3.Value = ""
Label1.Caption = ""
End Sub

ここに
CommandButton1.ForeColor = &HC00000 ’入庫 青
CommandButton1.ForeColor = &HFF&   ’出庫 赤
を入れると色が変えれそうな気がしたのですが自分で考えた結果結局わかりませんでした。
ご解答頂けたら幸いです。

お礼日時:2020/09/22 23:51

こんにちは、


以前のコードにあったような気がしましたが、、

コマンドボタン1の処理を
Private Sub CommandButton1_Click()
Dim errmsg As String
Call error_check(errmsg)
If Len(Trim(errmsg)) <> 0 Then
MsgBox errmsg
GoTo endoutput
End If
'---メイン処理
Call 在庫補充(Rng)
'---
MsgBox ("入力が完了しました")
Unload Me
endoutput:
End Sub

キャンセルボタン
Private Sub CommandButton2_Click()
Unload Me
End Sub



処理を続けて行いたい場合などは無いのでしょうか?
もし、ユーザーフォームを消さずに続ける場合があるのであれば、
添付図の様にCheckBox1を追加して
コマンドボタン1の処理を下記のようにします。

Private Sub CommandButton1_Click()
Dim errmsg As String
Call error_check(errmsg)
If Len(Trim(errmsg)) <> 0 Then
MsgBox errmsg
GoTo endoutput
End If
'---メイン処理
Call 在庫補充(Rng)
'---
MsgBox ("入力が完了しました")
If CheckBox1.Value = False Then
Unload Me
Else
ComboBox2.Value = ""
ComboBox3.Value = ""
End If
endoutput:
End Sub

余談:先のご質問も解決されているようであれば、閉じる事をお勧めします。
「VBA ユーザーフォームにしたい」の回答画像9
    • good
    • 1
この回答へのお礼

Qchan1962様 何度もありがとうございます。

最後にcommandbutton1ですが在庫補充は青色文字、出庫のときは赤色文字にするのはできますでしょうか?
次々出して申し訳ありません。

>余談:先のご質問も解決されているようであれば、閉じる事をお勧めします。

先の質問は閉じさせて頂きます。

お礼日時:2020/09/22 19:10

#6,7です


>1点目。履歴として残し棚番で上書きせず、行下方向に増やしていく方法をとりたいと思いますがどこを変更すればよいのか?

Sub 在庫補充(Rng As Range)内に記載していますが、

'n = .Cells(Rows.count, "A").End(xlUp).Row + 1のシングルコーテーションを
削除してください。
上の n = Target.Row も削除可能です。


>2点目。入庫個数選択を1~18にしたいです。

Private Sub ComboBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)の

If ComboBox1.Value = "在庫補充" Then varMax = Rng.Offset(, 4).Value - Rng.Offset(, 5).Value

With ComboBox3
.Clear
For i = 1 To varMax
.AddItem i
Next
.ListIndex = varMax - 1
End With
が不要ですので削除してください。

また、その変数宣言も不要になりますので削除可能です。
i As Long,
Dim varMax As Integer
    • good
    • 0
この回答へのお礼

Qchan1962様 すごいです。本当にありがとうございます。
私のやりたかった以上のことができ感動しております。

後もう一つやりたいことがあります。
ユーザーフォームで入力が完了した時にメッセージボックスで”入力が完了しました”の後、ユーザーフォームを閉じたいのですがこれは可能でしょうか?

何度もお手数おかけしておりますがよろしくお願いいたします。

お礼日時:2020/09/21 16:07

#6 続きです



Sub 在庫補充(Rng As Range)
Dim n As Long, Target As Range, m As Long
Set Target = Worksheets("入出庫表").Range("B:B").Find(Rng.Value)
With Sheets("入出庫表")
If Target Is Nothing Then
n = .Cells(Rows.count, "A").End(xlUp).Row + 1
Else
n = Target.Row
'---下記1行をコメントを外すと履歴となります(上書きしない)
'n = .Cells(Rows.count, "A").End(xlUp).Row + 1
End If
.Range("A" & n).Value = ComboBox1.Value
.Range("B" & n).Value = Rng.Value
'---E列|日時の計算---
.Range("E" & n).Value = Now
'---F列|型式名の自動出力---
.Range("F" & n).Value = Rng.Offset(, 1).Value
'---G列|入庫数を入れ込む---
If ComboBox1.Value = "在庫補充" Then
.Range("C" & n).Value = ComboBox3.Value
.Range("D" & n).Value = ""
'---H列|現在の在庫数を計算---
.Range("H" & n).Value = Rng.Offset(, 5).Value + ComboBox3.Value
Else
.Range("D" & n).Value = ComboBox3.Value
.Range("C" & n).Value = ""
.Range("H" & n).Value = Rng.Offset(, 5).Value - ComboBox3.Value
End If
.Range("G" & n).Value = ComboBox3.Value
'---I列|更新済を入力---
.Range("I" & n).Value = "更新済"
.Range("A" & n & ":I" & n).Interior.ColorIndex = 15
End With
With Sheets("型式表")
m = Rng.Row
'---「型式表」のF列を更新---
If ComboBox1.Value = "在庫補充" Then
.Range("F" & m).Value = .Range("F" & m).Value + ComboBox3.Value
Else
.Range("F" & m).Value = .Range("F" & m).Value - ComboBox3.Value
End If
.Range("G" & m).Value = .Range("E" & m).Value - .Range("F" & m).Value
'---「現在の在庫数」が「最低保管在庫」を下回ったら黄色にする---
If .Range("E" & m).Value > .Range("F" & m).Value Then
.Range("A" & m & ":G" & m).Interior.ColorIndex = 6
End If
'---「現在の在庫数」が「最低保管在庫」を上回ったら無色にする---
If .Range("E" & m).Value <= .Range("F" & m).Value Then
.Range("A" & m & ":G" & m).Interior.ColorIndex = 0
End If
End With
End Sub
「VBA ユーザーフォームにしたい」の回答画像7
    • good
    • 1

こんにちは、


ユーザーフォームから選択して1型番ごと処理をするで作る場合、
入出庫表の書き込み意図の解釈がいまいち出来ません。
履歴として残すのか、最後の処理情報として書き込むのかです。
前者は、棚番で上書きせず、行下方向に増やしていく方法になると思いますし
後者は、棚番で上書きする方法になると思います。
その辺は、どの道、処理を書かなくてはならないと思いますので、ご自身で
変更してみてください。(変更ポイントを記します)

ユーザーフォームのオブジェクト作成は、大丈夫そうなので説明しませんが
列などあっているかも検証してください。
文字数オーバーになるようなので、分けて投稿します。
すべてユーザーフォームモジュールに書きます。

Option Explicit
Dim Rng As Range
Private Sub ComboBox1_Change()
If ComboBox1.Value = "在庫補充" Then CommandButton1.Caption = "在庫補充"
If ComboBox1.Value = "出庫" Then CommandButton1.Caption = "出庫"
ComboBox2.Value = ""
ComboBox3.Value = ""
Label1.Caption = ""
End Sub
Private Sub ComboBox2_Change()
ComboBox3.Value = ""
Label1.Caption = ""
End Sub

Private Sub ComboBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim i As Long, valCmb As String
Dim varMax As Integer
If IsNull(ComboBox2.Value) Then Exit Sub
valCmb = ComboBox2.Value
Set Rng = Worksheets("型式表").Range("A:A").Find(valCmb)
If ComboBox1.Value = "在庫補充" Then varMax = Rng.Offset(, 4).Value - Rng.Offset(, 5).Value
If ComboBox1.Value = "出庫" Then varMax = Rng.Offset(, 5).Value
Label1.Caption = " 棚№: " & Rng.Value & "  形式 : " & Rng.Offset(, 1).Value & vbCrLf & vbCrLf & _
" 図番・符号: " & Rng.Offset(, 2).Value & "  図番・符号: " & Rng.Offset(, 3).Value & vbCrLf & vbCrLf & _
" 最大保管数量 : " & Rng.Offset(, 4).Value & "  現在庫数: " & Rng.Offset(, 5).Value & "  必要補充数: " & Rng.Offset(, 4).Value - Rng.Offset(, 5).Value
With ComboBox3
.Clear
For i = 1 To varMax
.AddItem i
Next
.ListIndex = varMax - 1
End With
End Sub
Private Sub UserForm_Initialize()
Dim myArray As Variant
Dim i As Integer
With ComboBox1
.AddItem "在庫補充"
.AddItem "出庫"
.ListIndex = 0
End With
CommandButton1.Caption = "在庫補充"
With Worksheets("型式表")
myArray = .Range(.Cells(2, 1), .Cells(Cells(Rows.count, 1).End(xlUp).Row, 6))
End With
With ComboBox2
.ColumnCount = 4
.TextColumn = 2
.ColumnWidths = "40;60;60;60"
.BoundColumn = 1 '値列
.List() = myArray
End With
With ComboBox3
For i = 1 To 18
.AddItem i
Next
End With
End Sub
Private Sub CommandButton1_Click()
Dim errmsg As String
Call error_check(errmsg)
If Len(Trim(errmsg)) <> 0 Then
MsgBox errmsg
GoTo endoutput
End If
'---メイン処理
Call 在庫補充(Rng)
'---
endoutput:
End Sub
Private Sub CommandButton2_Click()
Unload Me
End Sub
Private Sub error_check(errmsg As String)
If ComboBox1.Value = "" Then errmsg = errmsg & "摘要欄: 選択してください。 " + vbNewLine
If IsNull(ComboBox2.Value) Then errmsg = errmsg & "棚№形式:選択してください。 " + vbNewLine
If ComboBox3.Value = "" Then errmsg = errmsg & "入出庫数:入力または、選択してください。 " + vbNewLine
End Sub
    • good
    • 0
この回答へのお礼

Qchan1962様 ありがとうございます。
このコードを試させて頂きましたところ、2点ほど教えて欲しいことがありました。
1点目。履歴として残し棚番で上書きせず、行下方向に増やしていく方法をとりたいと思いますがどこを変更すればよいのか?

2点目。入庫個数選択を1~18にしたいです。
なぜなら最大保管在庫数よりも入庫数が一時的に上回る時があるからです。

素晴らしくハイレベルなことをされており、私なんかでは到底応用もできませんで、おんぶにだっこで申し訳なく、感謝と尊敬しかありません。
よろしくお願いいたします。

お礼日時:2020/09/21 14:16

>私の説明よりもbookを載せるのが確かに手っ取り早く


>名案ですが、ここに載せれるのですか?

10年程前ですがその方法は『ネット上のマナーとして不適切』と言う回答者間でのやり取りもあって、その前までは勧めてましたがそれをやめました。
実際Bookをアップして質問できる掲示板もありましたが、ウィルスを仕込むなどの危険性に対して管理者側が無対応ってのも問題だったのか、その掲示板は閉鎖になりました。

今回の提案は回答者側がBookをアップしてそちらでチェックして貰いって感じで書きましたが、やはりウィルスや意図しない動きを故意に仕込むなどで問題になってもって事でやめた方が良いのかなと。
それならキチンと契約した人に作成依頼をされるのが望ましいでしょう。
    • good
    • 1
この回答へのお礼

ありがとう

おはようございます。
そういう意味でしたか。
勘違いしておりました。

それなら十分解りやすく説明してくださっているので大丈夫です。

お礼日時:2020/09/21 08:21

こんばんは、



この手動で入力してしたのをまず在庫更新ボタンを押しユーザーフォームを出し
1⃣適用2⃣棚№3⃣・4⃣入庫数OR出庫数  
1⃣、2⃣、3⃣・4⃣を選択しOKボタンでそれぞれの列入力されるようにしたいのです。

※2⃣に関しましては画像のように棚№・型式・図番・符号が見えて選べるようにしたいのです。

これは、おかしいように思いますが、、手動で入力してしたデータでユーザーフォームを出しているのに、2⃣で変更してしまうと言う事でしょうか?

変更する可能性があるのであれば、初めからユーザーフォームで選択してデータを書き込めば良いと思います。

チェック代わりにユーザーフォームを使うなら、下記のような感じで良いのかな?

①(添付図)
Sub Form_Show()
Dim Target As Range
Set Target = Worksheets("入出庫表").Cells(Rows.count, "B").End(xlUp)
If Target = "" Then MsgBox ("棚№を入力してください。"): Exit Sub
If Target.Offset(, 1) = "" And Target.Offset(, 2) = "" Then _
MsgBox ("入庫数又は出庫数どちらか1つを入力してください。"): Exit Sub
If Target.Offset(, 1) <> "" And Target.Offset(, 2) <> "" Then _
MsgBox ("入出庫同時作業は出来ません。入庫数又は出庫数どちらか1つを入力してください。"): Exit Sub
UserForm2.Show
End Sub

Private Sub UserForm_Initialize()
Dim Rng As Range, Target As Range
Dim Apy As String, maxV As Integer
Dim i As Integer, inpV As Integer
Set Target = Worksheets("入出庫表").Cells(Rows.count, "B").End(xlUp)
Set Rng = Worksheets("型式表").Range("A:A").Find(Target.Value)
If Target.Offset(, 1) <> "" Then
Apy = "<入庫処理>"
inpV = Target.Offset(, 1)
maxV = Rng.Offset(, 4) - Rng.Offset(, 5)
Else
Apy = "<出庫処理>"
inpV = Target.Offset(, 2)
maxV = Rng.Offset(, 5)
End If
If inpV > maxV Then
MsgBox ("入力値が範囲を超えています。修正して入力します。")
inpV = maxV
End If
With ComboBox1
For i = 1 To maxV
.AddItem i
Next
.ListIndex = inpV - 1
End With
Label1.Caption = Apy & vbCrLf & vbCrLf & _
" 棚№: " & Rng.Value & _
"  形式 : " & Rng.Offset(, 1).Value & vbCrLf & vbCrLf & _
" 図番・符号: " & Rng.Offset(, 2).Value & _
"  図番・符号: " & Rng.Offset(, 3).Value & vbCrLf & vbCrLf & _
" 最大保管数量 : " & Rng.Offset(, 4).Value & _
"  現在庫数: " & Rng.Offset(, 5).Value & _
"  必要補充数: " & Rng.Offset(, 6).Value

End Sub

UserFormに Label1、ComboBox1 を設置 、さらにCommandButtonを設置して実行プログラムを書きます。



もし、UserFormから個々を入力していくなら、ざっくり

Private Sub ComboBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim Rng As Range
Dim i As Long, valCmb As String
If IsNull(ComboBox2.Value) Then Exit Sub
valCmb = ComboBox2.Value
Set Rng = Worksheets("型式表").Range("A:A").Find(valCmb)
Label1.Caption = " 棚№: " & Rng.Value & "  形式 : " & Rng.Offset(, 1).Value & vbCrLf & vbCrLf & _
" 図番・符号: " & Rng.Offset(, 2).Value & "  図番・符号: " & Rng.Offset(, 3).Value & vbCrLf & vbCrLf & _
" 最大保管数量 : " & Rng.Offset(, 4).Value & "  現在庫数: " & Rng.Offset(, 6).Value & "  必要補充数: " & Rng.Offset(, 6).Value

End Sub

Private Sub UserForm_Initialize()
Dim myArray As Variant
Dim i As Integer
With ComboBox1
.AddItem "在庫補充"
.AddItem "出庫"
.ListIndex = 0
End With
With Worksheets("型式表")
myArray = .Range(.Cells(2, 1), .Cells(Cells(Rows.count, 1).End(xlUp).Row, 6))
End With
With ComboBox2
.ColumnCount = 4
.TextColumn = 2
.ColumnWidths = "40;60;60;60"
.BoundColumn = 1 '値列
.List() = myArray
End With
With ComboBox3
For i = 1 To 18
.AddItem i
Next
End With
End Sub

Private Sub CommandButton1_Click()
Dim errmsg As String
Call error_check(errmsg)
If Len(Trim(errmsg)) <> 0 Then
MsgBox errmsg
GoTo endoutput
End If
'---メイン処理

'---
endoutput:
End Sub

Private Sub error_check(errmsg As String)
If ComboBox1.Value = "" Then errmsg = errmsg & "摘要欄: 選択してください。 " + vbNewLine
If IsNull(ComboBox2.Value) Then errmsg = errmsg & "棚№形式:選択してください。 " + vbNewLine
If ComboBox3.Value = "" Then errmsg = errmsg & "入出庫数:入力または、選択してください。 " + vbNewLine
End Sub

UserFormに Label1、ComboBox1、ComboBox2、ComboBox3を設置 、さらにCommandButtonを設置して '---メイン処理に実行プログラムを書きます。
「VBA ユーザーフォームにしたい」の回答画像4
この回答への補足あり
    • good
    • 1
この回答へのお礼

ありがとう

Qchan1962様 いつも貴重な知識と時間を使って下さり感謝します。
コードをコピーして使わせて頂きましたところ、②の個々を入力していくやり方にしたく思いました。
まずユーザーフォームを開くボタンをクリック。
次にコンボボックス1で在庫補充を選択した場合。
次にコンボボックス2で棚№を選択。
次にコンボボックス3で個数を選択。
するとLABEL1に棚№・型式・図番が現れて感動しました。

ここからcommandbutton1をクリックしたら
ワークシート”入出庫表”A列に摘要 ”在庫補充”が入り
ワークシート”入出庫表”B列に棚№が入り
ワークシート”入出庫表”C列に入庫数が入り、
Sub在庫更新()のコードを足して
ワークシート”入出庫表”E列に記入日時、F列に型式、G列に入出庫数、H列に現在の在庫数、I列に状況”更新済み”が入り

ワークシート”型式表”F列に現在の在庫数が反映されるという流れにしたいのですがそれは可能でしょうか?

また、ユーザーフォームで出庫を選択した場合は
ワークシート”入出庫表”D列に出庫数が入るようにしたいです。

説明力が乏しくお手間かけてますがどうかよろしくお願いいたします。

お礼日時:2020/09/21 01:51

初級者なので何となくですが、回答するにも文字ではなくBookをアップロードした方が早いのかなとは思えます。

(仮に正解でなくとも参考資料として)

ただその方法は過去に非難されてもいますし(アップロード先のリンクが切れたらQ&Aサイトの意味がない等で)、Officeをぶっ壊した者なので作成自体も出来ませんしね。
図と文字で作成方法を解説するのもExcelがあっても初級者には(私レベルでは)厳しいでしょう。(故にベテラン回答さんへ他力本願)
    • good
    • 1
この回答へのお礼

どう思う?

めぐみん_様 アドバイスありがとうございます。

私の説明よりもbookを載せるのが確かに手っ取り早く
名案ですが、ここに載せれるのですか?

お礼日時:2020/09/21 01:53

こんばんは、


示されている処理は、シート上で条件により処理内容を分け、繰り返し実行するものだと思います。それを、ユーザーフォームから行うのは、良いのですが、ユーザーフォームから何を条件に処理を行うのでしょうか?
型名に合うデータのみに行うのか、棚番から行うのか、などが解りません。
また、コンボボックスを使うにしても、リストの登録方法などは出来ているのでしょうか?(添付図が見えないので、分けてもう少し大きいサイズでアップロードしてください)
>これをユーザーフォームにし入力制ではなく、選択制にして操作性あげたいのです。
残念ながら、操作性などの向上は、どのような状況を指しているのかも伝わっていません。ユーザーフォームからだとおそらく1形式名などから1つずつ実行する事になりそうですが、、、
ユーザーフォームからなさりたい事をもう少し詳しく提示した方が良いかも知れませんね。
    • good
    • 1
この回答へのお礼

ありがとう

Qchan1962様 いつもお世話になってます。
私の説明不足、知識不足からお手数をおかけしておりますが、
どうかよろしくお願いいたします。

お礼日時:2020/09/21 01:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!