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

     

リストへもどる

新着の投稿記事


タイトル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のサイズによっては 表示に若干のタイムラグはありますけど )

  では ☆

タイトルWEBブラウザコントロールに表示するPDFを次々に変更したい
記事No16845   [関連記事]
投稿日: 2017/01/20(Fri) 17:14
投稿者Ginger0101
解決済: ON
OS:windows10(64)
Access Version:2010


先日、フォームにPDFを表示したい件で質問させて頂き解決したものですが、再び悩んでおります。

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

先頭のレコードが示すPDFの表示は可能ですが、
次のレコードが示すPDFを表示できません。
次のような警告のポップアップが表示されます。

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


原因を調査すべく、webブラウザコントロールの周りに複数のコマンドボタンを配置し、
各ボタンをクリックされたときに、異なるPDFファイルおよびgoogleマップを
同じwebブラウザコントロールに表示するようにしました。

実行直後、ボタン1クリック→1〜2秒でPDF1が表示
次に、ボタン2クリック →16〜17秒で上記警告ポップアップ表示
(結果PDF2は表示されず)

※この16〜17秒の間、リソースモニターでは、MSACCESS.exeとAcrRD32.exeが応答なしと赤表示されます。
※ボタン1とボタン2をクリック 順番を変えても結果は同じです。
※ACCESS起動直後だと16〜17秒待ったのち正常表示されることや
 1〜2秒程度で正常表示されることがあります(その場合でもボタン3を押したときに問題発生します)。
※PDF表示する間に、ボタン4を押しgoogleマップ等のWEBサイトを表示させると、
 その直後のPDFは1〜2秒で正常表示されます。
 つまり、PDFを連続してWEBブラウザコントロールに表示しようとしたときのみ問題が発生します。
※レジストリを変更し、msaccess.exeでIE11が動くようにしてあります。


今年2度目のお手上げ状態となりました。

皆さまのお知恵を拝借させて頂けたら幸いに存じます<m(__)m>

タイトル「#6:オーバーフロウしました。」とエラーがでてきてしまいます。
記事No16844   [関連記事]
投稿日: 2017/01/17(Tue) 20:13
投稿者こうじ
OS:windows7
Access Version:access2013
AccessのVBAに関しての質問です。

クエリで抽出したファイルをCSVで出力させ、出力したファイル名を「連番&ファイル名」の形にしたく
下記のコードを使用しました。
6ファイルは出力は成功したのですが、7ファイル目を出力しようとしたところ、「#6:オーバーフロウしました。」とエラーがでてきてしまいます。
原因やここのコードを変えれば直るというのが、お分かりになる方がいればご教示頂けますでしょうか。
初心者ですのでコードも書いて頂けると非常に助かります。

Private Sub コマンド4_Click()
On Error GoTo ErrorTrap

Dim varAccess As Variant
Dim varCPass As Variant
Dim strmsg As String

varAccess = "ASN抽出"
Dim FolderPass As String
Dim FileName As String
Dim CheckCount As Integer
FolderPass = "C:¥Users¥エクスポート¥"
FileName = "_STORE_ASN_TRN.csv"
CheckCount = 0
Do Until Dir(FolderPass & FileName) = ""
CheckCount = CheckCount + 1
FileName = Format(CheckCount, Len(CStr(CheckCount)) + 1) & "_STORE_ASN_TRN" & ".csv"
Loop
varTextPass = FolderPass & FileName
strmsg = "csvファイルへ出力します。" & Chr(13) & _
"出力先は" & varTextPass & "です。" & _
"よろしければ、OKをクリックして下さい。"

If MsgBox(strmsg, vbOKCancel) = vbOK Then
DoCmd.TransferText acExportDelim, , varAccess, varTextPass, False
MsgBox "データ出力は、正常に完了しました。"

End If
Exit Sub

ErrorTrap:
If Err.Number = 3044 Then '
MsgBox "パス指定が誤っています。", vbCritical
Else
MsgBox "予期せぬエラーが発生しました。(#" & Err.Number & " : " & Err.Description & ")", vbCritical
End If

End Sub

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