Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
728to732
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
728to732
728to732
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Worksheet_Change zum ausfüllen von Zellen

Worksheet_Change zum ausfüllen von Zellen
10.02.2006 19:28:15
Zellen
Hallo und guten Abend,
das Wochenende naht und ich möchte meine Idee die ich in der Woche mit mir herum trage, versuchen umzusetzen.
 
 ABCDE
1PLZOrtStraßeWerteNummer
219300TuckhudeMittelweg538,30AA-14
319300NeuhofNeustädter Str.2.607,30AA-14
419300NeuhofRiet'ut469,72BB-10
519300NeuhofSchulstr.1.682,28AA-14
619300NeuhofTannenweg231,20AA-14
719300DambeckAmselweg5.067,50AA-14
 
Diagramm - Grafik - Excel Tabellen einfach im Web darstellen    Excel Jeanie HTML  3.0    Download  
Folgendes möchte ich in der oben genannten Tabelle erreichen.
Wenn ich in der Spalte "Nummer" die Nummer ändere, sollte automatisch alle anderen Nummern die zu der PLZ und Ort gehören umgewandelt werden.
Also, ich habe oben im Ort 19300 Neuhof die Nummer "BB-10" gesetzt, nun sollen alle Zeilen die die gleiche PLZ und Ort besitzen die gleiche Nummer erhalten.
Vorher möchte ich noch eine Abfrage erhalten, ob es wirklich sein soll oder nicht, da mit unter vereinzelt nur Straßen eine Nummer erhalten.
Den Code für die Abfrage traue ich mir zurnächst selber zu.
Läßt sich meine Idee so ohne weiteres umsetzen?
Wenn ja, wie müßte die Ereignisprozedur geschrieben werden?
Gruß Korl

25
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Worksheet_Change zum ausfüllen von Zellen
10.02.2006 20:05:01
Zellen
Hallo,
hab ich das richtig verstanden:
also hier in diesem Beispiel sollen von allen Zeilen mit "19300" "Neuhof" die Zelle in Spalte E in "BB-10" umgewandelt werden, sobald in einer Zelle "BB10" eingetragen wird? Und die Zeilen z.B. mit 19300 Tuckude bleiben unverändert?
Klaus
AW: Worksheet_Change zum ausfüllen von Zellen
10.02.2006 20:32:03
Zellen
Hallo Klaus,
danke zunächst für Dein Interesse.
Ja, ich denke Du hast meine Aufgabe verstanden.
Gruß Korl
AW: Worksheet_Change zum ausfüllen von Zellen
10.02.2006 20:09:43
Zellen
Servus,
in etwa so. Musst noch an deine Range anpassen.


Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim lngZ As Long, intZ As Integer
If Target.Column <> 5 Or Target.Row < 7 Or Target.Row > 12 _
    Then Exit Sub ' Anpassen
intZ = 1
Do
    If intZ + Target.Row > 12 Then Exit Do 'Anpassen
    lngZ = Suchen(Range("A" & Target.Row), Range("A" & Target.Row + intZ & ":A12")) 'Anpassen
        If lngZ <> 0 Then
            If Range("B" & Target.Row) = Range("B" & Target.Row + lngZ + intZ - 1) Then
                If MsgBox(Range("E" & Target.Row + lngZ + intZ - 1) & " in Zeile " & Target.Row + lngZ + intZ - 1 & " ändern ?", _
                    vbYesNo, "Eintrag ändern ?") = vbYes Then _
                    Range("E" & Target.Row + lngZ) = Target
            End If
        Else
            MsgBox "Keine Nr. (mehr) gefunden !", vbCritical, "Vorgang abgebrochen !"
            Exit Do
        End If
     intZ = intZ + 1
Loop
End Sub
Private Function Suchen(PLZ, myrng As Range)
On Error GoTo Fehler
Suchen = Application.WorksheetFunction.Match(PLZ, myrng, 0)
Exit Function
Fehler:
Suchen = 0
End Function


