Excel VBA質問箱 IV

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

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


10493 / 13644 ツリー ←次へ | 前へ→

【21449】変数の定義 ほい 05/1/21(金) 14:38 質問[未読]
【21452】Re:変数の定義 りすりす 05/1/21(金) 15:03 回答[未読]
【21457】Re:変数の定義 ほい 05/1/21(金) 16:12 質問[未読]
【21459】Re:変数の定義 G-Luck 05/1/21(金) 16:17 回答[未読]
【21508】Re:変数の定義 ほい 05/1/22(土) 1:37 質問[未読]
【21515】Re:変数の定義 ponpon 05/1/22(土) 10:58 回答[未読]
【21516】Re:セルが空でない場合に値を設定したい かみちゃん 05/1/22(土) 11:06 回答[未読]
【21517】Re:変数の定義 ほい 05/1/22(土) 11:27 お礼[未読]

【21449】変数の定義
質問  ほい  - 05/1/21(金) 14:38 -

引用なし
パスワード
   B2セルからB3、B4と下へセルの内容を確認し、セルが空でない場合はその右隣のセルの値を「1」にするマクロ(下記)をつくったつもりですが、「コンパイルエラー、変数が定義されていません」とエラーメッセージがでて「i = 1」のiに色がつきます。
どこをどのようにすれば動作するのか教えて下さい。(マクロのヘルプがインストールされていないエクセルを使用しています)

Option Explicit

Sub 数()
i = 1
Do Until IsEmpty(Range("b2").Offset(i - 1, 0)) = False
  cgd = Range("b2").Offset(i - 1, 0).Value
  With Range("c2").Offset(i - 1, 0).
    .Value = 1
  End With
  i = i + 1
 Loop
End Sub

【21452】Re:変数の定義
回答  りすりす  - 05/1/21(金) 15:03 -

引用なし
パスワード
   ▼ほい さん:
>B2セルからB3、B4と下へセルの内容を確認し、セルが空でない場合はその右隣のセルの値を「1」にするマクロ(下記)をつくったつもりですが、「コンパイルエラー、変数が定義されていません」とエラーメッセージがでて「i = 1」のiに色がつきます。
>どこをどのようにすれば動作するのか教えて下さい。(マクロのヘルプがインストールされていないエクセルを使用しています)
>
>Option Explicit
>
>Sub 数()
>i = 1
>Do Until IsEmpty(Range("b2").Offset(i - 1, 0)) = False
>  cgd = Range("b2").Offset(i - 1, 0).Value
>  With Range("c2").Offset(i - 1, 0).
>    .Value = 1
>  End With
>  i = i + 1
> Loop
>End Sub


Withの最後の . がいりません

この文だと
空なら、隣へ1を出力。
空でないなら、終了。
ずっと空なら1をはきつずけiが最終行越えるとエラー起こす

といった指令になってます。
修正が必要ですね。

【21457】Re:変数の定義
質問  ほい  - 05/1/21(金) 16:12 -

引用なし
パスワード
   >▼りすりす さん:

回答ありがとうございました。
でも、初心者なので「Withの最後の . がいりません」
とはどこをどう修正すればよいか理解できませんでした。

申し訳ありませんが、もう一度説明をお願いします。

【21459】Re:変数の定義
回答  G-Luck  - 05/1/21(金) 16:17 -

引用なし
パスワード
   Option Explicit
これは、定義しない変数を無効にする。ということです。
バグを未然に防ぐためには、大変重要だと思います。

で、エラーは、そのまま定義してくださいを言っていますね。

Dim Private static 等で使用する変数はすべて定義してください。

見ると

Dim i as long
Dim cgd as Variant

といったところでしょうか?
これを、sub 数() のすぐ下に書いてください。

【21508】Re:変数の定義
質問  ほい  - 05/1/22(土) 1:37 -

引用なし
パスワード
   りすりすさんとG-Luckさんから回答頂いた通りにやったつもりが下のマクロです。
お二人ともありがとうございます。

しかしエラーメッセージはなくなったものの
B2セルからB3、B4と下へセルの内容を確認し、
セルが空でない場合はその右隣のセルの値を「1」にする
という結果が得られません。

あと、どこをどのようにすれば良いのでしょうか?

Option Explicit
Sub 数()
Dim i As Long
Dim cgd As Variant
i = 1
Do Until IsEmpty(Range("b2").Offset(i - 1, 0)) = False
  cgd = Range("b2").Offset(i - 1, 0).Value
  With Range("c2").Offset(i - 1, 0)
    .Value = 1
  End With
  i = i + 1
 Loop
End Sub

【21515】Re:変数の定義
回答  ponpon  - 05/1/22(土) 10:58 -

引用なし
パスワード
   ▼ほい さん:
 おはようございます。ponponです。
>
>Option Explicit
>Sub 数()
>Dim i As Long
>Dim cgd As Variant
>i = 1
Do Until IsEmpty(Range("b2").Offset(i - 1, 0)) = true
                'false→true ↑
>  cgd = Range("b2").Offset(i - 1, 0).Value
>  With Range("c2").Offset(i - 1, 0)
>    .Value = 1
>  End With
>  i = i + 1
> Loop
>End Sub

【21516】Re:セルが空でない場合に値を設定したい
回答  かみちゃん  - 05/1/22(土) 11:06 -

引用なし
パスワード
   >セルが空でない場合はその右隣のセルの値を「1」にする
>という結果が得られません。

それであれば、

>Do Until IsEmpty(Range("b2").Offset(i - 1, 0)) = False

では、セルが空でない場合があるとそれ以降Do〜Loopは行いません。

Do Until IsEmpty(Range("b2").Offset(i - 1, 0)) = True
とするとできるのですが、同じようにセルが空である場合になると、それ以降Do〜
Loopは実行しませんので、B2から下方向に途中で空のセルがあったりすると、期待
しない結果が得られる場合があります。

もし、すべての行をチェックするならば、Do〜LoopではなくFor〜Nextを使った以
下のような方法の方がいいかもしれません。

 Dim RowNo As Long

 '2行目からExcelの最大行(65536行)までチェック
 For RowNo = 2 To 65536
  With Cells(RowNo, 2)
   'r行のB列が空でない場合
   If Not IsEmpty(.Value) Then
    '1列右隣の列の値を1にする
    .Offset(0, 1).Value = 1
   End If
  End If
 Next

あと、オートフィルタで「空白以外のセル」を抽出して、隣のセルに「1」を設定
することもできます。

【21517】Re:変数の定義
お礼  ほい  - 05/1/22(土) 11:27 -

引用なし
パスワード
   ponponさん かみちゃんさん ありがとうございます。

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