• ベストアンサー

EXCELマクロのこの記述の意味を教えてください。

こんにちは。 以前、教えてもらったマクロですが もう少し深く勉強したいので、記述の 意味(翻訳?)を教えてください。 Sub Test5() Dim FR1 As Range, FR2 As Range With ActiveSheet Set FR1 = .Cells.Find( _ "*", , xlValues, xlWhole, xlByRows, xlPrevious) Set FR2 = .Cells.Find( _ "*", , xlValues, xlWhole, xlByColumns, xlPrevious) End With Range("A1", Cells(FR1.Row, FR2.Column)).Select Set FR1 = Nothing: Set FR2 = Nothing End Sub また、この範囲をA列だけを見る場合、つまりA列の最終行を範囲とする場合は、どう記述すればよいのでしょうか? ぜひ、教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 どうも元の質問がわかりませんので、こちらの想像で書かせていただきます。FR1 もFR2 もおそらく、初回検索だけでは、同じ場所を検索しているはずですし、戻り値もRangeオブジェクトですから、そのまま、Range("A1",...)の範囲に入れればよいはずです。 ほとんど解説のしようがありませんが、 Find メソッドは、ヘルプを見ていただくしかありません。 また、見つからなかった場合を想定して、エラー解除をしなくてはなりません。 私は、1列目というので、.Columns(1) を考えましたが、 A列の最終行を範囲 なら、 このように書き換えることも可能です。  .Range("A1", .Range("A65536").End(xlUp)).Find( _ '------------------------------------------------- Sub TestSample1()  Dim rng As Range  With ActiveSheet   Set rng = .Columns(1).Find( _              What:="*", _              LookIn:=xlValue, _              LookAt:=xlWhole)   If Not rng Is Nothing Then    .Range("A1", rng).Select   End If  End With End Sub // なお、私は、名前付き引数の場合は、このような縦並びに書きます。 With ステートメントは、書くときは、「.(ピリオド)」を忘れやすいのですが、環境の変化に対してエラーが少ないです。

tabtab9
質問者

お礼

Wendy02さん、こんにちは。 質問の意図、明確でなくて申し訳ありませんでした。 今度からもう少し丁寧な質問の仕方を心がけます。

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

#2 のWendy02 です。 #3 の KenKen_Sp さんの書き込みの後、もう一度、試してみたら、横と縦とは違う検索をしていることに気が付きました。元のコードを書き直してみました。どうも、コードから、そのコードの目的を見出すのは、ちょっとむつかしいです。 Sub TestSample2()  Dim rng As Range, cnt As Long  Dim r As Long, c As Long  With ActiveSheet   'エラーチェック   cnt = .UsedRange.Count   If cnt = 1 Then Exit Sub   'データの最初の行数   r = .Cells.Find("*", , xlValue, 1, 1, 2).Row   'データの最初の列数   c = .Cells.Find("*", , xlValue, 1, 2, 1).Column   '範囲選択   .Range("A1", .Cells(r, c)).Select  End With End Sub 同じ範囲選択の方法を、他のコードで考えてみたのですが、このようなものになるのでしょうか? Sub TestSample3()  Dim cnt As Long  With ActiveSheet   cnt = .UsedRange.Count   If cnt = 1 Then Exit Sub   'A1からUsedRangeの最初の列範囲   .Range("A1", .UsedRange.Columns(1)).Select  End With End Sub >この範囲をA列だけを見る場合、つまりA列の最終行を範囲とする場合は、どう記述すればよいのでしょうか? その範囲に対するA列の最終行と解釈しました。単独の「A列の最終行を範囲」とは違うということでしょうか?具体例があればはっきりします。つまり、A列にはデータがないこともありうる、と考えれば、以下のようになります。 Sub TestSample4()  Dim cnt As Long  With ActiveSheet   cnt = .UsedRange.Count   If cnt = 1 Then Exit Sub   'UsedRange の最終行を取り、それを範囲とする   .Range("A1").Resize(.UsedRange.Cells(cnt).Row).Select  End With End Sub

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

こんにちは。KenKen_SP です。 簡単に言えば、セル全体から 1. データのある行方向で最終のセル 2. データのある列方向で最終のセル をそれぞれ見つけて、A1からその最終行と最終列の番号で表される セルを選択、、、つまりA1から最後のセルまでを範囲選択する、、 ということでしょうね。 Sub Test5()   'オブジェクト変数の宣言 As句の後が変数の型を表す   Dim FR1 As Range, FR2  As Range   'ピリオドで始まる句はActiveSheetの省略である   With ActiveSheet     'アクティブシートのセル全体からワイルドカード「*」     'つまり空以外の値をもつ行方向の最後のセルを探し、     '見つかったセルを変数 FR1 にセット     '--> 一番最終行のセルを探してます。     Set FR1 = .Cells.Find( _     "*", , xlValues, xlWhole, xlByRows, xlPrevious)     'アクティブシートのセル全体からワイルドカード「*」     'つまり空以外の値をもつ列方向の最後のセルを探し、     '見つかったセルを変数 FR2 にセット     '--> 一番最終列のセルを探してます。     Set FR2 = .Cells.Find( _     "*", , xlValues, xlWhole, xlByColumns, xlPrevious)   End With   'A1~最終行番号・最終列番号で表されるセルを範囲選択   Range("A1", Cells(FR1.Row, FR2.Column)).Select   'オブジェクト変数をクリア   Set FR1 = Nothing: Set FR2 = Nothing End Sub 余談ですが、同様の処理を次のように書くことができます。 Sub Test6()   With ActiveSheet     .Range("A1", .UsedRange).Select   End With End Sub で、A 列だけなら様々な書き方がありますがこんな感じ。 Sub Test7()   With ActiveSheet     .Range(.Range("A1"), .Range("A65536").End(xlUp)).Select   End With End Sub ちなみに、見つからない場合のエラー処理はしてません。

tabtab9
質問者

お礼

KenKen_SPさん、こんにちは。 甘えてすみませんでした。 解説をしかと頭に叩き込みます。 ありがとうございました。

回答No.1

With ActiveSheet を With Range("A:A") でいいと思うけど。 FR1とFR2はrange(範囲)です。 今のシートすべてを対象とします。 FR1は行において最後の*が見つかるところまでです。 FR2は列において最後の*が見つかるところまでです。 A1からFR1の行番号、FR2の列番号のセルまでを選択しなさい。 FR1とFR2を忘れなさい。 そんなとこかな。無理な翻訳ですまん。 つまり、最初のシート全部見ろから、Aだけにしろにすればいいのでは。(この場合、いらないところが発生しますが、まあいいでしょ。)

tabtab9
質問者

お礼

finneganswakeさん、みなさん、ありがとうございます。 平易にわかりやすい翻訳ありがとうございました。 また、何かわからないことがあったら教えてください.

関連するQ&A

  • マクロ FIND 検索方向の変更

    いつも回答ありがとうございます。 FINDを使用した検索方向の変更についての質問です。以下のFINDの記述方法で、上から一発目に捉えられたキーワードではなく、下から一発目に捉えられたキーワードに変更するにはどうしたらよろしいでしょうか?それとも、FINDの記述方法を大幅に変えなければいけないのでしょうか?御指導の程宜しくお願い致します。 Sub TEST() Dim d As Integer Dim e As Integer Worksheets("一覧").Activate d = 3 e = 3 Do While Worksheets("一覧").Cells(d, 2).Value <> "" Dim c As Variant Dim R As Range Dim s As Range With Worksheets(Worksheets("一覧").Cells(d, 2).Value) Set c = .Columns("H").Find("増", , xlValues, 1) If Not c Is Nothing Then Set R = .Range(c.Offset(1, -4), .Cells(Rows.Count, "D").End(xlUp)) Set s = c.Offset(, -5) With Worksheets("編集用一覧") .Range(.Cells(e, 4), .Cells(e, 5)).ClearContents .Cells(e, 4).Value = s .Cells(e, 5).Value = Application.Sum(R) End With End If End With d = d + 1 e = e + 4 Loop End Sub

  • エクセルののマクロについて教えてください

    Sub search() Dim i As Long, lastCol As Long, c As Range, str As String, wS As Worksheet Set wS = Worksheets("sheet2") wS.Cells.Clear str = Application.InputBox("検索内容を入力") Application.ScreenUpdating = False With Worksheets("sheet1") lastCol = .Cells(1, Columns.Count).End(xlToLeft).Column .Columns(lastCol + 1).Insert For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row Set c = Range(.Cells(i, "A"), .Cells(i, lastCol)).Find(what:=str, LookIn:=xlValues, lookat:=xlWhole) If Not c Is Nothing Then .Cells(i, lastCol + 1) = 1 End If Next i If WorksheetFunction.CountIf(.Columns(lastCol + 1), 1) > 0 Then .Range("A1").AutoFilter field:=lastCol + 1, Criteria1:=1 .Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy wS.Range("A1") wS.Columns.AutoFit wS.Columns(lastCol + 1).Delete wS.Activate .Columns(lastCol + 1).Delete .AutoFilterMode = False Else MsgBox "該当データなし" End If End With Application.ScreenUpdating = True End Sub エクセルで上のシステムをネットから持ってきました。 上から5行目のinputboxを"Sheet3"のA列からデータを持ってきてプルダウンで表示させたいのですがユーザーフォームでオブジェクトを組まないで表示させる方法を教えてください

  • エクセル マクロ FIND

    いつも回答して頂き、心から感謝しています。 FINDで特定セルを探し出し、そこを起点にコピーする領域を設定しようかなと考えています。 で、FINDの部分で早くも分からなくなったので質問します。 下記のようなマクロを記述しましたが、FINDの記述の箇所でエラーが発生してしまいます。 何が悪いのかさっぱり分からないので、どなたか教えて下さい。 エラー名:実行時エラー13       型が一致しません。 Sub 作業状態の部分を作業名別に各シートに貼り付ける() Dim b1 As Variant With Worksheets("書面") Set b1 = .Columns("B").Find("作業状態", xlValues, xlWhole, xlByColumns, xlNext) b1.Select End With End Sub

  • マクロ 記述が悪くエラーがかかります。

    いつも回答ありがとうございます。 最後らへんの記述で実行時エラー【型が一致しません】がかかります。 Worksheets("集計用").Range(b1, b2).Copy _ Destination:=Worksheets(b3).Range("B2") ← ここでエラーがかかる。 ワークシート名に変数を使用しているせいだと思います。 解決する方法を御指導して頂けないでしょうか?宜しくお願い致します。 Sub グラフの作成() Dim Date1 As Date Dim Date2 As Date Dim SName As String Dim b1 As Variant Dim b2 As Variant Dim b3 As Variant Dim d1 As Variant Dim d2 As Variant Dim d3 As Variant With Worksheets("集計用") s1: Date1 = Application.InputBox("最初の日付を2012/12/1のように入力してください。") If Date1 = 0 Then MsgBox "キャンセルされました。", vbOKOnly Exit Sub End If Set b1 = .Columns("B").Find(Date1, , xlValues, 1) If b1 Is Nothing Then If MsgBox("入力した日付が見当たりません。" & vbNewLine & _ "再度入力しますか?", vbYesNo) = vbYes Then GoTo s1 Else MsgBox "処理を中止しました", vbOKOnly Exit Sub End If End If d1 = b1.Row s2: Date2 = Application.InputBox("最初の日付を2012/12/31のように入力してください。") If Date1 = 0 Then MsgBox "キャンセルされました。", vbOKOnly Exit Sub End If Set b2 = .Columns("B").Find(Date2, , xlValues, 1) If b2 Is Nothing Then If MsgBox("入力した日付が見当たりません。" & vbNewLine & _ "再度入力しますか?", vbYesNo) = vbYes Then GoTo s2 Else MsgBox "処理を中止しました", vbOKOnly Exit Sub End If End If d2 = b2.Row s3: SName = Application.InputBox("商品名を入力して下さい。") If SName = "False" Then MsgBox "キャンセルされました。", vbOKOnly Exit Sub End If Set b3 = .Rows("3").Find(SName, , xlValues, 1) If b3 Is Nothing Then If MsgBox("入力した商品名が見当たりません。" & vbNewLine & _ "再度入力しますか?", vbYesNo) = vbYes Then GoTo s3 Else MsgBox "処理を中止しました", vbOKOnly Exit Sub End If End If d3 = b3.Column End With Worksheets.Add After:=Worksheets("集計用") ActiveSheet.Name = b3 Worksheets("集計用").Range(b1, b2).Copy _ Destination:=Worksheets(b3).Range("B2") Worksheets("集計用").Range(Cells(d1, d3), Cells(d2, d3)).Copy _ Destination:=Worksheets(b3).Range("C2") End Sub

  • エクセルのVBAの記述について

    VBAの記述についてなのですが、 Sub filter() Dim gyo As Long Dim ws1 As Worksheet Dim ws2 As Worksheet Dim ws3 As Worksheet Set ws1 = Worksheets("データ") Set ws2 = Worksheets("チーム") Application.ScreenUpdating = False ws2.Range("A4:BH30").Clear gyo = ws1.Range("A65536").End(xlUp).Row ws1.Activate With ws1.Range(Cells(4, 1), Cells(gyo, 6)) .AutoFilter Field:=1, Criteria1:="A" .SpecialCells(xlCellTypeVisible).Copy ws2.Range("A4") Selection.AutoFilter End With Application.ScreenUpdating = True End Sub ならプログラムははしるのですが、 14行目を .SpecialCells(xlCellTypeVisible).Copy ws2.Range(Cells(4, 1)) だと 「実行時エラー 1004 Rangeメソッドは失敗しました Worksheet オブジェクト」 とでるのですが、出来ないのでしょうか? Cells(4, 1)の1のところを変数にして変えていきたいのですが、よい方法はありますか。 よろしくお願いいたします。

  • select case文について

    リストから選択とリストに無い値の入力のリストへの追加をしたく、あちこちの情報をつぎはぎで下記のようにVBAで動かそうとしましたが、うまく動いてくれません。 前(Case A)は動くのですが、あと(Case 2)が機能しません。 それと、3つ以上をSelectCaseで組む場合の方法も合わせてお願いします。 Private Sub Worksheet_Change(ByVal Target As Range) Dim c As Range Dim LastR As Long Select Case Target.Address(0, 0) Application.EnableEvents = False Case "D1" With Worksheets("Sheet2") LastR = .Range("A36636").End(xlUp).Row Set c = .Range("A1:A" & LastR).Find( _ Target.Value, , xlValues, xlWhole, xlByColumns, xlPrevious, True) If c Is Nothing Then If vbNo = MsgBox("リストに追加しますか?", _ vbYesNo, "追加の確認") Then Application.EnableEvents = True Exit Sub End If .Range("A" & LastR + 1).Value = Target.Value .Range("A1:A" & LastR + 1).Name = "リストA" End If With Target.Validation .Delete .Add Type:=xlValidateList, Formula1:="=リストA" .ShowError = False End With Case "E1" With Worksheets("Sheet2") Set c = .Range("B1:B" & LastR).Find( _ Target.Value, , xlValues, xlWhole, xlByColumns, xlPrevious, True) If c Is Nothing Then If vbNo = MsgBox("リストに追加しますか?", _ vbYesNo, "追加の確認") Then Application.EnableEvents = True Exit Sub End If .Range("B" & LastR + 1).Value = Target.Value .Range("B1:B" & LastR + 1).Name = "リストB" End If End Select End With With Target.Validation .Delete .Add Type:=xlValidateList, Formula1:="=リストB" .ShowError = False End With Application.EnableEvents = True End Sub

  • EXCEL マクロの指定の仕方

    マクロで線の色を指定したいのですが、上手くいかず困っています .ForeColor.RGB = Worksheets("sheet1").Range("F2").Interior.ColorIndex 赤色を指定したいのですがBにどういうコードを入れれば良いですか? FはVlookupで列Bより色を指定するようにしています。 マクロは始めたばかりで良く分からないので、他に必要な情報もわかりません 必要な情報なども併せて教えてください。 よろしくお願いします。 Dim rngStart As Range Dim rngEnd As Range Dim BX As Single, BY As Single, EX As Single, EY As Single Set rngStart = Worksheets("sheet2").Cells.Find(What:=Worksheets("sheet1").Range("D2"), LookIn:=xlValues, LookAt:=xlWhole) Set rngEnd = Worksheets("sheet2").Cells.Find(What:=Worksheets("sheet1").Range("E2"), LookIn:=xlValues, LookAt:=xlWhole) BX = rngStart.Left BY = rngStart.Top EX = rngEnd.Left + rngEnd.Width EY = rngEnd.Top With Worksheets("sheet2").Shapes.AddLine(BX, BY + 10, EX, EY + 10).line .ForeColor.RGB = Worksheets("sheet1").Range("F2").Interior.ColorIndex .Weight = 3 .EndArrowheadStyle = msoArrowheadTriangle End With

  • エクセル マクロ 検索

    お世話になります。 範囲がA2からK221までの表があります。 検索して検索されたセルの左のセルを表示するマクロを組みたいのですが、検索する文字(数値)はE1に、検索結果はK1に表示するようにするにはどのようにしたらいいでしょうか? Sub FIND_DATA1() ' FIND_DATA1 Macro ' マクロ記録日 : 2006/9/1 ユーザー名 : ' Cells.Find(What:=Range("E1").Value, After:=ActiveCell, lookAt:=xlWhole).Activate End Sub Sub Data_Find3() Dim 対象セル As Range Dim 最初のセル番地 As String Dim 検索件数 As Long Cells.Interior.ColorIndex = xlNone If Range("E1").Value = "" Then Exit Sub End If Set 対象セル = Cells.Find(What:=Range("E1").Value, After:=ActiveCell, lookAt:=xlWhole) 最初のセル番地 = 対象セル.Address Do 対象セル.Interior.ColorIndex = 37 検索件数 = 検索件数 + 1 Set 対象セル = Cells.FindNext(対象セル) Loop While 対象セル.Address <> 最初のセル番地 MsgBox "検索件数は" & 検索件数 - 1 & " 件です" End Sub 本を見たり調べたりでここまでできたんですがこれだと検索件数、検索結果が色付きになるだけで使い勝手がいまいちです。 よろしくお願いします。

  • マクロの関係で困ってしまいました。印刷できません

    Sub Sample3() Dim i As Long, k As Long, c As Range, r As Range i = InputBox("入替え元番号を入力") k = InputBox("入替え先番号を入力") Set c = Range("A:A").Find(what:=i, LookIn:=xlValues, lookat:=xlWhole) Set r = Range("A:A").Find(what:=k, LookIn:=xlValues, lookat:=xlWhole) On Error Resume Next If c.Row < r.Row Then i = c.Row k = r.Row Else i = r.Row k = c.Row End If Rows(k + 1).Insert Rows(i).Cut Cells(k + 1, "A") Rows(k).Cut Cells(i, "A") Rows(k).Delete End Sub  上記のようなマクロを組んで頂いたのですが、「改ページ位置を移動できません」という状況になっています。せっかくgooの質問で答えて頂いたのですが、これでやったら80行ぐらいから、この表示が出て、解決できません。どなたか、解決して頂けませんか。その時に補足すればよかったのですが、動かしてみて分かった次第です。お答え頂いた方に大変申し訳なく思っています。よろしくお願いします。  なお、間違った入力をしてしまった時に、一回だけは元に戻るなんてことはできないですかね。これもできたら厚かましいですがお答え頂けたらと思います。

  • EXCELマクロ、範囲選択はできたものの・・・

    こんにちは。 Wendy02さんはじめ、みなさんのお力をお借りして、 できあがりまじかのグラフですが、恥を承知で教えて ください。 教えてもらったマクロ Sub getMyRange3() Dim r As Range  With ActiveSheet.Range("A1").CurrentRegion    Set r = Cells(65536, .Cells(.Cells.Count).Column).End(xlUp)   Range("A1", r).Select  End With  Set r = Nothing End Sub ****************** ・データ範囲には0が存在する場合がある。 ・末尾データの0は範囲には入れない のことを考慮すると、期待の範囲がとれません。 オートフィルタでの処理も考えましたが、必要な 0までもフィルタされます。 ****************** masa_peeさんの作られたデータサンプルをお借りすると データ的には、    A  B  1 あ 13  2 い  0  3 う 60  4 え 52  5 お  0  6 か  0 というデータのなかで欲しい範囲は、A1からB4です

専門家に質問してみよう