Zavrieť

Porady

Rovnaký záznam z viacerých oblastí

Zdravím,

Potreboval by som napísať VBA funkciu, ktorá by dokázala z niekoľkých oblasí vybrať len také záznamy, ktoré sa nachádzajú v každej oblasti. Oblastí je 1 až n. Veľkosť každej oblasti je 1 až n. Oblasť môže byť aj bez záznamu. Záznamy sú v jednom stĺci na liste pod sebou. Pole čísel určuje počet po sebe idúcich záznamov na liste v oblasti. Pole už mám v premennej. Záznamy nie sú nijak zoradené a ani výstup nemusí byť zoradený.
Príklady v prílohe.
Pravidlá a tipy
  • Každý móže napísať len 1 odpoveď. Neskor mozete svoju odpoveď vylepšiť.
  • Odpoveď má priniesť riešenie na otázku, vyvarujte sa hodnotenia otázky.
  • Odpoveď má byť viac o faktoch ako o názoroch.
Dalšie pravidla a tipy
    Ak potrebujete v otázke niečo upresniť, najskôr sa spýtajte na podrobnosti.
    Koncept slúži na uloženie rozpracovanej odpovede, koncept sa zobrazuje len Vám, až kým ho nezverejníte.
    Ak máte podobnú otázku, založte Novú otázku alebo Súvisiacu otázku.
    ❤ Buďte priateľskí ❤
    Sme súčasťou jednej komunity, ktorá si chce vzájomne pomáhať, rozdieľnosť je vítaná ak neubližuje!
    Usporiadať podľa času

    OnO.ve je offline (nepripojený) OnO.ve

    OnO.ve
    Časť problému vyriešená. Síce neviem či efektívne, ale funguje to.

    Code:
    Public Function SpolocneZaznamy(Oblast1 As Range, Optional Oblast2 As Range) As Variant
        ' vyberie také hodnoty z dvoch oblastí ktoré sa nachádzajú v obidvoch oblastiach minimálne 1x
        ' funkcia napísaná s pomocou knihy: Melanie Dreden, Michael Schwimmer - Excel 2007 VBA - Riešenie 99
        
        Dim colX As New Collection
        Dim col2X As New Collection
        Dim KolekciaHlavna As New Collection
        Dim rngX As Range
        Dim i As Long
        Dim Pole() As Variant
        
        On Error Resume Next
        ' Naplnenie zoznamu z prvej oblasti a
        ' Vylúčenie rovnakých hodnôt v danej oblasti
        For Each rngX In Oblast1
        If rngX.Value <> "" Then
            Err.Clear
            ' Testovanie, či se obsah bunky môže vložit do kolekcie ako klúč
            colX.Add rngX.Value, "X" & rngX.Value
            If Err.Number = 457 Then
                ' Ak sa objaví chyba 457, tak už záznam existuje.
                ' Porovnávanie funguje ako LIKE, nerozlišujú se malé a velké písmená.
            End If
        End If
        Next rngX
        
        If Oblast2 Is Nothing Then
            ReDim Pole(1 To colX.Count)
            For i = 1 To colX.Count
                Pole(i) = colX.item(i)
            Next i
            GoTo Koniec
        Else
            ' Vylúčenie rovnakých hodnôt v druhej oblasti
            For Each rngX In Oblast2
            If rngX.Value <> "" Then
                Err.Clear
                col2X.Add rngX.Value, "X" & rngX.Value
                If Err.Number = 457 Then
                End If
            End If
            Next rngX
            
            ' Do novej kolekcie sa zapíšu len tie záznamy ktoré sa nachádzajú v obidvoch oblastiach minimálne 1x
            For i = 1 To col2X.Count
                Err.Clear
                colX.Add col2X.item(i), "X" & col2X.item(i)
                If Err.Number = 457 Then
                    KolekciaHlavna.Add col2X.item(i), "X" & col2X.item(i)
                End If
            Next i
            ReDim Pole(1 To KolekciaHlavna.Count)
            For i = 1 To KolekciaHlavna.Count
                Pole(i) = KolekciaHlavna.item(i)
            Next i
        End If
    Koniec:
        On Error GoTo 0
        SpolocneZaznamy = Pole()
    End Function

    Rovnaký záznam z viacerých oblastí

    Porady, ktoré by vás mohli zaujímať

    Prihláste sa a sledujte len tie Porady, ktoré Vás zaujímajú.