› Sviluppare funzionalita su Microsoft Office con VBA › With – End with
-
AutoreArticoli
-
"... perché l'oggetto Selection è un oggetto speciale di tipo range di cui ne eredità metodi e proprietà (come Autofill) ..."
VF ma dove posso leggere tutto questo? Un link ...
" ... perchè l'oggetto Selection è un oggetto speciale di tipo range di cui ne eredità metodi e proprietà (come Autofill)..."
Ma dove è possibile leggere tutto questo? ...
mi aspettavo un commento da parte tua
LOL, hai ragione... eccolo qui:
"bè, detto da patel, che storicamente e notoriamente non utilizza questa direttiva per pigrizia, trovo la precisazione estremamente pertinente e utile" 😀
sei troppo impegnato ?
Sì, non è che sono impegnato in VBA ultimamente, ma ho qualche problema in famiglia da risolvere. I miei genitori sono molto anziani con problemi di salute e hanno bisogno di presenza e cure in questo periodo, più del solito.
dove posso leggere tutto questo? Un link
Non sono in grado di darti "un link" in particolare. Quello che conosco l'ho appreso negli anni, confrontandomi in un forum specializzato all'inizio, dove ho trovato gente paziente che mi ha regalato la sapienza che mi mancava. Esperienza, libri, forum, poi certamente spulciare codice di qua e di là... questo è il mio bagaglio (e non sono certamente tra i più esperti, anzi ogni giorno imparo qualcosa). Un posto famoso da cui apprendere è certamente Stackoverflow. C'è dentro di tutto e bisogna saperlo leggere con un certo discrimine. Poi sai, la teoria è utile fino a un certo punto (le basi sono sempre importanti), poi però bisogna essere produttivi: e via a tentativi 🙂
"... dove ho trovato gente paziente che mi ha regalato la sapienza che mi mancava ..."
eh! ... come sto facendo io con voi ...
Vi scrivo e correggo il programma in base alle Vostre risposte ...
Il programma funziona, ma il codice fa schifo, come ha detto giustamente non so chi di voi.
Il programma funziona, ma il codice fa schifo
Il primo obiettivo di solito è produrre codice funzionante. Anche perchè si ha uno scopo da raggiungere e lo si vuole raggiungere in fretta. Poi, dopo un po' di tempo, giorni, settimane, si ritorna indietro e si cerca di ottimizzare, riscrivere, migliorare: è così che ci si acquista il proprio stile, e si trova la tecnica giusta. Nessun codice fa veramente schifo (a parte quello che produce il registratore di macro), tutto è certamente migliorabile, però riconosco la frase, è certamente mia 😛
Altro consiglio: farcisci il tuo codice di commenti. A cosa ti è servita una routine, perchè hai usato una funzione invece di un'altra, i dubbi che hai, i "todo" da fare in seguito, il significato di una proprietà, e descrivi le variabili in modo comprensibile... a distanza di mesi non ti ricorderai che la metà degli scopi iniziali credimi 🙂
All'inizio si impara dal registratore di macro e quindi si produce codice schifoso, ma cercando in rete si possono trovare molti esempi ben fatti e piano piano si impara.
Come hai potuto vedere per chi ha voglia di imparare c'è piena disponibilità da parte di tutti, ma non capita spesso, i più vogliono la soluzione senza cercare neppure di capirla.
Grazie Vecchio Frac e grazie Patel, condivido pienamente quello che avete scritto e vi ringrazio. E' vero siete molto disponibili (a volte mi sono detto "ora si stufano e non mi rispondono più ..." e invece ... eccoci ancora qui). Grazie, veramente l'aiuto del forum è insostituibile, perché è puntuale: su quell'istruzione lì, e la soluzione spesso getta una luce ben oltre il problema contingente. Certo purché dall'altra parte ci siano persone, veramente pazienti e veramente disponibili come voi.
Siete veramente impagabili! Grazie ancora, a prestissimo e ora continuiamo a lavorare ...
Allora, istruzione:
AA.Rows(RIG) = AA.Rows(411)
Mi copia (come immaginavo) solo i "valori" della riga 411, ma io voglio copiare "tutto": formati, valori, formule ...
Ho cercato nei manuali on-line, ma non ho trovato la risposta. Come posso fare?
e poi che differenza c'he fra usare Row e Rows?
Grazie carissimi!
La forma che hai usato serve soltanto per copiare i valori, per copiare tutto devi usare copy
AA.Rows(411).Copy AA.Rows(RIG)
Comunque copiare una intera riga lunghissima per copiare poche celle non credo sia molto consigliato
ok ,funziona. E corretto cosi:
AA.Range("A411:EZ411").Copy AA.Range("A" & RIG & ":EZ" & RIG)
Grazie (anche di domenica sera ...)
avanti ...
che differenza c'è fra usare Row e Rows?
Row è una proprietà di un oggetto Range e restituisce un intero lungo: il numero di riga di dove trovasi tale range: Cells(5, "A").Row = 5.
Rows è l'insieme delle righe di un oggetto range, a sua volta è un oggetto di tipo range: Range("A1:A10").Rows.Count = 10.
E corretto cosi:
Sì, è corretto. Ma anche:
'ricopia A411:EZ411 a partire da A1 AA.Range("A411:EZ411").Copy AA.Range("A1")
Cioè, senza preoccuparti di specificare la riga di destinazione (non ti serve RIG). Naturalmente potresti sovrascrivere qualcosa di esistente, perciò occhio a copiare 🙂
ok, capito tutto e applicato.
Ora ho questa matassa, indecente, di istruzioni:
Windows("ORDINE.xls").Activate Sheets("Foglio1").Select ActiveWorkbook.SaveAs Filename:= _ PERCORSOX & "ORDINE_PROG.xls" _ , FileFormat:=xlNormal, Password:="", WriteResPassword:="", _ ReadOnlyRecommended:=False, CreateBackup:=False Windows("ORDINE_PROG.xls").Activate ActiveWindow.Close savechanges:=False
la semplificherei così:
Workbooks("ORDINE.xls").SaveAs Filename:= _ PERCORSOX & "ORDINE_PROG.xls" _ , FileFormat:=xlNormal, Password:="", WriteResPassword:="", _ ReadOnlyRecommended:=False, CreateBackup:=False Workbooks("ORDINE_PROG.xls").Close savechanges:=False
Ma tutto quello che il registratore ha messo dopo SaveAs Filename serve tutto?
Eh si Patel, VF è distratto o impegnato gli è scappato anche un
a spendere qualche micron per convertire.
Mischiando tempo con lunghezza....
Ma dai .... non è da te , il maestro....
Ciao a tutti Luca
Mischiando tempo con lunghezza
Leggasi microsecondo. Comunque dai, il tempo e lo spazio sono legati, o no?
Del resto 30 cm sono più o meno un nanosecondo luce (1 miliardesimo di secondo). A me piace molto l'immagine di quel tizio che girava con una fettuccina di trenta cm in tasca mostrandola per far vedere di tenere in mano un nanosecondo
AA.Range("EA6:EA7") = AA.Range("M6:M7").Value
in M6 e in M7 ci sono due date. Bene.
Dopo l'istruzione, in EA6 e in EA7 ci sono sì le due date di M6 e M7, ma con il GG e il MM scambiati.
???
Sembra, che spezzando l'istruzione in due istruzioni, una per EA6/M6 e l'atra per EA7/M7 funzioni tutto per bene.
???
Avete idea perché possa succedere tutto questo?
Benvenuto nel magico mondo delle date di Excel 🙂
E' un mondo magico perchè è sempre una sorpresa e non puoi prevedere che risultato daranno le istruzioni che manipolano le date... il formato predefinito è quello americano (mm-dd-yyyy) ma se Excel è in italiano cerca di prendere le impostazioni predefinite per la localizzazione (dd-mm-yyyy). Solo che in ambito VBA la priorità è del formato americano, quindi ogni tanto, anche con le istruzioni di conversione, saltano fuori queste cose.
Le celle sono formattate come data? hai messo un formato data normale o personalizzato? comunque ho fatto testè una prova con l'istruzione che hai messo tu e a me funziona correttamente, cioè non scambia giorni e mesi per tutte le celle interessate
Incredibile!
Se aggiungi poi che io programmo in excel su un computer APPLE (dove il problema suddetto non si verifica) e poi trasferisco il progetto su un computer Windows (dove si verifica la disfunzione e già le date, che in origine sono GG/MM/AA diventano, ma non sempre, GG/MM/AAAA), non manca proprio più niente ...
-
AutoreArticoli