Excel VBA質問箱 IV

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

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


10776 / 13646 ツリー ←次へ | 前へ→

【19535】Do・・・While・・・Loopを使って連番処理 YN61 04/11/7(日) 16:20 質問[未読]
【19536】Re:Do・・・While・・・Loopを使って連番処... かみちゃん 04/11/7(日) 16:25 回答[未読]
【19539】Re:Do・・・While・・・Loopを使って連番処... YN61 04/11/7(日) 17:20 お礼[未読]
【19542】Re:Do・・・While・・・Loopを使って連番処... ちゃっぴ 04/11/7(日) 19:04 発言[未読]
【19634】Re:Do・・・While・・・Loopを使って連番処... YN61 04/11/11(木) 19:33 お礼[未読]
【19683】Re:Do・・・While・・・Loopを使って連番処... YN61 04/11/14(日) 21:28 質問[未読]
【19684】Re:Do・・・While・・・Loopを使って連番処... ちゃっぴ 04/11/14(日) 21:57 回答[未読]
【19715】Re:Do・・・While・・・Loopを使って連番処... YN61 04/11/15(月) 21:20 お礼[未読]
【19947】Do・・・While・・・Loopを使って連番処理 YN61 04/11/19(金) 20:01 お礼[未読]
【19954】Re:Do・・・While・・・Loopを使って連番処... ちゃっぴ 04/11/19(金) 22:30 回答[未読]

【19535】Do・・・While・・・Loopを使って連番処理
質問  YN61  - 04/11/7(日) 16:20 -

引用なし
パスワード
   選択セルの部分に連番を入れたいのですが・・・
1を2のDo・・・Loopの書き方にすると、範囲選択以外の最初のセルに0が入ります。
しかも範囲選択の最後のところに連番が入りません。(50が最終の連番とすると
49までしか入りません)

Do・・・Loopをできるだけシンプルに直すには、どのような対処の仕方が良いの
でしょうか。
誠に失礼ではありますが、ポイントのご説明をつけて改善の仕方を教えてください。


1.For・・・Nest

Sub 連番1()
Dim i As integer
For i = 1 to Selection.Cells.Count
  Selection.cells(i)=i
Next
End Sub

2.Do・・・While

Sub 連番2()
Dim i As Integer
  Do While i < Selection.Cells.Count
   Selection.Cells(i) = i
 i = i + 1
 Loop
End sub

【19536】Re:Do・・・While・・・Loopを使って連番...
回答  かみちゃん  - 04/11/7(日) 16:25 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>誠に失礼ではありますが、ポイントのご説明をつけて改善の仕方を教えてください。

決定的な違いは、Do・・・While のときは、For・・・Next のときのように i=1 としていません。
Dim i As Integer のあとに i=1 としてみてください。
これがなければ、i は宣言しただけで 0 とみなされています。

【19539】Re:Do・・・While・・・Loopを使って連番...
お礼  YN61  - 04/11/7(日) 17:20 -

引用なし
パスワード
   ▼かみちゃん さん

早速の回答ありがとうございました。

よく理解できました。早速直しましたら、思い通りのとおり
出来ました。

このDo・・・WhileとFor・・・Nestの二種類の構文は、この種の
内容の類であれば両方の使い方ができると理解しても良いのでしょうか。
ありがとうございました。
今後ともよろしくお願いします。


>決定的な違いは、Do・・・While のときは、For・・・Next のときのように i=1 としていません。
>Dim i As Integer のあとに i=1 としてみてください。
>これがなければ、i は宣言しただけで 0 とみなされています。

【19542】Re:Do・・・While・・・Loopを使って連番...
発言  ちゃっぴ  - 04/11/7(日) 19:04 -

引用なし
パスワード
    >このDo・・・WhileとFor・・・Nestの二種類の構文は、この種の
>内容の類であれば両方の使い方ができると理解しても良いのでしょうか。

まあ、できないことはないですが、行う内容によって変わってくると思います。

