Microsoft Access Club Access超初心者対象Forum Access初級者対象Forum Access初・中級者対象Forum Access VBA Tips Forum DAO、ADO、SQL Forum

     

リストへもどる

新着の投稿記事


タイトルRe^3: 2017_1列138億行の数値をFor文でテーブルに自動入力するコード
記事No16855   [関連記事]
投稿日: 2017/03/07(Tue) 04:26
投稿者hatena
返信が付いているを見逃していました。
遅くなってすみません。

> 1.  先頭の¥マークなどは外したい
>
>  データ型を通貨型に変えたら、3桁区切りや、先頭に¥マークや$マーク が付きますよね。私が最終的に欲しいデータは、3桁区切りも¥マークもない、単純な数値だけのデータなのです。
>  データ型を通貨型「¥13,800,000,000」にしておいて、最終的な格納データを整数値のみの「13800000000」に変換するにはどうすればいいですか?

テーブルをデザインビューで開いて、フィールドの「書式」プロパティを確認してください。
初期値のままだと「通貨」になってますので「数値」に変更してください。

これで「13800000000」という表示になります。

通貨型でもテーブルに格納されているのは、13800000000 というような数値です。書式プロパティでお好みの表示に変更できるようになってます。
詳細は書式プロパティのヘルプを参照してください。


> 2.  オーバーフロー回避型プログラムを最初から意図的に組みました

> 長整数型を最大限まで活用すると(A)になって、長整数型のテーブル約7テーブル。
> 計算と後からの数値のチェックをかんたんにするために、長整数型をキリの良い2,000,000,000(20億)までとしても(B)になって、結局、Accessテーブルが7個あるだけで138億を満たします。その7個のテーブルをSQLのADD構文の「列の追加」か、クエリのテーブルの結合で1テーブルにしようかな……と思っていたのですが。

SQLのADD構文、テーブルの結合 の意味を理解していないようですね。
どちらも希望に合致しない処理です。
使うとするとユニオンクエリですね。

>  ちなみに、この場合、2月13日付けのコード B) のようなFor構文やコーディングを修正するとしたら、どこをどう修正すれば良いのでしょうか? A) のコーディングが成功して、B) のコーディングが失敗したというのは、これから本格的なプログラマーを目指す人々の末席にいるものとして、どうしても知っておきたいです。

B) のコーディングは、「どこをどう修正する」以前に、
AddNewを1回だけ実行して、あとは同じレコードを繰り返し上書きしているにすぎません。
この間違いに気づきませんか。


「これから本格的なプログラマーを目指す人々の末席にいる」のなら、
・機能、プロパティを把握して、適切なもの使用する。
・コードの意味をヘルプ等で調べてきちんと理解する。
・やろうとしていることを分析して、まずは論理的な言葉で文章化してみる。
これをコードに変換するという作業をするといいでしょう。
フロー図なども書くといいでしょう。

タイトル1種類のフォームを使って複数のフォームを開いた時、新しいフォームの内容に上書きされてしまう。
記事No16854   [関連記事]
投稿日: 2017/03/06(Mon) 10:37
投稿者Ken!!
解決済: ON
OS:Windows10
Access Version:Access2016

お世話になります。
色々と調べたのですが、どうしても解決できずご質問させていただきました。

Access VBA で Staticステートメントを使ってフォームを複数開いた時、それまでに開いたフォームの内容(=レコード)が、一番新しいフォームで表示した内容に置き換わってしまうことに悩んでします。

現状は・・・
メニューフォームからチェックボックスで目的の氏名を選択します。
---------------
■ 顧客.氏名A
□ 顧客.氏名B
□ 顧客.氏名C
---------------
上記のように1つだけの氏名Aを選択して抽出すると、Staticステートメントで定義したフォームが開いて、氏名Aのレコードが表示されています。

悩んでいるのは、これを複数選択した時のフォームの動作です。
---------------
■ 顧客.氏名A
■ 顧客.氏名B
□ 顧客.氏名C
---------------
上の状態は、氏名Aと氏名Bを選択した状態です。
SQLで1件目の氏名のレコードを抽出してフォームに表示したあと、2件目の氏名レコードを抽出して新しいフォームに表示する仕掛けにしています。SQLで引っ張ってきた各レコードの抽出結果は確認済みです。

