Ordine di ricerca



  • Ordine di ricerca
    di Carlet (utente non iscritto) data: 06/07/2016 12:42:32

    Salve a tutti e scusate il disturbo.

    Se io ho le colonne A e B valorizzare per svariate righe, come faccio in una macro che lavora in modalità For Each Cell in Range a specificare di cercare in orizzontale prima che verticale? Ovvero la macro invece che cicalare:
    A1, A2, A3, ... , B1, b2...
    Cerca invece
    A1, B1, A2, B2, A3 ...

    Grazie



  • di cromagno data: 06/07/2016 12:58:54

    Ciao,
    puoi usare il ciclo "For i = n to n+x.....next i"

    esempio:
    per ciclare il range A1:B10, avremo 10 righe per 2 colonne.
    Alle righe assegniamo la variabile "i" e alle colonne la variabile "j".
    Il ciclo diventerebbe come sotto:
     
    Sub Ciclo()
    Dim i As Long, j As Long, valore
    
    For j = 1 To 2
        For i = 1 To 10
            valore = Cells(i, j).Value
        Next i
    Next j
    
    End Sub



  • di Vecchio Frac data: 06/07/2016 14:21:12

    For Each lavora per righe e poi per colonne (è una questione di indici).
    Se vuoi mantenere la "modalità" For Each (frase senza senso ^_^) puoi usare il suggerimento già dato che è analogo a questo, che parimenti usa For Each (ma il discorso non cambia).
     
    Option Explicit
    
    Sub test()
    Dim col As Range, cell As Range
        For Each col In [a1:b5].Columns
            For Each cell In col.Cells
                Debug.Print cell;
            Next
        Next
    End Sub






  • di Carlet (utente non iscritto) data: 06/07/2016 21:34:05

    Grazie delle risposte, proverò ad applicare quel codice.



  • di Vecchio Frac data: 06/07/2016 21:39:41

    Comunque puoi costruirti la tua funzione e utilizzarla per questo scopo.
    Allego una mia piccola funzione, di qualche anno fa, che puoi usare proprio come serve a te.

    Supponendo che in A1:B5 hai i numeri da 1 a dieci, la function si usa così:
    msgbox flatten(range("A1:B5"), bycol:=True)

    e ti restituisce correttamente "12345678910".

    Se questa function la metti in un modulo, puoi anche richiamarla direttamente in una cella del foglio di lavoro:
    =FLATTEN(A1:B5;;VERO)
     
    Option Explicit
    
    Function flatten(ByVal r As Range, Optional delimiter As String = "", _
    Optional bycol As Boolean = False) As String
    'appiattisce un range riga per riga e restituisce una stringa
    '(solo celle non vuote) 
    'si può specificare un delimitatore tra i
    'diversi valori e se si specifica "bycol:=True", l'appiattimento è
    'effettuato riga per riga invece che colonna per colonna
    Dim vect() As Variant, v As Variant, i As Integer, s As String
    Dim col As Range
        
        If bycol Then
            s = ""
            For Each col In r.Columns
                s = s & Join(Application.Transpose(col), delimiter)
            Next
            flatten = s
        Else
            ReDim vect(0 To r.Cells.Count - 1)
            For Each v In r.Cells
                vect(i) = v
                i = i + 1
            Next
        
            flatten = Join(vect, delimiter)
        End If
    End Function