YN61さんが書いた連番を引くような単純なものでしたら、
わざわざDo 〜 Loopを使う必要ありませんし・・・

また、下記のようなオーソドックスなMatchingアルゴリズムを
For 〜 Next ループで書く人いないでしょう。

Dim vntList1 As Variant
Dim vntList2 As Variant
Dim i As Long, j As Long

Do
  Select Case vntList1(i) - vntList2(j)
    Case 0
      '処理1
      i = i + 1
      j = j + 1
    Case > 0
      '処理2
      j = j + 1
    Case < 0
      '処理3
      i = i + 1
  End Select
Loop While i < UBound(vntList1) And j < UBound(vntList2)

【19634】Re:Do・・・While・・・Loopを使って連番...
お礼  YN61  - 04/11/11(木) 19:33 -

引用なし
パスワード
   ▼ちゃっぴ さん:

Do・・・Loopに関して色々とご指導ありがとうございました。

MatchingのアルゴリズムをDo…Loopで書かれている
このコードはどのような意味を指すのでしょうか?

興味がつのりますので、教えて頂けませんでしょうか。
よろしくお願いします。

いつもご迷惑をおかけしまして、申し訳ございません。


>また、下記のようなオーソドックスなMatchingアルゴリズムを
>For 〜 Next ループで書く人いないでしょう。
>
>Dim vntList1 As Variant
>Dim vntList2 As Variant
>Dim i As Long, j As Long
>
>Do
>  Select Case vntList1(i) - vntList2(j)
>    Case 0
>      '処理1
>      i = i + 1
>      j = j + 1
>    Case > 0
>      '処理2
>      j = j + 1
>    Case < 0
>      '処理3
>      i = i + 1
>  End Select
>Loop While i < UBound(vntList1) And j < UBound(vntList2)

【19683】Re:Do・・・While・・・Loopを使って連番...
質問  YN61  - 04/11/14(日) 21:28 -

引用なし
パスワード
   ▼ちゃっぴ さん:

Do・・・Loopに関して色々とご指導ありがとうございました。

MatchingのアルゴリズムをDo…Loopで書かれている
このコードはどのような意味を指すのでしょうか?

興味がつのりますので、教えて頂けませんでしょうか。
よろしくお願いします。

いつもご迷惑をおかけしまして、申し訳ございません。


>また、下記のようなオーソドックスなMatchingアルゴリズムを
>For 〜 Next ループで書く人いないでしょう。
>
>Dim vntList1 As Variant
>Dim vntList2 As Variant
>Dim i As Long, j As Long
>
>Do
>  Select Case vntList1(i) - vntList2(j)
>    Case 0
>      '処理1
>      i = i + 1
>      j = j + 1
>    Case > 0
>      '処理2
>      j = j + 1
>    Case < 0
>      '処理3
>      i = i + 1
>  End Select
>Loop While i < UBound(vntList1) And j < UBound(vntList2)

【19684】Re:Do・・・While・・・Loopを使って連番...
回答  ちゃっぴ  - 04/11/14(日) 21:57 -

引用なし
パスワード
   >MatchingのアルゴリズムをDo…Loopで書かれている
>このコードはどのような意味を指すのでしょうか?

そんな難しいものではありませんよ。
配列vntList1とvntList2があり、双方のDataがSort済みであるとします。
(わかりやすいように、dataはすべて数値だとします。)

で、最初から順番に大小を比べていくわけですが、
vntList1が大きい場合には、vntList2のDataを一個進める
vntList1が小さい場合には、vntList1のDataを一個進める
双方が一致した場合には処理を行う
こんな感じです。

このようなアルゴリズムですと、Data全件をMatchingするのに
双方の配列の要素数だけLoopすることになるので、処理が高速化されます。

つまり、Loop回数は
vntList1の要素数 + vntList2の要素数 回

2重Loopして全件Matchingするときとでは速度がダンチです。

For i = 1 To UBound(vntList1)
  For j = 1 To UBound(vntList2)
    If vntList1(i) = vntList(j) Then
  Next j
Next i

