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

投稿時間:2005/05/17(Tue) 10:34
投稿者名:みんみん
Eメール:
URL :
タイトル:
ループ処理
現在VB6.0 ACCESS2000を使用しています。
まだまだ、始めたばかりで、勉強中ですが、よろしくお願いします。

MSHFlexGridにデータを表示させていますが、データが無い場合はグリッドの幅を0(表示しない)よう
にした
いと思っています。
データは
NO、チーム、名前、ポジション、趣味1、趣味2、趣味3、趣味4、趣味5

このデータでグリッド中に、趣味にはデータが無い場合があるので、その列のグリッドは非表示にし
たいと思
っています。
ループ処理で、やってみたのですが、なかなかうまくいかなく、ご教授お願いします。
よろしくお願いします。

投稿時間:2005/05/17(Tue) 11:12
投稿者名:いな
Eメール:
URL :
タイトル:
Re: ループ処理
>このデータでグリッド中に、趣味にはデータが無い場合があるので、
>その列のグリッドは非表示にしたいと思っています。

Acccessデータが100件あって、
 趣味1には100件中80件、
 (趣味1にある80件のうち)趣味2には100件中60件、
 (趣味2にある60件のうち)趣味3には100件中40件、
 (趣味3にある40件のうち)趣味4には100件中20件
 (趣味4にある20件のうち)趣味5には100件中 0件、というデータだったとすると、

一応、趣味1にデータが無いレコードが20件あるので、
残りの80件はデータがあっても、その列(縦)は表示しない!と伝わり兼ねないんだけど・・・。
実際は、趣味5のみ列を非表示にするんだよね?

--
>ループ処理で、やってみたのですが、なかなかうまくいかなく、ご教授お願いします。

うまくいかない・・・。うまくいかない・・・・。
もう少し別の表現でどううまくいかないかを表せるとレスがつきやすいかと。

大概、掲示板に投稿する人は、いわゆる、うまくいかない現象でお困りの方ですから
それを相談できないことには・・・。

投稿時間:2005/05/17(Tue) 13:21
投稿者名:みんみん
Eメール:
URL :
タイトル:
Re^2: ループ処理
早速ご返事ありがとうございます。

> 一応、趣味1にデータが無いレコードが20件あるので、
> 残りの80件はデータがあっても、その列(縦)は表示しない!と伝わり兼ねないんだけど・・・。
> 実際は、趣味5のみ列を非表示にするんだよね?

全くその通りです。 趣味5のみの列を非表示にしたいのです。

> 大概、掲示板に投稿する人は、いわゆる、うまくいかない現象でお困りの方ですから
> それを相談できないことには・・・。

そうですね、すいません。
どう記述してよいかを悩んでいます。

Dim I as intger
Dim I2 as intger

’趣味1〜5までのループ
Do until ????

’データが入力されているかどうかのループ
Do While MSHFlexGrid1.TextMatrix(I2, I) = ""


I2 = I2 + 1
Loop

MSHFlexGrid1.ColWidth(0) = 0
Loop

ここまでは何とか自分なりに考えてやってみましたが、
@「データが入力されているまで」のループ文がわかりません(これがわからないので前に進まない)
Aこの方法以外のやり方があるのでしょうか?
すいませんが、よろしくお願いします。

投稿時間:2005/05/17(Tue) 14:59
投稿者名:みんみん
Eメール:
URL :
タイトル:
Re^3: ループ処理
いろいろ、考えて実際にはうまくいきました(データが少ないと言うのもあります)が
もう少しシンプルな記述方法があればお願いします。

Dim lngCount As Long
lngCount = rs.RecordCount

Do Until Trim(MSHFlexGrid1.TextMatrix(I, 7)) = "" Or I = lngCount

I = I + 1

Loop

If I = lngCount Then

    With MSHFlexGrid1
    ’趣味1の列を非表示(0)にする
        .ColWidth(7) = 0
    End With
Else
    With MSHFlexGrid1
    ’趣味1の列の幅の設定をする
        .ColWidth(7) = 1425
     End With
    
End If

この作業を5回繰り返しました。

よろしくお願いします。

投稿時間:2005/05/17(Tue) 16:04
投稿者名:GOD
Eメール:
URL :
タイトル:
Re^4: ループ処理
Do 〜 LoopよりはFor分の方がよくないかな。
    Dim Row As Long
    Dim Col As Long
    Dim varWidth As Variant

    '趣味列の幅指定
    varWidth = Array(1000, 1000, 1000, 1000, 1000)
    With MSHFlexGrid1
        '趣味1は7から始まる
        For Col = 7 To .Cols - 1
            '必要行数分ループ
            For Row = .FixedRows To .Rows - 1
                If Len(Trim(.TextMatrix(Row, Col))) <> 0 Then
                    '何か入力されているならFor分(Row)を抜ける
                    Exit For
                End If
            Next
            '何か入力されていたか?
            If Row >= .Rows Then
                .ColWidth(Col) = 0
            Else
                .ColWidth(Col) = varWidth(Col - 7)
            End If
        Next
    End With

もっとスマートにやるならSQL文で趣味1〜趣味5までの文字列の最大幅を持ってきてしまうとか。
コーディングの行数は減りそうだけど処理速度としてはどうか・・・
SELECT max(len(trim(趣味1))),
       max(len(trim(趣味2))),
       max(len(trim(趣味3))),
       max(len(trim(趣味4))),
       max(len(trim(趣味5)))
FROM テーブル名;

投稿時間:2005/05/17(Tue) 17:28
投稿者名:みんみん
Eメール:
URL :
タイトル:
Re^5: ループ処理
GODさん MIMIさん

ご返事ありがとうございます。
For文でやってみたいと思います。

SELECT文では処理速度が…と言うことなので、これからデータの量が、どうなるかわかんないので、
For文でやってみたいと思います。

>この終了条件にI = lngCountがありますが、
>一番最後の行にだけ何か入力があった場合、このループととおらずに
>セルの幅0になっちゃわないでしょうか・・・
実際、やってみます。

来週になってしまいますが、一度試してみます。
少しの間、連絡(報告)できないですが、ありがとうございました。

投稿時間:2005/05/17(Tue) 17:00
投稿者名:ぶぶ
Eメール:
URL :
タイトル:
Re^4: ループ処理
試してみてはいないのですが、
みんみんさんのコードを見てみると
> Do Until Trim(MSHFlexGrid1.TextMatrix(I, 7)) = "" Or I = lngCount
この終了条件にI = lngCountがありますが、
一番最後の行にだけ何か入力があった場合、このループととおらずに
セルの幅0になっちゃわないでしょうか・・・
気のせいかも・・・・勘違いかな?
私もGODさんのようにdo whileではなく for〜Next使うかな・・・
と思いました。

> この作業を5回繰り返しました。
この分も楽になると思います。
がんばってくださいね

投稿時間:2005/05/24(Tue) 10:28
投稿者名:みんみん
Eメール:
URL :
タイトル:
Re^5: ループ処理
GODさん ぷぷさん ありがとうございました。

バッチリできました!

LoopとColの辺りでちょっとややこしくて、数値や行数、列数を変えて実行してうまくいきました。

ありがとうございました。