2013-07-10 7 views
7

Basisreferenz erstellen: Ten Code Conversions for VBA, Visual Basic .NET, and C#
VBA entspricht C# oder VB.NET Importe/Aliase

Hinweis: Ich habe bereits erstellt und importiert eine *.dll, diese Frage zuAliase.

ist der programmatische Name einer Test Klasse sagen Lassen TestNameSpace.Test

[ProgId("TestNamespace.Test")] 
public class Test ... 

Nun, sagen wir eine C# Lösung in eine *.dll versiegelt und kompiliert wurde, und ich bin Referenzierung es in einer VBE des Excel. Hinweis: An dieser Stelle kann ich den programmatischen Namen nicht ändern, als ob die *.dll nicht von mir geschrieben wurde.

Dies ist in VBA: Anstatt eine Variable wie folgt erklärt:

Dim myTest As TestNameSpace.Test 
Set myTest = new TestNameSpace.Test 

ich lieber nennen es (noch in VBE)

Dim myTest As Test 
Set myText = new Test 

In C# würden Sie normalerweise sagen

using newNameForTest = TestNamespace.Test; 
newNameForTest myTest = new NewNameForTest; 

Hinweis: Angenommen, es gibt kein Namespace-Konflikte im VBA Projekt

Frage: ist es ein Äquivalent Anruf in VBA-C#using oder VB.NETimports Aliase?

Antwort

2

Die Antwort ist nein: Es ist ein Einbau-VBE-Funktion, die einem Projekt die Verweise hinzugefügt erkennt und erstellt Aliase zur Laufzeit (VBE der Laufzeit), wenn es keine Namenskollisionen

sind

Bei Namens Konflikte in Ihrer Registrierung alle . Punkte werden durch _ Unterstriche ersetzt.

» ProgId ‚s   (Programmatic Identifiers)

In COM wird es nur in späte Bindung verwendet. Es ist, wie Sie einen Anruf tätigen

Dim myObj = CreateObject("TestNamespace.Test") 


» EarlyBinding und LateBinding

Anfang Bindung Sie ein neues Objekt erstellen, um die Art des Objekts geben Sie mithilfe des new Schlüsselwort erstellen. Der Name Ihres Objekts sollte mit dem Intellisense des VBA erscheinen. Es hat nichts mit der ProgId zu tun. offen Object ExplorerF2 und suchen Sie dort

This article erklären, wo die Namen kommen aus in Early Binding Abschnitt
verwenden die gleiche link für Wann verwendet man die späte Bindung - die eigentliche Namespace für Ihren Objekttyp verwendet abzurufen

für MSDN Abschnitt Programmatische Identifiers bitte this

3

Interessante Frage (ständig mit ihnen, aber nie über ihre genaue Bedeutung nachgedacht). Die definition of the Imports statement (selbe für using) ist ziemlich klar: Ihre einzige Funktion ist die Verkürzung der Referenzen durch Entfernen der entsprechenden Namespaces. Daher ist die erste Frage zu stellen: Hat VBA so etwas (Namespaces) überhaupt? Und die Antwort ist nein, wie Sie aus mehreren Quellen lesen können; Beispiele: Link 1Link 2

Zusammengefasst nach keinem einzigen Hinweis auf eine VBA-Anweisung etwas zu tun, ähnlich wie Imports/using und hat bestätigt, dass VBA berücksichtigt nicht die „Struktur“ ihre Verwendung (Namespaces) zu rechtfertigen, ich glaube gefunden zu haben Ich bin in der Lage zu sagen: Nein, in VBA gibt es so etwas nicht.

Zusätzlich sollten Sie beachten, dass es keine wirkliche Anwendbarkeit hätte. Zum Beispiel: Wenn ein VB.NET-Code umzuwandeln, wo Imports könnte verwendet werden, wie:

Imports Microsoft.Office.Interop.Word 
... 
Dim wdApp As Application 

würde der Code vollständig geändert werden, so dass die resultierende Zeichenfolge nicht so lang sein wird:

Dim wdApp As Word.Application ' Prefacing the library's display name. 

Ich denke, dass dies ein guter grafischer Grund dafür ist, warum VBA solche Dinge nicht benötigt: VB.NET berücksichtigt eine Vielzahl von Realitäten, die richtig klassifiziert werden müssen (Namespaces); VBA ist für eine viel kleinere Anzahl von Situationen verantwortlich und kann es sich daher leisten, eine so systematische, lange benannte Klassifikation nicht durchzuführen.

-------------------------- KLARSTELLUNG

Imports/using ist eine bloße Name Verkürzung, das heißt, statt zu schreiben whatever.whatever2.whatever3 jedes Mal, wenn Sie ein Objekt des angegebenen Namespace in einem Module/Class verwenden, fügen Sie am Anfang eine Imports/using Anweisung hinzu, die im Grunde bedeutet: "für alle Mitglieder des Namespace X, einfach vergessen die ganze Überschrift bla, bla ".

Ich sage nicht, dass Sie diese Art von Verhalten nicht emulieren können; nur Hervorhebung, dass eine eingebaute Funktionalität zu kurzen Namen in VB.NET Sinn macht, wo die Namen wirklich lang werden können, aber nicht so sehr in VBA.

+0

Warum irreführend sehen? Und was hat Vererbung mit Namespaces zu tun? Namespaces ist eine Möglichkeit, alles richtig zu klassifizieren; Vererbung ist ein Ansatz, der verwendet wird, um die Definition eines gegebenen Objekts zu beschleunigen (z. B. alle Informationen von diesem anderen Objekt zu übernehmen). Vererbung hat nichts mit Importen zu tun. – varocarbas

+0

In einem der Links, die ich zur Verfügung gestellt habe, schlägt der Typ eine Möglichkeit vor, Namespaces zu emulieren. Ich sage nicht, dass Sie sich etwas nicht einfallen lassen können. Ich sage, dass es zu wenig Sinn gemacht hätte, eine eingebaute Funktionalität für kurze Namen zu implementieren, wenn der längste Name nur aus zwei Wörtern besteht. – varocarbas

+1

oh vielleicht war ich mit meinem Kommentar nicht klar. Beachten Sie eine * versteckte * eingebaute Funktion in VBE, die es Ihnen erlaubt, '(" Sheet1 ")' anstelle von 'Application.ThisWorkbook.Sheets (" Sheet1 ")' zu sagen. Denken Sie nun darüber nach, wie jedes Element (rechte Seite des Punktes) von seiner Elternklasse (linke Seite) erben muss.Da es sich um ein eingebautes Feature handelt, ist es versiegelt und das Erstellen eigener Klassen und Member wird es Ihnen nie erlauben, sie auf ähnliche Weise aufzurufen. Sie müssen immer einen vollständigen Pfad zu Ihren Klassen Class1.Class2.ClassNm angeben, VBE erstellt keinen Namespace für Sie. Hilft das meinen ersten Kommentar zu verstehen? –