これだと、vntList1の要素数 * vntList2の要素数 回
Loopすることになりますよね?

【19715】Re:Do・・・While・・・Loopを使って連番...
お礼  YN61  - 04/11/15(月) 21:20 -

引用なし
パスワード
   ▼ちゃっぴ さん:

色々とご指導ありがとうございます。
お忙しい中、ご返事いただき感謝しています。

益々難しいご返事いただいたような感じです。
先ずはこの内容はぼんやりと分かりました。しかし
実際どのような比較をしているのか分かりません。


>そんな難しいものではありませんよ。
>配列vntList1とvntList2があり、双方のDataがSort済みであるとします。
>(わかりやすいように、dataはすべて数値だとします。)
>
>で、最初から順番に大小を比べていくわけですが、
>vntList1が大きい場合には、vntList2のDataを一個進める
>vntList1が小さい場合には、vntList1のDataを一個進める
>双方が一致した場合には処理を行う
>こんな感じです。
>
>>これだと、vntList1の要素数 * vntList2の要素数 回
>Loopすることになりますよね?


→実際にはどのようなList比較するのでしょうか?
セルの位置などこれでわかるのでしょうか?

エクセルのセルに具体的にどのような数字を入れて
このコードを動かせるのでしょうか?
もし時間がありました、よろしくお願いします。

【19947】Do・・・While・・・Loopを使って連番処理
お礼  YN61  - 04/11/19(金) 20:01 -

引用なし
パスワード
   ▼ちゃっぴ さん:

色々とご指導ありがとうございます。
お忙しい中、ご返事いただき感謝しています。

益々難しいご返事いただいたような感じです。
先ずはこの内容はぼんやりと分かりました。しかし
実際どのような比較をしているのか分かりません。


>そんな難しいものではありませんよ。
>配列vntList1とvntList2があり、双方のDataがSort済みであるとします。
>(わかりやすいように、dataはすべて数値だとします。)
>
>で、最初から順番に大小を比べていくわけですが、
>vntList1が大きい場合には、vntList2のDataを一個進める
>vntList1が小さい場合には、vntList1のDataを一個進める
>双方が一致した場合には処理を行う
>こんな感じです。
>
>これだと、vntList1の要素数 * vntList2の要素数 回
>Loopすることになりますよね?


→実際にはどのようなList比較するのでしょうか?
セルの位置などこれでわかるのでしょうか?

エクセルのセルに具体的にどのような数字を入れて
このコードを動かせるのでしょうか?
もし時間がありました、よろしくお願いします。

【19954】Re:Do・・・While・・・Loopを使って連番...
回答  ちゃっぴ  - 04/11/19(金) 22:30 -

引用なし
パスワード
   ▼YN61 さん:
>▼ちゃっぴ さん:
>
>色々とご指導ありがとうございます。
>お忙しい中、ご返事いただき感謝しています。
>
>益々難しいご返事いただいたような感じです。
>先ずはこの内容はぼんやりと分かりました。しかし
>実際どのような比較をしているのか分かりません。

>→実際にはどのようなList比較するのでしょうか?
>セルの位置などこれでわかるのでしょうか?

配列を2次元にしてやればできますよね?
1要素目を行番号、2要素目を値にしてやればいいので・・・

>エクセルのセルに具体的にどのような数字を入れて
>このコードを動かせるのでしょうか?
>もし時間がありました、よろしくお願いします。

こんな感じのデータです。

1    3    5    7    9    11    13    255
1    2    3    4    5    6    7    255

WorkSheet関数だとVlookupとかMatchとか使ってやる作業ですね。
このアルゴリズムは文字列でも使えますが、Sortにちょっとコツがいります。
(Excelの文字列Sortは純粋な文字コード順ではないので・・・
つまり、自作Sort関数が必要ってこと)

最近、急に忙しくなったのでこれで・・・
Exchange Server の配信拒否を設定するScript書かなきゃならん・・
便乗質問ですが、詳しい方ご教授願います。
(CDOとか、ADSIとか・・・)

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