Excel VBA質問箱 IV

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

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


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

【61026】レコードの件数の表示 peke 09/4/4(土) 2:29 質問[未読]
【61027】Re:レコードの件数の表示 ichinose 09/4/4(土) 7:37 発言[未読]
【61034】Re:レコードの件数の表示 peke 09/4/5(日) 1:59 質問[未読]
【61048】Re:レコードの件数の表示 ichinose 09/4/5(日) 21:35 発言[未読]
【61049】Re:レコードの件数の表示 peke 09/4/6(月) 9:12 お礼[未読]

【61026】レコードの件数の表示
質問  peke  - 09/4/4(土) 2:29 -

引用なし
パスワード
   初心者です。もし過去ログで同じ質問が有った場合は、かんべんして下さい。

さて質問ですが、エクセルVBAを使ってレコードの件数が上手く表示させる事が出来ません。
 RecordCount = WorksheetFunction.Count(Range("データ一覧").Columns(1))
 RecordLabel = "レコード件数:" & CurrentRecord & "/" & RecordCount
上記のコマンドで、ユーザーフォームのラベルに現在のデータ/合計データ件数(1/100)を表示させたいのですが、合計データ件数が0になります。(1/0)
RecordCountの詳しい使い方について知りたいのですが、ヒント程度でも結構です
どなたか教えていただけませんか。
宜しくお願いします

【61027】Re:レコードの件数の表示
発言  ichinose  - 09/4/4(土) 7:37 -

引用なし
パスワード
   ▼peke さん:
おはようございます。

新規ブックの標準モジュールに

'==============================================================
Option Explicit
Sub sample()
  With Range("a1:d10")
    .Name = "データ一覧表"
    .Formula = "=int(rand()*10000)+1"
    .Value = .Value
    MsgBox "数値のサンプルデータ作成" & _
        vbCrLf & .Name.Name & " " & .Name.Value
  End With
  MsgBox "WorksheetFunction.Count(Range(""データ一覧表"").Columns(1)) = " & _
      WorksheetFunction.Count(Range("データ一覧表").Columns(1)) & vbCrLf & _
      "とデータが数値ならCount関数は正常に値を返しますが・・・"
'***********************************************************************************
  With Range("a1:d10")
    .Formula = "=CHAR(INT(RAND()*26)+65)"
    .Value = .Value
    MsgBox "文字列のサンプルデータ作成" & _
        vbCrLf & .Name.Name & " " & .Name.Value
  End With
  MsgBox "WorksheetFunction.Count(Range(""データ一覧表"").Columns(1)) = " & _
      WorksheetFunction.Count(Range("データ一覧表").Columns(1)) & vbCrLf & _
      "とデータが文字列だとCount関数はカウントしません" & vbCrLf & vbCrLf & _
      "これが原因ではないですか?"
End Sub


として、sampleを実行して表示される結果を検討してみてください。


今回のご質問に限ったことではありませんが、
同じコードでも扱うデータが違えば、結果が違うのは当然ですよね!!

どんなデータに対して、こんな結果がでました という
大事な大事な記述が抜けています。

又、"データ一覧表"という定義された名前についても
投稿ではpeke さんがどのように定義されたものなのか記述されていません。

この投稿を見ている方が全員、
peke さんが悩んでいる現象が再現できる投稿を
お願いします。
難しい(記述が面倒)ことですけど、きっと無駄になりませんから・・・。

【61034】Re:レコードの件数の表示
質問  peke  - 09/4/5(日) 1:59 -

引用なし
パスワード
   ichiseさん、温かい回答有難うございます。

少し長くなりますが、詳しく説明します。

1.、データ一覧の定義ですが、顧客シートのB3〜O6間をデータ一覧とブック内に

設定しました。

 その範囲には、数字、文字、が含まれています。

↓内容詳細

注文番号 日付 取引先 現場名 作業内容 請求単価 数量 単位 金額 作業員コード 作業員名 支払単価 支払金額 備考

