VBAをはじめたばかりの初心者です。
業務でマクロ処理をするよう言われましたが、苦戦しております。
なんとか今週中にしあげなければならない状況で、ご存知の方がいらっしゃれば助けていただければと思います。

1行目・・・項目が記載されています。
2行目以降・・・A列~G列・I~K列に住所などの情報があり、H列とL列にはとある計算式をいれています。
件数は約500件(500行)程度で、毎回変更します。

H2とL2に計算式を入れて、
セルH2の値をH3にコピー、セルL2の値をL3にコピーするマクロが自動記録で次のようにできました。
Range("H2").Select
Selection.Copy
Range("H3").Select
ActiveSheet.Paste
Range("L2").Select
Application.CutCopyMode = False
Selection.Copy
Range("L3").Select
ActiveSheet.Paste

これを、H4・L4、H5・L5・・・・と繰り返してコピーをしていき、データがなくなったらループを修了するという記述をしたいのですが、わかりません。
いろいろネットで探してみたのですが、データ数を指定するやり方(?)ではなく、「Do~Loop」を使った方法でやりたいと思っております。

どなたか教えていただけませんでしょうか。
宜しくお願いいたします。

A 回答 (4件)

方法はいくつかあると思いますが。

。。

'-------------------------------------
Sub Test1()
 Dim Lastrow As Long
 Lastrow = Cells(Rows.Count, "A").End(xlUp).Row
 Range("H2").AutoFill Range("H2:H" & Lastrow)
 Range("L2").AutoFill Range("L2:L" & Lastrow)
End Sub
'--------------------------------------
Sub Test2()
 Dim Lastrow As Long
 Lastrow = Cells(Rows.Count, "A").End(xlUp).Row
 Range("H2").Copy Range("H3:H" & Lastrow)
 Range("L2").Copy Range("L3:L" & Lastrow)
End Sub
'-----------------------------------
Sub Test3()
 Dim R As Long
 For R = 3 To Cells(Rows.Count, "A").End(xlUp).Row
   Range("H2").Copy Cells(R, "H")
   Range("L2").Copy Cells(R, "L")
 Next R
End Sub
'---------------------------------

A列のデータで最終行を判断してます。
 
    • good
    • 2
この回答へのお礼

こんばんわ。

いろんな記述があるのですね。
直感で(?) Test3を試したところ、無事うまくいきました!
実は、HとLだけでなくコピーしたい列が複数ありましたので、
「Range("H2").Copy Cells(R, "H")」のように、
1行でシンプルに記述する方法は、とってもうれしいです!

本当にありがとうございます。

お礼日時:2009/05/12 22:40

もう一つ、以下の操作も「マクロの記録」をしてみてください。



H2に数式を入れ、その後、記録スタートするとします。
1.H2~H10を選択(マウスを使っても、キーボードのShift+↓を使ってもOKです)
2.Ctrl+d


後はマクロの記録には出てきませんが、RangeやCellsを上手く使えばできます。
実際のデータを見ていないので確かなことは言えませんが、Do~Loopや For~to~Nextなどは使わなくてもできると思います。
    • good
    • 0
この回答へのお礼

こんばんわ。
たびたびありがとうございます。

Ctrl+dは、知りませんでした!
これは大変使えそうです。
Do~Loopや For~to~Nextを使わずにするやり方も習得したいと思います。

ありがとうございます。

お礼日時:2009/05/12 22:37

せっかく「Do~Loop」にまで到達しているならヘルプを見て自分で考えるのがBestです。


VBAからヘルプを呼び出し、目次から
Visual Basic プログラミングのヒント→Do...Loop ステートメントの使い方
に詳しく書いています。
    • good
    • 0
この回答へのお礼

こんばんわ。
ヘルプがあるんですね!
いろいろ用語がわからず困っていましたので、
助かります。

ありがとうございます。

お礼日時:2009/05/12 22:36

こんばんは



以下の操作を「マクロの記録」してみてください。
1.A列の一番下のセルを選択
2.Ctrlキーを押しながら↑キーを押す。

マクロの記録ですともう少し長い記述となりますが、自分でVBAを書くと以下のようになります。
Cells(Rows.Count, "A").End (xlUp)


[A65536]を使わないのはバージョンが2003以前と2007のどちらでも対応できるようにするためです(もっとも、いずれの場合にも最後の行までデータを入れることはないという前提です)。

最後の行を知りたい場合には、
Cells(Rows.Count, "A").End(xlUp).Row
とします。
    • good
    • 0
この回答へのお礼

