[[20200714163259]] 『固定した4桁の数字では意味がありません。』(為五郎) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『固定した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 >


質問させていただきます。
1.私はあなたの定義で、一般人で合っていますか?
2.あなたはあなたの定義で、なに人ですか?
3.1122と1112は同じ数字ですか?
4.変数はグループ1とグループ2と定義しそれぞれの要素を見る形にしあなたは理解できますか?

(kazuo) 2020/07/14(火) 16:59


1.一般人です
2.一人です
3.違います、1122と2121と1122は同じで同じ数の個数にこだわります。
4.はい、出来ます。
(為五郎) 2020/07/14(火) 17:10

追伸)
比較するグループの個数は230個です。
宜しくお願いします。
(為五郎) 2020/07/14(火) 17:13

どのセルにどういう文字列が入っているのか、明記したほうがよいですね。

実際に、"「2778」「0078」「0448」「0245」「1669」"といった文字列が
ひとつのセルに入っているのですか?
いや、それは説明上のことであって、本当は・・・といったことは無いですか?

>比較するグループの個数は230個です。
そういうことも最初からきちんと書いてください。

(γ ) 2020/07/14(火) 17:36


回答ありがとうございます。

片側のグループのみ 2211 と 2121 とが有った場合、何を返せばいいですか?

(kazuo) 2020/07/14(火) 17:42


(γ )さん。コメントありがとうございます。ごめんなさい🙇グループ数は240でした。セルの中には
240の数字が連続で鍵かっこを境に羅列しています。

(kazuo)さん。コメントありがとうございます。その場合は無視します。
(為五郎) 2020/07/14(火) 17:50


一人、って、為五郎さんは天皇陛下でしたか!(昭和の時代なら、冗談でもそういう嘘つくと不敬罪で罰せられましたよ)

私の書いたtest3のロジック通りだったようですね。 文字列とループ数を書き直すだけですが、セルに値が入っているなら、そこから代入するように変えれば良いでしょう。(mmさんのコードが参考になります) それくらいはご自分で努力してくださいね、陛下。
(???) 2020/07/14(火) 17:54


4文字の個数が240個ですか。
240個で1グループと考え、グループが多数あるのかと思ったのですが、
違うのですね。
A1セルとA2セルだけを比較すればいいんですか?

それで、結果はどこにどのような形式で出すんですか?
そういったことも、双方誤解ないよう、二度手間にならないよう、
きちんと説明してください。

できれば、過去のスレッドも含めて
実行したいことを、あらためて説明してはどうですか?
いくつもスレッド建てているけど、やりたいのは一つのことなんですか?
それとも複数のやりたいことがあるんですか?

(γ ) 2020/07/14(火) 17:59


(γ )さん
A1セルとA2セルだけを比較すればいいんですか?→その通りです。
結果はどこにどのような形式で出すんですか?→別にこだわりはありません。
例)異なった数字 1543 1675 5367 の様に表示していただければ構いません。
いくつもスレッド建てているけど、やりたいのは一つのことなんですか?→混同させてしまい申し訳ありませんでした。1つです。
[[20200714081508]] 『共通で無い数列の抜き出し』(かれん)
[[20200714072348]] 『共通ではない数字の抜き出し』(ゴン太) 
[[20200714123210]] 『連続した4桁の数字のペアの違い』(為五郎)
こちらに書かれたことは、不正確なやり取りだったため無視してください。
[[20200714163259]] で書かれてきたことが本来の目的で以前のことは無視してください。
(為五郎) 2020/07/14(火) 18:27

 それぞれのスレッドの後始末は自身でしっかり行ってくださいね。
(通りすがり) 2020/07/14(火) 18:30

別にこだわりがないのではなく、あなたがそれを示す必要があるのです。
仕様を互いに誤解しないためにです。

あらためて、
・A1セル(可変と言うことはわかったので、5個として)の内容
・A2セルの内容
・結果のセル(たち)の位置とそれぞれの内容
をきちんと提示してください。

誤字修正:19:08
(γ ) 2020/07/14(火) 18:38


>>片側のグループのみ 2211 と 2121 とが有った場合、何を返せばいいですか?
(>kazuo)さん。コメントありがとうございます。その場合は無視します。

無視ってどうすれば良いのですか。一般人にも解るよう指示願います。
・その関数は空文字を返す。
・片側にのみ複数ある場合は、無かったものとし、それ以外の数字列を比較した結果を返す。
・それ以外

では、片側のグループに 2211 と 2121 とが有り、
もう一方のグループに 1122 が有った場合、何を返せばいいですか?

(kazuo) 2020/07/14(火) 19:24


γさん
A1とA2の数列を列挙します。
A1=「2778」「4667」「2339」「0445」「0229」「4899」「1379」「1577」「1446」「1159」「5679」「4467」「2668」「1149」「3577」「4558」「4479」「4689」「1129」「2235」「3448」「1458」「3449」「0047」「0337」「0799」「2456」「0239」「3678」「3455」「1779」「0299」「1457」「3889」「0238」「4779」「3445」「1479」「1345」「1145」「0117」「1669」「1349」「1557」「1247」「2257」「1125」「1455」「1489」「4669」「1157」「0233」「1278」「0223」「0669」「0678」「1336」「3667」「0677」「1335」「1388」「2369」「0228」「1136」「2378」「0017」「1589」「2358」「0089」「2577」「3347」「0039」「1588」「2489」「0389」「2599」「0489」「0012」「0147」「0899」「4588」「0388」「2567」「1268」「2335」「1169」「1359」「1668」「5567」「3457」「0116」「0025」「3689」「2479」「1778」「0356」「5568」「4788」「5668」「0477」「5789」「0557」「0137」「2348」「1139」「3668」「0566」「1146」「1355」「0036」「0359」「2688」「0568」「0599」「0035」「2667」「2889」「0358」「2557」「0455」「1579」「4578」「3489」「2349」「4556」「3479」「1699」「0133」「4456」「2245」「3469」「0048」「0267」「0124」「0135」「1249」「1366」「1367」「1348」「0779」「0224」「2789」「3579」「2559」「0668」「3478」「0179」「0278」「3788」「0119」「0169」「1689」「1227」「2469」「5689」「1488」「2669」「1248」「4457」「0138」「0345」「1678」「3677」「1237」「1559」「1127」「4569」「3458」「3488」「2238」「2448」「0034」「0079」「1569」「0588」「0357」「0158」「5699」「1289」「3389」「1399」「2368」「1189」「1456」「1368」「0018」「1688」「1266」「0458」「3789」「3369」「0115」「0023」「2279」「3556」「0058」「4599」「0348」「3599」「2459」「0289」「0479」「2477」「0344」「2579」「3345」「0199」「2899」「2359」「0478」「1558」「1567」「0068」「2259」「4469」「4679」「0029」「0688」「1158」「2466」「3569」「0078」「1339」「1128」「5578」「0339」「0024」「0166」「1469」「1258」「0579」「2455」「2678」「0469」「3379」「0189」「4668」「2458」「0366」「2388」
A2=「0155」「4557」「1567」「1279」「1268」「3669」「0778」「3679」「4559」「1789」「0699」「0124」「0677」「1157」「0239」「5779」「2449」「2358」「0446」「4588」「3499」「1368」「0139」「0166」「0025」「2488」「1269」「3699」「0034」「4677」「1247」「1689」「1366」「1125」「0012」「2368」「0456」「1679」「0258」「1249」「2568」「2668」「0147」「0347」「0577」「4779」「1379」「0158」「3557」「1799」「2248」「0078」「0018」「0445」「1236」「0233」「3445」「0338」「2258」「1156」「1179」「2448」「0468」「0279」「0047」「2237」「0344」「0557」「2357」「0056」「2348」「0178」「0267」「1889」「2379」「1338」「2457」「1477」「1337」「1488」「4457」「0117」「1779」「0567」「1158」「0459」「2788」「1556」「4478」「0449」「2259」「0668」「2249」「4889」「0799」「1336」「1227」「0236」「2268」「1299」「1367」「2577」「1377」「3689」「0159」「1257」「1278」「1159」「4469」「0455」「1677」「2569」「0036」「0148」「3589」「0177」「2489」「1578」「4568」「0377」「0269」「1289」「2377」「3567」「1388」「2236」「1139」「2378」「1356」「0477」「0488」「2699」「4556」「4456」「2335」「3488」「1147」「1235」「2366」「0119」「2789」「3469」「0228」「1258」「1255」「3556」「3455」「2447」「0125」「0299」「0115」「0589」「1168」「0248」「5678」「2338」「0144」「0237」「0499」「4899」「0169」「0168」「3346」「2267」「0245」「3379」「5789」「2339」「1389」「3558」「0188」「1566」「0669」「1458」「0112」「0779」「0057」「1136」「0688」「2567」「5688」「1149」「3789」「1228」「5899」「5788」「2235」「2289」「0246」「2557」「4579」「1469」「3348」「1277」「4577」「0179」「1445」「2588」「2479」「2389」「5568」「0289」「0138」「0014」「0478」「0247」「2467」「1256」「0039」「3368」「3678」「4778」「5699」「2356」「2399」「2337」「0379」「3677」「2445」「1127」「0458」「0067」「0114」「0189」「0038」「0667」「4558」「0133」「2468」「3788」「0349」「0045」「2466」「3579」「0568」「0049」「0337」「1559」「3367」「2677」

結果についてはA3に列挙して下さい。
(為五郎) 2020/07/14(火) 19:34


kazuoさん

無視ってどうすれば良いのですか。一般人にも解るよう指示願います。

すいません、意味のないことを言ってしまい。表示自体は行わず、比較して異なったものだけを表示してください。

では、片側のグループに 2211 と 2121 とが有り、 もう一方のグループに 1122 が有った場合、何を返せばいいですか?

何も返さずにいいです。表示しなくて結構です。
(為五郎) 2020/07/14(火) 19:41


kazuoさん
>>無視ってどうすれば良いのですか。一般人にも解るよう指示願います。

・片側にのみ複数ある場合は、無かったものとし、それ以外の数字列を比較した結果を返す。→これです。
(為五郎) 2020/07/14(火) 19:46


その内容だと結果的にグループに関係なく、
複数存在すれば、返さない。 = 1つのみ存在するものを返す。
と思えるのですが、合っていますか?

(kazuo) 2020/07/14(火) 20:00


240個の例は不要です。
 
それよりも、問題と結果のペアをきちんと提示してください。
 
こちらで内容を確認するためにも、想定結果が必要です。
というよりも、それら両方があって初めて「質問」ということになります。
極論すれば、今までは質問の体を成していません。
 
多数でできないというなら、最初から申し上げているように
5個の例で書いてください。

(γ ) 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


>グループを比較して違う数字がでたら表示する様にしたいと思っています、
>かつ、グループの1)グループと2)の四桁な数字は順不同でも同じと考えています。

1122だけが違う数字なんですか?
わかりません。説明してください。

(γ ) 2020/07/14(火) 20:32


A2の中の5個の数値で、A1セルのなかにある5個の数値に無いものは、
5個ともすべてそうじゃないですか。
別の解釈があるなら、
あなたの以下の説明が不十分というか、間違っているんですよ。
>グループを比較して違う数字がでたら表示する様にしたいと思っています、
>かつ、グループの1)グループと2)の四桁な数字は順不同でも同じと考えています。

どう解釈したら、1122だけが結果なんですか?
さっぱり訳が分かりません。

(γ ) 2020/07/14(火) 21:28


どうも焦ってしまい間違えてします。
正解
A1「1345」「6756」「4533」「1122」「9000」
A2「6777」「1221」「8976」「1234」「5555」
A3 6777 8976 1234 5555 1345 6756 4533 9000
(為五郎) 2020/07/14(火) 21:39

まさか、、
4桁中の数字の個数がいっしょの物があれば、除外する

とか??
(サンダー) 2020/07/14(火) 21:46


サンダーさんはマクロ詳しいですか。上記の内容で、マクロに挑戦できませんか?除外ではなく答えなのです。

(為五郎) 2020/07/14(火) 21:51


えーっと
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
これがと それを抽出となりますが、これが正解??
(サンダー) 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

ありがとうございました。マクロについては初心者なのでまた質問をさせて頂きます。
(為五郎) 2020/07/15(水) 07:40

アホらしくなって途中からリタイアしていた。
例えば1234と4321は同一視します、と一言説明すれば誤解が生じない。
全体に説明をもっと適切にすれば、誤解の入る余地も減るし、回答者との軋轢も避けられる。
 
 
seiyaさんの回答を拝見して、やられたと思いました。
というのは、正規表現技術入門という書籍(これは良書)に、
先読みの応用例として、「hoge,fuga,piyoが順不同で出現する正規表現」というのが載っていて、
いつか応用してみたいと思っていた。
今回絶好球が来ていたのに、バッターボックスに立てなかった。他日を期したい。
 
ちなみに、単語境界\bを使う理由がちょっとわかりませんでした。
どんなケースを想定されておられたのかなあと。
(γ ) 2020/07/15(水) 08:11

 >単語境界\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(水) 16:51

↓に続く
[[20200715162021]] 『マクロを使わないで』(ゴン太)

(偽五郎) 2020/07/15(水) 17:31


続くではなくて関連だった。
(コン大 ) 2020/07/15(水) 20:57

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.