WorksheetFunction 确定列并将结果用作范围

WorksheetFunction to determine column and use result as range

首先,这里有一个 link 到我的工作簿,已上传到 OneDrive:

https://1drv.ms/x/s!AsQuasddi71ugRSDelemaNIBKazB

这几周我一直在尝试开发代码,在一个列中搜索Header,确定我要复制的范围。

我在Excel中得到的结果: 要查找 "No." 的列字母:

=SUBSTITUTE(ADDRESS(1;MATCH("No.";1:1;0);4);"1";"")  

结果:B

查找 header 列和 "No." 的第一行:

=ADDRESS(1;MATCH("No.";1:1;0);4)    

结果:B1

要查找 "Prepayment Amount excl VAT" 的列字母:

=SUBSTITUTE(ADDRESS(1;MATCH("Prepayment Amount excl VAT";1:1;0);4);"1";"")   

结果:L

查找 header 列和 "Prepayment Amount excl VAT" 的第一行:

=ADDRESS(1;MATCH("Prepayment Amount excl VAT";1:1;0);4)                       

结果:L1

在 excel 文件中,我有两个模块...模块 1 基于列工作,这意味着它将始终复制 Sheet 1 中的 B 列和 L 列,以及 A 列和B 在 sheet 2...

在模块 2 中,我一直在尝试创建一个宏,它应该在列的 Header 名称和 return 单元格 B1 和列 B 上导航,以将列声明为:

sht.Range("B1:B" & LastRow).Copy

否则我想将 Substitute、Address、Match 公式分配给一个变量,我想用...

替换 "B1" 和 "B"

目前我遇到了很多错误...

我能否让宏使用我的替代、地址、匹配公式的结果来替换 sht.Range("B1:B" & LastRow).Copy 中的 "B1" 和 "B"?

如果您有任何想法,请告诉我如何更正宏以按照我的意愿执行:)

我的宏如下:

Sub CopyPasteDataLookingForHeader()
Dim sht, sht2, sht3 As Worksheet
Dim i, LastRow, LastRow2 As Long
Dim Number, NumberOne, Prepay, PrepayOne As Variant
Set sht = Sheets("Sales List")
Set sht2 = Sheets("Match Sales List and Pivot")
Set sht3 = Sheets("Pivot of Prepayment account")
Number = Application.WorksheetFunction.Substitute(sht.Range("1:1").Address(1, Application.WorksheetFunction.Match("No.", sht.Range("1:1"), 0), 4), 1, "")
NumberOne = sht.Range("1:1").Address(1, Application.WorksheetFunction.Match("No.", sht.Range("1:1"), 0), 4)
Prepay = Application.WorksheetFunction.Substitute(sht.Range("1:1").Address(1, Application.WorksheetFunction.Match("Prepayment Amount excl VAT", sht.Range("1:1"), 0), 4), "1", "")
PrepayOne = sht.Range("1:1").Address(1, Application.WorksheetFunction.Match("Prepayment Amount excl VAT", sht.Range("1:1"), 0), 4)
LastRow = sht.Cells(sht.Rows.Count, Number).End(xlUp).Row
LastRow2 = sht3.Cells(sht3.Rows.Count, "B").End(xlUp).Row

Dim rng1, rng2 As Range
rng1 = "NumberOne:Number"
rng2 = "PrepayOne:Prepay"

sht.Range(rng1 & LastRow).Copy
sht2.Activate
Range("D1").Select
ActiveSheet.Paste
Application.CutCopyMode = False
'------------------------------------------
sht.Range(rng2 & LastRow).Copy
sht2.Activate
Range("E1").Select
ActiveSheet.Paste
Application.CutCopyMode = False
'------------------------------------------
sht3.Range("A1:A" & LastRow2).Copy
sht2.Activate
Range("A1").Select
ActiveSheet.Paste
Application.CutCopyMode = False
'------------------------------------------
sht3.Range("B1:B" & LastRow2).Copy
sht2.Activate
Range("B1").Select
ActiveSheet.Paste
Application.CutCopyMode = False
'------------------------------------------
Columns("A:E").ColumnWidth = 25
End Sub

我不确定我是否完全理解您的问题,但我最近开发了一个 data-validation 下拉框可以回答您的问题。

我有两个 sheet。 Sheet1.Column "A" 是员工姓名。 Range("B1") 有一个下拉框,其中包含来自第二个 sheet 的 header 个名称,称为 "DataBase"

Sheet("DataBase") 在列 "A" 中也有相同的员工姓名。但它在 "B" 列中也有 "Phone Number",在 [=27= 列中有 "Address",在 "D" 列中有 "Next of Kin",等等。 Sheet("DataBase") 的第一行有 header 个名称对应于上面引号中的名称。

在 sheet1 上通过 selecting "B1" 并单击数据菜单 -> 验证在 "B1" 中创建验证 list-box。在第2个sheet的window和select的header中选择"List",-Sheet("DataBase"),如列表框的列表。然后只需将以下代码放入 Sheet1 的模块中:(当然,您必须更改 header 名称和列以适合您自己的项目,但这会让您了解如何获得不同的范围,将它们复制到其他目的地。)

Private Sub Worksheet_Change(ByVal Target As Range)
Dim LR As Long
Dim myRng As Range

Application.EnableEvents = True
Application.ScreenUpdating = False
Sheet2.Activate

    LR = lastRowCol(Sheet2, "B")

    If Target.Row = 1 And Target.Column = 2 Then

        Select Case Target.Value

            Case "Date of Birth"
                Set myRng = Sheet2.Range("B2:B" & LR)

            Case "Phone Number"
                Set myRng = Sheet2.Range("C2:C" & LR)

            Case "Seniority Date"
                Set myRng = ActiveSheet.Range("D2:D" & LR)

            Case "Next of Kin"
                Set myRng = Sheet2.Range("E2:E" & LR)

        End Select

    End If
    Application.EnableEvents = False
    Sheet1.Range("B2:B5000").ClearContents
    myRng.Copy Destination:=Worksheets("Sheet1").Range("B2")
    Sheet1.Activate
    Application.EnableEvents = True
    Application.ScreenUpdating = True

End Sub




Function lastRowCol(sht1 As Worksheet, col As String) As Long
lastRowCol = sht1.Cells(sht1.Rows.Count, col).End(xlUp).Row
End Function

引用变量时,不要将它们放在引号中。现在,代码有 rng1 = "NumberOne:Number",Excel 按字面解释。您需要连接文本片段以形成范围。尝试:

Dim FindNo, Number, NumberOne, FindPrepay, Prepay, PrepayOne As String

FindNo = Sht.Range("1:1").Find("No.").Address(False, False, xlA1)
Number = Application.WorksheetFunction.Substitute(FindNo, 1, "")
NumberOne = FindNo

FindPrepay = Sht.Range("1:1").Find("Prepayment Amount excl VAT").Address(False, False, xlA1)
Prepay = Application.WorksheetFunction.Substitute(FindPrepay, 1, "")
PrepayOne = FindPrepay

rng1 = NumberOne & ":" & Number & LastRow
rng2 = PrepayOne & ":" & Prepay & LastRow

这也使用 VBA Range.FindAddress 方法,而不是调用工作表函数。