| | Post: 265 | Registrato il: 13/12/2015
| Città: MILANO | Età: 58 | Utente Junior | 2010 | | OFFLINE | |
|
28/04/2019 09:46 | |
La macro fatta è funzionante ma importa gli stessi dati per ben due volte. Dove ho sbagliato?
PS Mi piacerebbe anche imparare come nel campo F importare esclusivamente "MARE" o "COLLINA" e non tutta la dicitura "STABILIMENTO DI...."
Allego:
DB Lavoratori V001.xlsm -> File destinazione
ELEDIP.xlsx -> File sorgente
Grazie per l'aiuto
BG66
Excel 2010 |
|
| | Post: 1.767 | Registrato il: 10/10/2013
| Città: VICENZA | Età: 69 | Utente Veteran | 365 | | OFFLINE |
|
28/04/2019 10:42 | |
ciao
non mi intendo di vba
ma se vari
Dim uRiga As Long
Dim fg As Integer
For fg = 1 To 2
in
Dim uRiga As Long
Dim fg As Integer
For fg = 1 To 1
funziona.
non è che è meglio azzerare le celle
prima di copiare il file?
|
| | Post: 5.656 | Registrato il: 14/11/2004
| Utente Master | Office 2019 | | OFFLINE |
|
28/04/2019 10:50 | |
Ciao bg perche fai fare il ciclo 2 volte, qui
io ho messo ad 1 il secondo parametro, anche se non capisco quale sia il fatto di girare 2 fogli.
per lo "STABILIMENTO DI" modifica la riga in
.Offset(0, 5).Value = Mid(cella.Offset(0, 15).Value, 16) ' Stabilimento
ti verrà riportato solo Mare o collina.
Ciao By Sal se ti piace la soluzione sostienici con una DONAZIONE a piacere. Grazie clicca qui |
| | Post: 2.198 | Registrato il: 06/04/2013
| Utente Veteran | 2010 | | OFFLINE |
|
28/04/2019 10:55 | |
Ciao
te li importa due volte per via del ciclo For fg = 1 To 2.
La prima volta si trova fg=1 e importa i dati da ELEDIP, la seconda volta, con fg=2, avendo commentato l'istruzione if fg=2 then...., prosegue la macro.
Ora devi chiarire se il ciclo deve essere fatto per entrambi i file esterni oppure no. Se lo devi fare per entrambi va bene così, ma se lo devi fare per uno solo dei file esterni, che bisogno hai di fare il ciclo?
Per quanto riguarda MARE, COLLINA, se è esattamente come hai detto, potresti cercare la parole all'interno della cella da importare e, se trovata scrivere solo quella:
....
If InStr(cella.Offset(0, 15).Value, "MARE") > 0 Then 'Stabilimento
.Offset(0, 5).Value = "MARE"
Else
.Offset(0, 5).Value = "COLLINA"
End If
......
saluti
Domenico
Win 10 - Excel 2016 |
| | Post: 265 | Registrato il: 13/12/2015
| Città: MILANO | Età: 58 | Utente Junior | 2010 | | OFFLINE | |
|
28/04/2019 11:45 | |
[RISOLTO]
Grazie a tutti.
Script finale ( include suggerimenti di tutti!!):
'Option Explicit
Sub EstraiDati()
Dim FileDiPartenza As Workbook
Dim FoglioDiPartenza As Worksheet
Dim PrimaColonnaDellaTabellaDiPartenza As Range
Dim FoglioDiArrivo As Worksheet
Dim PrimaColonnaDellaTabelladiArrivo As Range
Dim StatoDiSicurezza As MsoAutomationSecurity
Dim cella As Range
righe = Cells(Rows.Count, 1).End(xlUp).Row
For i = righe To 3 Step -1
If Selection.Value <> "" Then Selection.EntireRow.Delete
Next i
StatoDiSicurezza = Application.AutomationSecurity
Application.AutomationSecurity = msoAutomationSecurityForceDisable
Set FileDiPartenza = Workbooks.Open(ThisWorkbook.Path & "/ELEDIP.xlsx"
Application.AutomationSecurity = StatoDiSicurezza
Dim uRiga As Long
Dim fg As Integer
For fg = 1 To 1
If fg = 1 Then Set FoglioDiPartenza = FileDiPartenza.Worksheets("ELEDIP")
'If fg = 2 Then Set FoglioDiPartenza = FileDiPartenza.Worksheets("anagrafica (2)")
With FoglioDiPartenza
Set PrimaColonnaDellaTabellaDiPartenza = .Range(.Cells(2, 1).Address, .Cells(.Rows.Count, 1).End(xlUp).Address) 'ex .Range(.Cells(2, 1) End With
With Foglio2
Set PrimaColonnaDellaTabelladiArrivo = .Range(.Cells(2, 1).Address, .Cells(.Rows.Count, 1).End(xlUp).Address)
End With
For Each cella In PrimaColonnaDellaTabellaDiPartenza
If Not LCase(cella.Offset(0, 14).Value) = "no" Then
With PrimaColonnaDellaTabelladiArrivo
With .Cells(.Rows.Count).Offset(1)
.Value = cella.Offset(0, 5).Value 'cognome
.Offset(0, 1).Value = cella.Offset(0, 6).Value 'nome
.Offset(0, 2).Value = cella.Offset(0, 8).Value 'data di nascita
.Offset(0, 3).Value = cella.Offset(0, 7).Value 'CF
.Offset(0, 4).Value = cella.Offset(0, 11).Value 'Sesso
.Offset(0, 5).Value = Mid(cella.Offset(0, 15).Value, 16) ' Stabilimento
'.Offset(0, 6).Value = cella.Offset(0, 14).Value
End With
End With
With Foglio2
Set PrimaColonnaDellaTabelladiArrivo = .Range(.Cells(1, 1).Address, .Cells(.Rows.Count, 1).End(xlUp).Address) End With End If
Next
Next fg
Application.DisplayAlerts = False
FileDiPartenza.Close savechanges:=0
Application.DisplayAlerts = True
Call Metti_Bordi
End Sub
PS Ultimo aiuto: Quale è la DIM giusta per definire righe ??
("righe = Cells(Rows.Count, 1).End(xlUp).Row ").
Al momento, per ovviare, ho disabilitato 'Option Explicit (!!)
@Dodo47: In realtà l'importazione riguarda solo ELEDIP ma ho provato a ripulire lo script incasinandomi e quindi ho preferito lasciare tutto purtroppo ....anche l'errore.
[Modificato da BG66 28/04/2019 12:00] BG66
Excel 2010 |
| | Post: 688 | Registrato il: 24/06/2015
| Città: CATANIA | Età: 80 | Utente Senior | Excel2019 | | OFFLINE |
|
28/04/2019 12:45 | |
Ciao Gene
Quale è la DIM giusta per definire righe ??
Che io sappia righe e colonne sono sempre Long
Ciao,
Mario |
| | Post: 2.199 | Registrato il: 06/04/2013
| Utente Veteran | 2010 | | OFFLINE |
|
28/04/2019 12:46 | |
ciao
la dim è Long (per precauzione in quanto non si sa quante righe devi elaborare, se sei sicuro che non possono essere più di 32.767 va bene anche integer). Cerca in internet excel numeric data type.
Ma a che ti serve il For fg = 1 To 1 e relativo next ??
E' inutile, toglilo
così pue il successivo If....
.....
Dim uRiga As Long
Set FoglioDiPartenza = FileDiPartenza.Worksheets("ELEDIP")
.....
Togli il Next fg
saluti
(ps: non entro nel merito del codice che, per copiare 5-6 celle, è contorto e ridondante.
Sei sicuro che funziona come vuoi? anche la cancellazione iniziale delle celle??
Che ci stanno a fare tutte quelle With...End With??
Perchè non indenti il codice che è illegibile?)
[Modificato da dodo47 28/04/2019 13:35] Domenico
Win 10 - Excel 2016 |
| | Post: 266 | Registrato il: 13/12/2015
| Città: MILANO | Età: 58 | Utente Junior | 2010 | | OFFLINE | |
|
28/04/2019 14:07 | |
Ciao Domenico,
il codice nasce indentato ma quando provo a caricarlo sul form si sballa.
In pratica da sempre quando scrivo sul forum:
1) premo Code
2) mi propone ([TESTO) ma senza una parentesi quadra finale
3) sostituisco la parola TESTO con CODE e aggiungo la parantesi che manca
4) incollo lo script che si presenta tutto su una sola riga
5) vado singolarmente a separarli utilizzando invio per mandarli a capo
6) sostituisco la parola \TESTO con \CODE a chiusura dello script comprendendola tra le parentesi quadre
Pensavo che fosse un limite della piattaforma su cui gira il forum....ma la tua affermazione mi porta a pensare che utilizzo male i tasti (!!??)
Buona domenica a tutti. [Modificato da BG66 28/04/2019 14:27] BG66
Excel 2010 |
| | Post: 2.200 | Registrato il: 06/04/2013
| Utente Veteran | 2010 | | OFFLINE |
|
28/04/2019 16:23 | |
ciao Gene
prova a scrivere manualmente (senza spazi):
[ TESTO ]
qui incolli
le tue
istruzioni
[ / TESTO ]
qui incolli
le tue
istruzioni
saluti
[Modificato da dodo47 28/04/2019 16:30] Domenico
Win 10 - Excel 2016 |
| | Post: 3.746 | Registrato il: 28/06/2011
| Città: AGORDO | Età: 70 | Utente Master | 2013 | | OFFLINE | |
|
28/04/2019 16:50 | |
Ciao a tutti
Se qualche esperto riesce spiegarmi cosa serve "MsoAutomationSecurity". Grazie mille
A parte il VBA scritto nel messaggio ore 11.45 è errato
Stavo pensando al ....For fg = 1 To 2
Forse l'utente avrà la neccessità di copiare dati pure da altri fogli ???
Infatti nel codice esiste pure un FileDiPartenza.Worksheets("anagrafica (2)"
A parte questo, volevo ricordare che alla fine sarebbe meglio disattivare tutti quei SET
Domanda banale, non sarebbe meglio copia/incolla i dati senza usare un ciclo?
Casomai usare alla fine il ciclo For per togliere "STABILIMENTO DI "
Ps. In teoria se premi CODE e ci scrivi VB e premi OK due volte, tra la parentesi chiusa e quella aperta inserisci il codice Option Explicit
Sub EstraiDati_2()
Dim Ur As Long, X As Long
Ur = Range("F" & Rows.Count).End(xlUp).Row
For X = 3 To Ur
Cells(X, 6) = Replace(Cells(X, 6), "STABILIMENTO DI ", "")
Next X
End Sub Excel 2013 |
| | Post: 2.201 | Registrato il: 06/04/2013
| Utente Veteran | 2010 | | OFFLINE |
|
28/04/2019 17:12 | |
raffaele1953, 28/04/2019 16.50:
Ciao a tutti
cosa serve "MsoAutomationSecurity".
https://docs.microsoft.com/it-it/office/vba/api/excel.application.automationsecurity
Essenzialmente per disabilitare le macro in un file che viene aperto tramite codice.
In questo caso è superfluo visto che viene aperto un .xlsx
L'uso corretto è quello esposto nella macro, cioè:
- prima si alimenta una variabile con lo stato di sicurezza di default
- poi si "forza la disabilitazione delle macro"
- quindi si apre il file esterno
- infine si riporta allo stato di default
Il file da aprire è uno solo (vedi in calce a risposta #5).
Domenico
Win 10 - Excel 2016 |
| | Post: 5.657 | Registrato il: 14/11/2004
| Utente Master | Office 2019 | | OFFLINE |
|
29/04/2019 08:13 | |
Ciao Quando si inserisce un codice nel post, lo si seleziona e poi si preme il pulsante "Code" sotto il post, viene proposto "Testo" modificare in "vb" e premere invio 2 volte se non si vuole inserire il titolo della macro.
Ciao By Sal
se ti piace la soluzione sostienici con una DONAZIONE a piacere. Grazie clicca qui |
|
|