我有两个工作表,一个包含历史数据,另一个包含我刚刚导入的数据。我想检查现有数据,看看新数据是否包含任何重复的引号(因此会被“转换”为订单)。
目前我正在使用A2中的报价编号,并使用以下代码将其与其他工作表中的报价编号进行比较:
Dim wb As Workbook
Set wb = ActiveWorkbook
Dim wS As Worksheet
Set wS = ActiveSheet
Dim importWS as worksheet
importWS = sheets.("NEWDATA")
select.importWS
Range("A1").Select
Do
ActiveCell.Offset(1, 0).Select
'Set the current quote number as a value to be located
Dim valueToFind As Long
valueToFind = ActiveCell.Value
Dim checkRange As Range
Set checkRange = wS.Range("D1:D" & EntryRow)
'Check the existing worksheet to see if the quote already exists
Dim xlCell As Range
For Each xlCell In checkRange
If xlCell.Value = valueToFind Then
problems:
Dim existQuote As range
existQuote = xlCell.Address
Dim existingRow As Integer
existingRow = existingQuote.Row
MsgBox valueToFind & "in row" & existingRow & "has been converted to an order"
End If
Next xlCell
Loop Until ActiveCell.Value > 300000 Or ActiveCell.Value = ""
ActiveCell.Offset(-1, 0).Select
Dim DataPoints As Integer
DataPoints = ActiveCell.Row
ActiveCell.Offset(1, 0).Select
我在“问题:”中遇到if函数问题 代码成功识别出重复的报价编号,但我希望检查同一行中的另一个单元格是否为“销售订单”,然后根据此操作执行操作。
我想不出一种方法来获取我使用此代码的单元格的行号,以便我可以检查它并编辑条目。
编辑:.address
函数返回string
,而不是range
。这就是它失败的原因。
答案 0 :(得分:0)
我建议考虑开始一些一般性评论,尽管它们可能无法解决问题。我必须承认,如果您已经使用未发布的代码完成此操作,我没有下载您的工作簿。
一个。使用Option Explicit
启动模块可能非常严格。从此处发布的代码中,您可能会在问题开始的位置引入一个非Dim
ed变量transfer
。您似乎也创建了一个变量EntryRow
- 可能您的意思是EntireRow函数?这是一段代码,展示了对Option Explicit
Dim existingQuote As Variant
transfer = xlCell.Address
Dim existQuote As
existQuote = transfer
Dim existingRow As Integer
existingRow = existingQuote.Row
您Dim
修改了变体existingQuote
,创建了一个非Dim
ed变量transfer
,Dim
ed existQuote
,没有数据类型,然后尝试将变量existingRow
的值分配给existingQuote.row
,而不Set
existingQuote
变量数组变量应包含的内容。
湾为什么不直接去做?如果您想在importWS
中选择单元格A2并对其执行某些操作/从中获取某些内容,那么
valueToFind = importWS.Range("A2").Value
这至少可能有助于使代码更容易阅读,虽然我有(可能是迷信的)感觉宏也看起来更快一点
℃。我还建议在子程序结束时销毁变量。
如果你清理你的代码,它也可以帮助论坛的boffins掌握你想要做的事情。
编辑 :(未经测试)
这个怎么样:
Dim xlCell As Excel.Range
Dim existQuote As Long
For Each xlCell In checkRange
If xlCell.Value = valueToFind Then
existQuote = xlCell.Row
MsgBox (valueToFind & " in row " & existQuote & " has been converted to an order", "Order Conversion Alert: ")
End If
Next xlCell
Loop Until ActiveCell.Value > 300000 Or ActiveCell.Value = ""
注意:只有在ActiveCell
循环期间Do
列遍历的数据填充单元格之间没有间隙时,此操作才有效。如果您有间隙,您可能希望从工作表的最后一行获取一个循环结束值,而不是数据。你可以这样做:
Dim wb As Workbook
Set wb = ActiveWorkbook
Dim wS As Worksheet
Set wS = ActiveSheet
Dim importWS as worksheet
Dim dataend As Long
Dim counter As Long
importWS = sheets.("NEWDATA")
select.importWS
dataend = Range("A65000").End(xlUp).Row
Range("A1").Select
Do
ActiveCell.Offset(1, 0).Select
If ActiveCell.Value = "" Then
GoTo newloop
Dim valueToFind As Long
valueToFind = ActiveCell.Value
Dim checkRange As Range
Set checkRange = wS.Range("D1:D" & EntryRow)
Dim xlCell As Excel.Range
Dim existQuote As Long
For Each xlCell In checkRange
If xlCell.Value = valueToFind Then
existQuote = xlCell.Row
MsgBox (valueToFind & " in row " & existQuote & " has been converted to an order", "Order Conversion Alert: ")
End If
Next xlCell
newloop:
counter = counter + 1
Loop Until ActiveCell.Value > 300000 Or counter = dataend
ActiveCell.Offset(-1, 0).Select
Dim DataPoints As Integer
DataPoints = ActiveCell.Row
ActiveCell.Offset(1, 0).Select
答案 1 :(得分:0)
我实际上最终使用find函数以使用最少资源的方式执行此操作。