• ベストアンサー

エクセル2000のVBAのcutメゾット

エクセル2000でセルを他のセルの文字から検索し検索されたセルを特定の場所にコピーし貼り付けるのを空欄になるまで繰り返すVBAを作りました。 Dim a As Range Dim b As Long b = 1 Do Until Cells(2 + b, 5).Value = "" Cells(2 + b, 5).Select Set a = Range("B:B").Find(what:=Cells(2 + b, 5).Value) a.Select Selection.Copy Cells(2 + b, 8).PasteSpecial xlAll Cells(2 + b, 5).Select b = b + 1 Loop なんですが、これだとちゃんと起動するのに「copy」を「cut」に変更したら、「pastespecial」でデバックが発生し止まってしまいます。 どちらかというと、コピーより切り取りして貼り付けたい(んで、残ったセルを検索しメッセージボックスで表示出せたい)のですが、このVBAだとcutメゾットは使えないのでしょうか? また使えるのならば「pastespecial」でなければ、何を使って貼り付ければよいのでしょうか?

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

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

こんばんは。 >検索語が最終的に全部消えてたのですがなぜなのでしょうか? てっきり、元は残して、検索語を消すと思い込んでいたからです。 コードを読んでいて気が付いたけれども、探すのは文字なのですね。数字ではありませんね。何か、検出される文字のヘンなことに気が付きました。 Find の中は、あまり省略しないほうがよいですね。Find のオプションは、前の検索を残していることがあって、誤動作の元になります。 Sub テスト() マクロを読んでみました。 私として、Cutは感覚的に使えません。 改めて作り直してみました。ただ、なんとなく、すっきりとしていません。思うに、剥き出しのCells があるせいかもしれません。 これは、B3 から値の入って連続した下方向の最終行まで。 Range("B3", Range("B3").End(xlDown)) Sub TestSample2()  Dim r As Range  Dim b As Long  Dim rng As Range  Dim buf As Variant  Set rng = Range("B3", Range("B3").End(xlDown))  b = 3  Do Until Cells(b, 5).Value = ""   Set r = rng.Find(What:=Cells(b, 5).Value, Lookat:=xlWhole)   If Not r Is Nothing Then    Cells(b, 8).Value = r.Value    r.ClearContents   Else    buf = buf & Chr(13) & Cells(b, 5).Value   End If   b = b + 1  Loop  Set rng = Nothing  MsgBox "以下が検索されていません" & buf End Sub

asuka546
質問者

お礼

再びのご回答ありがとうございます。 確かに、Cutするよりはご回答のようにしたほうが良いかもしれません。(Cutすると余計なものまでくっついてくるので) あと、最後のメッセージボックスは検索されないものが全部一つのボックスに出せるのがすばらしいです。 このままでは、使えないのでこちらで少し書き換えました。 Sub ファイルの振り分け() Dim a As Range Dim b As Long Dim c As String Dim d As Long For d = 5 To 44 Step 7 b = 3 Do Until Cells(b, d).Value = "" Set a = Range("B3:B50").Find(what:=Cells(b, d).Value) If Not a Is Nothing Then Cells(b, d + 4).Value = a.Value a.ClearContents Else buf = buf & Chr(13) & Cells(b, d).Value End If Cells(3, d).Resize(1, 5).Select Range(Selection, Selection.End(xlDown)).Select Selection.Sort key1:=Cells(3, d + 4), order1:=xlAscending, header:=xlNo b = b + 1 Set a = Nothing Loop Next MsgBox "以下が検索されていません" & buf End Sub 私はまだVBA初心者なのでどこがすっきりしないか良くわからないのですが、とりあえずこれでいってみようと思います。 ご教授ありがとうございました。

その他の回答 (4)

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

こんにちは。 例えば、こんに風にしたらどうでしょう? Dim a As Range  Dim b As Long  b = 1  Do Until Cells(2 + b, 5).Value = ""   On Error Resume Next   Cells(2 + b, 8).Value = _     Range("B:B").Find(what:=Cells(2 + b, 5).Value).Value   If Err.Number = 0 Then Cells(2 + b, 5).ClearContents   On Error GoTo 0   b = b + 1  Loop

asuka546
質問者

お礼

ご回答ありがとうございます。 試してみたいのですが、なぜか検索語が最終的に全部消えてたのですがなぜなのでしょうか? 結局、下のお礼のようにしてみました。

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

こんにちは。KenKen_SP です。 こんな感じでしょうか。 Dim a As Range Dim b As Long b = 3 '処理開始行 Do Until Cells(b, 5).Value = ""   Set a = Range("B:B").Find(What:=Cells(b, 5).Value)   '見つかったときだけCut   If Not a Is Nothing Then     a.Cut Destination:=Cells(b, 8)   End If   b = b + 1   Set a = Nothing Loop 実行速度の点から言えば、Findメソッドの検索範囲を絞った方が 良いかも。例えば、 Dim rngSearch as Range とでも宣言しておいて '検索範囲 Set rngSearch = Range("B3:B" & Cells(3,"B").end(xlDown).Row) で検索範囲をオブジェクト変数に格納しておきます。 そして、上記のコードで言えば   Set a = Range("B:B").Find(What:=Cells(b, 5).Value) を   Set a = rngSearch.Find(What:=Cells(b, 5).Value) とします。検索範囲は小さければ小さいほど処理速度は早くなります。

asuka546
質問者

お礼

エラー処理までしていただきありがとうございます。 検索範囲ですが、このVBAを違う表にも対応させるため(等間隔においてFor~nextステートメントで回すつもり)終点にしてしまうと、次の表に対応できなくなっちゃうので、範囲は考えうる最大値として("B3:B50")としてみました。 これ以上ファイルが増えることはないと思うので。 複数の処理を最終的に一つのVBAとしてまとめるつもりなので処理速度は出来るだけ早くしたいと考えてます。 適切なご指摘ありがとうございました。 結局、下のようなものにしてみました。(ないときの処理を増やしてみました) Sub テスト() Dim a As Range Dim b As Long Dim c As String b = 3 '処理開始行 Do Until Cells(b, 5).Value = "" Set a = Range("B3:B50").Find(What:=Cells(b, 5).Value) '見つかったときだけCut If Not a Is Nothing Then a.Cut Destination:=Cells(b, 8) Else c = Cells(b, 5).Value MsgBox c & "のファイルが検索されていません" End If b = b + 1 Set a = Nothing Loop End Sub

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.2

>a.Select >Selection.Copy >Cells(2 + b, 8).PasteSpecial xlAll を、 a.Copy Cells(2 + b, 8) の一行に。 なお、実行速度向上のために、 >a.Select >Selection.Copy は、a.Copy の一行で書くことが出来ます。 >残ったセルを検索しメッセージボックスで表示出せたい 意味が良くわかりませんので・・・。 検索で見つからない場合のエラー処理がされていませんので、見つからない場合は必ずエラーで止まりますよ。 きちんとサンプルを見てエラー処理をした方が安全です。

asuka546
質問者

お礼

ご回答ありがとうございました。 一応Copyはうまくいったので、Cutの仕方だったのですが、参考にさせていただきました。 結局 a.Cut Cells(2 + b, 8) としたらうまく作動しました。 やっぱり行が少ないほうが実行速度は速くなるんですね。 言葉が足りなかったみたいですみません。 「残ったセルを選択してメッセージボックスうんぬん」は、説明しにくいのですが、検索されるセルに検索されないセルが残った場合です。 検索する表にはこのVBAの前にあるフォルダからすべてのファイルをリンクするVBAでファイルのリンクが書かれておりそれをファイルの一部分の文字(表で入っている)で検索し、そのファイルの一部分が入った表に貼り付けてます。(入っているフォルダは同じだがたまに処理が違う例外があるため何種類かの表が作成されている) そのファイルがたまに増減するので、増えた場合は検索する語以外のリンクが入ってしまいます。 それを確認したいために増えて検索されなかったファイルをメッセージボックスで表示したいと考えています。 検索で見つからない場合(減った場合)のエラー処理は(というか、Ifで分岐させる予定ですが)これからしようと思ってます。 あとサンプルって何のサンプルのことでしょうか?ヘルプですか? 私は参考書を見て書いているのですが、参考書には検索時のエラー処理は書かれていませんでした。(言われるまでそっちのエラー処理を忘れていたのでご進言ありがとうございます)自分で考えるかネットでどうにかし様と思います。(未だにヘルプの使い方がよくわからないので) ありがとうございました。

  • fly_moon
  • ベストアンサー率20% (213/1046)
回答No.1

>Selection.Copy >Cells(2 + b, 8).PasteSpecial xlAll を Selection.Cut Cells(2 + b, 8).Select ActiveSheet.Paste にされてはいかがでしょう?

asuka546
質問者

お礼

ご回答ありがとうございます。 結局 a.Cut Cells(2 + b, 8) としたらうまく作動しました。 分ける場合はシートを指定しないといけないんですね。

関連するQ&A

  • Excel vba 実行エラー1004

    (1)アクティブブックの名前を取得してセルO2に貼り付けた。ex. 1234567b.CSV (2)VBAを使って1234567k.CSV におきかえた。 (3)(2)のセルに入力された内容でブックを開きたいが、エラー1004が出て開けない。 (4)開けたとして、そのブックのA1セルを 元のブックをアクティブにして D1に 貼り付けたい。 (5)またさっきのブックに戻ってF1セルを 元のブックをアクティブにして E1セルに貼り付けたい。 というようなVBAを組みたいと思っています。 現在(1)(2)はできましたが(3)でエラーが出たため止まっていますし、その後もわかりません。 Dim bb As String Dim kb As String bb = ActiveWorkbook.Name Cells(2, "O").Value = ActiveWorkbook.Name Cells(3, "O").Value = ActiveWorkbook.Name Range("O2").Formula = Replace(bb, "b.CSV", "k.CSV") kb = Range("O2") 'シート名を取得する Dim bbs As String bbs = Left(bb, 10) Cells(4, "O").Value = bbs Dim kbs As String kbs = Left(kb, 10) Cells(5, "O").Value = kbs 'コピーして貼り付ける kbn = Cells(2, 15) Workbooks.Open Filename:=kbn Range("F1").Select Range("F1").Copy として作ってるんですが、 Workbooks.Open Filename:=kbn でエラーが出てブックが開けません。 ご指導お願いします。

  • Excelの三つのVBAを一つにまとめる。

     初めまして、よろしくお願いします。当方全くの素人でVBAの基礎もよくわからず、ネットから拾ってきていじった三つのVBAがあります。この三つ、一つ一つは個別に機能するのですが、VBAとして正しいのかさえよく解っていません。この三つを一つにまとめて、同時に機能するようにしたいと頭を抱えています。 Sub TEST() Application.ScreenUpdating = False Application.EnableEvents = False ActiveSheet.Calculate Range("b10:b20").Insert shift:=xlShiftToRight Range("b10:b20").Value = Range("a10:a20").Value Application.OnTime TimeValue("09:00:00"), "TEST" Application.ScreenUpdating = True Application.EnableEvents = True ActiveWorkbook.Save End Sub ________________________________________________________________ Sub TEST1() Application.ScreenUpdating = False Application.EnableEvents = False ActiveSheet.Calculate Dim myCnt As Long Range("c30:c40").Copy Range("d30:d40").PasteSpecial Paste:=xlPasteValues Range("b30:b40").Copy Range("c30:c40").PasteSpecial Paste:=xlPasteValues Range("a30:a40").Copy Range("b30:b40").PasteSpecial Paste:=xlPasteValues nextTime = Now() + TimeValue("01:00:00") Application.OnTime nextTime, "TEST1" Application.ScreenUpdating = True Application.EnableEvents = True ActiveSheet.Calculate ActiveWorkbook.Save End Sub ________________________________________________________________ Sub TEST2() Application.ScreenUpdating = False Application.EnableEvents = False ActiveSheet.Calculate Dim myCnt As Long Range("c50:c60").Copy Range("d50:d60").PasteSpecial Paste:=xlPasteValues Range("b50:b60").Copy Range("c50:c60").PasteSpecial Paste:=xlPasteValues Range("a50:a60").Copy Range("b50:b60").PasteSpecial Paste:=xlPasteValues nextTime = Now() + TimeValue("00:10:00") Application.OnTime nextTime, "TEST2" Application.ScreenUpdating = True Application.EnableEvents = True ActiveSheet.Calculate ActiveWorkbook.Save End Sub ________________________________________________________________  解る方、よろしくお願いします。

  • エクセル VBA シートの選択 

    windows XP でエクセル2000を使っています。 Sub aaa() Sheets("Sheet1").Select Dim a As String a = Cells(2, 4) Sheets(a).Select Range("A1").Select End Sub というマクロだと セルに入っている値のシート名を探してくれます。 ですが Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) If Intersect(Target, Range("B11:b683")) Is Nothing Then Exit Sub Worksheets("Sheet1").Range("C2").Value = Target.Value Dim b As String b = Range("C2).value (←ここをcellsにしてもダメ) Sheets(b).Select Range("A1").Select End Sub これだとsheets(b)を選びません。Sheets(b).Selectのところが黄色くなります。 何処が間違えているのでしょうか。 全くの素人ですが、仕事で必要に迫られています。 わかりやすく回答・解説くれると助かります。

  • エクセルVBAの条件指定が上手くいきません

    「7を超えたら、For Eachステートメントを抜けなさい」という条件を入れたいのですが、 7を超えても処理が継続し困っています。 勉強不足で申し訳ないですが、ご教授願います。 【やりたいこと】 まず、セルB1~D3までのセルの値(9つ)が、7を超えない条件で1を加算していきます。 加算したときの値はE~Gの列に貼り付けていきます。 7を超えた時点でFor Eachステートメントを抜けます。 また、B1~D3までのセルには計算式が入っており、A1に数字を入れると、 それぞれ異なる増え方をします。(計算式自体は$A$1+1.1、$A$1+2.1などシンプルなもの) Sub test() Dim i As Range Dim n As Long Dim x As Long n = 1 x = 1 For Each i In Range("B1:D3") Range("A1").Value = x If i < 7 Then Range("B1:D3").Copy Cells(n, 5).Select Selection.PasteSpecial Paste:=xlPasteValues n = n + 3 x = x + 1 ElseIf i > 7 Then Exit For End If Next End Sub お手数ですが、宜しくお願いいたします。

  • エクセルVBAについて

    こんにちわ! 今、エクセルでAシートの入力した項目をBのシートへデーターが入力できるようなシステムを以下のようにくみました。 そこでBシートにデーターが入力されるのですが20行まで入力すると入力できないようにしたいのですが、なかなか上手くいきません。 A1からF20まで書式のロックを外しそれ以外のセルは保護をかけたのですがその状態でVBAを使って20行以上入力できませんという感じのエラー表示をしたいのですが、どうすればいいでしょうか? VBAは初心者ですが宜しくお願いします。 Private Sub CommandButton1_Click() Dim row As Integer row = WorksheetFunction.CountA(Sheets("date").Columns(1)) + 1 Sheets("date").Cells(row, 1).Value = Range("B2").Value row = WorksheetFunction.CountA(Sheets("date").Columns(2)) + 1 Sheets("date").Cells(row, 2).Value = Range("B3").Value row = WorksheetFunction.CountA(Sheets("date").Columns(3)) + 1 Sheets("date").Cells(row, 3).Value = Range("B4").Value row = WorksheetFunction.CountA(Sheets("date").Columns(4)) + 1 Sheets("date").Cells(row, 4).Value = Range("B5").Value row = WorksheetFunction.CountA(Sheets("date").Columns(5)) + 1 Sheets("date").Cells(row, 5).Value = Range("B6").Value row = WorksheetFunction.CountA(Sheets("date").Columns(6)) + 1 Sheets("date").Cells(row, 6).Value = Range("B7").Value Sheets("統制入力").Select Range("B17").Select ActiveWindow.SmallScroll Down:=-9 Range("B3:B7").Select Selection.ClearContents Range("B1").Select End Sub

  • excel vbaについてです

    VBA初心者で、暇な時にいろいろためしています。 以下のマクロを組んだのですが、エラーがでてうまくいきません。 どこがいけないのかご指摘願います。 Sub ather() Dim A As Range Dim B As Range Dim i As Integer With ThisWorkbook.Worksheets("Sheet1") For i = 1 To 30 Set A = Cells(i, 1) Set B = Cells(1, i) If Not .Range(A).Interior.ColorIndex = vbYellow Then GoTo port10 If Not .Range(B).Interior.ColorIndex = vbRed Then GoTo port10 .Range(B).Offset(, 1).Value = "○" port10: Next i End With End Sub イメージとしてはセルの塗りつぶしが黄色で、かつ右隣のセルの塗りつぶしが赤の時に、 赤色セルの右隣のセルに○を表示させようとしているのですが。。。 こうしたらいいんじゃない?といったアドバイスもお願いします(-人-)

  • エクセル VBA

    VBA内で、そのVBAの実行を制御することは可能でしょうか? 下のようなコードを作ったのですが、 Sub 承認書作成() Dim ws0 As Worksheet, ws1 As Worksheet, r1 As Range Dim i As Long Dim nyuryoku(), chikuseki() Set ws0 = Worksheets("承認書作成") Set ws1 = Worksheets("顧客データ") Set ws2 = Worksheets("業者コード") Set ws3 = Worksheets("承認通知書") Worksheets("顧客データ").Select Range("テーブル1[[#Headers],[NO.]]").Select Selection.End(xlToRight).Select Selection.End(xlDown).Select Selection.ListObject.ListRows.Add AlwaysInsert:=False Range("B7").Select nyuryoku = Array("b5", "d5", "f5", "h5", "j5", "l5", "n5", "p5", "b6", "d6", "f6", "h6", "j6", "l6", "n6", "p6", "b4", "d4") '転記したいセルの位置 chikuseki = Array("0", "1", "5", "6", "8", "9", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "53", "54") '転記先の列のオフセット値  Set r1 = ws1.Range("f" & Rows.Count).End(xlUp).Offset(0) 'データ蓄積セル  For i = 0 To UBound(nyuryoku) r1.Offset(0, chikuseki(i)).Value = ws0.Range(nyuryokui)).Value '入力 Next MsgBox "入力完了" Dim lRowNum As Long '転記先となる行番号を求める lRowNum = ws1.Cells(Rows.Count, "b").End(xlUp).Row '転記 ws3.Cells(6, "d").Value = ws1.Cells(lRowNum, "j").Value ws3.Cells(17, "g").Value = ws1.Cells(lRowNum, "c").Value ws3.Cells(22, "g").Value = ws1.Cells(lRowNum, "l").Value ws3.Cells(22, "ac").Value = ws1.Cells(lRowNum, "ab").Value    Set ws0 = Nothing   Set ws1 = Nothing End Sub ここに、     If call Macro1 then call 承認書作成  '上のマクロです    Else: Msgbox"中止" 「Macro1を実行しないと承認書作成マクロを実行できない」 という コードを組み込みたいのですが、うまくいきません。 VBA内に同じVBAを組み込むことは不可能なのでしょうか?

  • Excel VBA 連番印刷

    昨日以下の質問をさせていただいた者です。 http://okwave.jp/qa/q8349562.html こちらで教えていただいた以下のコードに、 J2のセルに連番を振るコードを付け足したいと思い、 同じくこちらのサイトの過去の履歴にあった以下コードを参考にとやってみているのですが、 Next で指定された変数の参照が無効です。と言われてしまいます… 印刷部数の指定はいらず、sheet印刷のJ2セルに1から始まる連番を振りたいのです。 どのように修正をしたらいいのかご教示願います。 Sub Sample4() Dim i As Long, endRow1 As Long, endRow2 As Long, myArea1 As Range, myArea2 As Range Dim wS1 As Worksheet, wS2 As Worksheet, wS3 As Worksheet Set wS1 = Worksheets("DB") Set wS2 = Worksheets("印刷") Set wS3 = Worksheets("Sheet3") endRow1 = wS1.Cells(Rows.Count, "A").End(xlUp).Row Range(wS1.Cells(1, "A"), wS1.Cells(endRow1, "A")).AdvancedFilter Action:=xlFilterInPlace, unique:=True wS1.Range("A:A").Copy wS3.Range("A1") wS1.ShowAllData For i = 2 To wS3.Cells(Rows.Count, "A").End(xlUp).Row endRow2 = wS2.Cells(Rows.Count, "B").End(xlUp).Row If endRow2 > 9 Then Range(wS2.Cells(10, "B"), wS2.Cells(endRow2, "H")).ClearContents Range(wS2.Cells(10, "J"), wS2.Cells(endRow2, "J")).ClearContents End If wS1.Range("A1").AutoFilter field:=1, Criteria1:=wS3.Cells(i, "A") wS2.Range("B6") = wS3.Cells(i, "A") Set myArea1 = Range(wS1.Cells(2, "B"), wS1.Cells(endRow1, "H")).SpecialCells(xlCellTypeVisible) Set myArea2 = Range(wS1.Cells(2, "I"), wS1.Cells(endRow1, "I")).SpecialCells(xlCellTypeVisible) myArea1.Copy wS2.Activate ActiveSheet.Range("B10").Select Selection.PasteSpecial Paste:=xlPasteValues myArea2.Copy wS2.Activate ActiveSheet.Range("J10").Select Selection.PasteSpecial Paste:=xlPasteValues endRow2 = wS2.Cells(Rows.Count, "B").End(xlUp).Row 'Range(wS2.Cells(1, "A"), wS2.Cells(endRow2, "J")).PrintOut Next i wS1.AutoFilterMode = False wS3.Cells.Clear End Sub 連番印刷のコード Sub NumberPrint() Dim idx As Integer Dim res  res = Application.InputBox("印刷部数を入力してください", Type:=1)  If res > 0 Then   For idx = 1 To res    Range("AW3").Value = idx    ActiveSheet.PrintOut   Next idx  End If End Sub

  • EXCEL VBA

    EXCEL VBAで空白行が現れたら「小計」の文字を入力したいと思い以下のように記述しましたが、うまくいきません。どこがおかしいのか教えてください。 宜しくお願いします。 Sub write小計() Dim i As Integer Dim rowcnt As Integer rowcnt = Cells(1, 1).CurrentRegion.Rows.Count Range("B1").Select For i = 1 To rowcnt If Cells(i, 2).Value = "" Then Value = "小 計" ActiveCell.Offset(1).Select Next i End Sub

  • エクセルVBAの連続検索

    エクセルVBAで、textbox内に入力した参加者の名前を検索しチェックを入れる作業を行いたいです(集会の受付名簿用)。findnextを使っても無限にループするか、同姓の最初の一人しか検索できずに困っています。 Dim 検索セル As Range Dim 最初のセル As String Dim 次の候補 As Range 検索対象文字 = Range("h2").Value Set 検索セル = Range("a5:B100").Find(検索対象文字) If Not 検索セル Is Nothing Then 最初のセル = 検索セル.address Do 検索セル.Select Set 次の候補 = Range("a5:b100").FindNext(after:=検索セル) Loop Until 次の候補.address = 最初のセル End If 手直しをお願いしますTT

専門家に質問してみよう