matrice due dimensioni



  • matrice due dimensioni
    di rplacanica (utente non iscritto) data: 23/11/2012 11:34:22

    Buongiorno,
    vorrei passae al vba una matrice fissa di 2 colonne da utilizzare in vlookup
    i dati della matrice sono questi (Tipi di movimento di magazzino)
    Tipo Mov signo (+/-)
    11 -1
    20 -1
    40 -1
    43 -1
    52 -1
    53 -1
    54 -1
    56 -1
    60 -1
    62 -1
    64 -1
    71 -1
    72 -1
    91 -1
    25 0
    99 0
    01 1
    10 1
    21 1
    41 1
    44 1
    50 1
    51 1
    55 1
    61 1
    63 1
    65 1
    70 1
    73 1

    la forumla vlook up dovrà quindi restituirmi il valore 1,-1,0 a seconda che il movimento sia di carico , scarico, o da non mov le quantità

    vorrei utilizzarla in una notazione come questa
    Range(Cells(i, 23), Cells(i, 23)) = IIf(InStr(1, vbNullChar & Join(INTERCOMPANY, vbNullChar) & vbNullChar, vbNullChar & Cells(i, 15) _
    & vbNullChar) > 0, "intercompany", "Terzi")

    proposta da vecchio frac per una ricerca su di una matrice unidimensionale

    per coincidenza la colonna da compilare è sempre la W (23), mentre la colonna in cui è contenuto il movimento di magazzino è in cells(i,3)

    se non avessi avuto il problema di due movimenti "0" avrei utilizzato il sistema proposto, caricando solo i movimenti di un segno.

    help needed!!!



  • di Vecchio Frac data: 23/11/2012 15:17:03

    Spieghiamo anche che
    Cells(i, 23) = IIf(InStr(1, vbNullChar & Join(INTERCOMPANY, vbNullChar) & vbNullChar, vbNullChar & Cells(i, 15) & vbNullChar) > 0, "intercompany", "Terzi")

    è un metodo furbetto per cercare un elemento all'interno di un vettore (in questo caso cerca il contenuto della cella (i, 15) nella matrice INTERCOMPANY precedentemente definita nel codice) e restituisce la stirnga "intercompany" se la trova, "terzi" se non la trova.

    Non ho ancora provato ma potrebbe funzionare anche con vettori a due dimensioni, in cui il dato va cercato nell'indice zero e se viene trovato viene restituito l'indice uno dello stesso dato).





  • di Vecchio Frac data: 23/11/2012 15:29:28

    La matrice risiede su foglio? o va inserita nel codice?
    nel primo caso l'assegnazione a variabile è facilissima: se l'elenco risiede in A2:B30
    v = [A2:B30]
    assegna a "v" il contenuto della matrice (a due dimensioni).

    A questo punto è facile verificare che:
    f = worksheetfunction.vlookup(valore_cercato, v, 2)
    restituisce in "f" il valore di segno +/- corrispondente al valore cercato (quindi -1, 0 o 1).

    Nota bene che l'elenco in [A2:B30] deve essere previamente ordinato in modo crescente, dal minore al maggiore.





  • di Vecchio Frac data: 23/11/2012 15:40:23

    Va bene, prima che me lo facciate notare mi correggo da solo:
    l'ultimo Nota bene non serve se specifichiamo 0 come ultimo parametro di VLookup, quindi non serve nemmeno che il range sia ordinato:
    f = worksheetfunction.vlookup(valore_cercato, v, 2, 0)

    ^_^





  • di rplacanica (utente non iscritto) data: 23/11/2012 15:44:35

    Di solito lavoro con cerca.vert con argomento 4 = Falso (non so se sia 1 o 0), mi serve sempre ricercare la corrispondenza esatta.
    Ordinare in senso crescente comunque velocizza molto la ricerca.
    La matrice non risiede sul foglio, ma la vorrei passare come stringa direttamente nel codice (un po' come quella dell'intercompany)
    tks



  • di Vecchio Frac data: 23/11/2012 15:58:17

    Bene, ecco qui un modo semplice secondo i valori che hai passato.
     
    Dim v(1 To 29, 1 To 2) As Integer, i As Integer
        
        For i = 1 To 29
            v(i, 1) = Choose(i, 11, 20, 40, 43, 52, 53, 54, 56, 60, 62, 64, 71, 72, 91, 25, 99, 1, 10, 21, 41, 44, 50, 51, 55, 61, 63, 65, 70, 73)
            v(i, 2) = Choose(i, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
    
        Next






  • di rplacanica (utente non iscritto) data: 04/12/2012 18:11:23

    non avevo visto la risposta!!!!

    ok,
    ora che ho assegnato i valori alla simpatica matrice, come faccio eseguire il cerca vert?

    "=VLookup(rc[-20], ""v"", 2, false)"
    mi riestituisce errore - giustamente - perchè V non è nulla (non è un range) indicare ""v"" corrisponde a cercare il testo "v" e ovviamente non trova nulla.

    Help needed! :)
     
    Dim v(1 To 29, 1 To 2) As Variant, k As Variant
    For k = 1 To 29
    v(k, 1) = Array(k, "11", "20", "40", "43", "52", "53", "54", "56", "60", "62", "64", "71", "72", "91", "25", "99", "01", "10", "21", "41", "44", "50", "51", "55", "61", "63", "65", "70", "73")
    v(k, 2) = Array(k, "-1", "-1", "-1", "-1", "-1", "-1", "-1", "-1", "-1", "-1", "-1", "-1", "-1", "-1", "0", "0", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1")
    
    Next k
    
    Range("w2:w" & LAST_ROW2) = "=VLookup(rc[-20], ""v"", 2, false)"
    
    



  • di Vecchio Frac data: 04/12/2012 21:06:05

    Bè, non è esattamente quel che ho scritto io :)
    e infatti assegnare mediante Array scritto così non è corretto.

    Riprendi in mano il mio codice (e poi perchè trasformare i valori in stringhe? se sono interi lasciali interi, è anche più veloce ^_^) e aggiungi le righe sottostanti che scorrono la colonna W da riga 2 a riga LAST_ROW2 inserendo la formula che tu hai composto. Da testare :)
     
    Dim v(1 To 29, 1 To 2) As Variant, i As Variant
        
        For i = 1 To 29
            v(i, 1) = Choose(i, 11, 20, 40, 43, 52, 53, 54, 56, 60, 62, 64, 71, 72, 91, 25, 99, 1, 10, 21, 41, 44, 50, 51, 55, 61, 63, 65, 70, 73)
            v(i, 2) = Choose(i, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
    
        Next
    
        For j = 2 to LAST_ROW2
            For i = 1 To 29
                If v(i, 1) = cells(j, 3) Then cells(j, 23).formula="=VLookup(rc[-20], " & v(i,1) & ", 2, false)"      '3=colonna C; 23=colonna W; v(i, 2) è il valore da restituire
            Next
        Next






  • di rplacanica (utente non iscritto) data: 05/12/2012 10:05:21

    grazie!
    ho testato ma...


    nelle prima cella compila in quesrto modo

    =CERCA.VERT(C2; 40; 2; FALSO)
    dove 40 è il valore che il codice ha trovato all'interno della matrice e che corrisponde giustamente al calore presente in c2...
    allego il file per vedere se può essere d'aiuto!



  • di Vecchio Frac data: 05/12/2012 20:03:50

    Allora invece di una formula nella cella è meglio impostare direttamente il valore calcolato (comunque deve essere cercato nel vettore).

    Mettiamo in colonna W i diversi valori tra -1, 0 e 1 che corrispondono a quelli recuperati dalla colonna C (quel che non è previsto, però, è quale valore viene inserito nel caso non venga trovata la corrispondenza dei numeri di colonna C con quelli del vettore v).
     
    'Nella sub SEGNO fai questa piccola modifica
    If v(i, 1) = Cells(j, 3) Then Cells(j, 23) = v(i, 2)






  • di rplacanica (utente non iscritto) data: 06/12/2012 08:06:10

    Grazie per la risposta,
    Appena torno in ufficio provo la modifica.
    Valori assenti non possono esserci, le causali di magazzino son bloccate e per crearne due nuove occorre l'intervento del controller.... Che son io.



  • di Vecchio Frac data: 06/12/2012 09:57:06

    cit. " Che son io. "
    ---> LOL, a volte io non mi fido nemmeno di me stesso ^_^





  • di rplacanica (utente non iscritto) data: 06/12/2012 10:55:27



    Vero! Sto andando da babbo natale... Magari gli chiedo qualche regalo per noi italiani...



  • di rplacanica (utente non iscritto) data: 18/12/2012 11:03:22

    Grazie Vecchi Frac,
    funziona benissimo!