インポートとエクスポートを使って部品編集フォームを作る 【VBA在庫管理#22】

Excel VBA 部品在庫管理アイキャッチ画像部品在庫管理

進撃の俺!! どうもoReです。

今回は、ファイルのインポートとエクスポートを使っていきます。

モジュールの解放

モジュールの解放は、作成したユーザーフォームや、
標準モジュール等を削除したい時に使用します。

 

・削除したいモジュールを選択右クリ○○の解放をクリック

モジュールの解放選択

 

そうすると、『削除する前に○○をエクスポートしますか?』
とメッセージが出てくるので『いいえ』を押せば完全に削除できます。

モジュールの解放エクスポート確認

『はい』を押せば選択したモジュールを削除してエクスポートできます。

 

エクスポート

・Export エクスポォアトゥ

Exportは、『輸出』という意味みたいです。

まあ、外部へ出力(保存)ってことです。

 

では、エクスポートしてみましょう。

エクスポートする前に、Module1のオブジェクト名をComboに変更します。

・Comboモジュールを選択ファイルのエクスポートをクリック

Comboエクスポート

 

そうしたら、デスクトップにエクスポート(保存)します。

ファイル名を『Combo』から、『コンボボックス登録削除』へ変更して保存をします。
※ファイル名は変えなくてもOK

ファイル名コンボボックス登録削除へ変更

 

デスクトップ上に『コンボボックス登録削除.bas』というファイルが
エクスポートされてますか?

コンボボックス登録削除.bas保存確認

 

エクスポートされていたら、Comboモジュールを解放しましょう。
※先ほど、エクスポートしたので『いいえ』を押します。

Comboモジュールを解放できましたか?

oReのぞき見

インポート

・Import インポォアトゥ

Importは、『輸入』という意味みたいです。

まあ、外部から入力(読み込み)ってことです。

 

それでは、先ほどエクスポートしたComboモジュールをインポートしましょう。

・ファイルのインポート

ファイルのインポート

 

・コンボボックス登録削除.basを選択開く

コンボボックス登録削除.bas開く

ちゃんと、Comboモジュールをインポートできましたか?

 

どう?凄くない!?

例えば、新たに住所録を作るとしましょう。

住所録ブックにComboモジュールをインポートして、
ComboTSとComboSetプロシージャに引数を渡すだけで、
コンボボックスの登録削除ができますよね?

住所録test

 

そう!!いろんなプロジェクトで使い回しできるんです!!

多分、プロのグラマーな方達はこういった、使い回せるモジュールを
たくさん作っているいると思われます。

プロジェクト作成依頼が来たら、そのプロジェクトで必要な
モジュールをインポートして、ちょいと手直し。

 

はいっ!!○○万円也!!的な…(笑)

 

いろんな意味で全米が泣くでしょ。これ…

でも、汎用性があるプログラムを作るのは大変なんですよね。

おっ!!これ何かで使えるかもと思ったらエクスポートして、
使える有能な子に育てていくと楽になると思います。

 

部品編集フォーム作成

Tourokuフォームをエクスポート・インポートして、
部品編集フォームを作成していきます。

 

フォームのエクスポート・インポート

Tourokuフォームをデスクトップ上にエクスポートしましょう。

エクスポートできたら、Tourokuフォームのオブジェクト名
Hensyuuとでもしますか。

TourokuからHensyuuへ変更

 

そうしたら、エクスポートしたTourokuをインポートします。

こうすることで、Tourokuフォームのコピーを作成できます。

 

フォームの手直し

では、Hensyuuフォームをちょいと手直し。

HensyuuフォームのCaptionを『部品編集』へ変更
Frame2のCaptionを『編集する部品のバーコードを読み込んでください。』へ変更
Frame1のCaptionを『部品データを編集してください。』へ変更
CommandButton3のCaptionを『編集』へ変更
CommandButton3のBackColorはお好きにどうぞ
バーコードデータを編集する為のTextBox5を挿入
Labelを挿入しCaptionを『バーコード』にする
登録を削除する為のCommandButton4を挿入
Captionは『登録削除』、BackColorはお好きにどうぞ

 

  ↓こんな感じ

