Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: mk500 am Januar 16, 2017, 18:45:21

Titel: Kopieren von Daten aus einem Formular mit Unterformular
Beitrag von: mk500 am Januar 16, 2017, 18:45:21
Halli hallo ich schon wieder :P

nun habe ich folgendes Problem. Ich habe ein Formular mit einem Unterformular, zwei Buttons und ein Kombinationsfeld und ein Textfeld. (siehe Bild im Anhang)

Die Daten aus dem Unterformular kommen aus einer Abfrage. Das Kombinationsfeld setzt den Filter für die Abfrage. (Auswahl des Mitarbeiters) Das Textfeld zeigt nur die Summe (der Menge) der gefilterten Daten. (eig nicht relevant)

Nun möchte ich mit dem Button "Kopieren" die Daten des Unterformulars markieren Spalte 1, Spalte 2, Spalte 3 und maximal 12 Zeilen um diese dann zu kopieren (wie STRG + C). Dies ist notwendig um die Daten aus Access in ein anderes Programm zu bekommen leider genau in dieser Formatierung. Um sie dort verarbeiten zu können. Danach soll man die Kontrollkästchen "erledigt" dieser kopierten Daten über den Button "Als Erledigt markieren" setzen. Nach einer Aktualisierung wären sie dann aus der Übersicht verschwunden. Und man wäre entweder fertig oder würde die nächsten 12 Zeilen kopieren. Alles am besten über VBA.

Ich hab leider absolut gar keine Idee wie ich das lösen kann, aber vielleicht könnt ihr mir ja helfen.

Viele Grüße
Martin
Titel: Re: Kopieren von Daten aus einem Formular mit Unterformular
Beitrag von: Lachtaube am Januar 17, 2017, 03:50:44
Theoretisch sollte das so möglich sein.Private Sub KopierKnopf_Click()
   Dim rs As Object

   With Me.UfoCtlName.Form
      'Zeilen (Datensätze) ermitteln
      Set rs = .Recordset.Clone()
      If rs.RecordCount = 0 Then Exit Sub
      If rs.RecordCount < 12 Then
         .SelHeight = .RecordCount
      Else
         .SelHeight = 12
      End If
      .SelLeft = 1   'links
      .SelTop = 1    'oben
      .SelWidth = 3  'Anzahl Spalten - anpassen
      'Auswahl kopieren
      DoCmd.RunCommand acCmdCopy
   End With
End Sub

Private Sub ErledigtKnopf_Click()
   Dim i As Long, j As Long

   With Me.UfoCtlName.Form
      With .Recordset.Clone()
         If .RecordCount = 0 Then Exit Sub
         If .RecordCount < 12 Then j = .RecordCount Else j = 12
         While i < j
            .Edit
            !Erledigt = True
            .Update
            i = i + 1
         Wend
      End With
      .Requery
   End With
End Sub
Titel: Re: Kopieren von Daten aus einem Formular mit Unterformular
Beitrag von: mk500 am Januar 17, 2017, 10:09:14
Hallo Lachtaube,

danke erst einmal für deine Antwort. Leider bekomme ich eine Fehlermeldung (siehe Bild) bei beiden VBA Click Events. Ich bin mir aber auch nicht sicher, in wie fern ich den Code anpassen muss. Habe versucht das markierte zu ändern, in den Namen von meinem Ufo aber das haut auch nicht hin.

Viele Grüße
Martin
Titel: Re: Kopieren von Daten aus einem Formular mit Unterformular
Beitrag von: Xoar am Januar 17, 2017, 10:26:14
Huhu,
schau mal bitte nach ob der Rahmen in dem das Unterformular dein ist, genau so heißt wie dein Ufo. Es muss nämlich der Namen des Rahmens angegeben werden und falls der anders heißt als das Ufo gehts auch nicht.

Evt hilft es was.
Titel: Re: Kopieren von Daten aus einem Formular mit Unterformular
Beitrag von: Lachtaube am Januar 17, 2017, 10:27:28
Statt UfoCtlName muss der Name des Unterformularsteuerelements, der nicht gleichlautend mit dem darin enthaltenen Formular sein muss (aber darf), eingetragen werden.

Ansonsten eine Spieldatenbank im 2003er-Format erstellen und statt bunter Bilder hier hochladen.
Titel: Re: Kopieren von Daten aus einem Formular mit Unterformular
Beitrag von: mk500 am Januar 17, 2017, 11:46:19
hey ho,

