プロが教える店舗&オフィスのセキュリティ対策術

Excel VBAで、以下のようなことをやりたいです。どのようなモジュールを組めばよいかレクチャーいただけないでしょうか。諸事情により関数が使えない為、モジュールでの実行を希望しています。

添付ファイルをご参照ください。

B列とC列の結果を、D列に転記させる構文を作りたいです。転記の仕方としては、B/C列で、「エラー」と記載のない方の文字を採用し、それをD列へ転記できるようにしたいです。また、行はA列で最下行を取得し、2行目~最下行までD列へ転記できるようにしたいです。

よろしくお願いします。

「Excel VBAで教えてください」の質問画像

A 回答 (4件)

#1です


一応、例を挙げておきます
Sub test()
Dim r As Range
For Each r In Range(Cells(2, 1), Cells(Rows.Count, 1).End(xlUp))
If IsError(r.Offset(, 1).Value) Then
r.Offset(, 3) = r.Offset(, 2)
Else
r.Offset(, 3) = r.Offset(, 1)
End If
Next
End Sub

'こちらの方が分かりやすいかも
Sub test1()
Dim i As Long
With ActiveSheet
For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row
If IsError(.Cells(i, "B").Value) Then
.Cells(i, "D").Value = .Cells(i, "C").Value
Else
.Cells(i, "D").Value = .Cells(i, "B").Value
End If
Next
End With
End Sub

testもtest1も結果は同じになると思います
B列の値を検証してIFで処理を分けています。
両方にエラーがある場合や両方ともエラーが無い場合は
C列の値に対してもIFで検証して処理分岐を増やせば良いと思います
ちなみに
文字列のエラーの場合は
If r.Offset(, 1).Value <> "エラー" Then
r.Offset(, 3) = r.Offset(, 1)
Else
r.Offset(, 3) = r.Offset(, 2)
End If
のような感じで処理が出来ると思います。
(<>なのでTrueとFalseの処理は逆)

testは、シートオブジェクトは不明の為、省略(ActiveSheet)していますので対象シート以外を表示して実行すると問題が発生しますので注意してください

対策としてSub test1()のWith ActiveSheetを参考にシートオブジェクトを明示的に記してください。
With Worksheets("Sheet1") こんな感じです
    • good
    • 1

こんにちは



すでに指摘がありますが、例示の場合以外の際にどうしたいのか不明です。
勝手に、以下と解釈しました。
 エラー以外1 エラー以外2  → エラー以外1
 エラー    エラー以外  → エラー以外
 エラー以外  エラー    → エラー以外
 エラー    エラー    → エラー

上記でも良ければ、

Sub Sample()
Dim rw As Long, s As String
For rw = 2 To Cells(Rows.Count, 1).End(xlUp).Row
s = Cells(rw, 2).Text
If s = "エラー" Then s = Cells(rw, 3).Text
Cells(rw, 4).Value = s
Next rw
End Sub
    • good
    • 1

自分なら、


 B列とC列を
 D列とE列に複製して、
 D列とE列の「エラー」の文字を「空白」に置換、
 その後、D列とE列の「空白セル」を選択して「左詰めにセルを削除」します。
……最終行?そんなの考慮する必要ない。

マクロの記録だけで作れますよ。

  Columns("B:C").Select
  Selection.Copy
  ActiveSheet.Paste
  Columns("D:D").Select
  ActiveSheet.Paste
  Selection.Replace What:="エラー", Replacement:="", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False
  Selection.SpecialCells(xlCellTypeBlanks).Select
  Application.CutCopyMode = False
  Selection.Delete Shift:=xlToLeft

・・・

なお、最後の「D列とE列の「空白セル」を選択…」はD列の空白セルだけを削除すればいいのですが、
D列だけを選択し直すという手間を省略しています。
D列とE列に複製後はD列とE列が選択されて状態なのです。

あと、B列とC列の文字列にエラーがない場合は、D列にB列の、E列にC列の文字が転記されることになります。
エラーだけの場合は何も転記されないことになります。
    • good
    • 1

こんばんは


「エラー」とは、文字列が入っているの?
それとも計算結果のエラーで
#VALUE!や#NAME?・・・などが出力されていると言う事?
あと両方がエラーだったらどうするの?
エラーが無い場合は?
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!