これを調査するのにかなりの時間を費やしましたが、多数のフォーラムのいずれでも同様の問題を見つけることができませんでしたが、誰かが私に指摘できる場合は、そうしてください (最後の手段として q を尋ねます!)
継承した次のコードがあり、金曜日の更新まで正常に動作しています!
少し不可解な要因は、コードが私の PC でデバッグと実行時に完全に実行され、金曜日まではクライアントで完全に機能していたのに、今ではクライアントのマシンではまったく実行されないことです!
私は W7 64 ビットで VS 2010 を実行しており、クライアント マシンはすべて XP 32 ビットです。もう一度強調してすみませんが、4 月にプロジェクトを開始して以来、コードの最初のセクションは変更されておらず、その後多数の更新が発行されています。その後、すべて正常に機能しています (先週の初めの 1 つを含む)。
Delegate Sub ACCSheetBG()
Dim ACC As New ACCSheetBG(AddressOf Me.ACCSheet)
Dim ACCDone As IAsyncResult
Private Sub AM_CreateSpreadsheet_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AM_CreateSpreadsheet.Click
Dim Test1 As Boolean = True
Try
Test1 = ACCDone.IsCompleted
Catch ex As Exception
'If Here Assume It Is Just Failed because not used before and that it is ok to start.
GoTo Skip1
End Try
If ACCDone.IsCompleted = True Then
Skip1:
If MsgBox("This process may take several minutes." & Chr(13) & "You can perform other operations whilst this is processing.", MsgBoxStyle.Information + MsgBoxStyle.OkCancel, "Accounts Generation") = MsgBoxResult.Ok Then
'Start Accounts Sheet
ACCDone = ACC.BeginInvoke(Nothing, Nothing)
End If
Else
MsgBox("Operation already in progress", MsgBoxStyle.Information, "Already Running")
End If
End Sub
上記のコードのセクションはまったく変更されていません! (書き方は個人の感想ですが!)
呼び出している Sub が変更されましたが、他のステートメントの前に msgbox を挿入しましたが、これは表示されません:
下部の新しい情報を参照してください
Public Sub ACCSheet()
MsgBox("StartACC")
'Some code
End Sub
ボタンAM_CreateSpreadsheet
をクリックすると、プロセスに時間がかかることを警告するメッセージボックスが表示されます。最初の行のメッセージボックスはACCSheet
決して実行されません。
内部にいくつかの変更がありSub ACCSheet()
ましたが、このコードを実行するようには見えないため、これが原因である可能性は低いです。
新しい情報
Hans Passant の回答 (残念ながら彼は削除したか、回答としてマークします) からヒントを得たので、追加されたすべてのコードをコメントアウトし、問題が消えたことを確認しました。問題のセクションは私がいた場所であることが判明しました。作成したスプレッドシートに VBA を追加します (はい、ターゲット マシンで [VBA プロジェクト オブジェクト モデルへのアクセスを信頼する] をオンにしました)。
まだ私を困惑させているのは、コードのこのセクションがtry、catchにあり、上記のmsgboxがtry、catchの前にあり、msgboxが表示されなかっただけでなく、ステートメントのcatch部分のmsgboxが表示されなかったことです。(また、アプリケーションは一部の XP 32 ビット マシンでは完全に実行されましたが、他のマシンでは実行されませんでした)
問題の原因となったコードは次のとおりです。
Dim oModule As Vbe.Interop.VBComponent
Dim SCode As String
' Create a new VBA code module.
oModule = ExAccBk.VBProject.VBComponents.Add(VBIDE.vbext_ComponentType.vbext_ct_StdModule)
SCode = "Function SUMCOLOR(ColorCell As Range, SumRange As Range) As Variant" & vbCrLf & _
"Dim Cell As Range" & vbCrLf & _
"For Each Cell In SumRange" & vbCrLf & _
"If Cell.Interior.Color = ColorCell.Interior.Color Then" & vbCrLf & _
"SUMCOLOR = Cell + SUMCOLOR" & vbCrLf & _
"End If" & vbCrLf & _
"Next" & vbCrLf & _
"SUMCOLOR = SUMCOLOR" & vbCrLf & _
"End Function"
' Add the VBA macro to the new code module.
oModule.CodeModule.AddFromString(SCode)
これが問題を引き起こした理由と、再インクルードする方法、そして最も重要なことに、実行されていないように見える理由を知りたいです!
ハンスは、私が試してみようとしている BackgroundWorker を提案しましたが、誰かが提供できる説明を持っている場合は、説明をいただければ幸いです。
最新情報
@jcwrequests は、問題を引き起こしているのは Excel のバージョンです (2010 では動作しますが、2007 では動作しません)。
VBA モジュールを Excel 2007 に追加する方法について少し調べてみます。
最終更新(できれば)
ここに難問があります。最終的に、XPでOffice 2007を実行しているVSを搭載した古いラップトップを復活させ、デバッグでプログラムを試しましたが、同じマシンでデバッグではコードを実行しますが、ランタイムでは実行しません!!! 上記のように、コードは実行されないように見えます。
私はこれについて回避策を実行しますが、スレッドを監視し続けるので、誰かが解決策を思いついたら喜んで聞いてください!