danke euch, das mit dem Ufo hat soweit funktioniert. Ich dachte es richtet sich nach dem Ufo Namen. Wusste nicht das Ufo Element in dem jeweiligen Formular ausschlaggebend ist. Das klappt soweit.

So nun folgendes, der Button "als Erledigt markieren" funktioniert soweit. Aber er markiert immer nur einen Eintrag, welcher dann auch verschwindet. Aber nicht die Auswahl die beim "kopiert" button ausgewählt. Der kopiert Button macht aktuell gar nichts. Bringt aber auch keinen Fehler. Zumindest hab ich nach klicken nichts einfügbares in meiner Zwischenablage.

Im Anhang die TestDB in der ich gerade probiere.
Vielleicht noch mal zu den Bedingungen der Button:

--> Kopieren: von den gefilterten Daten max. 12 Zeilen kopieren, wenn nur 7 gefiltert dann halt nur die 7 kopieren

--> als erledigt markieren: die Auswahl von Button "Kopieren" auf Erledigt setzen, wenn 12 Kopiert dann genau die 12 Zeilen, wenn nur 7 markiert dann genau nur diese 7 Zeilen

Vielen Dank im Voraus für Antworten und diese enorme Hilfsbereitschaft.

Grüße
Martin
Titel: Re: Kopieren von Daten aus einem Formular mit Unterformular
Beitrag von: Lachtaube am Januar 17, 2017, 12:29:46
Da waren doch noch einige Fehler meinerseits vorhanden.Option Compare Database
Option Explicit

Private Sub Befehl2_Click()
   Dim rs As Object

   Me.ufoTest.SetFocus
   With Me.ufoTest.Form
      'Zeilen (Datensätze) ermitteln
      Set rs = .Recordset.Clone()
      If rs.RecordCount = 0 Then Exit Sub
      If rs.RecordCount < 12 Then
         .SelHeight = rs.RecordCount
      Else
         .SelHeight = 12
      End If
      .SelLeft = 1   'links
      .SelTop = 1    'oben
      .SelWidth = 3  'Anzahl Spalten - anpassen
      'Auswahl kopieren
      DoCmd.RunCommand acCmdCopy
   End With
End Sub

Private Sub Befehl3_Click()
   Dim i As Long, j As Long

   With Me.ufoTest.Form
      With .Recordset.Clone()
         If .RecordCount = 0 Then Exit Sub
         If .RecordCount < 12 Then j = .RecordCount Else j = 12
         While i < j
            .Edit
            !Erledigt = True
            .Update
            .MoveNext
            i = i + 1
         Wend
      End With
      .Requery
   End With
End Sub

Private Sub Kombinationsfeld10_AfterUpdate()
   Me.Requery
End Sub
Und dem Kopierknopf musst Du die Ereignisprozedur in den Eigenschaften zuweisen.

PS: von Leer- und Sonderzeichen sollte man in Objektnamen Abstand nehmen. Gleiches gilt für Nachschlagefelder.
Titel: Re: Kopieren von Daten aus einem Formular mit Unterformular
Beitrag von: mk500 am Januar 17, 2017, 13:26:45
danke danke danke >> Lachtaube <<  !!!!  ;)
genau so soll es sein  8)

Zwei Kleinigkeiten habe ich allerdings noch. Wenn man als Markierungsbereich angenommen 7 Spalten eingibt. Markiert er optisch/farblich 6 Spalten, in die Zwischenablage kopiert er allerdings die geforderten 7 Spalten. Kann man das irgendwie/-wo einstellen?

Und das andere, er kopiert genau die eingestellten 12 Zeilen, aber er kopiert leider auch den "Tabellenkopf" mit, sprich 13 Zeilen. Die Kopfzeile brauche ich natürlich nicht. Bzw. kann ich es im SAP wo die Daten weiter verarbeitet werden nicht einstellen, dass er diese Zeile nicht mit lesen soll.

Viele Grüße
Martin
Titel: Re: Kopieren von Daten aus einem Formular mit Unterformular
Beitrag von: Lachtaube am Januar 17, 2017, 13:50:02
Zur Optik kann ich leider nichts sagen. Die Spaltenüberschriften sind beim Kopieren immer dabei.

Eine andere Variante wäre, die Daten über ein ADODB-Recordset zusammenzutragen, mit GetString daraus eine Ausgabe zu erzielen und mit Hilfe die Microsoft Forms 2.0 Bibliothek in die Zwischenablage zu bringen.

Alternativ könnte man ebenso die Zwischenablage mit Hilfe der Microsoft Forms 2.0 Bibliothek auslesen, die Kopfzeile daraus entfernen und den verbleibenden Rest erneut in die Zwischenablage einfügen.
Titel: Re: Kopieren von Daten aus einem Formular mit Unterformular
Beitrag von: mk500 am Januar 17, 2017, 14:13:04
okay das ist mit der Optik ist auch nur halb so schlimm.

Bei der anderen Sache:
Zitat von: Lachtaube am Januar 17, 2017, 13:50:02
Alternativ könnte man ebenso die Zwischenablage mit Hilfe der Microsoft Forms 2.0 Bibliothek auslesen, die Kopfzeile daraus entfernen und den verbleibenden Rest erneut in die Zwischenablage einfügen.
Da ich nicht drum herum komme, diese Zeile auf irgendeine Weise zu entfernen, wollte ich fragen ob du mir da ein Beispiel zeigen kannst? Weil das übersteigt meine VBA Kenntnisse bei weitem.

Viele Grüße
Martin
Titel: Re: Kopieren von Daten aus einem Formular mit Unterformular
Beitrag von: Lachtaube am Januar 17, 2017, 16:58:32
Hier der veränderte Code.Private Sub Befehl2_Click()
   Const CLSID_DataObject$ = "{1C3B4210-F441-11CE-B9EA-00AA006B1A69}"
   
   Dim rs As Object
   Dim s As String

   Me.ufoTest.SetFocus
   With Me.ufoTest.Form
      'Zeilen (Datensätze) ermitteln
      Set rs = .Recordset.Clone()
      If rs.RecordCount = 0 Then Exit Sub
      If rs.RecordCount < 12 Then
         .SelHeight = rs.RecordCount
      Else
         .SelHeight = 12
      End If
      .SelLeft = 1   'links
      .SelTop = 1    'oben
      .SelWidth = 3  'Anzahl Spalten - anpassen
   End With
   
   'Auswahl kopieren
   DoCmd.RunCommand acCmdCopy
   
   With CreateObject("new:" & CLSID_DataObject)
      ' Zwischenablage einlesen
      .GetFromClipboard
      ' Text aus der Zwischenablage zuweisen
      s = .GetText()
      ' Kopfzeile entfernen
      .SetText Mid$(s, InStr(s, vbCrLf) + 2)
      ' ... und in Zwischenablage ablegen
      .PutInClipboard
   End With
End Sub
Titel: Re: Kopieren von Daten aus einem Formular mit Unterformular
Beitrag von: mk500 am Januar 18, 2017, 18:19:03
Perfekt, so sollte es sein.  8)
Danke für die Hilfe !!!

Viele Grüße
Martin
Titel: Re: Kopieren von Daten aus einem Formular mit Unterformular
Beitrag von: mk500 am Januar 23, 2017, 08:26:25
ich weiß das Thema ist eigentlich schon gelöst. Aber trotzdem habe ich noch ein kleines Problem. Ich habe diesen Code ja einzeln in einer Testdatenbank probiert und alles lief einwandfrei. Nun habe ich alles in die Hauptdatenbank integriert. Das Markieren des ausgewählten Bereiches funktioniert soweit. Das als "Erledigt" markieren auch, nur das kopieren funktioniert nicht.

Ergänzend zur Datenbank: Die Datenbank wird durch selbsterstellte Buttons und Menübänder über Ribbons gesteuert. Das RibbonControl steht in einem extra Modul. Hier der Auszug von dem Teil um den es geht:


