marcoborn
Goto Top

Frage zu CommandBarsControls

Hallo Forum,
ich habe folgendes Problem:

Ich habe ein VBA-Makro, dass ich nach VB.NET portiere. Dort wird unter anderem für Office 2003 eine Symbolleiste erstellt:
...
  If Application.Version < "14.0" Then  
    Set objCBar = Application.CommandBars.Add(Name:=mc_CBAR_NAME, Temporary:=True)
    With objCBar
      .Visible = True
      .Position = msoBarTop
      .Protection = msoBarNoCustomize
    End With
    For i = 1 To 6
      objCBar.Controls.Add Type:=msoControlButton
      objCBar.Controls(i).Style = msoButtonIcon
      objCBar.Controls(i).Tag = gc_CBARBTN_TAG & CStr(i)
      objCBar.Controls(i).Parameter = mc_CBAR_NAME
    Next
    Call knopf_zuweisen(objCBar, 1, 6262, "Makro3", "Generierung starten")  
...

In der Zeile mit objCBar.Controls(i).Style = msoButtonIcon erhalte ich jedoch immer eine Fehlermeldung, dass die Style-Eigenschaft nicht gesetzt werden kann. Wie muss ich den Code umschreiben?


Vielen Dank,
M. Born

Content-ID: 244658

Url: https://administrator.de/contentid/244658

Ausgedruckt am: 12.11.2024 um 19:11 Uhr

colinardo
Lösung colinardo 25.07.2014 aktualisiert um 11:40:04 Uhr
Goto Top
Hallo Marco,
da stimmt so einiges nicht, was so in VB.NET nicht funktioniert:
....
Dim objCBar As Office.CommandBar = Application.CommandBars.Add(mc_CBAR_NAME, 1 ,False , True)
With objCBar
   .Visible = True
   .Position = Office.MsoBarPosition.msoBarTop
   .Protection = Microsoft.Office.Core.MsoBarProtection.msoBarNoCustomize
End With
For i = 1 To 6
      Dim button As Office.CommandBarButton = objCBar.Controls.Add(Office.MsoControlType.msoControlButton)
      With button      
         .Style = Microsoft.Office.Core.MsoButtonStyle.msoButtonIcon
         .Tag = gc_CBARBTN_TAG & CStr(i)
         .Parameter = mc_CBAR_NAME
      End with
Next
...
Grüße Uwe
MarcoBorn
MarcoBorn 25.07.2014 um 11:28:06 Uhr
Goto Top
Hallo Uwe,
vielen Dank für Deine erneute Hilfe.

Ich habe Deinen Code verwendet, aber das Makro stoppt direkt nach Aufruf von
Dim objCBar As Office.CommandBar = Application.CommandBars.Add(mc_CBAR_NAME, , , True) 
.

Ich habe direkt danach eine MsgBox eingefügt, die aber schon nicht mehr aufgerufen wird. Setze ich vor den ganzen Block eine Fehlerbehandlung
 On Error GoTo Err_CreateCommandBar 
, dann wird mir ein Fehler angezeigt. Lasse ich diese Zeile weg, kommt keine Exception-Meldung o.ä.

So langsam bin ich hier ziemlich ratlos...

Viele Grüße,
Marco
colinardo
colinardo 25.07.2014 aktualisiert um 11:42:21 Uhr
Goto Top
Es kommt hier natürlich sehr darauf an wie du dein Plugin in Visual Studio realisierst welche DLLs du wie eingebunden hast etc. welche Namespaces du importiert hast und und und, das ist leider nicht überall gleich.

Hatte die Parameter der Zeile nachträglich noch etwas abgeändert:
Dim objCBar As Office.CommandBar = Application.CommandBars.Add(mc_CBAR_NAME, 1, False, True) 

Zur Info On Error Goto macht man in VB.Net auch nicht mehr. Hierfür gibt es das Try ..Catch Konstrukt. Und außerdem gibt es noch diverse weitere Unterschiede die zu beachten sind. Ist also ziemlich aussichtslos an einem kleinen Stück deines Codes hier eine Stichhaltige Aussage treffen zu können.

Grüße Uwe
MarcoBorn
MarcoBorn 25.07.2014 um 11:59:34 Uhr
Goto Top
Hallo Uwe,
ich realisiere das ganze in SharpDevelop, nicht in VisualStudio. Ich möchte den Code in einer XLL verwenden. Es sieht danach aus, dass der Bug von NetOffice kommt, da ich folgende Nachricht erhalte, wenn ich statt der On Error Goto ein Try-Catch verwende (On Error war aus dem alten VBA-Code noch drin):

Unable to cast COM object of type 'System.__ComObject' to class type 'NetOffice.OfficeApi.CommandBar'. Instances of types that represent COM components cannot be cast to types that do not represent COM components; however they can be cast to interfaces as long as the underlying COM component supports QueryInterface calls for the IID of the interface.  
   at FKGenDNA.StartUp.mbo_create_ribbon()

Ich werde mal den Entwickler von NetOffice ansprechen, ob dort ein Bug vorliegt.

Vielen Dank nochmal,
Marco
colinardo
colinardo 25.07.2014 aktualisiert um 12:10:27 Uhr
Goto Top
kein Bug sondern du darfst hier halt nur die Konstanten und Objekte des NetOffice.OfficeApi verwenden und nicht mit denen des COM-Objektes (welche ich oben verwendet habe) vermischen. D.h. die oben verwendeten Konstanten etc. an das Namensschema der NetOffice-API anpassen, dann sollte es laufen.
MarcoBorn
MarcoBorn 25.07.2014 um 12:33:03 Uhr
Goto Top
Ich hatte die Deklarationen und Parameter schon entsprechend angepasst, erhalte aber weiterhin die Fehlermeldung. Mal sehen, was Sebastian auf meine Mail hin antwortet...