我开始意识到这个代码不会足够动态,因为我正在使用它。我想要做的是更改代码,以便不是通过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
这就是答案。我想我应该和大家分享。谢谢你的帮助。
答案 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