Excel総合相談所 104at BSOFT
Excel総合相談所 104 - 暇つぶし2ch187:名無しさん@そうだ選挙にいこう
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
モノを知らなすぎ


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch