[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロ コピー貼り付けと重複データの一括処理について』(エイワン)
下記のようなコードがあります。この2つのコードを一括して処理したいのです。
現在、処理ができていますが、どうしてもコピーの段階で次ぎに上げたことができずにいます。お教え願えませんか。
やりたいこと
sheet1にA列だけにデータがあれば、その全ての行はコピー貼り付けせず、A列を含めて、全ての列にデータがあるものだけ、コピー貼り付けする。
このようにコピー貼り付けしたいのでが、コードの書き方がわからず困っています。ご教授お願いできませんか。
Sub コピー貼り付けつけ() 'コピー貼り付けつけのコード
'A列だけにデータがあれば、その全ての行はコピー貼り付けせず、その他の行のみコピー貼り付けする。(現在できていない状態)
Dim lastRow As Long
Dim 重複データを一括削除する, myRng As Range
For i = 2 To 最終行番号
N = Application.WorksheetFunction.CountA(Range("A" & i & ":O" & i))
MsgBox N
If N < 15 Then '(貼り付けない。15の時のみこの行を貼り付ける。)
End If Next i
'Sheet1のA3から最終行までをコピー
With Sheets("sheet1")
.Range("A3:O" & .Cells(Rows.Count, "A").End(xlUp).Row).Copy
End With
'Sheet2のA列の最終行の次の行に貼付け
Sheets("sheet2").Cells(Rows.Count, "A").End(xlUp).Offset(1).PasteSpecial
Application.CutCopyMode = False
'重複データを一括削除する
lastRow = Sheets("sheet2").Cells(Rows.Count, "A").End(xlUp).Row
For i = 1 To lastRow - 1
If WorksheetFunction.CountIf(Range(Cells(i + 1, "O"), Cells(lastRow, "O")), Cells(i, "O")) > 0 Then
If myRng Is Nothing Then
Set myRng = Cells(i, "O")
Else
Set myRng = Union(myRng, Cells(i, "O"))
End If
End If
Next i
If Not myRng Is Nothing Then
myRng.EntireRow.Delete
End If
End Sub
< 使用 Excel:Excel2013、使用 OS:Windows10 >
Sub さんぷる()
Dim コピー対象 As Range
Dim i As Long
'「Sheet1」の操作
With Worksheets("sheet1")
'元データ(セル範囲)の定義(2行目からなので、最終行から1引いた分まで行を拡張)
With .Range("A2:O2").Resize(.Cells(.Rows.Count, "A").End(xlUp).Row - 1)
For i = 1 To .Rows.Count '【セル範囲】の1行目から最終行までループ
'▼【セル範囲】の該当行のデータ数を数えて全部埋まっているか判定する
If Application.WorksheetFunction.CountA(.Rows(i)) = 15 Then
'条件を満たす行があれば、コピー対象として覚えておく
If コピー対象 Is Nothing Then
Set コピー対象 = .Rows(i)
Else
Set コピー対象 = Union(コピー対象, .Rows(i))
End If
End If
Next
End With
End With
'▼コピー対象として覚えたセル範囲がなければ終了
If コピー対象 Is Nothing Then Exit Sub
'「Sheet2」の操作
With Worksheets("Sheet2")
'▼コピペ処理
コピー対象.Copy .Cells(Rows.Count, "A").End(xlUp).Offset(1)
'▼よくわからないけど重複削除?
'【省略】
End With
End Sub
Unionメソッドをすでに使っているところをみると、説明は不要ですよね?
ただ、このやり方の他に
オートフィルタを設定してから、B〜I列の(空白セル)【以外】を抽出して、まとめてコピーしたら、目的達成しそうな気がするので、そちらのほうがシンプルかもと思ったり・・・
(もこな2) 2019/02/15(金) 13:16
一応、動いたけど、、結果がどうかは、、、わかりません。(^^;
Option Explicit
Sub コピー貼り付けつけ() 'コピー貼り付けつけのコード
'A列だけにデータがあれば、その全ての行はコピー貼り付けせず、その他の行のみコピー貼り付けする。(現在できていない状態)
Dim lastRow As Long
Dim 最終行番号 As Long
Dim i As Long
Dim N As Long
Dim 重複データを一括削除する As Variant
Dim myRng As Range
With Sheets("Sheet1")
最終行番号 = .Cells(Rows.Count, "A").End(xlUp).Row
For i = 2 To 最終行番号
N = Application.WorksheetFunction.CountA(.Range("A" & i & ":O" & i))
' MsgBox N
If N = 15 Then '(貼り付けない。15の時のみこの行を貼り付ける。)
'Sheet1のA3から最終行までをコピー
'Sheet2のA列の最終行の次の行に貼付け
.Range("A" & i).Resize(, 15).Copy
Sheets("sheet2").Range("A" & Rows.Count).End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValues
End If
Next i
End With
Application.CutCopyMode = False
'重複データを一括削除する
With Sheets("Sheet2")
lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
For i = 1 To lastRow
If WorksheetFunction.CountIf(.Range(.Cells(i + 1, "O"), .Cells(lastRow, "O")), .Cells(i, "O")) > 0 Then
If myRng Is Nothing Then
Set myRng = .Cells(i, "O")
Else
Set myRng = Union(myRng, .Cells(i, "O"))
End If
End If
Next i
End With
If Not myRng Is Nothing Then
myRng.EntireRow.Delete
End If
End Sub
(SoulMan) 2019/02/15(金) 13:35
こんにちは^^ おなじく一応、動いたけど、、結果がどうかは、、、わかりません。(^^; 重複削除ぶぶんはさわっていません。。。 m(_ _)m
Sub コピー貼り付けつけ() 'コピー貼り付けつけのコード
Dim lastRow As Long
Dim myRng As Range
Dim N As Long
Dim i As Long
Dim 最終行番号 As Long
With Worksheets("Sheet1")
最終行番号 = .Cells(.Rows.Count, 1).End(xlUp).Row
Worksheets("Sheet2").Cells.Clear
For i = 3 To 最終行番号
N = Application.WorksheetFunction.CountA(Range("A" & i & ":O" & i))
'MsgBox N
If N = 15 Then '(貼り付けない。15の時のみこの行を貼り付ける。)
'Sheet1のA3から最終行までをコピー
.Range(.Cells(i, "A"), .Cells(i, "O")).Copy
'Sheet2のA列の最終行の次の行に貼付け
Worksheets("Sheet2").Cells(Worksheets("Sheet2").Rows.Count, "A").End(xlUp).Offset(1).PasteSpecial
Application.CutCopyMode = False
End If
Next i
End With
With Worksheets("Sheet2")
'重複データを一括削除する
lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
For i = 1 To lastRow - 1
If WorksheetFunction.CountIf(.Range(.Cells(i + 1, "O"), .Cells(lastRow, "O")), .Cells(i, "O")) > 0 Then
If myRng Is Nothing Then
Set myRng = .Cells(i, "O")
Else
Set myRng = Union(myRng, .Cells(i, "O"))
End If
End If
Next i
If Not myRng Is Nothing Then
myRng.EntireRow.Delete
End If
End With
End Sub
(隠居じーさん) 2019/02/15(金) 14:10
こう↓してもいいように思うけど、、、結果がちょっと違うね???(^^;
Option Explicit
Sub コピー貼り付けつけ() 'コピー貼り付けつけのコード
'A列だけにデータがあれば、その全ての行はコピー貼り付けせず、その他の行のみコピー貼り付けする。(現在できていない状態)
Dim lastRow As Long
Dim 最終行番号 As Long
Dim i As Long
Dim N As Long
Dim 重複データを一括削除する As Variant
Dim myRng As Range
With Sheets("Sheet1")
最終行番号 = .Cells(Rows.Count, "A").End(xlUp).Row
For i = 2 To 最終行番号
If (Application.CountA(.Range("A" & i).Resize(, 15)) = 15) * (Application.CountIf(.Range("O2", .Range("O" & i)), .Range("O" & i)) = 1) Then
'' MsgBox N
' If N = 15 Then '(貼り付けない。15の時のみこの行を貼り付ける。)
'Sheet1のA3から最終行までをコピー
'Sheet2のA列の最終行の次の行に貼付け
.Range("A" & i).Resize(, 15).Copy
Sheets("sheet2").Range("A" & Rows.Count).End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValues
End If
Next i
End With
Application.CutCopyMode = False
''重複データを一括削除する
'With Sheets("Sheet2")
' lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
' For i = 1 To lastRow
' If WorksheetFunction.CountIf(.Range(.Cells(i + 1, "O"), .Cells(lastRow, "O")), .Cells(i, "O")) > 0 Then
' If myRng Is Nothing Then
' Set myRng = .Cells(i, "O")
' Else
' Set myRng = Union(myRng, .Cells(i, "O"))
' End If
' End If
' Next i
'End With
'If Not myRng Is Nothing Then
' myRng.EntireRow.Delete
'End If
End Sub
(SoulMan) 2019/02/15(金) 14:38
で、その条件でいいのなら、見出しも含めて↓とも書けるかもしれませんね
Option Explicit
Sub コピー貼り付けつけ() 'コピー貼り付けつけのコード
Dim MyA As Variant
Dim MyAry As Variant
Dim i As Long
Dim j As Long
Dim k As Long
With Sheets("Sheet1")
MyA = .Range("A1", .Range("A" & Rows.Count).End(xlUp)).Resize(, 15).Value
MyAry = Application.Transpose(Application.Index(MyA, 1, 0))
For i = 2 To UBound(MyA, 1)
If (Application.CountA(Application.Index(MyA, i, 0)) = 15) * (Application.CountIf(.Range("O2", .Range("O" & i)), .Range("O" & i)) = 1) Then
k = k + 1
ReDim Preserve MyAry(LBound(MyAry, 1) To UBound(MyAry, 1), 1 To k)
For j = LBound(MyAry, 1) To UBound(MyAry, 1)
MyAry(j, k) = MyA(i, j)
Next
End If
Next
End With
With Sheets("Sheet2")
.Cells.Clear
.Range("A1").Resize(UBound(MyAry, 2), UBound(MyAry, 1)).Value = Application.Transpose(MyAry)
End With
Erase MyA, MyAry
End Sub
(SoulMan) 2019/02/15(金) 15:18
SoulManさんの条件文をパクらせていただいて。。。( ̄▽ ̄;)
じーさん風アラカルト。。。みたいな。。。m(_ _)m
Option Explicit
Sub jisan()
Dim s1 As Worksheet
Dim r As Range
Dim rr As Range
Dim i As Long
Dim WF
Set WF = WorksheetFunction
Set s1 = Worksheets("Sheet1")
Set rr = s1.Range("A1").CurrentRegion
s1.Copy
With ActiveSheet
Intersect(.UsedRange, .Range(.Rows(2), .Rows(.UsedRange.Rows.Count))).Delete
For i = 2 To rr.Rows.Count
If (WF.CountA(rr(i, 1).Resize(, 15)) = 15) * _
(WF.CountIf(s1.Range(rr(2, 15), rr(i, 15)), rr(i, 15)) = 1) Then
.Cells(.Rows.Count, 1).End(xlUp).Offset(1).Resize(, 15) = rr(i, 1).Resize(, 15).Value
End If
Next
Application.CutCopyMode = False
End With
End Sub
(隠居じーさん) 2019/02/15(金) 16:30
重複削除のところは、要はO列だけみて(他の列は重複してなくても)行ごと削除したいってことですね。
Excel2013とのことですから、デフォルトで重複削除という機能がありますから、これを使った方が楽ちんだと思います。
Sub さんぷる()
Dim 出力先 As Range
Dim コピー対象 As Range
Dim i As Long
'出力先のセット
With Worksheets("Sheet2")
Set 出力先 = .Cells(.Rows.Count, "A").End(xlUp).Offset(1)
End With
'「Sheet1」の操作
With Worksheets("Sheet1")
'▼オートフィルタを強制解除して抽出状態をクリア
.AutoFilterMode = False
'▼オートフィルタを設定
.Range("A1").AutoFilter
'▼B〜O列のいずれも(空白)でない行を抽出
For i = 2 To 15
.AutoFilter.Range.AutoFilter Field:=i, Criteria1:="<>"
Next i
'抽出された行があれば(見出し行を除いて)コピペ
If .Cells(.Rows.Count, "A").End(xlUp).Row > 1 Then
Intersect(.AutoFilter.Range, .AutoFilter.Range.Offset(1), .Range("A:O")).Copy 出力先
End If
End With
'「Sheet2」の操作
With Worksheets("Sheet2")
'O列が重複している行を削除
With .Range("A1", .Cells(.Rows.Count, "A").End(xlUp)).Resize(, 15)
.RemoveDuplicates Columns:=15, Header:=xlNo
End With
End With
End Sub
(もこな2) 2019/02/15(金) 19:06
Sub test()
Dim rngS As Range
Dim rngD As Range
Dim rngC As Range
Set rngS = Worksheets("Sheet1").Cells(1).CurrentRegion
Set rngD = Worksheets("Sheet2").Cells(1).CurrentRegion.Rows(1)
Set rngC = rngS.Resize(2, 2).Offset(, rngS.Columns.Count + 1)
rngC(2, 1).Formula = "=counta(a2:o2)=15"
rngC(2, 2).Formula = "=countif($o$2:o2,o2)=1"
rngS.AdvancedFilter xlFilterCopy, rngC, rngD
rngC.ClearContents
End Sub
(マナ) 2019/02/16(土) 13:58
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.