![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
いつもお世話になっております。よろしくお願いします。
Excelでしりとりを作りたいです。
100個ほどの単語があるとします。
最初の文字と最後の文字を抽出することが可能ですよね?
それを踏まえてそれらをつないでしりとりを作る事は可能でしょうか?
結果的に100個の単語が全部繋がらなくてもそれは仕方がないのですが、なるべく長くしりとりでつながると理想的です。
極力同じ言葉は二度と使わないようにしたいですが、使うことでしりとりが長くつながるのであればそれはそれで構わないです。
ちなみに添付画像のA2は「き」で繋げ、A14は「じ」で繋ぐというように、いまは後ろから2つ目の文字で繋げていますが、
仲間内で使うだけなので、そのあたりはあいまいでも差支えないです。
できれば関数などで簡単にできれば良いのですが、何かマクロなどを使わないといけなかったりVBなどを使わないといけないのであればなるべく簡単な方法を教えてください。
![「Excelでしりとりを作る方法」の質問画像](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/3/765806_5d0d96e17f9c2/M.jpg)
No.13ベストアンサー
- 回答日時:
おはようございます
ん~~~③のIfIfは恐らくペーストミスだと思いますのでスルーしますが、あとは大体あってる気がします。
ただ書出処理のIf文が上下混在しているようにも受け取れますがw
そうなんですよ!
文字数制限がありますので、4000文字以上は書き込めません。
まあそんなに長いプログラムを作った私のせいですが・・・
なので、私が作成したExcelを下記URLよりダウンロードしてみて下さい
https://38.gigafile.nu/0708-dc5b6900d1d02af7fae9 …
パスワードはありませんが、ダウンロード有効期限は1週間です。
No.11
- 回答日時:
No.10です
お待たせしました!
修正は3か所です
①まずはプログラム冒頭のClearContentsの前後に退避と復帰を追加します
--------------------------------------------------------------------------------
strB = .Cells(1, 8).Value
.Range("H:H").ClearContents
.Cells(1, 8).Value = strB
--------------------------------------------------------------------------------
②次に■書出処理■の冒頭部分『If intO = 1 Then』の下の内容を書き換えて下さい
--------------------------------------------------------------------------------
If .Cells(1, 8).Value = "" Then
'先頭語句をランダム選出
intM = Int(Rnd() * intR)
If intM < 1 Then intM = 2
strB = .Cells(intM, 2).Value
Else
strB = Application.GetPhonetic(.Cells(1, 8).Value)
End If
--------------------------------------------------------------------------------
③最後は最終文字判定の部分
--------------------------------------------------------------------------------
If Right(strB, 1) = "ル" Or _
Right(strB, 1) = "ン" Or _
Right(strB, 1) = "ー" Then
strL = Left(Right(strB, 2), 1)
Else
strL = Right(strB, 1)
End If
--------------------------------------------------------------------------------
以上です
変更されたのは『H1に開始文字を入力してから実行するとその文字から始まる』
というもので、これは一覧に存在しない文字でも構いません。
①はH列を初期化していますので、入力文字を一旦退避してクリア後に復元しています。
②は先頭語句をランダム選出していましたが、H1が入力されている場合にはそのふりがなを取得する。
③は終了文字の除外に『ル』を追加しています。
これでいかがでしょうか?
No.9
- 回答日時:
No.7に関して
作成済みの表にカーソルを合わせた状態で、『挿入タブ』の『テーブル』を選択すると表がテーブルに変わり見た目も変化します。
この状態の時右端にタブが追加されているはずです。
『テーブルツール』『デザイン』というやつです。
ご確認ください。
No.8に関して
10個前後で終わる!
候補の語句数はいくつくらいありますか?
当方では556個の候補を用意し、検証では80~110程度が抽出されました。
仰られているのはVBAではなく関数のみの場合でのことでしょうか?
その場合だと私の方でもその程度の結果でした(;´・ω・)
なので高性能を目指してVBAを作成させていただいた限りです。
処理の度に結果が変動しますので、100個以下の場合にはやり直してみて下さい。
『開発タブ』『マクロ』『Sample』で動くようになっています。
マクロの利用方法が分からない場合には返信いただければご教授しますよ♪
No.8
- 回答日時:
ムキになったわけではないですが、サンプルコード作ってみました(笑)
C列以降は不要ですので削除して頂いて構いません
並べ替えた語句はH列に表示され、行き詰ると終了します
チョット長いですが、標準モジュールにそのまま張り付ければ動くようになっています
--------------------------------------------------------------------------------
Option Explicit
Option Base 1
Sub Sample()
Dim intR As Integer
Dim tblS() As Variant
Dim intS As Integer
Dim tblG() As Variant
Dim intG As Integer
Dim intL As Integer
Dim blnC As Boolean
Dim intM As Integer
Dim tblW(3) As Variant
Dim intO As Integer
Dim intD As Integer
Dim intB As Integer
Dim strB As String
Dim strL As String
With Sheet1
.Range("H:H").ClearContents
Application.ScreenUpdating = False
Randomize
'■初期処理■
intR = 2 '先頭行を設定
intS = 0 '管理用テーブルカウンタ初期化
intG = 0 'データテーブルカウンタ初期化
'■退避処理■
'最終語句まで読込
Do Until .Cells(intR, 2).Value = ""
'先頭文字の比較を行いそれぞれの件数を取得
blnC = False
For intL = 1 To intS
'先頭文字が一致したらカウントアップ
If Left(.Cells(intR, 2).Value, 1) = tblS(1, intL) Then
tblS(2, intL) = tblS(2, intL) + 1
tblS(3, intL) = tblS(2, intL)
blnC = True
Exit For
End If
Next intL
'一致しなかったら新規レコード作成
If blnC = False Then
intS = intS + 1
ReDim Preserve tblS(3, intS)
tblS(1, intS) = Left(.Cells(intR, 2).Value, 1)
tblS(2, intS) = 1
tblS(3, intS) = tblS(2, intS)
End If
'データテーブル最大値まで拡張
If intG < tblS(2, intL) Then
intG = intG + 1
ReDim Preserve tblG(100, 4, intG)
End If
'データ一時退避
tblG(intL, 1, tblS(2, intL)) = tblS(2, intL)
tblG(intL, 2, tblS(2, intL)) = Rnd()
tblG(intL, 3, tblS(2, intL)) = .Cells(intR, 1).Value
tblG(intL, 4, tblS(2, intL)) = .Cells(intR, 2).Value
'ランダムソート処理
If tblS(2, intL) < 2 Then
Else
For intM = tblS(2, intL) To 2 Step -1
If tblG(intS, 2, intM) < tblG(intS, 2, intM - 1) Then
tblW(1) = tblG(intL, 2, intM - 1)
tblW(2) = tblG(intL, 3, intM - 1)
tblW(3) = tblG(intL, 4, intM - 1)
tblG(intL, 2, intM - 1) = tblG(intL, 2, intM)
tblG(intL, 3, intM - 1) = tblG(intL, 3, intM)
tblG(intL, 4, intM - 1) = tblG(intL, 4, intM)
tblG(intL, 2, intM) = tblW(1)
tblG(intL, 3, intM) = tblW(2)
tblG(intL, 4, intM) = tblW(3)
End If
Next intM
End If
'次の行データ
intR = intR + 1
Loop
'■書出処理■
intO = 1
Do
If intO = 1 Then
'先頭語句をランダム選出
intM = Int(Rnd() * intR)
If intM < 1 Then intM = 2
strB = .Cells(intM, 2).Value
'管理テーブル検索
For intL = 1 To intS
If Left(strB, 1) = tblS(1, intL) Then
tblS(3, intL) = tblS(3, intL) - 1
If tblS(3, intL) = 0 Then Exit Do
Exit For
End If
Next intL
'データテーブル検索
For intD = 1 To tblS(3, intL) + 1
If strB = tblG(intL, 4, intD) Then
Exit For
End If
Next intD
Else
'管理テーブル検索
For intL = 1 To intS
If Right(strB, 1) = "ン" Or _
Right(strB, 1) = "ー" Then
strL = Left(Right(strB, 2), 1)
Else
strL = Right(strB, 1)
End If
If strL = tblS(1, intL) Then
tblS(3, intL) = tblS(3, intL) - 1
If tblS(3, intL) = 0 Then Exit Do
Exit For
End If
Next intL
'データテーブル検索
intD = Int(Rnd() * tblS(3, intL) + 1)
strB = tblG(intL, 4, intD)
End If
intO = intO + 1
.Cells(intO, 8).Value = tblG(intL, 3, intD)
'対象データ削除処理
For intB = intD To tblS(3, intL)
tblG(intL, 2, intB) = tblG(intL, 2, intB + 1)
tblG(intL, 3, intB) = tblG(intL, 3, intB + 1)
tblG(intL, 4, intB) = tblG(intL, 4, intB + 1)
Next intB
tblG(intL, 1, tblS(3, intL) + 1) = 0
tblG(intL, 2, tblS(3, intL) + 1) = 0
tblG(intL, 3, tblS(3, intL) + 1) = ""
tblG(intL, 4, tblS(3, intL) + 1) = ""
Loop
Application.ScreenUpdating = True
End With
End Sub
--------------------------------------------------------------------------------
解説用になるべくコメント付けています。お試しください
ここまで工夫いただいて、すごく感謝しています。
捕捉に使用した結果について記載しております。
現在、10個前後のしりとりができる状態で止まってしまいます。
この10個くらいの結果を自分で繋いでいくだけでも正直楽になったと思っています。
止まってしまう原因の単語を削除すればもっと違う組み合わせになるので、そうやって作って行けばいいです。
何のメリットでもないことをお願いするのは心苦しいので終わっていただいても構わないのですが、
本音としては(もう一声!)というところです。
でも、ほんとにほんとに、ありがとうございます!
No.7
- 回答日時:
No.4です
H3:=INDEX($A:$A,INDEX(テーブル1,MATCH($I2,$A:$A,0)-1,6))
ここでエラーになるのですか?
すみません(;´・ω・)テーブル1という部分ですが、作成した表を挿入タブのテーブルに変換してました(笑)
そこで作成したテーブル名(テーブルツールタブのデザイン)を『テーブル1』にしています。ちなみにテーブル範囲はA~Hです。お試しください
申し訳ございません、ちょっとついていけなくなっています。
「テーブルツールタブのデザイン」とはどちらのことでしょうか?
バージョンは2016を使用しています。
No.6
- 回答日時:
私も考えてみました。
>100個ほどの単語があるとします。
VBAでつくってみたものの、何かバグを抱えているようで、発表するには、まだもうひとつというところと、メモリの中で、処理するのか、セル上に書き出して使うのか、二者択一で迷っている状態です。書き出した方がよいには決まっています。ただ、処理するところが、なんとなく間が抜けているような気がします。一部の仕様は、下の内容と同じです。
添付画像は、マクロで出来たリスト。(見て分かる通り、全部のリストに充実していないけば、ネタ切れになってしまいます。)
本来は、人間との対戦型にしたいと考えました。
・その単語が、動詞や形容詞は不可とする。名詞か固有名詞に限ることにする。
・PC側の辞書は、50音の内、(ん・を)を除いた用語を用意する。
・架空の単語ではダメなので、インターネット検索で、例えば、gooの辞書を使い、判定する。
・語尾の「ん」は、負けとする。
最初、AIかと思いましたが、AIとは言えません。ただ、こちらの方は、出来上がるのに相当の時間が掛かりそうです。
![「Excelでしりとりを作る方法」の回答画像6](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/e/1138040_5d11e85aa20fe/M.jpg)
No.5
- 回答日時:
No.4です
この並べ替えではっきり分かりましたが
この方法だとあまり良い結果が得られませんね・・・
本来であればVBAで作成し、既に選択された語句は削除していく方法が好ましいのだと思います。
関数でやるのであればここら辺が限界なのでしょうか
もしかしたら他にもっと良い方法があるかもしれませんので、質問を継続しては如何でしょう・・・
お力になれず申し訳ありませんm(T^T)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- 統計学 統計分析とExcelに詳しい方、何卒よろしくお願いいたします。 6 2022/05/27 10:30
- 哲学 説得力を論理の強さまたは修辞の巧みさの2つに分析するにはどうすると良いでしょうか? 2 2022/06/27 05:51
- Excel(エクセル) 関数EXACT(文字列,文字列)とexcelVBA 3 2022/04/14 15:07
- 大学受験 大学受験英語の勉強法についてです どうしても英語長文の勉強ができません 初めて数分で絶対にやる気がな 2 2023/05/05 00:32
- Excel(エクセル) Excelで校閲をする方法はあるでしょうか(取扱説明書への掲載禁止用語の確認) 3 2022/06/11 22:51
- 留学・ワーキングホリデー リスニング力、はつきますか?6カ月語学学校行き数年間お金を稼いでまた、6カ月間語学留学に行くのは? 1 2023/02/11 15:49
- その他(ビジネス・キャリア) 仕事のレベル感 4 2022/07/23 21:41
- その他(セキュリティ) IDと暗証番号・パスワードの管理の画期的かつ簡単便利な方法を考案した。他人に検証してもらう方法は? 5 2023/02/08 08:49
- 英語 ソシュール言語観による品詞、単語、辞書理解の誤り 4 2022/11/24 12:27
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テーブル名が可変の場合のクエ...
-
SQLのテーブルにないデータの出力
-
結合したテーブルをSUMしたい
-
2つのテーブルでの合計取得
-
既存データをINSERT文にして出...
-
同一テーブル内での比較(最新...
-
SQLです!!教えてください。あ...
-
【SQL】他テーブルに含まれる値...
-
「都道府県の面積の大きい順に...
-
SQLです!!教えてください。あ...
-
Excelでしりとりを作る方法
-
「総降水量が100mm以上になる...
-
IDとパスワードについて。
-
SELECT INTOで一度に複数の変数...
-
pandasでsqlite3にテーブル作成...
-
mysqlのindexとprimary keyにつ...
-
1週間後の日付を求めたい
-
フラグをたてるってどういうこ...
-
オラクルのUPDATEで複数テーブル
-
参照数とはなんですか?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【SQL】他テーブルに含まれる値...
-
既存データをINSERT文にして出...
-
SQLで、Join句で結合したテ...
-
結合したテーブルをSUMしたい
-
テーブル名が可変の場合のクエ...
-
Accessの構成をコピーしたい
-
ACCESSのVBAにてExcelに行...
-
ExcelのMatch関数のようなもの...
-
ACCESS クエリーでソートの不具合
-
ExcelのVLOOKUP関数の動作をMyS...
-
データ無し時は空白行にしたい...
-
2つのテーブルをLIKE演算子のよ...
-
同一テーブル内での比較(最新...
-
ADO+ODBCでテーブルに接続する...
-
複数のテーブルからデータを取...
-
PRIMARY KEYのコピー
-
SQLです!!教えてください。あ...
-
改行を含んだデータのインポート
-
SQLです!!教えてください。あ...
-
Excelでしりとりを作る方法
おすすめ情報
ありがとうございます。
いま添付のようになりました。
次のワードだけがわかる形なんですね?
例えばH列に並べ替えて全部表示できたりできませんでしょうか。
H1:いす
H2:すとれす
H3:すぴーち
H4:ちきゅう
…といった感じで。
よろしくお願いいたします。
H1:いす
H2:すとれす
H3:すぴーち…
と表示させるには、
H1:=A1
H2:=A18
H3:=A19
と値が入ればいいわけですが、
H2:=A(F1の値)
H3:=A(F18の値)
とするための関数がわかりません。
説明が下手で申し訳ありませんが…
No.8のご回答につきまして。
実行しますと、エラーが出るのですが、
H列にはH2から
がいこく
くりこし
しっぱい
いじ
じゅうみん
みれん
れいぼう
うんめい
いふく
くじょう
うれのこり
りょうほう
うわき
きにいらない
いーめーる
と表示されています。
これは「る」で終わるとそのあとが繋がらなくて終わったのかなと、素人推察しています。
ただ、なぜ始まりが「がいこく」なのでしょうか?
もう一度実行してみたら、
いんすたんと
とう
うたがう
うれのこり
りかい
いーめーる
になりました。
ちなみに現在単語は736個入れています。
いま、3回実行してみました。
(1回目)
(H1:表示なし)
いんすたんと
とう
うたがう
うれのこり
りかい
いーめーる
(H1:表示なし)
(「いーめーる」を消去し2回目)
かいごふくしし
しゃぶしゃぶ
ぶか
かろりー
りすとら
らんぼう
うれのこり
りよう
うんえい
いれちがい
いやりんぐ
ぐたいてき
きほんきゅう
うまれつき
きゅうしょく
くさる
(「くさる」を消去し3回目)
(H1:表示なし)
わりかん
かべ
べてらん
らくご
ごうけい
いらい
いんふるえんざ
ざんぎょう
うりきれ
れいぎ
ぎかい
いきる
------------------------
700ちょっとの単語の中で、「る」で終わる単語が57個もありました。
・したがって「る」で終わるものはその前の文字で続けること
・最初の単語を指定できる
の2点ができると結構違うかもしれません。
①冒頭を下記にしました。
--------------------------------------------------------------------------------
With Sheet1
strB = .Cells(1, 8).Value
.Range("H:H").ClearContents
.Cells(1, 8).Value = strB
Application.ScreenUpdating = False
Randomize
'■初期処理■
--------------------------------------------------------------------------------
同じく②
--------------------------------------------------------------------------------
'■書出処理■
intO = 1
Do
If intO = 1 Then
If .Cells(1, 8).Value = "" Then
'先頭語句をランダム選出
intM = Int(Rnd() * intR)
If intM < 1 Then intM = 2
strB = .Cells(intM, 2).Value
Else
strB = Application.GetPhonetic(.Cells(1, 8).Value)
End If
'管理テーブル検索
--------------------------------------------------------------------------------
同じく③
'管理テーブル検索
For intL = 1 To intS
IfIf Right(strB, 1) = "ル" Or _
Right(strB, 1) = "ン" Or _
Right(strB, 1) = "ー" Then
strL = Left(Right(strB, 2), 1)
Else
strL = Right(strB, 1)
End If
Next intL
'データテーブル検索
--------------------------------------------------------------------------------
実行すると「インデックスが有効範囲にありません」
デバックを押すと
intD = Int(Rnd() * tblS(3, intL) + 1)
が黄色くなります。
そもそもコピーがうまくできているかが自信ないのですが、間違っておりませんでしょうか。
こちら、ソースを全部コピペってできないんですね…
使い方下手ですみません。
すみません、お返事ないな~と思っていましたら、わたしの捕捉が付いていませんでした!!!
大変失礼いたしました。
実行すると「インデックスが有効範囲にありません。」と表示されます。
ただ結果は出てくるのでそういった意味では問題ないです。
問題があるとすれば、同じ語がかなり頻繁に選択されるみたいです。
750語くらい入れているので、ひとつの文字について10個くらいはあるみたいですが、
これは仕方がないでしょうか。
いまは選ばれたものは手動で削除しています。
この点が仕様ということであれば、これで大丈夫です。
かなり満足しています<(_ _)><(_ _)><(_ _)>