分からないのは、1件目のフォームに氏名Bのレコードが表示されたあと、その前面に2つめのフォームが開いて2件目の氏名Aのレコードを表示しているのですが、後ろに隠れた氏名Bのフォームを表示すると、そのフォーム内容が氏名Aのレコードに置き換わってしまいます。
デバッグすると1件目のフォームが表示された時は氏名Bのレコードが正しく表示されていました。
2件目のフォームが開いた直後に、1件目のフォームの氏名Aのレコードにに置き換わっていました。
レコードソースが違うのにナゼ?な状態です。

最初に開いた氏名Bフォームに、あとから開いた氏名Aフォームの内容が更新されるのかが分かりません。
何か大きな勘違いをしているのかもしれませんが、この症状を解決したいので、どなたかご教示いただけますと幸いです。


Option Compare Database
Option Explicit
-------
Public Sub NameSearch()
Dim i as Integer
 :
Dim sSQL as String
Static frm(2) As New Form_frm顧客一覧
 :
<氏名毎に抽出するSQLを変数にセット>
For i=1 to 2 (...選択した氏名 2件分を繰り返す)
 :
 sSQL= "SELECT 〜 ;"(...顧客テーブルから氏名のレコードを抽出するSQL文をセット)
 :
<フォームのオブジェクト変数を割り当て>
 Set frm(i) = New Form_frm顧客一覧
  With frm(i)
  .RecordSource = sSQL
  .Visible = True
  End With
 End Sub
 :
Next i
 :
End Sub

どうぞ、よろしくお願いします。


<追記>
2017.3.6 12:55

自己解決しました。

上記のSQL命令を発行する直前で、顧客テーブルに更新クエリーをかけたあと、それをそのままSQLで引っ張り出して、フォームのレコードソースにセットしていました。
これを別のテーブルに書き出してから試したところ、フォームの内容が置き換わることなく意図通りに表示するようになりました。

お騒がせしました。
今後ともよろしくお願い申し上げます。

タイトルRe^2: 2017_1列138億行の数値をFor文でテーブルに自動入力するコード
記事No16853   [関連記事]
投稿日: 2017/02/14(Tue) 13:57
投稿者小川春子
Hatenaさん、ありがとうございます!

「フィールドのデータ型を通貨型、変数宣言を Currency に変更して試してみてください。通貨型なら、兆を超える数値も扱えます。」

これは良いことを聞きました。早速試してみますね。

でも、素朴な疑問が2点ほどあります。

1.  先頭の¥マークなどは外したい

 データ型を通貨型に変えたら、3桁区切りや、先頭に¥マークや$マーク が付きますよね。私が最終的に欲しいデータは、3桁区切りも¥マークもない、単純な数値だけのデータなのです。
 データ型を通貨型「¥13,800,000,000」にしておいて、最終的な格納データを整数値のみの「13800000000」に変換するにはどうすればいいですか?

2.  オーバーフロー回避型プログラムを最初から意図的に組みました

 長整数型(Long)に格納できる数値は+(正数)で2,147,483,647までだということは、実はMicrosoft公式サイトであらかじめ確認していました。なので、A) のFor i = 0 To j文の前に、とりあえず最大値 [j = 1000000] までにしました。それで、VBAプログラムがちゃんと正確に1000000(100万)行までのレコードに整数値1から整数値1000000までの価を格納することに成功したことを、まず確認しました。それから後は、初期値を1000001にしてこういう作業を根気よく繰り返せば、結果的には13800000000(138億)という数値の格納されたレコードが自然に実現されるでしょう?

 ちなみに、Excel2016は1Sheet最大行数1,048,576行までしか入りませんが、Access2016はMicrosoft公式サイトの仕様によると行数は無制限です。ただしAccess容量最大値2 GBまでとなっています。

https://support.office.com/ja-jp/article/Access-2016-%25E3%2581%25AE%25E4%25BB%2595%25E6%25A7%2598-0cf3c66f-9cf2-4e32-9568-98c1025bb47c?ui=ja-JP&rs=ja-JP&ad=JP&fromAR=1

 長整数型に格納できる数値は正数で2,147,483,647までなので、次のような計算になりますね。
(A) 13800000000 ÷ 2,147,483,647 = 6.4261……
(B) 13800000000 ÷ 2,000,000,000 = 6.9000……

長整数型を最大限まで活用すると(A)になって、長整数型のテーブル約7テーブル。
計算と後からの数値のチェックをかんたんにするために、長整数型をキリの良い2,000,000,000(20億)までとしても(B)になって、結局、Accessテーブルが7個あるだけで138億を満たします。その7個のテーブルをSQLのADD構文の「列の追加」か、クエリのテーブルの結合で1テーブルにしようかな……と思っていたのですが。

 ちなみに、この場合、2月13日付けのコード B) のようなFor構文やコーディングを修正するとしたら、どこをどう修正すれば良いのでしょうか? A) のコーディングが成功して、B) のコーディングが失敗したというのは、これから本格的なプログラマーを目指す人々の末席にいるものとして、どうしても知っておきたいです。

 みなさま、どうかよろしくご指導お願いいたしますね。

タイトルRe: 2017_1列138億行の数値をFor文でテーブルに自動入力するコード
記事No16852   [関連記事]
投稿日: 2017/02/14(Tue) 11:08
投稿者hatena
長整数型(Long)に格納できる数値の範囲は、

-2,147,483,648 〜 2,147,483,647

です。
それ以上の数値を代入しようとすると、間違って数値は返すという以前に、オーバーフローエラーになるはずです。


フィールドのデータ型を通貨型、変数宣言を Currency に変更して試してみてください。
通貨型なら、兆を超える数値も扱えます。

タイトル2017_1列138億行の数値をFor文でテーブルに自動入力するコード
記事No16851   [関連記事]
投稿日: 2017/02/13(Mon) 17:58
投稿者小川春子
OS: Windows 10
Access Version: Access 2016


 Access VBAとSQLの超初心者です。どうぞ、よろしくご指導くださいね。
 急いでおりますので、恐れ入りますが、断片的でもいいので、至急ご回答お願いできないでしょうか。

 実現したい目的は、いたってシンプル。膨大なのはレコード数だけで、1列138億行に0から13800000000までの整数の数値のみを1ずつインクリメントするだけという単純明快なプログラム。

1. 1フィールドのみ。
主キーとしてオートナンバーのフィールドを後から追加するが、それでも2列。
2. データ型はLong(長整数型)のみ。
しかも、単純な整数値のインクリメントなので、かんたんなFor文だけでOK.
3. 数個のテーブルに分けて結果データを格納。
4. 問題は、このFor文が100億行を超えると間違った数値を返すということ。
5. ソースコードを記述するので、訂正・改正・アドバイスをお願いしたい。
6. 完全な回答でなくとも、何かしらヒントとかアイデアとか感想のような回答でもOK.

A) 100万行までは下記コードで簡単にテーブルにデータを格納できました。

Sub addNewRecord()

Dim i As Long
Dim j As Long
Dim rs As New ADODB.Recordset

rs.Open "T_Master", CurrentProject.Connection, , adLockOptimistic
rs.AddNew

i = 0
j = 1000000

For i = 0 To j
rs!code = i
rs.AddNew
Next

rs.Update
rs.Close
End Sub

B) でも、同じようなコードなのに、100億行を超えると間違った数値を返します。

Sub addNewRecord_2()

Dim i As Long
Dim j As Long
Dim K As Long
Dim L As Long
Dim rs As New ADODB.Recordset

rs.Open"T_Master", CurrentProject.Connection, , adLockOptimistic
rs.AddNew
rs!code = 10000000

K = 10000001
L = 2000000000
M = 10000000

'If rs!id >= K Then
'For i = i To j
'rs!id = i
'Next
'Else
'i = 1
'For i = 1 To j
'rs!id = i
'Next

'If rs!id >= K Then
If rs!code >= M Then
For K = K To L
rs!code = K
Next
End If
' End If
rs.Update
rs.Close
End Sub

タイトルRe: ネット上の表取得時、.lengthで正確な要素数が拾えない、また、読み込みの途中でエラーが出て止まる
記事No16850   [関連記事]
投稿日: 2017/02/03(Fri) 00:58
投稿者しゅういち
解決済: ON
すみません、自己解決しました。
ホームページの後に#tabs1のように、表示されるtabを設定したら、情報を取ってくれました。
lengthの件はよくわかりませんが、tabの設定によるもののようでした。
お騒がせして大変失礼いたしました。

