VBA引用头而不是特定列

时间:2016-11-02 21:40:51

标签: vba dynamic header

我开始意识到这个代码不会足够动态,因为我正在使用它。我想要做的是更改代码,以便不是通过RC编号引用特定列,而是通过标题的名称实际引用它。

试图澄清这一点。这段代码的最终结果看起来很简单: PRESTIGE WORLDWIDE INC./ 123 TacoTaco DR

地址分为3个不同的列,即代码中的RC-103 102 101。

Sub ProjectName()

Dim ws As Excel.Worksheet

Set ws = ActiveWorkbook.Sheets("Macro Time") ' change to name of your sheet

Dim x As Long
        x = 2 '************CHANGE BACK TO 2********************

Do Until ws.Cells(x, 7) = ""

    With ws.Cells(x, 120)


.Value = "=iferror(""""&RC[-86]&"" / ""&RC[-103]&"" ""&RC[-102]&"" ""&RC[-101]&"""",)"
    .Value = .Value

    End With

    x = x + 1
Loop



End Sub

有没有人对如何解决这个问题有一些想法?我尝试了几种不同的方法,但都失败了。在这一点上,如果你想了解如何做到这一点,我想“开场”。显然,我想要最简单的方法来做到这一点。作为一个更多的背景,我将需要对大约300个单独的RC数字执行此操作,并且计划在多个电子表格中执行此操作可能接近1,000次,以便为您提供所有规模。我知道在谈论几行而不是数百行代码时,答案会有所不同。

非常感谢你们的帮助。这个网站已经非常有用,而且我是一个完整的noobie。

Sub ProjectName()
Application.ScreenUpdating = False

Dim ws As Excel.Worksheet

Set ws = ActiveWorkbook.Sheets("Macro Time") ' change to name of your sheet

Dim projectCell As Range ' Project Name
Dim amlCell As Range ' AML_PROV_PATH
Dim ultCustNameCell As Range ' ULTIMATE_CUST_NAME
Dim sanoCell As Range ' SANO
Dim sasnCell As Range ' SASN
Dim sathCell As Range ' SATH

Set projectCell = FINDCOLUMN("Project Name")
Set amlCell = FINDCOLUMN("AML_PROV_PATH")
Set ultCustNameCell = FINDCOLUMN("ULTIMATE_CUST_NAME")
Set sanoCell = FINDCOLUMN("SANO")
Set sasnCell = FINDCOLUMN("SASN")
Set sathCell = FINDCOLUMN("SATH")

Dim x As Long
        x = 2 '************CHANGE BACK TO 2********************

Do Until ws.Cells(x, amlCell.Column) = ""

    With ws.Cells(x, projectCell.Column)
    .Value = "=iferror(""" & ws.Cells(x, ultCustNameCell.Column).Text & " / " _
                           & ws.Cells(x, sanoCell.Column).Text & " " _
                           & ws.Cells(x, sasnCell.Column).Text & " " _
                           & ws.Cells(x, sathCell.Column).Text & """ ,)"

    .Value = .Value

    End With

    x = x + 1
Loop

Application.ScreenUpdating = True
End Sub

这就是答案。我想我应该和大家分享。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

使用R1C1表示法的原因是您可以在一系列单元格中指定相对公式。没有必要循环单个细胞。只需在整个范围内定义范围和公式即可。

以下是定义范围并为其指定公式的4种方法。每种方法都有一个稍微不同的方法,但所有方法都返回相同的结果。

如果前三种方法使用.End(xlDown),并且如果只有一行数据则无法正常工作。

方法4可能是最好的。它使用.End(xlUp),如果第7列中有多个列表,则会失败。

第2,第3和第4种方法首先定义从Cell(2, 7) to the last used cell and then extends the range to include all the cells in those rows using延伸的范围.RowadRow . In this way you will not need to calculate the offset of the columns. Next列(120)`用于定位范围的列120中的所有单元格。

注意:我认为这是您想要使用的内容。

方法3& 4使用R1C1表示法的不同变体。它不使用列120的偏移量,而是使用当前行的实际列号。例如:不使用第120列RC[-86]的偏移量来引用第34列(120-86),而是使用RC34

With Sheets("Macro Time")
    With .Range(.Cells(2, 7), .Cells(2, 7).End(xlDown)).Offset(0, 113)
        .FormulaR1C1 = "=IFERROR(""""&RC[-86]&"" / ""&RC[-103]&"" ""&RC[-102]&"" ""&RC[-101]&"""",)"
        .Value = .Value
    End With
End With

With Sheets("Macro Time")
    With .Range(.Cells(2, 7), .Cells(2, 7).End(xlDown)).EntireRow.Columns(120)
        .FormulaR1C1 = "=IFERROR(""""&RC[-86]&"" / ""&RC[-103]&"" ""&RC[-102]&"" ""&RC[-101]&"""",)"
        .Value = .Value
    End With
End With

With Sheets("Macro Time")
    With .Range(.Cells(2, 7), .Cells(2, 7).End(xlDown)).EntireRow.Columns(120)
        .FormulaR1C1 = "=IFERROR(""""&RC34 &"" / ""&RC17&"" ""&RC18&"" ""&RC19&"""",)"
        .Value = .Value
    End With
End With

With Sheets("Macro Time")
    With .Range(.Cells(2, 7), .Cells(.Rows.Count, 7).End(xlUp)).EntireRow.Columns(120)
        .FormulaR1C1 = "=IFERROR(""""&RC34 &"" / ""&RC17&"" ""&RC18&"" ""&RC19&"""",)"
        .Value = .Value
    End With
End With