「夫を成功」へ導く妻の秘訣 座談会

説明が下手で申し訳ございませんが

下記式をマクロ式にする方法を教えていただけませんでしょうか

=IF(VLOOKUP(B1,削除者!A:A,1,FALSE),"",B1)
検索が合えば問題ないですが
該当が場合は #N/Aが出ます

#N/Aの場合は B2 を表示させる方法です



Sub vlookup()
Dim i As Long, MaxRow As Long
MaxRow = Cells(Rows.Count, "B").End(xlUp).Row

For i = 2 To MaxRow '入力最終セルまでカウント



Cells(i, "A") = WorksheetFunction.VLookup(Cells(i, "B").Value, Sheets("削除者").Range("A:B"), 1, 0)



#N/Aの場合は ・・・Cells(i, "A") = Cells(i, "B").Valueを実施する

マクロの方法をお願いします

A 回答 (7件)

失礼しました。



ミスです
Set SAku = Worksheets("削除者").Range("A1:A20")

変更後
Set SAku = Worksheets("削除者").Range("A1:A80")

~~~~~~~~~~~~~~~~~~~
Sub hhhD()
Dim i, j, MaxRow, NNnew(), SAku
Set SAku = Worksheets("削除者").Range("A1:A80")

MaxRow = Cells(Rows.Count, "B").End(xlUp).Row
NNmoto = Range("B1:B" & MaxRow)
ReDim NNnew(MaxRow, 0)
Sheets("Sheet1").Activate

j = 0

For i = 1 To MaxRow
On Error Resume Next
y = "": yy = NNmoto(i, 1)
y = WorksheetFunction.vlookup(yy, SAku, 1, False)
On Error GoTo 0
If y = "" Then NNnew(j, 0) = yy: j = j + 1:
Next

Sheets("Sheet1").Range("B1:B" & MaxRow) = NNnew

End Sub
「マクロ式にする場合の方法を教えてください」の回答画像7
    • good
    • 0

こんにちは、


>#N/Aの場合は ・・・Cells(i, "A") = Cells(i, "B").Valueを実施する
>マクロの方法をお願いします
VLookup関数の内容がご希望道理の解を出力するのかは、、、

エラーが発生したら違う処理をする流れです。

一例です
Sub vlookup()
  Dim i As Long, MaxRow As Long
  With ActiveSheet
  MaxRow = .Cells(Rows.count, "B").End(xlUp).Row
    For i = 2 To MaxRow  '入力最終セルまでカウント
      On Error Resume Next 'エラーが発生しても次の行に進む
      .Cells(i, "A") = WorksheetFunction.vlookup(.Cells(i, "B").Value, Sheets("削除者").Range("A:B"), 2, 0)  ’1列目?勝手に2列目にしました
      If Err.Number <> 0 Then 'エラーが発生していれば IF内の処理が実行されます。
        .Cells(i, "A") = .Cells(i, "B").Value
        'Err.Number = 0 ’他の処理が無いなら不要かな?
      End If
    Next
  End With
End Sub

With ActiveSheetは、複数のシートがある場合、シートを明示するようにします。
シート名が明確なら、With Worksheets("シート名")のように変更してください。。


通常、上記サンプル(ご質問)のような処理は、薦められる処理とは言えないと思います。
エラーを発生させない処理方法は、すでに回答がありますので参考にされるべきと思います。

ご質問者様も >検索が合えば問題ないですが  と理解されている通り、
この場合、値があるか無いかで分岐して処理をすれば、エラーが発生しない事になりますね。
    • good
    • 0

次のようなことでしょうか  画像



Sub hhhD()
Dim i, j, MaxRow, NNnew(), SAku
Set SAku = Worksheets("削除者").Range("A1:A20")

MaxRow = Cells(Rows.Count, "B").End(xlUp).Row
NNmoto = Range("B1:B" & MaxRow)
ReDim NNnew(MaxRow, 0)
Sheets("Sheet1").Activate

j = 0

For i = 1 To MaxRow
On Error Resume Next
y = "": yy = NNmoto(i, 1)
y = WorksheetFunction.vlookup(yy, SAku, 1, False)
On Error GoTo 0
If y = "" Then NNnew(j, 0) = yy: j = j + 1:
Next

Sheets("Sheet1").Range("B1:B" & MaxRow) = NNnew

End Sub
「マクロ式にする場合の方法を教えてください」の回答画像5
    • good
    • 0

No.1です。


さすが初級レベルジジィが有機溶剤でボケたお味噌を使った回答とは違いますよねぇ。
なんか変な感じがして直そうかとも思いましたが出番はなさそう。
    • good
    • 0

こんにちは



>=IF(VLOOKUP(B1,削除者!A:A,1,FALSE),"",B1)
式を解釈してみると、
『削除者シートのA列にB1が存在し、かつ、B1が空白や0で無ければ空白を、それ以外はB1の値』
という意味になりますが、なんだかご質問の文章とは雰囲気が違う感じですけれど…

勝手な推測で、
『削除者シートのA列にB1が存在したらB1、存在しなければB2』
かなと仮定してみました。
通常の数式にすると(検索関数でも良いけれどCOUNTでもできるので)、
 =IF(COUNTIF(削除者!A:A,B1),B1,B2)
となりますが、書いてみると、これも何だかおかしいような気がします。
さらに、問題はこの式をいったいどのセルに設定したいのかも不明ですね。
仮に、A2セルに上記の関数を設定して、フィルコピーをしたいものと仮定します。
(ご提示のコードで、ループの開始行が2になっているみたいなので…、とは言え、そこでB1を参照しているのが妙なのですが…)

以下は、ループを使用せずに、セル範囲にまとめて式そのものを設定し、値を値としてFIXさせる方法です。(計算はエクセルにしてもらう方法。WorksheetFunctionも使いません)

※ 段々、仮定だらけになってきちゃったので、修正が必要だと思いますが、要領が伝われば良いものと考えて、ご参考までに。

Sub Sample_11792156()
 Dim r As Range

 Set r = Cells(2, 1).Resize(Cells(Rows.Count, 2).End(xlUp).Row - 1)
 r.FormulaLocal = "=IF(COUNTIF(削除者!A:A,B1),B1,B2)"
 r.Value = r.Value
End Sub

※ 不要な情報は省いて、実質的に何をなさりたいのか(どのような計算をしたいのか)を明確にしていただいた方が、正確な回答になると思われます。
    • good
    • 0

こんにちは!



>=IF(VLOOKUP(B1,削除者!A:A,1,FALSE),"",B1)
>検索が合えば問題ないですが

ん?それでもエラーになりませんか?

おそらく「削除者」SheetのA列にB列データがあれば「空白」に、そうでない場合は「B列」を!
といった感じをお望みなのでは?

となるとA2セル以降に入る数式は
=IF(COUNTIF(削除者!A:A,B2),"",B2)

となると思われます。
数式は1行目からになっていますが、コードは2行目以降ですね。
すなわち上記数式のように「B2」が最初のセル番地だと思います。

どうしてもVBAで!というコトであれば・・・
(操作するシート名は「Sheet1」とします)

Sub Sample1()
 Dim i As Long
 Dim lastRow As Long
 Dim wS As Worksheet
  Set wS = Worksheets("削除者")
   With Worksheets("Sheet1")
    lastRow = .Cells(Rows.Count, "B").End(xlUp).Row
     For i = 2 To lastRow
      If WorksheetFunction.CountIf(wS.Range("A:A"), .Cells(i, "B")) > 0 Then
       .Cells(i, "A") = ""
      Else
       .Cells(i, "A") = .Cells(i, "B")
      End If
     Next i
   End With
End Sub

※ わざわざループさせずにVBAでもワークシート関数が使えますので

Sub Sample2()
 Dim lastRow As Long
 Dim wS As Worksheet
  Set wS = Worksheets("削除者")
   With Worksheets("Sheet1")
    lastRow = .Cells(Rows.Count, "B").End(xlUp).Row
     With Range(.Cells(2, "A"), .Cells(lastRow, "A"))
      .Formula = "=IF(COUNTIF(削除者!A:A,B2),"""",B2)"
      .Value = .Value
     End With
   End With
End Sub

でも大丈夫だと思います。

※ 余計なお世話かもしれませんが・・・
VLOOKUP関数の使い方を今一度再確認された方が良いと思います。

一般的な使い方としては
ある範囲の一番左側の列を参照にして、何列目を返すか?
というやり方がほとんどだと思います。m(_ _)m
    • good
    • 0

初級者のジジィなので勘違いでしたら削除依頼でもして下さい。



With WorksheetFunction

Cells(i, "A").Value = IIf(.CountIf(Sheets("削除者").Range("A:B"), Cells(i, "B").Value) = 0, Cells(i, "B").Value, .VLookup(Cells(i, "B").Value, Sheets("削除者").Range("A:B"), 1, 0))

End With

先に検索範囲にそのデータがあるかどうかをCountIfで調べてます。
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング