こんばんは。
プロシージャレベルで宣言したWorksheetやRangeなどのオブジェクト変数に対し、
プロシージャを終了する直前に、
Set ○=Nothing
を実行して、変数(オブジェクトへの参照)を開放する処理を習慣的行っていました。
これは、絶対に必要な処理なのでしょうか?
開放しないことで不具合が出るケースとはどういう場合なのでしょうか?
どなたか、ご教示いただけないでしょうか。
よろしくお願いいたします。
<例>
Sub test()
Dim Ws1 As Worksheet
Set Ws1 = Worksheets("Sheet1")
'処理内容
Set Ws1 = Nothing
End Sub
尚、CreateObject関数で作成したオブジェクトへの参照などではなく、
あくまでもWorksheetやRangeなどの話です。
こんばんは。
何故このような現象が発生するか判らず、
質問致します。
環境は
・WindowsXP Professional
・Excel2003
・ExcelVBA
・参照設定:Microsoft DAO 3.6 Object Library
です。
下記は抜粋した内容ですが、
レコードセットを配列で宣言し、
関数に配列として受け渡しています。
プログラムを作成途中、テストとして実行した所、
「Call test(dbWS, dbWB, dbRes)」
のdbResの所が黄色になり
「ByRef 引数の型が一致しません」
と表示されました。
初めて発生するまでは問題なく動いており、
そこに関するソースの変更をしたわけではないのに発生しました。
また、ソースを変更せず、Excelのシートの追加や削除を行った後、コンパイルを行うと発生したりもします。
その他、そのコンパイルエラーが発生した後に、ファイルを保存し、再度開くと、
再び同じエラーが出る場合と、出ない場合があり、再現性が難しい状態にあります。
色々試したところ、レコードセットを配列で関数に渡さなければ問題がなさそうで、
現在はdbWS、dbWB、dbRes(2)をグローバル変数で宣言し、
関数の引数としては受け渡さず、直接グローバル変数で値を受け渡す回避方法を取っております。
何かこの現象についてご存知の方がいれば教えて頂きたいと思います。
不足している情報がありましたら指摘下さい。
---------------------------------
Sub main()
Dim dbWS As Workspace
Dim dbWB As Database
Dim dbRes(2) As Recordset
'処理
Call test(dbWS, dbWB, dbRes)
End Sub
---------------------------------
Private Function test(ByRef dbWS As Workspace, ByRef dbWB As Database, ByRef dbRes() As Recordset)
'処理
End Function
---------------------------------
こちらで、ご教授してもらったものを使わせて頂いているのですが、
どうしてもうまくいかないことが出て、行き詰まってしまい、、、
皆さん、度々すいませんが手助けできましたらお願いします。
エクセルのセルの結果表示のところで、
在庫追加となったら音がなるようにしたいのですが、
手打ち(コピペなど)で結果表示の所に
(例えばA3に)ブドウ追加と入れると指定した音が鳴ります。
ですが、結果表示の所は関数にしてて
計算結果によって(ブドウ追加って答えが出たら)
音が鳴るようにしたいのですが、音が鳴らなくて困っています。
A1の所が、ブドウ注文数4個になると、A3は"在庫あり"から"ブドウ追加"となるので
音が鳴るはずなんですが、鳴らないんです、、、
また、複数同時に結果表示が変わっても(ブドウ追加とバナナ追加が同時に起こっても)音が鳴るようにしたいのですが、少しイジるも、うまくいかず、やれるのかどうかもわかっていません。
Excel2003のBOOK1の中で
セル
A1 ブドウ注文数2個
A2 ブドウ在庫数3個
A3 =IF(A1>A2,"ブドウ追加","在庫あり")(←結果表示)
A5 バナナ注文数2個
A6 バナナ在庫数3個
A7 =IF(A5>A6,"バナナ追加","在庫あり")(←結果表示)
A9 トマト注文数2個
A10 トマト在庫数3個
A11 =IF(A9>A10,"トマト追加","在庫あり")(←結果表示)
A13 ミカンなど続いていきます・・・。
A14 ・・・・・・・
A15 ・・・・・・・
----------↓現在、教えてもらったものを少しイジった状態です↓---------
1.標準モジュールに
Public Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
2.シートモジュールのchangeイベントに
Private Sub Worksheet_Change(ByVal Target As Range)
With Target
'一度に複数のセルの値が変化した時はExit
If .Count > 0 Then Exit Sub
'変化したセルがA3,A7,A11の範囲に無ければExit
If Intersect(.Cells, Range("A3,A7,A11")) Is Nothing Then Exit Sub
Select Case True
Case .Value Like "*ブドウ追加*"
Shell "mplay32.exe /play /close c:\サウンド\ブドウ.wav"
Case .Value Like "*バナナ追加*"
Shell "mplay32.exe /play /close c:\サウンド\バナナ.wav"
Case .Value Like "*トマト追加*"
Shell "mplay32.exe /play /close c:\サウンド\トマト.wav"
End Select
End With
End Sub
宜しくお願いします。
第1回~第30回までの回の日付・担当者・詳細・もろもろ…のデータがあり、今、構造体の配列変数にデータを入れています。
'宣言
Option Base 1
Dim Kai(30) as sData
type sData
hiduke as date
tanto as string
shosai as string
・
・
・
end type
'中身
for i = 1 to 30
kai(i).hiduke=rs.field("第" & i & "回目日付")
kai(i).tanto=rs.field("第" & i & "回目担当者")
kai(i).shosai=rs.field("第" & i & "回目詳細")
・
・
・
next
これは出来たのですが、実は日付がばらばらなのです。
第1回目が古い日付で第30回目が最新の日付 ではなく
ランダムなのです。
これを、配列変数に入れた後に
hiduke の所を見て、kai(1)が一番古い日付のデータ、kai(30)が一番新しいデータと効率よく入れ替えるのはどうしたら良いか悩んでいます。
ちなみに第30回まで全部埋まっている訳でもなく、空欄の時もあります。
分かる方いらっしゃいましたら宜しくお願い致します。
質問失礼します。
エクセル2003でラベル(コントロールツール)を作成し、
ラベルの表示/非表示を別に作成したボタンを押すたびに
切り替えるマクロを作成しています。
一応、自分で作成したものは動作するのですが、余りにも処理が遅いです。
(ボタンを押下後、処理が完了するまでに8秒前後かかります。)
『この場合はこうした方がいい』や『こうすれば早くなる』、または『それが限界』などの
ご意見があれば、ご返答お願い致します。
※ラベルは1グループ18個のa・b・cの3グループで合計54個あります。
※ラベルのオブジェクト名はa1・a2・a3・・・という規則性でつけています。
<作成例>
Private Sub button1_Click()
Dim test As Boolean
If a1.Visible Then
test = False
Else
test = True
End If
With ActiveSheet
For i = 1 To 18 Step 1
.OLEObjects("a" & i).Visible = test
.OLEObjects("b" & i).Visible = test
.OLEObjects("c" & i).Visible = test
Next i
End With
End Sub