Discussione:
copiare un foglio di diversi file excel su un unico foglio
(troppo vecchio per rispondere)
maurilloh
2008-06-05 14:25:03 UTC
Permalink
Ciao a tutti!!

Il mio problema è questo: vorrei copiare i dati presenti in diversi
file excel (tutti nel primo foglio), in un unico nuovo file; I file da
copiare si trovano tutti in unica cartella.
Nella mia testa vorrei dire ad Excel:"copia tutti i dati del primo
folgio di ogni file che si trova in questa cartella in questo foglio",
secondo voi è possibile?
dovrebbe venire fuori una cosa del genere:
dati file a
dati file b
ecc..

Grazie in anticipo per l'aiuto.

Ciao!!
Maurizio Borrelli
2008-06-05 16:50:10 UTC
Permalink
Post by maurilloh
vorrei copiare i dati presenti in diversi
file excel (tutti nel primo foglio), in un unico nuovo file; I file da
copiare si trovano tutti in unica cartella.
Nella mia testa vorrei dire ad Excel:"copia tutti i dati del primo
folgio di ogni file che si trova in questa cartella in questo foglio",
secondo voi è possibile?
dati file a
dati file b
ecc..
Ciao maurilloh.

Un modo:

' UnoPerTutti.xls
' ---------------
' Modulo1 - Modulo standard
'
Option Explicit

Public Sub TuttiPerUno()
On Error GoTo ErrorHandler
Const cWbExt = "*.xls"
Const cWshIndex = 1
Dim strPathSep As String
Dim strPathName As String
Dim strMyName As String
Dim strFilename As String
Dim wbIn As Excel.Workbook
Dim wshIn As Excel.Worksheet
Dim wshOut As Excel.Worksheet
Dim rngOut As Excel.Range

With Application
.ScreenUpdating = False
.DisplayAlerts = False
strPathSep = .PathSeparator
With .ThisWorkbook
strPathName = .Path
strMyName = .Name
With .Worksheets
Set wshOut = .Add(Before:=.Item(1))
End With
End With
End With
If Right$(strPathName, 1) <> strPathSep Then
strPathName = strPathName & strPathSep
End If
strPathName = strPathName
strFilename = Dir(strPathName & cWbExt, vbNormal)
Do While Len(strFilename)
If strFilename <> strMyName Then
'Debug.Print strFilename
Set wbIn = Workbooks.Open(strPathName & strFilename _
, ReadOnly:=True _
, AddToMru:=False)
'Debug.Print , wbIn.FullName
Set wshIn = wbIn.Worksheets.Item(cWshIndex)
'Debug.Print , , wshIn.Name
With wshOut.UsedRange
If .Rows.Count = 1 Then
Set rngOut = .Cells(1, 1)
Else
Set rngOut = .Resize(1 _
, 1).Offset(.Rows.Count)
End If
With wshIn.Cells
.Range(.Item(1, 1) _
, .Find("*" _
, After:=.Cells(1, 1) _
, LookIn:=xlFormulas _
, LookAt:=xlPart _
, SearchOrder:=xlByRows _
, SearchDirection:=xlPrevious _
, MatchCase:=False) _
).Copy rngOut
End With
End With
wbIn.Close SaveChanges:=False
End If
strFilename = Dir
Loop

ExitProcedure:
With Application
.DisplayAlerts = True
.ScreenUpdating = True
End With
Set rngOut = Nothing
Set wshOut = Nothing
Set wshIn = Nothing
Set wbIn = Nothing
Exit Sub

ErrorHandler:
MsgBox Err.Description, vbCritical
Resume ExitProcedure

End Sub

(Facci sapere se e eventualmente come hai risolto. Grazie!)

--
Maurizio Borrelli [Microsoft MVP Office System]
http://www.riolab.org/
maurilloh
2008-06-06 08:38:47 UTC
Permalink
Post by Maurizio Borrelli
Post by maurilloh
vorrei copiare i dati presenti in diversi
file excel (tutti nel primo foglio), in un unico nuovo file; I file da
copiare si trovano tutti in unica cartella.
Nella mia testa vorrei dire ad Excel:"copia tutti i dati del primo
folgio di ogni file che si trova in questa cartella in questo foglio",
secondo voi è possibile?
dati file a
dati file b
ecc..
Ciao maurilloh.
' UnoPerTutti.xls
' ---------------
' Modulo1 - Modulo standard
'
Option Explicit
Public Sub TuttiPerUno()
On Error GoTo ErrorHandler
Const cWbExt = "*.xls"
Const cWshIndex = 1
Dim strPathSep As String
Dim strPathName As String
Dim strMyName As String
Dim strFilename As String
Dim wbIn As Excel.Workbook
Dim wshIn As Excel.Worksheet
Dim wshOut As Excel.Worksheet
Dim rngOut As Excel.Range
With Application
.ScreenUpdating = False
.DisplayAlerts = False
strPathSep = .PathSeparator
With .ThisWorkbook
strPathName = .Path
strMyName = .Name
With .Worksheets
Set wshOut = .Add(Before:=.Item(1))
End With
End With
End With
If Right$(strPathName, 1) <> strPathSep Then
strPathName = strPathName & strPathSep
End If
strPathName = strPathName
strFilename = Dir(strPathName & cWbExt, vbNormal)
Do While Len(strFilename)
If strFilename <> strMyName Then
'Debug.Print strFilename
Set wbIn = Workbooks.Open(strPathName & strFilename _
, ReadOnly:=True _
, AddToMru:=False)
'Debug.Print , wbIn.FullName
Set wshIn = wbIn.Worksheets.Item(cWshIndex)
'Debug.Print , , wshIn.Name
With wshOut.UsedRange
If .Rows.Count = 1 Then
Set rngOut = .Cells(1, 1)
Else
Set rngOut = .Resize(1 _
, 1).Offset(.Rows.Count)
End If
With wshIn.Cells
.Range(.Item(1, 1) _
, .Find("*" _
, After:=.Cells(1, 1) _
, LookIn:=xlFormulas _
, LookAt:=xlPart _
, SearchOrder:=xlByRows _
, SearchDirection:=xlPrevious _
, MatchCase:=False) _
).Copy rngOut
End With
End With
wbIn.Close SaveChanges:=False
End If
strFilename = Dir
Loop
With Application
.DisplayAlerts = True
.ScreenUpdating = True
End With
Set rngOut = Nothing
Set wshOut = Nothing
Set wshIn = Nothing
Set wbIn = Nothing
Exit Sub
MsgBox Err.Description, vbCritical
Resume ExitProcedure
End Sub
(Facci sapere se e eventualmente come hai risolto. Grazie!)
--
Maurizio Borrelli [Microsoft MVP Office System]
http://www.riolab.org/
Ciao Maurizio!!

..che dire..sei un mito!
Funziona alla grande e mi hai risparmiato un bel po' di tempo, grazie
mille!
Maurizio Borrelli
2008-06-06 09:07:09 UTC
Permalink
[...]
Post by maurilloh
Funziona alla grande e mi hai risparmiato un bel po' di tempo, grazie
mille!
Mi fa piacere. Grazie a te, maurilloh, per il riscontro.

--
Maurizio Borrelli [Microsoft MVP Office System]
http://www.riolab.org/
Norman Jones
2008-06-06 20:47:05 UTC
Permalink
Ciao Maurizio,

=============
[...]
strPathName = strPathName
[...]
=============

Non aspettare chi io dissenta - anche se
non capisco la utilità di questa istruzione
intrinsicamente incontrovertibile! -:)

Approfitto, per suggerire che si possa
rendere la tua routine più robusta se si
gestisse, esplicitamente. l'errore che si
incontrerebbe se, per qualunque motivo,
il primo foglio fosse privo di dati.



---
Regards.
Norman
Maurizio Borrelli
2008-06-06 21:29:55 UTC
Permalink
Post by Norman Jones
=============
[...]
strPathName = strPathName
[...]
=============
Non aspettare chi io dissenta - anche se
non capisco la utilità di questa istruzione
intrinsicamente incontrovertibile! -:)
:-)
Post by Norman Jones
Approfitto, per suggerire che si possa
rendere la tua routine più robusta
Robusta e` robusta, direi. Ma forse tu e io intendiamo il termine
"robusta" in modo diverso. Tu perche' definisci "poco robusta" quella
routine?
Post by Norman Jones
se si
gestisse, esplicitamente. l'errore che si
incontrerebbe se, per qualunque motivo,
il primo foglio fosse privo di dati.
Non saprei... Mi sembra in parte eccessivo perche' cosi` com`e` la
routine in tal caso si interrompe segnalando un errore generico e
l'utente si ritrova aperta la Cartella di lavoro che ha causato
l`errore.

Sta cosi` a lui decidere che fare, se eliminare tale Cartella di lavoro
dalla Cartella (Folder) oppure rimediare aggiungendo gli eventuali dati
mancanti.

Se invece l'elaborazione proseguisse, escludendo tale Cartella di lavoro
e le eventuali altre con lo stesso problema, si otterrebbe un risultato
che potrebbe anche essere inutile in quanto da rifare e si dovrebbe
emettere al termine una lista delle Cartella di lavoro non rispondenti
ai requisiti.

Questa mi sembra una complicazione inutile, in molte circostanze.
Insomma, quello che dici e` giusto ma per valutare il comportamento da
tenere io prima vorrei essere informato piu` in dettaglio riguardo` la
realta` nella quale tale routine viene impiegata, la frequenza d'uso, il
flusso di lavoro, in una parola... lo scopo.

A me invece di quella routine non piace il fatto che stia nel Progetto
VBA di una Cartella di lavoro salvata nella stessa Cartella (Folder) in
cui si trovano i file. Preferirei tenere separati il file-risultato e i
file da fondere in uno.

--
Ciao!
Maurizio Borrelli [Microsoft MVP Office System]
http://www.riolab.org/
Norman Jones
2008-06-06 23:20:48 UTC
Permalink
Ciao Maurizio,

=============
Post by Norman Jones
Approfitto, per suggerire che si possa
rendere la tua routine più robusta se si
gestisse, esplicitamente. l'errore che si
incontrerebbe se, per qualunque motivo,
il primo foglio fosse privo di dati.
Robusta e` robusta, direi. Ma forse tu e io intendiamo il termine
"robusta" in modo diverso. Tu perche' definisci "poco robusta" quella
routine?
Post by Norman Jones
se si
gestisse, esplicitamente. l'errore che si
incontrerebbe se, per qualunque motivo,
il primo foglio fosse privo di dati.
Non saprei... Mi sembra in parte eccessivo perche' cosi` com`e` la
routine in tal caso si interrompe segnalando un errore generico e
l'utente si ritrova aperta la Cartella di lavoro che ha causato
l`errore.

Sta cosi` a lui decidere che fare, se eliminare tale Cartella di lavoro
dalla Cartella (Folder) oppure rimediare aggiungendo gli eventuali dati
mancanti.

Se invece l'elaborazione proseguisse, escludendo tale Cartella di lavoro
e le eventuali altre con lo stesso problema, si otterrebbe un risultato
che potrebbe anche essere inutile in quanto da rifare e si dovrebbe
emettere al termine una lista delle Cartella di lavoro non rispondenti
ai requisiti.

Questa mi sembra una complicazione inutile, in molte circostanze.
Insomma, quello che dici e` giusto ma per valutare il comportamento da
tenere io prima vorrei essere informato piu` in dettaglio riguardo` la
realta` nella quale tale routine viene impiegata, la frequenza d'uso, il
flusso di lavoro, in una parola... lo scopo.
=============

Per piu' robusta, intendo - in questo
caso - che si gestica l'errore prevedibile
in modo che l'utente sappia il motivo per
il problema - anzichè vedesse un messagio
di errore generico. Inoltre, preferirei che,
armato con questa informazione, l'utente
possa decidere di continure, ignorando
l'assenza dei dati, oppure di cancellare la
routine. In quest'ultimo caso prevederei
che la tua routine cancellasse il nuovo
foglio e chiudesse il workbook
problematico.

Per ottenere questa funzionalita', si
richiederebbe soltanto una leggera
modifica della tua routine; ad esempio:

'========>>
Option Explicit

Public Sub TuttiPerUno()
On Error GoTo ErrorHandler
Const cWbExt = "*.xls"
Const cWshIndex = 1
Dim strPathSep As String
Dim strPathName As String
Dim strMyName As String
Dim strFilename As String
Dim wbIn As Excel.Workbook
Dim wshIn As Excel.Worksheet
Dim wshOut As Excel.Worksheet
Dim rngOut As Excel.Range
Dim rCell As Excel.Range
Dim Res As VbMsgBoxResult

With Application
.ScreenUpdating = False
.DisplayAlerts = False
strPathSep = .PathSeparator
With .ThisWorkbook
strPathName = .Path
strMyName = .Name
With .Worksheets
Set wshOut = .Add(Before:=.Item(1))
End With
End With
End With
If Right$(strPathName, 1) <> strPathSep Then
strPathName = strPathName & strPathSep
End If
strPathName = strPathName
strFilename = Dir(strPathName & cWbExt, vbNormal)
Do While Len(strFilename)
If strFilename <> strMyName Then
'Debug.Print strFilename
Set wbIn = Workbooks.Open(strPathName & strFilename _
, ReadOnly:=True _
, AddToMru:=False)
'Debug.Print , wbIn.FullName
Set wshIn = wbIn.Worksheets.Item(cWshIndex)
'Debug.Print , , wshIn.Name
With wshOut.UsedRange
If .Rows.Count = 1 Then
Set rngOut = .Cells(1, 1)
Else
Set rngOut = .Resize(1 _
, 1).Offset(.Rows.Count)
End If
With wshIn.Cells
Set rCell = .Find("*" _
, After:=.Cells(1, 1) _
, LookIn:=xlFormulas _
, LookAt:=xlPart _
, SearchOrder:=xlByRows _
, SearchDirection:=xlPrevious _
, MatchCase:=False)

If Not rCell Is Nothing Then
.Range(.Item(1, 1), rCell).Copy _
Destination:=rngOut
Else
Res = MsgBox(Prompt:="Il foglio " _
& .Parent.Name _
& " del workbook " _
& wbIn.Name _
& " non ha dati, vuoi
continuare?", _
Buttons:=vbCritical + vbYesNo, _
Title:="Continare?")
If Res = vbNo Then
Application.DisplayAlerts = False
wshOut.Delete
Application.DisplayAlerts = True
wbIn.Close Savechanges:=False
Exit Sub
Else
'\\ Continuiamo, ignorando il workbook
'\\ senza dati!
End If
End If
End With
End With
wbIn.Close Savechanges:=False
End If
strFilename = Dir
Loop

ExitProcedure:
With Application
.DisplayAlerts = True
.ScreenUpdating = True
End With

Set rCell = Nothing
Set rngOut = Nothing
Set wshOut = Nothing
Set wshIn = Nothing
Set wbIn = Nothing
Exit Sub

ErrorHandler:
MsgBox Err.Description, vbCritical
Resume ExitProcedure

End Sub
'<<========

Che tale funzionalita sia utile è' piuttosto
una questione di gusto ed opinione: le mie
osservazioni non sono state intese come
critica ma come commento costruttivo e
come l'espressione di un altro punto di
vista.

=============
A me invece di quella routine non piace il fatto che stia nel Progetto
VBA di una Cartella di lavoro salvata nella stessa Cartella (Folder) in
cui si trovano i file. Preferirei tenere separati il file-risultato e i
file da fondere in uno.
=============

Concordo pienamente.


Saluti!



---
Regards.
Norman
Norman Jones
2008-06-06 23:32:50 UTC
Permalink
Ciao Maurizio,
Post by Norman Jones
wbIn.Close Savechanges:=False
Exit Sub
Avrebbe dovuto essere:

wbIn.Close Savechanges:=False
GoTo ExitProcedure



---
Regards.
Norman
Maurizio Borrelli
2008-06-06 23:53:48 UTC
Permalink
Post by Norman Jones
wbIn.Close Savechanges:=False
GoTo ExitProcedure
Semplicemente dis-gus-to-so!

:-))))

--
Ciao!
Maurizio Borrelli [Microsoft MVP Office System]
http://www.riolab.org/
Maurizio Borrelli
2008-06-06 23:41:21 UTC
Permalink
"Norman Jones" wrote in message news:#x#***@TK2MSFTNGP03.phx.gbl:

Ciao Norman.

[...]
Post by Norman Jones
Per piu' robusta, intendo - in questo
caso - che si gestica l'errore prevedibile
in modo che l'utente sappia il motivo per
il problema - anzichè vedesse un messagio
di errore generico.
Come prevedevo usiamo il termine "robusto" con significati diversi.
Post by Norman Jones
Inoltre, preferirei che,
armato con questa informazione, l'utente
possa decidere di continure, ignorando
l'assenza dei dati, oppure di cancellare la
routine.
Io invece preferisco di no, per i motivi che dicevo.
Post by Norman Jones
In quest'ultimo caso prevederei
che la tua routine cancellasse il nuovo
foglio e chiudesse il workbook
problematico.
[...]

Io no. L'utente perderebbe la possibilita` di verificare il punto in cui
si e` interrotta l'elaborazione.

--
Ciao!
Maurizio Borrelli [Microsoft MVP Office System]
http://www.riolab.org/
Maurizio Borrelli
2008-06-06 23:44:18 UTC
Permalink
"Norman Jones" wrote in message news:#x#***@TK2MSFTNGP03.phx.gbl:

Ciao Norman.

[...]
Post by Norman Jones
Per piu' robusta, intendo - in questo
caso - che si gestica l'errore prevedibile
in modo che l'utente sappia il motivo per
il problema - anzichè vedesse un messagio
di errore generico.
Come prevedevo usiamo il termine "robusto" con significati diversi.
Post by Norman Jones
Inoltre, preferirei che,
armato con questa informazione, l'utente
possa decidere di continure, ignorando
l'assenza dei dati, oppure di cancellare la
routine.
Io invece preferisco di no, per i motivi che dicevo.
Post by Norman Jones
In quest'ultimo caso prevederei
che la tua routine cancellasse il nuovo
foglio e chiudesse il workbook
problematico.
[...]

Io no. L'utente perderebbe la possibilita` di verificare il punto in cui
si e` interrotta l'elaborazione.

--
Ciao!
Maurizio Borrelli [Microsoft MVP Office System]
http://www.riolab.org/
Norman Jones
2008-06-07 01:02:34 UTC
Permalink
Ciao Maurizio,

===============
[...]
Post by Norman Jones
Per piu' robusta, intendo - in questo
caso - che si gestica l'errore prevedibile
in modo che l'utente sappia il motivo per
il problema - anzichè vedesse un messagio
di errore generico.
Come prevedevo usiamo il termine "robusto" con significati diversi.
Post by Norman Jones
Inoltre, preferirei che,
armato con questa informazione, l'utente
possa decidere di continure, ignorando
l'assenza dei dati, oppure di cancellare la
routine.
Io invece preferisco di no, per i motivi che dicevo.
Post by Norman Jones
In quest'ultimo caso prevederei
che la tua routine cancellasse il nuovo
foglio e chiudesse il workbook
problematico.
[...]

Io no. L'utente perderebbe la possibilita` di verificare il punto in cui
si e` interrotta l'elaborazione
===============

Dissento: l'utente sa precisamente a quale
punto l'eborazione sia intertta perche' lui lo
decida - ben sapendo sia il nome del file
problematico, sia il nome del foglio di
interesse.

Caso mai si potrebbe lasciare il file
problematico aperto, cancellando soltanto
la riga:

wbIn.Close Savechanges:=False

(prima della riga: GoTo ExitProcedure)



---
Regards.
Norman
Maurizio Borrelli
2008-06-07 00:05:34 UTC
Permalink
"Norman Jones" wrote in message news:#x#***@TK2MSFTNGP03.phx.gbl:

[...]
Post by Norman Jones
Per ottenere questa funzionalita', si
richiederebbe soltanto una leggera
[...]

Ciao Norman.

La mia versione (da verificare, come sempre!) potrebbe essere:

' UnoPerTutti.xls
' ---------------
' Modulo1 - Modulo standard
'
Option Explicit

Public Sub TuttiPerUno()
Const cPrcName = "TuttiPerUno"
On Error GoTo ErrorHandler
Const cWbExt = "*.xls"
Const cWshIndex = 1
Const cSBMsg = "Attendere, prego." _
& " Esecuzione di '<PrcName>' in corso..."
Const cErrBmk1 = "<Arg1>"
Const cErrNumWshIsEmpty = vbObjectError + 512 + 1
Const cErrMsgWshIsEmpty = "L`elaborazione e` stata interrotta" _
& " perche' e` stato individuato un" _
& " Foglio di lavoro vuoto nella" _
& " Cartella di lavoro" _
& " '" & cErrBmk1 & "'"
Dim blnSBarState As Boolean
Dim strPathSep As String
Dim strPathName As String
Dim strMyName As String
Dim strFilename As String
Dim strWbInName As String
Dim strErrPrompt As String
Dim wbIn As Excel.Workbook
Dim wshIn As Excel.Worksheet
Dim wshOut As Excel.Worksheet
Dim rngIn As Excel.Range
Dim rngOut As Excel.Range

With Application
blnSBarState = .DisplayStatusBar
.StatusBar = Replace(cSBMsg, "<PrcName>", cPrcName)
.DisplayStatusBar = True
.ScreenUpdating = False
.DisplayAlerts = False
strPathSep = .PathSeparator
With .ThisWorkbook
strPathName = .Path
strMyName = .Name
With .Worksheets
Set wshOut = .Add(Before:=.Item(1))
End With
End With
End With
Set rngOut = wshOut.Cells(1, 1)
If Right$(strPathName, 1) <> strPathSep Then
strPathName = strPathName & strPathSep
End If
strFilename = Dir$(strPathName & cWbExt, vbNormal)
Do While Len(strFilename)
If strFilename <> strMyName Then
'Debug.Print strFilename
Set wbIn = Workbooks.Open(strPathName _
& strFilename _
, ReadOnly:=True _
, AddToMru:=False)
'Debug.Print , wbIn.FullName
With wbIn
strWbInName = .Name
Set wshIn = .Worksheets.Item(cWshIndex)
End With
'Debug.Print , , wshIn.Name
With wshIn
Set rngIn = .Cells.Find("*" _
, After:=.Cells(1, 1) _
, LookIn:=xlFormulas _
, LookAt:=xlPart _
, SearchOrder:=xlByRows _
, SearchDirection:=xlPrevious _
, MatchCase:=False)
If rngIn Is Nothing Then Err.Raise cErrNumWshIsEmpty
Set rngIn = .Range(.Cells(1, 1), rngIn)
End With
rngIn.Copy rngOut
wbIn.Close SaveChanges:=False
With wshOut.UsedRange
Set rngOut = .Resize(1, 1).Offset(.Rows.Count)
End With
End If
strFilename = Dir$
Loop

ExitProcedure:
With Application
.StatusBar = False
.DisplayStatusBar = blnSBarState
.DisplayAlerts = True
.ScreenUpdating = True
End With
Set rngOut = Nothing
Set wshOut = Nothing
Set rngIn = Nothing
Set wshIn = Nothing
Set wbIn = Nothing
Exit Sub

ErrorHandler:
With Err
Select Case .Number
Case cErrNumWshIsEmpty
strErrPrompt = Replace(cErrMsgWshIsEmpty _
, cErrBmk1 _
, strWbInName)
Case Else
strErrPrompt = .Description
End Select
End With
MsgBox strErrPrompt _
, vbCritical Or vbOKOnly _
, cPrcName
Resume ExitProcedure

End Sub

--
Ciao!
Maurizio Borrelli [Microsoft MVP Office System]
http://www.riolab.org/
Norman Jones
2008-06-07 01:12:59 UTC
Permalink
Ciao Maurizio.

=============
[...]
Post by Norman Jones
Per ottenere questa funzionalita', si
richiederebbe soltanto una leggera
[...]

Ciao Norman.

La mia versione (da verificare, come sempre!) potrebbe essere:

' UnoPerTutti.xls
' ---------------
' Modulo1 - Modulo standard
'
Option Explicit

Public Sub TuttiPerUno()
Const cPrcName = "TuttiPerUno"
On Error GoTo ErrorHandler
Const cWbExt = "*.xls"
Const cWshIndex = 1
Const cSBMsg = "Attendere, prego." _
& " Esecuzione di '<PrcName>' in corso..."
Const cErrBmk1 = "<Arg1>"
Const cErrNumWshIsEmpty = vbObjectError + 512 + 1
Const cErrMsgWshIsEmpty = "L`elaborazione e` stata interrotta" _
& " perche' e` stato individuato un" _
& " Foglio di lavoro vuoto nella" _
& " Cartella di lavoro" _
& " '" & cErrBmk1 & "'"
Dim blnSBarState As Boolean
Dim strPathSep As String
Dim strPathName As String
Dim strMyName As String
Dim strFilename As String
Dim strWbInName As String
Dim strErrPrompt As String
Dim wbIn As Excel.Workbook
Dim wshIn As Excel.Worksheet
Dim wshOut As Excel.Worksheet
Dim rngIn As Excel.Range
Dim rngOut As Excel.Range

With Application
blnSBarState = .DisplayStatusBar
.StatusBar = Replace(cSBMsg, "<PrcName>", cPrcName)
.DisplayStatusBar = True
.ScreenUpdating = False
.DisplayAlerts = False
strPathSep = .PathSeparator
With .ThisWorkbook
strPathName = .Path
strMyName = .Name
With .Worksheets
Set wshOut = .Add(Before:=.Item(1))
End With
End With
End With
Set rngOut = wshOut.Cells(1, 1)
If Right$(strPathName, 1) <> strPathSep Then
strPathName = strPathName & strPathSep
End If
strFilename = Dir$(strPathName & cWbExt, vbNormal)
Do While Len(strFilename)
If strFilename <> strMyName Then
'Debug.Print strFilename
Set wbIn = Workbooks.Open(strPathName _
& strFilename _
, ReadOnly:=True _
, AddToMru:=False)
'Debug.Print , wbIn.FullName
With wbIn
strWbInName = .Name
Set wshIn = .Worksheets.Item(cWshIndex)
End With
'Debug.Print , , wshIn.Name
With wshIn
Set rngIn = .Cells.Find("*" _
, After:=.Cells(1, 1) _
, LookIn:=xlFormulas _
, LookAt:=xlPart _
, SearchOrder:=xlByRows _
, SearchDirection:=xlPrevious _
, MatchCase:=False)
If rngIn Is Nothing Then Err.Raise cErrNumWshIsEmpty
Set rngIn = .Range(.Cells(1, 1), rngIn)
End With
rngIn.Copy rngOut
wbIn.Close SaveChanges:=False
With wshOut.UsedRange
Set rngOut = .Resize(1, 1).Offset(.Rows.Count)
End With
End If
strFilename = Dir$
Loop

ExitProcedure:
With Application
.StatusBar = False
.DisplayStatusBar = blnSBarState
.DisplayAlerts = True
.ScreenUpdating = True
End With
Set rngOut = Nothing
Set wshOut = Nothing
Set rngIn = Nothing
Set wshIn = Nothing
Set wbIn = Nothing
Exit Sub

ErrorHandler:
With Err
Select Case .Number
Case cErrNumWshIsEmpty
strErrPrompt = Replace(cErrMsgWshIsEmpty _
, cErrBmk1 _
, strWbInName)
Case Else
strErrPrompt = .Description
End Select
End With
MsgBox strErrPrompt _
, vbCritical Or vbOKOnly _
, cPrcName
Resume ExitProcedure

End Sub
=============

A me, la tua nuova versione non fornisce
all'utente la funzionalità che abbiamo
discusso: al primo fogliovuoto, la procedura
esce con un messaggio; l'utente non ha
l'opzione da continuare.



---
Regards.
Norman
Maurizio Borrelli
2008-06-07 01:34:54 UTC
Permalink
"Norman Jones" wrote in message news:#***@TK2MSFTNGP04.phx.gbl:

[...]
Post by Norman Jones
A me, la tua nuova versione non fornisce
all'utente la funzionalità che abbiamo
discusso: al primo fogliovuoto, la procedura
esce con un messaggio; l'utente non ha
l'opzione da continuare.
Ciao Norman.

Si`, l'abbiamo discussa, ma non ci siamo trovati d`accordo, quindi?...
;-)

--
Ciao!
Maurizio Borrelli [Microsoft MVP Office System]
http://www.riolab.org/
Maurizio Borrelli
2008-06-07 01:52:52 UTC
Permalink
[...]
Post by Maurizio Borrelli
Post by Norman Jones
A me, la tua nuova versione non fornisce
all'utente la funzionalità che abbiamo
discusso: al primo fogliovuoto, la procedura
esce con un messaggio; l'utente non ha
l'opzione da continuare.
Si`, l'abbiamo discussa, ma non ci siamo trovati d`accordo, quindi?...
;-)
Ciao Norman.

Volendo ulteriormente sofisticare la procedura farei cosi`.

(Ulteriormente ma secondo me inutilmente perche', ripeto, nessuna
procedura di questo genere e` un mondo a se' ma vive in un contesto e in
questo caso il contesto non lo conosciamo.

Se io dovessi sviluppare qualcosa del genere di certo non farei una
routine come questa, e basta, ma per esempio un`aggiunta (add-in) ben
piu` sofisticata che preveda come minimo uno UserForm per l'interazione
con l`utente.

Secondo me stai parlando del sesso degli angeli.)

' UnoPerTutti.xls
' ---------------
' Modulo1 - Modulo standard
'
Option Explicit

Public Sub TuttiPerUno()
Const cPrcName = "TuttiPerUno"
On Error GoTo ErrorHandler
Const cWbExt = "*.xls"
Const cWshIndex = 1
Const cWshOutName = "Uno per tutti"
Const cWshOutNameOnErr = "Fusione incompleta"
Const cSBMsg = "Attendere, prego." _
& " Esecuzione di '<PrcName>' in corso..."
Const cErrBmk1 = "<Arg1>"
Const cErrNumWshIsEmpty = vbObjectError + 512 + 1
Const cErrMsgWshIsEmpty = "L`elaborazione e` stata interrotta" _
& " perche' e` stato individuato un" _
& " Foglio di lavoro vuoto nella" _
& " Cartella di lavoro" _
& " '" & cErrBmk1 & "'"
Dim blnSBarState As Boolean
Dim strPathSep As String
Dim strPathName As String
Dim strMyName As String
Dim strFilename As String
Dim strWbInName As String
Dim strErrPrompt As String
Dim wbIn As Excel.Workbook
Dim wshIn As Excel.Worksheet
Dim wshOut As Excel.Worksheet
Dim rngIn As Excel.Range
Dim rngOut As Excel.Range

With Application
blnSBarState = .DisplayStatusBar
.StatusBar = Replace(cSBMsg, "<PrcName>", cPrcName)
.DisplayStatusBar = True
.ScreenUpdating = False
.DisplayAlerts = False
strPathSep = .PathSeparator
With .ThisWorkbook
strPathName = .Path
strMyName = .Name
With .Worksheets
Set wshOut = .Add(Before:=.Item(1))
Call DeleteWorksheet(cWshOutName)
Call DeleteWorksheet(cWshOutNameOnErr)
End With
End With
End With
Set rngOut = wshOut.Cells(1, 1)
If Right$(strPathName, 1) <> strPathSep Then
strPathName = strPathName & strPathSep
End If
strFilename = Dir$(strPathName & cWbExt, vbNormal)
Do While Len(strFilename)
If strFilename <> strMyName Then
'Debug.Print strFilename
Set wbIn = Workbooks.Open(strPathName _
& strFilename _
, ReadOnly:=True _
, AddToMru:=False)
'Debug.Print , wbIn.FullName
With wbIn
strWbInName = .Name
Set wshIn = .Worksheets.Item(cWshIndex)
End With
'Debug.Print , , wshIn.Name
With wshIn
Set rngIn = .Cells.Find("*" _
, After:=.Cells(1, 1) _
, LookIn:=xlFormulas _
, LookAt:=xlPart _
, SearchOrder:=xlByRows _
, SearchDirection:=xlPrevious _
, MatchCase:=False)
If rngIn Is Nothing Then
wshOut.Name = cWshOutNameOnErr
Err.Raise cErrNumWshIsEmpty
End If
Set rngIn = .Range(.Cells(1, 1), rngIn)
End With
rngIn.Copy rngOut
wbIn.Close SaveChanges:=False
With wshOut.UsedRange
Set rngOut = .Resize(1, 1).Offset(.Rows.Count)
End With
End If
strFilename = Dir$
Loop
wshOut.Name = cWshOutName

ExitProcedure:
With Application
.StatusBar = False
.DisplayStatusBar = blnSBarState
.DisplayAlerts = True
.ScreenUpdating = True
End With
Set rngOut = Nothing
Set wshOut = Nothing
Set rngIn = Nothing
Set wshIn = Nothing
Set wbIn = Nothing
Exit Sub

ErrorHandler:
With Err
Select Case .Number
Case cErrNumWshIsEmpty
strErrPrompt = Replace(cErrMsgWshIsEmpty _
, cErrBmk1 _
, strWbInName)
Case Else
strErrPrompt = .Description
End Select
End With
MsgBox strErrPrompt _
, vbCritical Or vbOKOnly _
, cPrcName
Resume ExitProcedure

End Sub

' modUtils - Modulo standard
'
Option Explicit
Option Private Module

Public Function DeleteWorksheet(ByVal Index _
As Variant _
, Optional ByVal wb _
As Excel.Workbook _
) As Boolean
On Error GoTo ErrorHandler
Dim shs As Excel.Sheets
Dim wsh As Excel.Worksheet

If wb Is Nothing Then Set wb = ThisWorkbook
Set shs = wb.Sheets
If shs.Count > 1 Then
If WorksheetExists(Index, wb) Then
Set wsh = wb.Worksheets.Item(Index)
wsh.Delete
DeleteWorksheet = True
End If
End If

ExitProcedure:
Set wsh = Nothing
Set shs = Nothing
Exit Function

ErrorHandler:
Resume ExitProcedure

End Function

Public Function WorksheetExists(ByVal Index _
As Variant _
, Optional ByVal wb _
As Excel.Workbook _
) As Boolean
If wb Is Nothing Then Set wb = ThisWorkbook
On Error Resume Next
WorksheetExists = IsObject(wb.Worksheets.Item(Index))
End Function

--
Ciao!
Maurizio Borrelli [Microsoft MVP Office System]
http://www.riolab.org/
Maurizio Borrelli
2008-06-07 08:13:26 UTC
Permalink
"Maurizio Borrelli" wrote in message news:***@TK2MSFTNGP05.phx.gbl:

[...]
Post by Maurizio Borrelli
Public Function DeleteWorksheet(ByVal Index _
As Variant _
, Optional ByVal wb _
As Excel.Workbook _
) As Boolean
[...]

Bleah, questa m`e` venuta proprio da schifo. Per fortuna non se n`e`
ancora accorto nessun Maestro Cantore.

Public Function DeleteWorksheet(ByVal Index _
As Variant _
, Optional ByVal wb _
As Excel.Workbook _
) As Boolean
On Error GoTo ErrorHandler
Dim wsh As Excel.Worksheet

If wb Is Nothing Then Set wb = ThisWorkbook
If WorksheetExists(Index, wb) Then
With wb.Sheets
Set wsh = .Item(Index)
If .Count = 1 Then
.Add After:=.Item(1), Type:=xlWorksheet
End If
End With
wsh.Delete
End If
DeleteWorksheet = True

ExitProcedure:
Set wsh = Nothing
Exit Function

ErrorHandler:
Resume ExitProcedure

End Function

--
Ciao!
Maurizio Borrelli [Microsoft MVP Office System]
http://www.riolab.org/
Norman Jones
2008-06-07 10:08:33 UTC
Permalink
Ciao Maurizio,

=============
Volendo ulteriormente sofisticare la procedura farei cosi`.

(Ulteriormente ma secondo me inutilmente perche', ripeto, nessuna
procedura di questo genere e` un mondo a se' ma vive in un contesto e in
questo caso il contesto non lo conosciamo.

Se io dovessi sviluppare qualcosa del genere di certo non farei una
routine come questa, e basta, ma per esempio un`aggiunta (add-in) ben
piu` sofisticata che preveda come minimo uno UserForm per l'interazione
con l`utente.
Secondo me stai parlando del sesso degli angeli.)
[...]
==============

Non ci credo, lasciamo pure gli angeli a
domani!

Io chiedo soltanto una routine che possa
funzionare, senza conoscenza dei dati
dell'utente, la quale gestica gli errori
prevedibili e utilizza un 'Error handler' per
gestire altri errore; vorrei che l'utente sia
informato in caso di un errore prevedibile
e che non incontri un errore run-time in
caso di altri errore. Ovviamente, vorrei
inoltre che i dati di ripielogo siano disposti
sulle colonne originali.

Per verificare che questi obbiettivi
possano non essere raggiunti, anche con
dei dati abbastanza normali, prova come
segue:

- crea un nuovo cartella "myFolder"

- crea un nuovo workbook
nell'intervallo D5:I5, del Foglio1, inserici "Pippo"
nell'intervallo ED6:J6, del Foglio1, inserici "Pluto"
salva il file nella nuova cartella con il nome "1.xls "

- salva il file 1.xls con il nome "1a.xls

- crea un nuovo workbook
nell'intervallo A1:F1, del Foglio1, inserici "Pippo"
nell'intervallo B2:G2 del Foglio1, inserici "Pluto"
salva il file nella nuova cartella con il nome "1B.xls "

- crea un nuovo workbook,
non inserire alcun dati
salva il file nella nuova cartella con il nome "1C.xls "

- incolla il tuo codice in un nuovo workbook
salvarlo - co qualunque nome - nella nuova cartella.


Ora, avvia la tua procedura TuttiPerUno
e controlla i risultati e il messagio mostrato
al fondo della finestra di Excel sullo 'Status Bar'



---
Regards.
Norman

PS: Per le mie prove. ho utilizzato entrambi
le versioni della tua funzione DeleteWorksheet.
Maurizio Borrelli
2008-06-07 10:44:29 UTC
Permalink
Post by Norman Jones
=============
Volendo ulteriormente sofisticare la procedura farei cosi`.
(Ulteriormente ma secondo me inutilmente perche', ripeto, nessuna
procedura di questo genere e` un mondo a se' ma vive in un contesto e in
questo caso il contesto non lo conosciamo.
Se io dovessi sviluppare qualcosa del genere di certo non farei una
routine come questa, e basta, ma per esempio un`aggiunta (add-in) ben
piu` sofisticata che preveda come minimo uno UserForm per l'interazione
con l`utente.
Secondo me stai parlando del sesso degli angeli.)
[...]
==============
Non ci credo, lasciamo pure gli angeli a
domani!
Io chiedo soltanto una routine che possa
funzionare, senza conoscenza dei dati
dell'utente, la quale gestica gli errori
prevedibili e utilizza un 'Error handler' per
gestire altri errore; vorrei che l'utente sia
informato in caso di un errore prevedibile
e che non incontri un errore run-time in
caso di altri errore. Ovviamente, vorrei
inoltre che i dati di ripielogo siano disposti
sulle colonne originali.
Per verificare che questi obbiettivi
possano non essere raggiunti, anche con
dei dati abbastanza normali,
"Abbastanza" come inteso nel lessico dell'understatement britannico, I
Suppose.

:-)))

Non ti ci mettere anche tu, per favore, ne abbiamo gia` uno di troppo,
dalle nostre parti, che sa tutto riguardo cosa e` normale e cosa no.

:-)))
Post by Norman Jones
prova come
- crea un nuovo cartella "myFolder"
- crea un nuovo workbook
nell'intervallo D5:I5, del Foglio1, inserici "Pippo"
nell'intervallo ED6:J6, del Foglio1, inserici "Pluto"
salva il file nella nuova cartella con il nome "1.xls "
- salva il file 1.xls con il nome "1a.xls
- crea un nuovo workbook
nell'intervallo A1:F1, del Foglio1, inserici "Pippo"
nell'intervallo B2:G2 del Foglio1, inserici "Pluto"
salva il file nella nuova cartella con il nome "1B.xls "
- crea un nuovo workbook,
non inserire alcun dati
salva il file nella nuova cartella con il nome "1C.xls "
- incolla il tuo codice in un nuovo workbook
salvarlo - co qualunque nome - nella nuova cartella.
Ora, avvia la tua procedura TuttiPerUno
e controlla i risultati e il messagio mostrato
al fondo della finestra di Excel sullo 'Status Bar'
Nella mia c`e` scritto "Pronto.", come previsto.

Insisto, tu hai un obiettivo in testa, io un altro. Tu parti con idee
tue riguardo come debba essere fatta una cosa, io invece *pretendo* mi
siano fornite delle specifiche e, in mancanza, procedo per affinamenti
successivi, senza permettermi di "immaginare".

--
Ciao!
Maurizio Borrelli [Microsoft MVP Office System]
http://www.riolab.org/
Norman Jones
2008-06-07 11:09:38 UTC
Permalink
Ciao Maurizio,

=============
"Abbastanza" come inteso nel lessico dell'understatement britannico, I
Suppose.

:-)))

Non ti ci mettere anche tu, per favore, ne abbiamo gia` uno di troppo,
dalle nostre parti, che sa tutto riguardo cosa e` normale e cosa no.

:-)))
=============

La mia "abbtanza normale" si riferiva alla
possibilita che un workbook in unn data
cartella possa avere un foglio vuoto oppure
possa avere un foglio in cui i dati non
cominciano nella cella A1.

Entrambe possibilità sembrano eminentemente
normali e da aspettare; "tout a fait normal"per
utilizzarre un lessico neutrale. -:))

============
Post by Norman Jones
prova come
- crea un nuovo cartella "myFolder"
- crea un nuovo workbook
nell'intervallo D5:I5, del Foglio1, inserici "Pippo"
nell'intervallo ED6:J6, del Foglio1, inserici "Pluto"
salva il file nella nuova cartella con il nome "1.xls "
- salva il file 1.xls con il nome "1a.xls
- crea un nuovo workbook
nell'intervallo A1:F1, del Foglio1, inserici "Pippo"
nell'intervallo B2:G2 del Foglio1, inserici "Pluto"
salva il file nella nuova cartella con il nome "1B.xls "
- crea un nuovo workbook,
non inserire alcun dati
salva il file nella nuova cartella con il nome "1C.xls "
- incolla il tuo codice in un nuovo workbook
salvarlo - co qualunque nome - nella nuova cartella.
Ora, avvia la tua procedura TuttiPerUno
e controlla i risultati e il messagio mostrato
al fondo della finestra di Excel sullo 'Status Bar'
Nella mia c`e` scritto "Pronto.", come previsto.

Insisto, tu hai un obiettivo in testa, io un altro. Tu parti con idee
tue riguardo come debba essere fatta una cosa, io invece *pretendo* mi
siano fornite delle specifiche e, in mancanza, procedo per affinamenti
successivi, senza permettermi di "immaginare".
=============

Maurizio, la mia intenzione non era altro
che di fare un'osservazione costruttiva.

Ti ripeto:

=============
Che tale funzionalita sia utile è' piuttosto
una questione di gusto ed opinione: le mie
osservazioni non sono state intese come
critica ma come commento costruttivo e
come l'espressione di un altro punto di
vista.
=============
e
=============
Come con tutte le opinioni, ognuno è libero
a credere cio' che vuole; i miei suggerimenti
non sono altro che dei suggerimenti: li adotta
o non li adotta - non c'è alcuna costrizione
da seguire la strada migliore!

Sarebbe un mondo molto più povero se
avessimo sempre la stessa opinione: basta,
credo, nel nostro caso, che solitamente siamo
d'accordo e che ci capiamo sempre! -:)
=============

Ciao.


---
Regards.
Norman
Maurizio Borrelli
2008-06-07 11:33:14 UTC
Permalink
"Norman Jones" wrote in message news:***@TK2MSFTNGP05.phx.gbl:

[...]
Post by Norman Jones
Maurizio, la mia intenzione non era altro
che di fare un'osservazione costruttiva.
[...]

Ciao Norman.

Non ne ho mai dubitato! Percio` e` perfettamente inutile che tu lo
ripeta ogni tre frasi, come se da cio` che scrivo io si possa arguire
che non la penso cosi` o peggio che io non sia in grado di cogliere il
senso delle tue osservazioni.

Se ti ritenessi uno che fa osservazioni distruttive penso che fra noi
non ci sarebbe dialogo da un bel pezzo.

--
Ciao!
Maurizio Borrelli [Microsoft MVP Office System]
http://www.riolab.org/
Maurizio Borrelli
2008-06-07 12:10:47 UTC
Permalink
"Norman Jones" wrote in message news:***@TK2MSFTNGP05.phx.gbl:

[...]
Post by Norman Jones
La mia "abbtanza normale" si riferiva alla
possibilita che un workbook in unn data
cartella possa avere un foglio vuoto oppure
possa avere un foglio in cui i dati non
cominciano nella cella A1.
Entrambe possibilità sembrano eminentemente
normali e da aspettare; "tout a fait normal"per
utilizzarre un lessico neutrale. -:))
[...]

Ciao Norman, scusa se ritorno sulla questione di cio` che e` "normale" e
cosa no, ma a me la sola parola fa rabbrividire, pertanto...

Anche perche` sia chiaro a chi ci legge distrattamente, nel caso da te
prospettato mi piacerebbe sapere perche' ti senti autorizzato a
supporre, in assenza di specifiche chiare, che la posizione dei dati in
una colonna piuttosto che in un`altra non possa essere significativa.

Sei sicuro che sia "normale" allineare tutti in colonna "A" i dati che
in un Foglio di lavoro si trovano in colonna "C", in un altro in colonna
"F", ecc.? E` normale se si *presume* che... ma chi ci autorizza a
presumere? Ah, gia`... la *tua* idea di normalita`. ;-)

--
Ciao!
Maurizio Borrelli [Microsoft MVP Office System]
http://www.riolab.org/
Norman Jones
2008-06-07 12:45:16 UTC
Permalink
Ciao Maurizio,

=============
[...]
Post by Norman Jones
La mia "abbtanza normale" si riferiva alla
possibilita che un workbook in unn data
cartella possa avere un foglio vuoto oppure
possa avere un foglio in cui i dati non
cominciano nella cella A1.
Entrambe possibilità sembrano eminentemente
normali e da aspettare; "tout a fait normal"per
utilizzarre un lessico neutrale. -:))
[...]

Ciao Norman, scusa se ritorno sulla questione di cio` che e` "normale" e
cosa no, ma a me la sola parola fa rabbrividire, pertanto...

Anche perche` sia chiaro a chi ci legge distrattamente, nel caso da te
prospettato mi piacerebbe sapere perche' ti senti autorizzato a
supporre, in assenza di specifiche chiare, che la posizione dei dati in
una colonna piuttosto che in un`altra non possa essere significativa.

Sei sicuro che sia "normale" allineare tutti in colonna "A" i dati che
in un Foglio di lavoro si trovano in colonna "C", in un altro in colonna
"F", ecc.? E` normale se si *presume* che... ma chi ci autorizza a
presumere? Ah, gia`... la *tua* idea di normalita`. ;-)
=============

Purtroppo, qui ti sbagli - non *opinione* mia,
ma fatto!

Io non ho *nessun* punto di vista per quanto
riguarda la normalità dell'allineamento dei dati;
non mi interessa tanto e non ne ho mai parlato;
io ho parlato unicamente di due cose: la
disposizione dei dati del "cliente" e la
disposizione dei risultati forniti da te al cliente.

Io *presumo* nulla e non mi sento *autorizzato*
a presumere niente - se nonche', in assenza di
altro, si dovrebbe rispettare la disposizione dei
dati del "cliente!

Purtroppo, le tue proposte routine NON
rispettano la disposizione dei dati del cliente;
come suggerito, prova:

===============

Per verificare che questi obbiettivi
possano non essere raggiunti, anche con
dei dati abbastanza normali, prova come
segue:

- crea un nuovo cartella "myFolder"

- crea un nuovo workbook
nell'intervallo D5:I5, del Foglio1, inserici "Pippo"
nell'intervallo ED6:J6, del Foglio1, inserici "Pluto"
salva il file nella nuova cartella con il nome "1.xls "

- salva il file 1.xls con il nome "1a.xls

- crea un nuovo workbook
nell'intervallo A1:F1, del Foglio1, inserici "Pippo"
nell'intervallo B2:G2 del Foglio1, inserici "Pluto"
salva il file nella nuova cartella con il nome "1B.xls "

- crea un nuovo workbook,
non inserire alcun dati
salva il file nella nuova cartella con il nome "1C.xls "

- incolla il tuo codice in un nuovo workbook
salvarlo - co qualunque nome - nella nuova cartella.


Ora, avvia la tua procedura TuttiPerUno
e controlla i risultati e il messagio mostrato
al fondo della finestra di Excel sullo 'Status Bar'
===============

Pertanto, permetti, invece, che io ti chieda:
chi ha autorizzato *te* a non rispettare la
disposizione dei dati del cliente e di
*presumere*, in quel caso, che non si
dovrebbe utilizzare (ad esempio) le colonne
A:B, e chi ti ha autorizzato di spostare i dati
horizontamente - e, per quanto risulterebbe
i risultati al cliente, a caso!

Ripeto, non opinione mia ma fatto - la prova si
trova nel mio esempio!



---
Regards.
Norman
Norman Jones
2008-06-07 12:47:37 UTC
Permalink
Ciao Maurizio,

=============
[...]
Post by Norman Jones
La mia "abbtanza normale" si riferiva alla
possibilita che un workbook in unn data
cartella possa avere un foglio vuoto oppure
possa avere un foglio in cui i dati non
cominciano nella cella A1.
Entrambe possibilità sembrano eminentemente
normali e da aspettare; "tout a fait normal"per
utilizzarre un lessico neutrale. -:))
[...]

Ciao Norman, scusa se ritorno sulla questione di cio` che e` "normale" e
cosa no, ma a me la sola parola fa rabbrividire, pertanto...

Anche perche` sia chiaro a chi ci legge distrattamente, nel caso da te
prospettato mi piacerebbe sapere perche' ti senti autorizzato a
supporre, in assenza di specifiche chiare, che la posizione dei dati in
una colonna piuttosto che in un`altra non possa essere significativa.

Sei sicuro che sia "normale" allineare tutti in colonna "A" i dati che
in un Foglio di lavoro si trovano in colonna "C", in un altro in colonna
"F", ecc.? E` normale se si *presume* che... ma chi ci autorizza a
presumere? Ah, gia`... la *tua* idea di normalita`. ;-)
=============

Purtroppo, qui ti sbagli - non *opinione* mia,
ma fatto!

Io non ho *nessun* punto di vista per quanto
riguarda la normalità dell'allineamento dei dati;
non mi interessa tanto e non ne ho mai parlato;
io ho parlato unicamente di due cose: la
disposizione dei dati del "cliente" e la
disposizione dei risultati forniti da te al cliente.

Io *presumo* nulla e non mi sento *autorizzato*
a presumere niente - se nonche', in assenza di
altro, si dovrebbe rispettare la disposizione dei
dati del "cliente!

Purtroppo, le tue proposte routine NON
rispettano la disposizione dei dati del cliente;
come suggerito, prova:

===============

Per verificare che questi obbiettivi
possano non essere raggiunti, anche con
dei dati abbastanza normali, prova come
segue:

- crea un nuovo cartella "myFolder"

- crea un nuovo workbook
nell'intervallo D5:I5, del Foglio1, inserici "Pippo"
nell'intervallo ED6:J6, del Foglio1, inserici "Pluto"
salva il file nella nuova cartella con il nome "1.xls "

- salva il file 1.xls con il nome "1a.xls

- crea un nuovo workbook
nell'intervallo A1:F1, del Foglio1, inserici "Pippo"
nell'intervallo B2:G2 del Foglio1, inserici "Pluto"
salva il file nella nuova cartella con il nome "1B.xls "

- crea un nuovo workbook,
non inserire alcun dati
salva il file nella nuova cartella con il nome "1C.xls "

- incolla il tuo codice in un nuovo workbook
salvarlo - co qualunque nome - nella nuova cartella.


Ora, avvia la tua procedura TuttiPerUno
e controlla i risultati e il messagio mostrato
al fondo della finestra di Excel sullo 'Status Bar'
===============

Pertanto, permetti, invece, che io ti chieda:
chi ha autorizzato *te* a non rispettare la
disposizione dei dati del cliente e di
*presumere*, in quel caso, che non si
dovrebbe utilizzare (ad esempio) le colonne
A:B, e chi ti ha autorizzato di spostare i dati
horizontamente - e, per quanto risulterebbe
i risultati al cliente, a caso!

Ripeto, non opinione mia ma fatto - la prova si
trova nel mio esempio!



---
Regards.
Norman
Norman Jones
2008-06-07 13:57:47 UTC
Permalink
Post by Norman Jones
e chi ti ha autorizzato di spostare i dati
horizontamente - e, per quanto risulterebbe
i risultati al cliente, a caso!
=======>>

e chi ti ha autorizzato di spostare i dati
horizontalmente - e, per quanto risulterebbero
i risultati al cliente, a caso!




---
Regards.
Norman
Maurizio Borrelli
2008-06-07 22:26:14 UTC
Permalink
"Norman Jones" wrote in message news:5CBE946F-69AC-4A84-BB73-***@microsoft.com:

[...]
Post by Norman Jones
Ora, avvia la tua procedura TuttiPerUno
e controlla i risultati e il messagio mostrato
al fondo della finestra di Excel sullo 'Status Bar'
===============
chi ha autorizzato *te* a non rispettare la
disposizione dei dati del cliente e di
*presumere*, in quel caso, che non si
dovrebbe utilizzare (ad esempio) le colonne
A:B, e chi ti ha autorizzato di spostare i dati
horizontamente - e, per quanto risulterebbe
i risultati al cliente, a caso!
Ripeto, non opinione mia ma fatto - la prova si
trova nel mio esempio!
Dunque, Norman... dove eravamo rimasti? Ah, si`, al trabocchetto della
"StatusBar". Eh, si`, perche' solo adesso rileggendo capisco cosa
intendevi dire. Mi ero fissato su quel "messagio mostrato al fondo della
finestra di Excel sullo 'Status Bar'". Scusa ma che c`entra, se il
problema e` ben altro?

Il "problema" della routine e` quello che c`e` sempre stato, sin
dall`origine, anche se per un bel po` s`e` parlato d`altro. Di fogli
vuoti, per esempio.

Riassumendo, a modo mio, io ho esordito cosi`:

"Insomma, quello che dici e` giusto ma per valutare il comportamento da
tenere io prima vorrei essere informato piu` in dettaglio riguardo` la
realta` nella quale tale routine viene impiegata, la frequenza d'uso, il
flusso di lavoro, in una parola... lo scopo."

Quando scrivo "quello che dici e` giusto" intendo che concordo con te.
Che sono d`accordo. E` chiaro anche per te che sono *da subito* stato
d`accordo con te?

Quando scrivo "ma [...] io prima vorrei essere informato piu` in
dettaglio" vuol dire che non ha senso analizzare un pezzo di codice come
se fosse *definitivo*, come se fosse stato presentato da me come lo
stato dell`arte sull`argomento.

Quel pezzo di codice era una prima approssimazione per ottenere un
riscontro dal richiedente in modo da capire se ci si e` capiti, come
spesso sono i pezzi di codice che io propongo, perche' non sono prodotti
finiti, perche' non sono pappa pronta, perche' auspico e mi attendo la
collaborazione del richiedente nella loro messa a punto, perche' sono
una indicazione di quali sono i primi passi da percorrere per andare in
una certa direzione.

Poi e` venuta fuori quella maledetta 'StatusBar'... ma ormai era tardi,
dovevo uscire. Amen.

--
Ciao!
Maurizio Borrelli [Microsoft MVP Office System]
http://www.riolab.org/
Norman Jones
2008-06-08 00:13:01 UTC
Permalink
Ciao Maurizio,

=============
[...]
Post by Norman Jones
Ora, avvia la tua procedura TuttiPerUno
e controlla i risultati e il messagio mostrato
al fondo della finestra di Excel sullo 'Status Bar'
===============
chi ha autorizzato *te* a non rispettare la
disposizione dei dati del cliente e di
*presumere*, in quel caso, che non si
dovrebbe utilizzare (ad esempio) le colonne
A:B, e chi ti ha autorizzato di spostare i dati
horizontamente - e, per quanto risulterebbe
i risultati al cliente, a caso!
Ripeto, non opinione mia ma fatto - la prova si
trova nel mio esempio!
Dunque, Norman... dove eravamo rimasti? Ah, si`, al trabocchetto della
"StatusBar". Eh, si`, perche' solo adesso rileggendo capisco cosa
intendevi dire. Mi ero fissato su quel "messagio mostrato al fondo della
finestra di Excel sullo 'Status Bar'". Scusa ma che c`entra, se il
problema e` ben altro?

Il "problema" della routine e` quello che c`e` sempre stato, sin
dall`origine, anche se per un bel po` s`e` parlato d`altro. Di fogli
vuoti, per esempio.

Riassumendo, a modo mio, io ho esordito cosi`:

"Insomma, quello che dici e` giusto ma per valutare il comportamento da
tenere io prima vorrei essere informato piu` in dettaglio riguardo` la
realta` nella quale tale routine viene impiegata, la frequenza d'uso, il
flusso di lavoro, in una parola... lo scopo."

Quando scrivo "quello che dici e` giusto" intendo che concordo con te.
Che sono d`accordo. E` chiaro anche per te che sono *da subito* stato
d`accordo con te?

Quando scrivo "ma [...] io prima vorrei essere informato piu` in
dettaglio" vuol dire che non ha senso analizzare un pezzo di codice come
se fosse *definitivo*, come se fosse stato presentato da me come lo
stato dell`arte sull`argomento.

Quel pezzo di codice era una prima approssimazione per ottenere un
riscontro dal richiedente in modo da capire se ci si e` capiti, come
spesso sono i pezzi di codice che io propongo, perche' non sono prodotti
finiti, perche' non sono pappa pronta, perche' auspico e mi attendo la
collaborazione del richiedente nella loro messa a punto, perche' sono
una indicazione di quali sono i primi passi da percorrere per andare in
una certa direzione.

Poi e` venuta fuori quella maledetta 'StatusBar'... ma ormai era tardi,
dovevo uscire. Amen.
=============

Ti ringrazio della tua risposta.

Posso concordare felicemente con tutto che dica




---
Regards.
Norman

Norman Jones
2008-06-07 07:44:57 UTC
Permalink
Ciao Maurizio,

=============
Post by Norman Jones
A me, la tua nuova versione non fornisce
all'utente la funzionalità che abbiamo
discusso: al primo fogliovuoto, la procedura
esce con un messaggio; l'utente non ha
l'opzione da continuare.
Ciao Norman.

Si`, l'abbiamo discussa, ma non ci siamo trovati d`accordo, quindi?...
;-)
=============

Anche se sia una sensazione stranissima
di non trovarci d'accordo, ripeterei cio'
che dicevo prima:

=============
Che tale funzionalita sia utile è' piuttosto
una questione di gusto ed opinione: le mie
osservazioni non sono state intese come
critica ma come commento costruttivo e
come l'espressione di un altro punto di
vista.
=============

Come con tutte le opinioni, ognuno è libero
a credere cio' che vuole; i miei suggerimenti
non sono altro che dei suggerimenti: li adotta
o non li adotta - non c'è alcuna costrizione
da seguire la strada migliore!

Sarebbe un mondo molto più povero se
avessimo sempre la stessa opinione: basta,
credo, nel nostro caso, che solitamente siamo
d'accordo e che ci capiamo sempre! -:)



---
Regards.
Norman
Maurizio Borrelli
2008-06-07 08:07:18 UTC
Permalink
"Norman Jones" wrote in message news:***@TK2MSFTNGP06.phx.gbl:

[...]
Post by Norman Jones
Come con tutte le opinioni, ognuno è libero
a credere cio' che vuole; i miei suggerimenti
non sono altro che dei suggerimenti: li adotta
o non li adotta - non c'è alcuna costrizione
da seguire la strada migliore!
[...]

Meglio seguire da soli la strada sbagliata scelta da noi piuttosto che
in compagnia di chi ce l`ha indicata, perche' qualcuno finirebbe per
farsi male.

Io non do mai suggerimenti ne' consigli, ne' desidero ottenerne. Do solo
indicazioni motivate, e queste si` mi interessa riceverle.

Le opinioni invece non sono altro che opinioni e lasciano il tempo che
trovano.

Ma i fatti... oh, i fatti!... Quelli li adoro.

(BORRELLI, Maurizio _Cosi` parlo` Maurizio Borrelli_)

--
Ciao!
Maurizio Borrelli [Microsoft MVP Office System]
http://www.riolab.org/
Maurizio Borrelli
2008-06-07 10:17:26 UTC
Permalink
"Norman Jones" wrote in message news:#***@TK2MSFTNGP04.phx.gbl:

Ciao Norman.

[...]
Post by Norman Jones
A me, la tua nuova versione non fornisce
all'utente la funzionalità che abbiamo
discusso: al primo fogliovuoto, la procedura
esce con un messaggio; l'utente non ha
l'opzione da continuare.
Che, come gia` ho precisato, e`appunto cio` che ho deciso di fare.

Tuttavia, per dimostrare (non che ce ne sia bisogno, ne convengo) che
non sono insensibile alle ragioni degli altri, propongo la versione
alternativa, come l'avevo precedentemente descritta:

"emettere al termine una lista delle Cartella di lavoro non rispondenti
ai requisiti"

Questo perche' trovo siano estremamente fastidiosi MsgBox emessi nel bel
mezzo di un`elaborazione, che magari uno se li ritrova di ritorno dalla
pausa caffe`, quando avrebbe sperato conclusa l`elaborazione, o
nell`ipotesi peggiore interrotta per qualche ragionevole motivo.

' UnoPerTutti.xls
' ---------------
' Modulo1 - Modulo standard
'
Option Explicit

Public Sub TuttiPerUno()
Const cPrcName = "TuttiPerUno"
On Error GoTo ErrorHandler
Const cWbExt = "*.xls"
Const cWshIndex = 1
Const cWshOutName = "Uno per tutti"
Const cWshErrName = "Fusione incompleta"
Const cWshLogName = "Lista errori"
Const cWshLogHdr1 = "Cartella di lavoro"
Const cWshLogHdr2 = "Foglio di lavoro"
Const cWshLogHdr3 = "Errore"
Const cWshLogMsg1 = "Vuoto"
Const cSBMsg = "Attendere, prego." _
& " Esecuzione di '<PrcName>' in corso..."
Dim blnSBarState As Boolean
Dim strPathSep As String
Dim strPathName As String
Dim strMyName As String
Dim strFilename As String
Dim strWbInName As String
Dim wshOut As Excel.Worksheet
Dim wshLog As Excel.Worksheet
Dim rngOut As Excel.Range
Dim rngLog As Excel.Range
Dim wbIn As Excel.Workbook
Dim wshIn As Excel.Worksheet
Dim rngIn As Excel.Range

With Application
blnSBarState = .DisplayStatusBar
.StatusBar = Replace(cSBMsg, "<PrcName>", cPrcName)
.DisplayStatusBar = True
.ScreenUpdating = False
.DisplayAlerts = False
strPathSep = .PathSeparator
With .ThisWorkbook
strPathName = .Path
strMyName = .Name
With .Sheets
Set wshOut = .Add(Before:=.Item(1))
Set wshLog = .Add(Before:=wshOut)
End With
End With
End With
Call DeleteWorksheet(cWshOutName)
Call DeleteWorksheet(cWshErrName)
Call DeleteWorksheet(cWshLogName)
Set rngOut = wshOut.Cells(1, 1)
With wshLog
.Name = cWshLogName
Set rngLog = .Cells(1, 1)
End With
With rngLog
.Offset(0, 0).Value = cWshLogHdr1
.Offset(0, 1).Value = cWshLogHdr2
.Offset(0, 2).Value = cWshLogHdr3
Set rngLog = .Offset(1)
End With
If Right$(strPathName, 1) <> strPathSep Then
strPathName = strPathName & strPathSep
End If
strFilename = Dir$(strPathName & cWbExt, vbNormal)
Do While Len(strFilename)
If strFilename <> strMyName Then
Set wbIn = Workbooks.Open(strPathName _
& strFilename _
, ReadOnly:=True _
, AddToMru:=False)
With wbIn
strWbInName = .Name
Set wshIn = .Worksheets.Item(cWshIndex)
End With
With wshIn
Set rngIn = .Cells.Find("*" _
, After:=.Cells(1, 1) _
, LookIn:=xlFormulas _
, LookAt:=xlPart _
, SearchOrder:=xlByRows _
, SearchDirection:=xlPrevious _
, MatchCase:=False)
If rngIn Is Nothing Then
With rngLog
.Offset(0, 0).Value = wbIn.FullName
.Offset(0, 1).Value = wshIn.Name
.Offset(0, 2).Value = cWshLogMsg1
Set rngLog = .Offset(1)
End With
Else
Set rngIn = .Range(.Cells(1, 1), rngIn)
rngIn.Copy rngOut
End If
End With
wbIn.Close SaveChanges:=False
With wshOut.UsedRange
Set rngOut = .Resize(1, 1).Offset(.Rows.Count)
End With
End If
strFilename = Dir$
Loop
If IsEmpty(wshLog.Range("A2").Value) Then
wshOut.Name = cWshErrName
wshLog.Columns.AutoFit
Else
wshOut.Name = cWshOutName
Call DeleteWorksheet(cWshLogName)
End If

ExitProcedure:
With Application
.StatusBar = False
.DisplayStatusBar = blnSBarState
.DisplayAlerts = True
.ScreenUpdating = True
End With
Set rngOut = Nothing
Set wshOut = Nothing
Set rngLog = Nothing
Set wshLog = Nothing
Set rngIn = Nothing
Set wshIn = Nothing
Set wbIn = Nothing
Exit Sub

ErrorHandler:
MsgBox Err.Description _
, vbCritical Or vbOKOnly _
, cPrcName
Resume ExitProcedure

End Sub

--
Ciao!
Maurizio Borrelli [Microsoft MVP Office System]
http://www.riolab.org/
Norman Jones
2008-06-07 10:33:05 UTC
Permalink
Ciao Maurizio,

=============
Tuttavia, per dimostrare (non che ce ne sia bisogno, ne convengo) che
non sono insensibile alle ragioni degli altri, propongo la versione
alternativa, come l'avevo precedentemente descritta:

"emettere al termine una lista delle Cartella di lavoro non rispondenti
ai requisiti"

Questo perche' trovo siano estremamente fastidiosi MsgBox emessi nel bel
mezzo di un`elaborazione, che magari uno se li ritrova di ritorno dalla
pausa caffe`, quando avrebbe sperato conclusa l`elaborazione, o
nell`ipotesi peggiore interrotta per qualche ragionevole motivo.

' UnoPerTutti.xls
' ---------------
' Modulo1 - Modulo standard
'
[...]
=============

Allora, quest'ultima versione mi piace
molto di piu'.

Ci sarebbe, comunque, sempre il problema
della possibilita' della disposizione sbagliata
delle colonne dei dati di riepilogo.

Ovviamente, molto facile rettificare.




---
Regards.
Norman
Maurizio Borrelli
2008-06-07 10:46:53 UTC
Permalink
Post by Norman Jones
Allora, quest'ultima versione mi piace
molto di piu'.
[...]

A me invece sono indifferenti entrambe. E` il "cliente" che deve
decidere.

--
Ciao!
Maurizio Borrelli [Microsoft MVP Office System]
http://www.riolab.org/
Norman Jones
2008-06-07 11:18:09 UTC
Permalink
Ciao Maurizio,

=============
Post by Norman Jones
Allora, quest'ultima versione mi piace
molto di piu'.
[...]

A me invece sono indifferenti entrambe. E` il "cliente" che deve
decidere.
=============

Certissimo!

Vedi che siamo d'accordo di nuovo! -:))

Per concludere il thread, e lasciare tutto al
cliente ai tuoi angeli, vorreie semplicemente
aggiungere che non avrei inseritomi nel
thread se non fosse stato divertito dal tuo:

============
[...]
strPathName = strPathName
[...]
============

Buona giornata!



---
Regards.
Norman
Norman Jones
2008-06-07 11:32:03 UTC
Permalink
Post by Norman Jones
Per concludere il thread, e lasciare tutto al
cliente ai tuoi angeli, vorreie semplicemente
======>>

Per concludere il thread, e lasciare tutto al
cliente e ai tuoi angeli, vorrei semplicemente




---
Regards.
Norman
Maurizio Borrelli
2008-06-07 11:37:19 UTC
Permalink
Post by Norman Jones
=============
Post by Norman Jones
Allora, quest'ultima versione mi piace
molto di piu'.
[...]
A me invece sono indifferenti entrambe. E` il "cliente" che deve
decidere.
=============
Certissimo!
Vedi che siamo d'accordo di nuovo! -:))
Per concludere il thread, e lasciare tutto al
cliente ai tuoi angeli, vorreie semplicemente
aggiungere che non avrei inseritomi nel
============
[...]
strPathName = strPathName
[...]
============
Buona giornata!
Anche a te, Norman, di cuore. Certo che ti diverti con poco pero`... Ci
ho piacere per te, anima nobile e costruttiva.

:-))))

--
Ciao!
Maurizio Borrelli [Microsoft MVP Office System]
http://www.riolab.org/
Maurizio Borrelli
2008-06-07 22:54:04 UTC
Permalink
Dato che non so piu` dove appendere questa ulteriore versione... la
appendo qui:

' UnoPerTutti.xls
' ---------------
' Modulo1 - Modulo standard
'
Option Explicit

Public Sub TuttiPerUno()
Const cPrcName = "TuttiPerUno"
On Error GoTo ErrorHandler
Const cWbExt = "*.xls"
Const cWshIndex = 1
Const cWshOutName = "Uno per tutti"
Const cWshErrName = "Fusione incompleta"
Const cWshLogName = "Lista errori"
Const cWshLogHdr1 = "Cartella di lavoro"
Const cWshLogHdr2 = "Foglio di lavoro"
Const cWshLogHdr3 = "Errore"
Const cWshLogMsg1 = "Vuoto"
Const cSBMsg = "Attendere, prego." _
& " Esecuzione di '<PrcName>' in corso..."
Dim blnSBarState As Boolean
Dim strPathSep As String
Dim strPathName As String
Dim strMyName As String
Dim strFilename As String
Dim strWbInName As String
Dim wshOut As Excel.Worksheet
Dim wshLog As Excel.Worksheet
Dim rngOut As Excel.Range
Dim rngLog As Excel.Range
Dim wbIn As Excel.Workbook
Dim wshIn As Excel.Worksheet
Dim rngIn As Excel.Range

With Application
blnSBarState = .DisplayStatusBar
.StatusBar = Replace(cSBMsg, "<PrcName>", cPrcName)
.DisplayStatusBar = True
.ScreenUpdating = False
.DisplayAlerts = False
strPathSep = .PathSeparator
With .ThisWorkbook
strPathName = .Path
strMyName = .Name
With .Sheets
Set wshOut = .Add(Before:=.Item(1))
Set wshLog = .Add(Before:=wshOut)
End With
End With
End With
Call DeleteWorksheet(cWshOutName)
Call DeleteWorksheet(cWshErrName)
Call DeleteWorksheet(cWshLogName)
Set rngOut = wshOut.Cells(1, 1)
With wshLog
.Name = cWshLogName
Set rngLog = .Cells(1, 1)
End With
With rngLog
.Offset(0, 0).Value = cWshLogHdr1
.Offset(0, 1).Value = cWshLogHdr2
.Offset(0, 2).Value = cWshLogHdr3
Set rngLog = .Offset(1)
End With
If Right$(strPathName, 1) <> strPathSep Then
strPathName = strPathName & strPathSep
End If
strFilename = Dir$(strPathName & cWbExt, vbNormal)
Do While Len(strFilename)
If strFilename <> strMyName Then
Set wbIn = Workbooks.Open(strPathName _
& strFilename _
, ReadOnly:=True _
, AddToMru:=False)
With wbIn
strWbInName = .Name
Set wshIn = .Worksheets.Item(cWshIndex)
End With
With wshIn.Cells
Set rngIn = .Find("*" _
, After:=.Item(1) _
, LookIn:=xlFormulas _
, LookAt:=xlPart _
, SearchOrder:=xlByRows _
, SearchDirection:=xlPrevious _
, MatchCase:=False)
If rngIn Is Nothing Then
With rngLog
.Offset(0, 0).Value = wbIn.FullName
.Offset(0, 1).Value = wshIn.Name
.Offset(0, 2).Value = cWshLogMsg1
Set rngLog = .Offset(1)
End With
Else
Set rngIn = .Range(.Item(1), rngIn)
With rngIn
.Copy rngOut
Set rngOut = rngOut.Resize(1, 1).Offset(.Rows.Count)
End With
End If
End With
wbIn.Close SaveChanges:=False
End If
strFilename = Dir$
Loop
If IsEmpty(wshLog.Range("A2").Value) Then
wshOut.Name = cWshOutName
Call DeleteWorksheet(cWshLogName)
Else
wshOut.Name = cWshErrName
wshLog.Columns.AutoFit
End If

ExitProcedure:
With Application
.StatusBar = False
.DisplayStatusBar = blnSBarState
.DisplayAlerts = True
.ScreenUpdating = True
End With
Set rngOut = Nothing
Set wshOut = Nothing
Set rngLog = Nothing
Set wshLog = Nothing
Set rngIn = Nothing
Set wshIn = Nothing
Set wbIn = Nothing
Exit Sub

ErrorHandler:
MsgBox Err.Description _
, vbCritical Or vbOKOnly _
, cPrcName
Resume ExitProcedure

End Sub

' modUtils - Modulo standard
'
Option Explicit
Option Private Module

Public Function DeleteWorksheet(ByVal Index _
As Variant _
, Optional ByVal wb _
As Excel.Workbook _
) As Boolean
On Error GoTo ErrorHandler
Dim wsh As Excel.Worksheet

If wb Is Nothing Then Set wb = ThisWorkbook
If WorksheetExists(Index, wb) Then
With wb.Sheets
Set wsh = .Item(Index)
If .Count = 1 Then
.Add After:=.Item(1), Type:=xlWorksheet
End If
End With
wsh.Delete
End If
DeleteWorksheet = True

ExitProcedure:
Set wsh = Nothing
Exit Function

ErrorHandler:
Resume ExitProcedure

End Function

Public Function WorksheetExists(ByVal Index _
As Variant _
, Optional ByVal wb _
As Excel.Workbook _
) As Boolean
If wb Is Nothing Then Set wb = ThisWorkbook
On Error Resume Next
WorksheetExists = IsObject(wb.Worksheets.Item(Index))
End Function

--
Ciao!
Maurizio Borrelli [Microsoft MVP Office System]
http://www.riolab.org/
Norman Jones
2008-06-07 23:12:39 UTC
Permalink
Ciao Maurizio,

=============
Dato che non so piu` dove appendere questa ulteriore versione... la
appendo qui:
[...]
=============

Forse sarebbe utilie avere un thread di
riepilogo! -:

Mi dà molto piacere segnalare che questa
versione affronta e supera tutti i problemi
che abbiamo discusso. Spero che il cliente
sia similmente contento!



---
Regards.
Norman
Continua a leggere su narkive:
Loading...