Hensyuuフォーム手直し

 

次に、MainフォームHensyuuフォームを表示させるコマンドボタンを挿入しましょう。
Captionは『部品編集』、BackColorはお好きにどうぞ。

Mainに部品編集表示ボタン挿入

 

プログラム手直し

【Mainフォームへ追加】

'Hensyuu表示
Private Sub CommandBotton4_Click()
  Hensyuu.Show
End Sub

 

【Hensyuuフォームへ追加・手直し】

・Hensyuuフォームモジュールの一番上に追加

Dim Knskcell As Range 'Knskcellはモジュール変数だよ

 

モジュールの一番上で変数の宣言をすると、
モジュール内で共有できる変数(モジュール変数)となります。

  ↓こんな感じになるはず

モジュール変数宣言

 

・コマンドボタン1クリックへ追加

'キャンセル処理
Private Sub CommandButton1_Click()
  TextBox1 = ""
  ComboBox1 = ""
  TextBox2 = ""
  TextBox3 = ""
  TextBox4 = ""
  TextBox5 = ""
  Set Knskcell = Nothing 'Knskcellをリセットするよ
End Sub

 

・コマンドボタン2クリックを変更

'Hensyuu終了処理
Private Sub CommandButton2_Click()
  Unload Hensyuu
End Sub

 

・コマンドボタン3クリックを変更・追加

'部品編集処理
Private Sub CommandButton3_Click()
  Dim YN As VbMsgBoxResult

  If TextBox1 = "" Then
    MsgBox "バーコードを読み込んでください。"
  ElseIf ComboBox1 = "" Then
    省略
  ElseIf TextBox4 = "" Then
    MsgBox "在庫数を入力してください。"
  ElseIf TextBox5 = "" Then
    MsgBox "バーコードを入力してください。"
  Else
    YN = MsgBox("バーコード : " & TextBox5 & vbCrLf & _
      省略
    "この様に編集しますか?", vbYesNo + vbQuestion, "部品編集確認")
    If YN = vbYes Then
      With Knskcell
        .Offset(0, 0) = TextBox5
        .Offset(0, 1) = ComboBox1
        .Offset(0, 2) = TextBox2
        .Offset(0, 3) = TextBox3
        .Offset(0, 4) = TextBox4 * 1
        MsgBox "部品管理№ : " & .Offset(0, -1) & " を編集しました。"
      End With
      Call CommandButton1_Click
    End If
  End If
End Sub

 

・コマンドボタン4クリック作成

'部品登録削除処理
Private Sub CommandButton4_Click()
  Dim YN As VbMsgBoxResult
  Dim i As Long 'Knskcellの行番号格納用ね
  If TextBox1 = "" Then
    Exit Sub
  ElseIf Knskcell Is Nothing Then
    Exit Sub
  Else
    YN = MsgBox("バーコード : " & TextBox5 & vbCrLf & _
          "メーカー : " & ComboBox1 & vbCrLf & _
          "品名 : " & TextBox2 & vbCrLf & _
          "型式 : " & TextBox3 & vbCrLf & _
          "在庫数 : " & TextBox4 & vbCrLf & vbCrLf & _
          "この部品の登録を削除しますか?", vbYesNo + vbQuestion, "部品登録削除確認")
    If YN = vbYes Then
      MsgBox "部品管理№ : " & Knskcell.Offset(0, -1) & " を削除しました。"
      i = Knskcell.Row 'Knskcellの行番号を格納するよ
      Rows(i).Delete 'Knskcellの行を削除するよ
      Call CommandButton1_Click
    End If
  End If
End Sub

 

・テキストボックス1キーダウン作成

