【问题标题】:Excel VBA - Range(Find().Adress).RowExcel VBA - 范围(查找()。地址)。行
【发布时间】:2020-11-03 12:23:33
【问题描述】:

我已经用谷歌搜索并为此苦苦挣扎了几个小时。

我有一个控制工作簿,它从不同数量的其他工作簿中提取数据(控制工作簿还创建其他工作簿并保存所述工作簿的名称和目录,以便以后可以调用它们)

这段代码就是问题所在。


Application.DisplayAlerts = False
Application.ScreenUpdating = False

Declare_Sheets

Dim SearchresultROW
Dim Searchresult As String
Dim complexrow As Integer
Dim CurrSheet As Worksheet
Dim Stype As String

Dim startROW As Integer
Dim endROW As Integer, SearchCOL As Integer, OffROW As Integer
Dim PDATArange As Range, CDATArange As Range
Dim Dateyear, Datemonth, datetest As String

Stype = WSRD.Range("B11")

'Find complex to work with
complexrow = WSSS.Range("F7")
WSSS.Activate
SearchresultROW = Range(Cells(7, 15), Cells(complexrow, 15).Find(Callsheet).Address).Row
Searchresult = WSSS.Cells(SearchresultROW, 15).Offset(0, 1)


Application.DisplayAlerts = True
Application.ScreenUpdating = True

End Sub

下面的代码是问题摘录

complexrow = WSSS.Range("F7")
WSSS.Activate
SearchresultROW = Range(Cells(7, 15), Cells(complexrow, 15).Find(Callsheet).Address).Row
Searchresult = WSSS.Cells(SearchresultROW, 15).Offset(0, 1)

第一个问题 我无法在不激活工作表的情况下让 find() 工作 - WSSS Declare_Sheets 在声明 WSSS 的开头运行,这适用于我的代码中的其他任何地方,但不适用于此 find()。

第二个问题 下面的代码编译并完成,但是 - 它没有返回正确的数据。

此代码调用启动宏

Cancel = True
Dim Calsheet As String
If Target.Column <> 1 Then Exit Sub
Calsheet = Target.Value
Call Call_Readings(Calsheet)
End Sub

目前有两种可能

我双击 Casper Tcomp 4。 Callsheet = "Casper Tcomp 4" - 哪个是正确的(双击的目标)

Complexrow = "9" - 哪个是正确的(这将随着新工作表的添加而增加)

SearchresultROW = "7" - 这是错误的,应该是 8

我尝试添加 LookAt:=xlWhole 和 LookIn:-xlValues,并没有改变任何东西

【问题讨论】:

  • Callsheet 在哪里定义?在尝试访问属性等以避免错误之前,您应该检查您是否找到了一些东西。
  • 谢谢,Callsheet被定义为一个字符串,在“Sub Call_Readings(Callsheet as string)”中,我忽略了上面第一行代码的粘贴,谢谢指出。跨度>

标签: excel vba


【解决方案1】:

Application.DisplayAlerts = False
Application.ScreenUpdating = False

Declare_Sheets

Dim SearchresultROW
Dim Searchresult As String
Dim complexrow As Integer
Dim CurrSheet As Worksheet
Dim Stype As String
Dim FindResult As Range

Dim startROW As Integer
Dim endROW As Integer, SearchCOL As Integer, OffROW As Integer
Dim PDATArange As Range, CDATArange As Range
Dim Dateyear, Datemonth, datetest As String

Stype = WSRD.Range("B11")

'Find complex to work with
complexrow = WSSS.Range("F7")
On Error Resume Next 'next line will error if nothing is found
Set FindResult = WSSS.Range(WSSS.Cells(7, 15), WSSS.Cells(complexrow, 15)).Find(What:=Callsheet, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, MatchByte:=False)
On Error GoTo 0 'always re-activate error reporting!

If Not FindResult Is Nothing Then  'check if find was successful
    SearchresultROW = FindResult.Row
    Searchresult = WSSS.Cells(SearchresultROW, 15).Offset(0, 1)
Else  'if nothing was found show message
    MsgBox "NO WB FOUND.", vbCritical
End If

这解决了问题,感谢Pᴇʜ的帮助

【讨论】:

  • 请注意:您应该将行计数变量声明为 Long,因为 Excel 的行数超过了 Integer 可以处理的数量。而Dim Dateyear, Datemonth, datetest As String 仅将datetest 声明为String,前两个声明为Variant。如果它们包含年份和月份(数值),我推荐Dim Dateyear As Long, Datemonth As Long, datetest As String 否则String 而不是Long
【解决方案2】:

没有.Activate 的代码如下所示。请注意,每个 RangeCellsRowsColumns 对象都需要使用正确的工作簿/工作表来引用:

complexrow = WSSS.Range("F7")

'try to find something
Dim FindResult As Range
On Error Resume Next 'next line will error if nothing is found
Set FindResult = WSSS.Cells(complexrow, 15).Find(What:=Callsheet, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, MatchByte:=False)
On Error GoTo 0 'always re-activate error reporting!


If Not FindResult Is Nothing Then  'check if find was successful
    SearchresultROW = WSSS.Range(WSSS.Cells(7, 15), FindResult).Row
    Searchresult = WSSS.Cells(SearchresultROW, 15).Offset(0, 1)
Else  'if nothing was found show message
    MsgBox "nothing found.", vbCritical
End If

请注意,如果使用Range.Find method,您需要先检查是否找到了某些东西,然后才能使用Find 的结果。否则会抛出错误。另请注意,Find 的文档说……

每次使用此方法时都会保存LookInLookAtSearchOrderMatchByte 的设置。

因此,如果您不每次都使用Find 定义它们,它将使用VBA 或用户界面最后使用的任何内容。由于您无法控制用户界面最后使用的内容,我强烈建议您每次使用 Find 定义它们,否则您将获得随机结果。

另请注意,Callsheet 尚未在您的代码中定义,因此请检查。

【讨论】:

  • 感谢您的帮助,我不得不进行 2 处更改,将 Set FindResult = WSSS.Cells(complexrow, 15).Find(What:=Callsheet, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, MatchByte:=False) 替换为 Set FindResult = WSSS.Range(WSSS.Cells(7, 15), WSSS.Cells(complexrow, 15)).Find(What:=Callsheet, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, MatchByte:=False)
  • SearchresultROW = WSSS.Range(WSSS.Cells(7, 15), FindResult).RowSearchresultROW = WSSS.Range(WSSS.Cells(7, 15), WSSS.Cells(complexrow, 15)).Find(What:=Callsheet, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, MatchByte:=False).Row
  • @CasperDuPlessis 嗯,这种变化与我解释的想法完全矛盾。如果您在较长的语句中直接使用Find,则如果找不到任何内容,这很容易引发错误。这个想法总是将 find 的结果设置为变量Set FindResult = Range().Find,仅此而已,以便能够检查它是否成功If Not FindResult Is Nothing Then {successful} Else {not successful}。如果您将FindFind().Row 之类的其他语句放在一起,则没有检查它(如果没有找到它会崩溃)。
  • 你的代码的问题是这个Set FindResult = WSSS.Cells(complexrow, 15).Find(What:=Callsheet, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, MatchByte:=False) 没有为 Find() 提供一个范围,它只是提供了一个单元格 - WSSS.Cells(complexrow, 15)....或者我是缺少什么?
  • @CasperDuPlessis 但范围是在 SearchresultROW = WSSS.Range(WSSS.Cells(7, 15), FindResult).Row 使用 find FindResult 的结果生成的。
猜你喜欢
  • 2017-05-25
  • 2015-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多