在工作表

时间:2018-01-09 16:11:51

标签: excel vba excel-vba

编辑:我改变了程序,现在正在使用应用程序。使用vlookup和hlookup函数查找坐标的工作表函数。理论上,这应该给我我想要的值,但我在查找中不断使对象超出范围错误。

场景:我正在尝试使用for循环中的输入来选择一个单元格。

目标:循环从工作表1中检索标识符和日期,并使用日期的月份/年和标识符在工作表2中查找值。

数据示例: WS2:

               ident1    ident2    ident3    ident4    ident5
20/01/2010      aa        az         zc        bc        ht
20/02/2010      er        da         ea        cr        hd
20/03/2010      ok        ju         nh        lo        gk
20/04/2010      uj        hg         gj        eg        nh
20/05/2010      ug        cd         ad        ea        ga

从我的循环中我得到2个值,例如:ident3和15/04/2010。首先,我想找到该月份和年份在该标识符列表中的位置。在这种情况下,它将是“gj”。

问题:在这里我遇到了2个问题,首先是能够只为月份和年份考虑日期。如果我只想找到月份,那么使用MONTH()功能会很简单,但由于我还要考虑今年,我很遗憾(我也试过考虑整个日期,但是从那天开始不匹配,我无法绕过)。如何才能做到这一点? 其次,我正在使用第一行的选择,然后是每个标识符的查找和替换过程,我无法使用它来进行协调。这样做的正确方法是什么?

到目前为止

代码:

Option Explicit
Sub FindData()

Dim wb As Workbook
Dim lrow As Integer, a_number As Integer 
Dim date_number As Date, LMonth As Date


For lrow = 2 To wb.Sheets("CAs").UsedRange.Rows.count

    a_number = Range("B" & lRow).Value
    date_number = Range("C" & lRow).Value
    LMonth = Month(date_number)

wb.Sheets("AMT").Cells(a_number,date_number).Value
lastRow = Sheet1.Cells(Rows.count, 1).End(xlUp).Row

lastCol = wb.Sheets("AMT").Cells(2, Columns.Count).End(xlToLeft).Column
lastColLetter = Col_Letter(lastRow)


datefinalmatch = Application.WorksheetFunction.VLookup(wb.Sheets("CAs").Range("C"&lrow), _
     "AMT!$A$2:§"&lastColLetter&"$"&lastRow&","&"lastCol&",TRUE)" + 1
isinfinalmatch = Application.WorksheetFunction.HLookup(wb.Sheets("CAs").Range("B"&lrow), _
     "AMT!$B$1:§"lastColLetter"$"&lastRow&","&"lastRow&",False)"


Next lrow

End Sub

1 个答案:

答案 0 :(得分:1)

这是一个函数,它将接受您的日期和标识符作为字符串,并从表中返回相应的代码。 testSheet只是我的表单的名称。如果没有找到,则返回零长度字符串。

Set r = ws.Range("$A:$Z")行上,只需将范围设置为足以包含整个查找表。

Public Function FindCode(date_number, ident) As String

Dim ws As Worksheet
Dim r As Range

Set ws = ThisWorkbook.Sheets("testSheet")
Set r = ws.Range("$A:$Z")

Set c = r.Find(date_number)

If Not c Is Nothing Then
    daterow = c.Row
End If

Set c = r.Find(ident)

If Not c Is Nothing Then
    identcol = c.Column
End If

If daterow = Empty Or identcol = Empty Then
    FindCode = ""
Else
    FindCode = ws.Cells(daterow, identcol)
End If

End Function

示例用法是:

Debug.Print FindCode("20/04/2010", "ident2")