La mia 2 Macro




  • di scossa data: 22/02/2015 19:19:20

    cit. Lisa: "... Dite che è migliorabile?"

    Andando per ordine di istruzioni, il primo suggerimento che mi sento di dare è di dichiarare le variabili in modo coerente al valore che riceveranno.

    Dim tuttifogli As Integer
    .....
    tuttifogli = ThisWorkbook.Sheets.Count

    se leggi l'help della proprietà Count:
    Sheets.Count, proprietà
    Restituisce un valore Long che rappresenta il numero di oggetti dell'insieme.

    puoi vedere che restituisce un Long.
    Dichiarando la variabile as Integer costringi l'interprete VBA a fare una conversione implicita del valore Long ad Integer.


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di Lisa B. data: 22/02/2015 19:37:06

    Purtroppo l'help non mi va.... Devo reinstallare office mi sa....

    Non nego che sono in difficoltà a capire quali valori assegnare... Appunto xche' non ho nulla su cui fare affidamento



  • di alfrimpa data: 22/02/2015 19:43:08

    Ciao Lisa

    Premesso che su questo (ed altri forum) è stato spesso deprecato l'utilizzo di Select e Selection, per le operazioni di copia/incolla è possibile utilizzare la seguente sintassi:

    Range("zona da cui copiare") Destination:= Range("zona su cui incollare").

    Non so quali vantaggi si conseguono con questa seconda forma ma era giusto per dare un contributo

    Alfredo





  • di Vecchio Frac data: 22/02/2015 19:48:25

    Spunti di miglioramento:
    - Reinstalla Excel o meglio solo la sua guida.
    - E se l'utente inserisce un numero minore o uguale a zero quando gli viene chiesto il numero di settimana? (cioè: controllare anche che primofoglio e ultimofoglio siano >= 1).
    - Come effetto collaterale di InputBox, verificare cosa accade se l'utente preme Annulla.
    - Spesso non serve pre-selezionare un range per farci qualcosa, puoi agire direttamente sul range, es. Range("...").Copy

    Comunque se continui così ti meriterai presto il titolo di Esperto... è da un po' che non ne attribuiamo di nuovi ^_^





  • di alfrimpa data: 22/02/2015 19:52:06

    Errata corrige

    Range("zona da cui copiare") Destination:= Range("zona su cui incollare")

    Ovviamente deve essere

    Range("zona da cui copiare").Copy Destination:= Range("zona su cui incollare")

    Alfredo





  • di Lisa B. data: 22/02/2015 19:56:26

    Ho escluso a priori che qualcuno inserisse un numero uguale o minore di zero... Da momento che la settimana 0 o -1non esistino... E al lavoro di solito veniamo sobri

    Ne devo fare ancora prima di passare ad esperto.......



  • di Lisa B. data: 22/02/2015 19:58:05

    L'annulla non l'ho considerato e infatti mi fa errore 13

    Tipo non corrispondente. Ma posso fare solo fine e non debug x capire cosa succede



  • di Lisa B. data: 22/02/2015 20:01:15

    Alvredo... Nin so come applicare il tuo suggerimento dal momento che copio su un file e incollo su un altro file.....



  • di alfrimpa data: 22/02/2015 20:20:38

    Ciao Lisa

    Premesso che non ho mai provato tra file diversi (per cui non so se nel tuo caso il suggerimento sia valido) comunque si dovrebbe poter scrivere:

    Workbooks("Cartel1").Worksheets("Foglio1").Range("A1:C10").Copy Destination:= Workbooks("Cartel2").Worksheets("Foglio1").Range("A1")

    Non ho mai visto l'utilizzo dell'istruzione "Windows" ma questa è una mia ignoranza (e ne ho tante )

    Attendo correzioni e/bastonate

    Alfredo





  • di Lisa B. data: 22/02/2015 20:23:36

    Uff.... Se scrivo....

    Range("AD13:AJ46").Select
    Application.CutCopyMode = False
    Selection.Copy
    Windows("SERV. Settimanali con Mensili - Copia.xls").Activate
    Range("AD13:AJ46").Select
    ActiveSheet.Paste

    Mi fa il copia e incolla...

    Se taglio

    Range("AD13:AJ46").Copy
    Application.CutCopyMode = False
    Windows("SERV. Settimanali con Mensili - Copia.xls").Activate
    Range("AD13:AJ46").Paste

    Da errore.... 438 proprietà o metodo non supportati



  • di alfrimpa data: 22/02/2015 20:56:05

    Ciao Lisa prova così

    Sia chiaro che sono tentativi per imparare.......

    Alfredo
     
    
    Range("AD13:AJ46").Copy Destination:=Windows("SERV. Settimanali con Mensili - Copia.xls").Worksheets("tuofoglio").Range("tuazona")
    
    
    






  • di alfrimpa data: 22/02/2015 20:57:16

    Se non dovesse andare ovviamente usa la tua macro

    Alfredo





  • di alfrimpa data: 22/02/2015 23:48:57

    Domani cerco si provarla anch'io

    Alfredo






  • di scossa data: 23/02/2015 00:06:10

    Lisa, mi viene un dubbio: non è che i due file sono aperti in due istanze separate di Excel (un bel modo per complicarsi la vita)?


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di Lisa B. data: 23/02/2015 00:17:55

    Scossa perdonami.... Che vuol dire???

    Di solito rinominiamo uno.dei due file prima di aprirli entrambi... Altrimenti dice che il.file.è già aperto



  • di lepat (utente non iscritto) data: 23/02/2015 07:21:38

    se apri excel, apri il primo file e poi apri il secondo hai una sola istanza e 2 file aperti
    se apri excel, apri il primo file e poi riapri excel ed apri il secondo hai una 2 istanze ognuna con un file aperto



  • di lepat (utente non iscritto) data: 23/02/2015 07:34:18

    ma non è il tuo caso visto che apri il secondo file tramite macro



  • di lepat (utente non iscritto) data: 23/02/2015 08:08:30

    invece di usare windows e activate io preferisco fare qualcosa del genere eliminando tutti gli activate e select:
    set copia = thisworkbook ' il documento in cui sta la macro
    Set orig = Workbooks.Open(nomedelfile) ' il documento da aprire
    e fare il copia incolla direttamente
    orig.sheets(i).Range("AD13:AJ46").copy copia.sheets(i).Range("AD13:AJ46")



  • di Lisa B. data: 23/02/2015 08:17:15

    Ottimo Lepat...

    Non lo avevo pensato



  • di lepat (utente non iscritto) data: 23/02/2015 09:07:41

    stando attenti alla paternità si può fare quasi tutto senza attivare o selezionare



  • di Lisa B. data: 23/02/2015 09:07:47

    Per togliere le protezioni dei fogli... Aggiungo prima di orig.sheets(i).range..... Copy la stringa origin.sheets(i).unprotect e alla fine protect... Giusto??



  • di lepat (utente non iscritto) data: 23/02/2015 09:30:59

    direi di si, non ho provato, anche io sono un autodidatta come te, ho imparato sui forum



  • di lepat (utente non iscritto) data: 23/02/2015 09:35:57

    dimenticavo, devi dimensionare
    dim orig as workbook, copia as workbook
    altrimenti option explicit si incavola



  • di scossa data: 23/02/2015 10:06:39

    cit. lepat: "stando attenti alla paternità si può fare quasi tutto senza attivare o selezionare "

    A proposito di "paternità", propongo una metafora (che avevo già utilizzato in passato).

    Abbiamo una stanza con dentro una sedia ed una scrivania con alcuni cassetti. Sulla scrivania c'è una tastiera, un mouse, nei cassetti della scrivania ci sono una penna ed una gomma.
    Io ed il mio fedele cagnolino di nome VBA entriamo nella stanza.
    Ora se io dico "VBA, portami la sedia", VBA non avrà alcun problema a portarmi la sedia. Idem se gli dico portami la tastiera.
    Ma se gli dico "VBA, portami la gomma" il povero VBA gira nella stanza come una trottola, ma non trova la gomma e si deprime
    Ma se gli dico "VBA, prendimi la gomma dentro il cassetto della scrivania", ecco che il nostro amico VBA torna scodinzolando con la gomma tra i denti.


    Credo che la metafora abbia bisogno di spiegazioni ben poche spiegazioni: il VBA deve sempre essere messo in grado di capire qual'è l'oggetto a cui ci riferiamo.



    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di Lisa B. data: 23/02/2015 10:21:09



    Bellissima...... Credo che sia un'ottima spiegazione...




  • di Textomb data: 23/02/2015 11:55:45

    ciao Lisa
    hai già i suggerimenti dei migliori esperti in questo forum.
    ma anch'io voglio darti il mio minuscolo contributo.
    Non mi piace molto utilizzare le inputbox. Preferisco utilizzare le userform. Riesci ad avere un controllo migliore dei valori inseriti.
    Oltre ad un interfaccia con l'utente certamente più accattivante.
    In bocca al lupo per i tuoi progressi.



  • di Lisa B. data: 23/02/2015 16:55:04

    Ciao Textbomb... Pienamente d'accordo con te ma ancora non ho familiarizzato bene con le userform...

    La mia più che una soluzione "comoda" è stata una soluzione a portata di mano... Mah... Di certo non mi fermerò qui... Chi si ferma è perduto e io avendo la grande fortuna di avere anche il vostro supporo... Se mi fermassi sarei pure fessa

    Quindi... Avanti tutta!!!!!



  • di Lisa B. data: 23/02/2015 17:00:23

    Sorry... Textomb



  • di alfrimpa data: 23/02/2015 18:05:52

    Ciao Lisa se non lo conosci ti seganalo il seguente link

    h t t p://forum.wintricks.it/showthread.php?t=155252 che tratta abbastanza diffusamante gli argomenti sottoelencati.

    Un saluto

    Alfredo

    Nozioni Generali per Iniziare
    Introduzione al VBA
    Nozioni Generali di VBA

    Editor di Visual Basic
    Ambiente di sviluppo e generatore di macro
    Editor di Visual Basic for Applications
    I Menù dell’Editor di VBA

    Cartella e Foglio di lavoro
    Cartelle di Lavoro: Nozioni di Base
    Metodi e proprietà della cartella di Lavoro
    Gli Eventi nella cartella di lavoro - ThisWorkbook
    Metodi e Proprietà del Foglio di lavoro o WorkSheet
    Gestione degli Eventi nel foglio di lavoro o WorkSheet

    Celle, Righe e Colonne
    Le Colonne in un Foglio di Lavoro
    Le Righe in un Foglio di Lavoro
    Le Celle in un Foglio di Lavoro
    Metodi e Proprietà per gestire le righe del foglio di lavoro
    Range, Cells e Ciclo With
    Approfondimento ed esempi sulla Proprietà Range

    Procedure e Funzioni
    Scrittura di nuove macro e procedure
    Creare e richiamare procedure Sub e Funzioni
    Programmazione ad Oggetti: Metodi e Proprietà
    Passaggio di argomenti alle procedure
    La Funzione MsgBox e InputBox

    Variabili e operatori
    Variabili e tipi di dati: Nozioni di Base
    Approfondimento sulle Variabili e tipi di dati
    Operatori Logici e matematici

    Matrici e cicli decisionali
    Introduzione alle Istruzioni condizionali
    Le Funzioni Condizionali
    Le Selezioni Condizionali
    Prendere decisioni – Ciclo If e Select Case
    Azioni Ripetitive : Il Ciclo For e il ciclo For Each
    Azioni ripetitive : Il Ciclo Do Loop
    Le Matrici - Statiche e Dinamiche
    Gestione degli errori - Metodi e proprietà

    Userform e Controlli
    Introduzione alle Userform
    I Controlli nelle Userform
    Impostazioni delle proprietà dei controlli
    I controlli ListBox e ComboBox
    I Controlli CheckBox, OptionBox e ToggleButton
    I controlli Label, TextBox e CommandButton
    I controlli ScrollBar e SpinButton
    I controlli Frame, Multipage e TabStrip
    Il controllo Image e RafEdit
    Utilizzare il controllo ListView
    Gestire gli input da tastiera in un controllo TextBox

    Manipolare le stringhe
    Funzioni stringa in VBA per l’individuazione e sostituzione del testo
    Funzioni stringa in VBA per dividere, unire e concatenare il testo
    Le Funzioni Empty – ZLS – Null – Nothing e Missing

    Elaborazioni con i File
    Metodi di elaborazione dei file con VBA
    Leggere e scrivere in un file di testo con VBA
    Leggere un File Txt con TextStream
    Oggetto Application – Metodi e Proprietà
    Manipolare File e cartelle con FileSystemObject

    Classi e Metodi in VBA
    Classi, oggetti ed eventi personalizzati
    Esegui macro VBA su un foglio di lavoro protetto
    Il Metodo Find in VBA
    Il Metodo OnTime ed esempi sui colori
    Inviare una e-mail utilizzando un server remoto con CDO

    Laboratorio di VBA: Programmi e file sorgenti








  • di Lisa B. data: 23/02/2015 18:50:07

    WOOOOW...

    Grazie mille... ❤ ❤ ❤ ❤ ❤ ❤ ❤ ❤



  • di Lisa B. data: 24/02/2015 13:33:36

    Raga... Come risolvo l'errore del Inputbox se premo ANNULLA

    Errore di run-time 13 tipo non corrispondente



  • di Textomb data: 24/02/2015 13:50:10

    se premi annulla (ma direi anche se digiti un qualsiasi valore che non sia un numero) ricevi l'errore "Tipo non corrispondente".
    questo perchè hai dichiarato le variabili
    Dim primofoglio As Long
    Dim ultimofoglio As Long
    Quindi il compilatore si aspetta un numero e invece non lo trova...
    In questo caso, dovresti controllare l'errore con l'istruzione
    On error resume next (inserito prima dell'inputbox)
    Quindi, dopo l'inputbox controlli l'eventuale errore con
    if err.number<>0 then msgbox "Il valore inserito non è corretto":Exit sub
    Così, qualora per errore si inserisse nell'input box un valore che non è un numero, esce dalla routine con un messaggio di avviso.



  • di Lisa B. data: 24/02/2015 14:16:41

    Grazie mille della spiegazione Textomb...




  • di Vecchio Frac data: 25/02/2015 10:31:51

    Il codice seguente aspetta un input numerico dall'utente.
    Continua a riproporre l'input box finché non viene inserito un numero (rifiuta caratteri non numerici) e se si preme Annulla oppure Ok senza inserire niente richiede di confermare l'uscita.
     
    Option Explicit
    
    Sub test()
    Dim answer As Variant, redo As Boolean
    
        Do
            redo = False
            answer = InputBox("Inserisci un numero:", "Test Annulla")
        
            If Trim(answer) = "" Then
                If MsgBox("Hai premuto Annulla oppure non hai inserito alcun valore. Vuoi riprovare?", vbQuestion + vbYesNo, "Attenzione") = vbNo Then Exit Sub
                redo = True
            End If
            
            redo = answer Like "[!0-9]*"
        Loop While redo
        
    End Sub






  • di Lisa B. data: 25/02/2015 11:23:31

    Grazie V.Frac... Ottima macro da cui prendere spunti




  • di scossa data: 25/02/2015 13:39:43

    Suggerirei a Lisa di documentarsi anche sul metodo Application.Inputbox che permette di specificare il tipo di input atteso:

    Cito dall'help:

    Nella tabella seguente vengono elencati i valori che è possibile passare nell'argomento Type. Questo argomento può essere un valore o somma di valori. Ad esempio, per una casella di input che accetta sia testo che numeri, impostare Type su 1 + 2.

    Valore Significato
    0 Una formula
    1 Un numero
    2 Del testo (una stringa)
    4 Un valore logico (True o False)
    8 Un riferimento di cella, ad esempio un oggetto Range
    16 Un valore di errore, ad esempio #N/D
    64 Una matrice di valori




    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di Lisa B. data: 25/02/2015 14:28:47

    Ciao V.Frac...

    ho provato la tua macro per "capirla" e... mi sono accorta che se faccio annulla o dgt una lettera, come richiesto mi appare il msgbox "Hai premuto Annulla oppure non hai inserito alcun valore. Vuoi riprovare?"

    Ora... sia che prema no o yes, mi esce dalla macro... come devo fare per far si che rispondendo yes mi riponga la domanda iniziale dell'Inputbox???

    OFF TOPIC...
    Anche voi avete alcune parole evidenziate e passandoci su con il mouse si apre una finestrella qui sul FORUM???



  • di Vecchio Frac data: 25/02/2015 14:58:36

    Strano Lisa, ho provato più volte il mio codice prima di postarlo perchè desse i risultati voluti e in effetti si comporta come dovrebbe.
    Anche adesso se premo annulla esce l'avviso, se digito una lettera mi ripropone l'input box come previsto.
    In caso di avviso, se premo no o yes si comporta correttamente, di sicuro non esce dalla macro.
    Qui sto usando Excel 2010. Ma non è un problema di versione di Excel.

    Non vedo parole evidenziate nel forum a parte quelle che inserisce scossa nei suoi post, e non si aprono finestrelle...





  • di Lisa B. (utente non iscritto) data: 25/02/2015 15:10:29

    Ho riavviato il pc... e anche io non ho piu tutti i pop up che erano presenti prima...

    Però... tornando alla macro... se io volutamente permo una lettera mi ripete anchora la domanda Inserisci un numero:

    se premo "annulla" poi.... sia che premo SI o NO... la macro viene terminata



  • di Vecchio Frac data: 25/02/2015 16:42:30

    Ecco appunto hai messo a nudo un mio errore di progettazione o logica :)
    Quello che si diceva qualche giorno fa.
    Segue correzione.
     
    Option Explicit
    
    Sub test()
    Dim answer As Variant, redo As Boolean
    
        Do
            redo = False
            answer = InputBox("Inserisci un numero:", "Test Annulla")
        
            If Trim(answer) = "" Then
                If MsgBox("Hai premuto Annulla oppure non hai inserito alcun valore. Vuoi riprovare?", vbQuestion + vbYesNo, "Attenzione") = vbNo Then Exit Sub
                redo = True
            Else
                redo = answer Like "[!0-9]*"
            End If
            
        Loop While redo
        
    End Sub
    






  • di Lisa B. data: 25/02/2015 18:28:38

    Ora va...

    e... la cosa più importante è che... son riuscita anche a capire la logica della macro e le modifiche fatte...

    GRAZIE ANCORA UNA VOLTA!!!

    Mi sento di dire... chiudo anche questo capitolo... presto tornerò con nuovi lavoretti