Pagina precedente | 1 | Pagina successiva
Vota | Stampa | Notifica email    
Autore

Raddoppio dei dati importati

Ultimo Aggiornamento: 29/04/2019 08:13
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

Doppia estrazione
Ciao bg perche fai fare il ciclo 2 volte, qui

   For fg = 1 To 1


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 [SM=x423051]
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

Re:
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

Inserire codice Identato
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 [SM=x423051]

se ti piace la soluzione sostienici con una DONAZIONE a piacere. Grazie clicca qui
Vota: 15MediaObject5,00312 3
Amministra Discussione: | Chiudi | Sposta | Cancella | Modifica | Notifica email Pagina precedente | 1 | Pagina successiva
Nuova Discussione
 | 
Rispondi
Cerca nel forum
Tag discussione
Discussioni Simili   [vedi tutte]
Feed | Forum | Bacheca | Album | Utenti | Cerca | Login | Registrati | Amministra
Tutti gli orari sono GMT+01:00. Adesso sono le 16:42. Versione: Stampabile | Mobile | Regolamento | Privacy
FreeForumZone [v.6.1] - Copyright © 2000-2024 FFZ srl - www.freeforumzone.com