[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2007/02/22(Thu) 22:09
投稿者名:MTM
Eメール:
URL :
タイトル:
スプレッド内のデータの確認
はじめて質問させていただきます、初心者のMTMと申します。
早速ですが質問させていただきます。

現在VB6とOCX V2.5Jで作成しているのですが、オプションボタンが
押されているときコマンドボタンを押すと、スプレッド内の選択されている
行のそれぞれの列の中身をチェックする、というのを作ろうとしています。
そこで質問なのですが

If insOption.Value = True Then
とかいて次のIf文に
If Len(選択された行:列1)<>0、といったものが書きたかったのですが、
スプレッドの場合どうやって(選択された行:列1)を特定するのでしょうか?
自分で調べた限りですと書き込む場合は
with spd
    .Col = 1
    .Row = .ActiveRow
    .Text = "○○"
end with
とわかったのですが、これですとIf文には使用できないので質問させていただきます。
どうかアドバイスをお願いします。

投稿時間:2007/02/23(Fri) 09:57
投稿者名:
Eメール:
URL :
タイトル:
Re: スプレッド内のデータの確認
> with spd
>     .Col = 1
>     .Row = .ActiveRow
>     .Text = "○○"
> end with

これは

spd.Col = 1
spd.Row = spd.ActiveRow
spd.Text = "○○"

こう書くこともできます。これで理解しやすいですかね?
.Colと.Rowでセルの行と列を指定、.Textは指定されたセルの内容となります。
なのでspd.Colとspd.Rowを指定した後にspd.TextをIfで判定すればよろしいかと思います。

投稿時間:2007/02/23(Fri) 10:06
投稿者名:ダンボ
Eメール:
URL :
タイトル:
Re: スプレッド内のデータの確認
> 現在VB6とOCX V2.5Jで作成しているのですが、オプションボタンが

そのOCXがMSFlexGridならば、

  spd.TextMatrix( spd.ActiveRow, 1 )

の1句で対象セルがアクセスできますよ。

投稿時間:2007/02/23(Fri) 19:52
投稿者名:MTM
Eメール:
URL :
タイトル:
Re: スプレッド内のデータの確認
返信ありがとうございます。
おかげさまでセルの指定の仕方は分かりました。

それで追加の質問になってしまうのですが「入力値チェック」をするには
どうすればよいでしょうか?
具体的にいうとアルファベットや漢字は問わず

1列目 5バイト(CHAR)以下
2列目 10バイト(CHAR)以下
3列目 4バイト(CHAR)以下
4列目 1バイト(CHAR)以下
5列目 8バイト(NUMBER)以下

というチェックを行ったあとに
スプレッド内の同じ列に同じものがないかを調べる、ということを行いたいのですが、
どうしても分からないのでアドバイスをお願いします。

投稿時間:2007/02/23(Fri) 22:28
投稿者名:かさのば
Eメール:
URL :
タイトル:
Re^2: スプレッド内のデータの確認
#左記フレームに非常に有用なサンプルやリファレンスがありますので一通り目を通す事をお勧めし
ます。

とりあえず、文字列のバイト数が知りたければLenB関数でどうぞ
VB6.0だと全角も半角も2バイトで扱われてしまうので、それが嫌な場合はStrConv関数を併せてどう


同じ列に同じものがないかを調べるのは行数分ぐりぐり回してチェックするしかないのでは?

投稿時間:2007/02/24(Sat) 16:15
投稿者名:MTM
Eメール:
URL :
タイトル:
Re^3: スプレッド内のデータの確認
ありがとうございます。
おかげさまでバイト数のチェックは上手くいきました。

それでさらに質問になってしまうのですが、スプレッド内の
重複チェックを行うにはどうしたら良いでしょうか?
     No    名
1  12345  中田
2  67890  中村
3  09876  小野
4  54321  稲本

といった感じの表がありまして、No,名,それぞれ同じものがあった場合には
エラー表示するようにするにはどうすれば良いでしょうか?

自分で調べたところ「Hashtable」というものを見つけたのですが
使い方がよくわかりませんでした...

アドバイスをお願いします。

投稿時間:2007/02/24(Sat) 16:38
投稿者名:MTM
Eメール:
URL :
タイトル:
Re^3: スプレッド内のデータの確認
> 同じ列に同じものがないかを調べるのは行数分ぐりぐり回してチェックするしかないのでは?
すいません。言葉が足りませんでした。
行数分ぐりぐり回してチェックするにしても選択した行に回ってきたときにひっかかって
しまうので、それを避けるにはどうすればよいでしょうか?

投稿時間:2007/02/27(Tue) 00:07
投稿者名:かさのば
Eメール:
URL :
タイトル:
Re^4: スプレッド内のデータの確認
「同じ値」かつ「行番号が違う」という条件でチェックしてみるとよいかも

投稿時間:2007/02/27(Tue) 09:46
投稿者名:matsu
Eメール:
URL :
タイトル:
Re^4: スプレッド内のデータの確認
> > 同じ列に同じものがないかを調べるのは行数分ぐりぐり回してチェックするしかないので
は?
> すいません。言葉が足りませんでした。
> 行数分ぐりぐり回してチェックするにしても選択した行に回ってきたときにひっかかって
> しまうので、それを避けるにはどうすればよいでしょうか?

例えば、1行目の値をチェックする場合は2行目からチェック。
2行目の値をチェックする場合は3行目からチェック・・・
という風にしてみては?

投稿時間:2007/02/27(Tue) 21:48
投稿者名:MTM
Eメール:
URL :
タイトル:
Re^5: スプレッド内のデータの確認
自分でこんなものを作ってみましたがいかがでしょうか?

Sub chkRep()
Dim a As Integer
Dim b As Integer

b = 0
For a = 1 To spd.MaxRows
  With spd
    .Row = a
    .Col = 1
    If txt(1) = .Text Then
        MsgBox "ダメ"
        b = b + 1
    End If
  End With
  With spd
    .Row = a
    .Col = 2
    If txt(2) = .Text Then
        MsgBox "ダメ"
        b = b + 1
    End If
  End With
Next
End Sub

これでテキストボックス1,2の中身とそれぞれが入るべき各列の中身を
比較して同じならメッセージボックスを表示、という風にしてみました。

それで同じものがなければ書き込みをしたいのです。
ですが私の作った以下のものですと
Private Sub cmd_Ok_Click()
    Call chkRep
    
    If b >= 1 Then
        Exit Sub
    End If

' 列挿入    
    With spd
        .Row = .ActiveRow
        .MaxRows = .MaxRows + 1
        .Action = 7
    End With
    
    〜書き込み処理〜
End Sub
としてみたのですがchkRep内でカウントした[b]の中身が
引き継がれないため、チェックに引っかかっても書き込み
してしまいます。

なにか良い回避方法はないでしょうか?

投稿時間:2007/03/01(Thu) 01:22
投稿者名:かさのば
Eメール:
URL :
タイトル:
Re^6: スプレッド内のデータの確認
関数内で宣言された変数はその関数内でしか有効ではありません
なのでchkRep関数内のbとcmd_Ok_Click関数内のbは名前が同じだけでまったくの別物です(当然中身
が同じなわけも無く)
ってゆーかcmd_Ok_Click関数にはbの宣言自体無いですね
こうゆうのは非常に良くないのでOption Explicitステートメントを用いて変数の宣言を強制するよ
うにしましょう

ご質問についてですが、関数内の処理の結果を呼び出し元に伝えたければ戻り値か引数(参照型)を
使うのが常套ではないでしょうか

今のままで行きたいというのであれば変数bをグローバルで宣言してやれば可能ではありますが、あ
まりお勧めできません