2016-11-02 8 views
0

私は、このコードがそれを使用しているものに対して十分に動的ではないことに気付き始めています。私が探しているのは、RC番号で特定の列を参照するのではなく、ヘッダーの名前で実際に参照するようにコードを変更することです。特定の列ではなくヘッダーを参照するVBA

これを明確にしようとしています。このコードの最終結果は、次のように簡単になります。 PRESTIGE WORLDWIDE INC。/ 123 TacoTaco DR

住所はコード内でRC-103 102 101の3つの異なる列に分かれています。

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回以上行う予定です。何百というコードではなく、2行のコードについて話すときに答えが異なることがあることは分かっています。

ご協力いただきありがとうございます。このサイトは既に驚くほど役立っており、私は完全な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つの方法があります。各メソッドには少し異なるアプローチがありますが、すべてのメソッドは同じ結果を返します。

最初の3つの方法が.End(xlDown)を使用しており、1行のデータしかない場合は正しく動作しません。

おそらく、方法4が最適です。これは.End(xlUp)使用して、7

2番目、3番目と4番目の方法は、最初. In this way you will not need to calculate the offset of the columns. Next列が(120) `列内のすべての細胞を標的化するために使用されるEntireRow Cell(2, 7) to the last used cell and then extends the range to include all the cells in those rows usingから延在する範囲を定義する列の複数のリストを持っている場合に失敗しますその範囲の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 
関連する問題