› Sviluppare funzionalita su Microsoft Office con VBA › cancellare parte di una riga
-
AutoreArticoli
-
ciao leggi post 39635
ok, grazie.
scusami tanto ma tra il mio post 39621 ed il post 39635, come detto al post 39637,
mancava solo una )
Ok ho capito funziona pure la tua, non ho notato che mancava una parentesi. SCUSAMI TANTO ma non mi sembra il caso di fare polemiche. Avevate ragione un pò tutti ed ho ringraziato tutti. Che altro devo fare, pagare una marca da bollo come imposta? Mamma mia che pignoleria.
non mi sembra il caso di fare polemiche
scusami tu,
forse la precisione richiesta da Vba nel compilare la sequenza di istruzioni che deve eseguire,
mi porta involontariamente a farne, ma non è mia intenzione fare polemiche.
Inoltre come da post 39618, ho scritto il 39621 da cellulare e mi è scappata la parentesi....
tanimon scusami ma davvero non ho notato la parentesi e comunque all'inizio il mio file non funzionava con nessuno quindi non avrebbe funzionato nemmeno con la tua. Ok anche la tua formula è corretta. Fossi l'ammnistratore del forum cancellerei questo post per intero. Saluti tanimon
Sinceramente mi amareggio quando leggo certe cose. Se ti chiedo di aiutarmi a mettere su una formula ti devo mandare 100 file excel e 100.000 e passa dati metastock? Ho chiesto solo una formula, non serviva tutto questo ambaradan. Saluti
Vabbè, allora, visto che il tuo file funziona da almeno 10 anni, vista l'documentazione che hai messo a nostra disposizione in questo thread, a quel punto (#post-39623) avrei avuto solo due soluzioni, o astenermi dal postare oppure, prima, cercarmi su Wish una sfera di cristallo. Tutto sommato preferisco ancora il mio #post-39636.
Ragazzi, basta polemiche inutili. davvero inutili. Io 10 anni fa ho fatto lavori in vba che ancora oggi non ci credo. ora non ricordo nulla o quasi di vba.
Vorrei in un cella di excel Range("Last_Var") il valore di questa formula scritta in excel, qualcuno me la traduce per favore? "
=100*((INDICE(close;Record)/INDICE(close;Record-1)-1))"
close e record sono due valori presenti sul foglio. Non chiedetemi di postare nulla perchè non è possibile, se qualcuno mi ha capito e mi aiuta lo ringrazio altrimenti grazie lo stesso a tutti. Rollis13 per favore niente polemiche.
Però non dici se "close" è monodimensionale oppure no. E c'è differenza.
A parte che VBA espone l'insieme WorksheetFunction dove trovi tutte le funzioni del foglio, per cui si potrebbe facilmente pensare a qualcosa come WorksheetFunction.Index e tradurre di conseguenza paro paro la formula, a parte questo dicevo io preferirei un approccio più VBistico.
Nel tuo esempio "close" è un range (è una matrice nella formula quindi è un intervallo per VBA), mentre "record" potrebbe essere un nome definito dall'utente oppure una costante letterale oppure una variabile. Supponendo che "close" sia monodimensionale puoi provare le istruzioni seguenti.Se "record" ha un valore fisso o variabile deve essere previamente assegnato un valore in un altro punto del codice:
j = 100 * (( range(close).Cells(record) / range(close).Cells(record-1) -1))Se invece è un range definito allora:
j = 100 * (( range(close).Cells(range(record)) / range(close).Cells(range(record)-1) -1))In entrambi i casi, "record" è un numero che identifica la cella numero "record" all'interno dell'intervallo.
E chiaramente visto che "Close" è uno statement di VBA, quindi è una parola riservata, bisogna cambiare nome alla matrice oppure usare la notazione a partentesi quadre.
ciao vecchio frac mi sei mancato.... ascolta sia close che record sono etichette quindi sono due colonne con quei nomi. L'ho copiato pari pari da un vecchio file e non funziona ed io ormai ne so troppo poco, la memoria con l'età inganna. close l'ho usata in 100 file come etichetta e funziona senza problemi. Ora con le nuove informazioni che ti ho dato mi daresti gentilmente la formula corretta. Poi se sei disponibile ne devo fare un'altra uguale e poi se Dio vuole con il vba ho chiuso. Grazie MILLE e bentornato. Le due formule citate danno errore. A te se vuoi posso mandare un piccolo file in cui mettermi le 3 formule che mancano.
vecchio frac hai posta... senza impegno, se puoi, io conto su di te. ciao e grazie a tutti per la partecipazione
vecchio frac hai posta... senza impegno, se puoi, io conto su di te. ciao e grazie a tutti per la partecipazione
Ho visto adesso e ho risposto 😀
Buongiorno a tutti, volevo ringraziare di cuore vecchio frac, persona gentilissima e sempre disponibile, oltre che ovviamente molto competente. Mi è stato di grandissimo aiuto. Grazie amico mio, grazie mille.
Grazie grazie per tutti questi complimenti, non del tutto meritati a dire il vero 🙂
La parte più interessante del lavoretto è consistita in questo: dato un elenco (piuttosto lungo), inserire il valore di ogni cella dell'elenco in una cella precisa di un altro file, la "base", il quale deve poi essere salvato con altro nome, costruito in parte sul contenuto della medesima cella. Il file "base" è un file Excel con attivazione di macro e il file salvato deve conservare questa caratteristica (contiene codice che deve essere eseguito individualmente dal nuovo file).
Un approccio classico suggerisce di leggere cella per cella del file elenco, aprire il file base, modificare la cella di destinazione, salvare con nome (secondo una regola prefissata) mantenendo il formato xlsm, chiudere il file, passare alla cella successiva e ricominciare.
Ho adottato un'altra tecnica, che si rifà al mio articolo sull'utilizzo di ADO (invece che in lettura, in scrittura). Il risultato è quello desiderato, con un incremento di velocità (non devo far aprire ad Excel alcun file) e di prestazioni (il file base contiene una macro auto_open che viene eseguita all'apertura e questo complicava le operazioni).
Lo scheletro delle operazioni è questo: leggo cella per cella del file elenco, copio il file base in altra locazione rinominandolo con la regola prefissata, apro una connessione ADO a questo nuovo file, modifico la cella interessata, chiudo la connessione ADO, passo alla successiva cella dell'elenco. La parte interessante è che nel momento dell'esecuzione del comando di scrittura, il file non ha bisogno di essere "salvato" in modo tradizionale, perchè il dato viene inserito direttamente nel file xlsm. Quindi il file xlsm non viene propriamente aperto e non viene eseguita alcuna macro auto_open.
Option Explicit Sub skeleton() Dim cn As Object Dim s As String dim d as String s = "C:\Users\TestUser\Desktop\base.xlsm" p = "C:\Users\TestUser\Desktop\pippo.xlsm" FileCopy s, d Set cn = CreateObject("ADODB.Connection") cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & s & ";Extended Properties=""Excel 12.0;HDR=Yes;"";" cn.Execute "INSERT INTO [Foglio1$A1:A1] VALUES ('hello world')" cn.Close Set cn = Nothing End SubLa particolarità (di cui mi sono accorto dopo qualche tentativo) è che la cella modificata non è A1 del Foglio1, bensì A2 (perchè la stringa di connessione indica chiaramente che l'elenco ha un'intestazione e quindi è come se parlassimo di un range relativo: la prima cella di dati dell'elenco che ha l'intestazione in A1 è chiaramente A2).
Inoltre ho sperimentato che nel file "base" la cella A2 deve essere vuota altrimenti compare un errore (campo "XXX" non trovato, dove XXX è l'header stesso, cioè A1).HTH 🙂
Grazie grazie per tutti questi complimenti, non del tutto meritati a dire il vero
Perchè non tutti meritati.... hai fatto un lavorone in pochissimo tempo. A me sarebbe servito un mese e non so nemmeno se ci sarei riuscito. I complimenti sono meritatissimi. Grazieeeeeeeeeeeeeeeeeeeee.
-
AutoreArticoli
