2016-04-22 34 views
0

Excel VBAで非常に長いマクロを作成しています。名前付き範囲をマクロ内で指定する代わりに使用したいと思います。このマクロは長期間使用するためのものです。他のユーザーが範囲を変更するとどうなりますか?名前付き範囲でポジションを変更できるように、コードを調整するにはどうすればよいですか?名前付き範囲を変更する作業Excel VBA

答えて

2

I(個人的に)名前のついた範囲が嫌いです。特に、あるファイルから別のファイルにシート/範囲をコピーまたは貼り付けているときには、デッドリファレンスや名前付き範囲にコピーされたり、名前が変更されたり名前が変更されたりすることがあります。

これに対する私のソリューションは、次の2つのいずれかです。

(1)私は、特定の一部(あるいはモジュール)を捧げるVBAでのグローバル変数で私の範囲を宣言します。これは、各サブの冒頭にあるすべての変数のDimと非常によく似ています。

'********************************************************* 
'** Declaring all ranges and where to find which data 
'********************************************************* 

Dim rngNamedRangeName As Range 

Sub SetupAllGlobalVariables() 

Set rngNamedRangeName = ThisWorkbook.Worksheets(1).Range("A1:C10") 

End Sub 

'********************************************************* 
'** After that all your normal subs follow and whenever 
'** necessary you can call the above to get your ranges 
'********************************************************* 

Sub ExampleCodeToFormatYourRanges() 

Call SetupAllGlobalVariables 

With rngNamedRangeName 
    .Interior.ColorIndex = 36 
End With 

End Sub 

(2)しかし、私の好み第2の解決策は、私は再び/リンク(私にとって重要です)すべての範囲を参照する別のvery hiddenシートを持つことです。だから、基本的に、私はこの別のシートにすべての "重要な"データを再度持っています。これはあなたの名前付き範囲になります。しかし、誰もこのシートに触れることは許されていません(その理由は、そのは非常にです)。範囲のいずれかがシフトまたは変更された場合、この隠しシート上の範囲を他のシートと再度リンクするのは簡単です。しかし、隠しシートでは、すべてのデータが同じ場所にあり、VBA内のすべての範囲(隠しシートのみ)をハードコードすることができます。

VBA以外のプログラマでも、通常、第2の方法でこのようなことを修正することができます。最初の方法では、おそらく常にそれを修正するためにVBAのスキルを持つ人が必要になります。

注:上記は唯一の解決策でも、最適な解決策でもありません。しかし、私はこれが大企業であっても有用な解決策であると確信しています。

+0

お返事ありがとうございます。しかし、2番目のソリューションは、複数のユーザーの利便性やマクロとスプレッドシートの移植性を犠牲にする可能性があります。スプレッドシートを隠してしまえば、最終的にはメモリから外れてしまいます。 – Dombey

+0

ある時点で、VBAにデータを見つける場所を教えなければならず、構造化データベースサーバー(SQL)に置かない限り、どこかで参照をハードコーディングする必要があります。だから、あなたは3つのオプションが与えられています。あなたはそれらを評価して、あなたが望むだけ多くのものを試すことができます。私は(個人的に)長い間このようなことをしており、上記の結論に達しました。しかし、セットアップ/パラメータが異なると、結論が異なる可能性があります。だから、楽しく遊んでみて、比較してみてください。おそらく誰かが実用的な別のソリューションを追加することもできます。 – Ralph

関連する問題