- ベストアンサー
Excel VBAで過去と現在の取引状態に基づいてデータを処理する方法
- Excel VBAを使用して、過去と現在の取引状態に応じてデータを処理する方法を教えてください。
- 特定の条件に基づいてA列に文字列を入力し、B列に特定の文字列を入力し、C列に計算結果を入力する方法を教えてください。
- また、複雑な条件を使う必要がある場合、Select Case構文を使用する方法も教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
まず、記述をする前にプログラムを日本語で書いてみるのも方法です もしBA1が空白でないなら実行 もし、過去取引_1=有 で、現在取引_1=有 なら A列「OK」 もし、過去取引_1=有 で、現在取引_1=無 なら A列「NG」 もし、過去取引_1=ブランク で、現在取引_1=有 なら A列「確認要」 それ以外は何もしない 入荷_1のある列を探す 取得列1 入荷_2のある列を探す 取得列2 もし、取得列1がブランク以外 または、取得列1の右列がブランク以外実行 もし、取得列2がブランク以外 または、取得列2の右列がブランク以外実行 B列は[1]_[2] C列は取得列1の右列-取得列1 _ 取得列2の右列-取得列2 それ以外は B列は[1] C列は取得列1の右列-取得列1 それ以外 もし、取得列2がブランク以外 または、取得列2の右列がブランク以外実行 B列は[2] C列は取得列2の右列-取得列2 それ以外は B列はブランク C列はブランク これを全てのレコードに繰り返す という作文ができると思います もし、入荷_2以上が存在しシートごとに入荷_5や入荷_8までというようにまちまちの場合は、事前に入荷_? の個数を取得しておく必要がありますね これを記述すると下記のようになります。 If Sheets("Sheet1").Range("BA1").Value <> "" Then 取得列_1 = Sheets("Sheet1").Range("A1:IV1").Find("入荷_1", lookat:=xlWhole).Column 取得列_2 = Sheets("Sheet1").Range("A1:IV1").Find("入荷_2", lookat:=xlWhole).Column For K = 2 To 6 If Sheets("Sheet1").Range("E" & K).Value = "有" And Sheets("Sheet1").Range("F" & K).Value = "有" Then Sheets("Sheet1").Range("A" & K).Value = "OK" End If If Sheets("Sheet1").Range("E" & K).Value = "有" And Sheets("Sheet1").Range("F" & K).Value = "無" Then Sheets("Sheet1").Range("A" & K).Value = "NG" End If If Sheets("Sheet1").Range("E" & K).Value = "" And Sheets("Sheet1").Range("F" & K).Value = "有" Then Sheets("Sheet1").Range("A" & K).Value = "確認要" End If If Sheets("Sheet1").Cells(K, 取得列_1).Value <> "" Or Sheets("Sheet1").Cells(K, 取得列_1).Offset(0, 1) <> "" Then If Sheets("Sheet1").Cells(K, 取得列_2).Value <> "" Or Sheets("Sheet1").Cells(K, 取得列_2).Offset(0, 1) <> "" Then Sheets("Sheet1").Range("B" & K).Value = "[1]_[2]" Sheets("Sheet1").Range("C" & K).Value = Sheets("Sheet1").Cells(K, 取得列_1).Offset(0, 1) * 1 - Sheets("Sheet1").Cells(K, 取得列_1).Value * 1 & "_" & _ Sheets("Sheet1").Cells(K, 取得列_2).Offset(0, 1) * 1 - Sheets("Sheet1").Cells(K, 取得列_2).Value * 1 Else Sheets("Sheet1").Range("B" & K).Value = "[1]" Sheets("Sheet1").Range("C" & K).Value = Sheets("Sheet1").Cells(K, 取得列_1).Offset(0, 1) * 1 - Sheets("Sheet1").Cells(K, 取得列_1).Value * 1 End If Else If Sheets("Sheet1").Cells(K, 取得列_2).Value <> "" Or Sheets("Sheet1").Cells(K, 取得列_2).Offset(0, 1) <> "" Then Sheets("Sheet1").Range("B" & K).Value = "[2]" Sheets("Sheet1").Range("C" & K).Value = Sheets("Sheet1").Cells(K, 取得列_2).Offset(0, 1) * 1 - Sheets("Sheet1").Cells(K, 取得列_2).Value * 1 Else Sheets("Sheet1").Range("B" & K).Value = "" Sheets("Sheet1").Range("C" & K).Value = "" End If End If Next K End If Select Case を使われても良いとは思いますが、最初はIf文を使ったほうが構文を理解し易いように思います。 プログラムを実行するか、しないかの大きい括りの判断(セルBA1の状態)から順に見にいかせています。 質問の内容で書かれているいろいろな条件によって導く答えが複数提示されていますが、条件に合わない結果は何なのかを先に拾い出すことから始めると、複雑そうに思えることも意外と簡単にできたりします。 質問者様のような方が会社にいらっしゃると業務の効率化が進み、集計・分析など顧客への対応など企業のフットワークが軽くなるはずです。頑張ってください。