EXCEL VBAによる在庫管理のための入出庫プログラム

このQ&Aのポイント
  • EXCEL VBAを使用して、テキストボックスに入出庫の数値を入力し、在庫数を増減させるプログラムを作成したいです。
  • プログラムの中で、offsetを使用してセルをずらすことができるか試しましたが、うまく動作しませんでした。
  • 方法をご存知の方がいらっしゃいましたら、ご回答よろしくお願いします。
回答を見る
  • ベストアンサー

EXCEL VBAについての質問です

質問させてください。 添付した画像のような表にて在庫の管理をしたいと考えています。 VBAのフォームを使用し、テキストボックスに入出庫の数値を入れ、 入庫、出庫のボタンを押し、在庫の数値を増減させたいと思っています。 下に書かせていただいたような流れでできないものかと思ったのですが、 3行目と4行目のプログラムがうまく動作させられません。 offsetを使用し、セルをずらすことができるかと思いましたが エラーが出てしまい実行することができませんでした。 どなたか方法をご存知の方がいましたら回答よろしくお願いします。 また、もっとベターな方法がありましたらアドバイスをよろしくお願いします。 Private Sub CommandButton1_Click() '「a」という単精度浮動小数点数型 の変数を宣言する. Dim a As Single 'ワークシート「Sheet1」をアクティブにする. Worksheets("Sheet1").Activate 'textbox1の内容を変数aに入れる. a = TextBox1.Value1 'Comboboxで選択したセルの4つ右隣のセルの値を(A32)に記入する Worksheets("Sheet1").Range("A32") = ComboBox1.Offset(4,0).Value 'セル(A32)と変数aを足し、その値をComboboxで選択したセルの4つ右隣のセルに記入する 'Worksheets("Sheet1").ComboBox1.Offset(4,0).Value = a + ComboBox1.Offset(4,0).Value End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

肝心のあなたの「コンボボックス」の中身が不明なので、勝手に考えて説明します。 準備: コンボボックスを使って、シートの「B列」の上から下までに表示されてる中から1個を選んでいるものとします もっと噛み砕いて言うと、コンボボックスのプルダウンには、B2以下(見えませんけどたとえばB32まで)の1つ1つのセルの内容が並んでいるということです。 Private Sub CommandButton1_Click() ’加算  if me.combobox1.listindex < 0 then exit sub  if me.textbox1 = "" then exit sub  worksheets("Sheet1").cells(me.combobox1.listindex + 2, "F") _  = worksheets("Sheet1").cells(me.combobox1.listindex + 2, "F") + me.textbox1.value end sub Private Sub CommandButton2_Click() ’減算  if me.combobox1.listindex < 0 then exit sub  if me.textbox1 = "" then exit sub  worksheets("Sheet1").cells(me.combobox1.listindex + 2, "F") _  = worksheets("Sheet1").cells(me.combobox1.listindex + 2, "F") - me.textbox1.value end sub

barakamonZ
質問者

お礼

説明不足の部分までくみ取っていただきありがとうございます。 実行してみたところ、問題なく動作しました。 本当に助かりました。

