Excel VBA質問箱 IV

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

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


6533 / 13646 ツリー ←次へ | 前へ→

【44689】クリックしてコピー 悩みすぎ 06/11/29(水) 0:11 質問[未読]
【44690】Re:クリックしてコピー Kein 06/11/29(水) 0:55 回答[未読]
【44691】Re:クリックしてコピー Kein 06/11/29(水) 1:00 発言[未読]
【44692】Re:クリックしてコピー Kein 06/11/29(水) 1:12 発言[未読]
【44695】Re:クリックしてコピー 悩みすぎ 06/11/29(水) 11:38 質問[未読]
【44703】Re:クリックしてコピー Kein 06/11/29(水) 14:41 回答[未読]
【44704】Re:クリックしてコピー 悩みすぎ 06/11/29(水) 15:29 質問[未読]
【44711】Re:クリックしてコピー Kein 06/11/29(水) 17:29 発言[未読]
【44716】Re:クリックしてコピー 悩みすぎ 06/11/29(水) 18:52 お礼[未読]

【44689】クリックしてコピー
質問  悩みすぎ  - 06/11/29(水) 0:11 -

引用なし
パスワード
   どなたか、教えてください。

色々なセルをクリックする度にクリックしたセルの内容を
指定したセルを基点に横のセルへとコピーしていけませんか?

記録の開始と停止をマクロボタンで制御し
マクロボタン表示は「記録中」と「停止中」としたいです。

【44690】Re:クリックしてコピー
回答  Kein  - 06/11/29(水) 0:55 -

引用なし
パスワード
   例えばこんな感じで、どうでしょーか ?
ボタンを押す代わりに、右クリックイベントで 200列以内 の任意のセルを
右クリックしたとき、記録と停止を問い合わせてから切り替えます。
転記はダブルクリックにて行います(シングルクリックイベントが無いので)。
状態の表示には、ステータスバーを使います。
以下の全てのコードをシートモジュールの先頭から入れて、いったん他の
シートを開いてから戻って下さい。初めに「待機中」と表示します。

Private MyR As Range

Private Sub Worksheet_Activate()
  Set MyR = Nothing
  With Application
   .DisplayStatusBar = True
   .StatusBar = "●●● 待機中 ●●●"
  End With
End Sub

Private Sub Worksheet_Deactivate()
  With Application
   .StatusBar = False
   .DisplayStatusBar = False
  End With
End Sub

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, _
Cancel As Boolean)
  Dim Cnt As Integer
 
  If MyR Is Nothing Then Exit Sub
  Cnt = WorksheetFunction.CountA(MyR)
  If Cnt = MyR.Count Then
   MsgBox "これ以上、値の転記をすることはできません", 48
   Exit Sub
  End If
  Cancel = True
  MyR.Cells(Cnt + 1).Value = Target.Value
End Sub

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, _
Cancel As Boolean)
  With Target
   If .Cells(1).Column > 200 Then Exit Sub
   Cancel = True
   If MyR Is Nothing Then
     If MsgBox(.Address(0, 0) & " を基点にしますか", 36) = 6 Then
      Set MyR = Range(.Cells(1), Cells(.Row, 256))
      Application.StatusBar = "☆☆☆ 記録中 ☆☆☆"
     End If
   Else
     If MsgBox("記録を終了しますか", 36) = 6 Then
      Set MyR = Nothing
      Application.StatusBar = "★★★ 停止中 ★★★"
     End If
   End If
  End With
End Sub

【44691】Re:クリックしてコピー
発言  Kein  - 06/11/29(水) 1:00 -

引用なし
パスワード
   ダブルクリックイベントのコードに追加します。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, _
Cancel As Boolean)
  Dim Cnt As Integer
 
  If MyR Is Nothing Then Exit Sub
  If Not Intersect(Target, MyR) Is Nothing Then Exit Sub '←追加
  Cnt = WorksheetFunction.CountA(MyR)
  If Cnt = MyR.Count Then
   MsgBox "これ以上、値の転記をすることはできません", 48
   Exit Sub
  End If
  Cancel = True
  MyR.Cells(Cnt + 1).Value = Target.Value
End Sub

つまり転記先になるセル範囲をダブルクリックするのを、無効にするわけです。

【44692】Re:クリックしてコピー
発言  Kein  - 06/11/29(水) 1:12 -

引用なし
パスワード
   ちょっと説明を補足しておきます。
>200列以内 の任意のセルを右クリックしたとき
そのセル(複数セル範囲を選択していたらアクティブセル)を基点にする。
という意味です。つまり基点にしたいセルを右クリックすればよいのです。
転記を停止するときは、200列以内ならどのセルを右クリックしてもオッケーです。

【44695】Re:クリックしてコピー
質問  悩みすぎ  - 06/11/29(水) 11:38 -

引用なし
パスワード
   Keinさんへ

こんにちは、ありがとうございます!

クリックイベント(右とダブル)は他に使っていたので
ここで使うのは、ちょっと辛いのですが思った事はできました。
(右クリックイベントだけでもボタンにできませんか・・・ごめんなさい)


記録を終了し、再開する場合に記録された行の途中を基点に
したら、行の最後から記録を始めるのですね。

途中からでも上書き記録できるようにしたいです。

PS:ステータスバーに状態表示が出るのはカッコいいですね!

【44703】Re:クリックしてコピー
回答  Kein  - 06/11/29(水) 14:41 -

引用なし
パスワード
   右クリックイベントは、コマンドボタンのクリックイベントに変更しました。
コントロールツールボックスのボタンをシート上に配置して、
シートモジュールの現在のコード全体を、以下のコードに差し替えて下さい。
そしていったん他のシートを開いてから、戻って下さい。
今度はボタンを押す前に、基点にしたいセルを一つ選択して下さい。
つまりアクティブセルを基点にする、ということになります。
>記録を終了し、再開する場合に記録された行の途中を基点に
>したら、行の最後から記録を始める
IV列から逆順に転記される、という意味ですか ? こちらではそのような
ことにはなりませんが・・。
>ステータスバーに状態表示が出るのはカッコいい
ボタンの表面の文字列も同じように変化するようにしたので、ステータスバー
は不要かも知れませんが、いちおう残しておきました。

Private MyR As Range

Private Sub Worksheet_Activate()
  Me.CommandButton1.Caption = "待機中"
  With Application
   .DisplayStatusBar = True
   .StatusBar = "●○● 待機中 ○●○"
  End With
End Sub

Private Sub Worksheet_Deactivate()
  Set MyR = Nothing
  With Application
   .StatusBar = False
   .DisplayStatusBar = False
  End With
End Sub

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, _
Cancel As Boolean)
  Dim Cnt As Integer
 
  If MyR Is Nothing Then Exit Sub
  Cnt = WorksheetFunction.CountA(MyR)
  If Cnt = MyR.Count Then
   MsgBox "これ以上、値の転記をすることはできません", 48
   Exit Sub
  End If
  Cancel = True
  MyR.Cells(Cnt + 1).Value = Target.Cells(1).Value
End Sub

Private Sub CommandButton1_Click()
  With ActiveCell
   If .Column > 200 Then Exit Sub
   If MyR Is Nothing Then
     If MsgBox(.Address(0, 0) & " を基点にしますか", 36) = 6 Then
      Set MyR = Range(.Cells(1), Cells(.Row, 256))
      CommandButton1.Caption = "記録中"
      Application.StatusBar = "☆☆☆ 記録中 ☆☆☆"
     End If
   Else
     If MsgBox("記録を終了しますか", 36) = 6 Then
      Set MyR = Nothing
      CommandButton1.Caption = "停止中"
      Application.StatusBar = "★★★ 停止中 ★★★"
     End If
   End If
  End With
End Sub

【44704】Re:クリックしてコピー
質問  悩みすぎ  - 06/11/29(水) 15:29 -

引用なし
パスワード
   Keinさんへ

>右クリックイベントは、コマンドボタンのクリックイベントに変更しました。
この仕様に変えて頂き、うれしいです!

>IV列から逆順に転記される、という意味ですか ? こちらではそのような

逆順にはなっていません。
基点を例えばA30にして、J30まで記録したとします。
一旦終了して、次にC30を基点にしてもK30から記録しはじめます。

それと、基点をA40にして記録するとして、行の途中の例えばG40に
文字が入っているとG40は上書き記録されて、以降はG40セルに記録し
続けてる状態になります。

文字が入っていても、いなくても基点を決めたら、そこからどんどん
記録していければいいと思っています。

>ボタンの表面の文字列も同じように変化するようにしたので、ステータスバー
こんなことできるんですね・・・クールです!

【44711】Re:クリックしてコピー
発言  Kein  - 06/11/29(水) 17:29 -

引用なし
パスワード
   あぁ・・状況が分かりました。
>文字が入っていても、いなくても基点を決めたら、そこからどんどん記録
なら、いったん基点から右端までのセル範囲をクリアすることで解決すると
思います。CommandButton1_Clickのコードで

>Set MyR = Range(.Cells(1), Cells(.Row, 256))

の下に

MyR.ClearContents

を追加して下さい。
あと、念のために Worksheet_Activate のコードの冒頭にも

Set MyR = Nothing

を追加しておいて下さい。

【44716】Re:クリックしてコピー
お礼  悩みすぎ  - 06/11/29(水) 18:52 -

引用なし
パスワード
   Kein さんへ

とても上手くいきました!
長々とお付き合い頂き、本当にありがとうございました。

これを元に考えていたゲームが作れそうです。感謝いたします。

>>文字が入っていても、いなくても基点を決めたら、そこからどんどん記録
>なら、いったん基点から右端までのセル範囲をクリアすることで解決すると

基点から右端のセル範囲を全てクリアするのでなく、残しておいて
ダブルクリックした回数だけ上書きで記録できれば良かったのですが・・・汗

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