Excel VBA質問箱 IV

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

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


8353 / 13644 ツリー ←次へ | 前へ→

【33807】二つのセル Gロボ 06/1/21(土) 6:09 質問[未読]
【33809】Re:二つのセル inoue 06/1/21(土) 8:42 発言[未読]
【33811】Re:二つのセル ichinose 06/1/21(土) 9:42 発言[未読]
【33813】Re:二つのセル bykin 06/1/21(土) 14:45 回答[未読]
【33820】Re:二つのセル ichinose 06/1/21(土) 16:03 お礼[未読]
【33826】Re:二つのセル Gロボ 06/1/21(土) 18:06 質問[未読]
【33828】Re:二つのセル [名前なし] 06/1/21(土) 18:52 発言[未読]
【33835】Re:二つのセル Gロボ 06/1/21(土) 22:21 お礼[未読]

【33807】二つのセル
質問  Gロボ  - 06/1/21(土) 6:09 -

引用なし
パスワード
   二つのセルがあったとします。
最初にA1のせるに馬鹿と入っていたとします。
次にアホという情報をA1に入れたとき、
馬鹿という情報を下のA2に移動させたいのですが?
どうしたらいいでしょうか?
そしてアホが入ったセルにマヌケという情報がはいってきた
ときアホの情報はA2にまた移動して、馬鹿のセルの情報を
消去するにはどうしたらいいのでしょうか?

【33809】Re:二つのセル
発言  inoue E-MAILWEB  - 06/1/21(土) 8:42 -

引用なし
パスワード
   その例であるとして、以下をシートモジュールに書くと良いと思います。
単にChangeイベントだけでは以前の値の参照はできません。
Option Explicit
Const cnsTarget = "$A$1"
Dim strA1_Range As String

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> cnsTarget Then Exit Sub
Target.Offset(, 1).Value = strA1_Range
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address <> cnsTarget Then Exit Sub
strA1_Range = Target.Value
End Sub

【33811】Re:二つのセル
発言  ichinose  - 06/1/21(土) 9:42 -

引用なし
パスワード
   Gロボさん、inoue さん、おはようございます。

考え方としては、どこかにセルA1のコピーを常に持っていると
この処理はできます。
では、そのコピーをどこに持つか? ですが、

・別のシートの同じアドレスを持つセル
 これが確実なんですが、この処理のためにテンポラリシートを
 用意しなければなりません。

・Excel2000以上ですが、IDというプロパティを使用する。
 本来のIDプロパティの使用方法とは違いますが、
 領域がリザーブされているので使えそうです。
 

当該シートのモジュールに
'=======================================================
Sub init_id()
  With Range("a1")
    .ID = .Value
    End With
End Sub
'=======================================================
Private Sub Worksheet_Change(ByVal Target As Range)
  Application.EnableEvents = False
  If Not Application.Intersect(Target, Range("a1")) Is Nothing Then
    With Range("a1")
     .Offset(1, 0).Value = .ID
     .ID = .Value
     End With
    End If
  Application.EnableEvents = True
End Sub


最初に一度だけ、init_id を実行してから試してみて下さい。

但し、このIDプロパティは、ブックを保存しても
このプロパティは再度開いたときは、初期化されています。

よって、開く度に一度、init_idを実行して
データを同期させなくてはなりません。
通常は、Workbook_Openイベント等で実行することになります。

確認してみて下さい。

【33813】Re:二つのセル
回答  bykin  - 06/1/21(土) 14:45 -

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

>単にChangeイベントだけでは以前の値の参照はできません。

>どこかにセルA1のコピーを常に持っているとこの処理はできます。

ChangeイベントだけでもUndo使えばできまっせ。

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim PrevValue As Variant
  Dim NewValue As Variant
  Dim NextCell As String
  
  If Target.Address = "$A$1" Then
    NewValue = Target.Value
    NextCell = ActiveCell.Address
    Application.EnableEvents = False
    Application.Undo
    PrevValue = Target.Value
    Target.Value = NewValue
    Range("A2").Value = PrevValue
    Range(NextCell).Activate
    Application.EnableEvents = True
  End If
End Sub

試してみてな。
ほな。

【33820】Re:二つのセル
お礼  ichinose  - 06/1/21(土) 16:03 -

引用なし
パスワード
   ▼bykin さん:
こんにちは。

>
>
>ChangeイベントだけでもUndo使えばできまっせ。
Undoは気が付きませんでした。メモメモ。
ありがとうございます。

【33826】Re:二つのセル
質問  Gロボ  - 06/1/21(土) 18:06 -

引用なし
パスワード
   おしえてもらってありがたいのですが、
チェンジだとマクロで書き込んだ情報には反応しないので
使えないです。
それとA1からA2に下記かなおすにはinoueのはどうしたらいいのでしょうか
一応はりつけただけですがundoの奴は
動作しませんでした。

【33828】Re:二つのセル
発言  [名前なし]  - 06/1/21(土) 18:52 -

引用なし
パスワード
   ▼Gロボ さん:
>チェンジだとマクロで書き込んだ情報には反応しないので
>使えないです。
マクロで書き込んでるなら、A1セルに書き込む前に

Range("A2").Value = Range("A1").Value

の1行を追加すればいい話です。

【33835】Re:二つのセル
お礼  Gロボ  - 06/1/21(土) 22:21 -

引用なし
パスワード
   意外と簡単な方法で
解決しました。答えてくださった皆さんありがとうございました。
Sub 数字代入()

If Range("A1") = "" Then
Range("A1") = "58"
ElseIf Range("A1") <> "" Then
Range("A2") = Range("A1")
Range("A1") = "58"
End If
End Sub

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