Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1828 / 13645 ツリー ←次へ | 前へ→

【71573】任意のアクティブセルを基点として、その下に2行挿入する ushineko 12/3/19(月) 17:54 質問[未読]
【71574】Re:任意のアクティブセルを基点として、そ... hint 12/3/19(月) 21:52 発言[未読]
【71589】Re:任意のアクティブセルを基点として、そ... ushineko 12/3/21(水) 15:15 質問[未読]
【71595】Re:任意のアクティブセルを基点として、そ... hint 12/3/21(水) 20:08 発言[未読]
【71601】Re:任意のアクティブセルを基点として、そ... ushineko 12/3/22(木) 15:29 質問[未読]
【71607】Re:任意のアクティブセルを基点として、そ... hint 12/3/22(木) 23:18 発言[未読]
【71642】Re:任意のアクティブセルを基点として、そ... ushineko 12/3/23(金) 19:31 質問[未読]
【71645】Re:任意のアクティブセルを基点として、そ... hint 12/3/23(金) 23:37 発言[未読]
【71670】Re:任意のアクティブセルを基点として、そ... ushineko 12/3/26(月) 17:37 お礼[未読]
【71580】Re:任意のアクティブセルを基点として、そ... 12/3/20(火) 14:00 回答[未読]
【71590】Re:任意のアクティブセルを基点として、そ... ushineko 12/3/21(水) 15:17 お礼[未読]

【71573】任意のアクティブセルを基点として、その...
質問  ushineko E-MAIL  - 12/3/19(月) 17:54 -

引用なし
パスワード
   任意のセルを選択し、アクティブとなっているそのセルの下に2行挿入するには、
どのような設定をすればよいか、教えていただきたく、宜しくお願いします。

任意のセルをmy rangeにセットしたあとその関係で行を挿入する、あるいは、任意のセルをダブルクリックすることで、そのセルを特定し、その関係性で下の行を挿入するなど考えたのですが、初心者なので、その書き方がわからず途方にくれていおります。

どなたか、アドバイスをよろしくお願いします。

【71574】Re:任意のアクティブセルを基点として、...
発言  hint  - 12/3/19(月) 21:52 -

引用なし
パスワード
   マクロ記録はこうしたものが得られます。
  Rows("3:4").Select
  Selection.Insert Shift:=xlDown
それでこれを利用して、例えば、
Sub Macro1()
  ActiveCell.Offset(1).Resize(2, 1).EntireRow.Insert Shift:=xlDown
End Sub
なんていうのはどうですか?

ダブルクリックで起動させるなら、イベントプロシージャの書き方を
調べて、ActiveCellをTargetに書き換えればいいと思います。

【71580】Re:任意のアクティブセルを基点として、...
回答    - 12/3/20(火) 14:00 -

引用なし
パスワード
   こんにちは。

マクロの記録でたとえばこんなコードが得られます。
Sub Macro1()
  ActiveCell.Offset(1, 0).Range("A1:A2").Select
  Selection.EntireRow.Insert
  ActiveCell.Offset(-1, 0).Range("A1").Select
End Sub

これを改良します。
まず1行目と2行目を1本に繋いで。すると3行目は不要になるので消して。
  ActiveCell.Offset(1, 0).Range("A1:A2").EntireRow.Insert
こんなのとか。

ほんとうはRange("A1:A2")の部分も何とかしたいところですが、、、、

【71589】Re:任意のアクティブセルを基点として、...
質問  ushineko E-MAIL  - 12/3/21(水) 15:15 -

引用なし
パスワード
   ▼hint さん:

ありがとうございした。
おかげさまで、2行挿入されて、当初の目的達成です。

ただ、更に欲張って教えていただきたことがございます。
その挿入された2行に対して、当初の任意のactivecellからみて、隣のセルの文字をその挿入された行内のセルにコピーをしたくて、下記のように作ったのですが、どうしてもエラーが出てしまいます。

Worksheets("P3").Activate
  MsgBox ActiveCell.Value
  
  ActiveCell.Offset(1).Resize(2, 1).EntireRow.Insert shift:=xlDown
  ActiveCell.Offset(0, -1).Select
  Selection.Copy
  ActiveCell.Offset(1, -1).seclect
  ActiveSheet.Paste