' Zeitauswertung
        ' Schließt das Dokument Zeitauswertung
        Case "cbtn431"
        DoCmd.Close acForm, "frmZeitauswertung"
       
        'Datenübergabe SAP (bestimmten Bereich markieren und kopieren)
        Case "cbtn411"
            Const CLSID_DataObject$ = "{1C3B4210-F441-11CE-B9EA-00AA006B1A69}"
   
            Dim rs As Object
            Dim s As String

            Forms!frmZeitauswertung!ufrmZeitauswertung.SetFocus
            With Forms!frmZeitauswertung!ufrmZeitauswertung.Form
                'Zeilen (Datensätze) ermitteln
                Set rs = .Recordset.Clone()
                If rs.RecordCount = 0 Then Exit Sub
                If rs.RecordCount < 12 Then
                    .SelHeight = rs.RecordCount
                Else
                    .SelHeight = 12
                End If
                .SelLeft = 1   'links
                .SelTop = 1    'oben
                .SelWidth = 7  'Anzahl Spalten - anpassen
            End With
   
            'Auswahl kopieren
            DoCmd.RunCommand acCmdCopy
   
            With CreateObject("new:" & CLSID_DataObject)
                ' Zwischenablage einlesen
                .GetFromClipboard
                ' Text aus der Zwischenablage zuweisen
                s = .GetText()
                ' Kopfzeile entfernen
                .SetText Mid$(s, InStr(s, vbCrLf) + 2)
                ' ... und in Zwischenablage ablegen
                .PutInClipboard
            End With
           
           
        Case "cbtn412"
            MsgBox "Das ist ein Testbutton!"
           
        'Setzt die Markierten Datensätze auf "Erledigt = True"
        Case "cbtn421"
            Dim i As Long, j As Long

            With Forms!frmZeitauswertung!ufrmZeitauswertung.Form
               With .Recordset.Clone()
                  If .RecordCount = 0 Then Exit Sub
                  If .RecordCount < 12 Then j = .RecordCount Else j = 12
                  While i < j
                     .Edit
                     !Erledigt = True
                     .Update
                     .MoveNext
                     i = i + 1
                  Wend
               End With
               .Requery
            End With
            Forms!frmZeitauswertung!ufrmZeitauswertung.Form.Requery


Beim Kopieren bringt er einen Fehler, dass die Funktion aktuell nicht zur Verfügung steht (siehe Anlage). Hier bleibt der Programmzeiger hängen:


            'Auswahl kopieren
            DoCmd.RunCommand acCmdCopy


Woran könnte das liegen?

Viele Grüße Martin
Titel: Re: Kopieren von Daten aus einem Formular mit Unterformular
Beitrag von: Lachtaube am Januar 23, 2017, 10:55:38
Ich kann nur raten, dass das Formular nicht altiv ist. Versuche den Abschnitt mit DoCd.SelectObject acForm, "frmZeitauswertung" zu starten.
Titel: Re: Kopieren von Daten aus einem Formular mit Unterformular
Beitrag von: mk500 am Januar 23, 2017, 11:36:57
mal wieder ein großes Dankeschön an Lachtaube. Hat funktioniert. Nun habe ich das Problem das ich zwei Buttons habe die etwas kopieren sollen. Der eine Button wählt 7 Spalten aus, der andere 9 Spalten.

Bei dem mit 7 Spalten funktioniert es ja auch. So bald ich aber den Code kopiere auf 9 ändere und bei dem anderen Button einfüge. Meckert er bzgl. >> Mehrfachdeklaration im aktuellen Gültigkeitsbereich <<

wie löse ich das?
Titel: Re: Kopieren von Daten aus einem Formular mit Unterformular
Beitrag von: Lachtaube am Januar 23, 2017, 11:47:50
Hier könnten Variablen, die mit dem Namen der aktuellen Methode in Konflikt stehen oder mehrfach innerhalb der Methode vorkommen, deklariert worden sein. Solche Fehler sollten schon beim Kompilieren des Codes und nicht erst bei der Ausführung auffallen.
Titel: Re: Kopieren von Daten aus einem Formular mit Unterformular
Beitrag von: mk500 am Januar 23, 2017, 12:01:43
ich hab nicht geschrieben das es mir erst in der Ausführung aufgefallen ist ;) sondern beim Kompilieren.

Geschaut habe ich schon, aber gefunden habe ich nichts.
Diese Stelle markiert er mir:

Const CLSID_DataObject$ = "{1C3B4210-F441-11CE-B9EA-00AA006B1A69}"
Titel: Re: Kopieren von Daten aus einem Formular mit Unterformular
Beitrag von: mk500 am Januar 23, 2017, 13:10:43
Zitat von: mk500 am Januar 23, 2017, 12:01:43
ich hab nicht geschrieben das es mir erst in der Ausführung aufgefallen ist ;) sondern beim Kompilieren.

Geschaut habe ich schon, aber gefunden habe ich nichts.
Diese Stelle markiert er mir:

Const CLSID_DataObject$ = "{1C3B4210-F441-11CE-B9EA-00AA006B1A69}"

Hat sich erledigt, hab alle Deklarationen einmalig an den Anfang gesetzt nun funktioniert es. Danke nochmal  8)