LOOPやFor文で出来ないでしょうか。

このQ&Aのポイント
  • 現在帳票出力のコーディングをしております。帳票は8レコードで一枚で、8レコード以下になると、罫線が印刷されないため、ブランクのデータを作ることで対応しようと思っています。
  • データ件数が8の倍数まで処理をつづけたいのですが、どのように記述すればいいか思案に苦しんでおります。
  • イメージとしては、件数カウントしている数値を8で割り、その答えが8の倍数でない場合は小数点が出ると思います。要するに、整数というか小数点が出なくなるまで加算させるという条件ができればいいのかなと思っているのですが、それをコーディングにするにはどうすれば。。。と思っている次第です。
回答を見る
  • ベストアンサー

LOOPやFor文で出来ないでしょうか。

いつもお世話になっております。 現在帳票出力のコーディングをしております。 帳票は8レコードで一枚で、 8レコード以下になると、罫線が印刷されないため、 ブランクのデータを作ることで対応しようと思っています。 そこでブランクを入れる処理についてなのですが、 データ件数が8の倍数まで処理をつづけたいのですが どのように記述すればいいか思案に苦しんでおります。 Do Until KANRI_TANA_KENSU = 8 Or 16 Or 24 Or 32 Or 40 Or 48 Or 56 Or 64 Or 72 RS_BLANK.AddNew RS_BLANK!区分 = "BLANK" RS_BLANK.Update Loop とりあえず、一つのグループに30件以上はないので数値を固定化させたのですが 勿論これではダメだというのは理解しているのですが。。。 イメージとしては 件数カウントしている数値を8で割り、その答えが 8の倍数でない場合は小数点が出ると思います。 要するに、整数というか小数点が出なくなるまで加算させるという条件が できればいいのかなと思っているのですが それをコーディングにするにはどうすれば。。。と思っている次第です。 他の方法でも結構ですので何か案が御座いましたら ご教示いただけませんでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • FEX2053
  • ベストアンサー率37% (7987/21355)
回答No.1

8の倍数でストップすればいいんでしょ?だったら DATA/8 = INT(DATA/8) こいつが成立すれば止めればいい、ってだけなんじゃ?

shinnnn
質問者

お礼

ありがとうございます。 教えて頂いたとおりで処理されました。 INT型だと小数点が切り捨てられるという視点ですね。 簡単なことでも気が付かなかったです。 もっと精進いたします。

その他の回答 (6)

回答No.7

ページフッターに同じ位置に罫線を配置する手もあります。 Option Compare Database Const MaxRow = 8 Dim RowCount As Integer Private Sub ページフッターセクション_Format(Cancel As Integer, FormatCount As Integer)   RowCount = 0 End Sub Private Sub レポートフッター_Format(Cancel As Integer, FormatCount As Integer)   If RowCount = MaxRow Then     RowCount = 0     Me.MoveLayout = False     Me.PrintSection = False   Else     RowCount = RowCount + 1     If RowCount < MaxRow Then       Me.NextRecord = False       Me.MoveLayout = True     Else       RowCount = 0     End If   End If End Sub Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)   RowCount = RowCount + 1 End Sub

shinnnn
質問者

お礼

ありがとうございます。 とても興味深い内容でした。 レポートで制御できれば、データベースでブランクを作らずに済みますね。 次回是非ともこちらの方法も視野に入れていきたいと思います。

  • tkgoya
  • ベストアンサー率0% (0/1)
回答No.6

n の倍数を判定したい場合は剰余を計算する「Mod演算子」を使用します。 m が n の倍数なら、m ÷ n の余りは 0 になりますので、下記のようにします。 Do Until KANRI_TANA_KENSU Mod 8 = 0 ---- 中略 ---- Loop ※但し、KANRI_TANA_KENSU が 0 の場合にも剰余は 0 になりますので注意が必要です。

参考URL:
http://www.geocities.jp/cbc_vbnet/kisuhen/enzanshi.html
shinnnn
質問者

お礼

なるほど、IF文で<>0を条件に入れてやれば いけそうですね。 とてもシンプルなコードでわかりやすいです。

回答No.5

Do Until KANRI_TANA_KENSU Mod 8 = 0 でいいですね。 ただし、これは8件目でループを抜ける形になるので、 正しくは9かもしれません。 また、0から開始する場合は初回でループを抜けてしまう為、 宜しくありません。 (そこはロジックの書き方の問題)

shinnnn
質問者

お礼

