新規無料会員登録で1000名様に電子コミック1000円分が当たる!!

こんにちは、エクセル365を使っています。

一人では解決出来ない事が出てきましたので、教えて頂けませんか?

以下のようなデータがあります。

R17 ~ S17 に元データがあります。
1行に対して R,S 両方にデータがある事はありません、必ずRかSどちらか片方です。

その全組み合わせ例を、U17、V17以下に表示させたいと思います。

R列を先頭に持つ文字の組みあわせをU列に、S列を先頭に持つ文字の組みあわせを 【R列の文字を先頭に】 V列に転記させます。

ただし、V17以下に記載されている文字の組み合わせの場合のみ、黄色で表示された様に左右逆に(abならba、afならfa)表示させたいと思います。

ちなみに元データの文字は3文字を上限に複数になる事もあります。

■また、元データの変更は頻繁に行われますのでその度に自動で表示しなおしてくれる方法でお願いします。

※(都合で表示されていますZ列以降の列は不要です。)

かなり難しいと思うので、そのままコードを書いて頂ける方、よろしくお願い致します

「エクセル マクロ? VBA? かなり難し」の質問画像

質問者からの補足コメント

  • どう思う?

    お世話になります、前回は考えて頂き、ありがとうございます。
    前回までの画像と説明を2枚の画像で訂正させて頂きます。

    条件に従い、R列の文字と、S列の文字の組み合わせをU列とV列に転記したいと思います。

    基本情報として、元データは必ずR列か、S列、どちらかにしか入りません。

    STEP 1
    まずは、R列が先頭に来る場合の組み合わせをU列に上から順に転記します。

    この時、R列の行より、S列の行のほうが下にあるものだけを組み合わせ、下行と上行の組み合わせは無視します。

    STEP 2
    次に、S列が先頭に来る場合の組み合わせをV列に上から順に転記します。

    先ほどと同様に今度はS列の行より、R列の行のほうが下にあるものだけを組み合わせ、下行と上行の組み合わせは無視します。

    *********** 文字数オーバーにより 2枚目の補足に続きます *****************

    「エクセル マクロ? VBA? かなり難し」の補足画像1
      補足日時:2020/09/13 20:17
  • うーん・・・

    次に特別措置例の列の文字と合致するもののみ、行を入れ替えます。
    U列にあればV列に、V列にあればU列に)

    但し、入れ替える時に条件があります。

    例として挙げると、U列にaaabbbがあり、それが特別措置の列にあった場合、bbbaaaと入れ替えてV列に転記します。
    (黄色で囲ったものがそれに該当する例です)

    ※特別措置例のに記載される文字行数は30行程度になります。
    また、ボタンクリックではなく、元データが変更された瞬間に再表示してくれるものが希望です。

    工程は以上です、説明不足でお手数をお掛け致しましたが、どうぞよろしくお願い致します。

    「エクセル マクロ? VBA? かなり難し」の補足画像2
      補足日時:2020/09/13 20:26
  • へこむわー

    訂正します

    2補足目

    >>>次に特別措置例の列の文字と合致するもののみ、行を入れ替えます。

    行ではなく列でした。

    すみません。

      補足日時:2020/09/13 21:36
  • 回答頂いたお二方、ありがとうございました。
    教えてGooのほうから締め切りのメッセージが来ましたので、再質問させて頂きます。

      補足日時:2020/09/14 19:48
  • どう思う?

    締め切られそうなんで一応新しい質問をさせて頂きました。

    おヒマな時にでも教えて頂ければ嬉しいです。

    https://oshiete.goo.ne.jp/qa/11893404.html

    ありがとうございました。

      補足日時:2020/09/15 16:22

A 回答 (4件)

No1です。



>もう一度見直してみて、再質問させて頂こうと思います。
追加情報なり、再質問なりがあるのかと様子を見ていましたが、なさそうなので・・・

◇No1へのお礼で
>パターンにもあります通り3×5で15通りでは無いでしょうか?
失礼しました。単純な、計算間違えでした。
しかしながら、U列、R列とも組合わせの数は基本的に同じになるはずと思いますが、例示の添付図では数が異なっています。(U列の方が数が少ない)

>2の処理の時にU列に転記したものと重複したら無視して転記しません。
ご質問の本文にはこの情報はありませんが、それに従ったとしても、V列の数が少なくなることはあっても、U列の数が少なくなることは無いものと思いますが??

不明点が残っていますが、勝手に以下のように再構成しました。
●R列、S列(17行目以降)について、それぞれ重複を省いた文字列の種類を作成。
 (R列・S列間での重複は許す=チェックは行わない)
●それぞれの文字列群について全ての組合わせを以下の条件で作成する
 ・「R列+S列」の連結で全ての組合わせをU列に列挙する
 ・「S列+R列」の連結をV列に列挙するが、その際に、
   特別措置欄(X列)にあるもの及びU列に既に存在するものは省略する

補足なども含めて、整理し直すと上記のようになるのではないかと推測しました。
これに基づいて、コード化してみたものが以下です。

※ 特別措置のデータ位置はX列ということしかわからないので、直接範囲を指定する形にしてあります。

Sub Sample_11882421()
Dim rg As Range, rg1 As Range
Dim c1 As Range, c2 As Range, c3 As Range
Dim rw As Long, col As Long
Dim i As Long, s As String, n(2) As Long

Const specialData = "X17:X20" '←特別措置データのセル範囲

Const f1 = "=IFERROR(INDEX(R:R,AGGREGATE(15,6,ROW(A$17:A$@)/(R$17:R$@<>"""")/"
Const f2 = "(COUNTIF(OFFSET(R$17,,,ROW(A$17:A$@)-16,1),R$17:R$@)=1),ROW(A1))),"""")"

Set rg = ActiveSheet.UsedRange
col = Application.Max(rg.Cells(1, rg.Columns.Count).Column, 32)
rw = Application.Max(rg.Cells(rg.Rows.Count, 1).Row, 17)
Set rg = Range("R17").Resize(rw, 2).Offset(, col - 17)

rg.FormulaLocal = Replace(f1 & f2, "@", rw)
rg.Value = rg.Value
n(1) = WorksheetFunction.CountA(rg.Columns(1))
n(2) = WorksheetFunction.CountA(rg.Columns(2))
Set rg1 = rg(1).Offset(, 20 - col).Resize(n(1) * n(2), 1)

For i = 1 To 2
 Set c3 = Range("U17").Offset(, i - 1)
 For Each c1 In rg(i).Resize(n(i))
  For Each c2 In rg(3 - i).Resize(n(3 - i))
   s = c1.Text & c2.Text
   If i = 2 And (WorksheetFunction.CountIf(Range(specialData), s) + _
    WorksheetFunction.CountIf(rg1, s)) > 0 Then s = ""
   If s <> "" Then
    c3.Value = s
    Set c3 = c3.Offset(1)
   End If
  Next c2
 Next c1
Next i
rg.ClearContents
End Sub
    • good
    • 0
この回答へのお礼

こんにちは、何度も考えて頂き、ありがとうございます。

画像を複数枚に分けて説明させて頂こうと思っていました。

今、ちょっと多忙なもので、、、すみません。

ありがとうございます。

お礼日時:2020/09/11 14:25

shut0325です。


fujillinさんの回答及びお礼についても確認しました。

>最終的に出来上がった文字列がX列にあれば、すでに表記させた合成文字を再度前後逆にすると言う事です。
ということは、X列には特別措置をするデータリストが入力されているということでよいのでしょうか?
もしそうならば、そのように書かないとわかりません。

もちろんX列の記載方法はR列が左、S列が右、、というような規則に従ってかかれているのですよね?


また、「最終的に出来上がった文字列がX列にあれば」でなくて、もともとU列やV列のリスト生成時にその処理はできます。
先ほどの私が書いた処理手順にて、U列V列に書き込む前に判別して処理すればいいので。


fujillinさんのお礼のところで書かれている重複処理は不要です。

また、先の回答に書いた下記の点はどうなっていますでしょうか?
>>S列を先頭に持つ文字の組みあわせを 【R列の文字を先頭に】 V列に転記させます。
>実際にはそうなっていませんがなぜでしょう?



加えて「ちなみに元データの文字は3文字を上限に複数になる事もあります。」についてですが、
仮に 画像中の a が ゴリラ bが ラッパ の場合、 セルU17(現在の値:ba)は ラッパゴリラ でよいということでしょうか。
もしそうならば、文字数に関係なく何ら難しくありません。

しかし、そうではないのならば、どのような処理をするのか具体的にわからないとどうしようもありません。

fujillinさんもおっしゃられている通り、規則性があり、どのような条件で、どのような結果になるかさえわかれば何ら難しくありません。
    • good
    • 0
この回答へのお礼

再度の回答ありがとうございます。
もう一度見直してみて、再質問させて頂こうと思います。
ありがとうございます。

お礼日時:2020/09/10 08:32

法則性がよくわからないですね。



仮にR列の3つを「長男1」「次男1」「三男1」 そして それぞれの子供が親と同じく書かれている 並び順はRSともに年長者順 とみます。

その場合、U列は「自分以下の子世代」との組み合わせ ということでしょうか?
なので、ab/ac/ad/af/ag ef/eg そして、hは子がいないので無記載。これをリストAとします。
画像とは(ひっくり返しは別として)同じですよね

次にV列は、「自分の親よりも下の兄弟」とのくみあわせ ということでよいでしょうか?
なので、be/bh ce/ch de/dh fh gh  これがリストB
これも画像とはひっくり返しを別として同じです。

ここからが良くわかりません。

>S列を先頭に持つ文字の組みあわせを 【R列の文字を先頭に】 V列に転記させます。

実際にはそうなっていませんがなぜでしょう?

>V17以下に記載されている文字の組み合わせの場合のみ、黄色で表示された様に左右逆に(abならba、afならfa)表示

これが全く意味不明です。

仮に、ひっくり返す条件をR側は「自分以下の兄弟の長子の組み合わせの場合は表記反転」ならば、

ab/af は反転できます。
しかしながら、chとegには反転させるための条件が見出せません。
    • good
    • 0
この回答へのお礼

こんにちは、考えて頂きありがとうございます。

No1の方のお礼にも書かせて頂きましたが、R列を先に処理して、S列を処理する時に重複を無視して、最終的に出来上がった文字列がX列にあれば、すでに表記させた合成文字を再度前後逆にすると言う事です。

お礼日時:2020/09/09 14:09

こんにちは



内容的には「組み合わせの列挙」で済みそうですからさほどのことは無いと思いますけれど、ご説明の内容がよくわかりませんね。

結局のところ、R列、S列の値は位置関係等は関係なく、出現している値の組み合わせを考えれば良いだけと解釈しましたが、ご提示の具体例とはまったく一致しません。
添付図に基づけば、まずは、[a,e,h]と[b,c,d,f,g]の全組合せを前後入替えて列挙(特にV列はそのまま)すれば良さそうですが、それだと3×4=12通りずつになるはずが、まったくそうはなっていません。

また、R列とS列に同じ値が存在した場合(例ではありませんが)の取り扱いについての記載がないのと、さらには
>V17以下に記載されている文字の組み合わせの場合のみ~
の判定方法も曖昧です。
例えば
 「AB」と「C」という値を連結して「ABC」とした場合、「C」、「AB」の連結である「CAB」は同じ組み合わせと判断することは推測できますが。「CA」と「B]の連結結果の「CAB」の扱いはどうするのかなどなど、
>元データの文字は3文字を上限に複数になる事もあります。
なので、最大6文字の連結文字において、起こり得る全事象に対してどのような判断をするのかが不明です。


>かなり難しいと思うので、~~
きちんと整理さえできれば、さほど難しくはないと思われます。

重複の判断をどうするのか等も不明ですが、基本的には、
 1)それぞれの列(R、S)内で出現する値の配列を作成
 2)2つの配列を総当たりで組合せて、連結文字列を列挙
 3)前後逆転の処理(?) ←内容不明なのでよくわかりませんが…
といった感じでできるのではないでしょうか。
    • good
    • 0
この回答へのお礼

こんにちは、考えて頂きありがとうございます。

U,Vに記載される文字列数は組み合わせパターンにもあります通り3×5で15通りでは無いでしょうか?

内容が解りにくかったですね、以下の説明と同義なので表現を変えて説明させて頂きます。

R列、S列の値は位置関係等は関係ないと言う前提で説明すると、処理の順番が重要になります。

1. R列を先頭に持つ文字列の合成パターンを、U列に転記します。
2. S列を先頭に持つ文字列の合成パターンを、前後逆にしてV列に表記します。
ただし、2の処理の時にU列に転記したものと重複したら無視して転記しません。

最終的に出来上がったU、Vの文字列が特別措置例の記載と同じもののみ、再度前後の文字を入れ替える、と言う事です。

如何でしょうか?

お礼日時:2020/09/09 14:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A

このカテゴリの人気Q&Aランキング