[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『固定した4桁の数字では意味がありません。』(為五郎)
[[20200714081508]] 『共通で無い数列の抜き出し』(かれん)
[[20200714072348]] 『共通ではない数字の抜き出し』(ゴン太)
[[20200714123210]] 『連続した4桁の数字のペアの違い』(為五郎)
以上による回答があるのですが、指定された数字には固執するのではなく変数を取り扱います。
1)「2778」「0078」「0448」「0245」「1669」……のグループと
2)「1388」「1559」「6889」「1479」「1299」……のグループの1)グループと2)グループを比較して違う数字がでたら表示する様にしたいと思っています、かつ、グループの1)グループと2)の四桁な数字は順不同でも同じと考えています。もし意味が分からないようであれば指摘してください。
< 使用 Excel:Excel2016、使用 OS:Windows10 >
(kazuo) 2020/07/14(火) 16:59
実際に、"「2778」「0078」「0448」「0245」「1669」"といった文字列が
ひとつのセルに入っているのですか?
いや、それは説明上のことであって、本当は・・・といったことは無いですか?
>比較するグループの個数は230個です。
そういうことも最初からきちんと書いてください。
(γ ) 2020/07/14(火) 17:36
片側のグループのみ 2211 と 2121 とが有った場合、何を返せばいいですか?
(kazuo) 2020/07/14(火) 17:42
(kazuo)さん。コメントありがとうございます。その場合は無視します。
(為五郎) 2020/07/14(火) 17:50
私の書いたtest3のロジック通りだったようですね。 文字列とループ数を書き直すだけですが、セルに値が入っているなら、そこから代入するように変えれば良いでしょう。(mmさんのコードが参考になります) それくらいはご自分で努力してくださいね、陛下。
(???) 2020/07/14(火) 17:54
それで、結果はどこにどのような形式で出すんですか?
そういったことも、双方誤解ないよう、二度手間にならないよう、
きちんと説明してください。
できれば、過去のスレッドも含めて
実行したいことを、あらためて説明してはどうですか?
いくつもスレッド建てているけど、やりたいのは一つのことなんですか?
それとも複数のやりたいことがあるんですか?
(γ ) 2020/07/14(火) 17:59
それぞれのスレッドの後始末は自身でしっかり行ってくださいね。 (通りすがり) 2020/07/14(火) 18:30
あらためて、
・A1セル(可変と言うことはわかったので、5個として)の内容
・A2セルの内容
・結果のセル(たち)の位置とそれぞれの内容
をきちんと提示してください。
誤字修正:19:08
(γ ) 2020/07/14(火) 18:38
無視ってどうすれば良いのですか。一般人にも解るよう指示願います。
・その関数は空文字を返す。
・片側にのみ複数ある場合は、無かったものとし、それ以外の数字列を比較した結果を返す。
・それ以外
では、片側のグループに 2211 と 2121 とが有り、
もう一方のグループに 1122 が有った場合、何を返せばいいですか?
(kazuo) 2020/07/14(火) 19:24
結果についてはA3に列挙して下さい。
(為五郎) 2020/07/14(火) 19:34
無視ってどうすれば良いのですか。一般人にも解るよう指示願います。
すいません、意味のないことを言ってしまい。表示自体は行わず、比較して異なったものだけを表示してください。
では、片側のグループに 2211 と 2121 とが有り、 もう一方のグループに 1122 が有った場合、何を返せばいいですか?
何も返さずにいいです。表示しなくて結構です。
(為五郎) 2020/07/14(火) 19:41
・片側にのみ複数ある場合は、無かったものとし、それ以外の数字列を比較した結果を返す。→これです。
(為五郎) 2020/07/14(火) 19:46
(kazuo) 2020/07/14(火) 20:00
(γ ) 2020/07/14(火) 20:01
A1「1345」「6756」「4533」「1122」「9000」
A2「6777」「1221」「8976」「1234」「5555」
A3 1122
これで分かりますか?
(為五郎) 2020/07/14(火) 20:13
(kazuo) 2020/07/14(火) 20:31
1122だけが違う数字なんですか?
わかりません。説明してください。
(γ ) 2020/07/14(火) 20:32
どう解釈したら、1122だけが結果なんですか?
さっぱり訳が分かりません。
(γ ) 2020/07/14(火) 21:28
とか??
(サンダー) 2020/07/14(火) 21:46
(為五郎) 2020/07/14(火) 21:51
A1「1345」「6756」「4533」「1122」「9000」
A2「6777」「1221」「8976」「1234」「5555」
A3 1122
これがと それを抽出となりますが、これが正解??
(サンダー) 2020/07/14(火) 22:59
UDF A3: =GetDiff(A1,A2)
Function GetDiff(ByVal txt1 As String, txt2 As String) As String
Dim x, y, i As Long, ii As Long, Ptn As String
x = Split(Application.Trim(Replace(Replace(txt1, "「", " "), "」", " ")))
y = Split(Application.Trim(Replace(Replace(txt2, "「", " "), "」", " ")))
With CreateObject("VBScript.RegExp")
For i = 0 To UBound(x)
For ii = 1 To Len(x(i))
Ptn = Ptn & "(?=.*" & Mid$(x(i), ii, 1) & ".*)"
Next
.Pattern = "\b" & Ptn & "\b"
For ii = 0 To UBound(y)
If .test(y(ii)) Then
y(ii) = Empty: x(i) = Empty: Exit For
End If
Next
Ptn = ""
Next
End With
GetDiff = Join(Array(Application.Trim(Join(x)), Application.Trim(Join(y))))
End Function
(Seiya) 2020/07/14(火) 23:14
>>A1「1345」「6756」「4533」「1122」「9000」
A2「6777」「1221」「8976」「1234」「5555」
A3 6777 8976 1234 5555 1345 6756 4533 9000
これだと
1が2個、2が2個あるものを除外してますけれども、間違い??
間違いではありません。
>>A1「1345」「6756」「4533」「1122」「9000」
A2「6777」「1221」「8976」「1234」「5555」
A3 1122
これがと それを抽出となりますが、これが正解??
これは間違いです。抽出ではなくて共通してどちらにも入っていないものをA3に列挙します。
ご理解得たでしょうか?
(為五郎) 2020/07/15(水) 04:58
A1 1234 2443 1188 8976 6755 2772 1118
A2 7272 2434 5675 3212 8679 1818 8111
A3 1234 3212
これで理解していただけないでしょうか?
(為五郎) 2020/07/15(水) 05:14
おはようございます。 レイアウトをA1 A3 A5 と一行づづ空けて コードをお互いに見る様にしてみましたら結果は↓になりました。 要は並び順は関係なしであるかないかなのでしょ? よく見ると突込みどころ満載のコードですけど、、、(^^; 行ってきます。。。。
1234 2443 1188 8976 6755 2772 1118
7272 2434 5675 3212 8679 1818 8111
1234 3212
Option Explicit
Sub てすと()
Dim x As Variant
Dim xx As Variant
Dim y As Variant
Dim yy As Variant
Dim z As Variant
Dim v() As Variant
Dim i As Long
Dim n As Long
x = Range("A1").CurrentRegion.Resize(1).Value
xx = x
y = Range("A3").CurrentRegion.Resize(1).Value
yy = y
分割 x
分割 y
再編 x
再編 y
For i = LBound(x, 2) To UBound(x, 2)
z = Application.Match(x(1, i), Application.Index(y, 1, 0), 0)
If IsError(z) Then
ReDim Preserve v(n)
v(n) = xx(1, i)
n = n + 1
End If
Next
For i = LBound(y, 2) To UBound(y, 2)
z = Application.Match(y(1, i), Application.Index(x, 1, 0), 0)
If IsError(z) Then
ReDim Preserve v(n)
v(n) = yy(1, i)
n = n + 1
End If
Next
If n > 0 Then
With Range("A5")
.EntireRow.ClearContents
.Resize(, UBound(v) + 1).NumberFormat = "@"
.Resize(, UBound(v) + 1).Value = v
End With
End If
Erase x, y, v, xx, yy
End Sub
Sub 分割(ByRef x As Variant)
Dim i As Long
Dim j As Long
For i = LBound(x, 2) To UBound(x, 2)
ReDim v(Len(x(1, i)) - 1)
For j = LBound(v) To UBound(v)
v(j) = Mid(x(1, i), j + 1, 1)
Next
QuickSort v, LBound(v), UBound(v)
x(1, i) = v
Next
End Sub
Sub 再編(ByRef x As Variant)
Dim v As Variant
Dim i As Long
For i = LBound(x, 2) To UBound(x, 2)
v = Replace(Join(x(1, i)), " ", "")
x(1, i) = v
Next
End Sub
Private Sub QuickSort(MySAry As Variant, ByVal MySLeft As Long, ByVal MySRight As Long)
Dim MySMid As Long
Dim i As Long, j As Long
Dim MyStmp As String
MySMid = MySAry((MySLeft + MySRight) \ 2)
i = MySLeft
j = MySRight
Do
Do While MySAry(i) < MySMid
i = i + 1
Loop
Do While MySAry(j) > MySMid
j = j - 1
Loop
If i >= j Then Exit Do
MyStmp = MySAry(i)
MySAry(i) = MySAry(j)
MySAry(j) = MyStmp
i = i + 1
j = j - 1
Loop
If MySLeft < i - 1 Then QuickSort MySAry, MySLeft, i - 1
If MySRight > j + 1 Then QuickSort MySAry, j + 1, MySRight
End Sub
(SoulMan) 2020/07/15(水) 06:08
Sub tes01()
Dim a As String, b As Double
Dim i As Double, j As Double, n As Double
Dim Ans As String, Ans2 As String
'
a = "6335"
'
For i = 1 To 4
n = Val(Mid(a, i, 1))
b = b + 10 ^ n
Next i
Ans = Right("0000000000" & CStr(b), 10)
Debug.Print Ans
'
Ans2 = ""
For i = 0 To 9
n = Val(Mid(Ans, 10 - i, 1))
For j = 1 To n
Ans2 = Ans2 & CStr(i)
Next j
Next i
Debug.Print Ans2
'
End Sub
(サンダー) 2020/07/15(水) 07:07
>単語境界\bを使う理由がちょっとわかりませんでした。 Split 無しでのマッチの抽出を試みた時点でのもので単に消し忘れです。 動作上問題無しなので、修正していません。
むしろトピ主がUDF(ユーザー定義関数)の使用方法が理解できているかが問題です。
(Seiya) 2020/07/15(水) 09:35
(γ ) 2020/07/15(水) 09:48
これで文字列に対してのマッチが検出されますが、あまり意味が無いような...
Function GetDiff(ByVal txt1 As String, txt2 As String) As String
Dim x, i As Long, ii As Long, Ptn As String
x = Split(Application.Trim(Replace(Replace(txt1, "「", " "), "」", " ")))
txt2 = Replace(Replace(txt2, "「", " "), "」", " ")
With CreateObject("VBScript.RegExp")
.Global = True
For i = 0 To UBound(x)
For ii = 1 To Len(x(i))
Ptn = Ptn & "(?=.*" & Mid$(x(i), ii, 1) & ".*)"
Next
.Pattern = "\b" & Ptn & "\b(\b[" & x(i) & "]+\b)"
If .test(txt2) Then
txt2 = .Replace(txt2, ""): x(i) = Empty
End If
Ptn = ""
Next
End With
GetDiff = Join(Array(Application.Trim(Join(x)), Application.Trim(txt2)))
End Function
(Seiya) 2020/07/15(水) 10:49
(偽五郎) 2020/07/15(水) 17:31
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.