2016-11-01 3 views
1

Ich habe diese einfache Rechnung Kontrolle Arbeitsblatt in Excel und ich verwende VBA, um es einfacher zu visualisieren und neue Elemente hinzufügen. Ich habe Dutzende von anderen VBA programmierten Arbeitsblätter gemacht, und alle von ihnen haben eine „neue“ aktive x-Taste, programmiert wie folgt aus:VBA Exceputing Sub Seltsam

Private Sub ButtNew2_Click() 

Dim Guia As Worksheet 
Dim UltLin As Integer 

Set Guia = Workbooks("Notas Fiscais.xlsm").Worksheets("Saída") 
UltLin = Guia.UsedRange.Rows.Count + 1 

Guia.Application.Goto Reference:="R" & UltLin & "C1" 
FormNotasSaida.Show 
FormNotasSaida.BoxDataEmiss.SetFocus 

End Sub 

So einfach ist das. Wählen Sie einfach die erste leere Zeile, so dass das Formular leer geladen wird. Es funktioniert gut in jedem anderen Arbeitsbuch. Aber in diesem, wenn und jedes Mal, wenn ich diesen Knopf, nach dem Schließen des Formulars, das nächste Mal (und nur einmal) klicke ich das Formular wieder auf jede mögliche Weise (entweder Doppelklick auf einen Gegenstand, Drücken der Schaltfläche "Anzeigen" oder Drücken Sie erneut die "New" Taste, es lädt entweder leer oder zeigt den zuletzt gestarteten Gegenstand (falls Sie es getan haben).

Nach dem Schließen kann ich überall klicken oder die "Show" Taste drücken, wann immer sie funktionieren, wie sie immer haben. Das Problem tritt nur einmal nach dem Drücken der Schaltfläche "Neu" auf.

Was mache ich möglicherweise falsch, speziell zu wissen, dass diese Methode in allen anderen Arbeitsmappen perfekt funktioniert?

+0

Überprüfen Sie Ihre UltLin var, diese auf eine leere Zelle aufgehört haben könnte, und dann zur nächsten Zeile fort. –

+1

Verwenden Sie eine generierte Instanz des Formulars anstelle der Standardinstanz. Weitere Informationen finden Sie in [this Documentation topic] (http://stackoverflow.com/documentation/vba/5351/user-forms/19036/best-practices#t=201611011528290148872). – Comintern

+1

FWIW Sie * wählen * nicht die "erste leere Zeile". 'Guia.UsedRange.Rows.Count + 1' tut nicht, was Sie denken, und es ist auch nicht zuverlässig: [readme] (http://stackoverflow.com/a/11169920/1188513). –

Antwort

3
FormNotasSaida.Show 
FormNotasSaida.BoxDataEmiss.SetFocus 

Formulare sind eine besondere Art von Klassenmodulen mit einem Designer und einem vordeklarierte ID Attribut. Diese "vordeklarierte ID" spielt hier eine Rolle: Sie verwenden/verwenden die globale Standardinstanz der Klasse und [es sei denn, Sie schließen es mit der X-Taste in der Kontrollbox,] nie unload es ist also so zeigt immer die gleiche Form an. jedes Mal, wenn es

Eine bewährte Methode ist es, eine neue Instanz des Formulars zu erstellen:

Set frm = New FormNotasSaida 
frm.Show 
frm.BoxDataEmiss.SetFocus 
+0

Das hat es geschafft! Vielen Dank =) –

+0

Nein, tut mir leid. Eigentlich nicht. Die Hälfte der Codes und Module, die ich schrieb, funktionierte nicht mehr = ( –

+1

@AlekosMazzolotti wahrscheinlich aus einem anderen Grund. Wenn Sie Code haben, der auf der * Standardinstanz * beruht, die einige Werte enthält, müssen Sie nun das 'frm'-Objekt an diesen Code übergeben. –

Verwandte Themen