出産前後の痔にはご注意!

データのリストからオートフィルターでE列のある特定のデータを表示し、それが複数の場合、最下行は
Cells(ActiveSheet.Rows.Count, "E").End(xlUp).Row
で取得できますが、見出しのすぐ下に来る一番目のデータがある最上行はどうやって取得したらいいのでしょうか?

よろしくお願いします。

A 回答 (1件)

オートフィルタで非表示になっている行ではRowsのHiddenプロパティがTrueになっていることを利用して、



Dim 行 As Long
行 = 2
While ActiveSheet.Rows(行).Hidden
  行 = 行 + 1
Wend

とすると、変数「行」に先頭の行番号が入ります。
    • good
    • 7
この回答へのお礼

ありがとうございました。
出来ました。

でも、よく考えたらオートフィルターで検索してE列の一番上に来るセルの行番号ならMatchでも求められましたね。教えていただいた方法もとても勉強になりました。ありがとういございます。

Sub FirstRow()
検索値 = "XX"
MsgBox Application.Match(検索値, Columns("E"), 0)
End Sub

お礼日時:2005/04/03 10:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QエクセルVBAでフィルタ抽出部分のみのコピー

エクセルVBAで売上帳を作成していますが、オートフィルタでデータ抽出した後、表示されている行のみをコピーして別シートに貼りつけるにはどうすればよいのでしょう?

別シートは指定したセルに値のみの貼り付けをしたいと思っています。

宜しくお願いします。

Aベストアンサー

こんにちは
マクロの記録で作成した一例です。コメントを読んで、適当にアレンジして下さい。

Option Explicit
Sub SampleMacro1()
'
' SampleMacro1 Macro
' マクロ記録日 : 2009/3/13
'
 'フィルター部分
 Selection.AutoFilter Field:=1, Criteria1:="=ほげほげ", Operator:=xlAnd
 '可視セルの選択
 Selection.SpecialCells(xlCellTypeVisible).Select
 '選択範囲のコピー
 Selection.Copy
 'コピー先のシート&セル選択
 Sheets("Sheet2").Select
 Range("A1").Select
 'ペースト
 ActiveSheet.Paste
 'コピー元シートに戻りコピー状態解除
 Sheets("Sheet1").Select
 Application.CutCopyMode = False
 Range("A1").Select
End Sub

外してたら、ごめんなさい

こんにちは
マクロの記録で作成した一例です。コメントを読んで、適当にアレンジして下さい。

Option Explicit
Sub SampleMacro1()
'
' SampleMacro1 Macro
' マクロ記録日 : 2009/3/13
'
 'フィルター部分
 Selection.AutoFilter Field:=1, Criteria1:="=ほげほげ", Operator:=xlAnd
 '可視セルの選択
 Selection.SpecialCells(xlCellTypeVisible).Select
 '選択範囲のコピー
 Selection.Copy
 'コピー先のシート&セル選択
 Sheets("Sheet2").Select
 Range("A1").Select
 'ペース...続きを読む

QEXCELのVBA-フィルタ抽出後のセル選択方法

EXCELのVBAです。
 オートフィルタ(Autofilter)で、何らかの条件で抽出をかけた後の部分で、
特定のセル、例えば、2列目の上から5番目のセル、を選択するには、
どうすれば良いでしょう?

 言い方を変えれば、可視セルの中だけで、何列目で何行目セルという指定
をするにはどうすれば良いかと。

 RangeとかSelectionで、指定する方法が有るのでしょうか?

よろしくお願いいたします。

Aベストアンサー

回答1~3をした者です。
私が訂正したところが直っていれば正しく走ると思うのですが。
(win7pro32bit, xl2003で確認)

Sub test()
Dim c As Range
Dim i As Integer
For Each c In ActiveSheet.Columns(2).SpecialCells(xlCellTypeVisible)
i = i + 1
If i = 6 Then  '←1行目はヘッダー行なので
c.Select
Exit Sub
End If
Next
End Sub

QExcelでフィルターのかかっているときの最終行の取り方。

Dim mySh As Worksheet


Set mySh = Sheet("Sheet1")

Debug.Print mySh.Cells(mySh.Rows.Count,1).End(xlup).Row

