【问题标题】:How can I loop this index match?如何循环这个索引匹配?
【发布时间】:2018-07-18 10:45:55
【问题描述】:

好的,所以我在这里有一个宏,它在 AB 和 AC 列中使用索引匹配函数填充单元格。 (这部分很好)

然后,通过将这些值与这些货物的 PL 编号相匹配,根据另一个工作簿中名为 AR_Curr 的范围内的信息,将 AC 列中的这些值格式化为正确的货币(这部分不起作用,只会生成“运行时错误 '1004':无法获取 WorksheetFunction 类的 Index 属性”或“运行时错误 '1004':无法获取 WorksheetFunction 类的 Match 属性”,每当我尝试运行它时。

最后,它复制现在填充单元格的所有值,并将它们作为值粘贴并居中。

有人可以告诉我如何通过搜索索引匹配来确定相关货币,从而使这个选择案例函数动态工作吗?到这里我就束手无策了。

Sub Payment_YN_Call()
'
' Payment_YN_Call Macro
'
Dim answer1 As Integer
Dim answer2 As Integer
Dim answer3 As Integer

answer1 = MsgBox("Did you update the named ranges for INV_Nums on this sheet?", vbYesNo + vbQuestion, "Payment Update")
If answer1 = vbYes Then
    answer2 = MsgBox("Do you have the AR Balance sheet open?", vbYesNo + vbQuestion, "Payment Update")
    If answer2 = vbYes Then
        answer3 = MsgBox("Did you update the AR_PL_Nums, AR_Paid, and AR_Unpaid Ranges on the AR Balance Sheet?", vbYesNo + vbQuestion, "Payment Update")
        If answer3 = vbYes Then

                Dim i As Integer
                Dim Rng1 As Range
                Dim Rng2 As Range
                Dim ARwkb As Excel.Workbook
                Dim ARwks As Excel.Worksheet
                Dim Samwkb As Excel.Workbook
                Dim Samwks As Excel.Worksheet

                Set Samwkb = Excel.Workbooks("Samples - one sheet")
                Set Samwks = Samwkb.Worksheets("samples shipment")
                Set ARwkb = Excel.Workbooks("AR balance.xlsx")
                Set ARwks = ARwkb.Worksheets("Total Trading")

                For i = 6 To Range("INV_Nums").Count + 5

                    If IsEmpty(Range("AB" & i)) Then
                        Range("AB" & i).Select
                            ActiveCell.FormulaR1C1 = _
                                "=IFERROR(IF(INDEX('[AR balance.xlsx]Total trading'!AR_Unpaid,MATCH(RC[-2],'AR balance.xlsx'!AR_Invoice_Nums,0))=0,""PAID"",""UNPAID""),"""")"
                    End If

                If IsEmpty(Range("AC" & i)) Then
                    Range("AC" & i).Select
                        ActiveCell.FormulaR1C1 = _
                            "=IFERROR(IF(RC[-1]=""PAID"",INDEX('AR balance.xlsx'!AR_Paid,MATCH(RC[-3],'AR balance.xlsx'!AR_Invoice_Nums)),""""),"""")"
                End If

                Next i


                Set Rng1 = ARwks.Range("AR_Curr")
                Set Rng2 = ARwks.Range("AR_PL_Nums")
                Dim lastrow As Long, x As Long
                lastrow = Range("INV_Nums").Count + 5
                    For y = 5 To lastrow
                        Select Case Range(Application.WorksheetFunction.Index(Rng1, Application.WorksheetFunction.Match(Range("F" & y), Rng2, 0)))

                            Case "USD"
                                Samwks.Range("AB" & y).NumberFormat = "$#,##0.00_);($#,##0.00)"
                            Case "RMB"
                                Samwks.Range("AB" & y).NumberFormat = "[$¥-zh-CN]#,##0.00;[$¥-zh-CN]-#,##0.00"
                            Case "EUR"
                                Samwks.Range("AB" & y).NumberFormat = "[$€-x-euro2] #,##0.00_);([$€-x-euro2] #,##0.00)"
                            Case "GBP"
                                Samwks.Range("AB" & y).NumberFormat = "[$£-en-GB]#,##0.00;-[$£-en-GB]#,##0.00"
                            Case "HKD"
                                Samwks.Range("AB" & y).NumberFormat = "[$HK$-zh-HK]#,##0.00_);([$HK$-zh-HK]#,##0.00)"
                            Case "JPY"
                                Samwks.Range("AB" & y).NumberFormat = "[$¥-ja-JP]#,##0.00;-[$¥-ja-JP]#,##0.00"
                        End Select
                    Next y



                Columns("AB:AC").Select
                    Selection.Copy
                    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                        :=False, Transpose:=False

                Columns("AB:AC").Select
                    Application.CutCopyMode = False
                    With Selection
                        .HorizontalAlignment = xlCenter
                        .VerticalAlignment = xlCenter
                        .Orientation = 0
                        .AddIndent = False
                        .IndentLevel = 0
                        .ShrinkToFit = False
                        .ReadingOrder = xlContext
                    End With



Else
End If
End If
End If



End Sub

【问题讨论】:

  • 您的代码底部有一个流浪的Else。这基本上是一个错字,它回答了你标题中的问题。您似乎也有一个不相关的问题,但请不要尝试一次提出多个问题。

标签: vba excel select-case


【解决方案1】:

创建一个保存货币和格式的范围,例如

并将范围命名为“货币”。然后将宏的 Select Case 部分更改为...

For y = 5 To lastrow
    Set thisCurrency = Range(Application.WorksheetFunction.Index(Rng1, Application.WorksheetFunction.Match(Range("F" & y), Rng2, 0)))
    Samwks.Range("AB" & y).NumberFormat = Application.WorksheetFunction.VLookup(thisCurrency, Range("currencies"), 2, False)
Next y

这样做的好处是您可以添加新货币或更改格式,而无需对宏进行任何更改。

【讨论】:

  • 哦,为“thisCurrency”创建一个变量真是太好了……谢谢。明天我到办公室时我会试试看!
  • 这似乎没有用.....仍然得到关于索引功能的相同错误。
  • 如果列 F 中列出的 PL 编号不是 AR_PL_Nums 范围内的一个,则可能会中断。在这种情况下,Match 函数将返回错误,从而导致index 函数失败。您应该检查是否可以在 AR_PL_Nums 中找到 F 列中的所有 PL 编号,或者直接忽略。一个简单的解决方案是在For y... 行上方添加On Error Resume Next,并在Next y 之后的行上添加On Error Goto 0
猜你喜欢
  • 2015-10-30
  • 1970-01-01
  • 2020-03-27
  • 2015-12-18
  • 2020-10-06
  • 1970-01-01
  • 2016-02-23
  • 1970-01-01
  • 2020-08-15
相关资源
最近更新 更多