Sub AutoFilterCopiedItems()
Dim Rng As Range
Dim Col As Range
Dim Sel As Range
Dim Sht As Worksheet
Dim Fld As Long
Dim Cel As Range
Dim Ary As Variant
Dim aStr As String
Dim vStr As Variant
Dim RngArea As Range
Dim NF As String
Dim X As Long
Dim Val As Double
Dim Changes As Long
Dim vErr As Boolean
Dim App As Application
Dim WF As WorksheetFunction
Dim LO As ListObject
Dim xNF As String
Dim NFType As String
Dim Headers As Range
Dim LastRow As Long
Set Sht = ActiveSheet
Set Sel = Selection
Set Col = Sel.EntireColumn
If Col.Columns.Count > 1 Then
MsgBox "Please only select items in one column to filter"
Exit Sub
End If
On Error Resume Next
Set Rng = Sht.AutoFilter.Range
On Error GoTo 0
If Rng Is Nothing Then
Set LO = Sel.ListObject
If Not LO Is Nothing Then Set Rng = LO.DataBodyRange
End If
If Rng Is Nothing Then
With ActiveWindow
Set Cel = Sht.Cells(.SplitRow, Sel.Column)
End With
If Cel.Column > 1 Then
If Cel.Offset(0, -1) <> "" And Cel.Offset(0, 1) <> "" Then
Set Headers = Sht.Range(Cel.End(xlToLeft), Cel.End(xlToRight))
ElseIf Cel.Offset(0, -1) = "" And Cel.Offset(0, 1) <> "" Then
Set Headers = Sht.Range(Cel, Cel.End(xlToRight))
ElseIf Cel.Offset(0, -1) <> "" And Cel.Offset(0, 1) = "" Then
Set Headers = Sht.Range(Cel.End(xlToLeft), Cel)
End If
ElseIf Cel.Column = 1 Then
If Cel.Offset(0, 1) <> "" Then
Set Headers = Sht.Range(Cel, Cel.End(xlToRight))
ElseIf Cel.Offset(0, 1) = "" Then
Set Headers = Cel
End If
End If
X = 0
If Not Headers Is Nothing Then
For Each Cel In Headers
X = Sht.Cells(Sht.Cells.Rows.Count, Cel.Column).End(xlUp).Row
If X > LastRow Then LastRow = X
Next Cel
Set Cel = Headers.Resize(1, 1).Offset(0, Headers.Columns.Count - 1)
Set Rng = Sht.Range(Headers.Resize(1, 1), Intersect(Sht.Cells(LastRow, 1).EntireRow, Cel.EntireColumn))
End If
End If
If Rng Is Nothing Then
Set Rng = Sel.CurrentRegion
Rng.AutoFilter
End If
Fld = Col.Column - Rng.Resize(1, 1).Column + 1
xNF = "mdy/[]hms:apE+"
NF = Sel.Areas(1).Resize(1, 1).NumberFormat
NFType = "Number"
If NF = "@" Then
NFType = "Text"
ElseIf NF = "General" Then
NFType = "General"
Else
For X = 1 To Len(xNF)
If InStr(NF, Mid(xNF, X, 1)) > 0 Then
NFType = "Text"
Exit For
End If
Next X
End If
vStr = CopyFromClipboard
If InStr(vStr, ",") > 0 Then
vStr = Replace(vStr, ", ", ",")
Ary = Split(vStr, ",")
Else
vStr = Replace(vStr, vbCr, "")
Ary = Split(vStr, vbLf)
End If
For X = 0 To UBound(Ary)
vErr = False
On Error GoTo HolyErrorBatman
Val = Ary(X)
On Error GoTo 0
If NFType = "Text" Or vErr = True Then
aStr = aStr & Chr(1) & Ary(X)
ElseIf NFType = "General" Then
aStr = aStr & Chr(1) & Val
aStr = aStr & Chr(1) & Val * -1
ElseIf NFType = "Number" Then
aStr = aStr & Chr(1) & Format(Val, NF)
aStr = aStr & Chr(1) & Format(Val * -1, NF)
End If
Next X
Ary = Split(Mid(aStr, 2), Chr(1))
Rng.AutoFilter Field:=Fld, Criteria1:=Ary, Operator:=xlFilterValues
Exit Sub
HolyErrorBatman:
vErr = True
Resume Next
End Sub