2017-08-25 19 views
0

主な目標は次のとおりです。列参照名を使用して、フィルタ処理された表の各行から特定のセル値を取得します。VBA:Range.Areaの各行からセル値を取得

これまでのところ、私は次のコード

Dim table As listObject 
Dim columns As ListColumns 
Dim row As ListRow 
Dim rnData As range 
Dim rngArea As range 

Set table = Sheets(sheetName).ListObjects(TableName) 
Set columns = table.ListColumns 
Set rnData = ThisWorkbook.Worksheets(sheetName).ListObjects(TableName).range 
'Notice that sheetName and TableName are function arguments. No need to pay attention. Consider any string values. 

'Filter my table 
table.range.AutoFilter Field:=7, Criteria1:=Array("filtervalue1", "filtervalue2"), Operator:=xlFilterValues 

'Set the filtered table in a new Range object 
Set rnData = ThisWorkbook.Worksheets(sheetName).ListObjects(TableName).range 

'Count all rows of my filtered table 
With rnData 
    For Each rngArea In .SpecialCells(xlCellTypeVisible).Areas 
     lCount = lCount + rngArea.Rows.Count 
    Next 
End with 

を持っている今、私はループに私のフィルタリングテーブル(私の「rnData」の範囲を)したいと私はそれらのRange.Areasの行ごとにセルの値を取得したいです。

私はこのような何かを考えていたが、私はこれを行うには、VBAで困難を抱えている:

For iRowNo = 2 To (lCount - 1) 'Start at 2 because 1 is the table header 
      'This does not work once it gets another row from the entire table. Not the filtered one. Help here! 
      Set row = table.ListRows(iRowNo) 

      'Something close to this - Help Here! 
      Set row = rnData.SpecialCells(xlCellTypeVisible).Areas 

      ''Would like to have the code like this to get the values 
      cell1Value= row.range(1, columns("My Column Header 1").Index).value 
      cell2Value= row.range(1, columns("My Column Header 2").Index).Value 

Next iRowNo 

はこれより異なる解決策がある場合は、私に教えてください。

+1

なぜ '各rngAreaについて...'ループは[それぞれのために '別の実行内部variable] in rngArea.rows' loop?この方法ですべての行を取得します(1つのセルに移動する場合は '[variable] .cells(1、y)'が必要なので、その制限内の行全体を参照していることに留意してください) –

+0

命令不明(私の悪い英語のために申し訳ありません)、あなたはあなたが持っているものとあなたが望むものの写真を追加できますか?他の人にとってもより簡単になると思います。 – AntiDrondert

+0

@DirkReichelそれを持ってきてくれてありがとう!それが問題を解決します。私は自分の質問に答えます。 –

答えて

1

は私のために働いていたコードは次のとおりです。

Dim table As listObject 
Dim columns As ListColumns 
Dim row As ListRow 
Dim rnData As range 
Dim rngArea As range 

Set table = Sheets(sheetName).ListObjects(TableName) 
Set columns = table.ListColumns 
Set rnData = ThisWorkbook.Worksheets(sheetName).ListObjects(TableName).range 
'Notice that sheetName and TableName are function arguments. No need to pay attention. Consider any string values. 

'Filter my table 
table.range.AutoFilter Field:=7, Criteria1:=Array("filtervalue1", "filtervalue2"), Operator:=xlFilterValues 

'Set the filtered table in a new Range object 
Set rnData = ThisWorkbook.Worksheets(sheetName).ListObjects(TableName).range 

'Get values for each row 
With rnData 
    For Each rngArea In .SpecialCells(xlCellTypeVisible).Areas 
     For Each row In rngArea.Rows 
      cell1Value= row.range(1, columns("My Column Header 1").Index).value 
      cell2Value= row.range(1, columns("My Column Header 2").Index).Value 
     Next 

     'lCount = lCount + rngArea.Rows.Count 'Removed this. 
    Next 
End with 

'Also no need the second part of code with the For..Next loop. 
1

あなたは間接的に1つの投稿を簡単に説明できるものではない配列を作成しようとしていると思いますが、ここでは始めるためのコードがあります。

私はあなたの設定がrnDataの範囲が正しいと仮定します。そこから、おそらく範囲内のすべてのセルをループするのが最も簡単です。あなたは以下より正確なコードを書くことができますが、これはあなたが試していること以外にいくつかのアイデアを見るのに役立ちます。

私はあなたが配列を作成する方法を探していると思います。私はこれが役立つことを願っていますここで@DirkReichel答え

に続いて

Sub testCoutinho() 
Dim Rcell As Range 
Dim rnData As Range 'you'll have to set this up... 

Dim YesLetsDoAnArray As Boolean: YesLetsDoAnArray = False 'or change to false to just make a new sheet with values 

If YesLetsDoAnArray Then 
    ReDim This_is_your_Array(0) As Variant 'Create Array 
    Dim x As Integer 
Else 
    'putting values on a new worksheet in file 
    Dim CleanWS As Worksheet: Set CleanWS = ThisWorkbook.Sheets.Add 
End If 


For Each Rcell In rnData.Cells 

    If Rcell.EntireRow.Hidden = False Then 

     If YesLetsDoAnArray Then 
      ReDim Preserve This_is_your_Array(x) 
      This_is_your_Array(x) = Rcell.Value 
      x = x + 1 
     Else 
      CleanWS.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Value = Rcell.Value 
     End If 
    End If 
Next Rcell 


'If you used an array, you'll know have variable(s) that contain all your data. 
'your first one is This This_Is_Your_Array(0), followed by This_Is_Your_Array(1)... etc. 
'you can play around. this will print them all. 

If YesLetsDoAnArray Then 
Dim i As Integer 

For i = 0 To x - 1 
Debug.Print This_is_your_Array(i) 
Next i 
End If 


End Sub 
+0

ありがとう、これはオプションかもしれませんが、私は自分のコードと似たままにして、listobjectデータ型を使いたいと思っていました。 –

関連する問題