こんにちは。
ユーザー定義関数に換えてみました。あくまでも、VBAをご存知の方に対するものですから、こちらから、あまり初歩的な説明をするつもりはありません。組み込んでお使いになれるようなら、お試しください。組み込み関数では出来ないことが可能かと思います。
ユーザー定義関数の数式は、
不足している数字
=CheckDoubles(A1:J1)
重複している数字
=CheckDoubles(A1:J1, 1)
単独セルでも、複数セルでも検索可能です。
重複がない場合は、空文字「""」が出力しています。
なお、
'パターン
mPattern = "\u2460-\u2468\u2776-\u277E"
文字範囲は、Unicode になっていますから、その範囲を指定すればよいのですが、
If n > 10 ^ 4 Then n = n - 10101
If n > 9 * 10 ^ 3 Then n = n - 9311
ここで、数値に変換しています。ただし、配列は、数字(文字)に変換しています。
'-------------------------------------------
'標準モジュール
'-------------------------------------------
Public Function CheckDoubles(ByVal rng As Range, Optional opt As Integer = 0) As String
Dim buf() As Variant
Dim misbuf() As Variant
Dim dbuf() As Variant
Dim dbbuf() As Variant
Dim n As Variant
Dim s As String
Dim i As Long
Dim j As Long
Dim k As Long
Dim c As Variant
Dim v As Variant
Dim ret As Variant
Dim Matches As Object
Dim Match As Object
Dim mPattern As String
Dim List1 As Variant
Dim List2 As Variant
'パターン
mPattern = "\u2460-\u2468\u2776-\u277E"
If WorksheetFunction.CountA(rng) = 0 Then Exit Function
With CreateObject("VBScript.RegExp")
.Global = False
.Pattern = ".*[" & mPattern & "].*"
For Each c In rng
For k = 1 To Len(c.Value)
s = Mid$(c.Value, k, 1)
If .Test(s) Then
Set Matches = .Execute(s)
n = AscW(Matches(0).Value)
If n > 10 ^ 4 Then n = n - 10101
If n > 9 * 10 ^ 3 Then n = n - 9311
On Error Resume Next
ret = Application.Match(CStr(n), buf, 0)
On Error GoTo 0
If IsError(ret) Or IsEmpty(ret) Then
ReDim Preserve buf(i)
buf(i) = CStr(n)
i = i + 1
Else
ReDim Preserve dbuf(j)
dbuf(j) = CStr(n)
j = j + 1
End If
End If
Next k
Next c
'MissingList
j = 0
For i = 1 To 9
ret = Application.Match(CStr(i), buf, 0)
If Not IsNumeric(ret) Or IsEmpty(ret) Then
ReDim Preserve misbuf(j)
misbuf(j) = CStr(i)
j = j + 1
End If
Next i
'DoublingList
On Error Resume Next
ret = Empty
ret = LBound(dbuf)
On Error GoTo 0
j = 0
If Not IsEmpty(ret) Then
For Each v In dbuf
ret = Empty
On Error Resume Next
ret = Application.Match(CStr(v), dbbuf, 0)
On Error GoTo 0
If IsError(ret) Or IsEmpty(ret) Then
ReDim Preserve dbbuf(j)
dbbuf(j) = CStr(v)
j = j + 1
End If
Next v
End If
List1 = Join(misbuf, ",")
List2 = Join(dbbuf, ",")
If opt <> 0 Then opt = 1
CheckDoubles = Array(List1, List2)(opt)
End With
End Function
お礼
度々、ありがとうございます。 できました!感激です。 エクセルって本当に奥が深くすごいんですね。 (皆様の様に使いこなせればですけど・・・) #1の回答者様の方法と併用で使っていきたいと思います。