• ベストアンサー

任意の1行を選択していないと実行できないマクロ

教えてください。 任意の行番号をクリックしてまるまる1行選択してから、「切り取る」「別のシートに挿入、貼付ける」というマクロを実行しています。 1行選択していないとそのマクロを実行できないという風にするにはどのようなコードを書けばよいでしょうか? 選択する行番号はその都度違います。 欲を言えば、間違った選択でマクロを実行した時にエラー表示が出ると大変ありがたいのですが… どうかよろしくお願いします。 使用するエクセルは97です。

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

  • ベストアンサー
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.1

こんな感じだと思います。もっとスマートな方法も有るかも? Sub test() Dim i As Integer Dim strAddress As String strAddress = Selection.Address For i = 1 To Len(strAddress)   If Mid(strAddress, i, 1) Like "[!0-9,$:]" = True _     Or Mid(strAddress, i, 1) Like "[!0-9,$:]" = Null Then     MsgBox "行を選択"     Exit Sub   End If Next i If Left(strAddress, Len(strAddress) / 2) <> _   Right(strAddress, Len(strAddress) / 2) Then   MsgBox "欲張り、行は一行だけ"   Exit Sub End If ’コピーの処理 End Sub

gure_s
質問者

お礼

どうもありがとうございます! 希望通りにできました。早々の回答、大変助かりました!! ただ、後半の If Left(strAddress, Len(strAddress) / 2) <> _   Right(strAddress, Len(strAddress) / 2) Then   MsgBox "欲張り、行は一行だけ"   Exit Sub End If の部分が1行だけ選択していてもメッセージが出るので困ってしまいました。でも、これを除いても充分できたのでお礼申し上げます。

その他の回答 (4)

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

こんにちは。Wendy02です。 挿入でもかまわないとは思いますが、 #3 の   .Copy Worksheets("Sheet2").Range("A65536").End(xlUp).Offset(1) のコードは、A列に対して、データがあるか、ある場合は、次の行に貼り付けるというの判定をしています。このようなコードの定番です。別の列で判定する必要があれば、その列にすればよいです。 もし、かなり、データが点在して、どの列とか取れないようであれば、SpecialCells(xlCellTypeLastCell) (使われたセルの最後のセル)の次の行にするとか、方法は様々です。  Worksheets("Sheet2").Cells.SpecialCells(xlCellTypeLastCell).Offset(1)   ということになると思います。 挿入はあまりメジャーな方法ではありません。概ね、時系列を逆さにし、新しいものを上にしていく時に、挿入を使います。若干、速度が遅いので、私は、あまり使いません。 Sub TestSelect()   If TypeName(Selection) <> "Range" Then     MsgBox "ワークシート上にはカーソルがありません。", vbInformation     Exit Sub   End If With Selection   If .Address = .Cells(1).EntireRow.Address Then    .Copy    '2行目に挿入 Rows(2)    Worksheets("Sheet2").Rows(2).Insert xlShiftDown    Application.CutCopyMode = False   Else    MsgBox "それは、一行全体を選択していません。"   End If  End With End Sub

gure_s
質問者

お礼

いろいろ考えましたが、やはり新しいものを上にしていきたいので挿入でいこうかと思います。 できる機能を知っていないと、どこまで理想を持っていいか判断できないですね。今回は勉強になりました。どうもありがとうございました。

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

#3のWendy02です。 単に、チェッカーを入れたいなら、むずかしく考える必要はないと思います。 If Selection.Address = Selection.Cells(1).EntireRow.Address Then  '実行 Else  MsgBox "それは、一行を選択していません。" End If End Sub  

gure_s
質問者

お礼

はい、チェッカーも必要なんですが、間違えてしまった場合、そのあとマクロを実行しないというコードも必要なんです。 なので、No.3で示していただいたように特定のセルを選択していれば、行ごとマクロを実行できるというのはとてもスマートなやり方だと思います。 ありがとうございました。

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

こんにちは。 #1さんのマクロで解決すればよいのですが、私には、見えていない部分がありますね。 ・「任意の行番号をクリックしてまるまる1行選択」してから、    ↓ ・「切り取る」「別のシートに挿入、貼付ける」というマクロを実行しています。 理屈としては理解できるけれども、コードの論理が考えると、少しへんです。 >「任意の行番号をクリックしてまるまる1行選択」 なぜ、そんな条件が必要なのでしょうか?マクロでは、「特定のセルひとつ」でも、そのあとのコードで、行全体に切り替えられます。 (ActiveCell.EntireRow) ActiveCell は、必ずひとつです。その行全体なら、それで目的は得られるはずです。 「別のシートに、貼付ける」であって、「別のシートに『挿入』、貼付ける」の『挿入』の詳細が分かりません。これを元に考えていただいても良いです。 これは回答ではありません。単に、考えていただくSampleです。 Sub TestCopySample()  If TypeName(Selection) <> "Range" Then    MsgBox "そこは、セルではありません。", vbInformation    Exit Sub  End If  With ActiveCell.EntireRow    If Application.CountA(.Cells) = 0 Then     MsgBox "その一行にはデータはありません。", vbInformation     Exit Sub    End If      'この部分は、97用/ 97は、1 Line のCutメソッドがうまくいかない経験がある。    If Application.CountA(Worksheets("Sheet2").Range("A65536").End(xlUp)) = 0 Then     .Copy Worksheets("Sheet2").Range("A65536").End(xlUp)    Else    .Copy Worksheets("Sheet2").Range("A65536").End(xlUp).Offset(1)    End If    .ClearContents  End With End Sub 「1 Line のCutメソッドがうまくいかない。」でなければ、   ActiveCell.EntireRow.Cut 目的の場所のセルの左端 で良い。

gure_s
質問者

お礼

こんにちは。大変勉強になりました。 特定のセルを選択していればマクロで行全体に切り替えられる、というのはとても魅力的です。ぜひ活用していきたいと思うのですが、まだまだ初心者なのでこれから頑張りたい所です。 別のシートに『挿入』して『貼り付け』というのは切り取った1行分の情報を、消さずに全て残していきたいからです。(『挿入』ではなく空白行に貼り付けていく、でもOKなのですが)こんな説明でもお分かりになるでしょうか…。 指示していただいたコードだと同じ場所に上書きされてしまいますよね。 上手いコードの作り方を研究していきたいと思います。どうもありがとうございました!

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.2

1行選択ならこれでどうですか Sub Macro4()  If TypeName(Selection) = "Range" And _   Selection.Rows.Count = 1 And _   Selection.Columns.Count = 256 Then    'COPY & PASTE  Else    MsgBox ("マクロは1行全体を選択して実行!")  End If End Sub

gure_s
質問者

お礼

どうもありがとうございます! こちらのマクロを公開していなかったせいですが、間違って選択したセルでマクロが実行されてしまいました。勉強しないと駄目ですね…。活用できなくて申し訳ないです。ありがとうございました。