Excel VBA | While…Wend

VBA
スポンサーリンク

「セル検索 → 値を置き換える」を While…Wend で書くサンプルです。実務では Find を使う方が効率的ですが、学習用に「While…Wendで順番にセルを調べていく」方法を紹介します。


シナリオ

  • A列に商品コード
  • B列に在庫数
  • 特定の商品コードを探して、在庫数を新しい値に置き換える

サンプルコード(While…Wend版)

Sub 在庫更新_WhileWend()
    Dim ws As Worksheet
    Dim targetCode As String
    Dim newStock As Long
    Dim row As Long
    
    Set ws = ThisWorkbook.Sheets("在庫表")
    
    targetCode = "P001"   ' 更新したい商品コード
    newStock = 50         ' 新しい在庫数
    
    row = 1
    
    ' A列のセルを上から順にチェック
    While ws.Cells(row, 1).Value <> ""
        If ws.Cells(row, 1).Value = targetCode Then
            ws.Cells(row, 2).Value = newStock
            MsgBox "商品コード " & targetCode & " の在庫を " & newStock & " に更新しました。"
            Exit Sub   ' 見つかったら終了
        End If
        row = row + 1
    Wend
    
    MsgBox "商品コード " & targetCode & " は見つかりませんでした。"
End Sub
VB

解説

  • row = 1 からスタートし、A列を1行ずつチェック。
  • While ws.Cells(row, 1).Value <> "" → 空セルに出会うまで繰り返す。
  • 一致したらB列の値を更新し、Exit Sub で処理を終了。
  • 見つからなければ最後に「見つかりません」と表示。

応用例:複数更新(発注リスト反映)

「発注リスト」シートに商品コードと追加数があり、それを「在庫表」に反映する例です。

Sub 発注反映_WhileWend()
    Dim wsStock As Worksheet
    Dim wsOrder As Worksheet
    Dim orderRow As Long
    Dim stockRow As Long
    
    Set wsStock = ThisWorkbook.Sheets("在庫表")
    Set wsOrder = ThisWorkbook.Sheets("発注リスト")
    
    orderRow = 2 ' 発注リストは2行目から
    
    While wsOrder.Cells(orderRow, 1).Value <> ""
        Dim code As String
        Dim qty As Long
        
        code = wsOrder.Cells(orderRow, 1).Value
        qty = wsOrder.Cells(orderRow, 2).Value
        
        ' 在庫表を検索
        stockRow = 1
        While wsStock.Cells(stockRow, 1).Value <> ""
            If wsStock.Cells(stockRow, 1).Value = code Then
                wsStock.Cells(stockRow, 2).Value = wsStock.Cells(stockRow, 2).Value + qty
                Exit While
            End If
            stockRow = stockRow + 1
        Wend
        
        ' 見つからなければ新規追加
        If wsStock.Cells(stockRow, 1).Value = "" Then
            wsStock.Cells(stockRow, 1).Value = code
            wsStock.Cells(stockRow, 2).Value = qty
        End If
        
        orderRow = orderRow + 1
    Wend
    
    MsgBox "発注リストを在庫表に反映しました。"
End Sub
VB

✅ ポイント

  • While…Wendは「空セルまで順番に調べる」処理に向いている。
  • 実務では Find の方が高速だが、While…Wendは「繰り返し処理の基本」を理解する練習に最適。
  • 在庫管理風の処理では「一致したら更新」「なければ追加」という流れがよく使われる。
VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました