[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『指定範囲2箇所のダブリチェック』(toppo)
選択したセル範囲の値だけを指定セルに移動する物です。(書式を除く) ここで教えて頂いた物に少し手を加えました。(移動先のセルが結合されていた時の処理)教えて頂きたいのは、移動元と、移動先のセル範囲がダブっていた時には中止したいのです。下のコードではダブっていても元の領域を全て消去します。
Sub 値移動()
Dim r As Range
On Error Resume Next
If Selection.Areas.Count > 1 Then
MsgBox "複数の島選択は出来ません。"
Else
Set r = Application.InputBox("移動先", Type:=8)
On Error GoTo 0
If r Is Nothing Then Exit Sub
If r.Cells(1).Cells.MergeCells = True Then
If MsgBox("指定セルは結合されています。" & vbCrLf & _
"結合解除して移動して良いですか?", vbQuestion + vbOKCancel + vbDefaultButton2, "確認") = vbCancel Then
Set r = Nothing
Exit Sub
End If
r.Cells(1).Cells.MergeCells = False '結合解除
End If
With Selection
r.Cells(1).Resize(.Rows.Count, .Columns.Count).Formula = .Formula
.ClearContents
End With
Set r = Nothing
End If
End Sub
選択範囲 :Selection 移動先範囲:r.Resize(Selection.Rows.Count,Selection.Columns.Count)
ですよね?
比較はApplication.Intersectで重なる範囲のオブジェクトがあるかないかで チェックできます。
(momo)
ごちゃ混ぜにしていませんか?
Sub 値移動()
Dim r As Range, c As range
On Error Resume Next
Set r = Application.InputBox("移動先", Type:=8)
On Error GoTo 0
If r Is Nothing Then Exit Sub
If Not Intersect(r, Selection.Cells) Is Nothing Then
Set r = Nothing
Exit Sub
End If
With Selection
For Each c In r.Cells(1).Resize(.Rows.Count, .Columns.Count)
If c.MergeCells Then
If vbYes <> MsgBox("結合を解除して続行", vbYesNo) Then
Set r = Nothing
Exit Sub
Else
r.Resize(.Rows.Count, .Columns.Count).UnMerge
Exit For
End If
End If
Next
r.Cells(1).Resize(.Rows.Count, .Columns.Count).Formula = .Formula
.ClearContents
End With
Set r = Nothing
End Sub
(seiya)
>seiyaさん それだと
Sub 値移動()
With Range("D5:F7") 'テスト用
.Value = "TEST"
.Select
End With 'テスト用 ここまで
'On Error Resume Next
'Set r = Application.InputBox("移動先", Type:=8)
'On Error GoTo 0
Set r = Range("C4") 'テスト用
If r Is Nothing Then Exit Sub
〜〜〜以下省略〜〜〜
の時などに消えてしまいませんか? >移動先範囲:r.Resize(Selection.Rows.Count,Selection.Columns.Count) と比較した方が良いと思うのですが・・・
それか値を変数に持って、ClearContentsしてからValueに入れるとか (momo)
> の時などに消えてしまいませんか? 意味が解からないのですが?
何が消えるのでしょう? (seiya)
Sub 値移動()
Dim r As Range, c As Range
On Error Resume Next
Set r = Application.InputBox("移動先", Type:=8)
On Error GoTo 0
If r Is Nothing Then Exit Sub
If Not Intersect(r, Selection.Cells) Is Nothing Then
Set r = Nothing
Exit Sub
End If
If Not Intersect(Selection.Cells, r.Cells(1).Resize(Selection.Rows.Count, Selection.Columns.Count)) Is Nothing Then
MsgBox "元と先でセルが重なっているので中止!"
Exit Sub
End If
With Selection
For Each c In r.Cells(1).Resize(.Rows.Count, .Columns.Count)
If c.MergeCells Then
If vbYes <> MsgBox("結合を解除して続行", vbYesNo) Then
Set r = Nothing
Exit Sub
Else
r.Resize(.Rows.Count, .Columns.Count).UnMerge
Exit For
End If
End If
Next
r.Cells(1).Resize(.Rows.Count, .Columns.Count).Formula = .Formula
.ClearContents
End With
Set r = Nothing
End Sub
(toppo)
衝突 あーーー 意味が解りました。
Sub 値移動()
Dim r As Range, c As Range
On Error Resume Next
Set r = Application.InputBox("移動先", Type:=8)
On Error GoTo 0
If r Is Nothing Then Exit Sub
With Selection
If Not Intersect(r.Resize(.Rows.Count, .Columns.Count), .Cells) Is Nothing Then
Set r = Nothing
MsgBox "範囲が重複", vbCritical
Exit Sub
End If
For Each c In r.Cells(1).Resize(.Rows.Count, .Columns.Count)
If c.MergeCells Then
If vbYes <> MsgBox("結合を解除して続行", vbYesNo) Then
Set r = Nothing
Exit Sub
Else
r.Resize(.Rows.Count, .Columns.Count).UnMerge
Exit For
End If
End If
Next
r.Cells(1).Resize(.Rows.Count, .Columns.Count).Formula = .Formula
.ClearContents
End With
Set r = Nothing
End Sub
(seiya)
>何が消えるのでしょう? 移動先が、必ず範囲なら良いですが、 左上の単セルを指定した場合にはResizeしないと Selectionの範囲と移動先の範囲が重なっている時に 移動先.Formula=Selection.Fomula の後にSelection.Clearcontentsしているのでセルの内容は消えますよね? toppoさんの質問はそういう内容だと私は認識していたものですから。
と、書いている間に衝突〜 ご理解頂けたようで・・・失礼しました。 (momo)
またまた衝突
それだったらこれ?
Sub 値移動()
Dim r As Range, c As Range, temp
On Error Resume Next
Set r = Application.InputBox("移動先", Type:=8)
On Error GoTo 0
If r Is Nothing Then Exit Sub
With Selection
If Not Intersect(r.Resize(.Rows.Count, .Columns.Count), .Cells) Is Nothing Then
If vbYes <> MsgBox("範囲が重複" & vbLf & "続行?", vbYesNo) Then
Set r = Nothing
Exit Sub
End If
End If
For Each c In r.Cells(1).Resize(.Rows.Count, .Columns.Count)
If c.MergeCells Then
If vbYes <> MsgBox("結合を解除して続行", vbYesNo) Then
Set r = Nothing
Exit Sub
End If
End If
Next
temp = .Formula
.ClearContents
r.Cells(1).Resize(.Rows.Count, .Columns.Count).Formula = temp
End With
Set r = Nothing
End Sub
(seiya)
seiyaさん重複時の処理大変有り難う御座います。それは最初っから出来ないだろうと 思っていた物でした。すごいです。 異なるシート間でも出来ないでしょうか。今更となるでしょうか。 これが出来れば、Excel本体の機能よりすごいと思うのですが。 すみませんが、宜しく処理お願い申し上げます。
結合解除時に以下が必要だと思います。以前ありましたので。
Else
r.Resize(.Rows.Count, .Columns.Count).UnMerge
Exit For
Sub 値移動()
Dim r As Range, c As Range, temp
On Error Resume Next
Set r = Application.InputBox("移動先", Type:=8)
On Error GoTo 0
If r Is Nothing Then Exit Sub
With Selection
If Not Intersect(r.Resize(.Rows.Count, .Columns.Count), .Cells) Is Nothing Then
If vbYes <> MsgBox("範囲が重複" & vbLf & "続行?", vbYesNo) Then
Set r = Nothing
Exit Sub
End If
End If
For Each c In r.Cells(1).Resize(.Rows.Count, .Columns.Count)
If c.MergeCells Then
If vbYes <> MsgBox("結合を解除して続行", vbYesNo) Then
Set r = Nothing
Exit Sub
Else
r.Resize(.Rows.Count, .Columns.Count).UnMerge
Exit For
End If
End If
Next
temp = .Formula
.ClearContents
r.Cells(1).Resize(.Rows.Count, .Columns.Count).Formula = temp
End With
Set r = Nothing
End Sub
(toppo)
> 結合解除時に以下が必要だと思います。以前ありましたので 一度変数に格納したので、必要ありません。 訂正:必要でしたね...
Sub 値移動()
Dim r As Range, c As Range, temp
On Error Resume Next
Set r = Application.InputBox("移動先", Type:=8)
On Error GoTo 0
If r Is Nothing Then Exit Sub
With Selection
If .Parent Is r.Parent Then
If Not Intersect(r.Resize(.Rows.Count, .Columns.Count), .Cells) Is Nothing Then
If vbYes <> MsgBox("範囲が重複" & vbLf & "続行?", vbYesNo) Then
Set r = Nothing
Exit Sub
End If
End If
End If
For Each c In r.Cells(1).Resize(.Rows.Count, .Columns.Count)
If c.MergeCells Then
If vbYes <> MsgBox("結合を解除して続行", vbYesNo) Then
Set r = Nothing
Exit Sub
Else
r.Resize(.Rows.Count, .Columns.Count).UnMerge
Exit For
End If
End If
Next
temp = .Formula
.ClearContents
r.Cells(1).Resize(.Rows.Count, .Columns.Count).Formula = temp
End With
Set r = Nothing
End Sub
(seiya)
seiyaさんすみません。 > 結合解除時に以下が必要だと思います。以前ありましたので。 これは間違いだった様です、動作が変だと勘違いして見たみたいです。 改良して頂いた物、いろいろ試してみましたが、okでした。 是非Excelの標準機能として欲しいと思うのですが、今までなかった! 大変助かりました。 (toppo)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.