VBA WorksheetFunction



  • VBA WorksheetFunction
    di vmontal data: 27/02/2014 13:52:14

    Ho sviluppato una procedura con Excel 2003 utilizzando le funzioni EoMonth, EDate; quando ho provato ad eseguila con Excel 2010 ho dovuto inserire "obbligatoriamente" il suffisso WorksheetFunction prima del nome delle funzioni;
    la Sub deve essere seguita su diversi PC in cui posso avere sia Excel 2003 che 2010; volevo risolvere il problema mettendo un controllo sulla versione di Excel (vedi codice), ma nella versione 2010 non mi permette di eseguirla perché il compilatore si blocca prima dell'esecuzione sul pezzo di codice senza il suffisso "WorksheetFunction" e sono costretto a "Remmare" le linee di codice.
    Ovviamente se in Excel 2003 lascio la versione con WorksheetFunction mi va in errore!!! (Errore 438 - Proprietà o metodo non supportate dall'oggetto)
    Vorrei un aiuto su cosa posso fare per avere un codice che possa essere eseguito indifferentemente sia su Excel 2003 che Excel 2010 (e perché no anche oltre)!
     
        If Workbooks(Verifica).Worksheets(4).Range("Versione_Excel").Value = "11.0" Then
        
            MeseA = EoMonth(Now(), -1)
            Mese1 = EDate(Now(), -1)
            Mese2 = EDate(Now(), -2)
            Mese12 = EDate(Now(), -12)
        Else
            MeseA = WorksheetFunction.EoMonth(Now(), -1)
            Mese1 = WorksheetFunction.EDate(Now(), -1)
            Mese2 = WorksheetFunction.EDate(Now(), -2)
            Mese12 = WorksheetFunction.EDate(Now(), -12)
            
        End If



  • di Grograman (utente non iscritto) data: 27/02/2014 14:32:39

    Difficile capire cosa serve da uno stralcio di codice senza variabili valorizzate.



  • di Zer0Kelvin data: 27/02/2014 16:37:59

    Ciao.
    Intanto qualche appunto:
    - per ottenere la versione di Excel, puoi utilizzare 1)
    - WorksheetFunction non è affatto un "suffisso" (prefisso, casomai, visto che va messo prima) ma:
    ---------------------------------------------------------------
    Guida di riferimento per sviluppatori di Excel
    Oggetto WorksheetFunction
    Utilizzato come contenitore per le funzioni del foglio di lavoro di Microsoft Excel che è possibile chiamare da Visual Basic.
    ---------------------------------------------------------------
    un Oggetto che contiene tutte le funzioni lato "Foglio" richiamabili da VBA
    - L'oggetto WorksheetFunction esiste anche in Excel 2003, quindi l'errore non è provocato dall'utilizzo dell'oggetto, ma probabilmente dal fatto, forse, che le stesse funzioni, probabilmente a causa della localizzazione di Excel, hanno nomi diversi.
    - Se devi usare un gran numero di riferimenti ad un oggetto, è meglio usare l'istruzione With NomeOggetto; vedi 2)
     
    1)
    MyAppVersion = Application.Version
    
    2)
    With WorksheetFunction
            Mese1 = .EDate(Now(), -1) ' equivalente a  Mese1 = WorksheetFunction.EDate(Now(), -1)
            Mese2 = .EDate(Now(), -2)
            Mese12 = .EDate(Now(), -12)
            'eccetera
    End With 'WorksheetFunction
    



  • di Zer0Kelvin data: 27/02/2014 16:42:41

    Premesso che non capisco la faccenda dell'errore per WorksheetFunction in Excel 2003, che sarebbe da chiarire, il tuo codice potrebbe essere riscritto così
     
        If Application.Version = "11.0" Then
            MeseA = EoMonth(Now(), -1)
            Mese1 = EDate(Now(), -1)
            Mese2 = EDate(Now(), -2)
            Mese12 = EDate(Now(), -12)
        Else
            With WorksheetFunction
                MeseA = .EoMonth(Now(), -1)
                Mese1 = .EDate(Now(), -1)
                Mese2 = .EDate(Now(), -2)
                Mese12 = .EDate(Now(), -12)
            End With
        End If
    



  • di Vecchio Frac data: 27/02/2014 17:20:26

    Non mi risulta che EoMonth sia disponibile in Excel 2003.
    Per la fine del mese si può usare Dateserial(anno; mese + 1; 0).





  • di vmontal data: 27/02/2014 17:23:10

    Chiarisco meglio (almeno ci provo) a descrivere quale è il mio problema:
    1) Se eseguo il codice cosi come l'ho scritto in Excel 2003 funziona in quanto intercetta la sezione dell'IF in cui le funzioni sono scritte senza il "PREFISSO" WorksheetFunction;
    2) Se provo ad eseguire lo stesso codice in Excel 2010 non riesco neanche ad eseguirlo in quanto già in sede di compilazione il Debug mi ritorna il msg "Sub o Function non definita" su EoMonth nella riga in cui è scritto senza il Prefisso WorksheetFunction.
    3) se provo ad eseguire il codice in Excel 2003 con il Prefisso WorksheetFunction.EoMonth mi da l'errore "438 - Proprietà o metodo non supportate dall'oggetto"

    Per maggiore completezza allego l'intera Sub che fa le seguenti cose:
    Apre un file che contiene un elenco di nominativo con delle date di scelta e revoca;
    in base a queste date calcolo il numero di scelte e revoche in generale e poi suddivise per sesso e per data;
    creo due elenchi (scelte e revoche) dell'ultimo mese e formatto i fogli per la stampa;
    Ho assoluto bisogno che possa funzionare su tutte le versioni di Excel successive al 2003 (compreso) e con Sistema operativo da Windows Xp in poi.

    Grazie per l'aiuto che riceverò!


     
    Public Sub Ordina()
        On Error GoTo Ordina_Error
        
        ActiveSheet.Unprotect
        
        Dim Record, Campi  As Integer
        Dim RevocaM, Revoca1, Revoca2, RevocaA, RevocaT As Integer
        Dim SceltaM, Scelta1, Scelta2, SceltaA, SceltaT As Integer
        Dim Uomini, UnderM, OverM As Integer
        Dim Donne, UnderF, OverF As Integer
        Dim NomeCampo As Variant
        Dim ZonaLavoro As Range
        
        Application.ScreenUpdating = False
        Application.DisplayAlerts = False
        
        Worksheets(4).Activate
        Path = Range("Percorso").Value
        Lista = Range("Lista").Value
        Verifica = Range("Verifica").Value
        
        'Annullo i dati di Scelte e Revoche Precedenti
        For F = 2 To 3
            Workbooks(Verifica).Worksheets(F).Activate
            Righe = WorksheetFunction.CountA(Range("A:A"))
            Colonne = WorksheetFunction.CountA(Range("1:1"))
            Range(Cells(1, 1), Cells(Righe + 1, Colonne + 1)).Select
            With Selection
                .Clear
                .RowHeight = 15
            End With
            Range("A1").Select
        Next F
    
        'Importo la ListaAssistiti
        Workbooks.OpenText FileName:= _
            Path & "" & Lista, Origin:=xlWindows, _
            StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
            ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=False _
            , Space:=False, Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 1), _
            Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 4), Array(7, 1), Array(8, 1), Array(9, 1), _
            Array(10, 4), Array(11, 4), Array(12, 1), Array(13, 1), Array(14, 1), Array(15, 1), Array( _
            16, 1), Array(17, 1)), TrailingMinusNumbers:=True
        
        Workbooks(Lista).Activate
        
        'Verifico il numero dei Record e dei campi
        Record = WorksheetFunction.CountA(Range("A:A"))
        Campi = WorksheetFunction.CountA(Range("1:1"))
        
        Range(Cells(1, 1), Cells(Record, Campi)).Sort Key1:=Range("K2"), Order1:=xlDescending, Header:= _
            xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
            DataOption1:=xlSortNormal
        
        dt_r = Range("K2").Value
          
        'Calcolo le Scelte e le Revoche nei periodi di riferimento
        If Workbooks(Verifica).Worksheets(4).Range("Versione_Excel").Value = "11.0" Then
            
            MeseA = EoMonth(Now(), -1)
            Mese1 = EDate(Now(), -1)
            Mese2 = EDate(Now(), -2)
            Mese12 = EDate(Now(), -12)
            
        Else
        
            MeseA = WorksheetFunction.EoMonth(Now(), -1)
            Mese1 = WorksheetFunction.EDate(Now(), -1)
            Mese2 = WorksheetFunction.EDate(Now(), -2)
            Mese12 = WorksheetFunction.EDate(Now(), -12)
            
        End If
        
        RevocaM = WorksheetFunction.CountIf(Range("K:K"), ">" & MeseA)
        Revoca1 = WorksheetFunction.CountIf(Range("K:K"), ">" & Mese1)
        Revoca2 = WorksheetFunction.CountIf(Range("K:K"), ">" & Mese2)
        RevocaA = WorksheetFunction.CountIf(Range("K:K"), ">" & Mese12)
        RevocaT = WorksheetFunction.CountA(Range("K:K"))
        
        Range(Cells(1, 1), Cells(Record, Campi)).Sort Key1:=Range("J2"), Order1:=xlDescending, Header:= _
            xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
            DataOption1:=xlSortNormal
        
        dt_a = Range("J2").Value
        
        SceltaM = WorksheetFunction.CountIf(Range("J:J"), ">" & MeseA)
        Scelta1 = WorksheetFunction.CountIf(Range("J:J"), ">" & Mese1)
        Scelta2 = WorksheetFunction.CountIf(Range("J:J"), ">" & Mese2)
        SceltaA = WorksheetFunction.CountIf(Range("J:J"), ">" & Mese12)
        SceltaT = WorksheetFunction.CountA(Range("J:J"))
            
        'Creo gli elenchi di Scelte e Revoche
        Workbooks(Lista).Activate
        Range(Cells(1, 1), Cells(Record, Campi)).Sort Key1:=Range("J2"), Order1:=xlAscending, Header:= _
            xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
            DataOption1:=xlSortNormal
    
        InizioS = WorksheetFunction.Match(WorksheetFunction.VLookup(Mese1, Range(Cells(2, 10), Cells(Record, 10)), 1, True), Range(Cells(1, 10), Cells(Record, 10)), 1)
        
        Range("1:1").Copy Destination:=Workbooks(Verifica).Worksheets("Scelte").Range("A1")
        Range(InizioS + 1 & ":" & Record).Copy Destination:=Workbooks(Verifica).Worksheets("Scelte").Range("A2")
                
        Range(Cells(1, 1), Cells(Record, Campi)).Sort Key1:=Range("K2"), Order1:=xlAscending, Header:= _
            xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
            DataOption1:=xlSortNormal
        
        InizioR = WorksheetFunction.Match(WorksheetFunction.VLookup(Mese1, Range(Cells(2, 11), Cells(Record, 11)), 1, True), Range(Cells(1, 11), Cells(Record, 11)), 1)
        
        Range("1:1").Copy Destination:=Workbooks(Verifica).Worksheets("Revoche").Range("A1")
        Range(InizioR + 1 & ":" & RevocaT).Copy Destination:=Workbooks(Verifica).Worksheets("Revoche").Range("A2")
        
        'Elimino le revoche dall'elenco generale
        Range(2 & ":" & RevocaT).Delete xlShiftUp
        
        'Calcolo le statistiche per sesso ed età
        Workbooks(Verifica).Worksheets(1).Activate
        
        If Workbooks(Verifica).Worksheets(4).Range("Versione_Excel").Value = "11.0" Then
            'Under_Data = EDate(Now(), -12 * Range("Under").Value)
            'Over_Data = EDate(Now(), -12 * Range("Over").Value)
        Else
            Under_Data = WorksheetFunction.EDate(Now(), -12 * Range("Under").Value)
            Over_Data = WorksheetFunction.EDate(Now(), -12 * Range("Over").Value)
        End If
        
        Workbooks(Lista).Activate
        Range(Cells(1, 1), Cells(SceltaT - RevocaT, Campi)).Sort _
            Key1:=Range("E2"), Order1:=xlAscending, _
            Key2:=Range("F2"), Order1:=xlAscending, _
            Header:=xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
            DataOption1:=xlSortNormal
        
        Uomini = WorksheetFunction.CountIf(Range("E:E"), "M")
        Donne = WorksheetFunction.CountIf(Range("E:E"), "F")
        
        ActiveWorkbook.Worksheets.Add After:=Worksheets(1)
        ActiveWorkbook.Worksheets(1).Activate
        Range("1:1").Copy Destination:=Workbooks(Lista).Worksheets(2).Range("A1")
        Range(2 & ":" & Donne + 1).Copy Destination:=Workbooks(Lista).Worksheets(2).Range("A2")
        Range(2 & ":" & Donne + 1).Delete xlShiftUp
        
        UnderM = WorksheetFunction.CountIf(Range("F:F"), ">=" & Under_Data)
        OverM = WorksheetFunction.CountIf(Range("F:F"), "<=" & Over_Data)
        
        ActiveWorkbook.Worksheets(2).Activate
        UnderF = WorksheetFunction.CountIf(Range("F:F"), ">=" & Under_Data)
        OverF = WorksheetFunction.CountIf(Range("F:F"), "<=" & Over_Data)
        
        
        With Workbooks(Verifica).Sheets("Scheda")
            .Range("RevocaM").Value = RevocaM
            .Range("Revoca30").Value = Revoca1
            .Range("Revoca60").Value = Revoca2
            .Range("RevocaA").Value = RevocaA
        
            .Range("SceltaM").Value = SceltaM
            .Range("Scelta30").Value = Scelta1
            .Range("Scelta60").Value = Scelta2
            .Range("SceltaA").Value = SceltaA
        
            .Range("DataAGG").Value = Format(WorksheetFunction.Max(dt_a, dt_r), "dd/mm/yyyy")
            .Range("Carico").Value = SceltaT - RevocaT
            
            .Range("Uomini").Value = Uomini
            .Range("Donne").Value = Donne
            .Range("UM").Value = UnderM
            .Range("UF").Value = UnderF
            .Range("OM").Value = OverM
            .Range("OF").Value = OverF
        End With
    
        
        Workbooks(Lista).Close SaveChanges:=False
        
        Workbooks(Verifica).Worksheets(4).Activate
        NrCampi = WorksheetFunction.CountA(Range("A:A"))
        
        'Formatta Il foglio delle Scelte e Revoche
        For F = 2 To 3
        
            Workbooks(Verifica).Worksheets(F).Activate
            Record = WorksheetFunction.CountA(Range("A:A"))
            Campi = WorksheetFunction.CountA(Range("1:1"))
            Set ZonaLavoro = Range(Cells(1, 1), Cells(Record, Campi))
            
            ZonaLavoro.Sort Key1:=Cells(1, 8 + F), Order1:=xlDescending, Header:= _
                xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
                DataOption1:=xlSortNormal
            
            I = 1
            Workbooks(Verifica).Worksheets(4).Activate
            CampiF = WorksheetFunction.CountA(Range("C:C"))
            Do Until Worksheets(F).Cells(1, I).Value = ""
            
                NomeCampo = Worksheets(F).Cells(1, I).Value
                If WorksheetFunction.VLookup(NomeCampo, Worksheets(4).Range(Cells(2, 1), Cells(NrCampi, 3)), 2, False) = "N" Then
                    Worksheets(F).Columns(I).Delete Shift:=xlToLeft
                Else
                    Worksheets(F).Cells(1, I).Value = WorksheetFunction.VLookup(NomeCampo, Worksheets(4).Range(Cells(2, 1), Cells(NrCampi, 3)), 3, False)
                    I = I + 1
                End If
                
            Loop
            
            Workbooks(Verifica).Worksheets(F).Activate
            Range("A1:B1").Merge
            Range(Cells(1, 1), Cells(1, CampiF)).Select
            With Selection
                .Font.Bold = True
                .RowHeight = 25
                .HorizontalAlignment = xlGeneral
                .VerticalAlignment = xlCenter
                .Interior.ColorIndex = 15
                .Interior.Pattern = xlSolid
                .Borders(xlDiagonalDown).LineStyle = xlNone
                .Borders(xlDiagonalUp).LineStyle = xlNone
            End With
            
            With Selection.Borders(xlEdgeLeft)
                .LineStyle = xlContinuous
                .Weight = xlThin
                .ColorIndex = xlAutomatic
            End With
            With Selection.Borders(xlEdgeTop)
                .LineStyle = xlContinuous
                .Weight = xlThin
                .ColorIndex = xlAutomatic
            End With
            With Selection.Borders(xlEdgeBottom)
                .LineStyle = xlContinuous
                .Weight = xlThin
                .ColorIndex = xlAutomatic
            End With
            With Selection.Borders(xlEdgeRight)
                .LineStyle = xlContinuous
                .Weight = xlThin
                .ColorIndex = xlAutomatic
            End With
            With Selection.Borders(xlInsideVertical)
                .LineStyle = xlContinuous
                .Weight = xlThin
                .ColorIndex = xlAutomatic
            End With
    
            Cells.EntireColumn.AutoFit
            Rows(2 & ":" & Record).Select
            
            With Selection
                .RowHeight = 25
                .HorizontalAlignment = xlGeneral
                .VerticalAlignment = xlCenter
            End With
            
            With ActiveSheet.PageSetup
                .PrintTitleRows = "$1:$1"
                .PrintTitleColumns = ""
                .PrintArea = ""
                .LeftHeader = ""
                .CenterHeader = "&""Arial,Grassetto""&12&A"
                .RightHeader = ""
                .LeftFooter = ""
                .CenterFooter = "&P di &N"
                .RightFooter = "Dati Aggiornati al: " & Format(WorksheetFunction.Max(dt_a, dt_r), "dd/mm/yyyy")
                .LeftMargin = Application.InchesToPoints(0.393700787401575)
                .RightMargin = Application.InchesToPoints(0.393700787401575)
                .TopMargin = Application.InchesToPoints(0.984251968503937)
                .BottomMargin = Application.InchesToPoints(0.984251968503937)
                .HeaderMargin = Application.InchesToPoints(0.511811023622047)
                .FooterMargin = Application.InchesToPoints(0.511811023622047)
                .PrintHeadings = False
                .PrintGridlines = True
                .PrintComments = xlPrintNoComments
                '.PrintQuality = 600
                .CenterHorizontally = True
                .CenterVertically = False
                .Orientation = xlLandscape
                .Draft = False
                .PaperSize = xlPaperA4
                .FirstPageNumber = xlAutomatic
                .Order = xlDownThenOver
                .BlackAndWhite = False
                .Zoom = False
                .FitToPagesWide = 1
                .FitToPagesTall = False
                .PrintErrors = xlPrintErrorsDisplayed
            End With
            
            ZonaLavoro.Select
            ActiveWindow.Zoom = True
            Range("A1").Select
            
        Next F
        
        Workbooks(Verifica).Worksheets(1).Activate
        
    
    Ordina_Exit:
        Application.ScreenUpdating = True
        Application.DisplayAlerts = True
        
        ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
        ActiveSheet.EnableSelection = xlUnlockedCells
        Exit Sub
    
    Ordina_Error:
        MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedura Ordina del Modulo Modulo1"
        Resume Ordina_Exit
    End Sub
    



  • di Zer0Kelvin data: 27/02/2014 18:48:15

    Cit:
    ___________________________________________________________________________________________
    Se provo ad eseguire lo stesso codice in Excel 2010 non riesco neanche ad eseguirlo in quanto già in sede di compilazione il Debug mi ritorna il msg "Sub o Function non definita"
    ___________________________________________________________________________________________
    Occorrerebbe vedere su quale riga di codice ti dà questo errore.
    Vista la situazione, sarebbe MOLTO meglio se tu allegassi un file di esempio, privo di eventuali dati sensibili su cui effettuare qualche test.



  • di scossa data: 27/02/2014 20:03:23

    cit. Ze0Kelvin: "Premesso che non capisco la faccenda dell'errore per WorksheetFunction in Excel 2003ì"

    cit. VF: "Non mi risulta che EoMonth sia disponibile in Excel 2003."

    Secondo me: su Excel 2003 ha attivato nel VBA il riferimento a ATPVBAEN (strumenti di analisi vba), mentre in Excel 2010 quelle funzioni sono "native" ...



  • di Vecchio Frac data: 27/02/2014 20:21:53

    Mai vista in Excel 2003 una funzione simile neanche con gli strumenti di analisi attivati.
    Mi sono velocemente documentato e siccome EoMonths ritorna "The number of months before or after start_date.", per questo scopo in Excel 2003 io uso dateadd("m", interval, date).





  • di vmontal data: 27/02/2014 20:23:44

    In Excel 2010 il debug mi da errore alla prima riga in cui è presente la funzione EoMonth (senza il prefisso WorksheetFunction) "Errore di compilazione - Sub o Function non definita"; se Remmo la riga con EoMonth si ferma alla riga successiva in cui è presente la funzione EDate (senza il prefisso WorksheetFunction).

    Ho anche disattivato in Excel 2010 il riferimento a atpvbaen.xls, ma il comportamento è rimasto lo stesso!


     
        If Workbooks(Verifica).Worksheets(4).Range("Versione_Excel").Value = "11.0" Then
            
            MeseA = EoMonth(Now(), -1) ' <=== punto in cui si interrompe il Debug in Excel 2010 (Sub o Function non definita)
            Mese1 = EDate(Now(), -1)
            Mese2 = EDate(Now(), -2)
            Mese12 = EDate(Now(), -12)
            
        Else
        
            MeseA = WorksheetFunction.EoMonth(Now(), -1)
            Mese1 = WorksheetFunction.EDate(Now(), -1)
            Mese2 = WorksheetFunction.EDate(Now(), -2)
            Mese12 = WorksheetFunction.EDate(Now(), -12)



  • di Vecchio Frac data: 27/02/2014 20:35:43

    Ma: Application.EoMonth(Now, 1) e Application.EDate(Now, -1) in XL2010 ti funzionano sì o no?
    Per le diverse versioni su cui fai girare il codice dovresti pensare a qualcosa tipo #If...#Then...#End If.






  • di scossa data: 27/02/2014 20:46:10

    Cit. VF: "Mai vista in Excel 2003 una funzione simile neanche con gli strumenti di analisi attivati."

    Excel 2003
    ----------
    Nela finestra immediata scrivi:

    ?eomonth(date(),1)

    otterrai errore "sub o function non definita"


    Ora nel VBE->strumenti->riferimenti metti la spunta a atpvbaen.xls

    Nella finestra immediata scrivi:

    ?eomonth(date(),1)

    otterrai:
    [GetMacroRegId] 'EOMONTH' <
    [GetMacroRegId] 'EOMONTH' -> '1802043446' >
    41729

    Del resto in Excel 2003 lato celle le funzioni sulle date le hai solo se nei componenti aggiuntivi metti gli "strumenti di analisi"



  • di Vecchio Frac data: 27/02/2014 20:58:34

    No, questa mi mancava :)
    Mi limitavo all'aggiunta, non ai Riferimenti nell'IDE. Per questo non trovavo EoMonth.
    Però questa mi lascia perplesso: " in Excel 2003 lato celle le funzioni sulle date le hai solo se nei componenti aggiuntivi metti gli "strumenti di analisi"
    Ecco ho tolto gli strumenti di analisi ma le funzioni data e ora sul foglio vanno come prima.
    Pazienza ^_^





  • di scossa data: 27/02/2014 21:04:45

    cit. VF: "Ecco ho tolto gli strumenti di analisi ma le funzioni data e ora sul foglio vanno come prima. "

    Scusa, intendevo le funzioni tipo Data.Diff() e company.....



  • di vmontal data: 27/02/2014 21:12:56

    Le funzioni EoMonth() ed EDate() funzionano (con le opportune aggiunte e riferimenti) sia in Excel 2003 che 2010;
    il mio problema è che a livello di codice VBA in Excel 2003 non vuole il prefisso WorksheetFunction ( se lo metto da errore), mentre il 2010 lo vuole obbligatorio ed addirittura il 2010 non compila neanche il codice e si ferma appena arriva alla riga con la funzione EoMonth() senza il prefisso e questo è la ragione per cui inserire un controllo sulla versione IF Application.version()="11.0 THEN EoMonth(.....) ELSE WorksheetFunction.EoMonth(.....) ENDIF non mi risolve il problema.



  • di Vecchio Frac data: 27/02/2014 21:21:09

    cit. "IF Application.version()="11.0 THEN EoMonth(.....) ELSE WorksheetFunction.EoMonth(.....) ENDIF non mi risolve il problema. "
    ---> Infatti io parlavo di #If ... #Then ... #End if, non di If ... End If semplicemente. Si tratta di un'istruzione di compilazione. La puoi vedere nella Guida.
    Avevo un esempio sotto mano proprio in una discussione di pochi giorni fa, era un esempio mi pare del solito Gamberini, solo che adesso non riesco a metterci mano, in cui si verificava la versione del sistema in uso.





  • di Vecchio Frac data: 27/02/2014 21:32:09

    Trovato, ma purtroppo non si applica ad Application.Version :( serve solo a stabilire se la piattaforma è a 32 o 64 bit.
    Un trucco da far gelare il sangue nelle vene è pensare di costruire via codice una sub apposita in funzione della risposta data da Application.Version: far quindi creare a runtime da VBA una sub che viene richiamata al volo e poi magari annientata.
    Oppure utilizzare DateAdd("m", 1, Date) che funziona sicuramente anche su XL2010 :)





  • di vmontal data: 27/02/2014 23:41:45

    Ma come è possibile che una versione di Excel (2010) vuole il WorksheetFunction obbligatorio ed un altra (2003) no? per le stesse funzioni EoMonth() ed EDate() e non so se altre funzioni hanno lo stesso problema.

    Inoltre il 2003 mi compila il codice ed esegue solo la parte corretta in funzione della versione ed il 2010 neanche non compila il codice?





  • di Zer0Kelvin data: 28/02/2014 12:41:41

    CIT:
    __________________________________________________________________________________________________
    il mio problema è che a livello di codice VBA in Excel 2003 non vuole il prefisso WorksheetFunction
    __________________________________________________________________________________________________
    MA come è possibile? in Excel 2003 l'oggetto WorksheetFunction (perchè di un oggetto si tratta) esiste eccome!
    Forse i metodi (Funzioni) si chiamano in maniera diversa?
    Le indagini continuano...



  • di Zer0Kelvin data: 28/02/2014 12:49:13

    Infatti nel 2003 WorksheetFunction.eoMonth non esiste!
    Puoi tagliare la testa al toro utilizzando il suggerimento di V.F. (vigili de fuoco? ) ) e usare
    If ... #Then ... #Else ... #Endif



  • di Zer0Kelvin data: 28/02/2014 23:18:45

    Oppure provando a definire delle funzioni ad Hoc. Io ho provato con
     
    Option Explicit
    
    
    Public Function MyEoMonth(aDate As Date, aMonth As Long) As Date
    Dim GG As Long, MM As Long, AA As Long
        GG = Day(aDate)
        MM = Month(aDate)
        AA = Year(aDate)
        If Abs(aMonth) >= 12 Then
            AA = AA + aMonth  12
            aMonth = aMonth Mod 12
        End If
        MM = MM + aMonth + 1
        If MM < 1 Then
            MM = MM + 12
            AA = AA - 1
        ElseIf MM > 12 Then
            MM = MM - 12
            AA = AA + 1
        End If
        MyEoMonth = DateSerial(AA, MM, 1) - 1
    End Function
    
    Public Function MyEDate(aDate As Date, aMonth As Long) As Date
    Dim GG As Long, MM As Long, AA As Long
        GG = Day(aDate)
        MM = Month(aDate)
        AA = Year(aDate)
        If Abs(aMonth) >= 12 Then
            AA = AA + aMonth  12
            aMonth = aMonth Mod 12
        End If
        MM = MM + aMonth
        If MM < 1 Then
            MM = MM + 12
            AA = AA - 1
        ElseIf MM > 12 Then
            MM = MM - 12
            AA = AA + 1
        End If
        MyEDate = DateSerial(AA, MM, GG)
    End Function
    



  • di vmontal data: 03/03/2014 08:52:01

    Penso proprio che procederò in questo modo; grazie per le funzioni personalizzate!



  • di Zer0Kelvin data: 03/03/2014 15:55:01

    Tieni presente, però, che le ho testate poco, e potrebbero occorrere delle correzioni.