- ベストアンサー
任意の1行を選択していないと実行できないマクロ
教えてください。 任意の行番号をクリックしてまるまる1行選択してから、「切り取る」「別のシートに挿入、貼付ける」というマクロを実行しています。 1行選択していないとそのマクロを実行できないという風にするにはどのようなコードを書けばよいでしょうか? 選択する行番号はその都度違います。 欲を言えば、間違った選択でマクロを実行した時にエラー表示が出ると大変ありがたいのですが… どうかよろしくお願いします。 使用するエクセルは97です。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんな感じだと思います。もっとスマートな方法も有るかも? 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
その他の回答 (4)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。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
お礼
いろいろ考えましたが、やはり新しいものを上にしていきたいので挿入でいこうかと思います。 できる機能を知っていないと、どこまで理想を持っていいか判断できないですね。今回は勉強になりました。どうもありがとうございました。
- Wendy02
- ベストアンサー率57% (3570/6232)
#3のWendy02です。 単に、チェッカーを入れたいなら、むずかしく考える必要はないと思います。 If Selection.Address = Selection.Cells(1).EntireRow.Address Then '実行 Else MsgBox "それは、一行を選択していません。" End If End Sub
お礼
はい、チェッカーも必要なんですが、間違えてしまった場合、そのあとマクロを実行しないというコードも必要なんです。 なので、No.3で示していただいたように特定のセルを選択していれば、行ごとマクロを実行できるというのはとてもスマートなやり方だと思います。 ありがとうございました。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 #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 目的の場所のセルの左端 で良い。
お礼
こんにちは。大変勉強になりました。 特定のセルを選択していればマクロで行全体に切り替えられる、というのはとても魅力的です。ぜひ活用していきたいと思うのですが、まだまだ初心者なのでこれから頑張りたい所です。 別のシートに『挿入』して『貼り付け』というのは切り取った1行分の情報を、消さずに全て残していきたいからです。(『挿入』ではなく空白行に貼り付けていく、でもOKなのですが)こんな説明でもお分かりになるでしょうか…。 指示していただいたコードだと同じ場所に上書きされてしまいますよね。 上手いコードの作り方を研究していきたいと思います。どうもありがとうございました!
- zap35
- ベストアンサー率44% (1383/3079)
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
お礼
どうもありがとうございます! こちらのマクロを公開していなかったせいですが、間違って選択したセルでマクロが実行されてしまいました。勉強しないと駄目ですね…。活用できなくて申し訳ないです。ありがとうございました。
お礼
どうもありがとうございます! 希望通りにできました。早々の回答、大変助かりました!! ただ、後半の If Left(strAddress, Len(strAddress) / 2) <> _ Right(strAddress, Len(strAddress) / 2) Then MsgBox "欲張り、行は一行だけ" Exit Sub End If の部分が1行だけ選択していてもメッセージが出るので困ってしまいました。でも、これを除いても充分できたのでお礼申し上げます。