カテゴリー
SugiBlog ホームページ制作・システム開発|大阪

Micosoft Office Accessのファイルが壊れる

Windows7のサポートが終了して7ヶ月が経ちました。
皆さんはWindows10への移行はお済みでしょうか?

私も公私共にWindowsを利用しており、Windows10でほぼ問題なく使用出来ているのですが、一つだけ問題があります。
それはOfficeのAccessで作成しているデータベースファイルが壊れるということです。

壊れるといってもそのファイルが使えなくなるわけではありません。
データベースの内容に矛盾が生じ、修復の作業が必要になってしまうわけです。
データベースでは常に最適化する作業が必要になってくるのは当たり前なのですが、最近この状況が頻繁に発生するようになってしまいました。

ちなみにこのようなメッセージが表示されます。

初めは[Accessで発生するメモリー不足エラー]で紹介した事象が起こっていました。
解決したようにも思えましたが、しばらくすると壊れるようになってきました。
そしてその頻度も日を追うごとに頻繁に起こるように…。

それを解消するために色々とやってみました。
続きを読む…»

0
209 views

VBで指定した日の曜日が月のうち何回目かを調べる

今回は、「今日は第何○曜日か知りたい」という時に使えるプログラムを紹介します。
今日が金曜日だと仮定して、今月のうち何回目の金曜日かを知りたい時に使います。

2つの日時の間隔を返すDateDiff関数を使って結果を求めます。

まずDateDiffの第1引数には「ww」を指定し、週の開始曜日をカウントの基準に設定します。
そして第3引数である“週の開始曜日”に調べたい日の曜日を入力することによってその曜日が月のうち何回目なのかを取得することができます。

ソースは次のようになります。

Dim year As Integer
Dim mon  As Integer
Dim day  As Integer
Dim ww   As Integer

year = 2020
mon = 7
day = 10

ww = DateDiff("ww", DateSerial(year, mon, 0), _
    DateSerial(year, mon, day), _
    Weekday(DateSerial(year, mon, day)))

Debug.Print ww & "回目"

出力結果は

2回目

となります。
続きを読む…»

1+
211 views

Chr関数で表現する制御文字

vbCrLfやvbTabなど、定数が使用できないときにChr関数を使って表現します。

Chr関数の書式

Chr([ASCIIコード])
定数 Chr関数での表記
vbTab Chr(9) タブ
vbCr Chr(13) キャリッジリターン
vbLf Chr(10) ラインフィード
vbCrLf Chr(13) & Chr(10) キャリッジリターン+ラインフィード

ACCESSのクエリでは定数が使用できないので、知っておくと便利です。

0
262 views

Accessで発生するメモリー不足エラー

Accessで「メモリー不足です」という正体不明のエラーが出て困っています。
使用環境はWindows10 Pro 64bit、Access2016・2013です。

これまでも平常通り行ってきた業務をしていたら、上記のように「メモリー不足です」というエラーが発生し、データ元のAccessファイルが壊れてしまうという現象が発生しました。
原因としては多々あるようですが、原因の1つとして分かったことがあったので共有させていただければと思います。

原因の究明

まず、エラーが出るPCと出ないPCがあること。
出るPCと出ないPCの差を見つける。

発見した原因

積んでいるメモリーの差
エラーが出るPC、出ないPCの差を見たところ、OSはどちらもWindows10 Pro 64bit、CPU等も特に目立った違いがない。
記事の最後にリンクを貼っているMicrosoftのページにあるレジストリの値も全て同じ設定でした。
その他で唯一違ったのが積んでいるメモリー容量で32GBと16GBでした。

エラー解消…ではない

先ほど見つけたのがメモリーの違いということで、エラーが発生するPCの32GBのメモリーを16GBに変更しました。
すると明らかにエラーの発生する頻度が激減!

ただし、激減なので全く出なくなったわけではありません。
完全に解消したいとことなのですが、エラーが出ないPCもあるため、原因の究明はかなり難しいものと思われます。

下記URLも参考にさせて頂いたので、同じように悩まれている方がいらっしゃれば参考にしていただければ幸いです。

参考URL:
Access2010およびAccess2019で謎にエラー、「メモリ不足」でクエリー停止、ちょっとだけ解決
Access でメモリ不足エラーが発生する現象の対処策について

0
340 views

ナビゲーションウィンドウを非表示にする

ACCESSにて、コードでリンクテーブルを設定した時など、非表示にしていたナビゲーションウィンドウが表示されてしまうことがあります。
以下のコードを実行するとナビゲーションウィンドウを再び非表示にすることができます。