Selection.copy した後に、pasteすべきcellの示し方がわかりません。`
お手数ですが、宜しくお願いします。

【71590】Re:任意のアクティブセルを基点として、...
お礼  ushineko E-MAIL  - 12/3/21(水) 15:17 -

引用なし
パスワード
   ▼佳 さん:
ご親切に、ありがとうございました。
昨日会社休業であったために、返信遅くなりまして、申し訳ございません。
また、何かありましたら宜しくお願いします。

【71595】Re:任意のアクティブセルを基点として、...
発言  hint  - 12/3/21(水) 20:08 -

引用なし
パスワード
   ▼ushineko さん:
>▼hint さん:
> どうしてもエラーが出てしまいます。
どの行でどのようなエラーですか?

こんな感じで書いてはどうでしょうか。
Sub test()
  Dim myRange As Range
  Set myRange = ActiveCell
  
  myRange.Offset(1).Resize(2, 1).EntireRow.Insert shift:=xlDown
  myRange.Offset(0, -1).Copy myRange.Offset(1, -2)
End Sub

ポイントは二つあるように思います。

(1)逐一、Selectしないこと。
  Selectだと、一つ一つ、現在位置を追っていかないといけない。
  最初のアクティブセルを変数に持って、
  これを基準にした位置でセルを指定すれば、少し明確になります。

(2)コピーペイストなら、普通はワンセンテンスで書きます。
   コピーセル.Copy ペイスト先セル
 という構文です。
  このほうが、意図が明確に簡潔に示せます。

【71601】Re:任意のアクティブセルを基点として、...
質問  ushineko E-MAIL  - 12/3/22(木) 15:29 -

引用なし
パスワード
   ▼hint さん:
ありがとうございました。うまくいきました。
お陰様で、すっきりしたステートメントになりました。

小出しで申し訳ないのですが、もう少しお付き合い願えないでしょうか?
ここから先、別のシートに行ってデータを抽出し、また、元のシートへ戻り、挿入した2行の指定の箇所にコピーをする作業をしたいのですが、何もコピーがされないまま終わってしまいます。
現在のステートメントは以下の通りですが、myrange1へ、データを格納したつもりなのですが、それが指定先に反映できないのは、コピーすべき指定先の示し方に問題があるのでしょうか?

Dim myMsg As String
Dim mytitle As String
Dim mycargo As String
Dim myrange As Range
Dim myrange1 As Range

  Worksheets("P3").Activate
  MsgBox ActiveCell.Value
  
  Set myrange = ActiveCell
     
  'Active cell下に2行挿入
  myrange.Offset(1).Resize(2, 1).EntireRow.Insert shift:=xlDown
  
   '挿入された2行に、元のデータcopy (vessel name)
  myrange.Offset(0, -1).Copy myrange.Offset(1, -1)
  myrange.Offset(0, -1).Copy myrange.Offset(2, -1)
  
   '挿入された2行に、元のデータcopy (Port of Discharge)
  myrange.Offset(0, 4).Copy myrange.Offset(1, 4)
  myrange.Offset(0, 4).Copy myrange.Offset(2, 4)
    
   '挿入された2行に、元のデータcopy (Port of Loading)
  myrange.Offset(0, 5).Copy myrange.Offset(1, 5)
  myrange.Offset(0, 5).Copy myrange.Offset(2, 5)
  
   '挿入された2行に、元のデータcopy (QTY)
  myrange.Offset(0, 7).Copy myrange.Offset(1, 7)
  myrange.Offset(0, 7).Copy myrange.Offset(2, 7)
  
  'CARGO DATAシートのCARGO MODELを選ぶ

  Sheets("CARGO DATA").Select
  Worksheets("CARGO DATA").Range("B1").Select
  Selection.AutoFilter

  myMsg = "CARGO MODELを選んで下さい。"
  mytitle = "MODEL"
  mycargo = Application.InputBox(prompt:=myMsg, Title:=mytitle, Type:=2)
  
  On Error Resume Next
  
  Selection.AutoFilter Field:=1, Criteria1:=mycargo
 
  Sheets("CARGO DATA").Select
  Range("B1").Select
    
  Set myrange1 = Range("B2:E2" & [E65536].End(xlUp).Row).SpecialCells(xlCellTypeVisible)
  
  Sheets("CARGO DATA").Select
  Selection.AutoFilter
  Range("F1").Select
  
  'P3シートに抽出したデータをペースト
  
  Sheets("P3").Select
  
  myrange1.Copy Destination:=Worksheets("P3").myrange.Offset(1)
  Range("A1").Select

何度もお手数ですが、どうか宜しくお願いします。

  

【71607】Re:任意のアクティブセルを基点として、...
発言  hint  - 12/3/22(木) 23:18 -

引用なし
パスワード
   > myrange1.Copy Destination:=Worksheets("P3").myrange.Offset(1)
がおかしいんじゃないですか?
myrange1.Copy Destination:=myrange.Offset(1)
では?

変数myrangeは、既にどのシートのRangeかという情報は持っているので、
シート指定は不要ですし、それは認められない書き方です。
つまりシートのプロパティとして不適格ということです。

なお、不用意に
 On Error Resume Next
を使うのは御法度です。
エラーが発生していても、それを隠してしまうのです。

【71642】Re:任意のアクティブセルを基点として、...
質問  ushineko E-MAIL  - 12/3/23(金) 19:31 -

引用なし
パスワード
   ▼hint さん:
本当にいろいろありがとうございます。
ご指摘の通りにしたら、ともかくコピー出来ました。

ところが、myrange1への格納の仕方に問題があるようで、貼り付いたセルから下のデータが全て消えてしまうのです。(空白が張り付いて形?)
解決方法として、格納の内容は変更せず、一旦、コピー先のシートの一番下の行にmyrange1の内容をコピーし、その上で、そのB:E2行分を切り取って、myrange = ActiveCellの下のセルへまとめてpasteをしようと思うのです。
シートの一番下の行にコピーされるところまではいくのですが、その後、コピーされたB:E2行分を範囲指定する方法がわからないのです。

苦し紛れに、下のような書き方をしましたが、当然エラーになってしまいます。

Sheets("CARGO DATA").Select
Set myrange1 = Range("B2:E2" & [E65536].End(xlUp).Row).SpecialCells(xlCellTypeVisible)

Sheets("P3").Select
  Range("B65536").End(xlUp).Offset(1).Select
  myrange1.Copy Destination:=Worksheets("P3").Range("B65536").End(xlUp).Offset(1)

  Range("B65536").End(xlUp).Offset (-2): Range("E65536").End(xlUp).Select
  Selection.Cut
  myrange.Offset(1).Select
  ActiveSheet.Paste
 
度々お手数ですが、宜しくお願いします。

【71645】Re:任意のアクティブセルを基点として、...
発言  hint  - 12/3/23(金) 23:37 -

引用なし
パスワード
   ▼ushineko さん:
>シートの一番下の行にコピーされるところまではいくのですが、その後、コピーされたB:E2行分を範囲指定する方法がわからないのです。

B:E2行分 の意味が私にはよくわかりません。
> Set myrange1 = Range("B2:E2" & [E65536].End(xlUp).Row).SpecialCells(xlCellTypeVisible)
はどういうことを意図しているのですか?
[E65536].End(xlUp).Rowが100だとすると
Range("B2:E2" & [E65536].End(xlUp).Row)は
Range("B2:E2100")となるわけですが、これは意図したものですか?
意図がわからないので、どう書いたら良いかもわかりません。
すみません。

【71670】Re:任意のアクティブセルを基点として、...
お礼  ushineko E-MAIL  - 12/3/26(月) 17:37 -

引用なし
パスワード
   ▼hint さん:
説明が分かりにくくて申し訳ございません。
これまで貴重なアドバイスをいただいたお陰で、一人ではとても無理と思われる作業も何とか可能となりました。
全てhintさんのお陰です。
とりあえず、素人のやり方ですが、最後はセルに一つずつ入れてく方法で解決することとしました。

Range("B65536").End(xlUp).Select
  Selection.Cut
  myrange.Offset(2#).Select
  ActiveSheet.Paste
  
  Range("B65536").End(xlUp).Select
  Selection.Cut
  myrange.Offset(1#).Select
  ActiveSheet.Paste
  
  Range("C65536").End(xlUp).Select
  Selection.Cut
  myrange.Offset(2, 1).Select
  ActiveSheet.Paste
  
  Range("C65536").End(xlUp).Select
  Selection.Cut
  myrange.Offset(1, 1).Select
  ActiveSheet.Paste

長期に渡って、いろいろお付き合いいただきまして、ありがとうございました。
本当に感謝しております。

1828 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free