所以我试图创建一个非常简单的宏,它循环遍历某一行,寻找在不同工作表中标识的值。找到该值后,它会开始在结果列中查找文本字符串。如果找到文本字符串,它会抓取同一行中的值,但会删除几列,并将其写入具有用户定义的查找值的工作表。我的问题是,由于某种原因,当我试图比较字符串时,我的条件if语句没有实现,这意味着写入最终值的部分永远不会被评估。这是代码,并提前感谢。
Private Sub valchange()
Dim keycells As Range
Set keycells = Worksheets("Dashboard").Range("B1")
Dim k As Integer
k = 5
For I = 1 To 50
If Worksheets("Rework List").Cells(3, I).Value = keycells.Value Then
For j = 14 To 50
If UCase(Worksheets("Rework List").Cells(j, I)) = "*PENDING*" Then
Cells(j, 3).Value = Worksheets("Dashboard").Range("F" & k)
k = k + 1
End If
Next j
End If
Next I
End Sub
答案 0 :(得分:1)
除了@vacip告诉你的内容之外,我还要指出以下内容
你写道:它抓取同一行中的值,但在和上面有几列 将其写入具有用户定义的查找值的工作表
然后我想:
Cells(j, 3).Value = Worksheets("Dashboard").Range("F" & k)
会做相反的事情(前提是宏开始的活动表是"返工列表")
而且它的'更好地:
将行索引变量声明为Long
类型
虽然在您的具体情况下并不是绝对必要的(它们的范围最大为50,由Integer
类型处理),但最常见的是您最终会遇到33k +行,而且#39;其中Long
类型变量必须进入场景
存储关键字值而不是其范围,并使用keycells.Value
始终采用完全合格的范围引用,至少是工作表对象(如果不是工作簿对象)
所以你可以试试这个:
Option Explicit
Private Sub valchange()
Dim keyVal As String
Dim k As Long, i As Long, j As Long
keyVal = CStr(Worksheets("Dashboard").Range("B1").Value)
k = 5
With Worksheets("Rework List")
For i = 1 To 50
If .Cells(3, i).Value = keyVal Then
For j = 14 To 50
If InStr(.Cells(j, i), "pending", vbTextCompare) > 0 Then
Worksheets("Dashboard").Range("F" & k) = .Cells(j, 3).Value
k = k + 1
End If
Next j
End If
Next i
End With
End Sub
答案 1 :(得分:0)
你不能在VBA中的字符串比较中使用小丑字符。
相反,使用Instr()函数在另一个字符串中搜索字符串。
split
如果可以在第二个字符串中找到搜索字符串,instr将返回第一个字符的位置。如果找不到它,则返回0.所以如果instr()> 0表示该字符串在那里。
vbTextCompare确保忽略套管(大写/小写)。开头的1指定搜索的起始位置。
请注意,这不是世界上最快的事情......