2017年9月14日

【Access】親フォームからの子フォームに値を渡す方法(OpenArgs)



親フォームからの子フォームに値を渡す方法です。

下記は、親フォーム上のテキストボックスに入力した値を、子フォームに渡す例です。


まず、親フォームにテキストボックス(textName)とボタン(buttonOpen)を配置します。



次に、子フォームにも同じようにテキストボックス(textName)とボタン(buttonExit)、あとラベルを配置します。


そして、それぞれのイベントプロシージャに次のように記述します。

親フォーム
Private Sub buttonOpen_Click()

    Dim args As String
    
    If IsNull(Me.textName.Value) = False Then
        args = Me.textName.Value
    End If
    
    DoCmd.OpenForm "子フォーム", acNormal, , , , acDialog, args
    
End Sub

子フォーム
Private Sub Form_Load()
    
    If IsNull(Me.OpenArgs) = False Then
    
        Me.textName.Value = Me.OpenArgs
    
    End If

End Sub

Private Sub buttonExit_Click()

    DoCmd.Close acForm, Me.Name

End Sub


では実行してみます。


まず、親フォームを開き、テキストボックスに値を入力します。

入力できたら「開く」ボタンをクリックします。



すると、このように子フォームのテキストボックスに親フォームで入力した値が表示されます。


解説

親フォームで、DoCmd.OpenFormの7番目の引数に指定した値は子フォームのOpenArgsプロパティで取得することが出来ます。注意としては、引数に値を指定しないとOpenArgsにはNullが入ってきますので、IsNull関数でチェックする必要があります。

AccessではこのOpenArgsを利用して、親フォームからレコードIDを子フォームに渡して、子フォーム上でそのIDの詳細データを表示するといったことをよくします。ぜひ覚えておいてください。


2017年9月13日

【Access】VBAでAccessを終了する



VBAでAccessを終了する方法です。

書式

DoCmd.Quit [オプション]

[オプション]は、次の3つから選びます。
acQuitPrompt・・・保存してない場合は確認のダイアログを表示する(デフォルト)
acQuitSaveAll・・・自動的に保存
acQuitSaveNone・・・保存せず終了


下記は、フォーム上の「終了」ボタンをクリックするとAccessが終了する例です。



「終了」ボタン(buttonEnd)のクリック時イベントプロシージャに下記のマクロを入力します。

Private Sub buttonEnd_Click()

    DoCmd.Quit acQuitPrompt
    
End Sub


2017年9月12日

【Access】VBAを使って自フォームを閉じる



VBAを使って自フォームを閉じる方法です。

書式

DoCmd.Close acForm, Me.Name, [保存有無]


下記はフォーム上の「閉じる」ボタンをクリックしたときにフォームを閉じる例です。


「閉じる」ボタンのプロパティから、クリック時イベントで「イベントプロシージャ」を選択します。

選択したら、右横の[...]ボタンをクリックします。

すると Visual Basic Editor が表示されるので、下記のマクロを入力します。

Private Sub コマンド1_Click()

    DoCmd.Close acForm, Me.Name

End Sub
ポイントは、フォーム名に「Me.Name」を指定するところです。
Me.Nameで自フォーム名が取得できます。


入力できたらフォームを開いてみます。



「閉じる」ボタンをクリックすればフォームが閉じるようになります。


2017年9月11日

【Access】VBAを使ってフォームを閉じる



VBAを使って単純にフォームを閉じる方法です。

書式

DoCmd.Close acForm, "フォーム名", [保存有無]

下記は「フォーム1」という名前のフォームを閉じる例です。
DoCmd.Close acForm, "フォーム1"

注意してほしいのは、モーダルフォームだと閉じることは出来ません。
モーダレスの場合のみ有効です。


[保存有無]は、次の3つから選びます。
acSaveNo・・・保存せずに閉じる、
acSavePrompt・・・保存してない場合は確認のダイアログを表示する、
acSaveYes・・・保存して閉じる

省略時はacSavePromptになります。


2017年9月10日

お問合せフォームをformrun(フォームラン)に変えてみた

これまでお問い合わせのメールフォームに「忍者メールフォーム」を使っていたのですが、このブログをhttpsリダイレクトに変更したことによって表示されなくなってしまいました。(残念)

そんなわけで、代わりとなる他の無料サービスがないかいろいろ試してたんですがなかなかいいのが無く、さて、どうしたもんかな~なんて思っていたところ、今日、代わりとなりそうな良さげなサービスを見つました。

formrun(フォームラン)
https://form.run/ja



昨年ぐらいに誕生したサービスのようで、フォーム数一つまでなら無料で使えます。


作成方法はとても簡単で、必要な項目を選ぶだけです。

で、試しに作ったのがこれです。
https://form.run/@hosopro


なんか見た目がキレイじゃないですか?

無料サービスのものってデザイン的に残念なことが多いんですが、このメールフォームはおしゃれでいいですね。

画面上部に画像が表示されていますが、これは自由に選択できるようになっています。また、手持ちの画像をアップすることもできるようになっているのでお店や会社のロゴを表示させることも出来そうです。


あと、このメールフォーム、HTMLタグで表示させることもできます。

よくインラインフレームを使って表示させるサービスがあるのですが、このformrunは通常のformタグを使って表示させることができますので、デザインもサイトに合わせて自由に設定することが出来ます。

このブログの「お問い合わせ」ページにもタグを設置してみました。



まったく違和感なく溶け込んでいます。

興味がある方はぜひ試してみてください。


<関連記事>
Bloggerに忍者メールフォームを設置する方法


2017年9月9日

【Access】VBAで四捨五入



VBAで四捨五入するときは注意が必要です。

安易にROUND関数を使うと思わぬ結果を招くことがあります。

たとえば、6.5をROUND関数で四捨五入するといくつになると思いますか?

普通に考えると「7」になるんじゃないかと思いますが、結果は「6」になります。

これはどういうことかというと、VBAのROUND関数は「偶数丸め」といって対象の数値が「XX.5」の場合、四捨五入した結果が偶数になるように切り上げ切り捨てを行っているのです。

たとえば、下記の数値は次のよう丸められます。

ROUND関数丸め結果
数値結果
0.50
1.52
2.52
3.54
4.54
5.56
6.56
7.58

なぜこのようなことをするかというと、通常の四捨五入で丸めた「XX.5」の数字が多いと誤差を大きくなってしまうからです。ですので、お金にシビアな銀行では昔からこのやり方が行われてきたようです。(端数処理 - Wikipedia


それでは、VBAで通常の四捨五入をするにはどうればいいのか?

答えは簡単です。

対象の数字に0.5を足して切り捨てればいいのです。

Public Function RoundX(ByVal data As Double) As Long

    Dim rtn As Long
    
    rtn = Int(data + 0.5)
    
    RoundX = rtn
    
End Function

試しにイミディエイトウィンドウで実行してみるとこのようになります。
?RoundX(6.5)
 7 


ただ、これだと整数に丸める場合にしか使えません。

そこで、指定の桁数に丸められるように次のように改造してみました。
Public Function RoundX2(ByVal data As Double, ByVal digit As Integer) As Double

    Dim rtn As Double
    Dim dt As Double
    Dim weight As Double
    
    weight = 10 ^ digit
    
    dt = data * weight
    
    rtn = Int(dt + 0.5) / weight
    
    RoundX2 = rtn
    
End Function
指定の桁数分小数点を移動してから0.5を足して切り捨て、そして、その値を重みで割って小数点をもとに戻してあげています。

実行するとこのようになります。
?RoundX2(2.665, 2)
 2.67 


2017年9月8日

【Access】フォームをモーダルとしてポップアップで開く



フォームをモーダルとしてポップアップで開く方法です。

ちなみにモーダルとは、その開いたフォームを閉じないかぎり親画面の操作が出来ない状態のことを指します。


フォームのデザインビューでプロパティを表示し、



「ポップアップ」と「作業ウィンドウ固定」のところを「はい」に設定します。


フォームを開くとこのようにモーダルとしてポップアップで表示されます。

「フォーム1」を閉じないと親画面の操作は一切できません。