Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


567 / 13645 ツリー ←次へ | 前へ→

【79629】住所をいい感じに区切る りった 18/2/21(水) 15:12 質問[未読]
【79635】Re:住所をいい感じに区切る γ 18/2/22(木) 0:07 発言[未読]
【79637】Re:住所をいい感じに区切る りった 18/2/22(木) 10:53 お礼[未読]
【79647】Re:住所をいい感じに区切る γ 18/2/24(土) 10:43 回答[未読]
【79660】Re:住所をいい感じに区切る りった 18/3/1(木) 16:40 お礼[未読]

【79629】住所をいい感じに区切る
質問  りった  - 18/2/21(水) 15:12 -

引用なし
パスワード
   1つのセルに記載されいている住所(英語)を、いい感じに区切って4つのセルに出力します。
入力セルの住所は、文節がカンマで区切られています。
(カンマは4つ以上あり得るので、複数の文節を1セルに出力することもあります。)
出力セルの区切りは、カンマの位置です。

「いい感じ」の定義は下記です。(※)
1.区切り方候補1における最大長の出力セルの文字数が
 区切り方候補2における最大長の出力セルの文字数より大きければ
 区切り方2の方がいい感じです。
2.1.で決着つかなかった場合、2番目に長い出力セルの文字数で比較します。

現状のアルゴリズムは、1セル最大35文字で、文節区切りの前倒しです。
(1セル目に入りきらなくなったら、文節単位で区切って2セル目。)

どんなふうに作ればよろしいでしょうか?
なにかアドバイスをお願いします。

※ 場合によっては変更可能なので、他にあればご提案ください。

以下、例です。
入力セル:AAAAAAA CENTRE,BBBBBBBBBBBB AVENUE,CCC STREET,LANCASHIRE,FY5 4QD,UNITED KINGDOM

(現状)
出力セル1:AAAAAAA CENTRE BBBBBBBBBBBB AVENUE
出力セル2:CCC STREET LANCASHIRE FY5 4QD
出力セル3:UNITED KINGDOM
出力セル4:(空欄)

(いい感じ)
出力セル1:AAAAAAA CENTRE
出力セル2:BBBBBBBBBBBB AVENUE
出力セル3:CCC STREET LANCASHIRE
出力セル4:FY5 4QD UNITED KINGDOM

【79635】Re:住所をいい感じに区切る
発言  γ  - 18/2/22(木) 0:07 -

引用なし
パスワード
   余り難しく考えずに、
すべての組み合わせを検証する
いわゆる"貪欲法"でいったらどうでしょうか。
計算そのものは、さして難しくないはずです。

【79637】Re:住所をいい感じに区切る
お礼  りった  - 18/2/22(木) 10:53 -

引用なし
パスワード
   回答ありがとうございます。

【79647】Re:住所をいい感じに区切る
回答  γ  - 18/2/24(土) 10:43 -

引用なし
パスワード
   カンマで文節を区切ったうえで、それぞれの文字数をカウントしておきます。

4行になるものとし、各行の最後の文節のインデックスを、定めればよいわけです。
それらを k1,k2,k3,n (n はこの場合6です)とすると、
5個のなかから3個を取り出す組み合わせですから、10ケースです。
それを しらみつぶし に検証すればよいだけです。

例えば、こんな感じ。

  '組み合わせを列挙。
  '4行になるものとし、各行に含まれる最後の文節のインデックスを、
  'それぞれ、k1,k2,k3,n として、すべての組み合わせを列挙します。
  
  myMin = 1000
  For k1 = 1 To n - 3
    For k2 = k1 + 1 To n - 2
      For k3 = k2 + 1 To n - 1
        '各区分の長さの最大値を最小となる組み合わせを調べます
        以下略

もう解決したと思いますが。

【79660】Re:住所をいい感じに区切る
お礼  りった  - 18/3/1(木) 16:40 -

引用なし
パスワード
   追伸来ていることに今気が付きました。

下記で出来ました。

for 行1 1〜全文節数
for 行2 1〜全文節数
 for 行3 1〜全文節数
  for 行4 1〜全文節数
  合計文節数チェック
  ベストスコアだったら区切り方保存
  next
 next
next
next

スコア = 最大行の文字数 * 1000000000 + 2位の文字数 * 1000000 + 3位の文字数

567 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free