でデータのあるA列の最終行を取得していますが、この場合、フィルターがかかっていると実際のデータのある最終行でなくて見えている部分の最終行が返ってきます。

Excel2003 SP3
WindowsXP SP3

フィルターがかかっていても実際のデータのある最終行を取得する方法あるのでしょうか?

Aベストアンサー

A列とフィルタ範囲が別の場合も考慮してみました。

Dim mySh As Worksheet
Dim c As Range
Dim cRow As Long
Dim Row1 As Long
Dim Row2 As Long

Set mySh = Sheets("Sheet1")
Row1 = mySh.Cells(mySh.Rows.Count, 1).End(xlUp).Row
If ActiveSheet.AutoFilterMode Then
Row2 = mySh.AutoFilter.Range(mySh.AutoFilter.Range.Count).Row
End If
For Each c In mySh.Range(mySh.Cells(Row1, 1), mySh.Cells(Row2, 1))
If c <> "" Then cRow = c.Row
Next
MsgBox cRow

A列とフィルタ範囲が別の場合も考慮してみました。

Dim mySh As Worksheet
Dim c As Range
Dim cRow As Long
Dim Row1 As Long
Dim Row2 As Long

Set mySh = Sheets("Sheet1")
Row1 = mySh.Cells(mySh.Rows.Count, 1).End(xlUp).Row
If ActiveSheet.AutoFilterMode Then
Row2 = mySh.AutoFilter.Range(mySh.AutoFilter.Range.Count).Row
End If
For Each c In mySh.Range(mySh.Cells(Row1, 1), mySh.Cells(Row2, 1))
If c <> "" The...続きを読む

QExcelで可視セルの行番号取得

Excelでグラフ(散布図)のポイントをクリックしたときに、そのグラフ上の何番目かを所得してレコード情報をフォーム上に表示するように作成しました。
しかし、オートフィルタで絞り込んだ場合には取得した番号と行番号が一致しないので困っています。
そこで質問なのですが
1.可視セルの何番目というような取得方法はあるのでしょうか?
2.それともグラフからポイントの何番目というのではなく、元データの行番号は取得可能でしょうか?

分かりにくい質問で申し訳ないのですが、よろしくお願いします。

Aベストアンサー

こんにちは。
元のコードがなくては、よく分かりませんが、こういうことでしょうか?

'サンプルコード
'可視セルを順番に取得しているはずです。

Sub test1()
 Dim myRows As String, c As Range
 Dim Rng As Range
 On Error GoTo 0
 '1番上をフィールド名(項目行)だとしたら
 Set Rng = Range("A2", Range("A2").End(xlDown)).SpecialCells(xlCellTypeVisible)
 On Error Resume Next
 For Each c In Rng.Cells
  myRows = myRows & "," & c.Row
 Next
 MsgBox Mid$(myRows, 2)
End Sub

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QエクセルVBAで5行目からオートフィルタモードに設定したいたい

抽出項目が5行目にあり、オートフィルタを5行目から表示させたいのですが、うまくいきません。
Macro1では項目が消えてしまい、▼が1行目に、Macro2では項目は残りますが、▼は同じく1行目になってしまいます。どうしたら5行目にオートシェイプの▼が配置できるでしょうか?
Sub Macro1()
Range("A5").Select
Selection.AutoFilter
End Sub

Sub Macro2()
Range("A5").AutoFilter
End Sub

Aベストアンサー

こんばんは。

通常は、これでよいのですが、
Sub Macro2()
Range("A5").AutoFilter
End Sub

つまり、Range("A5").CurrentRegion という同じ設定になるので、そこを含む、4角形の連続の範囲の頂点からが、AutoFilter に組み込まれます。通常は、フィルターモードに取り込り込みたくないデータは、間を空けると良いのですね。

もし、そういう状況なら、私なら、こう書きますが、こんな面倒なことしなくてもよいです。

Sub Macro3()
  ActiveSheet.AutoFilterMode = False
 With Range("A5").CurrentRegion
   .Rows(5).HorizontalAlignment = xlCenter '真ん中寄せ
   Range("A5", .Cells(.Count)).AutoFilter
 End With
