2016-11-02 1 views
0

Я начинаю понимать, что этот код не будет достаточно динамичным для того, для чего он использует его. То, что я хочу сделать, это изменить код, чтобы вместо обращения к определенному столбцу по номеру RC он фактически ссылается на него по имени заголовка.VBA, чтобы ссылаться на заголовок, а не на конкретный столбец

Просто пытаясь дать ясность с этим. Конечный результат этого кода выглядит так просто: 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, и у вас есть планы сделать это, вероятно, ближе к 1000 раз в нескольких электронных таблицах, чтобы дать вам все масштабы. Я знаю, что ответы могут отличаться, когда речь идет о нескольких строках кода, а не о сотнях.

Благодарим вас за тонну за любую помощь. Этот сайт уже был поразительно полезен, и я получил полное 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

[Этот вопрос, возможно, уместным.] (Http://stackoverflow.com/q/39755639/4088852) – Comintern

ответ

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 EntireRow . 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