'バーコードデータ検索処理
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  If KeyCode = 13 Then
    If TextBox1 = "" Then
      Exit Sub
    Else
      Set Knskcell = Columns("C").Find(what:=TextBox1, lookat:=xlWhole)
      If Knskcell Is Nothing Then
        MsgBox "部品が登録されていません。"
        Call CommandButton1_Click
      Else
        TextBox5 = Knskcell.Offset(0, 0)
        ComboBox1 = Knskcell.Offset(0, 1)
        TextBox2 = Knskcell.Offset(0, 2)
        TextBox3 = Knskcell.Offset(0, 3)
        TextBox4 = Knskcell.Offset(0, 4)
      End If
    End If
  End If
End Sub

 

動作確認してみてください。

ちゃんと、部品の編集と削除ができますか?

oReのぞき見

まとめ

モジュールの解放は削除
エクスポートは外部へ出力(保存)
インポートは外部から入力(読み込み)

進撃のoRe

次回 部品データの項目を増やしていくよ

ExcelVBA部品在庫管理【目次】へ戻る

コメント

  1. すけ より:

    初歩的な質問ですみません。
    ここまで順調にできたのですが、
    「部品編集」ボタンを押してもなにも反応が無いことと
    ユーザーフォームの実行から編集してみると最後のY/N選択まではできますが、
    Yesを選択すると実行時エラー91が表示されます。

    デバックでかくにんしてもわかりません。
    どこに原因があるのでしょうか。

    • oReoRe より:

      すけ様
      はじめまして。
      コメントありがとうございます。

       

      実際のコードを確認出来ないので、なんとも言えませんが…

      下記 確認願います。

       

      >「部品編集」ボタンを押してもなにも反応が無い

      『Mainフォーム』に、

      'Hensyuu表示
      Private Sub CommandBotton4_Click()
          Hensyuu.Show
      End Sub
      

      記述されていますか?

       

      >Yesを選択すると実行時エラー91が表示されます

      『Hensyuuフォーム』の一番上に、

      Dim Knskcell As Range 'Knskcellはモジュール変数だよ
      

      記述されていますか?

       

      問題なければ、実際のコードを確認しないとわかりません。

  2. コーデ より:

    oRe殿
    コーデと申します。度々で恐縮です。この回で「Comboモジュールをインポート」までできましたが、
    その後の下記oRe殿の文章内容がよくわかりません。すみません。
    Excel上で、開発タブの右上にある「インポート」をクリックして、デスクトップ上にある「コンボボックス登録作業bas.」を選択してインポートしようとすると、「次のファイルをインポート中にエラーが発生しました」とmessageが出ます。そこから詳細をクリックしますと下記下段の内容でした。
    何かがおかしいですよね?? お分かりの範囲でご教示頂けますと助かります。宜しくお願い致します。

    【どう?凄くない!?
     例えば、新たに住所録を作るとしましょう。
     住所録ブックにComboモジュールをインポートして、
     ComboTSとComboSetプロシージャに引数を渡すだけで、
     コンボボックスの登録削除ができますよね?】

    【エラーコード:-1072896760
     URL:
     原因:テキストの内容に無効な文字が見つかりました。
     行:3
     列:2
     ファイルオフセット:32  】

    • oReoRe より:

      コーデ様
      コメントありがとうございます。

      >その後の下記oRe殿の文章内容がよくわかりません。

      在庫管理ブックとは別に、顧客の住所を管理するブックを作成する際、
      もう一度コンボボックスに登録削除するコードを書かなくても、
      顧客の住所を管理するブックに、Comboモジュールをインポートすれば楽です。

      すみません、うまく説明できません…

       

      >開発タブの右上にある「インポート」をクリックして…

      開発タブの右上にある「インポート」は違います。

      ↓こちらのインポートです。

      ファイルのインポートモデレート

  3. コーデ より:

    oRe殿
    コーデでございます。ご指示頂いた上記画像のインポートは分かりました。その後、何をインポートするかですが、デスクトップ上に残っている、「コンボボックス登録削除bas.」をインポートでいいんですよね?? 
    そうしますと、COMBOモジュールがVBA画面左側に出現します。これでインポート完成で宜しいですか??
    その後、エクセル画面で、どんな操作をしたら、コンボボックスが出てきますか??
    因みに、インポートしたCOMBOモジュールのコードは下記になります。ご面倒お掛けして恐縮ですが、ヒントください!
    宜しくお願い致します。

    '設定シートにメーカー名登録・削除処理
    Public Sub ComboTS(ByVal Box As Object, ByVal Ws As Worksheet, _
                       ByVal Retu As Long, ByVal ListName As String, ByVal TS As String) '引数TSを作るよ
        Dim Knskcell As Range
        Dim YN As VbMsgBoxResult
        Dim LastRow As Long
    
        If Box = “” Then
            Exit Sub
        Else
            Set Knskcell = Ws.Columns(Retu).Find(what:=Box, lookat:=xlWhole)
            If TS = “T” Then '引数TSがTだった場合
                If Knskcell Is Nothing Then
                    YN = MsgBox(ListName & ” : ” & Box & vbCrLf & vbCrLf & _
                               “この” & ListName & “名を登録しますか?”, vbYesNo + vbQuestion, “登録確認”)
                    If YN = vbYes Then
                        LastRow = Ws.Cells(Rows.Count, Retu).End(xlUp).Row
                        Ws.Cells(LastRow + 1, Retu) = Box
                        MsgBox Box & “を登録しました。”
                        Call ComboSet(Box, Ws, Retu)
                    End If
                End If
            ElseIf TS = “S” Then '引数TSがSだった場合 修正 (*ノωノ)
                If Not Knskcell Is Nothing Then
                    YN = MsgBox(ListName & ” : ” & Box & vbCrLf & vbCrLf & _
                               “この” & ListName & “名の登録を削除しますか?”, vbYesNo + vbQuestion, “登録削除確認”)
                    If YN = vbYes Then
                        Knskcell.Delete (xlShiftUp) 'セルを削除した際に上にシフトする
                        MsgBox Box & “を削除しました。”
                        Box = “”
                        Call ComboSet(Box, Ws, Retu)
                    End If
                End If
            End If
        End If
    End Sub
    
    'コンボボックスセット処理
    'Box=ComboBox, Ws=シート, Retu=列番号
    
    Public Sub ComboSet(ByVal Box As Object, ByVal Ws As Worksheet, ByVal Retu As Long)
        Dim LastRow As Long
        Box.Clear
        With Ws
            LastRow = .Cells(Rows.Count, Retu).End(xlUp).Row
            If LastRow = 1 Then '設定シートに1つも登録されていない場合
                Exit Sub 'リストに設定シートの項目を表示させない
            ElseIf LastRow = 2 Then '設定シートに1つしか登録されていない場合
                Box.AddItem .Cells(2, Retu) 'ComboBox.Listに1つのデータを登録できない為AddItemを使う
            Else
                Box.List = .Range(.Cells(2, Retu), .Cells(LastRow, Retu)).Value
            End If
        End With
    End Sub
    

    ※ 最近、黒糖焼酎にはまっております!! 黒糖なのに、糖分・プリン体「0」ですって!!(笑)

    • oReoRe より:

      コーデ様
      コメントありがとうございます。

      >COMBOモジュールがVBA画面左側に出現します。これでインポート完成で宜しいですか??

      完成です。

       

      >その後、エクセル画面で、どんな操作をしたら、コンボボックスが出てきますか??

      新たに作成しなければ、フォームやコンボボックスは出てきません。

      あくまでもCOMBOモジュールは、コンボボックスへの登録削除を行うプログラムです。

      一度作ったプログラムを簡単に使い回せるという事です。

       

      PS.黒糖焼酎探してみますw

       

  4. コーデ より:

    oRe殿
    コーデでございます。ご返信ありがとうございます。そうですよね、、、新たに作らなければ出て来ませんよね!
    試したら、出てきました。ご面倒お掛け致しました。
    あの、、、「入出庫履歴」まだ出て来ません、、、私の送信した上記「COMBOモジュール」のコードで、おかしな箇所、
    ございますか?? ご確認頂けますと助かります、宜しくお願い致します。

    PS.黒糖は、メジャーなところで「れんと」です。お勧めは、「里の曙」か「島のナポレオン」です。(笑)

  5. コーデ より:

    oRe殿

    コーデでございます。現在Ver.22まで完成でSTOPしておりますが、どうしても、メイン画面に、入出庫履歴が表示されないのが気になっております。一度、下記メールアドレスに御連絡賜りますと幸甚です。

    宜しくお願い致します。

    • oReoRe より:

      コーデ様
      コメントありがとうございます。

      コーデ様のExcelファイルを確認したところ、

      'Mainフォーム初期化
      Private Sub UserForm_Initialize()
          Dim LastRow As Long
      
          LastRow = Sheet2.Cells(Rows.Count, 9).End(xlUp).Row
          If LastRow > 2 Then
              ListBox1.ColumnCount = 8
              ListBox1.ColumnWidths = "110;50;40;110;110;120;30;30"
              ListBox1.List = Sheet2.Range("B3:I" & LastRow).Value
          End If
      

      ↑上記の『Sheet2』は、オブジェクト名でシートを指定しています。

      シート指定

      オブジェクト名『Sheet1』のシート名は『Sheet2(入出庫履歴)』となっています。

      オブジェクト名『Sheet2』のシート名は『Sheet1(データベース)』となっています。

      コーデ様は、オブジェクト名『Sheet2』を指定しており、
      『Sheet1(データベース)』を指定しているという事になります。

      入出庫履歴を表示させるには、

      【オブジェクト名でシートを指定する場合】

      LastRow = Sheet1.Cells(Rows.Count, 9).End(xlUp).Row
        省略
      ListBox1.List = Sheet1.Range("B3:I" & LastRow).Value
      

      【シート名でシート指定する場合】

      LastRow = Worksheets("Sheet2(入出庫履歴)").Cells(Rows.Count, 9).End(xlUp).Row
        省略
      ListBox1.List = Worksheets("Sheet2(入出庫履歴)").Range("B3:I" & LastRow).Value
      

       

      上記どちらでも、入出庫履歴を表示できると思います。

  6. コーデ より:

    oRe 殿

    おはようございます。コーデでと申します。
    #22終了時点で、部品編集迄、NGアクション無しに完成しましたが、
    部品編集ボタンをクリックしても、反応が無いのですが、どんな問題がございますか??
    恐らくMainフォームのモジュールの、どこかに問題があるのかと、勝手に思っていますが、如何でしょう??
    ご教示頂けますと幸甚です。宜しくお願い致します。

    コーデ

    • oReoRe より:

      コーデ様
      コメントありがとうございます。

      コーデ様のExcelファイルを確認したところ、
      おっしゃるとおりMainフォームに問題があります。

       

      コーデ様が作成されたHensyuu表示プロシージャを選択してみてください。

      'Hensyuu表示
      Private Sub CommandBotton4_Click()
        Hensyuu.Show ←このへんをクリック
      End Sub

      ↓上の方にあるオブジェクト欄が『General』となっています。

      異常ビルド

      これは、オブジェクト(CommandBotton4)が選択されていない状態で、
      正常にビルド(作成)されていません。

      ↓正常にビルドされたものです。

      正常ビルド

       

      【作成方法】

      オブジェクト蘭の▼から、『CommandBotton4』を選択するか、
      作成した『製品編集ボタン』をダブルクリックして作成してみてください。

      作成方法

      Hensyuuフォームを表示できると思います。

  7. コーデ より:

    oRe殿 
     
    コーデでございます。ご教示頂きありがとうございます。大変助かります。
    私と同じような内容で、困っている方もいるかと思います。
    (えっ! 基本的な事だからお前だけだ、、、と、、、そうかも知れません)
    また、相談させて頂きます。先ずは御礼まで。。。

タイトルとURLをコピーしました