電子書籍の厳選無料作品が豊富!

図のような、ます計算のシートを作成しています。
ネット上には色々な手段でサンプルのシートがあるのは承知の上です。

引き算シートの作成で数字を重ねず、かつ幅を持たせた配置をしたいと考えています。
具体的には、B3からE3までの数字を、8から19までで重複せずに配置したいといった考えです。

rand関数、randbetween関数、rank関数を足し引きなどの組み合わせて並べていますが、
どうしても同じ数字や隣りあわせが1違いなどで並んでしまうことがあり、問題が解きやすく
なってしまっているのが現状です。

vbaで重複のフラグを立てて、再抽選みたいな方法と考えているのですが…
ループ処理になるのかなとは思うのですが、代入のvbaまでは思いつくのですが、
再抽選以降が自分には思いつかないです。

vba、もしくはそれ以外でのヒントを教えていただければと思います。
よろしくお願いします。

「エクセル 同じ行の隣り合う数字の幅を広げ」の質問画像

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

  • その次の説明文に、同じ数字が重なってしまう現象について書いてありますよね?

    No.1の回答に寄せられた補足コメントです。 補足日時:2025/01/24 20:45
  • 隣の数が1違いだったら、難しい計算しなくても隣の数字±1で解けるので、解きやすくなってますよね?

    No.2の回答に寄せられた補足コメントです。 補足日時:2025/01/24 20:47
  • 質問の趣旨の捉え違いです

    No.4の回答に寄せられた補足コメントです。 補足日時:2025/01/24 20:49

A 回答 (5件)

下記URLにアップしました。


コピーして使用してください。
マクロは標準モジュールに登録してください。
https://ideone.com/HCijUN


ランダムな整数の配列を作るために、汎用的な関数GetRandArrayを作成して呼び出しています。
この関数の引数は、以下のようになります。
GetRandArray(整数の下限値,整数の上限値,配列の要素数,隣り合う要素の差の最小値)
今回は、「8~19の範囲の整数を4個欲しい、又、要素間の差は2以上にしたい。」ということなので
randval = GetRandArray(8, 19, 4, 2)
として、GetRandArrayを呼び出します。
randval は、必ずVariant型で定義します。
Dim randval As Variant のように定義します。
結果として、randvalには、4つの整数が格納されます。
randval(1)・・・1番目の整数
randval(2)・・・2番目の整数
randval(3)・・・3番目の整数
randval(4)・・・4番目の整数
となります。
このrandval(1)~randval(4)をB3~E3に格納しています。
尚、取得に失敗した場合は、全ての要素に0が返ります。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
マクロ、確認させていただきました。
私が思っていたよりもずっと複雑なプログラミングになってしまいましたね。一行ずつ確認させてもらい、条件式の意味合いを理解させてもらいました。

あと、マスが同じシート内に4つあるので、こちらは乱数設定のプログラムの一部をコピー&セル番地変更で修正し、つなげて記述させてもらいました。

まだまだ奥が深いですね。でも、こうやって動かせることは素晴らしいです。ありがとうございました。

お礼日時:2025/01/27 17:39

》 数字を重ねず、かつ幅を持たせた配置をしたい


1.数値の桁数が最多の列を選択して、
 ̄ ̄マウスの右クリック⇒[列の幅]を読み取る(例: 8)
2.列範囲 A:E を選択⇒[列の幅]の空欄に数値 8 を入力⇒[OK]をツン
オ・シ・マ・イ
この回答への補足あり
    • good
    • 0

こんばんは



B3:E3の値(8~19)で
 ・値の重複がない
 ・隣り合う値の差が2以上である
を満たせばよいものと解釈しました。

左側から順に計算してゆくものとして、セルの値を決める際の条件の表現を若干変えて、
 ・既出の値と重複しない
 ・左隣のセル値との差が2以上である
を満たす値をランダムに決めてゆけば、同じ結果が得られるはずです。

ヒントとしては以上になります。


当方の確認のため、関数で実際に試してみました。
スピル機能が使えるバージョン(=Office365等)を想定してよければ、上記の条件をそのまま記述して、
1)B3セルに
 =RANDBETWEEN(8,19)
2)C3セルに
=LET(n,ROW(8:19),a,FILTER(n,(COUNTIF($B3:B3,n)=0)*(ABS(B3-n)>1)),INDEX(a,RANDBETWEEN(1,COUNT(a))))
の式を入力し、E3セルまで右方にフィルコピー

することで可能と思います。

※ RND関数を使っているため、計算が「自動計算」になっているとB4:E7に何かを入力すると再計算されてしまいますが、ご質問文でもRAND関数に触れられているので、それは構わないものと解釈しました。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
エクセルバージョン書き忘れてました。2019です。
すみません、filter関数が使えないようで・・・

お礼日時:2025/01/27 17:47

》 問題が解きやすくなってしまっているのが現状です。


意味不明になってませんかッ?!
この回答への補足あり
    • good
    • 0

》 8から19までで重複せずに配置したいといった考えです


何ですってッ!?
既に17が重複してるじゃないですか?
この回答への補足あり
    • good
    • 0

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

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


おすすめ情報

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