Telefonszámunk: 1-472-0679

Hivatkozás tömbkonstans elemeire VBA

Kezdőlap Fórumok Excel programozás Hivatkozás tömbkonstans elemeire VBA

6 bejegyzés megtekintése - 1-6 / 6
  • Szerző
    Bejegyzés
  • #2950
    7even
    Felhasználó

      Sziasztok!
      Létrehoztam egy tömbkonstanst a munkafüzetemben (pl. dolgozok). Hogyan lehet erre hivatkozni makró subrutinban? Lehet egyáltalán? Egy ciklusba szeretném berakni, hogy végig lépkedjen a tömb elemein(pl. a dolgozók nevein), ami egy feliratszűrőt állítana be egy pivotmező adott oszlopában, majd PDF-be menti külön-külön ahány név van. A PDF működik, meg az egész ha külön bekérem a nevet inputboxba, de egyszerre nem megy sajnos.
      Mert gondolom ez így nem működik:
      Dim tomb as string
      tomb= array (dolgozok)

      De ez sem:

      Dim elem As PivotItem
      For Each elem In ActiveSheet.PivotTables(„Kimutatás1”).PivotFields(„Név”).PivotItems
      ActiveWorkbook.ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, …stb
      Next

      • A témakör módosításra került: 7 years, 8 months telt el-7even.
      #2954
      7even
      Felhasználó

        Röviden és érthetően, annyi lenne a kérdésem, hogy
        1. Lehet-e hivatkozni a munkafüzetben létrehozott tömbökre VBA-ban? Ha igen hogyan?
        2. Hogyan tudom meghatározni, hogy egy adott érték, egy egydimenziós tömbnek hányadik eleme?
        pl: ennek a tömbnek hányadik eleme „Kovács Béla”?

        Dim nevek(1 To 4) As String
        nevek(1) = „Kovács András”
        nevek(2) = „Tóth Zsuzsanna”
        nevek(3) = „Kovács Béla”
        nevek(4) = „Kiss József”

        nev = inputbox („Kérem a nevet!”) ‘Jelen esetben Kovács Béla
        msgbox „nev & „a tömbnek” & ? & „eleme.”

        Előre is nagyon szépen köszönöm!

        #2955
        horvimi
        Adminisztrátor

          Szia!

          Én ezt találtam erre. Kipróbáltam, nekem működött
          Előtte csináltam egy „nevek” nevű tömbkonstanst a névkezelőbe.

          ={"Kovács András";"Tóth Zsuzsanna";"Kovács Béla";"Kiss József"}
          

          A névkezelőből kolvasni egy töb elemeit az Evaluate függvénnyel lehet, ami a szögletes zárójel is egyben.

          Sub get_array_from_named_range()
              Dim arr
              
              arr = [nevek]
              MsgBox (arr(1, 1))
              MsgBox (arr(2, 1))
              
              pos = WorksheetFunction.Match("Kovács András", arr, 0)
              MsgBox pos
          End Sub
          

          Definiáltam egy dinamikus tömböt, majd beleolvastam a „nevek” tartományt
          A tömb egy oszlopos lett, és az elemek egymás alatt, de sor,oszlop indexxel érhetők el úgy, hogy az oszlop index mindig 1-es
          Tehát kiolvasom egy tömbváltozóba a névkonstans tömböt, majd abból kiolvasom az első sor első oszlop elemét, majd a második sor első elemét.

          A tömbben keresni lehet a megvalósított munkalapfügvényekkel is.
          Ezt csinálom a második részben a match függvényel.

          erre gondoltál?

          Imi

          • A hozzászólás módosításra került: 7 years, 8 months telt el-horvimi.
          • A hozzászólás módosításra került: 7 years, 8 months telt el-horvimi.
          #2958
          7even
          Felhasználó

            Igen, erre gondoltam. Mit össze keresetem mindenhol, de sehol nem bukkantam rá. Pedig az Evaluate függvénnyel már dolgoztam is. A Match pedig pofátlanul logikusnak tűnik, mert a legtöbb angol fórumon inkább csak a min és max elemet keresték, de úgy tűnik igazolódni látszik, hogy sok esetben a legegyszerűbb megoldás a legkézenfekvőbb
            Ezer köszönet. Örülök, hogy van ez a fórum. Persze még mindig nem működik valamiért, de nagyon sokat segítettél! Így néz ki egyébként a kis rutinom, aminek nem tetszik sem a nevek.Count, a nevek(i)-nél pedig azt mondja, hogy a tartományon kívül esik:

            Sub ment()

            Dim nevek
            nevek = [dolgozok]
            t = UserForm1.TextBox3.Value ‘ Melyik hónapra szeretnénk a kimutatást? Ha üres, összes hónapra, azaz éves.

            If t <> „” Then

            For i = 1 To nevek.Count
            i = nevek(i)
            ActiveSheet.PivotTables(„Kimutatás1”).PivotFields(„Hónap”).PivotFilters.Add Type:=xlCaptionEquals, Value1:=t
            ActiveSheet.PivotTables(„Kimutatás1”).PivotFields(„Név”).PivotFilters.Add Type:=xlCaptionEquals, Value1:=i
            fname = Left(ActiveWorkbook.Name, 8)
            ChDir („c:\temporary\Munkaidő”)
            ActiveWorkbook.ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
            Filename:=i & ” ” & t & ” ” & fname & ” ” & Date, _
            Quality:=xlQualityStandard, _
            IncludeDocProperties:=True, _
            IgnorePrintAreas:=False, _
            OpenAfterPublish:=False
            ActiveSheet.PivotTables(„Kimutatás1”).PivotFields.ClearAllFilters
            i = WorksheetFunction.Match(i, nevek, 0)
            Next i

            Else

            For i = 1 To nevek.Count
            i = nevek(i)
            ActiveSheet.PivotTables(„Kimutatás1”).PivotFields(„Név”).PivotFilters.Add Type:=xlCaptionEquals, Value1:=i
            fname = Left(ActiveWorkbook.Name, 8)
            ChDir („c:\Users\Andras\Documents”)
            ActiveWorkbook.ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
            Filename:=i & ” ” & „éves” & ” ” & fname & ” ” & Date, _
            Quality:=xlQualityStandard, _
            IncludeDocProperties:=True, _
            IgnorePrintAreas:=False, _
            OpenAfterPublish:=False

            ActiveSheet.PivotTables(„Kimutatás1”).PivotFields(„Név”).ClearAllFilters
            i = WorksheetFunction.Match(i, nevek, 0)
            Next i

            End If

            ActiveSheet.PivotTables(„Kimutatás1”).PivotFields.ClearAllFilters

            End Sub

            • A hozzászólás módosításra került: 7 years, 8 months telt el-7even.
            #2963
            horvimi
            Adminisztrátor

              Ha tömbökkel foglalkozol és keveset tudsz róluk akkor nézz át egy összefoglalót pl. itt
              http://www.cpearson.com/excel/vbaarrays.htm

              A konkrét esetben a tömb számossága vagy elemszáma:
              count=Ubound(nevek)
              És ahogy a fenti válaszban írtam, az elvileg egy oszlopos dinamikus tömböt is két dimenziósként kezeli, aminek az oszlop része mindig 1-es.
              Tehát a nevek(i) nem lesz jó, de jó lesz:

              nevek(i,1)
              

              Imre

              • A hozzászólás módosításra került: 7 years, 8 months telt el-horvimi.
              #2973
              7even
              Felhasználó

                Igen. Köszönöm szépen. Jelzem, most már mindkettő működik, tehát a For ciklus is, hála Neked, illetve a PivotItem-es megoldás is. Azaz most már mindkét módon tudok szűrni, akár tömb elemre hivatkozva akár pivot elemre hivatkozva is.
                Elnézést a sok kínlódásért, de most már megtanultam és természetesen átolvasom az ajánlott forrásodat is.
                Köszönöm!

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