Funzione TESTO

  • FILE ALLEGATI:    
  • Funzione TESTO di gnellino (Utente non iscritto) data: 10/01/2018 17:56:37 



    Ciao
    sto usando questa funzione

    =TESTO("1/"&MESE(Archivio!C7);"Mmmm")

    per riportare il nome del mese da una data presente in un elenco di date.
    Avrei bisogno di selezionare dall'elenco la prima data dell'anno corrente.

    Nel foglio dove è presente l'elenco delle date (colonna C) ho impostato la colonna B come "=anno"

    come posso fare?
    Riesco senza usare una macro?

    Grazie
  • di marziotullio (Utente non iscritto) data: 10/01/2018 19:49:26 




    allega il file
  • di Marius44 (Utente esperto) data: 11/01/2018 13:12:14 



    Ciao
    prova così:

    =TESTO("1/"&MESE(Archivio!C7);"gg/mmmm")

    Fai sapere. Ciao,
    mario
  • di gnellino (Utente non iscritto) data: 12/01/2018 01:35:14 



    allegato il file
    il foglio dove è presente la formula è "Report"

    chiedo un secondo aiuto.
    Ho un problema con la macro "INVIA" che mi trasporta alcuni dati in "Archivio". se la data della selezione è già presente nell'elenco dell'archivio vorrei che mi sovrascrivesse i dati chiedendo prima conferma con un msgbox.
    Ma nel caso non fosse già presente la data dovrebbe inserirli in una nuova riga.
    La macro scritta non funziona. o mi crea lo stesso una nuova riga oppure blocca il file

  • di Marius44 (Utente esperto) data: 12/01/2018 12:24:31 



    Ciao
    quel codice che hai scritto è ... inguardabile. Perdonami la franchezza. E' ripetitivo e troppo infarcito di .Select pressochè inutili. Quando copi qualcosa e la incolli altrove devi trovare, se possibile, la maniera di farlo con un ciclo non con centinaia di righe.

    1°) il pulsante Invia del Foglio AAA è associato ad una macro che ... non c'è
    2°) veniamo alla macro INVIA del Modulo1
    Inizi il ciclo da 6 a 2000 e poi "vorresti assegnare" dei valori a due variabili con questo codice

    Var1 = ActiveSheet.Cells(6, 4) 'Assegno il valore della cella F2 alla variabile Var1
    Var2 = Sheets("Archivio").Cells(i, 3) 'Assegno il valore della cella B2 alla variabile Var2

    La prima riga può andare perchè va a recuperare la data dal Foglio Inserimento
    ma la seconda riga cosa recupera? i dati incominciano dalla riga 7 e non 6. Quindi Var2 è vuota.

    e non sono andato oltre per la quasi impossibilità a seguire il copia/incolla (chiamiamolo così)

    Consiglio: rivedi con molta attenzione TUTTO IL CODICE e vedi se è possibile impostare dei cicli. Evita tutte quelle righe.

    Ciao,
    Mario
  • di gnellino (Utente non iscritto) data: 12/01/2018 16:08:28 



    Grazie Mario per l'aiuto.

    Lo so che è un po' incasinata la mia macro.
    Mi dai qualche indicazione per semplificare la lunga lista di istruzioni. Posso raggruppare le istruzioni con un range ma essendo una selezione di diverse colonne non posso farne uno unico.

    Scusa, ma sono abbastanza neofita in vba e faccio ancora un po' di casini

    Grazie

    Mattia
  • di Marius44 (Utente esperto) data: 12/01/2018 16:30:21 



    Ciao Mattia
    non volevo essere sgarbato, scusa, ma quel codice

    Non mi dici nulla su quello che ti ho fatto notare! Quel ciclo che hai impostato parte male.
    Mi spiegi passo passo cosa vuoi fare! Dammi un'indicazione di massima e poi si vede.

    Ciao,
    mario
  • di gnellino (Utente non iscritto) data: 12/01/2018 17:51:12 



    Io dovrei copiare praticamente tutti i valori della tabella "INSERIMENTO" e tutti i valori del foglio "DATI"
    portandoli nel foglio archivio e inserendoli nella tabella in modo che si dispongano su una stessa riga.

    il problema è che i dati in archivio vengono inseriti e ordinati secondo la data selezionata in INSERIMENTO
    se io devo archiviare con una data già presente avrei bisogno che i valori della tabella vengano sovrascritti, ma se la data non è presente devono essere inseriti nella prima riga disponibile

    si capisce?
  • di Marius44 (Utente esperto) data: 12/01/2018 22:05:56 



    Ciao
    Ho inserito in VBA un nuovo Modulo (Marius) ed in esso la macro che ti fa il lavoro. Ho associato la macro al pulsante che vedi nel Foglio Archivio. Cliccaci sopra ed ecco fatto.

    Attenzione:
    - sappi che Excel e VBA "odiano" le celle unite se non proprio indispensabili (nel Foglio Dati ho disunito le celle F16, F20 e J16)

    - nel Foglio Dati ho eliminato le colonne superflue per comodità di ciclo nelle celle coi valori. Ho visto che non comporta problemi per eventuali altri calcoli (ma tu controlla).

    Fai sapere. Ciao,
    Mario
  • di gnellino (Utente non iscritto) data: 13/01/2018 10:51:55 



    Perfetto.
    Grazie mille, proprio quello che volevo

    Anche se in realtà non capisco molto la macro

    Ti posso chiedere ancora un aiuto?

    - quando viene trovata una data già presente in archivio è possibile inserire un msgbox che ti chiede conferma per sovrascrivere i dati?

    - è possibile aggiungere allo stesso modo un "copia/incolla" per il foglio AAA verso Archivio_1? sempre nella stessa macro
    io avevo scritto questo passaggio per inserire nell'ultima riga disponibile

    Grazie

    Mattia
     
    Worksheets("Archivio_1").Select
    
    ultima = Range("c" & Rows.Count).End(xlUp).Row
     
        Sheets("AAA").Select
        Range("B4:F41,H4:H41,M4:M41,R4:R41,W4:W41,AB4:AB41,AG4:AG41,AL4:AL41,AQ4:AQ41,AV4:AV41,BA4:BA41").Select
        Selection.Copy
        Worksheets("Archivio_1").Select
        Range("C" & ultima + 2).Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=True
        
        Sheets("INSERIMENTO").Select
        Range("B12:B21").Select
        Selection.Copy
        Worksheets("Archivio_1").Select
        Range("C" & ultima + 7).Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        
        Sheets("AAA").Select
        Range("D2:F2").Select
        Selection.Copy
        Worksheets("Archivio_1").Select
        Range("c" & ultima + 2).Offset(0, -1).Select
        Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
            xlNone, SkipBlanks:=False, Transpose:=True
    
  • di Marius44 (Utente esperto) data: 13/01/2018 12:22:39 



    Ciao Mattia
    nella mia macro, al posto di
    If IsEmpty(rg) Then
    'se la data non è pesente scrive nella prima riga vuota
    rg = uRarc + 1
    End If

    metti quello sotto. Se la data è già presente ti mostra il msgbox e se rispondi SI sovrascrive mentre se rispondi NO esce dalla macro e non fa nulla.

    Per quanto riguarda la tua seconda richiesta non mi sembra che le celle selezionate del Foglio AAA corrispondano alle celle del Foglio Archivio_1. Ti consiglio rivedere.

    Io son pronto ad aiutarti, come hai visto, ma tu qualche tentativo (per imparare) fallo e dimmi dove trovi difficoltà. La macro che hai postato fa quello che t'aspetti? E se la risposta fosse negativa, quale è il punto che non ti quadra?

    Ciao,
    Mario
     
    If Not IsEmpty(rg) Then 'se la data è già presente
        risp = MsgBox("La data " & Format(dat, "dd/mm/yy") & " è già presente." & vbLf & _
            "Vuoi sovrascrivere i dati?", 4 + 32, "Domanda")
        If risp = 7 Then Exit Sub  'risposta NO, esce 
    ElseIf IsEmpty(rg) Then
        'se la data non è pesente scrive nella prima riga vuota
        rg = uRarc + 1
    End If
  • di gnellino (Utente non iscritto) data: 13/01/2018 13:54:28 



    Io provo a farlo ma arrivo a un punto e mi blocco.

    Allora, per scrivere i dati in "Archivio_1" ho aggiunto un WIth alla fine. Mi copia i dati dove e come voglio, ma avrei bisogno la stessa sovrascrittura in casa di data già presente.

    Help please
     
    Sub Transfer()
    '
    Application.ScreenUpdating = False
    Dim dat As Double
    Set sINS = Worksheets("INSERIMENTO")
    Set sDAT = Worksheets("DATI")
    Set sARC = Worksheets("Archivio")
    Set sARC_1 = Worksheets("Archivio_1")
    
    'assume la data dal Foglio Inserimenti
    dat = sINS.Range("D6").Value
    'va in Foglio Archivio e cerca la data
    uRarc = sARC.Cells(Rows.Count, 3).End(xlUp).Row 'ultima riga piena di Archivio
    On Error Resume Next
    rg = Application.WorksheetFunction.Match(dat, sARC.Range("C:C"), 0)
    
    If Not IsEmpty(rg) Then 'se la data è già presente
        risp = MsgBox("La data " & Format(dat, "dd/mm/yy") & " è già presente." & vbLf & _
            "Vuoi sovrascrivere i dati?", 4 + 32, "Domanda")
        If risp = 7 Then Exit Sub  'risposta NO, esce
    ElseIf IsEmpty(rg) Then
        'se la data non è presente scrive nella prima riga vuota
        rg = uRarc + 1
    End If
     
    sARC.Cells(rg, 3) = dat  'scrive la data
    
    With sINS       'dal Foglio INSERIMENTO
        cln = 5 'numero colonna
        For c = 4 To 11  'da A1 ad A8
            If c = 9 Then GoTo nix
            .Range(.Cells(12, c), .Cells(21, c)).Copy
            sARC.Cells(rg, cln).PasteSpecial Paste:=xlValues, Transpose:=True
            cln = cln + 10
    nix:
        Next c
        
        cln = 75    'numero colonna
        .Range(.Cells(12, c), .Cells(17, c)).Copy     'da L12 a L17
        sARC.Cells(rg, cln).PasteSpecial Paste:=xlValues, Transpose:=True
        
        cln = 81    'numero colonna
        .Range(.Cells(24, 4), .Cells(24, 8)).Copy     'da D24 a H24
        sARC.Cells(rg, cln).PasteSpecial Paste:=xlValues
    End With
    
    With sDAT       'dal Foglio DATI
        cln = 86
        .Range(.Cells(7, 2), .Cells(7, 6)).Copy     'da B7 a F7
        sARC.Cells(rg, cln).PasteSpecial Paste:=xlValues
        
        cln = 91
        .Range(.Cells(7, 8), .Cells(7, 15)).Copy     'da H7 a O7
        sARC.Cells(rg, cln).PasteSpecial Paste:=xlValues
        
        cln = 99
        .Range(.Cells(8, 10), .Cells(8, 13)).Copy    'da J8 a M8
        sARC.Cells(rg, cln).PasteSpecial Paste:=xlValues
        
        cln = 103
        .Cells(8, 15).Copy    'O8
        sARC.Cells(rg, cln).PasteSpecial Paste:=xlValues
            
        cln = 104
        .Range(.Cells(9, 10), .Cells(9, 13)).Copy    'da J9 a M9
        sARC.Cells(rg, cln).PasteSpecial Paste:=xlValues
        
        cln = 108
        .Cells(8, 15).Copy    'O9
        sARC.Cells(rg, cln).PasteSpecial Paste:=xlValues
        
        cln = 109
        .Range(.Cells(14, 13), .Cells(14, 15)).Copy    'da M14 a O14
        sARC.Cells(rg, cln).PasteSpecial Paste:=xlValues
    
        cln = 112
        For c = 4 To 5  'da A10 ad A11
            .Range(.Cells(14, c), .Cells(23, c)).Copy
            sARC.Cells(rg, cln).PasteSpecial Paste:=xlValues, Transpose:=True
            cln = cln + 10
        Next c
        
        cln = 132
        .Cells(16, 6).Copy    'A12 1°
        sARC.Cells(rg, cln).PasteSpecial Paste:=xlValues
        
        cln = 133
        .Cells(20, 6).Copy    'A12 2°
        sARC.Cells(rg, cln).PasteSpecial Paste:=xlValues
        
        cln = 134
        .Range(.Cells(14, 8), .Cells(19, 8)).Copy    'da H14 a H19
        sARC.Cells(rg, cln).PasteSpecial Paste:=xlValues, Transpose:=True
    
        cln = 140
        .Cells(16, 9).Copy    'D2
        sARC.Cells(rg, cln).PasteSpecial Paste:=xlValues
    End With
    
    
    With sARC_1()
    
    uRarc_1 = sARC_1.Cells(Rows.Count, 2).End(xlUp).Row 'ultima riga piena di Archivio
    On Error Resume Next
    rg = Application.WorksheetFunction.Match(dat, sARC_1.Range("B:B"), 0)
    
    ultima = sARC_1.Range("c" & Rows.Count).End(xlUp).Row
     
        Sheets("AAA").Range("D2:F2").Copy
        sARC_1.Range("B" & ultima + 2).PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
            xlNone, SkipBlanks:=False, Transpose:=True
        
        Sheets("AAA").Range("B4:F41,H4:H41,M4:M41,R4:R41,W4:W41,AB4:AB41,AG4:AG41,AL4:AL41,AQ4:AQ41,AV4:AV41,BA4:BA41").Copy
        sARC_1.Range("B" & ultima + 2).Offset(0, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=True
        
        sINS.Range("B12:B21").Copy
        sARC_1.Range("B" & ultima + 7).Offset(0, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        
    End With
    
    Application.ScreenUpdating = True
    
    
    Set sINS = Nothing
    Set sDAT = Nothing
    Set sARC = Nothing
    Set sARC_1 = Nothing
    
    End Sub
    
  • di Marius44 (Utente esperto) data: 13/01/2018 14:51:24 



    Ciao Mattia
    andiamo passo-passo dal tuo inserimento.

    With sARC_1() - perchè quelle doppie parentesi? quando hai dichiarato la variabile non ci sono. Toglile.

    uRarc_1 = sARC_1.Cells(Rows.Count, 2).End(xlUp).Row - trova l'ultima riga piena di Archivio_1 per la col.B

    ' On Error Resume Next - ho messo un apostrofo davanti per farti capire. Mettilo anche tu. Poi spiego.

    rg = Application.WorksheetFunction.Match(dat, sARC_1.Range("B:B"), 0) - individua riga se è presente dat
    Non è del tutto esatta (ricordati che siamo in ambiente With sARC_1) ma può andare

    ultima = sARC_1.Range("c" & Rows.Count).End(xlUp).Row - trova l'ultima riga piena di col.C di sARC_1

    Ora, dove gli stai dicendo: se la data è presente, fai questo; se non è presente fai quest'altro?
    In altre parole devi ripetere il msgbox scritto prima (con le opportune modifiche) anche in questo caso.

    Per quanto attiene l'apostrofo che ti ho detto di mettere davanti a On Error Resume Next ti spiego.
    Quella riga di codice dice ad Excel se trovi un errore non tene curare e passa oltre. Se metti l'apostrofo (e quindi è come se non ci fosse) quando cerca la data e non la trova si blocca.

    Riprova e fai sapere.
    Ciao
  • di gnellino (Utente non iscritto) data: 13/01/2018 18:38:37 



    ho provato a riscrivere il passaggio copiando quanto fatto prima
    riesco a copiare nella prima riga libera.
    se cerco di far sovrascrivere una data presente mi copia in corrispondenza della riga dove è presente la data nel foglio archivio.... perché????
     
    'assume la data dal Foglio Inserimenti
    dat = sINS.Range("D6").Value
    'va in Foglio Archivio_1 e cerca la data
    uRarc_1 = sARC_1.Cells(Rows.Count, 3).End(xlUp).Row 'ultima riga piena di Archivio_1 per colonna B
    On Error Resume Next
    rg_1 = Application.WorksheetFunction.Match(dat, sARC_1.Range("B:B"), 0)
    
    If Not IsEmpty(rg_1) Then 'se la data è già presente
        risp = MsgBox("La data " & Format(dat, "dd/mm/yy") & " è già presente." & vbLf & _
            "Vuoi sovrascrivere Archivio_1?", 4 + 32, "Domanda")
        If risp = 7 Then Exit Sub  'risposta NO, esce
    ElseIf IsEmpty(rg_1) Then
        'se la data non è presente scrive nella prima riga vuota
        rg = uRarc_1 + 2
    End If
    
    sARC_1.Cells(rg, 2) = dat  'scrive la data
    
        cln = 3
           sAAA.Range(sAAA.Cells(4, 2), sAAA.Cells(39, 6)).Copy     'da B4 a F41
        sARC_1.Cells(rg, cln).PasteSpecial Paste:=xlValues, Transpose:=True
        
        cln = 3
        sAAA.Range(sAAA.Cells(4, 8), sAAA.Cells(41, 8)).Copy     'da H4 a H41
        sARC_1.Cells(rg + 5, cln).PasteSpecial Paste:=xlValues, Transpose:=True
        
        cln = 3
        sAAA.Range(sAAA.Cells(4, 13), sAAA.Cells(41, 13)).Copy    'da M4 a M41
        sARC_1.Cells(rg + 6, cln).PasteSpecial Paste:=xlValues, Transpose:=True
        
        cln = 3
        sAAA.Cells(sAAA.Cells(4, 18), sAAA.Cells(41, 18)).Copy    'da R4 a R41
        sARC_1.Cells(rg + 7, cln).PasteSpecial Paste:=xlValues, Transpose:=True
        
        cln = 3
        sAAA.Cells(sAAA.Cells(4, 23), sAAA.Cells(41, 23)).Copy    'da W4 a W41
        sARC_1.Cells(rg + 8, cln).PasteSpecial Paste:=xlValues, Transpose:=True
        
        cln = 3
        sAAA.Cells(sAAA.Cells(4, 28), sAAA.Cells(41, 28)).Copy    'da AB4 a AB41
        sARC_1.Cells(rg + 9, cln).PasteSpecial Paste:=xlValues, Transpose:=True
        
        cln = 3
        sAAA.Cells(sAAA.Cells(4, 33), sAAA.Cells(41, 33)).Copy    'da AG4 a AG41
        sARC_1.Cells(rg + 10, cln).PasteSpecial Paste:=xlValues, Transpose:=True
        
        cln = 3
        sAAA.Cells(sAAA.Cells(4, 38), sAAA.Cells(41, 38)).Copy    'da AL4 a AL41
        sARC_1.Cells(rg + 11, cln).PasteSpecial Paste:=xlValues, Transpose:=True
        
        cln = 3
        sAAA.Cells(sAAA.Cells(4, 43), sAAA.Cells(41, 43)).Copy    'da AQ4 a AQ41
        sARC_1.Cells(rg + 12, cln).PasteSpecial Paste:=xlValues, Transpose:=True
        
        cln = 3
        sAAA.Cells(sAAA.Cells(4, 48), sAAA.Cells(41, 48)).Copy    'da AV4 a AV41
        sARC_1.Cells(rg + 13, cln).PasteSpecial Paste:=xlValues, Transpose:=True
        
        cln = 3
        sAAA.Cells(sAAA.Cells(4, 53), sAAA.Cells(41, 53)).Copy    'da BA4 a BA41
        sARC_1.Cells(rg + 14, cln).PasteSpecial Paste:=xlValues, Transpose:=True
        
        cln = 3
            sINS.Range("B12:B21").Copy 'da B2 a B21
            sARC_1.Cells(rg + 5, cln).PasteSpecial Paste:=xlValues
        
    
  • di Marius44 (Utente esperto) data: 13/01/2018 19:53:46 



    Ciao Mattia
    Non dovrebbe scrivere nel Foglio Archivio perchè hai dichiarato il Foglio dove scrivere con sARC_1 mentre l'altro è sARC
    Noto però questa riga
    rg_1 = Application.WorksheetFunction.Match(dat, sARC_1.Range("B:B"), 0)

    mentre poi tutte le scritture sono con rg
    Rivedi attentamente il codice che hai aggiunto.

    Altre due cose:
    visto che la colonna è sempre uguale quel cln=3, dopo la prima volta dichiarato, lo puoi eliminare nel seguito.
    Studia un modo come comporre uno o più cicli per evitare tutte quelle righe di codice. Guarda come ho fatto io prima.

    A domani. Ciao
    Mario
  • di gnellino (Utente non iscritto) data: 14/01/2018 09:37:28 



    P E R F E T T O
    Ti ringrazio infinitamente.
    mi hai risolto il problema aiutandomi a capire come farlo. Un maestro

    Ti chiedo un ultima consulenza, riprendendo la richiesta iniziale della conversazione.
    Foglio "Report", casella G7, ho inserito questa formula =TESTO("1/"&MESE(Archivio!C7);"Mmmm")
    ma avrei bisogno di inserire il primo mese presente dell'anno in corso.

    Ri-allego il file, così puoi controllare

    Grazie mille

    Mattia
  • di Marius44 (Utente esperto) data: 14/01/2018 12:47:06 



    Ciao Mattia

    Grazie per il maestro ma non lo sono affatto. Ci sono molti frequentatori che ne sanno molto più di me.
    Son contento, comunque, di esserti stato d'aiuto.
    Vediamo se posso aiutarti anche stavolta.

    Prova con questa formula "matriciale" (cioè Ctrl+Shift+Enter) nella cella G7
    =TESTO(INDICE(Archivio!C:C;CONFRONTA(C7;ANNO(Archivio!C:C);0));"mmmm")

    Ciao,
    Mario
  • di gnellino (Utente non iscritto) data: 14/01/2018 13:41:54 



    ho trovato questa soluzione

    =TESTO("1/"&MESE(CERCA.VERT(C7;Archivio!B7:C28;2;0));"Mmmm")
  • di Marius44 (Utente esperto) data: 14/01/2018 17:38:50 



    Ciao
    Ottimo. Va bene anche quella.
    Ciao,
    Mario

    PS - Penso chela discussione sia RISOLTA. Provvedi a spuntare la casella.
  • di gnellino (Utente non iscritto) data: 15/01/2018 01:11:56 



    Si. Direi di aver risolto tutti i miei problemi.

    Grazie mille ancora Mario

  • torna su

Sostieni Excel VBA con una donazione! Con la tua donazione potrai contribuire al mantenimento del servizio.
Le donazioni sono eseguite con PayPal, il modo più facile, comodo e sicuro per pagare online.
Paypal accetta anche carta di credito o carte prepagate.