Function personale su intero range



  • Function personale su intero range
    di Grograman (utente non iscritto) data: 11/03/2014 12:46:49

    Buongiorno a tutti,
    avrei bisogno di una mano per capire come poter eliminare un ciclo.
    In pratica sto manutenendo un vecchio codice, fatto prima di imparare il metodo “Evaluate” che sto snellendo per renderlo più veloce.
    Tutto ok tranne nel momento in cui mi sono imbattuto in una function personalizzata.
    In pratica data una serie di conti, controllo il numero con il quale iniziano, e li battezzo come attivo/passivo o costi/ricavi.

    Allego un esempio con in colonna A i conti, e per eliminare l’ultimo ciclo mi servirebbe capire come applicare la funzione “Lato_PDC” all’intero range invece che cella per cella!
    Help!


    Grazie anticipatamente


    Allego file "Aiutino Lato PDC.xlsm"
     
    Option Explicit
    
    Sub incapace()
    Dim rngC As Range, cl As Range
    Dim x As Long
    x = Range("A" & Rows.Count).End(xlUp).Row
    Set rngC = Range(Cells(2, 1), Cells(x, 1))
      '''''COME APPLICARE LA FUNZIONE "LATO_PDC" SULL'INTERO RANGE CONTEMPORANEAMENTE?
      For Each cl In rngC
        With cl
          .Offset(0, 1) = Lato_PDC(.Offset(0, 0))
        End With
      Next
    Set rngC = Nothing
    End Sub
    
    
    Public Function Lato_PDC(ByVal Conto As String) As String
      Dim intPDC As Integer
      intPDC = Left(Format(Conto, "000-000-00-0000"), 3)
      Select Case intPDC
        Case 1 To 199
          Lato_PDC = "Attivo"
        Case 200 To 399
          Lato_PDC = "Passivo"
        Case 400 To 414
          Lato_PDC = "Accentrati"
        Case 415 To 423
          Lato_PDC = "Transitori"
        Case 451 To 521
          Lato_PDC = "Conti D'Ordine"
        Case 600 To 799
          Lato_PDC = "Costi"
        Case 800 To 999
          Lato_PDC = "Ricavi"
        Case Else
      End Select
    End Function
    



  • di lepat (utente non iscritto) data: 11/03/2014 13:11:17

    non credo si possa fare, ma sarò lieto di esere smentito



  • di lepat (utente non iscritto) data: 11/03/2014 13:12:08

    essere, non esere



  • di Grograman (utente non iscritto) data: 11/03/2014 13:18:43

    To be or not to be, this is the question!



  • di isy data: 11/03/2014 14:32:57

    Ciao

    Puoi utilizzare questo codice
     
    Sub Con_Array()
      Dim x    As Long, Arr
      Arr = Range("A2:A" & Range("A" & Rows.Count).End(xlUp).Row)
      For x = 1 To UBound(Arr)
        Arr(x, 1) = Lato_PDC(Arr(x, 1))
      Next
      Range("B2").Resize(UBound(Arr)) = Arr
    End Sub



  • di Grograman (utente non iscritto) data: 11/03/2014 14:36:02

    Grazie Isy, ma rimane comunque un ciclo in ballo no?
    Ma tengo presente il suggerimento



  • di isy data: 11/03/2014 14:43:26

    Ciao

    Il ciclo su array è ottimizzato

    Preferisci forse utilizzare una formula in evaluate per eliminare il ciclo?
    Ricordati che con evaluate non puoi superare i 256 caratteri
    Stai pensando ad una formula tipo =Se(A2<= ecc...



  • di scossa data: 11/03/2014 14:59:37

    Ciao,

    il ciclo non puoi eliminarlo.

    Per fare quello che chiedi, devi rendere "matriciale" la tua udf: in pratica deve funzionare scrivendola, lato celle, come una matriciale passandole un range di celle come argomento. In pratica selezioni B2:B1431 premi F2 scrivi =Lato_PDC(A2:A1431) e devi ottenere il giusto risultato.
    Ma per fare questo devi mettere un ciclo nella tua udf, che poi verrebbe chiamata dalla tua sub incapace() come da codice sotto.

    P.S.: non posto subito un possibile codice per rendere la tua udf matriciale, per non toglierti il piacere di provarci da solo
     
    Sub incapace()
      Dim rngC As Range, cl As Range
      Dim x As Long
      x = Range("A" & Rows.Count).End(xlUp).Row
      Set rngC = Range(Cells(2, 1), Cells(x, 1))
      rngC.Offset(0, 1) = Evaluate("Lato_PDC(" & rngC.Address & ")")
      Set rngC = Nothing
    End Sub



  • di Grograman (utente non iscritto) data: 11/03/2014 15:18:33

    @ Isy: No eventualmente avrei usato un cerca.vert con una tabellina che replicasse il select case, ma nonc i avevo pensato


    @Marco: Ci provo, ma non garantisco sopratutto perchè il tempo è risicato e devo prima arrivare al risultato finale



    Che tutto sommato non sta venendo niente male!!



  • di scossa data: 11/03/2014 15:33:13

    @grograman: fammi un fischio se vuoi il codice per la udf



  • di Grograman (utente non iscritto) data: 11/03/2014 15:50:27

    Nonono non voglio la soluzione, eh che davvero in questo momento sono preso sul resto del lavoro (sto creando un andamentale del conto economico come biglietto da visita per un collega della pianificazione strategica che mi fa il filo ) e se mi distraggo perdo la linea guida e mi crolla il castello di carta!!

    Ma come al solito grazie anticipatamente