タイトルネット上の表取得時、.lengthで正確な要素数が拾えない、また、読み込みの途中でエラーが出て止まる
記事No16849   [関連記事]
投稿日: 2017/02/02(Thu) 15:22
投稿者しゅういち
解決済: ON
OS:windows10 Home(64bit)
Access Version:Access 2002

すみません、accessのVBをひと月ぐらいしか経験していない 超初心者です。初めての投稿となりますが、完全に行き詰りましたので、どなたかお力添えをいただけましたら幸いです。

ある会員制のホームページの情報をaccessに落として利用したいと考えています。
そのホームページは、tabを使ったり、クリックすると別ウィンドウが開いたりと、いろいろな動作をするような、かなり凝った造りです。

先日、別の、単純なつくりのホームページからデータを抜いたことがあり、同じようにすればできるだろうと思って、いろいろなサイトを参考にしながら、次のようなコードを組んで、まずは情報が取れるか確認をしました。

Option Compare Database
Private Sub test()
Dim ie As Object
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
ie.Navigate "(該当のホームページ)"
Do While ie.Busy Or (ie.ReadyState <> 4): DoEvents: Loop
For i = 0 To ie.Document.all.tags("td").length-1
MsgBox i & ":" & ie.Document.all.tags("td")(i).innertext
Next
End Sub

すると、なぜか、メッセージボックスの表示は、iが330ぐらいを過ぎたところで終わってしまいます。

MsgBox ie.Document.all.tags("td").length

として要素数を確認すると、335という奇妙な数字が出てきました。実際のホームページをエディタで開いて確認しましたが、もちろん、335以上のデータがあります。それに、該当する部分も中途半端で、その場所になにか問題があるとも考えにくいです(表の何行目かの途中で終わるのですが、この表は、各行、同じかきかたをしてあるので、そこの書き方に問題があるとは考えにくい)。

当該ホームページの書き方が複雑なので、正確な数字がでてこないのかなぁ、と思って、

For i = 0 To 5000
MsgBox i & ":" & ie.Document.all.tags("td")(i).innertext
Next

と適当な数字(5000)を入れてみたところ、これも、1900過ぎぐらいまでは認識するのですが、
途中でエラーが出て、

実行時エラー91
オブジェクト変数またはWithブロック変数が指定されていません

と表示されて、止まってしまいます。

ホームページの欲しいデータが、かなり後ろの方にあるため、困っているのですが、なんで、.Document.all.tags("td")で、tdのタグがついた全部のデータを拾ってくれないのかが、どうしてもわかりません。

対象のホームページが会員制でお伝えできないため、回答もしにくいとは思うのですが、

@lengthで要素数をきちんと拾ってくれない
A十分に大きな数字にするとlengthで確認した要素数より多く拾ってはくれるが、結局、途中でエラーが出て止まってしまう

この原因としては、どういうことが考えられるものなのでしょうか。同じような経験をしたことがある方や、なんでも結構ですので、なにか思い当たることがおありの方がいらしたら、ご教示いただければ幸いです。なにとぞよろしくお願い申し上げます。

タイトルRe: Win-10 でのAdobe Acrobat Reader DCの設定が原因かも
記事No16848   [関連記事]
投稿日: 2017/01/21(Sat) 17:27
投稿者Ginger0101
解決済: ON
こんにちは。

教えて頂きましたリンク先のAcrobat Readerの保護モード解除であっさり問題解決しました!

貴重なお時間を割いて調べてくださりありがとうございました。

大変感謝しております<m(__)m>

タイトルWin-10 でのAdobe Acrobat Reader DCの設定が原因かも
記事No16847   [関連記事]
投稿日: 2017/01/20(Fri) 23:54
投稿者mayu
解決済: ON
No.16846 にも私の実行環境を記載しましたけど
私と Ginger0101さんの環境で異なるのは OS だけです。
( Win-7 と Win-10 )

ちょろっと調べてみると、コレとか該当してるのではないでしょうか。

http://www.pdf-notext.com/faq/faq_adobe_dc_notext.html

1. 「Adobe Acrobat または Reader に問題があります。... (523:523)」とエラーが出ます。

この「523:523」エラーは、PDF No Textと関係が無く起こります。
弊社環境では、Windows 10 Pro(64bit版) +IE11の環境で起こりました。
弊社環境では、保護モードを解除することで解決できました。

とあり、
Adobe Acrobat Reader DC の環境設定を変更することで
状況が改善されたみたいですよ。

タイトルRe: WEBブラウザコントロールに表示するPDFを次々に変更したい
記事No16846   [関連記事]
投稿日: 2017/01/20(Fri) 23:26
投稿者mayu
解決済: ON
こんばんは。

> Adobe PDF 文書
> Adobe Acrobat または Readerに問題があります。
> Acrobat または Readerを実行をしている場合、
>     終了してからもう一度やり直してください。(523:523)

表示させようとしている PDF の格納場所は
全てローカルPC上にあるのでしょうか。
IE上で信頼済ゾーンに設定されていない
ネットワークフォルダ内にあったりしませんか。

あと、エラーが出るPDFのサイズは、いかほどでしょう。
レコード移動した際に、同期できない( 追いつかない )ほど大きい
ということはないでしょうか。

私の環境は

Windows-7  Pro  SP1  64bit
Access  2010  SP2  32bit版
Internet Explorer 11
C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe

ですが、再現しないですね。

> つまり、PDFを連続してWEBブラウザコントロールに
> 表示しようとしたときのみ問題が発生します。

2レコード目以降ということですよね。
表示順2のレコードで 70MB のPDFを表示させてみたんですけど
普通に表示できました。

> やりたいことは、テーブルにセットされたPDFファイルパスを
> レコードを移動するたびにWEBブラウザコントロールに表示することです。

一般機能のみで PDF の表示が可能ですから
以下に私がテストしたサンプルを掲載しておきますね。


■ DDL-SQL
--------------------------------------------------------

CREATE TABLE t_test
(
      ID       AUTOINCREMENT  NOT NULL PRIMARY KEY
    , ymd      DATETIME       NOT NULL
    , pdf_path VARCHAR( 255 )
) ;

--------------------------------------------------------


■ データ例

 ID   ymd             pdf_path
-----------------------------------------------------------------------
 1  2016/07/28   C:\{ ●実在するPDFのパス }.pdf
 2  2016/10/30   \\10.213.48.???\{ ●実在するパス\PDFの名前 }.pdf
 3  2016/12/25   D:\{ ●実在するPDFのパス }.pdf
 4  2017/01/01   C:\{ ▲実在しないPDFのパス }.pdf
 5  2017/01/08   ( Null )
 6  2017/01/18   C:\{ ▲実在するEXCELのパス }.xlsx
 7  2017/01/20   \\192.168.1.???\{ ●実在するパス\PDFの名前 }.pdf



 単票フォーム : frm 
┌─────────────────────────────┐ 
│                             │
│                             │ 
│      ID              日付      │
│  ┌───────┐      ┌────────┐  │ 
│  │  txt_ID  │      │  txt_YMD   │  │    
│  └───────┘      └────────┘  │ 
│                             │
│      ┌─────────────────┐     │
│  PDFパス│     txt_PDF_PATH      │     │
│      └─────────────────┘     │
│    ┌──────────────────────┐  │
│    │                      │  │
│    │                      │  │
│PDF表示│         web_PDF          │  │
│    │                      │  │
│    │                      │  │
│    └──────────────────────┘  │
│                             │
│                             │
└─────────────────────────────┘
 ※ レコードソース: t_test



  コントロール名   コントロール種別   コントロールソース
------------------------------------------------------------------
    txt_ID      textbox       ID
    txt_YMD      textbox        ymd
    txt_PDF_PATH   textbox       pdf_path
    web_PDF      web-browser      = txt_PDF_PATH



frm 上でレコードを次々と表示させた結果
---------------------------------------------------------------------------
IDが 1 〜 3 のレコードは 問題なくPDFを表示

IDが 4 のレコードは web_PDF 上に「 表示できません 」という通知

IDが 5 のレコードは web_PDF 上には何も表示されず( エラー無し )

IDが 6 のレコードは EXCELのファイルを開くかどうかの確認ダイアログ表示

IDが 7 のレコードは 問題なくPDFを表示
---------------------------------------------------------------------------
となりました。

特にエラーも出ませんし、
別のプロセスで hogehoge-PDF を表示させながら
Accessのフォーム上で hogehoge-PDF をブラウザコントロールに
多重表示させてみても、エラーは出ませんでした。
( PDFのサイズによっては 表示に若干のタイムラグはありますけど )

  では ☆

ページの先頭へ 前ページへ戻る