Buon pomeriggio Damiano, spero risponderai ancora a questo post, io neofito di VBA. Il mio caso: in sharepoint (Teams di microsoft, cartella condivisa), ho un file di dati grezzi xlsx (origine) sempre chiuso che viene alimentato in continuo con API dal web. Ho un secondo file di analisi xlsm (destinazione) che apro per consultare i risultati aggiornati, attualmente il copia incolla tra file è manuale. La macro che ti chiedo nel file di analisi xlsm, ossia il file di destinazione, dovrebbe all'apertura importare i dati grezzi presenti in xlsx, ossia il file di origine. Nel foglio del file di destinazione xlsm è presente una tabella che mi estende le formule per tutte le righe necessarie nelle colonne adiacenti alle colonne necessarie per incollare i dati grezzi. Come dovrei procedere? e grazie della disponibilità.
Buongiorno Davide, in questo caso al posto del VBA potresti utilizzare Power Query. Effettui l'importazione da Sharepoint una volta e le volte successive ti limiti ad utilizzare il pulsante aggiorna. Con le macro è più complicato mentre con Power Query puoi utilizzare i comandi dell'interfaccia.
Salve se io invece vorrei fare il contenuto di una cella copiarlo su un altra cella di un foglio diverso dovrei mettere tutte le celle di partenza e poi mettere tutte le celle di destinazione? La cartella di destinazione la devo mettere tra parentesi al posto del numero 1 ? Ciao grazie mille
Salve Giuseppe, per far riferimento ai fogli di lavoro puoi utilizzare i numeri tra parentesi o in alternativa i nomi tra parentesi. Ecco un esempio di codice per fare il copia incolla tra fogli di lavoro Worksheets(1).Range("A1:B10").Copy Worksheets(2).Range("A1") oppure Worksheets("Origine").Range("A1:B10").Copy Worksheets("Destinazione").Range("A1")
Da quel che ho capito questa formula è valida solo se entrambi i file sono aperti, è possibile avere una formula dove il file di origine è aperto e l'altro file è chiuso? Grazie per la disponibilità
Ciao Gabriele, puoi utilizzare la seguente porzione di codice per aprire un file e renderlo invisibile. Workbooks.Open Filename:="C:\Prova\Prova.xlsx" ActiveWindow.Visible = False Workbooks("Prova.xlsx").Close True L'ultima riga di codice ti permette di chiudere il file e salvare le modifiche. Devi adattare il codice alle tue esigenze cambiando i riferimenti al file da aprire.
Grazie per la risposta. il tuo codice funziona bene solo che mi fa sparire definitivamente il foglio aperto e non riesco a renderlo visibile nemmeno modificando il codice con "ActiveWindow.visibile=true". Avresti una soluzione. Grazie della disponibilità
Prova ad eseguire il codice passo dopo passo utilizzando il tasto funzione F8 In questo modo riesci a capire i singoli passaggi. Dai un occhiata a questo articolo: www.excelpertutti.com/eseguire-macro-passo-a-passo-excel/
Salve Felice, la prossima volta presterò più attenzione per lo zoom. Ti scrivo di seguito il codice utilizzato qualora non fosse chiaro: Sub CopiaDatiTraCartelle ThisWorkbook.Worksheets(1).Range("A1:B13").Copy _ Workbooks(2).Worksheets(1).Range("A1") End Sub Saluti Damiano
Ciao Damiano, utilizzo questa macro in un foglio xlsm per copiare dei dati di vari file xlsx in una cartella specifica. Tutto bene nel senso che il file funziona correttamente prelevando da tutti i file i dati dalla cella B1 alla cella B10 creando un database. L'unico dato che salta è quello della cella B11 che nonostante le mille prove non riesco a far copiare correttamente: posto il codice nella speranza che tu possa capire l'errore: Riepilogo cosa fa la macro: 1. da una macro nel file xlsm preleva da ogni file xlsx presente nella cartella i dati dalla cella B1 alla cella B11 creando per ognuno una riga di database nel file xlsm 2. prende tutti i file di cui ha copiato i dati e li sposta in un altra cartella Cosa non funziona: 1. L'unico dato che non viene prelevato nel file xlsm è la cella B11 dei file xlsx (per il resto funziona tutto) Questa la Macro che uso: Option Explicit Sub esporta_e_muovi() Const folder_from = "Z:\Altri computer\Il mio computer\Archivio\UFFICO BOOKING\1 PREVENTIVI E VOUCHER\PREVENTIVI EXCEL\*.xlsx" Const folder_to = "Z:\Altri computer\Il mio computer\Archivio\UFFICO BOOKING\1 PREVENTIVI E VOUCHER\PREVENTIVI EXCEL\excel esportati" Dim percorso As String Dim nomeFile As String Dim wbDatabase As Workbook Dim WB As Workbook Dim sh As Worksheet Dim s As String Dim data_preventivo As String Dim uR As Long Dim arr() As Variant Dim j As Long Dim k As Integer Dim g As Integer Dim ei As Object
With Application .Cursor = xlWait .DisplayAlerts = False .ScreenUpdating = False End With Set ei = CreateObject("Scripting.FileSystemObject") Set wbDatabase = ThisWorkbook 'file database percorso = "Z:\Altri computer\Il mio computer\Archivio\UFFICO BOOKING\1 PREVENTIVI E VOUCHER\PREVENTIVI EXCEL\" '''percorso = ThisWorkbook.Path & "\preventivi excel\" '''debug franz nomeFile = Dir(percorso)
Do While nomeFile "" k = ei.GetFolder(percorso).Files.Count g = g + 1 Application.StatusBar = "Avanzamento ... file " & g & "/" & k If nomeFile wbDatabase.Name Then Set WB = Application.Workbooks.Open(percorso & nomeFile) Set sh = WB.Worksheets(1) data_preventivo = Split(sh.Range("N46"))(3) With wbDatabase.Sheets(1) .AutoFilterMode = False uR = .Range("A65535").End(xlUp).Row + 1 .Cells(uR, 1) = IIf(uR = 2, 1, Val(.Cells(uR - 1, 1)) + 1) arr = Application.Transpose(sh.Range("B1:B11")) For j = 11 To 5 Step -1 arr(j) = arr(j - 1) Next arr(4) = Format(data_preventivo, "dd/mm/yyyy") .Range(.Cells(uR, 2), .Cells(uR, 12)) = arr .Cells(uR, "E") = "'" & arr(4) .Cells(uR, "F").NumberFormat = "General" .Cells(uR, "E").HorizontalAlignment = xlRight End With WB.Close False End If nomeFile = Dir Loop 'prepara la stringa di comando per lo spostamento da un folder all'altro s = "cmd.exe /c move /Y ""%1"" ""%2""" s = Replace(s, "%1", folder_from) s = Replace(s, "%2", folder_to)
'questa istruzione esegue il comando di spostamento. Shell s wbDatabase.Save
With Application .Cursor = xlDefault .DisplayAlerts = True .ScreenUpdating = True End With
MsgBox "Dati Importati e File Spostati. File database salvato.", vbInformation, "OK" Application.StatusBar = "" End Sub Spero tu riesca a darmi una mano. Grazie mille
Buongiorno, ti suggerisco un modo per capire il punto di "errore". Nell'interfaccia dell'Editor VBA ... fai un clic all'interno della macro e poi premi il tasto F8. Questo pulsante ti permette di eseguire la macro passo dopo passo. Le scritte del codice vengono evidenziate in giallo. Inoltre se avvicini il puntatore sul testo vedrai il valore assunto dalle variabili. Questo è il metodo che utilizzo per analizzare le macro alla ricerca di errori. Guardando il tuo codice capisco cosa fa ma purtroppo ... non riesco a capire completamente in quanto non ho davanti il file. Spero il mio suggerimento possa essere utile. Saluti Damiano Causale
@@excelpertutti il problema è che errori con f8 non ne rileva perchè la macro va a completamento in modo corretto ma nell'eseguire la macro salta questo dato e non capisco perchè. Nel codice inoltre l'intervallo è corretto B1:B11. Se c'è un modo per mandarti i file e darmi una mano te ne sarei davvero grato
Il tasto F8 è utile anche per capire i valori assunti dalle variabili dichiarate ad inizio codice. Mentre la riga gialla viene evidenziata puoi capire il valore attribuito alla variabile.
Ottimo video! Sarebbe possibile fare una cosa simile ma con un file word come destinazione?
Grazie! Si può fare con un po' più di codice...
Lo metto in lista tra i prossimi video
@excelpertutti grazie mille!
Buon pomeriggio Damiano, spero risponderai ancora a questo post, io neofito di VBA. Il mio caso: in sharepoint (Teams di microsoft, cartella condivisa), ho un file di dati grezzi xlsx (origine) sempre chiuso che viene alimentato in continuo con API dal web. Ho un secondo file di analisi xlsm (destinazione) che apro per consultare i risultati aggiornati, attualmente il copia incolla tra file è manuale. La macro che ti chiedo nel file di analisi xlsm, ossia il file di destinazione, dovrebbe all'apertura importare i dati grezzi presenti in xlsx, ossia il file di origine. Nel foglio del file di destinazione xlsm è presente una tabella che mi estende le formule per tutte le righe necessarie nelle colonne adiacenti alle colonne necessarie per incollare i dati grezzi. Come dovrei procedere? e grazie della disponibilità.
Buongiorno Davide,
in questo caso al posto del VBA potresti utilizzare Power Query.
Effettui l'importazione da Sharepoint una volta e le volte successive ti limiti ad utilizzare il pulsante aggiorna.
Con le macro è più complicato mentre con Power Query puoi utilizzare i comandi dell'interfaccia.
@@excelpertutti mi hai dato una dritta che lavorandoci un po' per trovare la via giusta a sharepoint mi ha risolto TKS
Salve se io invece vorrei fare il contenuto di una cella copiarlo su un altra cella di un foglio diverso dovrei mettere tutte le celle di partenza e poi mettere tutte le celle di destinazione? La cartella di destinazione la devo mettere tra parentesi al posto del numero 1 ? Ciao grazie mille
Salve Giuseppe, per far riferimento ai fogli di lavoro puoi utilizzare i numeri tra parentesi o in alternativa i nomi tra parentesi. Ecco un esempio di codice per fare il copia incolla tra fogli di lavoro
Worksheets(1).Range("A1:B10").Copy Worksheets(2).Range("A1")
oppure
Worksheets("Origine").Range("A1:B10").Copy Worksheets("Destinazione").Range("A1")
Da quel che ho capito questa formula è valida solo se entrambi i file sono aperti, è possibile avere una formula dove il file di origine è aperto e l'altro file è chiuso? Grazie per la disponibilità
Ciao Gabriele,
puoi utilizzare la seguente porzione di codice per aprire un file e renderlo invisibile.
Workbooks.Open Filename:="C:\Prova\Prova.xlsx"
ActiveWindow.Visible = False
Workbooks("Prova.xlsx").Close True
L'ultima riga di codice ti permette di chiudere il file e salvare le modifiche.
Devi adattare il codice alle tue esigenze cambiando i riferimenti al file da aprire.
Grazie per la risposta. il tuo codice funziona bene solo che mi fa sparire definitivamente il foglio aperto e non riesco a renderlo visibile nemmeno modificando il codice con "ActiveWindow.visibile=true". Avresti una soluzione. Grazie della disponibilità
Rimuovi la riga di codice relativa a ActiveWindow.Visible...
@@excelpertutti ho già fatto, volevo comunque aprirlo in modo non visibile.
Prova ad eseguire il codice passo dopo passo utilizzando il tasto funzione F8
In questo modo riesci a capire i singoli passaggi.
Dai un occhiata a questo articolo: www.excelpertutti.com/eseguire-macro-passo-a-passo-excel/
La prossima volta potresti zumare un po' per far capire meglio quello che fai grazie
Salve Felice,
la prossima volta presterò più attenzione per lo zoom.
Ti scrivo di seguito il codice utilizzato qualora non fosse chiaro:
Sub CopiaDatiTraCartelle
ThisWorkbook.Worksheets(1).Range("A1:B13").Copy _
Workbooks(2).Worksheets(1).Range("A1")
End Sub
Saluti
Damiano
@@excelpertutti ok sei stato molto gentile
Ciao Damiano, utilizzo questa macro in un foglio xlsm per copiare dei dati di vari file xlsx in una cartella specifica. Tutto bene nel senso che il file funziona correttamente prelevando da tutti i file i dati dalla cella B1 alla cella B10 creando un database. L'unico dato che salta è quello della cella B11 che nonostante le mille prove non riesco a far copiare correttamente: posto il codice nella speranza che tu possa capire l'errore:
Riepilogo cosa fa la macro:
1. da una macro nel file xlsm preleva da ogni file xlsx presente nella cartella i dati dalla cella B1 alla cella B11 creando per ognuno una riga di database nel file xlsm
2. prende tutti i file di cui ha copiato i dati e li sposta in un altra cartella
Cosa non funziona:
1. L'unico dato che non viene prelevato nel file xlsm è la cella B11 dei file xlsx (per il resto funziona tutto)
Questa la Macro che uso:
Option Explicit
Sub esporta_e_muovi()
Const folder_from = "Z:\Altri computer\Il mio computer\Archivio\UFFICO BOOKING\1 PREVENTIVI E VOUCHER\PREVENTIVI EXCEL\*.xlsx"
Const folder_to = "Z:\Altri computer\Il mio computer\Archivio\UFFICO BOOKING\1 PREVENTIVI E VOUCHER\PREVENTIVI EXCEL\excel esportati"
Dim percorso As String
Dim nomeFile As String
Dim wbDatabase As Workbook
Dim WB As Workbook
Dim sh As Worksheet
Dim s As String
Dim data_preventivo As String
Dim uR As Long
Dim arr() As Variant
Dim j As Long
Dim k As Integer
Dim g As Integer
Dim ei As Object
With Application
.Cursor = xlWait
.DisplayAlerts = False
.ScreenUpdating = False
End With
Set ei = CreateObject("Scripting.FileSystemObject")
Set wbDatabase = ThisWorkbook 'file database
percorso = "Z:\Altri computer\Il mio computer\Archivio\UFFICO BOOKING\1 PREVENTIVI E VOUCHER\PREVENTIVI EXCEL\"
'''percorso = ThisWorkbook.Path & "\preventivi excel\" '''debug franz
nomeFile = Dir(percorso)
Do While nomeFile ""
k = ei.GetFolder(percorso).Files.Count
g = g + 1
Application.StatusBar = "Avanzamento ... file " & g & "/" & k
If nomeFile wbDatabase.Name Then
Set WB = Application.Workbooks.Open(percorso & nomeFile)
Set sh = WB.Worksheets(1)
data_preventivo = Split(sh.Range("N46"))(3)
With wbDatabase.Sheets(1)
.AutoFilterMode = False
uR = .Range("A65535").End(xlUp).Row + 1
.Cells(uR, 1) = IIf(uR = 2, 1, Val(.Cells(uR - 1, 1)) + 1)
arr = Application.Transpose(sh.Range("B1:B11"))
For j = 11 To 5 Step -1
arr(j) = arr(j - 1)
Next
arr(4) = Format(data_preventivo, "dd/mm/yyyy")
.Range(.Cells(uR, 2), .Cells(uR, 12)) = arr
.Cells(uR, "E") = "'" & arr(4)
.Cells(uR, "F").NumberFormat = "General"
.Cells(uR, "E").HorizontalAlignment = xlRight
End With
WB.Close False
End If
nomeFile = Dir
Loop
'prepara la stringa di comando per lo spostamento da un folder all'altro
s = "cmd.exe /c move /Y ""%1"" ""%2"""
s = Replace(s, "%1", folder_from)
s = Replace(s, "%2", folder_to)
'questa istruzione esegue il comando di spostamento.
Shell s
wbDatabase.Save
With Application
.Cursor = xlDefault
.DisplayAlerts = True
.ScreenUpdating = True
End With
MsgBox "Dati Importati e File Spostati. File database salvato.", vbInformation, "OK"
Application.StatusBar = ""
End Sub
Spero tu riesca a darmi una mano. Grazie mille
Buongiorno, ti suggerisco un modo per capire il punto di "errore".
Nell'interfaccia dell'Editor VBA ... fai un clic all'interno della macro e poi premi il tasto F8.
Questo pulsante ti permette di eseguire la macro passo dopo passo.
Le scritte del codice vengono evidenziate in giallo. Inoltre se avvicini il puntatore sul testo vedrai il valore assunto dalle variabili.
Questo è il metodo che utilizzo per analizzare le macro alla ricerca di errori.
Guardando il tuo codice capisco cosa fa ma purtroppo ... non riesco a capire completamente in quanto non ho davanti il file.
Spero il mio suggerimento possa essere utile.
Saluti
Damiano Causale
@@excelpertutti il problema è che errori con f8 non ne rileva perchè la macro va a completamento in modo corretto ma nell'eseguire la macro salta questo dato e non capisco perchè. Nel codice inoltre l'intervallo è corretto B1:B11. Se c'è un modo per mandarti i file e darmi una mano te ne sarei davvero grato
Il tasto F8 è utile anche per capire i valori assunti dalle variabili dichiarate ad inizio codice. Mentre la riga gialla viene evidenziata puoi capire il valore attribuito alla variabile.
@@excelpertutti provato ma nulla, anche perchè non riesco a leggere perfettamente il codice per mancanza di conoscenza su vba