上記の14項目になり、2行分データを作り、1行空白 以下空白にしています。

2.DataDlgという名前のユーザーフォームを作り、一番上の部分に

 レコード件数:00000/00000 ←ラベルを設置し、このラベルに
 表示されているデータは何番目/合計データ件数 を表示させるために、

以下のコードを記述しています。

Dim RecordCount As Long  'データの入力件数
Dim CurrentRecord As Long '現在表示しているデータの行位置


Private Sub BackButton_Click()
'-----------------------------------------------------
' [<]ボタンで前のレコードを表示する
'-----------------------------------------------------
  If CurrentRecord = 1 Then
    Exit Sub
  End If
  CurrentRecord = CurrentRecord - 1
  ReadData CurrentRecord
End Sub

Private Sub CloseButton_Click()
'-----------------------------------------------------
' [売上データ]ダイアログを閉じる
'-----------------------------------------------------
  Unload DataDlg
End Sub

Private Sub EndButton_Click()
'-----------------------------------------------------
' [>l]ボタンで最終レコードを表示する
'-----------------------------------------------------
  CurrentRecord = RecordCount
  ReadData CurrentRecord
End Sub


Private Sub NextButton_Click()
'-----------------------------------------------------
' [>]ボタンで次のレコードを表示する
'-----------------------------------------------------
  If CurrentRecord = RecordCount Then
    Exit Sub
  End If
  CurrentRecord = CurrentRecord + 1
  ReadData CurrentRecord
End Sub

Private Sub TopButton_Click()
'-----------------------------------------------------
' [l<]ボタンで先頭レコードを表示する
'-----------------------------------------------------
  CurrentRecord = 1
  ReadData CurrentRecord
End Sub

Private Sub UserForm_Initialize()
'-----------------------------------------------------
' [売上データ]ダイアログを初期化する
'-----------------------------------------------------
  Dim rowIndex As Long
  Dim columnIndex As Integer
  
  ' [登録されている顧客]のリスト項目を設定する
  rowIndex = Range("顧客一覧").Rows.Count - 1
  columnIndex = Range("顧客一覧").Columns.Count
  CustomerBox.RowSource = "顧客!" & Range(Range("顧客一覧").Cells(1, 1), Range("顧客一覧").Cells(rowIndex, columnIndex)).Address
                
  ' データを表示する
  CurrentRecord = 1
  ReadData CurrentRecord
  
End Sub


Private Sub ReadData(num As Long)
'------------------------------------------------------
' データベースのデータを取り出して表示する
'------------------------------------------------------
  ' 現在のレコードとデータ件数を表示する
  RecordCount = WorksheetFunction.Count(Range("データ一覧").Columns(1))
  RecordLabel = "レコード件数:" & CurrentRecord & "/" & RecordCount
  
  ' データを表示する
  NumberBox.Text = Range("データ一覧").Cells(num, 1)
  DateBox.Text = Range("データ一覧").Cells(num, 2)
  CustomerBox.Text = Range("データ一覧").Cells(num, 3)
  GennbameiBox.Text = Range("データ一覧").Cells(num, 4)
  SagyounaiyouBox.Text = Range("データ一覧").Cells(num, 5)
  SeikyuuTannkaBox.Text = Range("データ一覧").Cells(num, 6)
  QuantityBox.Text = Range("データ一覧").Cells(num, 7)
  TanniBox1.Text = Range("データ一覧").Cells(num, 8)
  TotalBox.Text = Range("データ一覧").Cells(num, 9)
  SagyouinnCodeBox.Text = Range("データ一覧").Cells(num, 10)
  SagyouinnNameBox.Text = Range("データ一覧").Cells(num, 11)
  SiharaiTannkaBox.Text = Range("データ一覧").Cells(num, 12)
  TotalBox1.Text = Range("データ一覧").Cells(num, 13)
  BikouBox.Text = Range("データ一覧").Cells(num, 14)

  
End Sub


上記コード記述した結果

合計レコード件数が 0と表示され "データ一覧"の範囲以下の行も表示していまい

ます。

この現状から、1.未入力行は表示しないようにする
       2.合計レコード件数を現在入力済みである2にする

には、どうすればいいのか全くわかりません。

原因として考えられる事があれば、教えて下さい。
宜しくお願いします。

【61048】Re:レコードの件数の表示
発言  ichinose  - 09/4/5(日) 21:35 -

引用なし
パスワード
   ▼peke さん:
こんばんは。

本当は、前回投稿で

>どんなデータに対して、こんな結果がでました という
>大事な大事な記述が抜けています。

B列3行目から6行目に注文番号と称されるデータが入っていることはわかりましたが、
具体的にどんなデータが入力されているのか記述されていません。

Worksheetfunction.Countは、数値だけをカウントします。
例えば セルB3に A0001と入力されていてもカウントされません。

また、123と入力されていても セルの書式が「文字列」ならば、
123は数値として認識されず、Worksheetfunction.Countでは カウントされません。

どのように修正するのがよいか? は、
この注文番号なるデータがどのようなデータなのかを記述されないと
はっきりは申し上げられませんが、


>Private Sub ReadData(num As Long)
>'------------------------------------------------------
>' データベースのデータを取り出して表示する
>'------------------------------------------------------
>  ' 現在のレコードとデータ件数を表示する
  RecordCount = WorksheetFunction.Counta(Range("データ一覧").Columns(1))

'取りあえず、CountをCountaに変更して試してみては?

>
>この現状から、1.未入力行は表示しないようにする

データ件数さえ正常に表示されれば、ある程度御希望の動作をすると思います。

後は、何もデータが入力されていないときのどのようにするかの
仕様を考えなくてはなりませんけどね!!

まだ、記述が完全ではありません。
peke さんの投稿どおりにブックを設定してもプログラムがまるで動きませんでした。

何が足りないでしょうか?

前述のとおり、プログラムを作動するためのサンプルデータの提示がありません。

ユーザーフォームにどんなコントロールを配置すればよいのか
この記述がラベル以外にはありません。他のコントロールの配置がなければ
プログラムは、現象を再現する以前に動きませんよね!!


これでは、コードを解析して私がコントロールを追加しなくてはなりません。

本来は、何も入力されていないブックから、peke さんの現状を再現するまでの
ブック作成操作、及び、ブック作成後の現象再現までの操作手順を記述して
ほしかったのです。

現象再現までは、閲覧者(回答者)は、頭をひねらなくても記述どおりに
操作すれば、現象が再現できる記述が必要なのです!!(きっぱり)。
前投稿で申し上げたとおり、大変ですけどね!!

このサイトの閲覧者や回答者がこの時点から問題解決に向けて
取り組むことが出来れば、問題解決の時間短縮につながると思いますよ!!

【61049】Re:レコードの件数の表示
お礼  peke  - 09/4/6(月) 9:12 -

引用なし
パスワード
   ichinoseさん、ほんとうにありがとうございます。

おっしゃるとおり、全てそ手順を書くのは大変ですね。

とくに初心者で知識の無い私には、ここに全てを書くだけで3日くらいかかりそう

です。

このシステムは"Excel表計算の 帳票入力・転記で楽する【マクロ】技2"という

本を参考に一度挑戦してみようと思い、作ったものです。

いよいよ後半、最終段階での不具合で、どこから説明すればいいのかさえ私には

わかりません(T T)

しかし、icinoseさんの助言どうりRecordCountをRecordCountaにしてみたところ

思う通りのラベル表示になりました。

ほんとうにありがとうございます。

小文字のaを付けるだけで違う命令になるとは...

参考にした本にはcountと記載されていたので、なぜこうなるのかを理解する努力

をしていきます。

ほんとにありがとうございました!

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