Telefonszámunk: 1-472-0679

[Resolved] Két táblázat adatainak beillesztése és táblázat átméretezése

Kezdőlap Fórumok Excel programozás [Resolved] Két táblázat adatainak beillesztése és táblázat átméretezése

Topic Resolution: Resolved
8 bejegyzés megtekintése - 1-8 / 8
  • Szerző
    Bejegyzés
  • #10526
    Adri0324
    Felhasználó

      Sziasztok!

      Egyszerűen nem jövök rá a hibára, légyszi segítsetek. A feladat, hogy a „Munka1” és „Munka2” munkalapon lévő táblázatok „Érték ID” sorába bemásoljuk a „Ssz” oszlopban lévő adatokat értékbeillesztéssel, majd a két táblázat „Érték ID” oszlop adatait beillesszük a „Feladat” fülben lévő táblázat „Érték ID” oszlopába egymás alá, és a táblázatot igazítsuk a beillesztett adatok mennyiségéhez. ŰIgazából működik minden, kivéve, hogy a táblázat bővítését lefutásonként 1 soronként végzi el. Nekem 1 lefutással kéne kibővítse a táblázatot az adatok hosszúságához.
      ?ég egy hiba, hogy a 4. sorba nem másol adatot. Egyszerűen átlépi, mintha ott sem lenne. Ide másolom a kódomat. Köszönöm, ha valaki segít ebben.
      Sub Masolas()
      Dim Munka2 As Worksheet
      Dim Munka1 As Worksheet
      Dim Szint2 As ListObject
      Dim Szint1 As ListObject
      Dim Tbl12 As ListObject
      Dim FirstRowTbl12 As Long
      Dim LastRowTbl12 As Long

      Set Munka2 = ThisWorkbook.Sheets(„Munka2”)
      Set Szint2 = Munka2.ListObjects(„Szint_2”)
      Set Munka1 = ThisWorkbook.Sheets(„Munka1”)
      Set Szint1 = Munka1.ListObjects(„Szint_1”)
      Set Feladat = ThisWorkbook.Sheets(„Feladat”)
      Set Tbl12 = Feladat.ListObjects(„Táblázat12”)

      Szint2.ListColumns(„Érték ID”).DataBodyRange.Value = Szint2.ListColumns(„Ssz”).DataBodyRange.Value
      Szint1.ListColumns(„Érték ID”).DataBodyRange.Value = Szint1.ListColumns(„Ssz”).DataBodyRange.Value

      FirstRowTbl12 = 1
      Tbl12.ListColumns(„Érték ID”).DataBodyRange.ClearContents

      Tbl12.ListColumns(„Érték ID”).DataBodyRange.Cells(FirstRowTbl12, 1).Resize(Szint1.ListColumns(„Érték ID”).DataBodyRange.Rows.Count, 1).Value = Szint1.ListColumns(„Érték ID”).DataBodyRange.Value

      LastRowTbl12 = FirstRowTbl12 + Szint1.ListColumns(„Érték ID”).DataBodyRange.Rows.Count

      Tbl12.ListColumns(„Érték ID”).DataBodyRange.Cells(LastRowTbl12, 1).Resize(Szint2.ListColumns(„Érték ID”).DataBodyRange.Rows.Count, 1).Value = Szint2.ListColumns(„Érték ID”).DataBodyRange.Value
      utolsoSor = Tbl12.ListRows.Count

      Set ertekIDOszlop = Tbl12.ListColumns(„Érték ID”)

      utolsoSor = Tbl12.ListRows.Count

      If utolsoSor > 0 Then
      For i = utolsoSor To 1 Step -1
      If ertekIDOszlop.DataBodyRange.Cells(i, 1).Value = „” Then
      Tbl12.ListRows(i).Delete
      End If
      Next i
      End If
      utolsoSor = Tbl12.ListRows.Count
      utolsoAdatSor = ertekIDOszlop.DataBodyRange.Find(„*”, , xlValues, xlWhole, xlByRows, xlPrevious).Row
      If utolsoAdatSor > utolsoSor Then
      Tbl12.ListRows.Add utolsoAdatSor – utolsoSor
      End If
      End Sub

      #10527
      horvimi
      Adminisztrátor

        Szia!

        Az Excelt azért elküldhetnéd, akár Fake adatokkal, a kód önmagában legtöbbször kevés.
        Nem elemeztem még a kódot, nem olyan rövid, de ha próbálni szeretném, nem szeretnék időt tölteni minta adat generálásra, táblázat átnevezésre, ráadásul az egy másik fájl lesz, amin lehet, hogy másképp működik.

        Legjobb, ha makrós fájl csatolsz adatokkal együtt, de előtte zip-elni kell, különben biztonság miatt nem fogadja el.

        Ja, és még egy:
        ha kódot teszel fel, akkor a beküldés előtt a kódot jelöld ki, és a szerkesztő tetején találsz egy „CODE” gombot.
        ha ezzel formázod, akkor nem alakítja át és pl. a sima dupla idézőjeleket nem teszi nyomdai idézőjellé, amitől megint nem működik, ha bemásolom a VBA editorba, és keresés-cserét kell rajta csinálni, vagy kézzel javítgatni.

        Köszi,

        Imre

        #10528
        Adri0324
        Felhasználó

          Szia,
          rendben, köszönöm. Legközelebb így járok el.
          Most csatoltan küldöm ennek a feladatnak a Excelét, fals adatokkal, én is ezekkel dolgoztam.

          Attachments:
          You must be logged in to view attached files.
          #10531
          delila
          Felhasználó

            Szia!
            Próbáld meg ezzel:

            Sub Masolas()
                Dim tabla As Range, usor As Integer, ide As Integer
                Sheets("Feladat").Select
                Set tabla = Range("C5").CurrentRegion
                tabla.Offset(1, 0).Resize(tabla.Rows.Count - 1, tabla.Columns.Count).ClearContents
                
                Sheets("Munka1").Select
                usor = Range("B5").End(xlDown).Row
                Range("B5:B" & usor).Copy
                Range("C5").PasteSpecial xlPasteValues
                Range("B5:C" & usor).Copy
                Sheets("Feladat").Range("C5").PasteSpecial xlPasteValues
                Range("F5:F" & usor).Copy
                Sheets("Feladat").Range("E5").PasteSpecial xlPasteValues
                
                ide = Sheets("Feladat").Range("C" & Rows.Count).End(xlUp).Row + 1
                Sheets("Munka2").Select
                usor = Range("B5").End(xlDown).Row
                Range("B5:B" & usor).Copy
                Range("C5").PasteSpecial xlPasteValues
                Range("B5:C" & usor).Copy
                Sheets("Feladat").Range("C" & ide).PasteSpecial xlPasteValues
                Range("G5:G" & usor).Copy
                Sheets("Feladat").Range("F5").PasteSpecial xlPasteValues
                Application.CutCopyMode = False
                
                Sheets("Feladat").Select
            End Sub

            Üdv,
            Delila

            #10532
            Adri0324
            Felhasználó

              Kedves Delila!

              Köszönöm, de sajnos nem jó. Hiba ugyan nincs benne, de nem úgy működik, amire szükségem van. A táblázatok függvényeket tartalmaznak, ezért kéne csak az Érték ID oszlopot mozgatni. A megoldás amit küldtél, a Táblázat12-t teljesen felülírta, ráadásul csak az egyik táblázat adatai kerülnek bele, a második táblázat adatai a cél helyen, de a táblázaton kívülre kerülnek. Meglepő módon viszont a cél táblázat mérete a második forrás táblázat méretével nőtt meg. Szóval itt legalább átméretezi a táblázatomat, csak nem jól és nem jó helyen.

              #10534
              Adri0324
              Felhasználó

                Sziasztok.
                Megoldottam. Bár 3 napom ráment. Ide teszem a kész kódot, ha valakit érdekel. Csatolom az Excelt is…
                Köszönöm a segítséget.

                Sub Masolas()
                    Dim Munka2 As Worksheet
                    Dim Munka1 As Worksheet
                    Dim Szint2 As ListObject
                    Dim Szint1 As ListObject
                    Dim Tbl12 As ListObject
                    Dim FirstRowTbl12 As Long
                    Dim LastRowTbl12 As Long
                    Dim osszegSor As Long
                    
                    Set Munka2 = ThisWorkbook.Sheets("Munka2")
                    Set Szint2 = Munka2.ListObjects("Szint_2")
                    
                    Set Munka1 = ThisWorkbook.Sheets("Munka1")
                    Set Szint1 = Munka1.ListObjects("Szint_1")
                    
                    Set Feladat = ThisWorkbook.Sheets("Feladat")
                    Set Tbl12 = Feladat.ListObjects("Táblázat12")
                    
                     Feladat.ListObjects("Táblázat12").ShowTotals = False
                    
                    For i = Tbl12.ListRows.Count To 2 Step -1
                        Tbl12.ListRows(i).Delete
                    Next i
                    Szint2.ListColumns("Érték ID").DataBodyRange.Value = Szint2.ListColumns("Ssz").DataBodyRange.Value
                    Szint1.ListColumns("Érték ID").DataBodyRange.Value = Szint1.ListColumns("Ssz").DataBodyRange.Value
                
                    FirstRowTbl12 = 1
                    Tbl12.ListColumns("Érték ID").DataBodyRange.ClearContents
                    
                    Tbl12.ListColumns("Érték ID").DataBodyRange.Cells(FirstRowTbl12, 1).Resize(Szint1.ListColumns("Érték ID").DataBodyRange.Rows.Count, 1).Value = Szint1.ListColumns("Érték ID").DataBodyRange.Value
                    
                    LastRowTbl12 = FirstRowTbl12 + Szint1.ListColumns("Érték ID").DataBodyRange.Rows.Count
                    Tbl12.ListColumns("Érték ID").DataBodyRange.Cells(LastRowTbl12, 1).Resize(Szint2.ListColumns("Érték ID").DataBodyRange.Rows.Count, 1).Value = Szint2.ListColumns("Érték ID").DataBodyRange.Value
                    
                    LastRowTbl12 = Tbl12.ListRows.Count
                    Set ertekIDOszlop = Tbl12.ListColumns("Érték ID")
                    LastRowTbl1 = Szint1.ListRows.Count
                    LastRowTbl2 = Szint2.ListRows.Count
                    
                    osszegSor = Application.WorksheetFunction.Max(Szint1.ListRows(LastRowTbl1).Range, Szint2.ListRows(LastRowTbl2).Range)
                    
                    Tbl12.Resize Tbl12.HeaderRowRange.Resize(osszegSor + 1)
                     
                     Feladat.ListObjects("Táblázat12").ShowTotals = True
                       
                End Sub
                Attachments:
                You must be logged in to view attached files.
                #10537
                delila
                Felhasználó

                  Szándákosan értékeket másoltam a Feladat lapra, a sok képlet lassítja a futást (sok sornál).
                  Egy hiba is volt a makrómban, a Csoport (2) oszlopba az 5. sortól vittem be a Munka2 lap adatait.
                  A mostani makróban csak az F (Fűz) oszlopban vannak képletek, hogy megmutassam, miként lehet tartományba képleteket bevinni.
                  Ezt a makrót is meghívhatod a lapjaidról az adatok változásakor.

                  Sub Masolas()
                      Dim tabla As Range, usor As Integer, ide As Integer
                      
                      Sheets("Feladat").Select
                      Range("C5:H1500").ClearContents  'előző adatok törlése
                      
                      Sheets("Munka1").Select     'Értékek másolása a Munka1 lapról
                      usor = Range("B5").End(xlDown).Row
                      Range("B5:B" & usor).Copy
                      Range("C5").PasteSpecial xlPasteValues
                      Range("B5:C" & usor).Copy
                      Sheets("Feladat").Range("C5").PasteSpecial xlPasteValues
                      Range("F5:F" & usor).Copy
                      Sheets("Feladat").Range("E5").PasteSpecial xlPasteValues
                      
                      ide = Sheets("Feladat").Range("C" & Rows.Count).End(xlUp).Row + 1
                      Sheets("Munka2").Select     'Értékek másolása a Munka2 lapról
                      usor = Range("B5").End(xlDown).Row
                      Range("B5:B" & usor).Copy
                      Range("C5").PasteSpecial xlPasteValues
                      Range("B5:C" & usor).Copy
                      Sheets("Feladat").Range("C" & ide).PasteSpecial xlPasteValues
                      Range("G5:G" & usor).Copy
                      Sheets("Feladat").Range("F" & ide).PasteSpecial xlPasteValues
                      Application.CutCopyMode = False
                      
                      Sheets("Feladat").Select
                      usor = Range("C" & Rows.Count).End(xlUp).Row    'összefűző képlet a Fűz oszlopba
                      Range("G5:G" & usor) = "=E5 & F5"
                  End Sub
                  #10538
                  horvimi
                  Adminisztrátor

                    Látom közben elvoltatok ezzel, ezért csak egy tapasztalatot tennék ide.

                    Nem tudom miért, de már többször belefutottam abba, hogy egy makró jelentősen lassabban futott, amikor táblázatként kezeltem a kódban egy tartományt, mint amikor tartományként. Attól még táblázat maradt, de a Delila féle módszerrel méregettem meg, hogy mik a dimenziói.

                    Az egyik esetben min. 100x sebességkülönbséget mértem. (Egy hosszú ciklus volt, táblázatmanipulációkkal)

                    Ebben most nincsen ciklus, valószínűleg nem nagyon számít, csak tudjatok róla, hogy a hiba nem a ti készüléketekben van, ha ilyesmi előfordul

                    Imre

                  8 bejegyzés megtekintése - 1-8 / 8
                  • Be kell jelentkezni a hozzászóláshoz.