End Sub


>でも項目が消えてしまっています。これを回避できますか?

ただ、別に、項目が消えたわけではありませんね。単に、文字(または数字)が右に行っているので、ドロップダウンボタンと重なり合っているだけです。上記のコードで参考にできるところがあったら、使ってみてください。

こんばんは。

通常は、これでよいのですが、
Sub Macro2()
Range("A5").AutoFilter
End Sub

つまり、Range("A5").CurrentRegion という同じ設定になるので、そこを含む、4角形の連続の範囲の頂点からが、AutoFilter に組み込まれます。通常は、フィルターモードに取り込り込みたくないデータは、間を空けると良いのですね。

もし、そういう状況なら、私なら、こう書きますが、こんな面倒なことしなくてもよいです。

Sub Macro3()
  ActiveSheet.AutoFilterMode = False
 With Range("A5").Cu...続きを読む

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む

Qオートフィルタで抽出したデータの行を削除(VBAで記述)

Excel2000を利用しています。

VBAで、オートフィルタを利用した作業を記述したいと思っています。
データは一行目にタイトルが入っています。

オートフィルタで抽出したデータを
その行まるまる削除したいと思っています。
その時、タイトル行(1行目)を除いて
オートフィルタで抽出された行のみ選択して
削除する、という場合、どのように記述すればよいのでしょうか。
自分では全然分からないので
教えてください、よろしくお願い致します。

Aベストアンサー

#1の者です。操作を間違えて回答ボタンを押してしまいました。少し追加させてください。
このマクロは、最終列まですべての列にデーターが入力されていないとうまく動作しません。
myRange = Range(myCell).SpecialCells(xlCellTypeVisible).End(xlUp).Offset(2, 0).Address
マクロのこの部分は、タイトル行を除くデータの先頭行を取得するためのマクロです。もし、タイトル行が1行の場合は下記のように変更して下さい。
myRange = Range(myCell).SpecialCells(xlCellTypeVisible).End(xlUp).Offset(1, 0).Address

あなた様がVBAをご存知であることを前提として書いてあります。もし、このマクロを実行させる方法がわからない時・うまく動作しない場合は、ご遠慮なくお知らせ下さい。
私でよろしければ、あなた様のおやりになりたいことが実現するまでご一緒に考えていきたいと思います。

Q[初心者です]VBAで指定列からAを検索し、発見したら隣のセルに値0を入れるマクロ。

VBAで指定列からAを検索し、発見したら隣のセルに0を入れるマクロを組みたいのですが、組み方がVBA初心者の為わかりません。
(例)
L列に、A、B、C、D、E、Fとランダムに文字が入っていて、
文字Aを検索し、発見したら隣のI列に値0を入れるというマクロです。

Sub Search()
Dim A As String
Set A = Worksheets("Sheet1").Cells.Find("A")
If A Is Nothing Then
ActiveCell.Offset(0, 1).Value = 0

End If
End Sub
と過去の質問で考えてみたのですが、Aがあった時、、、、
とコードが書けないです。
大変困っているので、ご教授頂けないでしょうか?
出来れば、そのままマクロに出来るコードを教えて頂けないでしょうか?
宜しくお願い致します。

Aベストアンサー

こんばんは。

#3さんのおっしゃっていることも、もっともなのですが、気になる点がありましたので、自分のことを踏まえて、書かせていただきます。

いずれ、また、同じようなケースが出会うと思います。こんな原則を考えてみたらどうでしょうか?それは、私も自身も同じなのですが、ワークシートのコマンドで行われるものは、記録マクロから作ってみるということです。他にも、「統合」とか、「置換」とか「オートフィルタ」「フィルタオプション」とかは、みんなパターンが決まっています。
その中の代表格が、この「Find」 です。

>Set A = Worksheets("Sheet1").Cells.Find("A")

>過去の質問で考えてみたのです

どうも、Find メソッドは、あるレベル以下の人は、省略する傾向があるようです。何が大事で、何が大事でないかというのは、やってみなければ分かりませんが、検索語だけを入れる書き方は、実務では、あまりしないほうがよいと思います。

だいたい、以下のTestFind2 ぐらいまでに、省略は、とどめたほうがよいです。