MfG Peter
Anzeige
Nachtrag
10.02.2006 20:26:39
Peter
Servus,
ändere die Zeile:
Range("E" & Target.Row + lngZ) = Target in:
Range("E" & Target.Row + lngZ + intZ - 1) = Target
Sonst nix funktionieren.
MfG Peter
AW: Nachtrag
10.02.2006 20:48:10
Korl
Hallo Peter,
auch Dir zunächst herzlichen Dank für Dein Interesse und Deine Mühe. Deinen Nachtrag habe ich bereits berücksichtigt, leider noch kein Erfolg.
Vielleicht noch ein Hinweis. Die Nummern sind leider auch unterschiedlich lang.
Das heißt, die Nummern können jeweils aus 2 bzw. 3 Buchstaben und immer mit "-" und 2 Zahlen versehen sein.
Wenns leichter ist, kann ich auch die PLZ und Ort jeweils in einer Zelle zusammen fügen und diese nicht in der gesamten Spalte verteilt zu suchen sind, sonder immer zusammenhängend anzeigen lassen.
Gruß Korl
Anzeige
Versteh ich nicht....
10.02.2006 20:53:09
Peter
Servus,
hab das gemäß deines Bsp.´s aufgebaut, siehe mein Bsp.
Wenn´s nicht klappt, am besten aussagekräftige Mappe hochladen, ab morgen früh gerne, sonst offen.
https://www.herber.de/bbs/user/30900.xls
MfG Peter
AW: Versteh ich nicht....
10.02.2006 21:22:58
Korl
Hallo Peter,
danke für Deine Datei.Dort springt auch die Ereignis an. Es entspricht aber noch nicht dem, wie ich es mir vorstelle.
In Deinem Beipiel muß ich jede Zeile bestätigen. Wenn ich mit "Strg+u" arbeiten würde, käme ich schneller voran.
Vielleicht habe ich das ganze vielleicht unklar dagestellt.
Die Tabelle kann etwa 5000 Zeilen lang sein. Bei der Nummernvergabe handelt es sich um einen Personencode.
In der Tabelle sind verschiedene Orte, wie Dörfer und Städter vorhanden.
Dörfer werden in der Regel von einer Person bearbeitet, darum einmal den Personencode angeben und das ganze Dorf erhält den zuständigen Personencode.
Städte können von mehr als eine Person bearbeitet werden, darum werden dort die Personencodes einzeln den Straßen zugeordnet.
Zusammenfassend nochmal, ändere ich einen Personencode soll gefragt werden, ob der gesamte Ort diese Nummer erhalten soll, ja oder nein. Also die Abfrage nur einmal für den gesamten Ort.
Gruß Korl
Anzeige
AW: Versteh ich nicht....
10.02.2006 22:55:10
MichaV
Hallo Korl,
sollst nicht bis morgen warten müssen:


      
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngZelle As Range
Dim strZuÄndern As String
Const strNummern = "E7:E15" 'Bereich mit den Nummern
Const intPLZ = 1 'Spalte der PLZ, Ortsnamensspalte wird rechts daneben angenommen

If Intersect(Range(strNummern), Target) Is Nothing Then Exit Sub
strZuÄndern = Cells(Target.Row, intPLZ) & "|" & Cells(Target.Row, intPLZ + 1)
On Error GoTo NixDa
Application.EnableEvents = 
False
For Each rngZelle In Range(strNummern)
    
If Cells(rngZelle.Row, intPLZ) & "|" & Cells(rngZelle.Row, intPLZ + 1) = strZuÄndern Then
      rngZelle = Target
    
End If
Next rngZelle
NixDa:
Application.EnableEvents = 
True
End Sub 


