トップ回答者
excel2010,windows7

質問
-
EXCEL2010,WINDOWS7にてマクロを実行したところ終了時にメッセージを表示するようにしていますが、そのメッセージが表示されない。 しかしステップイン実行をすると終了メッセージは表示されます。 なぜ、実行方法により相違が発生するのでしょうか。対策方法があれば教えていただきたくお願いいたします。
これまでの経過
以前 VISTAでEXCEL2003でマクロを作成して使用していました。
機種の変更に伴い WINDOWS7,EXCEL10になり 従来のマクロをEXCEL10にてコンパイルして使用すると冒頭のようなことになっています。
よろしくお願いします。
回答
-
WorkSheet.Activate のあと シートオブジェクトを省略したRangeを使ってますが、これはトラブルを誘発します。
Excel2010以降で多く話題に上がりますが、むしろExcel2003で問題が起きなかったのが偶然だったと思われます。
またコードの見通しも悪くなりますので、オブジェクトは明示的に扱いましょう。例
Windows("勤怠状況表BT2007.xlsm").Activate Worksheets("Sheet1").Activate ' 遅刻・早退の列確認 If Range("D1").Value = "3" Then
Dim currentBook As Workbook Set currentBook = Applicathion.Workbooks("勤怠状況表BT2007.xlsm") With currentBook.Worksheets("Sheet1") ' 遅刻・早退の列確認 If .Range("D1").Value = "3" Then
Select
Selection.~
も同様です。またクリップボードを使ったコピペもトラブルの元です。
他のアプリケーションに消されたり、ほかのアプリケーションの動作を妨害する可能性があります。- 回答としてマーク ogin 2013年5月21日 14:31
すべての返信
-
ありがとうございます。 コードは下記のとおりです。
よろしくお願いいたします。
fst_rt: res = MsgBox("ファイル \\xxxxxxx\xx経理課\Hi-Per\" & strfname & " ?", vbYesNo) If res = vbYes Then Else: Exit Sub End If ' 画面表示の停止 Application.ScreenUpdating = False Workbooks.Open Filename:="\\xxxxxx\xx経理課\Hi-Per\" & strfname Windows("勤怠状況表BT2007.xlsm").Activate Worksheets("Sheet1").Activate ' 遅刻・早退の列確認 If Range("D1").Value = "3" Then strsou = "D" If Range("E1").Value = "4" Then strchi = "E" End If Else If Range("E1").Value = "3" Then strsou = "E" If Range("F1").Value = "4" Then strchi = "F" End If End If End If If Range("D1").Value = "4" Then strchi = "D" End If If Range("E1").Value = "4" Then strchi = "E" End If ' 初期値 intr = 2 intkr = 2 ' 職員番号 Range("A" & LTrim(Str(intr))).Select Do Until Range("A" & LTrim(Str(intr))) = Null Or Range("A" & LTrim(Str(intr))) = 0 Windows("勤怠状況表BT2007.xlsm").Activate Worksheets("Sheet1").Activate intsyokuin = Range("A" & LTrim(Str(intr))) strsyokuin = String(9 - Len(LTrim(Str(intsyokuin))), "0") & LTrim(Str(intsyokuin)) Windows(strfname).Activate chk_rt: ' Debug.Print " chk " & Str(intkr) & " " & Range("A" & LTrim(Str(intkr))) & " " _ ' & strsyokuin & " " & intr If Range("B" & LTrim(Str(intkr))) = strsyokuin Then ' 職員番号の取得 & 有給休暇日数の取得 Windows("勤怠状況表BT2007.xlsm").Activate Worksheets("Sheet1").Activate ' 有給休暇 Range("C" & LTrim(Str(intr))).Select If Range("C" & LTrim(Str(intr))).Value = Null Or Range("C" & LTrim(Str(intr))).Value = 0 Then Else Selection.Copy ' 勤怠_月給.xlsの職員番号の位置取得 & 有給休暇日数への 値の貼り付け Windows(strfname).Activate Range("F" & LTrim(Str(intkr))).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False End If ' 遅刻・早退 回数 Windows("勤怠状況表BT2007.xlsm").Activate Worksheets("Sheet1").Activate If strsou = "" And strchi = "" Then intchisou = 0 Else If strsou <> "" And strchi = "" Then intchisou = Range(strsou & LTrim(Str(intr))).Value Else If strsou = "" And strchi <> "" Then intchisou = Range(strchi & LTrim(Str(intr))).Value Else intchisou = Range(strsou & LTrim(Str(intr))).Value + Range(strchi & LTrim(Str(intr))).Value End If End If End If If strfname = "勤怠日給月給.xls" Then Windows(strfname).Activate Range("J" & LTrim(Str(intkr))).Select ActiveCell.FormulaR1C1 = intchisou Else Windows(strfname).Activate Range("I" & LTrim(Str(intkr))).Select ActiveCell.FormulaR1C1 = intchisou End If intkr = intkr + 1 ElseIf Range("B" & LTrim(Str(intkr))) < strsyokuin Then Windows(strfname).Activate Range("F" & LTrim(Str(intkr))).Select ActiveCell.FormulaR1C1 = 0 If strfname = "勤怠日給月給.xls" Then Windows(strfname).Activate Range("J" & LTrim(Str(intkr))).Select ActiveCell.FormulaR1C1 = 0 Else Windows(strfname).Activate Range("I" & LTrim(Str(intkr))).Select ActiveCell.FormulaR1C1 = 0 End If intkr = intkr + 1 ' 0.5秒 ' Application.Wait [now() + "0:00:00.5"] ' If strsyokuin > "000000322" Then ' MsgBox " syokuin " & Range("B" & LTrim(Str(intkr))) ' End If GoTo chk_rt Else: ' MsgBox " err " & Str(intkr) & " " & Range("A" & LTrim(Str(intkr))) & " " _ ' & strsyokuin & " " & intr & " " & Range("B" & LTrim(Str(intkr))) GoTo nxt_rt End If nxt_rt: Windows("勤怠状況表BT2007.xlsm").Activate Worksheets("Sheet1").Activate intr = intr + 1 ① 此処にMSGBOXを挿入すると正常にしょりされました。 Loop ② ①にMSGBOX がない場合下記のMSGBOXを通過することなく処理が終了してしまいました MsgBox "LOOP exit " Windows(strfname).Activate ③ ②と同様 以下のMXGBOXについても同様 MsgBox "file end " & strfname ' ActiveWorkbook.Save ' MsgBox " file save " ActiveWindow.Close savechanges:=True MsgBox "file close " If intf = 0 Then intf = 1 strfname = "勤怠日給月給.xls" GoTo fst_rt End If MsgBox " end " ' 画面表示の復活 Application.ScreenUpdating = True End Sub
-
WorkSheet.Activate のあと シートオブジェクトを省略したRangeを使ってますが、これはトラブルを誘発します。
Excel2010以降で多く話題に上がりますが、むしろExcel2003で問題が起きなかったのが偶然だったと思われます。
またコードの見通しも悪くなりますので、オブジェクトは明示的に扱いましょう。例
Windows("勤怠状況表BT2007.xlsm").Activate Worksheets("Sheet1").Activate ' 遅刻・早退の列確認 If Range("D1").Value = "3" Then
Dim currentBook As Workbook Set currentBook = Applicathion.Workbooks("勤怠状況表BT2007.xlsm") With currentBook.Worksheets("Sheet1") ' 遅刻・早退の列確認 If .Range("D1").Value = "3" Then
Select
Selection.~
も同様です。またクリップボードを使ったコピペもトラブルの元です。
他のアプリケーションに消されたり、ほかのアプリケーションの動作を妨害する可能性があります。- 回答としてマーク ogin 2013年5月21日 14:31