0

フィルタリングする情報は 4 行あります。(月、名前、サービス、単位) 名前と月で情報をフィルタリングします。(必要な情報に応じて) フィルター処理されたデータの一番上の行を取得して別のシートに配置するために、次のようにまとめました。

Sub Mine()
   Dim sht1 As Worksheet
   Dim sht2 As Worksheet
   Dim lRow As Long

      Set sht1 = ThisWorkbook.Sheets("Export")
      Set sht2 = ThisWorkbook.Sheets("DB1")

      lRow = sht1.Cells(Rows.Count, "A").End(xlUp).Row + 1

      sht1.Range("b" & lRow) = sht2.Range("A2" & Cells.SpecialCells(xlCellTypeLastCell).Row).SpecialCells(xlCellTypeVisible) 'Month
      sht1.Range("a" & lRow) = sht2.Range("E2" & Cells.SpecialCells(xlCellTypeLastCell).Row).SpecialCells(xlCellTypeVisible) 'Client Name
      sht1.Range("c" & lRow) = sht2.Range("C2" & Cells.SpecialCells(xlCellTypeLastCell).Row).SpecialCells(xlCellTypeVisible) 'Service
      sht1.Range("d" & lRow) = sht2.Range("H1" & Cells.SpecialCells(xlCellTypeLastCell).Row).SpecialCells(xlCellTypeVisible) 'Units

  End Sub

これはエラーにはなりません。「エクスポート」シートに何もコピーされません。あるシートから別のシートに何かをコピーする唯一の方法は、特別なセルを取り出すことです。次のように...

Sub Mine()
 Dim sht1 As Worksheet
 Dim sht2 As Worksheet
 Dim lRow As Long

     Set sht1 = ThisWorkbook.Sheets("Export")
     Set sht2 = ThisWorkbook.Sheets("DB1")

     lRow = sht1.Cells(Rows.Count, "A").End(xlUp).Row + 1

     sht1.Range("b" & lRow) = sht2.Range("A2") 'Month
     sht1.Range("a" & lRow) = sht2.Range("E2") 'Client Name
     sht1.Range("c" & lRow) = sht2.Range("C2") 'Service
     sht1.Range("d" & lRow) = sht2.Range("H1") 'Units

End Sub

ただし、前に述べたように、フィルター処理されているかどうかに関係なく、最初の行のみがコピーされます。私の目標は、「DB1」のフィルタリングされた一番上の行を取得し、それを「エクスポート」のシーケンスされたセルにコピーすることです。どんな援助でも大歓迎です。

-JGr3g

4

1 に答える 1

1

さて、あなたのコードはあなたが思っていることをしているとは思いません。いくつか分解してみましょう

sht2.Range("A2" & Cells.SpecialCells(xlCellTypeLastCell).Row).SpecialCells(xlCellTypeVisible)

あなたはそれを呼び出しsht2.Range()て文字列を渡しています。その文字列は と を連結"A2"したものCells.SpecialCells(xlCellTypeLastCell).Row).SpecialCells(xlCellTypeVisible)です。

とはCells.SpecialCells(xlCellTypeLastCell).Row).SpecialCells(xlCellTypeVisible)? 暗黙のうちCellsに、アクティブなスプレッドシートのすべてのセルを表す範囲ThisWorkbook.ActiveSheet.Cellsです。それなら、あなたはそれを要求しSpecialCells(xlCellTypeLastCell)て取りますか?sht1 と sht2 はどうなりましたか? それらを使用していない、アクティブ シートを使用している?

したがって、アクティブ シートの最後のセルが行 50 にある場合、最後に使用された行が 50 である"A2" & 50ため"A250"、どちらが空白になるかを尋ねています...

まず最初に、セルの検索に文字列連結を使用しないことをお勧めします。このようなものはありませ"A" & numericVariableん。のようなもっと直接的なものを使用してくださいCells(numericVariable, 1)。過度の文字列操作はおそらくあなたを傷つけます。セル プロパティは、行と列をパラメーターとして受け取ることができます。

ファイル化された範囲はテーブル/リストオブジェクトですか、それともオートフィルターが適用された単純な古い範囲ですか? リスト オブジェクトの場合は、リスト オブジェクトを取得し、それを DataBodyRange で取得し、それを使用.SpecialCells(xlCellTypeVisible)して、結果の範囲の最初の行を取得します。

同様に、自動フィルター処理された範囲の場合は、対象のデータ範囲であるデータ範囲全体を取得します。それができたら、表示されているセルを取得してから、最初の行を取得します。

編集:テストされていない例

set targetRow = ws.Range(ws.Cells(2, 1), ws.Cells(lRow, 5)).SpecialCells(xlCellTypeVisible).Row(1)
targetSheet.Range("A2") = targetRow.Cells(1,2)

さて、これは何をしているのですか?私はワークシート変数wsを取り、その範囲を取得しています。.Range(ws.Cells(2, 1), ws.Cells(lRow, 5)). その範囲は、2 行目、1 列目、つまり"A2". 5 列目の lRow に含まれる行番号、別名 に移動し"E" & lRowます。

そこから、可視セルのみ.SpecialCells(xlCellTypeVisible)を取得し、選択範囲の最初の領域の最初の行を取得します.Row(1)

最初の行を取得したら、.Cellsまたはを使用して、そこから別の列を取得できます.Column

于 2013-10-24T17:09:26.323 に答える