none
excel2010,windows7 RRS feed

  • 質問

  • EXCEL2010,WINDOWS7にてマクロを実行したところ終了時にメッセージを表示するようにしていますが、そのメッセージが表示されない。 しかしステップイン実行をすると終了メッセージは表示されます。 なぜ、実行方法により相違が発生するのでしょうか。対策方法があれば教えていただきたくお願いいたします。 

    これまでの経過

       以前 VISTAでEXCEL2003でマクロを作成して使用していました。

           機種の変更に伴い WINDOWS7,EXCEL10になり 従来のマクロをEXCEL10にてコンパイルして使用すると冒頭のようなことになっています。

    よろしくお願いします。

    2013年5月19日 1:33

回答

  • 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
    2013年5月21日 9:53
  • ありがとうございます。

    さっそくご指摘いただきました点につき、訂正し確認してみます。

    従来のままで処理できていましたので問題ないものと思っていました。

    省略しないコーディングに使い方を変更したいとおもいます。

    かさねがさねありがとうございます。 今後ともよろしくお願いいたします。

    • 回答としてマーク ogin 2013年5月21日 14:38
    2013年5月21日 14:37

すべての返信

  • 「メッセージを表示」の方法や、再現できるコードがあれば回答がつくかも知れませんね。

    2013年5月19日 5:10
  • ありがとうございます。 コードは下記のとおりです。

    よろしくお願いいたします。

    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
    

    2013年5月20日 5:47
  • 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
    2013年5月21日 9:53
  • ありがとうございます。

    さっそくご指摘いただきました点につき、訂正し確認してみます。

    従来のままで処理できていましたので問題ないものと思っていました。

    省略しないコーディングに使い方を変更したいとおもいます。

    かさねがさねありがとうございます。 今後ともよろしくお願いいたします。

    • 回答としてマーク ogin 2013年5月21日 14:38
    2013年5月21日 14:37