copyz la cellule s'il contient du text

Les données sont transférées d'un formulaire Web vers Excel. Chaque cellule ne reçoit pas toutes les inputs. Il existe de nombreuses cellules, il est long de searchr chaque cellule à la search de text.

Comment puis-je get le text copié automatiquement de sheet1 vers sheet2. Mais je ne veux pas que les cellules s'affichent dans la même layout que la feuille d'origine. J'aimerais qu'ils soient regroupés, éliminant toutes les cellules vides entre les deux. Je voudrais également saisir le titre de la ligne qui contient le text.

J'ai trouvé cette macro:

Sub CopyC() Dim SrchRng As Range, cel As Range Set SrchRng = Range("C1:C10") For Each cel In SrchRng If cel.Value <> "" Then cel.Offset(2, 1).Value = cel.Value End If Next cel 

Il saisit uniquement les cellules qui contiennent du text, mais il l'affiche dans la même disposition exacte qu'il l'a trouvée. Toute aide serait appréciée et économise beaucoup de time d'parsing dans le futur, merci d'avance 🙂

Je suppose que c'est ce que vous searchz:

 Sub CopyNonBlankCells() Dim cel As Range, myRange As Range, CopyRange As Range Set myRange = Sheet1.Range("C1:C20") '---> give your range here For Each cel In myRange If Not IsEmpty(cel) Then If CopyRange Is Nothing Then Set CopyRange = cel Else Set CopyRange = Union(CopyRange, cel) End If End If Next cel CopyRange.Copy Sheet2.Range("C1") '---> enter desired range to paste copyd range without blank cells End Sub 

Le code ci-dessus va copyr la plage C1:C20 dans Sheet1 à C1 dans Sheet2

Je l'ai vu ici .

EDIT : La réponse suivante est basée sur votre commentaire ________________________________________________________________________________

Si vous écrivez quelque chose comme ci-dessous

 Set myRange = Sheet1.Range("G:G") Set myRange = Sheet2.Range("G:G") 

myRange sera réglé pour Sheet1.Range("G:G") , puis sur Sheet2.Range("G:G") qui signifie que la scope actuelle que myRange aura est Sheet2.Range("G:G") .

Si vous souhaitez utiliser plusieurs gammes, vous pouvez accéder à la fonction UNION , mais il existe une limitation à l'aide de l'UNION. Vous pouvez combiner différentes gammes mais une seule feuille. Et votre exigence est de combiner les gammes de différentes feuilles. Pour ce faire, j'ajoute une nouvelle feuille de calcul et j'ajoute vos gammes G:G de toutes les feuilles. Ensuite, après l'utilisation de la feuille nouvellement ajoutée, je la supprime.

Le code suivant vous donnera la sortie souhaitée dans la feuille intitulée Result .

 Sub CopyNonBlankCells() Dim cel As Range, myRange As Range, CopyRange As Range Dim wsCount As Integer, i As Integer Dim lastRow As Long, lastRowTemp As Long Dim tempSheet As Worksheet wsCount = Worksheets.Count '--->wsCount will give the number of Sheets in your workbook Set tempSheet = Worksheets.Add '--->new sheet added tempSheet.Move After:=Worksheets(wsCount + 1) For i = 1 To wsCount If Sheets(i).Name <> "Result" Then '---> not considering sheet "Result" for taking data lastRow = Sheets(i).Cells(Rows.Count, "G").End(xlUp).Row '--->will give last row in sheet lastRowTemp = tempSheet.Cells(Rows.Count, "G").End(xlUp).Row '--->will give last row in newly added sheet Sheets(i).Range("G1:G" & lastRow).Copy _ tempSheet.Range("G" & lastRowTemp + 1).End(xlUp)(2) End If Next i lastRowTemp = tempSheet.Cells(Rows.Count, "G").End(xlUp).Row Set myRange = tempSheet.Range("G1:G" & lastRowTemp) '--->setting range for removing blanks cells For Each cel In myRange If Not IsEmpty(cel) Then If CopyRange Is Nothing Then Set CopyRange = cel Else Set CopyRange = Union(CopyRange, cel) End If End If Next cel CopyRange.Copy Sheets("Result").Range("G1") '---> enter desired range to paste copyd range without blank cells Application.DisplayAlerts = False tempSheet.Delete '--->deleting added sheet Application.DisplayAlerts = True End Sub 

Vous pouvez utiliser des arrays!

Au lieu de copyr des informations d'une cellule à une autre, vous pouvez d'abord stocker toutes vos informations dans un tableau, puis imprimer le tableau sur une autre feuille. Vous pouvez indiquer le tableau pour éviter les cellules vides. En règle générale, l'utilisation de arrays est la meilleure façon de stocker des informations. (Souvent le moyen le plus rapide de travailler avec les informations)

Si vous ne cherchez qu'une seule colonne, vous pouvez utiliser un tableau unidimensionnel. Si vous regardez plusieurs colonnes et souhaitez imprimer les informations dans la colonne correspondante (mais différentes cellules) dans une autre page, vous pourriez avoir un multidimensional array pour stocker le numéro de colonne / tout ce que vous vouliez.

De votre code, il pourrait ressembler à ceci:

 Sub CopyC() Dim SrchRng As Range, cel As Range 'Declare your 1-d array (I don't know what you are storing) Dim myarray() as variant Dim n as integer Dim i as integer Set SrchRng = Range("C1:C10") 'define the number of elements in the array - 1 for now, increase it as we go n = 0 Redim myarray(0 to n) For Each cel In SrchRng If cel.Value <> "" Then 'redim preserve stores the previous values in the array as you redimension it Redim Preserve myarray(0 to n) myarray(n) = cel.Value 'increase n by 1 so next time the array will be 1 larger n = n + 1 End If Next cel 'information is now stored, print it out in a loop 'this will print it out in sheet 2 providing it is called "Sheet2" For i = 0 to ubound(myarray) Sheets("Sheet2").cells(i,1).value = myarray(i) Next i