DoCmd.NavigateTo "acNavigationCategoryObjectType", ""
DoCmd.RunCommand acCmdWindowHide

また、逆に表示したいときは以下のようにします。

DoCmd.NavigateTo "acNavigationCategoryObjectType", ""
DoCmd.RunCommand acCmdWindowShow
0
1,911 views

文字列の長さを求める Len/LenB

VBAで文字列の長さを求める際は少し注意が必要です。
通常のLen関数を使用した場合、半角・全角に関わらず全ての文字を一文字として計算します。
かといって、LenB関数を使用しても、全ての文字を2バイトとして計算するため、答えは倍になるだけです。

他のプログラム、例えばPHPならstrlen関数になりますが、こちらでは半角は1バイト、全角なら2バイトとなります。
こちらと同じようにVBAでも計算したい場合はどうすれば良いのでしょうか?
答えは以下のようになります。

'長さを求めたい文字列
HenkanStr = "LenB関数"
MsgBox LenB(StrConv(HenkanStr, vbFromUnicode))

出力結果は「8」となります。

0
2,194 views

データ競合のエラーを無視する

ACCESSで発生したデータ競合のエラーを無視するにはエラーイベントに
以下のような記述をします。

Private Sub Form_Error(DataErr As Integer, Response As Integer)

    If DataErr = 7787 Then
         Response = acDataErrContinue
    End If

End Sub

「7787」はデータ競合エラーのエラー番号

定数「acDataErrContinue」の値は「0」です。

これで競合エラーを無視した場合は、[他のユーザーによる変更を反映]を
選択したのと同じ扱いになります。

0
2,169 views

ACCESS フィルター VBA

よく使うので覚書

Private Sub Search()
On Error Goto Exception

    Dim Coll  As Collection
    Dim SQL() As String

    Set Coll = New Collection


    If Not IsNull([検索テキスト]) Then
        Coll.Add "[フィールド1] Like '*" & [検索テキスト] & "*'"
    End If

    If [検索チェック] = -1 Then
        Coll.Add "[チェックフィールド] = " & [検索チェック]
    End If

    If [検索チェック2] = 0 Then
        Coll.Add "[チェックフィールド2] = 0"
    End If


    If Coll.Count > 0 Then
        For i = 1 To Coll.Count
            ReDim Preserve SQL(i - 1) As String
            SQL(i - 1) = Coll(i)
        Next i
        DoCmd.ApplyFilter , Join(SQL, " And ")
        'Debug.Print Join(SQL, " And ") '確認用
    Else
        Me.FilterOn = False
    End If

Exit Sub
Exception:
    MsgBox Err.Description
End Sub
0
1,358 views

CSVエクスポートでのテキストデータのNull値について ACCESS

AccessでCSVをエクスポートする際、テキスト型のフィールドがNullだった場合、
「,””,」とならず「,,」となってしまいます。
※前後にフィールドがあるとしています。

他のソフトやプログラムで該当ファイルを使用するときに、ダブルクォーテーション「”」が
必要な場合があります。

そういう時はNz関数を使います。
Nz関数はNullを別の文字列に置き換えしてれくる関数です。

データがNullだった場合、「,””,」という結果にするためには、Nullを長さゼロの文字列に置き換えます。

Nz([フィールド名],"")

もちろん、指定したフィールドのデータがNullでない場合はそのデータを返します。

0
6,896 views

Excel 罫線等の定数まとめ【Access】

AccessからExcelを操作し、罫線等を設定する場合、私自身もいつも定数の値が何だったかいちいち調べているので、備忘録も兼ねて書いておきます。

まずは全体の流れ

Dim ws

Dim xlApp      As Object
Dim xlBook     As Object
Dim xlSheet    As Object
Dim FileName   As String

Set ws = CreateObject("WScript.Shell")

FileName = ws.SpecialFolders("Desktop") & "\雛形.xlsx"

Set xlApp = CreateObject("Excel.Application")
Set xlBook = xlApp.Workbooks.Open(FileName)
Set xlSheet = xlBook.WorkSheets(1)

With xlSheet
    'このブロック内に書いていきます
End With

'保存
xlBook.Save

xlBook.Close

xlApp.Application.Quit

Set xlSheet = Nothing
Set xlBook = Nothing
Set xlApp = Nothing

罫線を引く

.Range("A1:I1").Borders.LineStyle = 1
.Range("A1:I1").Borders(8).LineStyle = -4118
.Range("A1:I1").Borders(11).LineStyle = -4115
.Range("A1:I1").Borders(11).Weight = 1

続きを読む…»

0
8,786 views