1

プロジェクトでは、Excel シートから情報を読み取り、その情報を PLC に渡す必要があります。悲しいことに、「Dim App As New Excel.Application」を使用すると問題が発生します。何らかの理由で、フォームが画面に表示される前にアプリケーションがクラッシュし、フォームが表示されなくなります。私が得るエラーは次のとおりです。

OpHoopVanZegen.exe で「System.InvalidOperationException」タイプの未処理の例外が発生しました

これは「Application.Designer.vb」で発生します

Protected Overrides Sub OnCreateMainForm()

            Me.MainForm = Global.OpHoopVanZegen.Form1
        End Sub

^^^エラーが発生した場所^^^^

追加情報: COM オブジェクトを System.__ComObject 型から interfacetype に変換できません

何が起こっているのか、および/または私が間違っていることを説明できる人はいますか?

------------------------------------ 私のフォームコード:

 Imports Excel = Microsoft.Office.Interop.Excel
Public Class Form1
    Dim App As New Excel.Application
    Dim svrOPC As New OPCAutomation.OPCServer
    Dim WithEvents grpOPC As OPCAutomation.OPCGroup

Private Sub connectToOPC_Click(sender As Object, e As EventArgs) Handles connectToOPC.Click
    If svrOPC.ServerState = OPCAutomation.OPCServerState.OPCDisconnected Then
        Call svrOPC.Connect("Kepware.KEPServerEX.V5")
    End If
    Me.TBStatusOPC.Text = udfOPCServerState(svrOPC.ServerState)
End Sub
Private Sub Form1_Activated(sender As Object, e As EventArgs) Handles Me.Activated
    Me.TBStatusOPC.Text = udfOPCServerState(svrOPC.ServerState)
End Sub
Private Function udfOPCServerState(ByVal intOPCServerState As Integer) As String
    Select Case intOPCServerState
        Case OPCAutomation.OPCServerState.OPCRunning
            udfOPCServerState = "Running"
        Case OPCAutomation.OPCServerState.OPCFailed
            udfOPCServerState = "Failed"
        Case OPCAutomation.OPCServerState.OPCNoconfig
            udfOPCServerState = "No Config"
        Case OPCAutomation.OPCServerState.OPCSuspended
            udfOPCServerState = "Suspended"
        Case OPCAutomation.OPCServerState.OPCTest
            udfOPCServerState = "Test"
        Case OPCAutomation.OPCServerState.OPCDisconnected
            udfOPCServerState = "Disconnected"
        Case Else
            udfOPCServerState = "Unknown"
    End Select
End Function

Private Sub LoadOrderToPLC_Click(sender As Object, e As EventArgs) Handles LoadOrderToPLC.Click

End Sub

クラス終了

4

1 に答える 1

1

正当な理由は見つかりませんでしたが、最近のプロジェクトでも同じ問題がありました。私のために物事が機能するようになった回避策は次のとおりです。

Imports Microsoft.Office.Core
Dim app as Object
app = CreateObject("Excel.Application")

これにより、残りのコードは希望どおりに機能しましたが、IntelliSense がどの Excel 変数に対しても機能しないという欠点がありました。私は怠け者で、すべてを暗記するのではなくショートカットに大きく依存しているため、コメントアウトした構文ガイドを自分で作成し、参照用にコード内のスプレッドシートで作業している場所に貼り付けました。

これが役立つことを願っています。これを修正するより良い方法があるかどうか、私はまだ興味があります。

編集:私自身のコードからのスニペットの例(チートシートが含まれています):

Imports Microsoft.Office.Core

Dim xl As Object, wb As Object, sht As Object, rng As Object, wrksht As Object

    'EXCEL SYNTAX GUIDE:
    'Excel.
    '     .Application  :   Instance of the Excel program opened by VB code
    '     .Workbooks    :   All open workbooks. Often use .Add or .Open when setting Workbook variable
    '     .Workbook     :   An individual workbook (.xls file). Often use .ActiveSheet to set Worksheet variable
    '     .Sheets       :   All worksheets (tabs) of a particular workbook
    '     .Worksheet    :   An individual worksheet
    '     .Range        :   A range of worksheet cells, e.g. ("A1", "C4")

    xl = CreateObject("Excel.Application")
    xl.Visible = False
    xl.DisplayAlerts = False
    wb = xl.Workbooks.Open(Environ("USERPROFILE") & "\dropbox\Program Database.xlsx")
    For Each wrksht In wb.Worksheets
        If wrksht.Name = "MASTER MATRIX" Then
            sht = wrksht
            Exit For
        End If
    Next
    For rNum = 6 To 201
        rng = sht.Range("A" & rNum, "AT" & rNum)
        Dim inputs(12) As String
        inputs(0) = rng.Cells(1, 1).Value
        inputs(1) = rng.Cells(1, 4).Value
        inputs(2) = rng.Cells(1, 5).Value
'This should be enough to demonstrate all the necessary syntax.
'
'
'Release variables and close Excel as follows:
'(Disabling alerts and user control prevents Excel from asking the user to save)
rng = Nothing
sht = Nothing
wb = Nothing
xl.DisplayAlerts = False
xl.UserControl = False
xl.Quit()
xl = Nothing
于 2015-05-26T12:43:07.537 に答える