なんで在庫管理手直しVBAプログラムは面倒臭くないの? 【VBA在庫管理#04】

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

ネェィティィヴ発音始めました、どうもoReです。

前回手直しした在庫管理入出庫プログラムの説明などしていきます。

-1(出庫)処理として下記のようにプログラムしました。

Private Sub CommandButton1_Click()
  Dim Knskcell As Range

  Set Knskcell = Range(“C:C”).Find(what:= Range(“A1”), lookat:= xlWhole)
  If Knskcell Is Nothing Then
    MsgBox “部品が登録されていません。”
  ElseIf Knskcell = "" Then
    MsgBox “部品が登録されていません。”
  Else
    Knskcell.Offset(0, 4) = Knskcell.Offset(0, 4) – 1
  End If
End Sub

変数の宣言 Dim As

・Dim ディィム ・As アズ

Dimは、dimension(ディィメェンシャン)の略で
『寸法』とか『次元』という意味みたいです。

Asは、『なので』とか『として』という意味みたいです。

 

変数とは、データを入れる箱みたいな物で
データを入れたり出したりでき、とても便利です。

また、好きなだけ作ることができます。

 

変数の宣言とは

『この箱には、こんなデータをいれるよ!!』

と宣言しなければなりません。

 

例えば、『ねこ』と言う名前の箱を用意し
『この箱には、猫をいれるよ!!』と宣言した場合
『ねこ』と言う箱には、猫は入れますが人間は入れません。

ねこ箱はむり

  ↓これが変数の宣言です。

Dim Knskcell As Range

 

  ↓こんな感じです。

Dim Knskcell As Range
次元 Knskcell とします Range 
Knskcellと言う変数は、Range型だよ!!(児嶋風)

 

Dim 変数名 As 変数の型

 

変数名は、好きな名前をつけます。
※わかりやすい名前をつけましょう。

AhoでもOKですが、アホってなんやねん!!となりますよね?

※ちなみに、Knskcellは
検索セル→Kensakucell→Knskcellとしました。

 

変数の型は、どんなデータを入れるかを選びます。

よく使う変数の型

データの型値の範囲
整数型Integer インティィヂャ-32768~32767の整数値
長整数型Long ロォーング-2147483648~2147483647の整数値
日付型Date デェィトゥ日付と時刻
文字列型String ストゥリィング文字列
バリアント型Variant ヴェアリィアントゥあらゆる種類の値
オブジェクト型Object オブヂィクトゥオブジェクト

ってオイ!! データの型にRangeがないんだが!!

oReツッコミ

はい、Rangeはオブジェクト型になります。

 

その他のオブジェクト型は
WorkbookとかWorksheet等があります。

 

また、オブジェクト型の変数にデータを入れる際は
Set 変数名 = オブジェクト となります。

例) Dim Ws As Worksheet

   Set Ws = Worksheets(“sheet1”)
 

その他のデータ型の場合は
変数名 = データ となり、Setは書きません。

例) Dim Nennrei AS Integer

   Nennrei = 100
例) Dim Namae As String

   Namae = "オレ"

 

試しに、下記のようにプログラムを追加してみてください。

Private Sub CommandButton1_Click()
  Dim Knskcell As Range
  Dim Aho As String

  Set Knskcell = Range(“C:C”).Find(what:= Range(“A1”), lookat:= xlWhole)
  Aho = "部品が登録されていません。"
  If Knskcell Is Nothing Then
    MsgBox Aho
  ElseIf Knskcell = "" Then
    MsgBox Aho
  Else
    Knskcell.Offset(0, 4) = Knskcell.Offset(0, 4) – 1
  End If
End Sub

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

ちゃんと、部品が登録されていません。とメッセージがでましたか?

oReのぞき見

セルの検索 Find

・Find ファィンドゥ ・what ホワット ・lookat ルックアット ・Whole ホォゥル

Findは、『見つける』という意味みたいです。

Whatは、『何』という意味みたいです。

Lookatは、『~見る』という意味みたいです。

Wholeは、『全体』とか『全て』という意味みたいです。

 

くそ面倒臭い在庫管理入出庫プログラムでは

セルA1が○○だったら、セル□□のデータを-1する。
セルA1が△△だったら、セル◇◇のデータを+1する。

と言ったように、データを+-させるセルを一つ一つ指定していました。

 

手直ししたプログラムは、そうじゃなくて
セルA1のデータと同じデータが入ったセルを、Excelに探してもらいます。

Set Knskcell = Range("C:C").Find(what:= Range("A1"),lookat:= xlWhole)

 

  ↓こんな感じです。

C列内で、セルA1のデータと、全部一致するセルを、Knskcell(変数)に入れる

・全部一致するセルがあった場合は、Knskcellに一致したセルが入ります。

・全部一致するセルがなかった場合は、KnskcellにNothingが入ります。

 

Offset

・Offset オフセェトゥ

Offsetは、『補正』みたいな感じのようです。

 

オフセットとは、指定したセルから上下左右移動したセルを指定できます。

Offset(行,列)
 

例えば、セルE5からのOffset

Excel画像offset

 

セルH5を指定したければ

Range("E5").Offset(0,3)

 

セルD4を選択したければ

Range("E5").Offset(-1,-1)

と書けば指定できます。

 

では、手直し在庫管理入出庫プログラムを見てみましょう。

If Knskcell Is Nothing Then
  MsgBox “部品が登録されていません。”
ElseIf Knskcell = "" Then
  MsgBox “部品が登録されていません。”
Else
  Knskcell.Offset(0, 4) =Knskcell.Offset(0, 4) – 1
End If

 

  ↓こんな感じです。

もし、KnskcellがNothingだった場合
  部品が登録されていません。のメッセージを出す
もし、Knskcellが空白("")だった場合
  部品が登録されていません。のメッセージを出す
もし、Knskcellが上記以外の場合
  検索し一致したセルから右に4つ移動したセル  検索し一致たセルから右に4つ移動したセルの
  データから1引いたデータを入れる

 

例えば、セルA1がore2だった場合は

①C列からore2と全部一致するデータが入ったセルを検索する。
②Knskcell(変数)にセルC7が入る。
③セルC7から右に4つ移動したセルG7にセルG7から1引いたデータを入れる。

といった動きになります。

 

なので、部品を1000品目追加したとしても
VBAのプログラムは変更しなくてもいいわけです。

 

Is Nothing

・Is イズ ・Nothing ナァシィング

Isは、『は(わ)』という意味みたいです。

Nothingは、『無し』という意味みたいです。

 

手直しした在庫管理入出庫プログラムのIf(条件分岐)は
一番目の条件式の所 『=』が『Is』になってます。

 

気付いてました?

If Knskcell Is Nothing Then
  MsgBox “部品が登録されていません。”
ElseIf Knskcell = "" Then
  MsgBox “部品が登録されていません。”
Else
  Knskcell.Offset(0, 4) = Knskcell.Offset(0, 4) – 1
End If

 

If knskcell = Nothing Then

と書いてしまいそうですが、これだとエラーがでます。
※なんでかは知らん(笑)

必ず Is Nothing と書きましょう。

 

まとめ

変数の宣言 Dim 変数名 As 変数の型
・オブジェクト型 Set 変数名 = オブジェクト
・その他 変数名 = データ
検索する範囲.Find(what:=検索対象,lookat:=全部一致)
指定したセル.Offset(行,列)
If ○○ Is Nothing Thenを使用する

oReドラえもんコス

次回 ユーザーフォームでアプリ感をだす

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

コメント

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