【问题标题】:VBA Xmatch function returning Run-Time Error 1004VBA Xmatch 函数返回运行时错误 1004
【发布时间】:2020-09-18 22:50:21
【问题描述】:

我可能会在这里发布我的问题并希望在我撞墙之前得到帮助。

这是交易:我有一个日期(Data_carga)和一个时间(Hora_carga),用于用户更改其状态的负载。所以我想将他的更改应用到我的后端负载表。

我的负载表 (Table5) 始终按日期自定义排序。所以我的想法是xmatch我的Data_carga反对日期列(Worksheets("CargasBD").Range("Table5[DATA]")),从头到尾(row1)和从尾到头(row2)。然后,使用在间接函数中组合的这两行,我将 xmatch Hora_carga 针对该特定间隔。然后我将映射到后端表上的相同负载来更新它。

但我无法让 xmatch 函数简单地在另一个选项卡上的表中定位一个值。我不断收到此运行时错误 1004。

我的查找值和表格都是日期类型。所以我不知道为什么会出现这个错误。

代码如下。

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False

Dim Data_carga As Date
Dim Hora_carga As Date
Dim Novo_status As String
Dim row, row1, row2 As Integer
Dim addrss, Range_data As String

Set In_range = Application.Intersect(Target, Range("$D$3:$P$11"))
If Not In_range Is Nothing Then
    Data_carga = Range("A" & Target.row).Value
    Hora_carga = Range(Left(Target.Address, Len(Target.Address) - Len(CStr(Target.row))) & "2").Value
    Novo_status = Application.WorksheetFunction.XLookup(Target.Value, Sheets("BD").Range("Table17[Abrev]"), Sheets("BD").Range("Table17[Status das cargas]"), "", 0, 1)
    
    'This is where it breaks
    row1 = Application.WorksheetFunction.XMatch(Data_carga, Worksheets("CargasBD").Range("Table5[DATA]"), 0, 1)
    row2 = Application.WorksheetFunction.XMatch(Data_carga, Worksheets("CargasBD").Range("Table5[DATA]"), 0, -1)
    
    addrss = Application.WorksheetFunction.Concat("CargasBD!C", 1 + row1, ":C", 1 + row2)
    Range_data = Application.WorksheetFunction.INDIRECT(addrss, True)
    
    row = Application.WorksheetFunction.XMatch(Hora_carga, Range_data, 0, 1)
    
    Sheets("CargasBD").Range("D" & row + row1).Value = Novo_status
End If

Application.EnableEvents = True
End Sub

顺便说一句,日期(Data_carga) 和时间(Hora_carga) 可以正常获取。

提前谢谢你。

【问题讨论】:

  • 这不是在 vba 中引用表的方式。见:stackoverflow.com/questions/18030637/…
  • 也使用:Hora_carga = Cells(2, Target.Column).Value 更少的步骤。
  • 谢谢,@ScottCraner。我去了那个链接,从一个跳到另一个,学到了一堆可能有帮助的东西。我已将其更改为:row1 = Application.WorksheetFunction.XMatch(Data_carga, Sheets("CargasBD").ListObjects("Table5").DataBodyRange.Columns(1), 0, 1),但仍然没有成功。
  • 我已经使用相同的文字进行了测试,但在表格中查找 8 的值,按从 1 到 20 的数字排序:row_teste = Application.WorksheetFunction.XMatch(8, Sheets("Sheet1").ListObjects("Table7").DataBodyRange.Columns(1), 0, 1) 它按预期工作,所以我猜我的看起来更新(Data_carga)在某种程度上与我的日期类型表列不匹配(Sheets("CargasBD").ListObjects("Table5").DataBodyRange.Columns(1)我将进行更多测试并尝试找到解决此问题的方法。
  • 看来我有突破了。也许如果我将我的日期变量(Data_carga)更改为范围类型,它可以工作......

标签: excel vba runtime-error match


【解决方案1】:

终于搞定了。

所以我要做的是:

  • 将我查找的变量更改为Range 类型而不是Date
  • 使用Set将数据复制到这两个即Hora_cargaData_carga

我已经搞砸了很多。如果我将Data_carga 中的值粘贴到单元格中并在xmatch 公式中使用它,它会起作用,但我不想绕道而行。所以我的变量(我已经将其更改为范围类型)和工作表中的范围有些奇怪。

继续之前的一件事:正常的时间值 (Hora_carga) 开始变得时髦,在查找错误时,我被指示使用 Set 命令。

所以我使用 Locals Window 来调查我的日期范围变量,并发现我的两个变量之间存在这种奇怪的差异:

尽管我将两者都标为 Range 类型,但我的 hora_carga最终变成了 Date 类型。它与#s 有一个奇怪的价值。所以我只是将我所做的复制到我的Hora_carga 并且它有效。

这是最终代码:

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False

Dim Data_carga, Hora_carga As Range
Dim Novo_status, addrss As String
Dim HoraRow, rowSubRngStrt, rowSubRngEnd, rowHdr As Integer

Set In_range = Application.Intersect(Target, Range("$D$3:$P$11"))
If Not In_range Is Nothing Then
    Set Data_carga = Range("A" & Target.row)
    Set Hora_carga = Range(Cells(2, Target.Column).Address(0, 0))
    Novo_status = Application.WorksheetFunction.XLookup(Target.Value, Sheets("BD").Range("Table17[Abrev]"), Sheets("BD").Range("Table17[Status das cargas]"), "", 0, 1)
    
    rowHdr = Sheets("CargasBD").ListObjects("Table5").HeaderRowRange.row
    rowSubRngStrt = Application.WorksheetFunction.XMatch(Data_carga, Sheets("CargasBD").ListObjects("Table5").DataBodyRange.Columns(1), 0, 1) + rowHdr
    rowSubRngEnd = Application.WorksheetFunction.XMatch(Data_carga, Sheets("CargasBD").Range("Table5[DATA]"), 0, -1) + rowHdr
    addrss = Application.WorksheetFunction.Concat("C", rowSubRngStrt, ":C", rowSubRngEnd)
    
    HoraRow = Application.WorksheetFunction.XMatch(Hora_carga, Sheets("cargasBD").Range(addrss), 0, 1)
    
    Sheets("CargasBD").Range("D" & (rowSubRngStrt + HoraRow - 1)).Value = Novo_status
End If

Application.EnableEvents = True
End Sub

【讨论】:

    猜你喜欢
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    相关资源
    最近更新 更多