Gruß- Micha
PS: Rückmeldung wäre nett.
Anzeige
AW: Versteh ich nicht....
10.02.2006 23:28:12
Korl
Hallo Micha,
schön Dich zu lesen. ;-)
Ich dachte schon es sind alle mit den Sport heute Abend beschäftigt. ;-)
Micha, danke für den Code. Ich habe ihn gleich mal auf die harte Probe gestellt, in dem ich ihn in meine richtige Tabelle mit 5000 Zeilen gepackt habe. Der Code braucht dann eine Weile, da ich ein paar Summenprodukt-Formeln in der Tabelle habe.
Lässt er sich noch beschleunigen?
Der Code läuft genau so wie ich es mir vorgestellt habe,jetzt brauch ich nur noch vorher die Abfrage ob er nun auch wirklich die ganze Tabelle wandelt darf oder nicht.
Micha, wenn Du mich jetzt fragst ob Du Dich daran auch noch versuchen sollst, würde ich sagen - lasse Dich nicht davon abhalten! ;-)
Ich versuche mich aber trotzdem selbst daran, mit meinen gewonnenen Kenntnissen die ich hier im Forum erlangt habe.
Gruß Korl
Anzeige
AW: Versteh ich nicht....
10.02.2006 23:40:48
Korl
Hallo Micha,
die Abfrage habe ich mir schon einbauen können. siehe hier:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngZelle As Range
Dim strZuÄÄndern As String, strFrage As String
Const strNummern = "E2:E5001" 'Bereich mit den Nummern
Const intPLZ = 1 'Spalte der PLZ, Ortsnamensspalte wird rechts daneben angenommen
If Intersect(Range(strNummern), Target) Is Nothing Then Exit Sub
strZuÄÄndern = Cells(Target.Row, intPLZ) & "|" & Cells(Target.Row, intPLZ + 1)
strFrage = MsgBox("Willst Du oder nicht", vbYesNo, "Frage")
    If strFrage = vbYes Then
        On Error Goto NixDa
        Application.EnableEvents = False
        For Each rngZelle In Range(strNummern)
        If Cells(rngZelle.Row, intPLZ) & "|" & Cells(rngZelle.Row, intPLZ + 1) = strZuÄÄndern Then
          rngZelle = Target
        End If
        Next rngZelle
      Else
      Exit Sub
    End If
NixDa:
Application.EnableEvents = True
End Sub
Kann man diesen Code nun noch etwas feuriger bekommen?
Wie gesagt habe eine kleine Menge Summenproduktformeln drinne.
Gruß Korl
Anzeige
AW: Versteh ich nicht....
10.02.2006 23:43:20
Nils

Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngZelle As Range
Dim strZuÄndern As String
Dim lngOldCalculation As Long
Const strNummern = "E7:E15" 'Bereich mit den Nummern
Const intPLZ = 1 'Spalte der PLZ, Ortsnamensspalte wird rechts daneben angenommen
If Intersect(Range(strNummern), Target) Is Nothing Then Exit Sub
lngOldCalculation = Application.Calculation
strZuÄndern = Cells(Target.Row, intPLZ) & "|" & Cells(Target.Row, intPLZ + 1)
On Error GoTo NixDa
With Application
.EnableEvents = False
.ScreenUpdating = False
.Calculation = xlCalculationManual
End With
For Each rngZelle In Range(strNummern)
If Cells(rngZelle.Row, intPLZ) & "|" & Cells(rngZelle.Row, intPLZ + 1) = strZuÄndern Then
rngZelle = Target
End If
Next rngZelle
NixDa:
With Application
.EnableEvents = True
.ScreenUpdating = True
.Calculation = lngOldCalculation
End With
End Sub

mfg Nils
Anzeige
AW: Versteh ich nicht....
11.02.2006 00:07:58
Korl
Hallo Nils,
danke, dass Du Dich an meiner Aufgabe beteiligst. Das gewollte Ereignis findet aber leider nicht statt. Die Application ".ScreenUpdating = False" habe ich mit inzwischen auch schon eingebaut.
Nils, trotzdem Danke.
Gruß Korl
AW: Versteh ich nicht....
11.02.2006 00:17:52
MichaV
Hallo Korl,
viel schneller gehts IMHO nicht mehr:


      
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngZelle As Range
Dim strZuÄndern As String
Dim lngOldCalculation As Long
Dim intOffset As Integer
Dim intOrt As Integer
Dim strStart As String
Const strNummern = "E7:E15" 'Bereich mit den Nummern
Const strSuchen = "B7:B15" 'Bereich der Ortsnamen

intOffset = Range(strNummern).Column - Range(strSuchen).Column
intOrt = Range(strSuchen).Column
If Intersect(Range(strNummern), Target) Is Nothing Then Exit Sub
If MsgBox("Willst Du oder nicht", vbYesNo, "Frage") = vbNo Then Exit Sub
lngOldCalculation = Application.Calculation
strZuÄndern = Cells(Target.Row, intOrt - 1) & "|" & Cells(Target.Row, intOrt)
On Error GoTo NixDa
With Application
  .EnableEvents = False: .ScreenUpdating = False: .Calculation = xlCalculationManual