こんばんは。
早速のご回答ありがとうございます。
「End (xlUp)」を初めて知りました。
大変便利で、応用がききそうです。バージョンによっても記述が違うのですね・・・。

ありがとうございます。

お礼日時:2009/05/12 22:35

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

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

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

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

Q繰り返し1行~28行までを順順にコピーする方法

(B1:B28)を選択しD2に貼り付け(値・行列入れ替え)
(B29:B56)を選択しD3に貼り付け(値・行列入れ替え)
(B57:B84)を選択しD4に貼り付け(値・行列入れ替え)
:
:
:

といった感じに28個セルを選択し順順に貼り付けていく作業を行っているのですが330回くらい繰り返すのであまりに大変なのでマクロを作成しました。やはり途中で操作ミスなどありましたがなんとか記録できました。

しかしこれはVBAで作成すればもっとスマートにできるかな?と思い質問させて頂きます。
どなたかわかる方いれば宜しくお願いします。

Aベストアンサー

こんな感じ?

Sub Transpose28()

Dim i As Integer
Application.ScreenUpdating = False
For i = 1 To 330
Cells(i * 28 - 27, 2).Resize(28).Select
Selection.Copy
Cells(i + 1, 4).Select
Selection.PasteSpecial Paste:=xlAll, Operation:=xlNone, SkipBlanks:=False _
, Transpose:=True
Next
Application.CutCopyMode = False
Application.ScreenUpdating = True
End Sub

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....続きを読む

QExcelVBAを使って、値がある場合は作業を繰り返し実行するプログラムを作成したい。

以下のようなプログラムをVBAで作成したいと考えています。

A1のセルに値があれば、その値をB1に返す。
次にA2のセルに値があれば、その値をB2に返す。
A行に値がある一番下のセルまで同じようなことをさせたいと考えています。

VBAは初心者です。
どなかた宜しくお願い致します。

Aベストアンサー

#2さんと似たものですが・・・・参考にしてください。

Sub test001()
Dim i As Long
i = 1
Do While Cells(i, 1) <> ""
Cells(i, 2) = Cells(i, 1)
i = i + 1
Loop
End Sub

Qマクロのコピー&ペーストの繰り返し作業について

今、マクロを使って単純な作業を繰り返したいと思っているのですが、その中でいくつかわからない点があるので質問することにしました。
まず、貼り付けたい元データ(説明上data1と呼びます)が40種類あります。
これらは、すべて異なるファイル名をつけており、1つのフォルダ内に保存しています。
data1上のコピーをしたいと思っている場所は40種類ともすべて同じ場所(セルのH3)です。
これを、まったく新しいエクセルファイル(説明上resultと呼びます)に貼り付けたいと思っています。
このとき、data1の40種類のデータをresultのシート上にA1から順番に縦に並べていきたいと思っています。
この作業をdata1のファイル数である40回繰り返したいと思っているのですが、どうすればいいのでしょうか。

回答をお願いします。

Aベストアンサー

データのコピー元およびコピー先を明確に書いていただいてないので適当に作成しtwみました。
以下の前提です。

元データはすべて同じフォルダ内にあるBOOKの1枚目(一番左)のシート(名前を問わない)のH3セルにある。
あなたがresultと呼んだコピー先のBOOKの1枚目(一番左)のシートのA1セル以降に順番に貼り付ける。

それでよければ以下のマクロをresultと呼んだコピー先のBOOKの標準モジュールに貼り付け、元データと同じフォルダ内に保存してください。
マクロは書いたことは無くとも、標準モジュールに貼り付けるくらいはできるんですよね?