関連するQ&A

  • excel VBA リストボックス複数選択後の処理

    どなたか教えてください。 Sheet1にユーザーフォームを使用しデータを入力しています。 リストボックスが複数選択した後にコマンドボタンをクリックした際、 選択項目を1行のセル[Cells(myRow, 16)~Cells(myRow, 20)]に左詰めで表示したい場合はどのようにするのでしょうか? 例:リストボックスには10項目あるとして、そのうち1行目、3行目、5行目だけが選択された場合のパターンで、1行目がCells(myRow, 16)、3行目がCells(myRow, 17)、5行目がCells(myRow, 18)に表示したいのですが・・・。 最大5項目選択とみています。 ※コマンドボタンは他のTextBox等も含まれ、下記のような感じです。 Private Sub CommandButton1_Click() Dim myRow As Long Sheets("Sheet1").Select myRow = Range("A65536").End(xlUp).Offset(1, 0).Row '各テキストボックの値をセルに入力 Cells(myRow, 1).Value = TextBox1.Value Cells(myRow, 2).Value = TextBox2.Value Cells(myRow, 3).Value = ComboBox1.Value Cells(myRow, 4).Value = TextBox3.Value Cells(myRow, 5).Value = TextBox4.Value . . . Cells(myRow, 16).Value = Cells(myRow, 17).Value = Cells(myRow, 18).Value = . . . 'セルに入力が各テキストボックの値をクリア TextBox3.Value = "" TextBox4.Value = "" ComboBox2.Value = "" ComboBox3.Value = "" 'フォーカスをTextBox3に移動 TextBox3.SetFocus End Sub

  • excel VBA コンボボックスでシート選択後エラー

    どなたかご教授願います。 ユーザーフォームにコンボボックスを配置し、ブック内のシートすべて選択できるようにしてます。選択後シートに移動するのですが、同じユーザーフォームのテキストボックス等に入力した後、コマンドボタンをクリックするとエラーとなります。しかしテキストボックス等の値は間違いなく入力されています。よろしくお願いします。 Private Sub ComboBox1_Change() → Sheets(Me.ComboBox1.Value).Select       この部分が黄色になってしまいます End Sub Private Sub CommandButton1_Click() Dim myRow As Long ActiveSheet.Select myRow = Range("B65536").End(xlUp).Offset(1, 0).Row '各テキストボックの値をセルに入力 Cells(myRow, 2).Value = TextBox1.Value Cells(myRow, 3).Value = TextBox1.Value Cells(myRow, 4).Value = ComboBox2.Value Cells(myRow, 6).Value = TextBox2.Value Cells(myRow, 7).Value = TextBox3.Value Cells(myRow, 8).Value = TextBox4.Value 'Cells(myRow, 9).Value = TextBox5.Value '書式設定 Cells(myRow, 2).NumberFormatLocal = "m" Cells(myRow, 3).NumberFormatLocal = "dd" Cells(myRow, 6).NumberFormatLocal = "#,###" 'セルに入力が各テキストボックの値をクリア ComboBox1.Value = "" ComboBox2.Value = "" TextBox2.Value = "" TextBox3.Value = "" TextBox4.Value = "" 'フォーカス移動 ComboBox2.SetFocus End Sub

  • excel VBA 色をセルに自動的に付ける

    エクセル2000を使用していて、VBA初心者で勉強中の者です。 タイムテーブルを作っています。 入力はユーザーフォームを使っています。 コマンドボタンを押すとtextboxにある値を判断してセルに色を付けるマクロを教えてください。 タイムテーブルは列は15分で1列使い、1時間で4列です。 1曜日は4行分使い、4行目に予定時間(textbox2)が入ります。 15分なら0.25 30分なら0.5 1時間は1 ・・・ ユーザーフォームの登録ボタンをクリックした時4行目に入力される値で 判断して、例えば0.15ならセルを1つ塗りつぶし、1時間なら4列分塗りつぶすマクロを教えてください。 塗りつぶすセルの値が入っているのはtextbox2 色は ColorIndex = 33 textbox2の値が0.01~0.25は1列分塗りつぶし        0.26~0.5は2列分塗りつぶし        0.51~0.75は3列分塗りつぶし        0.76~1は4列分塗りつぶし        1.01~0.25は5列分塗りつぶし        ・・・        4.76~5は20列分塗りつぶし よろしくお願いします。 以下はユーザーフォームの登録ボタンを押す時のコードです。 Private Sub CommandButton1_Click() '未入力なら中止 If ComboBox2.Value = "" Then MsgBox "時間を入力" Cancel = True Exit Sub ElseIf ComboBox3.Value = "" Then MsgBox "時間を入力" Cancel = True Exit Sub End If Call Macro登録 End Sub Sub Macro登録()     With ActiveSheet .Cells(行, 列).Value = ComboBox1.Text'1行目の値 .Cells(行 + 1, 列).Value = TextBox1.Text'2行目の値 .Cells(行 + 2, 列).Value = ComboBox2.Text & "~" & ComboBox3.Text'3行目の値 .Cells(行 + 3, 列).Value = TextBox2.Value'4行目の値     End With End Sub

  • [エクセル]VBA連続処理を途中でストップさせたい

    [エクセル]VBAの連続処理を途中で自動的にストップさせるには? 以前にこちらで下記の質問をさせて頂きました。 http://okwave.jp/qa/q3838337.html 最終的にNo.4の回答がベストアンサーとなりました。 ---------- Sub kaiseki() For i = 0 To 9 Sheets("Aシート").Select If Range("B3").Offset(i, 0).Value = Empty Then GoTo Skip Worksheets("Bシート").Range("B11:G11").Value = Worksheets("Aシート").Range("B3:G3").Offset(i, 0).Value Worksheets("Bシート").Calculate Sheets("Aシート").Range("J3:O3").Offset(i, 0).Value = Worksheets("Bシート").Range("B15:G15").Value   '※元のマクロの19行まで   '※中略(ここの部分の処理も上を参考にすれば可能です) Skip: Next i End Sub ---------- 上記の場合はAシートの9行目(For i = 0 To 9)まで自動的に処理が進むのですが、AシートのB~Gのセルに数値が入っていなかった場合は、その行で処理をストップさせたいと思っています。 例えば、B~Gの3行目まで数値が入っていて、4行目には数値が入っていなかった場合、9行目まで処理を進めるのではなく、数値が入っていない4行目で処理を停止させたいです。 どのように記述を書き加えれば良いのでしょうか? 御教授を頂けると助かります。 よろしくお願い致します。

  • VBAを始めたばかりなので初歩的な質問なのですが、

    VBAを始めたばかりなので初歩的な質問なのですが、 Private Sub CmdBtn1_Click() On Error GoTo err1 Dim TxtBx1 As String Dim TxtBx2 As Long TxtBx1 = TextBox1 TxtBx2 = TextBox2 Range("a65535").End(xlUp).Offset(1).Select '新しいセルにデータを追加 Selection = Selection.Row - 2 Selection.Offset(, 1).Value = TxtBx1 Selection.Offset(, 2).Value = ComboBox1 Selection.Offset(, 3).Value = TxtBx2 ---------------省略--------------- '「取消」ボタンのオン If Len("A3") > 0 Then CmdBtn2.Enabled = True End If '初期化 TxtBx1 = "" TxtBx2 = "" ComboBox1.ListIndex = -1 Call TxtBx1.SetFocus Exit Sub 実行すると、初期化のところで変数(Txtbx1,TxtBx2)などが反転して、 「修飾子が不正です」と出ます。 変数を使わないで直接指定すると問題無いみたいなのですがよくわかりません。 こんな質問ですいませんが宜しくお願いします。

  • VBAで最終行の取得について

    UserFormのConboBoxで「○○」を選んで、 UserFormのTextBoxで『あいう』と入力すると、ワークシートに A      B 1 ○○   ×× 2 あいう と表示され、 UserFormのConboBoxで「××」を選んで、 UserFormのTextBoxで『アイウ』と入力すると A      B 1 ○○   ×× 2 あいう  アイウ 3 :    : と表示されるようにしたいと思います。 以下のプログラムまではできています。 ********************************************* Private Sub UserForm_Initialize()  Dim lasClm As Integer, i As Integer  lasClm = Sheet1.Range("A1").End(xlToRight).Column   For i = 1 To lasClm   ComboBox1.AddItem Sheet1.Cells(1, i).Value   Next i End Sub ********************************************* Private Sub CommandButton1_Click()  Select Case ComboBox1.Text  Case Sheet1.Cells(1, 1).Value '「○○」が選択  Sheet1.Cells(2, 1).Value = TextBox1.Text ・・・(1)  Case Sheet1.Cells(1, 2).Value '「××」が選択  Sheet1.Cells(2, 2).Value = TextBox1.Text ・・・(2)  End Select  UserForm1.Hide End Sub ********************************************** 今は(1)、(2)のように直接セルを指定しているのですが、 この部分を各列(A列、B列)の最終行の値を取得して、 最終行+1のセルに順次TextBoxに入力された値を代入していきたいのですが、 どのようにしたらよいのでしょうか。 しかし、A列とB列は同じように値が増えていくとは限りません。 例)    A     B 1 ○○   ×× 2 あいう  アイウ 3 かきく 4 さしす となる場合もあるので、A列とB列それぞれの最終行の値を取得したいと思っています。

  • エクセルVBAでデータ検索(Win2000,Excel2000)

    エクセルで毎日の業務で手計算している作業をVBAコードかいて試しているのですが、縦と横の検索で行き詰まってしまい質問しました。どうぞよろしくお願いします。 _A__B____C____D__E__F___G___H 1| 2|_______その他_1~3_4~6_7~10_11~20_21~30 3| 3|__項目A___ 0___50__49__46___43__40 4|__項目B___ 0___45__44__39___37__34 5|__項目C___ 0___43__42__34___30__ 28 行 *このデータは現在(B3:V42)にあり今後増える可能性あり *1行目とA列は空白です。 *2行目とB列は対応する項目です。 *3行目は関係ない値が入っています(データをつくる為の値) このようなデータが、"Sheet2"にあると仮定します "Sheet1"のシート上に配置したComboBox(コントロールツールボックスの)に検索値があります。 (ComboBox1 → 数値 , ComboBox2 → 数値 , ComboBox3 → 文字)*リストは"Sheet1"に登録してあります。 TextBox1 ÷ 2 の結果を小数点以下切上げし、これにTextBox2の値をかけたもの(仮にAAAとする)が、2列目のそれぞれのセルの数値範囲に対応し、TextBox3の文字列がB列に対応し、両検索結果の交わったセルの値を返すようにしたい。 例)もしAAAが「8」なら「F列」をみる。TextBox3 の文字列が「項目B」なら「4行目」をみる。この結果、交わったセルは「F4」なので、「F4」にある値「39」を"Sheet1"."A1"に返す。 また、これらコンボボックス(このシートとは別にテキストボックスを使うこともある)にはひとつずつchangeイベントでいきなり別シート("Sheet3")に書くコードが既に書いてあります。このセルから取り出すことも可能です。よろしくお願いします。

  • Excel VBAで年齢を求める(Win2000、Office2000)

    現在、VBAでExcelのシートに書き込むフォームを作っており、日付に関することで困っています。 フォーム上には複数のComboBox、TextBoxが並んでおり、OKボタンをクリックすることで、フォーム上に並んだ、ComboBox、TextBoxの値をセルに書き込むようにしています。 ユーザーフォーム上に 年を入力するComboBox1 → 1972 月を入力するComboBox2 → 1 日を入力するComboBox3 → 1 *いづれも、プルダウンから数字を選択して入力するようにしています。 この3つの入力値を合わせて、1972/01/01と認識させて、TextBox1に"32"才と表示させたいのですが・・・現在、3つのComboBoxから日付を変数にセットするところまで出来ています。 ↓ Private Sub ComboBox3_Change() Dim B As Date B = Me.ComboBox1.Value & "/" & Me.ComboBox2.Value & "/" & Me.ComboBox3.Value 問題は、このあと誕生日を求める方法がわからず困っています。 *TextBox1に表示されるタイミングは、日を入力するComboBox3が入力された時としたいです。 宜しくお願い致します。

  • VBA Match関数の使い方について

    お世話になります ご教示頂けたら幸いです シート結果セルE4の値を検索してシート結果G4の値を 検索行のB列に値を転記したいです 下記のように書くとMatch関数行でエラーが出てしまいます どの様にすればいいのでしょうか? お手数おかけしますが 何卒よろしくお願いいたします With Sheets(Worksheets("結果").Range("A4").Value) WorksheetFunction.Match(Worksheets("結果").Range("E4").Value, Range("A1:A1000"), 0).Offset(3) = _ Worksheets("結果").Range("A4").Offset(2).Value End With

  • エクセルVBA の変数を使うべきでしょうか?

    はじめまして。エクセル初心者です。 書籍やサイトで勉強させてもらっていますが、VBAがなかなか難しくてすぐに壁にぶつかってしまいます。少々困ってしまい、詳しい方のアドバイスを頂ければと質問を投稿させていただきました。 どうか宜しくお願い致します。質問ですが、 以下のようなコードで、sheet5のB列の任意のセルをダブルクリックした場合、sheet5のBCD列の同じ行のセル値がsheet1の指定した列に入力されるという処理を作りました。 これで一応目的の動作はするのですが、数が増えると「コンパイルエラー・プロシージャが大きすぎます」というメッセージがでてしまいます。列や行には規則性があるので、もしかしたら変数というものを使ってコードを書き直せばいいのかなと思いネットで調べてみたのですが、今のところさっぱり理解できません。 申し訳ありませんが、分かりやすくご教授いただけないでしょうか。バージョンは2003を使っています。 また、下のコードですと、sheet5のBCDいずれかのセルに空白があった場合、sheet1の列に入力されるときに入力される行がずれてしまいます。今は空白を何かで埋めて対処しているのですが、この問題の解決策も教えて頂けると助かります。どうか宜しくお願い致します。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, cancel As Boolean) If Target.Address = "$B$2" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B2") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C2") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D2") Worksheets("sheet1").Activate cancel = True End If If Target.Address = "$B$3" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B3") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C3") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D3") Worksheets("sheet1").Activate cancel = True End If If Target.Address = "$B$4" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B4") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C4") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D4") Worksheets("sheet1").Activate cancel = True End If   ・     ・   ・     ・   ・     ・ End Sub

専門家に質問してみよう