アプリ版:「スタンプのみでお礼する」機能のリリースについて

アクティブのシートある範囲をコピーして、追加データとしてシート2のB列の最終セルの下(空白)に値として貼り付けたいと思っています。
オートシェイプでは動くのですが、ActiveXコントロールやフォームコントロールではエラーが出ます。よろしくお願いします。

Private Sub CommandButton1_Click()
Range("C2:J2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy

Sheets("Sheets2").Select
Range("B1").Select
Selection.End(xlDown).Offset(1, 0).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
End Sub

質問者からの補足コメント

  • 回答ありがとうございます。
    >※ 元データが3行以上ある場合にマクロが実行されるようにしています。
    元データーを1行以上と変えたい場合はどこを変えればいいでしょうか
    よろしくお願いします。

    No.2の回答に寄せられた補足コメントです。 補足日時:2017/01/13 21:18

A 回答 (3件)

続けてお邪魔します。



>元データーを1行以上と変えたい場合は・・・

項目行は存在しないのでしょうか?(1行目からのデータになっている)
余計なお世話で2行目が項目行だと思って
>lastRow = .Range("C2").End(xlDown).Row
とし、C2セルから下へ見ていって最終行を取得していました。
すなわち3行目以降にデータがない場合は何もしないコードになっていました。

1行目からというコトであれば
>If lastRow > 2 And wS.Range("B1") <> "" Then
の行を
>If lastRow >=1 And wS.Range("B1") <> "" Then
に変更してください。

※ 余計なお世話かもしれませんが・・・
個人的には最終行を取得する場合、途中に空白セルが存在しない!と判っていれば
>lastRow = .Cells(Rows.Count, "C").End(xlUp).Row
のように下から上に向かってのコードを記載する方が多いです。m(_ _)m
    • good
    • 0

No.1です。



>原因は何なのでしょうか・・・
シートモジュールで別シートの操作ができない場合があります。
はっきり覚えていませんが、シートモジュールで他のシートを操作するコードを記載した場合エラーになったことが何度もありました。
その場合は標準モジュールにマクロコードを記載し、シートモジュールでそのマクロを呼び出せば
改善されることがほとんどだったので経験上前回のような回答をしました。

おそらくですが、
フォームコントロールやActiveXコントロールはシートモジュールと同じ状態になるのでは?
※ あくまで当方の個人的見解です。

参考になるかどうかわかりませんが、↓のサイトを覗いてみてください。

http://excel-ubara.com/excelvba4/EXCEL251.html

http://vbae.odyssey-com.co.jp/column/no15_1.html

この程度でごめんなさい。m(_ _)m
この回答への補足あり
    • good
    • 0

こんばんは!



操作したいコードを「標準モジュール」に記載し、コマンドボタンをクリックでそのマクロを呼び出せば大丈夫だと思います。

まず標準モジュールに↓のコードを記載しておきます。

Sub Sample1()
Dim lastRow As Long, myRng As Range, wS As Worksheet
Set wS = Worksheets("Sheet2") '←「Sheet2」は実際のシート名に!//
With Worksheets("Sheet1") '←フォームコントロールまたはActiveXコントロールが挿入されているシート名//
lastRow = .Range("C2").End(xlDown).Row
If lastRow > 2 And wS.Range("B1") <> "" Then '←Sheet2のB1セルが空白の場合、エラーになる・・・//
Set myRng = Range(.Cells(2, "C"), .Cells(lastRow, "J"))
myRng.Copy
wS.Range("B1").End(xlDown).Offset(1).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
wS.Activate
wS.Range("B1").Select
End If
End With
End Sub

そしてコマンドボタンのコードを

Private Sub CommandButton1_Click()
Call Sample1
End Sub

としてみてください。

※ 標準モジュールのコード内のシート名は実情に合わせてください。
※ 元データが3行以上ある場合にマクロが実行されるようにしています。

尚、Sheet2のB1セルが空白の場合、エラーになると思いますので、
敢えてB1セルが空白以外の場合・・・という条件を付け加えています。m(_ _)m
    • good
    • 0
この回答へのお礼

ありがとうございます。
原因は何なのでしょうか。

お礼日時:2017/01/13 17:01

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