Excel VBA質問箱 IV

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

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


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

【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 お礼[未読]

【71696】以前に…
質問  acec  - 12/3/31(土) 8:24 -

引用なし
パスワード
   見積Sheetsに「取得」というボタンを作成して、実行すると

同じファイルの中のDatabase Sheetsが表示され、

たとえばですが

2行目(任意)をダブルクリックしたら、その行のD1、E1、F1を

見積Sheetsのそれぞれ、A1、A2、A3にデータを取得

といったようにしたいのですが、


以前、質問させていただいたとき、

Private Sub Worksheet_BeforeDoubleClick(Byval Taget As Range, Cancel As Boolean)

Cancel =true
Sheets("見積").range("D1:F1").value = target.entireRow.range(A1:C1")value

end sub

と教えていただいたのですが、デバックが出てしまいました。

前後にマクロ文が何か欲しいのでしょうか?色々試したのですが、ダメでした。

よろしければ、そこらへんも教えてもらえればうれしいです。

お願い致します。

【71698】Re:以前に…
回答  UO3  - 12/3/31(土) 8:43 -

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

実行時エラーになったということですが、アップされたコードでは、それ以前に
構文エラーになって、間違ったコードが赤く光っているはずですが?

で、実行時エラーの原因は

Private Sub Worksheet_BeforeDoubleClick(Byval Taget As Range, Cancel As Boolean)

これです。このプロシジャはシートのイベントプロシジャというもので、
その記述方法には「お約束」があります。

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

このようにしてください。
この形は、自分で入力しなくても、VBE画面の上の方に2つ並んだコンボボックスの
左側でWorkSheet、右側で、BeforeDoubleClickを選ぶと自動生成されますよ。

で、次に、構文エラーですが


Sheets("見積").range("D1:F1").value = target.entireRow.range(A1:C1")value

これは

Sheets("見積").Range("D1:F1").Value = Target.EntireRow.Range("A1:C1").Value

A1 の前にも " が必要ですし、右辺の Value の前に . が必要ですよ。

【71701】Re:以前に…
質問  acec  - 12/3/31(土) 11:30 -

引用なし
パスワード
   すみません、ネットにつながっていないPCでVBAを作っていたもので、

こちらには手入力による転記ミスです。

こちらが、コピペしたものですので実際のVBAです。


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


こちらで実行すると、マクロのボタンに登録できないのですが、どうするのでしょうか?

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


を加えれば良いのかな?と思い実行すると、

コンパイルエラー:End Subが必要です。

となります。

基本中の基本なのだとは思いますが、教えてもらえればうれしいです。

宜しくお願いします。


それから、素人考えなのですが、

Sheets("見積").Range("D1:F1").Value = Target.EntireRow.Range("A1:C1").Value

だと、常にA1:C1のデータが取得されませんか?

今日は1行目のデータ(A1:C1)が、明日は5行目(A5:C5)が欲しいと

いったような作業なのです。

左端の行の数字部分をCLICKすると、その行のA列からC列を取得する

といったようにしたいのですが、こんな都合の良いVBAはありますか?


何度もすみません、よろしくお願いします。

【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番目の行)

【71763】Re:以前に…
お礼  acec  - 12/4/6(金) 16:20 -

引用なし
パスワード
   お礼が、遅くなって申し訳ありません。


無事、見積マクロが完成しました。

本当に助かりました、ありがとうございました。

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