ありがとうございます。 事前に条件文で絞り込んでこの処理を通せばクリアできそうです。 その辺はデバックしながら検証していきたいと思います。

  • MSZ006
  • ベストアンサー率38% (390/1011)
回答No.4

#3です。計算を誤りました。 レコード件数がXだとすると、 7-((X+7) mod 8) で追加すべき空白レコードの件数が出ます。 For~Nextで回せばどうでしょうか。

  • MSZ006
  • ベストアンサー率38% (390/1011)
回答No.3

レコード件数がXだとすると、 ((X+1) mod 8) -1 で追加すべき空白レコードの件数が出ます。 For~Nextで回せばどうでしょうか。

shinnnn
質問者

お礼

ありがとうございます。 訂正頂いた内容の物で一度検証してみたいと思います。

  • emsuja
  • ベストアンサー率50% (1034/2055)
回答No.2

KNRI_TANA_KENSU が整数なら If KANRI_TANA_KENSU Mod 8 = 0 Then Exit Do で Loop を抜け出せばいいのでは

関連するQ&A

  • Excel-VBAでMySQのレコード件数を得たい

    Excel-VBAでレンタルサーバーにあるMySQLのテーブルのレコード件数を得たいのですが、うまくいきません。 色々と調べて下記のようなコードにしたのですが、結果「-1」と表示されます。 レコードは1500件ほどあります。 Excel-VBAからテーブルにレコードを挿入したり、Excel-VBAにレコードをもってきたりはできますので、アクセス自体は問題ないと思います。 どうにも分からず困ってます、どなたか教えてください。 環境としては、Excel2000 WindowsXP MySQL5 ver5.xx です。 Sub testxx() Dim con As ADODB.Connection Dim rs As ADODB.Recordset Dim connectionString As String Dim kensu As Integer connectionString = "Driver={MySQL ODBC 5.1 DRIVER};" _ & " SERVER=xxxx.xxxx.jp;" _ & " DATABASE=xxxDB;" _ & " USER=xxxuser;" _ & " PASSWORD=xxxpass;" Set con = New ADODB.Connection con.Open connectionString sqlStr = "select * from LinkTable" Set rs = con.Execute(sqlStr) 'kensu:件数----------- kensu = rs.RecordCount MsgBox (kensu) 'kensu:件数----------- con.Close End Sub

  • レコードを上から順に読み込みたい

    SQLを初めたばかりです。ACCESS2010を使っています。 テーブルを上から順番に読み込んで、とあるフィールドの数値に 1を足してから該当レコードを更新する単純なことがしたいのですが 上手く行きません。 現在は次のようになっています。 rs.Open "uriage", cn, , adLockOptimistic Do Until rs.EOF sql = "" sql = "UPDATE uriage SET 売上額 = 売上額 + 1" cn.Execute sql rs.MoveNext Loop これを実行すると、売上額フィールドに入っている数値に レコードの件数分の数値が足された結果となります。 例えばレコード件数が10で、売上額が1なら11、となります。 多分初歩的な事が理解できていないのだと思いますが 何故なのかがわかりません。

  • テキストファイルの件数カウントと照合

    A.txt、B.txt、C.txt の3つのファイルがあります。 1日1回この3ファイルを結合してABC.txtと言う1ファイルにしています(その後別処理で使用)。 結合前(3ファイル)と結合後のレコード件数を照合したいのです。 やりたい事は、 件数が合っていれば、「処理した日にち」「件数」「件数合ってます」 件数が違っていたら、「処理した日にち」「結合前合計件数」「結合後件数」「件数違っています」 をaaa.@bbb.co.jp宛てにメール配信させたいのです。 自分なりにいろいろと調べては見ましたが、VBの知識もほとんど無いため出来ません。 コーディングをご教授いただけるとありがたいです。 よろしくお願いいたします。

  • Perlで処理の進行状況をユーザーにリアルタイムに知らせる

    現在作成中のPerlCGIプログラムを実際に実行すると、かなりのレコード件数の処理をおこなうので、処理終了までの時間がかかると考えられます。 その間ユーザーの画面に、「現在処理中しばらくお待ちください。」という表示だけでは、「おい!本当に動いてるのかよ」と不安にさせることになりますので、1レコードの処理が終了するごとに「1件目の処理が終了しました。」「2件目の処理が終了しました。」・・・というように表示させたいのです。 よくWebページで処理を依頼すると、「現在処理中」とかで、レベルメーターが伸びていくのとかありますが、そんな感じです。 どのようなコードを書けば、レコードの処理ごとにユーザー側のHTMLを更新することが出来るのでしょう。 コーディング例または、参考URLなど教えていただけたら助かります。

    • ベストアンサー
    • Perl
  • データの絞り込みってどのように処理されていますか?

    AccessVBAで作業しています。 テーブル1の中に、A・B・C・D・E・Fという数値型のフィールドがあり、レコード数は6万件とします。 A=100 B=50 のA~Fのレコードをまず取り出し、  レコード件数が1件ならF列の値を表示、  レコード件数が複数ならC列の最大値を含むレコードを選択。   それでレコード件数が1件ならF列の値を表示。   それでもレコード件数が複数ならDの最大値を含むレコードを選択。    それで件数が1件ならF列の値を・・・    それでも複数件ならE列の最大値を・・・ と続きます。 そのたびに元のテーブル1から選択してくるのは効率が悪い気がします。 みなさんはどのように処理されるのでしょうか。 また、レコードセットを使用したSQLの書き方がわからず困っています。 どなたか教えていただけませんか? 何卒よろしくお願いいたします。

  • RecordCount(ADO)が変わる?ADP+SQLServer

    ACCESS2000(ADP)+SQLServerにて作成したものですが、 あるクライアント(1台)だけRecordCountがおかしいのです。 <フォームAのボタンクリック時の処理> DoCmd.OpenForm "フォームB", , , , , , Me!コード <フォームBの読み込み時の処理> Dim rs AS ADODB.Recordset Set rs = Me.RecordsetClone rs.Find "コード=" & Me.OpenArgs, 0, adSearchForward If not rs.EOF then Me.Bookmark = rs.Bookmark End if 問題のないクライアント(他の2台)では、 フォームBにてOpenArgに指定したコードが検索され, 該当のレコードが表示されます。 問題のクライアントでは、 「一部」のレコードを指定した場合にレコードが検索されず、 最初のレコードが表示されました。 原因を調べているうちに分かったことは、 Set rs = Me.RecordsetClone で取得したレコードセットがあるタイミングでは、 一部かけた状態になっているということです。 その際に使用した方法は、 Set rs = Me.RecordsetClone rs.MoveLast MsgBox rs.RecordCount MsgBox rs.RecordCount としてレコードの件数を調べて判明しました。 MsgBox rs.RecordCountが2つあるのは記述ミスではありません。 該当のテーブル(レコード)は757件ありますが、 問題のないクライアントでは2回ともに757を返します。 問題のクライアントでは、 1回目のRecordCountは500 2回目のRecordCountは757を返してきます。 しかも、何回も実行していると 1回目が400、450、500とランダムで変化します。 (500が2回続いたりするときもあります) 以上のことから、考えられる原因は何かありますでしょうか。 よろしくお願いいたします。

  • DBの値を正しく取得して計算したい

    DBに登録されている値をカウントしてその項目が何件登録されていて全体の値の何%かをだしたいんですが、正しい件数と割合がでません。 If Not 賃貸マン.Text = "" Then On Error GoTo Etrap MySql = "SELECT * FROM 顧客分析 WHERE 住居形態 = '" & 賃貸マン.Text & "'" Rs.Open MySql, Cn If Rs.BOF Or Rs.EOF Or Rs.RecordCount = 0 Then '検索データチェック 賃貸件数.Caption = 0 賃貸比率.Caption = 0 MsgBox ("現在住居『" & 賃貸マン.Text & "』は該当データが存在しません") '検索失敗時の処理 Else '検索成功時の取得データのテキストへの表示処理 tinkazu1 = Rs.RecordCount 賃貸件数.Caption = tinkazu1 cunt = Round((tinkazu1 / sum) * 100, 2) '桁数指定 賃貸比率.Caption = cunt End If Rs.Close On Error GoTo 0 Else 賃貸件数.Caption = "" 賃貸比率.Caption = "" End If どうかよろしくお願いします

  • PerlでCSVデータの一部修正

    例えば下記の様なCSVファイルで ============================ ID,fild1,fild2,fild3 0001,aaaa,bbbb,cccc 0002,dddd,eeee,ffff 0003,gggg,hhhh,iiii (以下かなりのレコード件数) ============================ 0002行目のレコードのffffを別の文字列に修正し再保存するには、どんなコードを書けば良いのでしょうか? 今のところ 元のCSVをopen(FH,"<ファイル名")で読込み、都度配列に入れてから、それをループでID[添字]==0002ならそのレコードのfild3[添字]を書き替えるという処理を行い、open(FH,">ファイル名")で、またループして全部のデータを書き込んでいく・・・という事をしています。こんな事やってたらすごくパフォーマンスが悪いだろうなと思いつつ、独学のかなしさで今までそうしているのですが、レコードが増えるとどうなるのだろうと不安です。 レコード件数が増えても読込み、書込みに時間に影響の出にくいコーディングを教えて下さい。

    • ベストアンサー
    • Perl
  • [VB6]プログレスバーコントロールの使用法について

    環境:VB6.0+SP5, DB: Adaptive Server AnyWhere こんにちは。 プログレスバーコントロールの使い方について質問させていただきます。 データベースにクエリを投げて、レコードセットを取得する関数myFunctionを次のように書きました。 ここで処理の進捗に合わせてプログレスバーを表示する機能を追加したいと思います。 参考書を調べた結果、↓のようなもの組み込めば良いのだろうと考えましたが、 繰り返し文の中身をどう記述して良いものかわかりません。 申し訳ありませんがお力を貸して頂けないでしょうか? また、もっとスマートな方法があれば、そちらも教えていただけると助かります。 ///////////////////////////////////////////////////// 'プログレスバーコントロールを設置したフォームを呼び出す frm_progressBar.Show frm_progressBar.ProgressBar1.Visible = True frm_progressBar.ProgressBar1.Max = q_rs!rNum For i = 1 To q_rs!rNum frm_progressBar.ProgressBar1.Value = i 'レコード取得 Next i ////////////////////////////////////////////////////// Public Function myFunction(query As String) As Recordset Dim p_rs As Recordset 'DBから取得したレコードセット Set p_rs = New ADODB.Recordset Dim q_rs As Recordset 'レコード件数を格納 Set q_rs = New ADODB.Recordset Dim i As Integer ' 'テーブルのレコード件数を取得 Set q_rs = con.Execute("SELECT COUNT(*) as rNum FROM AppEnd_Logs", , adCmdText) p_rs.CursorLocation = adUseClient p_rs.Open query, con, adOpenStatic Set myFuncsion = p_rs q_rs.Close Set q_rs = Nothing End Function

  • オラクルのデータをAccessに追加 無限ループ

    前回、オラクルからデータを取り出し、Accessのテーブルに書き込みを教えて頂き、データ追加は出来たのですが、データ追加時に無限ループが発生しました。 【環境】 Oracle:10g Access:2010 Dim CON As New ADODB.Connection 'Oracle側コネクション Dim RS As ADODB.Recordset 'Oracle側レコードセット Dim SQL As String 'Oracle側SQL文 Dim i As Integer '処理用インクリメント Dim DT As Date '抽出日付変数(日付型) Dim sDT As String '抽出日付変数(テキスト型) Dim RS2 As ADODB.Recordset 'Access側レコードセット ◎現在の状況 Dim CON As New ADODB.Connection Dim RS As ADODB.Recordset Dim SQL As String Dim i As Integer 'DB接続定義 CON.Open "DSN=DNS名;UID=ユーザー名;PWD=パスワード;" 'SQL文 SQL = "SELECT " SQL = SQL & "カラム1," SQL = SQL & "カラム2," SQL = SQL & "カラム3" SQL = SQL & "FROM オラクルテーブル名 " SQL = SQL & "WHERE 抽出条件 " SQL = SQL & "AND 抽出条件" SQL = SQL & "GROUP BY カラム" SET RS = CON.EXCUTE(SQL) ’取得したレコード数表示 MsgBox "オラクル側のレコード数は: " & RS.RecordCount (1)↑↑↑オラクルから、抽出したレコード数表示 rs2.Open "新しいテーブル名", CurrentProject.Connection, adOpenKeyset, adLockOptimistic rs.MoveFirst Do Until rs.EOF rs2.AddNew rs2!カラム1 = rs!カラム1 rs2!カラム2 = rs!カラム2 rs2!カラム3 = rs!カラム3 rs2.Update rs2.Close: Set rs2 = Nothing rs.close: SET RS = Nothing con.close:SET CON=Nothing end sub 上記を実行したところ、いくら待っても処理がおわらず、強制終了をかけた所、新テーブルには、約150万件追加されてました。 (1)でオラクルから抽出した、レコード数を表示させてみた所、-1でした。 ◎疑問点、 -1ってありえない数値だと思うのですが。 ちなみに、オラクル側で同様のSQLを実行させた所、取得件数は48件でした。 上記について、ご存じの方がいらっしゃいましたら、アドバイスお願いいたします。

専門家に質問してみよう