Excel VBA質問箱 IV

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

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


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

【42687】範囲指定について Rilly 06/9/19(火) 13:47 発言[未読]
【42693】Re:範囲指定について パン 06/9/19(火) 15:09 発言[未読]
【42694】Re:範囲指定について りん 06/9/19(火) 15:10 回答[未読]
【42697】Re:範囲指定について Jaka 06/9/19(火) 16:55 発言[未読]
【42700】Re:範囲指定について りん 06/9/19(火) 18:08 回答[未読]
【42696】Re:範囲指定について ハナ 06/9/19(火) 16:13 質問[未読]
【42713】Re:範囲指定について yata 06/9/19(火) 22:38 発言[未読]
【42719】Re:範囲指定について ハナ 06/9/20(水) 8:17 お礼[未読]
【42702】Re:範囲指定について Kein 06/9/19(火) 19:17 回答[未読]

【42687】範囲指定について
発言  Rilly  - 06/9/19(火) 13:47 -

引用なし
パスワード
   A列において、データのある一番下のセルの一つ下のセルの行までを範囲指定し、
その行までの範囲内でC列の中の空欄を抽出し、"使用不可"と入力したいのですが、どのように範囲指定すればよいのでしょうか?
よろしくお願いします。

  A B C
1 r n ()←使用不可
2 n f z
3 b w q
4 j   ()←使用不可  
5     ()←使用不可

【42693】Re:範囲指定について
発言  パン E-MAIL  - 06/9/19(火) 15:09 -

引用なし
パスワード
   ▼Rilly さん:

A列においてデータのあるのをしらべっるには。
DIM LAROW AS long
LAROW=range("A65536").End(xlUP).Row
LAROW=LAROW+1
後はループでいいですね。


>A列において、データのある一番下のセルの一つ下のセルの行までを範囲指定し、
>その行までの範囲内でC列の中の空欄を抽出し、"使用不可"と入力したいのですが、どのように範囲指定すればよいのでしょうか?
>よろしくお願いします。
>
>  A B C
>1 r n ()←使用不可
>2 n f z
>3 b w q
>4 j   ()←使用不可  
>5     ()←使用不可

【42694】Re:範囲指定について
回答  りん E-MAIL  - 06/9/19(火) 15:10 -

引用なし
パスワード
   Rilly さん、こんにちわ。
>A列において、データのある一番下のセルの一つ下のセルの行までを範囲指定し、
>その行までの範囲内でC列の中の空欄を抽出し、"使用不可"と入力したいのですが、どのように範囲指定すればよいのでしょうか?

>  A B C
>1 r n ()←使用不可
>2 n f z
>3 b w q
>4 j   ()←使用不可  
>5     ()←使用不可

Sub test()
  Dim r1 As Range, r2 As Range
  'A列でチェックした範囲の2つ右がC列
  With Application.ActiveSheet
    Set r1 = .Range(.Range("A1"), .Range("A65536").End(xlUp).Offset(1, 0)).Offset(0, 2)
  End With
  'その中の空白セルを抽出(編集→ジャンプ→セル選択→空白と同じ処理)
  '空白が無いとエラーになるのでスキップ
  On Error Resume Next
  Set r2 = r1.SpecialCells(xlCellTypeBlanks)
  On Error GoTo 0
  '空白セルがあれば値を入れる
  If Not r2 Is Nothing Then r2.Value = "使用不可"
  '終わり
  Set r1 = Nothing: Set r2 = Nothing
End Sub
こんな感じです。

【42696】Re:範囲指定について
質問  ハナ  - 06/9/19(火) 16:13 -

引用なし
パスワード
   ▼Rilly さん:
今日は

>A列において、データのある一番下のセルの一つ下のセルの行までを範囲指定し、
>その行までの範囲内でC列の中の空欄を抽出し、"使用不可"と入力したいのですが、どのように範囲指定すればよいのでしょうか?
>よろしくお願いします。
>
>  A B C
>1 r n ()←使用不可
>2 n f z
>3 b w q
>4 j   ()←使用不可  
>5     ()←使用不可

わたくしも、こんな感じのをひとつ(笑)

Option Explicit
Private Const MyStr = "使用不可"

Sub TEST()
  Dim RR As Range  'C列の検索範囲
  Dim R As Range
  Dim LC As Long   'データの最後の行 + 1
  '

  LC = Range("A1").End(xlDown).Row + 1
  Set RR = Range("C1", "C" & LC)

  For Each R In RR
    If Len(R) < 1 Then '----- 1.
      R.Value = MyStr
    End If
  Next
  Set RR = Nothing
End Sub

Rilly さんに便乗した質問で・・・
1.で,空白かどうかを判別するのにデータの長さを使っていますが
もうちょっとスマートなやり方をアドバイスいただけたら嬉しいです!

【42697】Re:範囲指定について
発言  Jaka  - 06/9/19(火) 16:55 -

引用なし
パスワード
   りんさん、おひさです。(なれなれしい。)

>4 j   ()←使用不可
>5     ()←使用不可

範囲がこれだと、SpecialCellsはまずいことがあるかもしれません。

私も最近気づいたんですが、
SpecialCellsって、UsedRange内でしか認識できないみたいなんですよね。
(5行目が使った形跡がないと範囲から外れる)
もう少し細かく言うと、A1からUsedRange最後のセルみたいな...。

【42700】Re:範囲指定について
回答  りん E-MAIL  - 06/9/19(火) 18:08 -

引用なし
パスワード
   Jaka さん、おひさしゅう(笑)

>私も最近気づいたんですが、
>SpecialCellsって、UsedRange内でしか認識できないみたいなんですよね。
>(5行目が使った形跡がないと範囲から外れる)
>もう少し細かく言うと、A1からUsedRange最後のセルみたいな...。

確かに列方向はUsedRangeから外れているとダメでした。
でも、行方向は問題ないみたいです。
※列方向に広がるとファイルがでかくなるのと何か関係ありそうな。

まあ、具体的に言うとC列に何も入ったことがないとうまく動作しないようです。
なので改良。

Sub test()
  Dim r1 As Range, r2 As Range
  'A列でチェックした範囲の2つ右がC列
  With Application.ActiveSheet
    Set r1 = .Range(.Range("A1"), .Range("A65536").End(xlUp).Offset(1, 0)).Offset(0, 2)
  End With
  'C列の範囲が全部空白かどうかの判定
  If Application.WorksheetFunction.CountA(r1) = 0 Then
   Set r2 = r1
  Else
   '使ってるセルがある場合
   'その中の空白セルを抽出(編集→ジャンプ→セル選択→空白と同じ処理)
   '空白が無いとエラーになるのでスキップ
   On Error Resume Next
   Set r2 = r1.SpecialCells(xlCellTypeBlanks)
   On Error GoTo 0
  End If
  '空白セルがあれば値を入れる
  If Not r2 Is Nothing Then r2.Value = "使用不可"
  '終わり
  Set r1 = Nothing: Set r2 = Nothing
End Sub

新しいシートのA1セルに何か入れて実行すると、C列の1〜2行目に使用不可と入るのを確認しました。

【42702】Re:範囲指定について
回答  Kein  - 06/9/19(火) 19:17 -

引用なし
パスワード
   SpecialCellsメソッドを確実に働かせる方法として、以下のようなコードは
どうでしょーか ?

Sub TestA()
  On Error Resume Next
  With Range("A1", Range("A65536").End(xlUp).Offset(1)).Offset(, 255)
   .Formula = "=IF(ISBLANK($C1),1)"
   .SpecialCells(3, 1).Offset(, -253).Value = "使用不可"
   .ClearContents
  End With
End Sub

もしISBLANK関数がうまくいかないなら、=IF($C1="""",1) という式に
変更してみて下さい。

【42713】Re:範囲指定について
発言  yata  - 06/9/19(火) 22:38 -

引用なし
パスワード
   ▼ハナ さん:
こんばんは
>    If Len(R) < 1 Then '----- 1.
>      R.Value = MyStr
>    End If

   If R=Empty Then
でうまく行きましたがだめですか?

【42719】Re:範囲指定について
お礼  ハナ  - 06/9/20(水) 8:17 -

引用なし
パスワード
   ▼yata さん:
ご指導ありがとうございます
>    If Len(R) < 1 Then '----- 1.
>      R.Value = MyStr
>    End If
>
>   If R=Empty Then
>でうまく行きましたがだめですか?

そうですね IsEMPTY(R)やIsNULL(R) も考えたんですけど
Rが空白スペースや非表示の0である時を考えたら不安になりまして・・・
わたくしのですと、動作が不安定ですね(汗) 
Emptyも同じ問題を残しそうです・・・。

    For Each R In RR
      If Trim(R) = Empty Or R = 0 Then
       R.Value = MySTR
      End If
    Next
これも、なんとなくスマートではないでしょう(笑)
やはり ISBlank でしょうか・・・・
それにしても yata さん 一緒に考えてくださってありがとうございます
今後ともよろしくお願いします

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