2016-05-13 8 views
1

非常に長くて厄介なコードがありますが、しばしばクラッシュし、No Responseメッセージが表示されます。これを回避する方法の1つは、32,767を超えないことがわかっている場合、Long IntegersではなくIntegersとして変数を宣言することです。ワークシートのサイズに基づいて変数が宣言される方法を変更しますか?

後で問題が発生しないようにするために、ワークシートのサイズに応じて変数を整数または長整数型にするスクリプトの先頭に1行のコードを挿入します。私が今までに持っているものは次のとおりです:

If Library.Range("A1").SpecialCells(xlCellTypeLastCell).row > 30000 Then 
Dim i As Long 
Dim LastRow As Long 
ElseIf Library.Range("A1").SpecialCells(xlCellTypeLastCell).row <= 30000 Then 
Dim i As Integer 
Dim LastRow As Integer 

しかしこれは、宣言文が重複しているために私にエラーを与えています。これに別のアプローチがありますか?または私は何か間違っているのですか?代わりに、バリアントを使用しないのはなぜ

+3

紹介します!いくつかの変数のビットを少なくしてメモリを使用していると、反応が無くなってしまって、根本的に何かが間違っています! –

+2

また、[VBAはすべての整数を長整数に変換します](https://msdn.microsoft.com/en-us/library/aa164754.aspx) - これで実際にはパフォーマンス上のメリットはありません。何かあれば、値がキャストされていないので、 'Long'を使うことはより効率的です。 –

+0

ああ、良い点。一連のIF THEN文に基づいて多くの情報をコピーアンドペーストして再配置します。それは小さなデータセットではうまく動作しますが、大きなデータセットでは時折停止します(ただし、しばしば動作します)。 – user1996971

答えて

0

これはあなたのコードが何をしているか

Dim a As Variant 

a = 100 
Debug.Print TypeName(a) 

a = 10000000 
Debug.Print TypeName(a) 
+0

これはどのように材料効果があるのか​​ちょっと混乱しますOPに。しかし、できるだけ少ないメモリを使用したい場合は、Variantとして宣言したくないでしょう。 – CallumDA

+0

私は彼の記憶の問題の解決策として使用していませんでしたが、私は彼のために、そしてコードを表示/フォーマットするのに最適な場所であることを示していました。私は個人的にその方法を使用しません、混乱が生じた場合はお詫び申し上げます。 –

関連する問題