End With
Set rngZelle = Range(strSuchen).Find(What:=Target.Offset(0, -intOffset))
If Not rngZelle Is Nothing Then
    strStart = rngZelle.Address
    
Do
        
If rngZelle.Offset(0, -1) & "|" & rngZelle = strZuÄndern Then
            rngZelle.Offset(0, intOffset) = Target
        
End If
        
Set rngZelle = Range(strSuchen).FindNext(rngZelle)
    
Loop Until rngZelle.Address = strStart
End If

NixDa:
With Application
  .EnableEvents = True: .ScreenUpdating = True:  .Calculation = lngOldCalculation
End With
End Sub 


Gruß- Micha
PS: Rückmeldung wäre nett.
Anzeige
AW: Versteh ich nicht....
10.02.2006 23:46:04
MichaV
Hallo Korl,
bei 50000 Zeilen wirds lahm, das kann ich mir vorstellen. Du müsstest vorher die Berechnung ausschalten, Screenupdating auch. Dann könntest Du -anstelle jede Zelle einzeln zu prüfen- mit der Find- Methode rübergehen. Die ist 10000 mal schneller als die Einzelprüfung. Wende Find bei der Spalte an (PLZ oder Ort), die die größere Anzahl an unterschiedlichen Werten hat. Alles klar?
Ich setz mich mal ran...
Gruß- Micha
wow
10.02.2006 23:47:33
MichaV
Hallo,
Nils hat uns ja schon die Hälfte der Arbeit abgenommen ;o)
Also, wer zuerst den Find- Code postet, hat gewonnen ;o)
Gruß- Micha
AW: wow
11.02.2006 00:16:52
Korl
Hallo Ihr beide,
ich habe ja meine Abfrage dazwischen geschoben, die auch gut funktioniert und auch gewllt ist.
Dieser Abfrage fällt mir jetzt aber an anderer Stelle zusätzlich vor die Füße.
Undzwar, diese ganze Ortsliste lese ich zunächst als csV-Datei in mein Projekt ein, bearbeite diese noch und packe sie an die gewünschte Stelle und dabei kommt dann meine Abfage ob ich nun den ganzen Ort ändern möchte oder nicht.
Wie kann ich in diesem Fall das Ereignis ausschalten bzw. die Abfrage unterbinden?
Gruß Korl
Anzeige
AW: wow
11.02.2006 00:21:08
MichaV
Hallo Korl,
mit Application.Enableevents=False verhinderst Du, daß das Makro bei Änderung von Zellinhalten gestartet wird. Das müsstest Du in Dein csv-import-Makro einbauen. Auf jeden Fall aber sicherstellen, daß auch wieder auf =True geschaltet wird. Wie das geht, siehst Du in den Beispielen.
Gruß- Micha
PS: Rückmeldung wäre nett.
AW: wow
11.02.2006 00:49:55
Korl
Hallo Micha,
ich habe es nun auch geschafft die Abfrage wärend des Kopierens zu unterbinden.
Ich bedanke mich mahl wieder sehr für Deine Unterstützung, Du hast mir einen großen Gefallen getan.
Anstoßen kann ich mit Dir ja nur virtuell. "Prost! ! !"
Gruß Korl
auch Prost
11.02.2006 00:51:35
MichaV
Hallo Korl,
ich würde mich noch sehr über eine Info freuen, ob das Makro mit der Find- Variante deutlich schneller ist.
Gruß- Micha
PS: Rückmeldung wäre nett.
AW: wow
11.02.2006 00:40:53
Korl
Hallo Nils und Micha,
ich habe mal die Abschaltapplicationen von Nils in Michas Code eingebaut, der jetzt so aussieht:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngZelle As Range
Dim strZuÄndern As String, strFrage As String
Dim lngOldCalculation As Long
Const strNummern = "E2:E5001" 'Bereich mit den Nummern
Const intPLZ = 1 'Spalte der PLZ, Ortsnamensspalte wird rechts daneben angenommen
Application.ScreenUpdating = False
If Intersect(Range(strNummern), Target) Is Nothing Then Exit Sub
strZuÄndern = Cells(Target.Row, intPLZ) & "|" & Cells(Target.Row, intPLZ + 1)
strFrage = MsgBox("Willst Du den ganzen Ort ändern? ", vbYesNo, "Frage")
If strFrage = vbYes Then
On Error GoTo NixDa
With Application
.EnableEvents = False
.ScreenUpdating = False
.Calculation = xlCalculationManual
End With
' Application.EnableEvents = False
For Each rngZelle In Range(strNummern)
If Cells(rngZelle.Row, intPLZ) & "|" & Cells(rngZelle.Row, intPLZ + 1) = strZuÄndern Then
rngZelle = Target
End If
Next rngZelle
Else
Exit Sub
End If
'Application.ScreenUpdating = True
NixDa:
With Application
.EnableEvents = True
.ScreenUpdating = True
.Calculation = xlAutomatic  'lngOldCalculation
End With
'Application.EnableEvents = True
'Application.ScreenUpdating = True
End Sub

