XL 2016 Visible Cells into Array after filter

R_da

XLDnaute Nouveau
Hello Everyone,

i'm new to vba and I want to make a filter depending on some criteria and then copy the visible cells into an array.
I made the code below but it takes even the hidden cells values.
Can anyone please help me?
Sub BOM_extract()

Dim i As Long
Dim lastline As Long
Dim code_obj As String

Set Datasheet = Sheets("Data")
Set TSheet = Sheets("Raw_data")

Datasheet.Select
Selection.AutoFilter

Datasheet.Select
Datasheet.Range("$A$2:$EI$254").AutoFilter Field:=11, Criteria1:="Table"

lastline = Datasheet.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count - 1

Dim my_code_obj() As String
ReDim my_code_obj(1 To lastline)

For i = 1 To lastline

my_code_obj(i) = Range("A3").Offset(1).SpecialCells(xlCellTypeVisible).Cells(i, 1).Value

Next i

TSheet.Select
Range("B3:B" & lastline).Value = Excel.WorksheetFunction.Transpose(my_code_obj)

End Sub


it would be appreciated
 

Staple1600

XLDnaute Barbatruc
Bonsoir Dudu2

Mon GT fonctionne bien.
J'avoue c'est un peu chronophage
Traduction brut de décoffrage du message#1
La Machine de G..gle¸ cbo le progrès¸ à dit:
Je suis nouveau sur vba et je souhaite créer un filtre en fonction de certains critères,
puis copier les cellules visibles dans un tableau.
J'ai créé le code ci-dessous mais il prend même les valeurs des cellules cachées.
Est-ce que quelqu'un peut m'aider s'il vous plait?
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Et pourquoi pas ? (Why not ?)
VB:
Sub Listing()
Dim lastrow&, lastcol&
   Application.ScreenUpdating = False
   With Sheets("List")
      If .FilterMode Then .ShowAllData
      .Range("b3:d" & Rows.Count).ClearContents
   End With

   With Sheets("Data")
      .Activate
      If .FilterMode Then .ShowAllData
      lastrow = .Cells(.Rows.Count, DataNumCol_Catégorie).End(xlUp).Row
      lastcol = .Cells(2, Columns.Count).End(xlToLeft).Column
      .Range(Range("a2"), .Cells(lastrow, lastcol)).AutoFilter Field:=DataNumCol_Catégorie, Criteria1:="<>Hardware"
      lastrow = .Cells(.Rows.Count, DataNumCol_Catégorie).End(xlUp).Row
      If lastrow < 3 Then Exit Sub
      .Range(.Cells(3, DataNumCol_Désignation), .Cells(lastrow, DataNumCol_Désignation)).Copy Sheets("List").Range("b3")
      .Range(.Cells(3, DataNumCol_Réference), .Cells(lastrow, DataNumCol_Réference)).Copy Sheets("List").Range("c3")
      .Range(.Cells(3, DataNumCol_Catégorie), .Cells(lastrow, DataNumCol_Catégorie)).Copy Sheets("List").Range("d3")
   End With
   Application.Goto Sheets("List").Range("a1"), True
End Sub
 

R_da

XLDnaute Nouveau
Hello @Dudu2
merci pour ton aide.
je cherche à ajouter une condition avant de copier les données.
la condition est pour i = 1 To Area.Rows.Count
si valeur de la column B = column G
it should be counted once in my table

is it possible?

merci beaucoup
 

Pièces jointes

  • Test(3) (1).xlsm
    29 KB · Affichages: 11

R_da

XLDnaute Nouveau
Bonjour @Dudu2

merci beaucoup pour ta réponse rapide.
j'ai une erreur "Erreur d'exécution 9 : L'indice n'appartient pas.."
excel ne détecte pas le nom de la feuille.

aussi, est-ce que c'est possible de comparer que les 5 premier caractère et si left(valeur de la column B ,5)= left(column G,5)
alors il le compte une seule fois

je te remercie infiniement
 

Dudu2

XLDnaute Barbatruc
Bonjour,
Il n'y a pas d'erreur dans le fichier envoyé.
Si tu utilises la Macro avec un autre classeur dont les noms de feuilles diffèrent, c'est à toi de d'indiquer les noms à la Macro.
VB:
    'Worksheets
    Set WS_Data = Worksheets("Data")
    Set WS_List = Worksheets("List")

J'ai modifié la comparaison entre les colonnes B et G mais PAS la comparaison pour la recherche des dupes de la colonne B.
 

Pièces jointes

  • Test(3) (1).xlsm
    31.9 KB · Affichages: 3

Dudu2

XLDnaute Barbatruc
Bonjour,
Si tu fais référence à la valorisation de la feuille List c'est la dernière instruction:
VB:
'Value WS_List range with the table content
WS_List.Range("B3").Resize(UBound(TabValues, 2), 3).Value = Application.Transpose(TabValues)
On prend comme "base" (basis) la cellule B3, et on la redimensionne en hauteur (nombre de lignes) du nombre de valeurs trouvées qui sont en table TabValues (UBound(TabValues, 2)) et en largeur (nombre de colonnes) de 3.

Si tu veux copier ce même résultat en E9 tu changes B3 en E9.
 

Dudu2

XLDnaute Barbatruc
Mais j'ai peut-être mal compris ta demande.
Si tu veux que la Catégorie soit la 1ère colonne, tu as de la chance que je paramètre à peu près tout.
Code:
Private Const TabNumCol_Désignation = 1
Private Const TabNumCol_Référence = 2
Private Const TabNumCol_Catégorie = 3
Tu changes l'ordre défini dans ces constantes, par exemple:
Code:
Private Const TabNumCol_Désignation = 2
Private Const TabNumCol_Référence = 3
Private Const TabNumCol_Catégorie = 1
 

Discussions similaires

Réponses
2
Affichages
671