Excel VBA質問箱 IV

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

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


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

【51525】変数の取得について 多摩川 07/9/21(金) 17:15 質問[未読]
【51526】Re:変数の取得について ハチ 07/9/21(金) 17:32 発言[未読]
【51533】Re:変数の取得について 多摩川 07/9/21(金) 23:47 お礼[未読]

【51525】変数の取得について
質問  多摩川  - 07/9/21(金) 17:15 -

引用なし
パスワード
   セルの値を変数1に格納し、次のセルの値を変数2に格納。
変数2>変数1の時、Trueを返すようなコードを作成しました。

Sub test1()
  Dim ws As Worksheet
  Dim aaa() As Long
  Dim i As Long
  Set ws = ThisWorkbook.Sheets(1)
  ws.Range("b:c").ClearContents
  ws.Range("c1:c20").Value = [{1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20}]
  For i = 1 To ws.Range("C1").End(xlDown)
    ReDim Preserve aaa(i): aaa(i) = ws.Cells(i, 3)
    If aaa(i) > aaa(i - 1) And aaa(i - 1) <> 0 Then ws.Cells(i, 2) = "True"
  Next i
End Sub

上記のコードでは全て True を得られます。

次に、セルからの取得ではなく、ファイルから値を取得し、
上記と同じように True を得るコードを作成しました。
aaa.txt は 1, 2, ・・・,20 と1行毎に数値があるとします。

Sub test2()
  Dim ws As Worksheet
  Dim Ln As String
  Dim aaa() As Long
  Dim i As Long
  Set ws = ThisWorkbook.Sheets(1)
  i = 0
  ws.Range("a:a").ClearContents
  Open "aaa.txt" For Input Access Read As #1
  Do Until EOF(1)
    Line Input #1, Ln
    i = i + 1
    ReDim aaa(i): aaa(i) = LTrim(Left(Ln, 8))
    If i > 1 Then
      If aaa(i) > aaa(i - 1) And aaa(i - 1) <> 0 Then ws.Cells(i, 1) = "True"
    End If
  Loop
  Close
End Sub

やっていることは、同じだと思っているのですが、
test2 では True が得られません。
原因を教えていただけないでしょうか?
よろしくお願いします。

【51526】Re:変数の取得について
発言  ハチ  - 07/9/21(金) 17:32 -

引用なし
パスワード
   ▼多摩川 さん:
>セルの値を変数1に格納し、次のセルの値を変数2に格納。
>変数2>変数1の時、Trueを返すようなコードを作成しました。
>
>Sub test1()
>  Dim ws As Worksheet
>  Dim aaa() As Long
>  Dim i As Long
>  Set ws = ThisWorkbook.Sheets(1)
>  ws.Range("b:c").ClearContents
>  ws.Range("c1:c20").Value = [{1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20}]
>  For i = 1 To ws.Range("C1").End(xlDown)
>    ReDim Preserve aaa(i): aaa(i) = ws.Cells(i, 3)
>    If aaa(i) > aaa(i - 1) And aaa(i - 1) <> 0 Then ws.Cells(i, 2) = "True"
>  Next i
>End Sub
>
>上記のコードでは全て True を得られます。
>
>次に、セルからの取得ではなく、ファイルから値を取得し、
>上記と同じように True を得るコードを作成しました。
>aaa.txt は 1, 2, ・・・,20 と1行毎に数値があるとします。
>
>Sub test2()
>  Dim ws As Worksheet
>  Dim Ln As String
>  Dim aaa() As Long
>  Dim i As Long
>  Set ws = ThisWorkbook.Sheets(1)
>  i = 0
>  ws.Range("a:a").ClearContents
>  Open "aaa.txt" For Input Access Read As #1
>  Do Until EOF(1)
>    Line Input #1, Ln
>    i = i + 1
>    ReDim aaa(i): aaa(i) = LTrim(Left(Ln, 8))
>    If i > 1 Then
>      If aaa(i) > aaa(i - 1) And aaa(i - 1) <> 0 Then ws.Cells(i, 1) = "True"
>    End If
>  Loop
>  Close
>End Sub
>
>やっていることは、同じだと思っているのですが、
>test2 では True が得られません。
>原因を教えていただけないでしょうか?
>よろしくお願いします。

ReDim Preserve aaa(i)

ReDim aaa(i)

の違いはわかりますか?
前の値を初期化してしまってますよ。

Long型の初期値は 0です。
なので And条件でひっかかりますね。

【51533】Re:変数の取得について
お礼  多摩川  - 07/9/21(金) 23:47 -

引用なし
パスワード
   ▼ハチ さん:
こんばんは。
回答いただき、ありがとうございます。

>Long型の初期値は 0です。
0 になって一致せず、困っていました。
Preserve の意味も調べず、普段は、機械的に ReDim Preserve をセットとして
扱っており、test2 ではたまたま書き忘れてしまったようです。
しかし、このことが改めてPreserve の意味を知るいい機会となりました。
質問してよかったです。

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

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