[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『exit subのとび先(ファイルを開かないときは作業を中断)』(せれん)
googleから式をコピペしているだけの初心者です。
以下のようなマクロを作っているのですが、
ファイルを選択しなかったときに☆にとんでほしいのですが、
すぐ下の行の
Workbooks.Open Filename:=Excelfile, Password:="×××"
を実行しようとしています。
どのようにすればよいのでしょうか。
Exit subがよくわかっていないのですが、elseの作業をとばしてくれるわけではないのでしょうか。
Sub ファイルを選択してコピペする
With Application
.ScreenUpdating = False .EnableEvents = False .Calculation = xlCalculationManual .CutCopyMode = False .DisplayAlerts = False End With
'ファイルを選択して開く
Dim Excelfile
Excelfile = Application.GetOpenFilename(Title:="選択して下さい。") '選択ボックスを立ち上げ、選んだファイルの名前を取得する
If TypeName(Excelfile) = "boolean" Then 'ファイルが選択されなければ
Exit Sub '処理を終了する
Else
Workbooks.Open Filename:=Excelfile, Password:="×××"
'選択ボックスで選んだ名前のファイルを開く
Set Excelfile = ActiveWorkbook End If
☆With Application
.ScreenUpdating = True .EnableEvents = True .Calculation = xlCalculationAutomatic .CutCopyMode = True .DisplayAlerts = True End With
End Sub
< 使用 Excel:Excel2019、使用 OS:Windows10 >
こちらは解決されました?
ご質問の内容ですが、Exit Subはプロシージャそのものを抜けます。 Ifを抜ける方法は、何もしなければ、最後まで実行されます。
With Application〜〜の内容については、処理の前後に挟むのが一般的かと思います。
Sub ファイルを選択してコピペする() Dim Excelfile As String Dim Excelfile As Workbook
'ファイルを選択して開く '選択ボックスを立ち上げ、選んだファイルの名前を取得する Excelfile = Application.GetOpenFilename(Title:="選択して下さい。")
If Not Excelfile = "False" Then 'ファイルが選択されていれば With Application .ScreenUpdating = False .EnableEvents = False .Calculation = xlCalculationManual .CutCopyMode = False .DisplayAlerts = False End With 'ファイルを開いて、変数にセットする Set Excelfile = Workbooks.Open(Filename:=Excelfile) ', Password:="×××"
'いろんな処理をして
'締め処理 With Application .ScreenUpdating = True .EnableEvents = True .Calculation = xlCalculationAutomatic .CutCopyMode = True .DisplayAlerts = True End With End If End Sub
(稲葉) 2021/01/18(月) 16:54
?AExit Subはプロシージャそのものを抜けます。
とは、どこにとぶということでしょうか。
?BIfを抜ける方法は、何もしなければ、最後まで実行されます。
ifに当てはまるときでもelseの作業を実行するのでしょうか。
ファイルを開かないときにはthenにとび、elseはしない。
ファイルを開くときにはelseにとぶのイメージを持っています。
(せれん) 2021/01/18(月) 17:07
× If TypeName(Excelfile) = "boolean" Then ○ If TypeName(Excelfile) = "Boolean" Then
= なので、大文字小文字も正確でなくてはいけません。 条件が成立してません。 (とおりすがり) 2021/01/18(月) 17:09
>のように定義は2つできるのでしょうか。 定義は私の知る限りいくらでもできます。 逆に、定義をしないほうが、トラブルの温床になりますので、これから勉強される場合は まず変数宣言の強制設定をお勧めします。 https://www.vba-ie.net/foundation/structure.php
>Exit Subはプロシージャそのものを抜けます。 >とは、どこにとぶということでしょうか。 飛ぶという表現が正確かわかりませんが、「End Subに飛ぶ」とお考えいただければ理解できると思われます。 Sub 〜 End SubをSubプロシージャといい、一つの区切りです。 https://www.vba-ie.net/foundation/structure.php
>ifに当てはまるときでもelseの作業を実行するのでしょうか。 実行しません。
>ファイルを開くときにはelseにとぶのイメージを持っています。 IfはTrueの場合、Thenの後を実行し、Falseの場合、ElseがあればElseを実行します。 ですので、私が提示したコードの場合、Elseを使用してなくとも、ブックを開いていると思います。
以下のテストを準備しました。 a = 1 の数値を変更して、F8を押してステップ実行してみてください。 https://www.239-programing.com/excel-vba/basic/basic023.html
Sub test() Dim a As Long a = 1 If a = 1 Then MsgBox "aは1です"
ElseIf a = 2 Then MsgBox "aは2です"
Else MsgBox "aは1でも2でもありません"
End If MsgBox "処理が完了しました" End Sub
(稲葉) 2021/01/18(月) 17:33
通りすがり様、誤りのご指摘ありがとうございます。
大文字記載でなかったのでifが働いていなかったのですね。
なのでファイルを開かない場合でもelseの後の作業を実行しようとしてしまっていたのですね、
理解できました。
お二方ともありがとうございました。
(せれん) 2021/01/18(月) 17:47
横から失礼します。
>通りすがり様、誤りのご指摘ありがとうございます。
回答付けてくれたのは「とおりすがり」さんですね。 (OK) 2021/01/18(月) 18:10
[[20210115133238]] 『罫線を反映させずに値貼り付け』(せれん) >>BOT
| こちらは解決されました?
回答を無視する理由はなんですか?
質問したのをすっかり忘れているとかですか?
なんらかの返事くらいするのが最低限の礼儀と思う。
(γ) 2021/01/18(月) 21:18
γさん せれんさん ごめんなさい 私の確認漏れでした。
>Excelfile = Application.GetOpenFilename(Title:="選択して下さい。") と >If TypeName(Excelfile) = "boolean" Then 'ファイルが選択されなければ みて、別の文字列だと思い込みコピペしただけで、チェックしておりませんでした。
申し訳ないです。
(稲葉) 2021/01/19(火) 08:37
>ファイルを選択しなかったときに☆にとんでほしいのですが、
Goto文で飛んでもいいですが、
美しくないので、飛ばなくてもいいように、手順を再考してみてください。
Sub ファイルを選択してコピペする()
Dim strFullPath As String Dim wbk As Workbook
'ファイルを選択しフルパス(文字列)を取得 strFullPath = Application.GetOpenFilename(Title:="選択して下さい。") 'Falseならプログラムを抜ける If strFullPath = "False" Then Exit Sub
'準備 With Application .ScreenUpdating = False .EnableEvents = False End With
'ファイルを開く Set wbk = Workbooks.Open(Filename:=strFullPath, _ UpdateLinks:=False, _ ReadOnly:=True, _ Password:="×××") 'セルのコピー wbk.Sheets(1).UsedRange.Copy ThisWorkbook.Sheets(1).Range("A1") 'ファイルを閉じる wbk.Close False
'後片付け Application.EnableEvents = True End Sub
GetOpenFilenameは、
ファイルのフルパスを返すだけで、ファイルを開いているわけではありません。
なので、それより前に何もしてなければ、そのままプログラムを抜ける(終了する)と良いです。
.ScreenUpdating のプロパティはプログラムが終了すると勝手にTrueになるので、
最後の処理としては書かなくても問題ありません。
.CutCopyModeのプロパティもプログラム終了後、セルの枠が点滅しているのが
気にならないなら書く必要がありません。
今回の場合は、コピー元のブックは閉じるのですから書かなくても問題ないかと思われます。
(使い方もおかしいし)
.Calculation = xlCalculationManualも再計算が行われないなら意味がないかと思います。
万全を期すなら書いておいても問題ないです。
余分なことは書いてない方が個人的に好きではない(あとで読みにくくなる)ですが、
分からないなら、書いておいてもいいかもしれません。
(まっつわん) 2021/01/19(火) 12:04
Sub さんぷる() Dim Excelfile As Variant
'▼ファイルが選択されたときはファイルのフルパス(String型)、選択されなかったときはFalse(Boolean型)になる Excelfile = Application.GetOpenFilename(Title:="選択して下さい。")
'▼False(Boolean型)ならファイル選択されなかったということなので終了させる If Excelfile = False Then MsgBox "ファイルが選択されませんでした" Exit Sub End If
Application.ScreenUpdating = False Application.EnableEvents = False Application.Calculation = xlCalculationManual
'▼セットした段階でWorkbook型(オブジェクト型)になる Set Excelfile = Workbooks.Open(Filename:=Excelfile, Password:="×××") With Excelfile MsgBox .Name & " に対してやりたいことを書く" End With Application.ScreenUpdating = True Application.EnableEvents = True Application.Calculation = xlCalculationAutomatic End Sub
(もこな2) 2021/01/19(火) 14:53
(もこな2) 2021/01/20(水) 01:54
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.