アプリ版:「スタンプのみでお礼する」機能のリリースについて

最近vbaを使い始めました。
初心者につき見苦しいコードでしたらすみません。。
調べても解決方法が見当たらなかったのでお力をお貸しいただければ幸いです。

【状況】
「表」というシートのA列とU(21)列には文字が入っています。
データは10万件ほどあります。
U(21)列が、ある条件に当てはまっている場合は同じ行のV(22)列に「1」が入力されています。

【やりたいこと】
U列に入っている単語がA列に存在しないときにU列にある単語をAO(41)列に出力したいです。
ただしV列に「1」がある場合は除きます。

-------------------------------------
【理想】
A   U  V  AO
犬  犬
鳥  猫 1
猿  豚    豚
魚  馬 1
鼠  鳥
虎  猿
兎  人    人
-------------------------------------
以下、作成したコードですが、V列に「1」がある場合もピックされてしまいます。
【結果】
A   U  V  AO
犬  犬
鳥  猫 1   猫
猿  豚    豚
魚  馬 1   馬
鼠  鳥
虎  猿
兎  人    人

【作成したコード】
Option Explicit

Sub テスト()

Dim startTime As Double
Dim endTime As Double
Dim processTime As Double

startTime = Timer

Application.ScreenUpdating = False
Application.Cursor = xlWait
Application.EnableEvents = False
Application.DisplayAlerts = False
Application.Calculation = xlCalculationManual

Dim 表Ws As Worksheet
Set 表Ws = Worksheets("表")

With 表Ws

Dim i As Long
For i = 2 To .Cells(Rows.Count, 21).End(xlUp).Row

On Error Resume Next

If (.Cells(i, 22).Value = "") And (WorksheetFunction.VLookup(.Cells(i, 21), .Range("A:A"), 1, False) = "") Then
.Cells(i, 41) = .Cells(i, 21)
Else
.Cells(i, 41) = ""

On Error GoTo 0

End If

Next
End With

Application.StatusBar = False
Application.Calculation = xlCalculationAutomatic
Application.DisplayAlerts = True
Application.EnableEvents = True
Application.Cursor = xlDefault
Application.ScreenUpdating = True

endTime = Timer

processTime = endTime - startTime
MsgBox "処理時間:" & processTime


End Sub

-------------------------------------
お手数ですがどなたか宜しくお願い致します。

A 回答 (4件)

#2です


原因の解説を加えます。
If (.Cells(i, 22).Value = "") And (WorksheetFunction.VLookup(.Cells(i, 21), .Range("A:A"), 1, False) = "") Then はVLookupでエラーが返されることを条件にしています。
エラー回避の為 On Error Resume Next を設定していますが
On Error Resume Nextはエラー発生行を飛ばします。
従って同じ行で設定されている条件.Cells(i, 22).Value = ""は無効となる事が原因で.Cells(i, 41) = .Cells(i, 21)が実行されてしまいます。

そのままのコードで回避するためには、Andを使わずに分ける事が必要になります。 例えば、
On Error Resume Next
If WorksheetFunction.VLookup(.Cells(i, 21), .Range("A:A"), 1, False) = "" Then
If .Cells(i, 22).Text = "" Then
.Cells(i, 41) = .Cells(i, 21)
End If
Else

エラー発生を条件にすることは良くありますが、エラー対処の為に限るのが良いと思います。通常処理の時は出来るだけ避けるのが良いと思います。
    • good
    • 0
この回答へのお礼

できました!!すごい!!ありがとうございます!!
詳しい説明もいただき感謝です。理解できました!!

皆様もお忙しい中たくさんのご回答をありがとうございました!

お礼日時:2021/07/15 14:24

こんにちは



エクセルの機能を利用して、計算はエクセルにやってもらうという別法です。
ご参考までに。

Sub Sample()
With Range(Cells(1, 21), Cells(Rows.Count, 21).End(xlUp)).Offset(, 20)
 .FormulaLocal = "=IF(COUNTIF(A:A,U1)+(V1=1),"""",U1)"
 .Value = .Value
End With
End Sub
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
できました!ありがとうございます!
ただ、15分かかってしまうので時短案があればお願いしたいです!

お礼日時:2021/07/15 14:13

こんにちは


問題の原因を確かめていないのですが、
エラーが返る可能性は出来るのであれば回避させたいですね。
例えば、CountIfで存在を確認するとか、、
If .Cells(i, 22).Text = "" And WorksheetFunction.CountIf(.Range("A:A"), .Cells(i, 21)) > 0 Then
.Textは念のため
    • good
    • 1
この回答へのお礼

ご回答いただきありがとうございます。
V列が「1」以外、かつ、U列に入っている単語がA列に存在する文字が反映されました。
CountIfを使ったコードは上記とは異なりますが、自身で記載できました!
処理に30分弱かかってしまうのでvlookupでなんとかできないかなと思い
投稿させていただいた次第です。。

お礼日時:2021/07/15 13:53

列の値がが数値なら、0(非表示)となっているのかもしれません。



If (.Cells(i, 22).Value = "")

If (.Cells(i, 22).Value <> 1)

と変えてみるとかでどうなるでしょう?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
【結果】と同じ結果になってしまいました・・

お礼日時:2021/07/15 13:31

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