人生最悪の忘れ物

教えてください。

任意の行番号をクリックしてまるまる1行選択してから、「切り取る」「別のシートに挿入、貼付ける」というマクロを実行しています。
1行選択していないとそのマクロを実行できないという風にするにはどのようなコードを書けばよいでしょうか?
選択する行番号はその都度違います。

欲を言えば、間違った選択でマクロを実行した時にエラー表示が出ると大変ありがたいのですが…

どうかよろしくお願いします。
使用するエクセルは97です。

A 回答 (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
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/09/08 10:22

こんにちは。

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/09/08 18:21

#3のWendy02です。



単に、チェッカーを入れたいなら、むずかしく考える必要はないと思います。

If Selection.Address = Selection.Cells(1).EntireRow.Address Then
 '実行
Else
 MsgBox "それは、一行を選択していません。"
End If
End Sub

 
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/09/08 12:09

こんにちは。



#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 目的の場所のセルの左端
で良い。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/09/08 11:11

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/09/08 10:53

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


おすすめ情報