2017-08-23 8 views
0

以下に私のコードのスニペットを掲載しました。私の実際のワークブックにはもっと多くの数式がありますが、それらはすべて以下の数式のように構成されています。私が扱っているデータの量は1ヶ月ごとに変わる可能性があるので、数式が必要な行の数は決して分かりません。私のちょっとした不満は、すべての式の宛先範囲を"XX2:XX500"にすることでした。これは決して500行を超えないためです。式のVBAダイナミックレンジ

'November Remaining Spending Plan 
Range("BF2").Select 
ActiveCell.FormulaR1C1 = "=IF(RC[-1]="""","""",RC[-43]+RC[-40]+RC[-37]+RC[-34]+RC[-31]+RC[-28]+RC[-25]+RC[-22])" 
Selection.AutoFill Destination:=Range("BF2:BF500") 

'December Remaining Spending Plan 
Range("BG2").Select 
ActiveCell.FormulaR1C1 = "=IF(RC[-1]="""","""",RC[-41]+RC[-38]+RC[-35]+RC[-32]+RC[-29]+RC[-26]+RC[-23])" 
Selection.AutoFill Destination:=Range("BG2:BG500") 

Iダイナミックレンジが非常に式Iの

"IF(RC[-1]="""",""""," 

一部を除去し、ブック内の余分な式を有するピボットテーブルと、他のユーザのために理想的ではないことができるしたいと思い。

私はLastRow、FillDown、CurrentRegionの組み合わせを使用して範囲を試してみましたが、私は運がありませんでした。

各フォーミュラは他のすべてのフォーミュラと同じ量の行を持ち、数式の数は常に列Aの行数から1を引いた数になります(マイナス1はヘッダー用です)。

これをクリーンアップする方法はありますか?

ありがとうございます!

答えて

0
Dim lastRow As Long 
Dim ws As Worksheet 
'Always set the parent of all Range Objects 
Set ws = ActiveSheet 'This should be called by name: Worksheets("Sheet1") 

' this assumes column "A" is the column which sets the lastrow. 
'If a different column sets the end of the dataset change "A" to that column 
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row 

'do not use .Select or .Activate it slows the code 
'You do not need autofill just put it in all the cells at once 


'November Remaining Spending Plan 
ws.Range("BF2:BF" & lastRow).FormulaR1C1 = "=RC[-43]+RC[-40]+RC[-37]+RC[-34]+RC[-31]+RC[-28]+RC[-25]+RC[-22]" 

'December Remaining Spending Plan 
ws.Range("BG2:BG" & lastRow).FormulaR1C1 = "RC[-41]+RC[-38]+RC[-35]+RC[-32]+RC[-29]+RC[-26]+RC[-23]" 
+0

これは素晴らしいです - ありがとう!あなたのためのもう1つの質問は、どのように私はそれを使用することができますように私は "Dim lastRow As Long Dim ws WorksheetSet ws = ActiveSheetワークシート(" Sheet1 ") lastRow = ws.Cells(ws.Rows.Count、" A " ).End(xlUp).Row "他のモジュール間で?これを公開する方法はありますか?他のモジュールで使用できない場合は、すべての式を1つのモジュールに移動できます。現在、範囲X2:XX500の数式は複数のモジュールにあります。 – Brian

+0

ただパブリック変数を作る。モジュールの一番上に 'public lastrow as Long'を置いてください。そして、サブの' Dim lastrow as Long'を削除してください。次に、Excelを開いている間に一度だけ設定し、任意のコードで「終了」を使用しないでください。それは値を維持し、他のモジュールが呼び出して使用することができます。 –

+0

これは私が今持っているもので、他のモジュールでは取り上げられていません。 ' 'ロング ように、モジュール1 パブリックLASTROWの上に' 変数はワークシート セットWS =ワークシート( "試験") LASTROW = WSよう サブVariableTest() ' 薄暗いWSを定義されたモジュール1において。セル(ws.Rows.Count、 "A")。End(xlUp).Row 次に、2番目のモジュールで計算します。 ' 'モジュール2 サブテスト(の計算) ' 新11月レムエスト ws.Range( "D2:D" &LASTROW).FormulaR1C1 = "= RC [-2] -RC [1]" エンドSub' – Brian

0

あなたは毎月データをリフレッシュしているようで、データの右側の列に数式を入れる必要があります。問題は、数式を配置する行を決定する方法です。短い答えはThisWorkBook!Workbook_Open()サブBRO2からBG500(最大範囲だから)の範囲を削除するコードを配置し、行2から数式をコピーあなたがデータを持っている行の数にします。私はあなたがこれを行う方法を知っていると仮定したので、LastRowに言及しました。サンプルコードが必要ですか、これで十分ですか?

関連する問題