12/08/02 21:50:03.65
>>184
どんなときにOn Error Resume Nextが必要になるか考えてみては
188:名無しさん@そうだ選挙にいこう
12/08/02 22:12:58.24
Sub 全部閉じる()
Dim WB$(3), i&
WB(0) = "八木かなえ.xls"
WB(1) = "田中理恵.xls"
WB(2) = "木村文子.xls"
WB(3) = "福原愛.xls"
WB(4) = "市川美余.xls"
On Error Resume Next
For i = 0 To 4
If ThisWorkbook.name <> WB(i) Then
Workbooks(WB(i)).Close
End If
Next
On Error GoTo 0
End Sub
>>157のOnErrorの位置は単純に書き間違いでしょうね
んで、>>175は間違いじゃないけど不適切だと思う。
(For Nextのなかで毎回指定するようなものではない)
個人的には、なるべく関係ないところに影響しないように
On Error Resume Nextの適用範囲は小さくとっておいたほうが
よいと考えている
189:188
12/08/02 22:18:28.40
>>188
自分でファイルの数減らしてテストしたときの変更を戻し忘れてた
Dim WB$(3)はDim WB$(4)の間違いです
あと、マクロを実行するブック自身が
その5つのファイルに含まれてるかどうかは
質問からは判断できないから
If ThisWorkbook.name <> WB(i) Then
の部分は消すわけには行かないと思う
190:前スレで、全部開くマクロを質問した者
12/08/02 22:24:00.08
>>187
んー、エラーが出ても次に飛ばすってことでしょ?
>>188
あぁ、そうですね。
納得です。
>>189
マクロを書いたファイル名は、wb(0)~wb(4)の中にありません。
だから、If ThisWorkbook.name <> WB(i) Then が何で必要なのか
疑問なんです。
191:名無しさん@そうだ選挙にいこう
12/08/02 22:28:52.71
>>190
自分で書いてないかい?
>>154
>マクロ実行前にどれかを閉じてしまうとエラーになります。
その場合マクロブックがActiveにならないかな
192:165
12/08/02 22:32:20.40
>>166
B1=IF(COUNTIF($A$1:A1,A1)=1,A1,"")
C1=RANK(A1,$B$1:$B$5)
D1=VLOOKUP(A1,$B$1:$C$5,2,FALSE)
のC列だけでランク付けできました
ユーザ関数は作りたくなかったのでシンプルな答えで感動しました
193:名無しさん@そうだ選挙にいこう
12/08/02 22:40:20.60
>>190
だったら、If ThisWorkbook.name <> WB(i) Thenはいらないよ。
194:188
12/08/02 22:45:12.10
>>190
>マクロを書いたファイル名は、wb(0)~wb(4)の中にありません。
じゃあ、If~End Ifは要らない
Workbooks(WB(i)).Close
だけでOK
そもそも、オープンしてないブックは
ActivateもCloseもできないからエラーが出るわけで、
Activateで生じるエラーを無視していくと、
最終的には自分自身(マクロブック自身)がActiveworkbookの状態になる。
そのときにActiveWorkbook.Closeが実行されると自分自身を閉じてしまう。
ActivateしてからActiveWorkbookを閉じるやり方じゃなくて、
CloseしたいだけならActivateしないで直接Closeすればよいだけの話。
195:前スレで、全部開くマクロを質問した者
12/08/02 23:17:09.10
>>191
ご指摘どおりです。
マクロブックにマクロボタンを置いてるので、必然的にActiveになりますね。
(そういう意味じゃないのかな?)
>>193-194
なるほど。
丁寧に説明してくれて、ありがとうございます。
196:名無しさん@そうだ選挙にいこう
12/08/03 05:58:46.89
>>195
とりあえず勉強始めたばかりだとしてもVBA使うならステップインで動作確認するぐらいは覚えてからコード組めよ。
ステップインでうごかしたらどこで何が閉じられて何がアクティブになっているかぐらいすぐわかるんだが。
197:188
12/08/03 08:54:35.05
自分以外全部閉じるって処理ならFor next で閉じるブックを指定するより
For eachの方がスッキリ書ける
Sub 自分以外全部閉じる()
Dim WB as Workbook
For Each WB In Workbooks '<=Workbooks(sがつくのに注意)
If WB.Name <> ThisWorkbook.Name Then
WB.Close
End If
Next WB
End Sub
198:名無しさん@そうだ選挙にいこう
12/08/03 09:34:42.64
スッキリ書けても問題抱えてたら意味無いけどな
ついでに、オブジェクトの比較は基本的にIs使おうね
× If WB.Name <> ThisWorkbook.Name Then
○ If Not (WB Is ThisWorkbook) Then
Excelはパスが違っても名前が同じブックは開けないから、Nameでの比較自体は
実害無いけど、他のオブジェクトではNameの値は同じだが実体は別なんてこともあるから
そういうものでバグ出さないためにも不適切な手法は早めに改めた方がいいよ
199:188
12/08/03 09:48:02.18
>>198
>Excelは~実害無いけど、
すんません、まさにその部分が理由でnameでの比較にしてました。
たぶん、オブジェクトの比較よりもオブジェクト名の比較の方が
初心者には理解し易かろうとも思いますた。
200:名無しさん@そうだ選挙にいこう
12/08/03 09:48:46.52
188
199
ときたら?
200
211
201:名無しさん@そうだ選挙にいこう
12/08/03 19:26:07.76
If Not (WB Is ThisWorkbook) Thenなんて初めて見たYO!
202:名無しさん@そうだ選挙にいこう
12/08/03 19:52:22.68
オブジェクト同士を比べることなんてそうないからねぇ
is nothingはたまに使うけど
203:名無しさん@そうだ選挙にいこう
12/08/03 19:59:45.12
>>149
OpenOfficeなんかバグがおおくてやだ。
204:名無しさん@そうだ選挙にいこう
12/08/03 20:01:36.63
OpenOffice前に使ってたけど重すぎて俺のPCじゃダメだった
205:前スレで、全部開くマクロを質問した者
12/08/03 20:09:12.82
>>197
自分以外全部閉じるって処理じゃないんだけど・・・
まぁ、俺あてに安価が付いてないからどーでもいいけどね
206:名無しさん@そうだ選挙にいこう
12/08/03 21:15:55.30
他のオブジェクトではNameの値は同じだが実体は別…なんてことはないな
207:名無しさん@そうだ選挙にいこう
12/08/04 08:01:39.48
モノを知らなすぎ