Excel VBA質問箱 IV

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

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


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

【52949】オーバーフローとは にしもり 07/12/10(月) 11:39 質問[未読]
【52950】Re:オーバーフローとは Blue 07/12/10(月) 11:52 回答[未読]
【52953】Re:オーバーフローとは にしもり 07/12/10(月) 14:17 お礼[未読]
【52954】For ..Next ステートメントを思ったとおり... にしもり 07/12/10(月) 14:24 質問[未読]
【52957】Re:For ..Next ステートメントを思ったと... neptune 07/12/10(月) 15:18 発言[未読]
【52961】Re:For ..Next ステートメントを思ったと... にしもり 07/12/10(月) 15:47 質問[未読]
【52964】Re:For ..Next ステートメントを思ったと... neptune 07/12/10(月) 16:25 発言[未読]
【52971】Re:For ..Next ステートメントを思ったと... とおりすがり 07/12/10(月) 17:29 発言[未読]
【52973】Re:For ..Next ステートメントを思ったと... にしもり 07/12/10(月) 17:57 お礼[未読]

【52949】オーバーフローとは
質問  にしもり  - 07/12/10(月) 11:39 -

引用なし
パスワード
   こんにちは。
下記を実行するとFor i = 5 To ws1.Range("B5").End(xlDown).Rowのところでオーバーフローしました、と出ます。
何がいけないのか教えていただけませんでしょうか。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

Dim Pnm As String
Dim Cnm As String
Dim ws1 As Worksheet
Dim i As Integer

  If Not Application.Intersect(Range("B5:B107"), Target) Is Nothing Then
  
   With Target
    Pnm = .Offset(, 1).Value
    Cnm = .Offset(, 2).Value
   End With
  
    Set ws1 = Worksheets("Sheet2")
    For i = 5 To ws1.Range("B5").End(xlDown).Row
    If IsEmpty(ws1.Cells(i, 2).Value) Then
    ws1.Cells(i, 2).Value = Pnm
    ws1.Cells(i, 3).Value = Cnm
    End If
    Next
    Cancel = True
 
  End If

End Sub

【52950】Re:オーバーフローとは
回答  Blue  - 07/12/10(月) 11:52 -

引用なし
パスワード
   > Dim i As Integer

> ws1.Range("B5").End(xlDown).Row
とは扱える範囲が違います。

i は Integer型
Rangeオブジェクトの Rowプロパティ は Long型

あとはヘルプで確認してみてください。

【52953】Re:オーバーフローとは
お礼  にしもり  - 07/12/10(月) 14:17 -

引用なし
パスワード
   ▼Blue さん:
ご指摘ありがとうございました。
Longにしたらできそうです。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

Dim Pnm As String
Dim Cnm As String
Dim ws1 As Worksheet
Dim i As Long
  
  If Not Application.Intersect(Range("B5:B107"), Target) Is Nothing Then
  
    With Target
      Pnm = .Offset(, 1).Value
      Cnm = .Offset(, 2).Value
    End With
  
    Set ws1 = Worksheets("Sheet2")
    For i = 5 To ws1.Range("B5").End(xlDown).Row
      If IsEmpty(ws1.Cells(i, 2).Value) Then
        ws1.Cells(i, 2).Value = Pnm
        ws1.Cells(i, 3).Value = Cnm
        Exit For
      End If
    Next i
    
    Cancel = True
 
  End If

End Sub

【52954】For ..Next ステートメントを思ったとお...
質問  にしもり  - 07/12/10(月) 14:24 -

引用なし
パスワード
   再々すみません、できそうだと思ったのですが、、、。
1回目、2回目のDouble clickは、 ともにうまくsheet2にコピペ実行されるのですが、3回目以降のDouble clickでコピペが実行されません。
どこがわるいかどなたか教えていただけないでしょうか。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

Dim Pnm As String
Dim Cnm As String
Dim ws1 As Worksheet
Dim i As Long
  
  If Not Application.Intersect(Range("B5:B107"), Target) Is Nothing Then
  
    With Target
      Pnm = .Offset(, 1).Value
      Cnm = .Offset(, 2).Value
    End With
  
    Set ws1 = Worksheets("入力フォーム")
    For i = 5 To ws1.Range("B5").End(xlDown).Row
      If IsEmpty(ws1.Cells(i, 2).Value) Then
        ws1.Cells(i, 2).Value = Pnm
        ws1.Cells(i, 3).Value = Cnm
        Exit For
      End If
    Next i
    
    Cancel = True
 
  End If

End Sub

【52957】Re:For ..Next ステートメントを思った...
発言  neptune  - 07/12/10(月) 15:18 -

引用なし
パスワード
   ▼にしもり さん:
こんにちは

>    For i = 5 To ws1.Range("B5").End(xlDown).Row
>      If IsEmpty(ws1.Cells(i, 2).Value) Then
この辺りにブレークポイントを置いて走らせて見ては?

【52961】Re:For ..Next ステートメントを思った...
質問  にしもり  - 07/12/10(月) 15:47 -

引用なし
パスワード
   ▼neptune さん:
>>    For i = 5 To ws1.Range("B5").End(xlDown).Row
>>      If IsEmpty(ws1.Cells(i, 2).Value) Then
>この辺りにブレークポイントを置いて走らせて見ては?


ブレークポイントは茶色の○を付けて走らすやつですよね。
走らせ、ローカルウィンドウをみたら、iの値が0になっています。
うーん、、どういうことが想定できますでしょうか。

【52964】Re:For ..Next ステートメントを思った...
発言  neptune  - 07/12/10(月) 16:25 -

引用なし
パスワード
   ▼にしもり さん:
>▼neptune さん:
>>>    For i = 5 To ws1.Range("B5").End(xlDown).Row
>>>      If IsEmpty(ws1.Cells(i, 2).Value) Then
>>この辺りにブレークポイントを置いて走らせて見ては?
>
>
>ブレークポイントは茶色の○を付けて走らすやつですよね。
>走らせ、ローカルウィンドウをみたら、iの値が0になっています。
>うーん、、どういうことが想定できますでしょうか。
解りません。もう少し前にブレークポイントをおいて観察してみましょう。

【52971】Re:For ..Next ステートメントを思った...
発言  とおりすがり  - 07/12/10(月) 17:29 -

引用なし
パスワード
   こんにちは。

ws1.Range("B5").End(xlDown).Row
の動作を確認して下さい。
B5を選択しして、Ctrl+[↓] キーと同じです。

B5以下のセルに値が入力されていないとき、
ws1.Range("B5").End(xlDown).Rowは列の最終列に行きます。
65536です。

B5に値が入っていて、B6以下のセルにも入力がないとき、この場合も
ws1.Range("B5").End(xlDown).Rowは列の最終列に行きます。
65536です。

B5とB6に値が入っていて、B7以下に値が入っていないとき
上記までの違う動作をします。
値の入っているセル領域の最後のセルに行きます。
ws1.Range("B5").End(xlDown).Rowは 6です。

したがって、For ループは5行目と6行目だけを処理しますが、
この時、B5のセルもB6のセルも値が入力されているので
IF文の条件が成立しません


 

【52973】Re:For ..Next ステートメントを思った...
お礼  にしもり  - 07/12/10(月) 17:57 -

引用なし
パスワード
   ▼とおりすがり さん、neptuneさん:

> B5以下のセルに値が入力されていないとき、
> ws1.Range("B5").End(xlDown).Rowは列の最終列に行きます。
> 65536です。
知りませんでした。
アドバイスにしたがったらできたみたいです。
どうもありがとうございました。


Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

Dim Pnm As String
Dim Cnm As String
Dim ws1 As Worksheet
Dim i As Long
  
  If Not Application.Intersect(Range("B5:B107"), Target) Is Nothing Then
  
    With Target
      Pnm = .Offset(, 1).Value
      Cnm = .Offset(, 2).Value
    End With
  
    Set ws1 = Worksheets("入力フォーム")
    For i = 5 To ws1.Range("B65535").End(xlDown).Row
      If IsEmpty(ws1.Cells(i, 2).Value) Then
        ws1.Cells(i, 2).Value = Pnm
        ws1.Cells(i, 3).Value = Cnm
        Exit For
      End If
    Next i
    
    Cancel = True
 
  End If

End Sub

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