In diesem Zustand läuft er schon sehr flott. Er wäre so schon gebrauchsfähig. ;-)
Meine offene Frage wäre noch, kann ich die Abfrage in der Ereignisprozedur unterbinden, wenn ich die Daten durch kopieren, in diese Tabelle einfüge?
Gruß Korl
PS: übrigens ist es nicht wer weiß wie eilig, freue mich schon sehr, dass ich überhaupt so weit gekommen bin.
hm
11.02.2006 00:44:45
MichaV
Hallo Korl,
die Frage ist nicht mehr offen. Hattest Du nicht aktualisiert oder etwas nicht verstanden?
Du musst in Deinem csv-Imort-Makro das Event-Handling ausschalten, damit unser Alle-Gleichen-Zeilen-Ändern-Makro nicht gestartet wird.
Gruß- Micha
AW: Du schreibstt schneller als ich lesen kann
11.02.2006 01:04:36
Korl
Hallo Micha,
Dein erneuten Code habe ich jetzt erst mit bekommen. Habe ihn ausprobiert und das gleiche Problem wie bei Nils seiner Ergänzung gehabt. Es wird kein Ereignis ausgelöst.
Ich sehe komischerweise auch nicht den Unterschied zu meinem letzten Code, den ich hier hineingestellt habe. Bin mit den nun aber schon sehr zu frieden.
Da ich selbst mich versucht hatte, haben sich unsere Postings wohl überschnitten. ;-)
So, nun habe ich schon wieder eckige Augen bekommen und möchte nun fürs erste Schluß machen.
Gruß Korl
nee, ich lese schneller als Du schreiben kannst :)
11.02.2006 01:08:00
MichaV
Hallo Korl,
ich sehe komischerweise auch nicht den Unterschied zu meinem letzten Code, den ich hier hineingestellt habe
Ja Du hast Recht, schnell ins Bettchen und erstmal ausschlafen! Guck morgen nochmal rein ;o)
https://www.herber.de/forum/messages/731158.html
Gruß- Micha
Feedback für Micha und Nils nochmal
11.02.2006 12:07:05
Korl
Hallo Micha und Nils,
oh Mann, was war ich doch happy und aufgeregt zugleich und dann noch die dicken Augen zur vorgerückter Stunde.
Selbstverständlich hat zunächst die Anpassung von Nils auch hingehauen, ebenfalls Dein zweiter Code, Micha.
In beiden Fällen hatte ich jeweils den Bereich in Spalte "E" nicht angepasst. "schäm"
Micha, ob nun die Find-Methode schneller arbeitet, kann ich Dir nicht hundertprozentig sagen. Subjektiv gesehen, vielleicht doch einen Tick schneller.
Ich kann Dir aber verraten, dass ich mich in meinem Alter noch riesig freuen kann über einen gelungenen Code.
Micha, man sieht sich bestimmt nochmal. ;-)
schöne Grüße Korl
Danke fürs Feedback mT
11.02.2006 21:29:06
MichaV
Hallo Korl,
danke für die Rückmeldung.
Das mit dem sehen... ich gehe demnächst für eine längere Zeit nach Skandinavien. Vielleicht ja mal im Urlaub ;o)
Gruß- Micha

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige