James ha alcuni dati in un foglio di lavoro contenuto in una serie di righe. Una delle colonne nei dati include celle con più righe per cella. (I dati nella cella sono stati separati in righe premendo Alt + Invio tra gli elementi.) James vorrebbe suddividere questi dati in più righe. Ad esempio, se ci fossero tre righe di dati in una singola cella nella riga, i dati in quella cella dovrebbero essere suddivisi in tre righe.

Excel offre un modo pratico per dividere i dati in colonne separate utilizzando lo strumento Testo in colonne. Questo può essere utilizzato per dividere i dati in base alla presenza del carattere ASCII 10, che è ciò che Excel inserisce quando si preme Alt + Invio. Il problema è che mentre questo divide correttamente i dati in colonne separate, non li ottiene in righe separate, come richiesto da James.

Ciò significa che la soluzione a questo problema deve includere l’uso di una macro. Un approccio è illustrato nel codice seguente. In questo esempio, la macro presume che tu voglia “espandere” tutto nel foglio di lavoro e che i dati nel foglio di lavoro inizino nella riga 1.

Sub CellSplitter1()

Dim Temp As Variant     Dim CText As String     Dim J As Integer     Dim K As Integer     Dim L As Integer     Dim iColumn As Integer     Dim lNumCols As Long     Dim lNumRows As Long

iColumn = 4

Set wksSource = ActiveSheet     Set wksNew = Worksheets.Add

iTargetRow = 0     With wksSource         lNumCols = .Range("IV1").End(xlToLeft).Column         lNumRows = .Range("A65536").End(xlUp).Row         For J = 1 To lNumRows             CText = .Cells(J, iColumn).Value             Temp = Split(CText, Chr(10))

For K = 0 To UBound(Temp)

iTargetRow = iTargetRow + 1                 For L = 1 to lNumCols                     If L <> iColumn Then                         wksNew.Cells(iTargetRow, L) _                           = .Cells(J, L)

Else                         wksNew.Cells(iTargetRow, L) _                           = Temp(K)

End If                 Next L             Next K         Next J     End With End Sub

Nota che per eseguire la macro, dovrai specificare, utilizzando la variabile iColumn, la colonna che contiene le celle da dividere.

Come scritto qui, la macro divide le informazioni nella quarta colonna. Inoltre, le versioni separate delle celle vengono archiviate in un nuovo foglio di lavoro, in modo che il foglio di lavoro originale non sia affatto interessato.

La macro si basa sull’uso della funzione Split per separare le celle multilinea. Questa funzione è disponibile solo a partire da Excel 2000 e non è affatto disponibile in Excel per Mac. Inoltre, potresti voler eseguire la macro solo su una particolare selezione di celle. Per superare tutti questi potenziali problemi, ti consigliamo di considerare invece la seguente macro:

Sub CellSplitter2()

Dim iSplitCol As Integer     Dim iEnd As Integer     Dim sTemp As String     Dim iCount As Integer     Dim i As Integer     Dim wksNew As Worksheet     Dim wksSource As Worksheet     Dim lRow As Long     Dim lRowNew As Long     Dim lRows As Long     Dim lRowOffset As Long     Dim iTargetRows As Integer     Dim iCol As Integer     Dim iCols As Integer     Dim iColOffset As Integer     Dim AWF As WorksheetFunction

On Error GoTo ErrRoutine     Application.ScreenUpdating = False

'Set Column to split     iSplitCol = 4

iCols = Selection.Columns.Count     lRows = Selection.Rows.Count

iColOffset = Selection.Column - 1     lRowOffset = Selection.Row - 1     lRowNew = lRowOffset          Set wksSource = ActiveSheet     Set wksNew = Worksheets.Add

Set AWF = Application.WorksheetFunction     With wksSource         For lRow = (lRowOffset + 1) To (lRowOffset + lRows)

sTemp = .Cells(lRow, iSplitCol)

If Right(sTemp, 1) <> vbLf Then                 sTemp = sTemp & vbLf             End If             iCount = (Len(sTemp) - _               Len(AWF.Substitute(sTemp, vbLf, "")))



For iTargetRows = 1 To iCount                 lRowNew = lRowNew + 1                 For i = (iColOffset + 1) To (iColOffset + iCols)

If i <> iSplitCol Then                         wksNew.Cells(lRowNew, i) _                           = .Cells(lRow, i)

Else                         iEnd = InStr(sTemp, vbLf)

wksNew.Cells(lRowNew, i) _                           = Left(sTemp, iEnd - 1)

sTemp = Mid(sTemp, iEnd + 1)

End If                 Next i             Next iTargetRows         Next lRow     End With

ExitRoutine:

Set wksSource = Nothing     Set wksNew = Nothing     Set AWF = Nothing     Application.ScreenUpdating = True     Exit Sub

ErrRoutine:

MsgBox Err.Description, vbExclamation     Resume ExitRoutine End Sub

La macro si basa ancora sull’uso di una variabile per indicare la colonna da dividere. In questo caso, la variabile è iSplitCol ed è impostata sulla colonna 4. La macro funziona solo sulle celle selezionate quando viene eseguita per la prima volta e le celle divise vengono trasferite in un nuovo foglio di lavoro. L’indirizzo della cella in alto a sinistra nel nuovo foglio di lavoro è lo stesso della cella in alto a sinistra selezionata quando viene eseguita la macro.

_Nota: _

Se desideri sapere come utilizzare le macro descritte in questa pagina (o in qualsiasi altra pagina dei siti ExcelTips), ho preparato una pagina speciale che include informazioni utili.

ExcelTips è la tua fonte di formazione economica su Microsoft Excel.

Questo suggerimento (3263) si applica a Microsoft Excel 97, 2000, 2002 e 2003. Puoi trovare una versione di questo suggerimento per l’interfaccia a nastro di Excel (Excel 2007 e versioni successive) qui: