Excel VBA質問箱 IV

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

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


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

【33442】空欄のセルの参照方法 鐘本政和 06/1/12(木) 10:07 質問[未読]
【33446】Re:空欄のセルの参照方法 Jaka 06/1/12(木) 10:42 回答[未読]
【33450】Re:空欄のセルの参照方法 鐘本政和 06/1/12(木) 12:08 お礼[未読]
【33453】Re:空欄のセルの参照方法 Jaka 06/1/12(木) 12:33 発言[未読]
【33455】Re:空欄のセルの参照方法 鐘本政和 06/1/12(木) 12:56 お礼[未読]
【33456】Re:空欄のセルの参照方法 こたつねこ 06/1/12(木) 13:00 発言[未読]
【33461】Re:空欄のセルの参照方法 鐘本政和 06/1/12(木) 14:59 お礼[未読]
【33464】Re:空欄のセルの参照方法 鐘本政和 06/1/12(木) 15:33 発言[未読]
【33465】Re:空欄のセルの参照方法 鐘本政和 06/1/12(木) 15:36 発言[未読]
【33466】Re:空欄のセルの参照方法 こたつねこ 06/1/12(木) 15:43 発言[未読]
【33469】Re:空欄のセルの参照方法 鐘本政和 06/1/12(木) 16:05 回答[未読]
【33473】Re:空欄のセルの参照方法 Jaka 06/1/12(木) 16:38 発言[未読]
【33474】Re:空欄のセルの参照方法 こたつねこ 06/1/12(木) 16:40 発言[未読]
【33482】Re:空欄のセルの参照方法 鐘本政和 06/1/12(木) 17:30 お礼[未読]
【33476】Re:空欄のセルの参照方法 小僧 06/1/12(木) 17:05 発言[未読]

【33442】空欄のセルの参照方法
質問  鐘本政和 E-MAIL  - 06/1/12(木) 10:07 -

引用なし
パスワード
   Excel表の有効データ範囲を自動的に求め、最大値を求めてからデータ処理をするアプリを作成しています。NULデータを見つけ境界を探しましたが、ゼロの値のあるときはそこが境界と認識してしまいます。
UsedRangeを使うと文字列の形で配列の範囲が与えられましたが、配列のインデックス値を使いたい処理では使いにくいところがあります。
Excelの空欄を参照するのにNothingを使うという説明を見つけましたので、これを使ってみました。下記はSAMPLE.xlsのセルの有効範囲を求め、この中の最大値を求めるためのプログラム例です。
しかし、ゼロのデータが含まれていると空欄とみなしてしまい、うまく有効データ範囲が求められません。
何か良い方法があればご教示ください。

 Dim xlApp As Excel.Application
    Dim xlBook As Excel.Workbook
    Dim xlSheet As Excel.Worksheet

    Dim Line, Column As Integer
    Dim j, k, max, value, rate, L, C, Lmax, Cmax As Integer

    xlApp = CreateObject("Excel.Application")
    xlBook = xlApp.Workbooks.Open("C:\VB.NET\SAMPLE.xls") ' Excel ファイルのオープン")

    xlApp.Application.Visible = True    'Excel を表示する。
    xlApp.Parent.Windows(1).Visible = True
    xlSheet = xlBook.Worksheets("Sheet1")

    L = 1
    C = 1
    Lmax = 0
    Cmax = 0
    max = 0

    Do
      If xlSheet.Cells(L, C).value = Nothing Then
        If C = 1 Then
          Lmax = L
          Exit Do
        End If
        Cmax = C
        L = L + 1
        C = 1
      Else
        If xlSheet.Cells(L, C).value > max Then
          max = xlSheet.Cells(L, C).value
        End If
        C = C + 1
      End If
    Loop

【33446】Re:空欄のセルの参照方法
回答  Jaka  - 06/1/12(木) 10:42 -

引用なし
パスワード
   NULデータって今一よくわかんないんだけど、=""などや""が貼り付けられたものなどは...?

IsEmpty(xlSheet.Cells(L, C).value)

【33450】Re:空欄のセルの参照方法
お礼  鐘本政和 E-MAIL  - 06/1/12(木) 12:08 -

引用なし
パスワード
   ▼Jaka さん:
>NULデータって今一よくわかんないんだけど、=""などや""が貼り付けられたものなどは...?
>
>IsEmpty(xlSheet.Cells(L, C).value)

Jakaさん、早速の回答ありがとうございます。
IsEmptyではブランク欄(まだ入力のない空欄)と0の値の欄の区別がつかないようです。(Visual BasicではEmptyがなくなり、代わりにNothingが用いられています)

UsedRange機能を使うと、R1C1:R2C3のように文字列で有効範囲が返されてきますので、文字列から最大行列値(この場合は2,3)を取り出せばよいのですが、少し面倒なので、中身から空欄を直接判定する方法は何かないかな。。。
ということです。

鐘本

【33453】Re:空欄のセルの参照方法
発言  Jaka  - 06/1/12(木) 12:33 -

引用なし
パスワード
   VBは知らないけど、VBAはちゃんと判断してくれます。

Range("A1").Clear
MsgBox IsEmpty(Range("A1").Value)
Range("A2").Value = 0
MsgBox IsEmpty(Range("A2").Value)

>Visual BasicではEmptyがなくなり
聞いたらあるそうです。

【33455】Re:空欄のセルの参照方法
お礼  鐘本政和 E-MAIL  - 06/1/12(木) 12:56 -

引用なし
パスワード
   ▼Jaka さん:
>VBは知らないけど、VBAはちゃんと判断してくれます。
>
>Range("A1").Clear
>MsgBox IsEmpty(Range("A1").Value)
>Range("A2").Value = 0
>MsgBox IsEmpty(Range("A2").Value)
>
>>Visual BasicではEmptyがなくなり
>聞いたらあるそうです。


Jaka さん
再度の回答ありがとうございます。
もう一度、確認のテストをしてみます。
ありがとうございました。

【33456】Re:空欄のセルの参照方法
発言  こたつねこ  - 06/1/12(木) 13:00 -

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

>VBは知らないけど、VBAはちゃんと判断してくれます。
>
>Range("A1").Clear
>MsgBox IsEmpty(Range("A1").Value)
>Range("A2").Value = 0
>MsgBox IsEmpty(Range("A2").Value)
>
VBのバージョンは何を使っていますか?
VB6.0でもちゃんと判断してくれますよ

【33461】Re:空欄のセルの参照方法
お礼  鐘本政和 E-MAIL  - 06/1/12(木) 14:59 -

引用なし
パスワード
   ▼こたつねこ さん:
>みなさんこんにちは
>
>>VBは知らないけど、VBAはちゃんと判断してくれます。
>>
>>Range("A1").Clear
>>MsgBox IsEmpty(Range("A1").Value)
>>Range("A2").Value = 0
>>MsgBox IsEmpty(Range("A2").Value)
>>
>VBのバージョンは何を使っていますか?
>VB6.0でもちゃんと判断してくれますよ

VB.NETを使っています。IsEmptyでエラーが出たのでマイクロソフトの下記サイトをアクセスすると、<emptyconstant>は宣言されていません。Empty定数
はサポートされていません。代わりにNothingを使用してください。
とのコメントがありました。

ms-help://MS.VCC.2003/

【33464】Re:空欄のセルの参照方法
発言  鐘本政和 E-MAIL  - 06/1/12(木) 15:33 -

引用なし
パスワード
   ▼鐘本政和 さん:
>▼こたつねこ さん:
>>みなさんこんにちは
>>
>>>VBは知らないけど、VBAはちゃんと判断してくれます。
>>>
>>>Range("A1").Clear
>>>MsgBox IsEmpty(Range("A1").Value)
>>>Range("A2").Value = 0
>>>MsgBox IsEmpty(Range("A2").Value)
>>>
>>VBのバージョンは何を使っていますか?
>>VB6.0でもちゃんと判断してくれますよ
>
>VB.NETを使っています。IsEmptyでエラーが出たのでマイクロソフトの下記サイトをアクセスすると、<emptyconstant>は宣言されていません。Empty定数
>はサポートされていません。代わりにNothingを使用してください。
>とのコメントがありました。
>
>ms-help://MS.VCC.2003/

【33465】Re:空欄のセルの参照方法
発言  鐘本政和 E-MAIL  - 06/1/12(木) 15:36 -

引用なし
パスワード
   ▼鐘本政和 さん:
>▼鐘本政和 さん:
>>▼こたつねこ さん:
>>>みなさんこんにちは
>>>
>>>>VBは知らないけど、VBAはちゃんと判断してくれます。
>>>>
>>>>Range("A1").Clear
>>>>MsgBox IsEmpty(Range("A1").Value)
>>>>Range("A2").Value = 0
>>>>MsgBox IsEmpty(Range("A2").Value)
>>>>
>>>VBのバージョンは何を使っていますか?
>>>VB6.0でもちゃんと判断してくれますよ
>>
>>VB.NETを使っています。IsEmptyでエラーが出たのでマイクロソフトの下記サイトをアクセスすると、<emptyconstant>は宣言されていません。Empty定数
>>はサポートされていません。代わりにNothingを使用してください。
>>とのコメントがありました。
>>
>>ms-help://MS.VCC.2003/

下記のリストでコンパイルすると、型"Range"でパブリックメソド"IsEmpty"が見つかりません、というエラーになります。
Public Readonly Propery Is Empty() As Boolean を追加しても同じでした。
   Do
      If IsEmpty(xlSheet.Cells(L, C).Value) Then
        If C = 1 Then
          Lmax = L
          Exit Do
        End If
        Cmax = C
        L = L + 1
        C = 1
      Else
        If xlSheet.Cells(L, C).value > max Then
          max = xlSheet.Cells(L, C).value
        End If
        C = C + 1
      End If
    Loop

【33466】Re:空欄のセルの参照方法
発言  こたつねこ  - 06/1/12(木) 15:43 -

引用なし
パスワード
   ▼鐘本政和 さん:
こんにちは

VB.NETは使った事がないのですが、単純に

>      If IsEmpty(xlSheet.Cells(L, C).Value) Then
If xlSheet.Cells(L,C).Value="" Then

で動きませんか?^^;

【33469】Re:空欄のセルの参照方法
回答  鐘本政和 E-MAIL  - 06/1/12(木) 16:05 -

引用なし
パスワード
   ▼こたつねこ さん:
>▼鐘本政和 さん:
>こんにちは
>
>VB.NETは使った事がないのですが、単純に
>
>>      If IsEmpty(xlSheet.Cells(L, C).Value) Then
>If xlSheet.Cells(L,C).Value="" Then
>
>で動きませんか?^^;

一番最初にやったのがこの方法です。
この方法では0と空欄の区別がつきませんでした。

【33473】Re:空欄のセルの参照方法
発言  Jaka  - 06/1/12(木) 16:38 -

引用なし
パスワード
   ▼鐘本政和 さん:
>>If xlSheet.Cells(L,C).Value="" Then
>>
>>で動きませんか?^^;
>
>一番最初にやったのがこの方法です。
>この方法では0と空欄の区別がつきませんでした。
これが不思議なので、使えないと思いますが...。
関数の場合を考慮して、Formulaプロパティーを使いましたが、無かったらすみません。
(""と0が同じですか...?)
MsgBox Range("A2").Formula = NullString And Range("A2").Formula = ""

【33474】Re:空欄のセルの参照方法
発言  こたつねこ  - 06/1/12(木) 16:40 -

引用なし
パスワード
   ▼鐘本政和 さん:
こんにちは

>>If xlSheet.Cells(L,C).Value="" Then
>>
>>で動きませんか?^^;
>
>一番最初にやったのがこの方法です。
>この方法では0と空欄の区別がつきませんでした。

失礼しました。
推測で申し訳ありませんが、

if xlSheet.Cells(L,C).Value is Nothing Then

ではどうでしょう?

【33476】Re:空欄のセルの参照方法
発言  小僧  - 06/1/12(木) 17:05 -

引用なし
パスワード
   ▼鐘本政和 さん、みなさま:
こんにちは。

当方も VB.NET の環境が自宅にしかないので推測になってしまいますが、

Value プロパティ
指定されたセル範囲の値を設定します。値の取得および設定が可能です。
バリアント型 (Variant) の値を使用します。

という事ですので、VarType 関数を用いて判断するのは如何でしょうか。

Nothing の場合 0 (vbEmpty)
0    の場合 5 (vbDouble)

が返ってくれば判断可能だと思うのですが…。

【33482】Re:空欄のセルの参照方法
お礼  鐘本政和 E-MAIL  - 06/1/12(木) 17:30 -

引用なし
パスワード
   ▼こたつねこ さん:
>▼鐘本政和 さん:
>こんにちは
>
>>>If xlSheet.Cells(L,C).Value="" Then
>>>
>>>で動きませんか?^^;
>>
>>一番最初にやったのがこの方法です。
>>この方法では0と空欄の区別がつきませんでした。
>
>失礼しました。
>推測で申し訳ありませんが、
>
>if xlSheet.Cells(L,C).Value is Nothing Then

みなさん、ありがとうございました。
上記の処理でOKとなりました!!
=とisの違いでこんなに結果が変わってくるとは思いもよりませんでした。
はじめて投稿させていただいて多くの方からアドバイスしていただき感激しています。まだ初心者ですが、今後もよろしくお願いいたします。

鐘本


>
>ではどうでしょう?

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