それは、Find は、必ずしも自分が思っているデフォルトとは違うことがあるので、「明示的(意図的に)」にオプションは入れたほうがよいです。
例えば、大文字小文字の違いを付けるなら、MatchCase:=True, 数式まで探すなら、LookIn:=xlFormulas

なお、Find メソッドは、5年経っても、たぶん完全に覚えられません。面倒なコードのひとつです。ですが、これはパターンが決まっているので、ひとつパターンが決まったら、それに当てはめればよいだけです。

#3さんで示されているMougのサンプルコードと似てはいるのですが、Mougのサンプルコードでは、Verionによって、失敗することがあります。

'--------------------------------------
'記録マクロをそのまま使う方法
Sub TestFind1()
Dim c As Range
 Set c = Columns("L:L").Find(What:="A", _
           After:=ActiveCell, _
           LookIn:=xlValues, _
           LookAt:=xlPart, _
           SearchOrder:=xlByRows, _
           SearchDirection:=xlNext, _
           MatchCase:=False, _
           MatchByte:=False, _
           SearchFormat:=False)
 c.Offset(0, 1).Value = 0
End Sub
'--------------------------------------
'TestFind1 をアレンジしてみる
Sub TestFind2()
Dim c As Range
'検索語
Const MYTXT As String = "A"
 Set c = ActiveSheet.Columns("L:L").Find(What:=MYTXT, _
           LookIn:=xlValues, _
           LookAt:=xlPart, _
           MatchCase:=False)
 If Not c Is Nothing Then
    c.Offset(0, 1).Value = 0
 End If
End Sub

'---------------------------------------
'複数ある場合(パターンを使った方法)
'---------------------------------------
Sub TestFind3()
  Dim c As Range
  Dim FirstAdd As String
  Const MYTXT As String = "A"
  Set c = ActiveSheet.Columns("L:L").Find( _
    What:=MYTXT, _
    LookIn:=xlValues, _
    LookAt:=xlPart, _
    MatchCase:=False)
  
  If Not c Is Nothing Then
    FirstAdd = c.Address
    Do
      c.Offset(, 1).Value = 0
      Set c = ActiveSheet.Columns("L:L").FindNext(c)
      If c.Address = FirstAdd Then Exit Sub
    Loop Until c Is Nothing
  End If
End Sub

こんばんは。

#3さんのおっしゃっていることも、もっともなのですが、気になる点がありましたので、自分のことを踏まえて、書かせていただきます。

いずれ、また、同じようなケースが出会うと思います。こんな原則を考えてみたらどうでしょうか?それは、私も自身も同じなのですが、ワークシートのコマンドで行われるものは、記録マクロから作ってみるということです。他にも、「統合」とか、「置換」とか「オートフィルタ」「フィルタオプション」とかは、みんなパターンが決まっています。
その中の代表...続きを読む

QExcel VBAのオートフィルタ解除について

こんばんわ。
現在、コマンドボタン(オートフィルタの設定)にオートフィルタを設定するようなマクロを登録しています。
そして、別のコマンドボタンにはオートフィルタの解除を実施するマクロを書きたいんです。

しかし、オートフィルタを設定していない時に、解除のマクロを実行するとエラーになってしまいます。どうしたら良いのでしょうか?

If・・・文を使って、対象セルにオートフィルタが設定している時は解除を実施し、オートフィルタが設定されてない時は、何も実施しない。

このようなマクロはどうしたら良いのでしょうか?

よろしくお願いします。

Aベストアンサー

フィルタされていないシートに対して実行すると、
実行時エラー'1004':WorksheetクラスのShowAllDataメソッドが失敗しました。
というエラーが出ます(多分)

対象のシートが必ずアクティブなら、
If ActiveSheet.AutoFilterMode Then
 'オートフィルタを解除
 ActiveSheet.AutoFilterMode = False
End If


対象のシートがアクティブでなく、シートを指定する必要があるなら
If Worksheets("sheet1").AutoFilterMode Then
 'オートフィルタを解除
Worksheets("sheet1").AutoFilterMode = False
End If
(シート名は適時変更要)

これで、どうでしょうか?


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング