痔になりやすい生活習慣とは?

excelで上から順に入力していきます。次第に行が増えて400行とかなってしまうんですが、それをVBAのコマンドボタンか何かで最終行(次に入力するセル)まで一発で移動できませんか?
大変困っていますのでよろしくお願い致します

このQ&Aに関連する最新のQ&A

A 回答 (8件)

こんにちわ。

サンプルマクロを作ってみました。次のように操作してみて下さい。

1.データの入力されているブックを開き、CTR+F11キーを押してVBE画面を表示させる。
2.VBAProjectの下にあるThisWokrkbookにカーソルを合わせダブルクリックする。
3.ThisWorkbookのコードエディター(右側の白い部分)が開くので、そこに下記のコードをコピー・ペーストする。

Private Sub Workbook_Open()

Dim myCell As String

myCell = ThisWorkbook.Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Address
If myCell = "$A$1" Then
ThisWorkbook.Worksheets(1).Range("A1").Select
Else
ThisWorkbook.Worksheets(1).Range(myCell).Offset(1, 0).Select
End If

End Sub

Private Sub Workbook_SheetActivate(ByVal Sh As Object)

Dim myCell As String

myCell = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Address
If myCell = "$A$1" Then
ActiveSheet.Range("A1").Select
Else
ActiveSheet.Range(myCell).Offset(1, 0).Select
End If

End Sub

4.VBAProjectの下にあるSheet1にカーソルを合わせダブルクリックする。
5.Sheet1のコードエディター(右側の白い部分)が開くので、そこに下記のコードをコピー・ペーストする。

Private Sub Worksheet_Change(ByVal Target As Range)

Dim myRow As Long


If Target.Address = "$A$3" Then
If Target.Value <> "" Then
myRow = Cells(Rows.Count, 1).End(xlUp).Row
If Cells(myRow, 1).End(xlToRight).Column _
= Cells(myRow - 1, Columns.Count).End(xlToLeft).Column Then
Cells(myRow + 1, 1).Select
Else
Cells(myRow, Columns.Count).End(xlToLeft).Offset(0, 1).Select
End If
End If
End If

End Sub

6.ブックを保存終了し、再度そのブックを開く。

あなた様のやられたいことが実現していると思います。

もし、不都合な点がありましたら、遠慮なくお知らせ下さい。私でよろしければ、あなた様のやられたいことが実現できるまで一緒に考えたいと思います。 その際には、表の構成内容とあなた様のやられたいことを順を追って詳しくお知らせ下さい。
お手数をおかけいたしますが、よろしくお願いいたします。
    • good
    • 2
この回答へのお礼

完璧にできました。
どうもありがとうございました。

お礼日時:2002/10/09 10:08

Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Offset(1).Select


で、A列の最終行の次の空白セルに移動しますよ。もし、セル編集後にどの位置からでも即座にその列の最終行の次の空白セルに移動したいというのであれば、次のコードになります。

Private Sub Workbook_SheetChange(ByVal Sh As Object, _
ByVal Target As Range)
c = Range(Target.Address).Column
Cells(ActiveSheet.Rows.Count, c).End(xlUp).Offset(1).Select
End Sub

vbエディタのThisWorkbookのコードウインドウに、コピー&ペーストして使います。
    • good
    • 2
この回答へのお礼

おかげさまでできました
どうもご親切にありがとうございました

お礼日時:2002/10/08 14:26

はじめまして。



サンプルマクロを作ってみました。以下のように操作してみて下さい。

1.データの入力されているブックを開き、CTR+F11キーを押してVBE画面を表示させる。
2.VBAProjectの下にあるThisWokrkbookにカーソルを合わせダブルクリックする。
3.ThisWorkbookのコードエディター(右側の白い部分)が開くので、そこに下記のコードをコピー・ペーストする。

Private Sub Workbook_Open()

Dim myCell As String

myCell = ThisWorkbook.Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Address
If myCell = "$A$1" Then
ThisWorkbook.Worksheets(1).Range("A1").Select
Else
ThisWorkbook.Worksheets(1).Range(myCell).Offset(1, 0).Select
End If

End Sub

Private Sub Workbook_SheetActivate(ByVal Sh As Object)

Dim myCell As String

myCell = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Address
If myCell = "$A$1" Then
ActiveSheet.Range("A1").Select
Else
ActiveSheet.Range(myCell).Offset(1, 0).Select
End If

End Sub

4.ブックを保存終了し、再度そのブックを開く。

あなた様のやられたいことが実現していると思います。

もし、不都合な点がありましたら、遠慮なくお知らせ下さい。私でよろしければ、あなた様のやられたいことが実現できるまで一緒に考えたいと思います。
お手数をおかけいたしますが、よろしくお願いいたします。

この回答への補足

どうもありがとうございます。worksheetを開くと最終の入力セルに移動できました。欲を言えば、こんなのできますでしょうか?

入力された行がA412まであってA3の編集作業をして次に
A413の空白セル(A413)まで飛ぶやり方ですが、、
A413を指定するのではなくあくまでも次の空白セル(最終行)なのですが、、いろいろな方にアドバイスいただきましたが、私のやりたいことはそんな感じです。

どうかお知恵を拝借させてください
よろしくお願い致します。

補足日時:2002/10/07 12:58
    • good
    • 0

> VBAのコマンドボタンか何かで最終行(次に入力するセル)まで一発で移動


ということであれば、

Private Sub CommandButton1_Click()
Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Offset(1).Select
End Sub'           ~~~

とか、いかがでしょう。(1列目の例です。~~~の所が行数です。)

この回答への補足

アドバイスありがとうございます。
大変参考になりました。
移動したい場所は最終の空白セルなのですが、どうやって指定したらいいのでしょうか?
たびたび申し訳ありませんが、ご指導お願い致します

補足日時:2002/10/07 13:05
    • good
    • 0

Ctrl+↓ (↑ → ← ↓)



は、連続する行・列に対して最後(最前)まで飛びますが、
途中でデータが抜けている(空白セル)と、そこの前まで
しか飛びません。


つまり、シートの最左・左上 A1 に飛ぶには、Ctrl+Home
ですから、その逆になります。
 
    • good
    • 0

private sub()


Range("A1").Serect //行きたい列
Selection.End(xlDown).Select

これではダメでしょうか?
    • good
    • 0

少なくとも、



Ctrl+End

で、最下行・最右セル

まではジャンプできます。

その、最下行・最右セルから、Home キー
で、最下行の A 列にシフトできます。
 
    • good
    • 0

コントロールキー(Ctrl)を押しながら、矢印キーの下(↓)を押すと、内容が詰まっている


最後のセルに飛ぶんですが、それでどうですか?
    • good
    • 1

このQ&Aに関連する人気のQ&A

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

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

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

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

Q【Excel】列と行の最後尾にジャンプする方法は?

Excel2007です。

タスク操作でも、ショートカットでもよいのですが、質問のように
列と行、それぞれの終わりにジャンプできる方法を教えてください。

Aベストアンサー

放置で終わるのかと思っていたら補足が付きましたね。

シート自体の一番下、右と言うことですか。

でしたら、Ctrl+↓、Ctrl+→を何回か繰り返せば行きますよ。
大抵は1回目で入力範囲の最後、もう1回で端までいくはずです。
間に未入力セルと入力セルが挟まる場合はその都度移動が止まりますので繰り返してください。
やってみればわかります。

あとは、最終セルのアドレスを名前ボックスに入力とかですかね。

私の書いた下辺、右辺はセルを四角とした時の下や右の線です。
マウスのポインタを線の上に持って行くと上下左右に外向きの矢印にポインタが変わりますのでそこでダブルクリックします。
但しこれは入力範囲で移動の時の方法です。

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エクセルで、条件に一致した行を別のセルに抜き出す方法

エクセルで、指定した条件に一致するセルを含む行をすべて抜き出す方法が知りたいです。

たとえば、

<A列> <B列> <C列>
7/1 りんご 100円
7/2 ぶどう 200円
7/2 すいか 300円
7/3 みかん 100円

このような表があって、100円を含む行をそのままの形で、
別のセル(同じシート内)に抜き出したいのですが。

7/1 りんご 100円
7/3 みかん 100円

抽出するだけならオートフィルターでもできますが、
抽出結果を自動的に、別の場所に、常に表示させておきたいのです。

初歩的な質問だと思いますが、検索しても分からなかったので、よろしくお願いします。

Aベストアンサー

同じ質問が結構よく出てますが、そんなに初歩的でもありません
別シートのA1セルに「100円」と入力し、そのシートの任意のセルに以下の式を貼り付けて下さい。後は、下方向、右方向にコピー。
日付のセル書式は「日付」形式に再設定してください

=IF(COUNTIF(Sheet1!$C:$C,$A$1)>=ROW(A1),INDEX(Sheet1!A:A,LARGE(INDEX((Sheet1!$C$1:$C$500=$A$1)*ROW(Sheet1!$C$1:$C$500),),COUNTIF(Sheet1!$C:$C,$A$1)-ROW(A1)+1)),"")

データ範囲は500行までとしていますが、必要に応じて変更して下さい

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

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

Aベストアンサー

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

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

Qエクセルで最後の行までを選択

エクセルで1万行位あるものの1行目から最後の行までを一気に選択する方法はあるでしょうか?また、同じようにA列とB列のみを最後の行まで選択する方法もあるでしょうか?よろしくお願いします。

Aベストアンサー

こんにちは。

マクロなどが設定されていなければ、

シフトキーを押しながら、A1 の、セルの四角の底辺の枠線をダブルクリックすれば、その列が最後まで選択されます。A列B列のみなら、A列で、シフトキーを押しながら、B列のB1 のセルの四角の枠線をダブルクリックすれば選択されます。(ただし、空白セルが途中にあったら、そこでとまります。)

シフトキーを押しながら
+-------------+
|            |
|            |
+-------------+
   ↑
   ここをダブルクリック

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

QエクセルのIF関数で、文字が入力されていたならば~

エクセルのIF関数で文字が入力されていたならば~、という論理式を組み立てたいと思っています。

=IF(A1="『どんな文字でも』","",+B1-C1)

A1セルに『どんな文字でも』入っていたならば、空白に。
文字が入っていなければB1セルからC1セルを引く、という状態です。

この『どんな文字でも』の部分に何を入れればいいのか教えてください。

またIF関数以外でも同様のことができれば構いません。

宜しくお願いします。

Aベストアンサー

=IF(ISTEXT(A1),"",B1-C1)

でどうでしょうか?

Qエクセル:マクロ「Application.CutCopyMode = False」って?

エクセルのマクロを記録していると

「Application.CutCopyMode = False」

というものがよく出てきますが、これは何でしょう?
どういう意味のものかわかりません。
削除しても差し支えないのもでしょうか?

Aベストアンサー

「Application.CutCopyMode = False」の前で
セルのコピー、または切り取りを行っていると思います。
これは、その操作(セルのコピー、または切り取り)を無効にしているだけです。
------------
Range("A1").Select
Selection.Copy ← これを無効にしている
Range("A2").Select
ActiveSheet.Paste
Application.CutCopyMode = False
------------
上記の場合であれば、「Application.CutCopyMode = False」を削除しても問題ありませんが、
以下の場合、貼り付け処理でエラーになります。
------------
Range("A1").Select
Selection.Copy
Range("A2").Select
Application.CutCopyMode = False
ActiveSheet.Paste ← ココでエラー
------------
ご自分で、セルをコピーしてみると分かると思いますが、コピーした範囲が点線で点滅されます。
「Application.CutCopyMode = False」をすると、
その点滅がなくなります。

「Application.CutCopyMode = False」の前で
セルのコピー、または切り取りを行っていると思います。
これは、その操作(セルのコピー、または切り取り)を無効にしているだけです。
------------
Range("A1").Select
Selection.Copy ← これを無効にしている
Range("A2").Select
ActiveSheet.Paste
Application.CutCopyMode = False
------------
上記の場合であれば、「Application.CutCopyMode = False」を削除しても問題ありませんが、
以下の場合、貼り付け処理でエラーになります。
------------
...続きを読む

QVBA別シートの最終行の下行へ貼り付けされるようにしたいです。

教えてください。ド素人です。(参考書読み始めたところ)
聞き方も適切かわからないのですが、質問させてください。

Sheet1(入力画面)、Sheet2(確認画面)、Sheet3(データ)の3つのシートを作りました。

Sh1「入力画面」で入力された値は、関数で自動的に、Sh2「確認画面」指定のセルへコピーされるようにしています。
Sh1「入力画面」を入力し終えると。画面下のコマンドボタンで、Sh2「確認画面」へ画面が変わります。

そこで、内容を確認して、また、ここの下のコマンドボタンをクリックしてもらうと、Sh2「確認画面」の内容が、
Sh3(データ)の1行に集約されて貼り付けられます。同時にSh1「入力画面」の値は、クリアされ、Sh2「確認画面」も同様にクリアになります。

ここまで、完成したのですが、また、次のデータを入力していき、最後のSh3「データ」の最終行の下(空白行)に次々データを追加していくためのコードが解りません。

Sub ボタン3_Click()

Dim sh1 As Worksheet
Dim sh2 As Worksheet
Dim sh3 As Worksheet
Set sh1 = Worksheets("入力画面")
Set sh2 = Worksheets("確認画面")
Set sh3 = Worksheets("データ")

With sh2
.Range("C2:E2").Copy
Sheets("データ").Range("B2:D2").PasteSpecial xlPasteValues, xlPasteSpecialOperationNone, False, False
.Range("C3:C5").Copy
Sheets("データ").Range("E2:G2").PasteSpecial xlPasteValues, xlPasteSpecialOperationNone, False, True
.Range("C6:D6").Copy
Sheets("データ").Range("H2:I2").PasteSpecial xlPasteValues, xlPasteSpecialOperationNone, False, False
.Range("C7:D7").Copy
Sheets("データ").Range("J2:K2").PasteSpecial xlPasteValues, xlPasteSpecialOperationNone, False, False
.Range("C8:D8").Copy
Sheets("データ").Range("L2:M2").PasteSpecial xlPasteValues, xlPasteSpecialOperationNone, False, False
.Range("C9:D9").Copy
Sheets("データ").Range("N2:O2").PasteSpecial xlPasteValues, xlPasteSpecialOperationNone, False, False
.Range("C10:C14").Copy
Sheets("データ").Range("P2:T2").PasteSpecial xlPasteValues, xlPasteSpecialOperationNone, False, True
.Range("C17").Copy
Sheets("データ").Range("U2").PasteSpecial xlPasteValues, xlPasteSpecialOperationNone, False, False
End With

With sh1
.Range("D8:K8").ClearContents
.Range("D6:K6").ClearContents
.Range("D4:K4").ClearContents
.Range("D10:K10").ClearContents
.Range("D12:J12").ClearContents
.Range("D14:L14").ClearContents
.Range("L16").ClearContents
.Range("D16:J16").ClearContents
.Range("D18:J18").ClearContents
.Range("L18").ClearContents
.Range("L20").ClearContents
.Range("D20:J20").ClearContents
.Range("L22").ClearContents
.Range("D22:J22").ClearContents
.Range("D24:H24").ClearContents
.Range("D26:H26").Value = "90"
.Range("D28:H28").Value = "80"
.Range("D30:H30").Value = "5"
.Range("D32:H32").Value = "5"
End With
Worksheets("入力画面").Activate
End Sub

ここまで、試行錯誤した内容です。
どこに最終行の下(空白行)の記述をいれられますでしょうか?
画像が一枚しかのせられなかったので、Sheet2(確認画面)だけ添付致しました。
Sheet3(データ)では、一行に集約しています。
是非、ご教授お願いします。色々なお意見がききたいです。

教えてください。ド素人です。(参考書読み始めたところ)
聞き方も適切かわからないのですが、質問させてください。

Sheet1(入力画面)、Sheet2(確認画面)、Sheet3(データ)の3つのシートを作りました。

Sh1「入力画面」で入力された値は、関数で自動的に、Sh2「確認画面」指定のセルへコピーされるようにしています。
Sh1「入力画面」を入力し終えると。画面下のコマンドボタンで、Sh2「確認画面」へ画面が変わります。

そこで、内容を確認して、また、ここの下のコマンドボタンをクリックして...続きを読む

Aベストアンサー

私も、ど素人のマクロで、オマケにどんどん今は劣化中です。
ただ、今は、もう参考にする本もなくなってしまいました。

ご質問は、非常にわかりやすいです。

必ず、起点が2行目にあるとすれば、
i = sh3.Cells(Rows.Count, 2).End(xlUp).Row -1 '最後の次の行を探します。

そこに、Offsetで、ずらしていきます。

Sheets("データ").Range("B2:D2").Offset(i).PasteSpecial xlPasteValues, xlPasteSpecialOperationNone, False, False
のようにして、全部、置換で、.Offset(i). を割りこませればよいでしょう。
検索:[).P] -> 置換:[).Offset(i).P]

以下で、添付したのは、マクロを集約してしまいました。
たぶん、私のコードは参考にはなりません。こんな考え方もあるのかなっていう程度にしてください。以下は、機械的に作られたものです。

'//--
Sub Test2Macro()
  Dim sh1 As Worksheet: Set sh1 = Worksheets("入力画面")
  Dim sh2 As Worksheet: Set sh2 = Worksheets("確認画面")
  Dim sh3 As Worksheet: Set sh3 = Worksheets("データ")
  Dim r1 As Range, a As Range
  Dim i As Long, j As Long, k As Long
  Dim Datas As Variant, c As Variant
  
  j = sh3.Cells(Rows.Count, 2).End(xlUp).Row + 1 '最後の行を探します。
  Set r1 = sh2.Range("C2:E2,C3:C5,C6:D9,C10:C14, C17")
  i = 2 '初期列
  For Each c In r1.Cells
    sh3.Cells(j, i).Value = c.Value
    i = i + 1
  Next c
  
  sh1.Range("D6:K6,D8:K8,D4:K4,D10:K10,D12:J12" & _
  ",D14:L14,L16,D16:J16,D18:J18,L18,L20" & _
  ",D20:J20,L22,D22:J22").ClearContents
  Datas = Array(90, 80, 5, 5)
  For Each a In sh1.Range("D26:H26,D28:H28,D30:H30,D32:H32").Areas
    a.Value = Datas(k)
    k = k + 1
  Next a
End Sub
'//--

私も、ど素人のマクロで、オマケにどんどん今は劣化中です。
ただ、今は、もう参考にする本もなくなってしまいました。

ご質問は、非常にわかりやすいです。

必ず、起点が2行目にあるとすれば、
i = sh3.Cells(Rows.Count, 2).End(xlUp).Row -1 '最後の次の行を探します。

そこに、Offsetで、ずらしていきます。

Sheets("データ").Range("B2:D2").Offset(i).PasteSpecial xlPasteValues, xlPasteSpecialOperationNone, False, False
のようにして、全部、置換で、.Offset(i). を割りこませればよいでしょう。...続きを読む

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さんのおっしゃっていることも、もっともなのですが、気になる点がありましたので、自分のことを踏まえて、書かせていただきます。

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


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

人気Q&Aランキング