Excel VBA質問箱 IV

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

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


10577 / 76734 ←次へ | 前へ→

【71703】Re:以前に…
発言  UO3  - 12/3/31(土) 15:33 -

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

こんにちは

手打ちタイプのミスだということは了解しました。

さて仕切り直して。

マクロを実行するには、様々な方法があります。
で、acecさんがやろうとしておられるのは、シートにフォームツールのボタンを配置して
そこにマクロを登録して、クリックしたときに実行させたいということですよね。

一方、Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

といったものは、まず記述の場所が、通常のマクロを記述する「標準モジュール」ではなく、
シートモジュールという特殊なところです。で、その動きも特殊で、マクロを実行するのではなく
シート上で、指定した動きがあったときに、自動的に実行されます。
BeforeDoubleClick は、シート上の任意のセルをダブルクリックした時に、自動的に動きます。
で、アップされたコードでやっているのは、ダブルクリックされたセルの行のA列〜C列の値を
見積シートのD1:F1に転記します。たとえばクリックされたセルが10行目なら、A10:C10の値を転記します。

再度アップされたコードがシートモジュール書かれていれば、エラーなく、目的が実行されるはずです。
もし、エラーになるということであれば、エラーで止まった時に黄色く光っているコードがどこなのか
そのときにどんなメッセージが出たかを教えてください。

で、もし、そうじゃなく、ボタンに登録して、クリックして動かしたいんだということであれば
まず、コードは「標準モジュール」に書きます。ただし、その形が
Sub Micro3()
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Cancel = True
Sheets("見積").Range("D1:F1").Value = Target.EntireRow.Range("A1:C1").Value
End Sub
End Sub
だったとしますと、具合が悪いですね。これだと「デバッグ」以前に、コンパイルエラーで
コンパイラーから「しかられます」

Sub から始まる1つのマクロは、必要なコードをかい多後、End Sub で終わる必要があります。
↑のコードだと、Sub Micro3() に対して、End Sub が出てくる前に、Subから始まる別のマクロ
Private Sub Worksheet_BeforeDoubleClickが記述されていますので、
Sub Micro3()にたいするEnd SUbがないよということになります。

もし、acecさんのやろうとしておられることが
・あるセルを選択する。
・その状態でボタンをクリックする。
・クリックされたら選択されている行のA列〜C列の値を見積シートのD1:F1に転記させたい。
こういうことであれば、

Sub Sample()
  Sheets("見積").Range("D1:F1").Value = ActiveCell.EntireRow.Range("A1:C1").Value
End Sub

これを「標準モジュール」に記述して、ボタンに登録してください。

さて、

>それから、素人考えなのですが、
>Sheets("見積").Range("D1:F1").Value = Target.EntireRow.Range("A1:C1").Value
>だと、常にA1:C1のデータが取得されませんか?

確かにこの書き方は、「ちょっとマニアック?」です。
通常、A1といえば、シートの一番左上のA1という場所だと認識しています。
本来は、ある領域.Range("A1") というのが正しい書き方で、これは、ある領域の左上隅から数えて
最初の列、最初の行という意味なんです。単純に Range("A1") と書きますと
標準モジュールで言えば、アクティブシートのセル全体.Range("A1") という意味になります。
だから、いわゆる A1 を指すことになります。
で、上のケースでは、ある領域というのが、Target.EntireRow つまり、それが10行目だとしたら
10行目のセルが属する、その行全体 ということです。つまり10行目全体ですね。
その10行目全体の、A1 というと、A10 のことですし、C1 というと C10 のことになります。
(Aはその領域の1番目の列、Cは、その領域の3番目の列、1 はその領域の1番目の行)

15 hits

【71696】以前に… acec 12/3/31(土) 8:24 質問
【71698】Re:以前に… UO3 12/3/31(土) 8:43 回答
【71701】Re:以前に… acec 12/3/31(土) 11:30 質問
【71703】Re:以前に… UO3 12/3/31(土) 15:33 発言
【71763】Re:以前に… acec 12/4/6(金) 16:20 お礼

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