Sub TEST01()
  Dim myFn As String
  Dim i As Long
  Dim wb As Workbook '以上変数宣言
  Application.ScreenUpdating = False '画面更新一時停止
  myFn = Dir(ThisWorkbook.Path & "\*.xls?") 'エクセルBOOK検索
  Do While myFn <> "" '対象が存在する限り続行
    If myFn <> ThisWorkbook.Name Then 'ファイル名がresultの名と違っていれば
      Set wb = Workbooks.Open(ThisWorkbook.Path & "\" & myFn) '開く
      i = i + 1 'カウント
      wb.Worksheets(1).Range("H3").Copy ThisWorkbook.Worksheets(1).Cells(i, "A") 'コピペ
      wb.Close False '閉じる
    End If
    myFn = Dir() '次検索
  Loop '繰り返し
  Application.ScreenUpdating = True '画面更新停止解除
End Sub

ALT+F8キーでマクロを呼び出し、TEST01を実行してみてください。

データのコピー元およびコピー先を明確に書いていただいてないので適当に作成しtwみました。
以下の前提です。

元データはすべて同じフォルダ内にあるBOOKの1枚目(一番左)のシート(名前を問わない)のH3セルにある。
あなたがresultと呼んだコピー先のBOOKの1枚目(一番左)のシートのA1セル以降に順番に貼り付ける。

それでよければ以下のマクロをresultと呼んだコピー先のBOOKの標準モジュールに貼り付け、元データと同じフォルダ内に保存してください。
マクロは書いたことは無くとも、標準モジュールに...続きを読む

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

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

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

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

Aベストアンサー

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

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

QエクセルVBA 別シートの複数のセルの値をコピーする方法

いつもお世話になります。

Dim sh1, sh2 As Worksheet
Set sh1 = Worksheets("sheet1")
Set sh2 = Worksheets("sheet2")

sh1.Range("C6").Value = sh2.Range("F5").Value
として、1つのセルの値ならコピーできるのですが、
sh1.Range("C6:C10").Value = sh2.Range("F5;F9").Value
としても、セルの値を持ってくることができません。
どのように書けば良いのでしょうか?

ちなみに今は、
sh2.Range("F5:F9").Copy
sh1.Range("C5:C9").PasteSpecial Paste:=xlValues
としているのですが、上記だとセルを範囲指定してしまって作業が見えるのでカッコ悪いのです。

Aベストアンサー

7-samuraiの質問ですみません。
No5のimogasiさん、いつもお世話様です。

Sub test01()
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Set sh1 = Worksheets("sheet2")
Set sh2 = Worksheets("sheet1")
sh1.Range("c1:c5").Value = sh2.Range("A1:A5").Value
End Sub

で、うまくいきますよ。
複数セルの場合Valueは省略できないようです。

QVBAで複数の数式セルを最終行までコピーするには?

エクセルで下記のような表を作成しています。

   A   B   C   D
1 項目1 数式 数式 数式
2 項目2
3 項目3
  ・
  ・
  ・

B1~D1の数式は項目1を参照したものです。
この時、2行目以下~最終行まで数式をコピーするには、
どのようなVBAを書けばよいでしょうか?

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

Aベストアンサー

Range("A1", Cells(Rows.Count, 1).End(xlUp)).Offset(, 1).Resize(, 3).Formula = Range("B1:D1").Formula

とか?

QExcel で行を指定回数だけコピーしたい

Excel で行を指定回数だけ、コピーしたいと思います。

A    B   C   D    E
ssjj kkkk ssss jajj 2
jkjk jjkj jahj kjkj 4
ksks ssss kakk uhuh 0
kaka sakk kjkj iuiiu 1

このような表があった時、E列で繰り返しの回数を指定するとして
次のシートに以下のような表ができれば
いいのですが。

A     B     C     D     E
ssjj kkkk ssss jajj 2
ssjj kkkk ssss jajj 2
jkjk jjkj jahj kjkj 4
jkjk jjkj jahj kjkj 4
jkjk jjkj jahj kjkj 4
jkjk jjkj jahj kjkj 4
jkjk jjkj jahj kjkj 4
kaka sakk kjkj iuiiu 1



膨大な数のデータですのでVBAやマクロ
が使えるといいのですが。

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

Excel で行を指定回数だけ、コピーしたいと思います。

A    B   C   D    E
ssjj kkkk ssss jajj 2
jkjk jjkj jahj kjkj 4
ksks ssss kakk uhuh 0
kaka sakk kjkj iuiiu 1

このような表があった時、E列で繰り返しの回数を指定するとして
次のシートに以下のような表ができれば
いいのですが。

A     B     C     D     E
ssjj kkkk ssss jajj 2
ssjj kkkk ssss jajj 2
jkjk ...続きを読む

Aベストアンサー

>VBAやマクロが使えるといいのですが。
VBAでやれば簡単なロジックで出来るが、VBAの経験はあるのかな。
(A)E列に繰り返し数があると仮定している。
(B)2003までなら、データ数は65536行以内と仮定になる。
(E列の繰り返し数の合計が)
標準モジュールに
Sub test01()
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Set sh1 = Worksheets("sheet1")
Set sh2 = Worksheets("sheet2")
d = sh1.Range("A65536").End(xlUp).Row
MsgBox d
k = 1
For i = 1 To d
For j = 1 To sh1.Cells(i, "E")
sh1.Range(sh1.Cells(i, "A"), sh1.Cells(i, "E")).Copy _
sh2.Cells(k, "A")
k = k + 1
Next j
Next i
End Sub
ーー
質問例でのテスト  Sheet2に
ssjjkkkkssssjajj2
ssjjkkkkssssjajj2
jkjkjjkjjahjkjkj4
jkjkjjkjjahjkjkj4
jkjkjjkjjahjkjkj4
jkjkjjkjjahjkjkj4
kakasakkkjkjiuiiu1

>VBAやマクロが使えるといいのですが。
VBAでやれば簡単なロジックで出来るが、VBAの経験はあるのかな。
(A)E列に繰り返し数があると仮定している。
(B)2003までなら、データ数は65536行以内と仮定になる。
(E列の繰り返し数の合計が)
標準モジュールに
Sub test01()
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Set sh1 = Worksheets("sheet1")
Set sh2 = Worksheets("sheet2")
d = sh1.Range("A65536").End(xlUp).Row
MsgBox d
k = 1
For i = 1 To d
For j = 1 To sh1.Cells(i, "E"...続きを読む

Qエクセルマクロ 繰り返して、別のシートへコピーしたい

エクセルマクロ 繰り返して、別のシートへコピーしたい
マクロ初心者のため、やり方が全くわかりません。
どなたか教えてください。
やりたいことは、
コピーするシートはあらかじめ作成しています。
簡素化の方法がわからないので、
とりあえず自分で作ってみたものが下にあるものです。

繰り返す方法がわからないので、

どなたか教えてください。
よろしくお願いします。

以下、作成したマクロです。
1行目から10行目まで繰り返したくて、
1行目から2行目のセルの移動の差は10行目までかわりません。

'1行目
Sheets("Sheet1").Select
Range("B14:C14").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Sheet2").Select
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False

Sheets("Sheet1").Select
Range("B15:C17").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Sheet2").Select
Range("B1").Select
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False

'2行目
Sheets("Sheet1").Select
Range("B18:C18").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Sheet2").Select
Range("A2").Select
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False

Sheets("Sheet1").Select
Range("B19:C21").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Sheet2").Select
Range("B2").Select
Range("B2").Select
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False

エクセルマクロ 繰り返して、別のシートへコピーしたい
マクロ初心者のため、やり方が全くわかりません。
どなたか教えてください。
やりたいことは、
コピーするシートはあらかじめ作成しています。
簡素化の方法がわからないので、
とりあえず自分で作ってみたものが下にあるものです。

繰り返す方法がわからないので、

どなたか教えてください。
よろしくお願いします。

以下、作成したマクロです。
1行目から10行目まで繰り返したくて、
1行目から2行目のセルの移動の差は10行目までか...続きを読む

Aベストアンサー

2の回答者です。

私の問いに関しては、質問者さんは、完全無視のままのようですが、このままでは格好がつかないので、分かっている範囲で回答して置きます。私は、質問中途で質問が変わるご質問には、基本的には回答しない建前としていますし、ご質問者さんが、画像をアップしているのを知らなかったので、回答がちぐはぐになってしまったことは否定出来ません。今回、初めての質問のようでしたが、レスをつけようがつけまいが構いませんが、そのままにせずに、締めるようにしてください。

あえて、配列変数を使う理由などはありませんが、配列を生かすように作ってみました。コピー元の場所変更は可能ですが、書くときは、順序として隣り合ったセルの場合、必ず、コロン(:)でつなぐのがコツです。
'-------------------------------------------
Sub TransferTest1()
  Dim myData(6) As Variant
  Dim rng As Range
  Dim c As Variant
  Dim i As Long, j As Long, k As Long
  '最初のrng の部分を決めてくれれば良いです。ただし、隣り合うセルは、{:}でつなぎます。
  Set rng = Worksheets("Sheet1").Range("B11:B12,D11:G11,F12")
  
  For j = 0 To Cells(Rows.Count, 2).End(xlUp).Row Step 4 '4行置き
    i = 0
    For Each c In rng.Offset(j).Cells
      myData(i) = c.Value
      i = i + 1
    Next c
    Worksheets("Sheet2").Range("D2").Offset(k).Resize(, 7).Value = myData()
    Erase myData()
    k = k + 1
  Next j
  Set rng = Nothing
End Sub

2の回答者です。

私の問いに関しては、質問者さんは、完全無視のままのようですが、このままでは格好がつかないので、分かっている範囲で回答して置きます。私は、質問中途で質問が変わるご質問には、基本的には回答しない建前としていますし、ご質問者さんが、画像をアップしているのを知らなかったので、回答がちぐはぐになってしまったことは否定出来ません。今回、初めての質問のようでしたが、レスをつけようがつけまいが構いませんが、そのままにせずに、締めるようにしてください。

あえて、配列変数...続きを読む

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ランキング