月: 2022年6月

2022 クーラーをつけた日

6/24
とうとうクーラーをつけてしまった。
節電の夏ですか?いつもそうですけど。
冬も暖房をつけず頑張ってますが、夏はなかなかそうもいきません。
熱中症とか、汗疹とか、いろいろあるんです。

世界ではもっと気温の高い地域は数多あるけれど、日本の湿気はもうクーラーなしでは過ごせない。

それで、ソーラーパネルを新築に義務化するのが無意味だとか、バカの発想とか主張するのはどうなのかと思う。

「東京に家が建てられない」って、んじゃ建てなきゃいいんじゃないの?東京に!
金もないのに家建てるなんてねぇ。いろいろ費用かさむよ、一軒家も。

ソーラーパネル降ろしたいけど、降ろすのにも費用かかるんだよねぇ・・・
それ、今のウチの状態。
蓄電池があればまだましなんだけど、売電価格が6分の1とか5分の1とかになって、蓄電しないとメリットってあまりないのだよね。
といいつつ、自家発電でクーラー付けてんだから文句ないよね!!って言えるかも。

などと、いろいろ考えながらゲームして映画見て、って電気つかっとるがな!

AccessVBA覚書 郵便番号から住所を出す(MsYubin7.dll)

Accessで住所支援入力というのがあるが、プロパティで設定せずにロジックで行うにはどうしたらよいかという問題への対応策。
使うのは住所支援入力で使っているライブラリと同じもの(だとは思う)。MsYubin7.dll。

3つのテキストボックスPrefText、CityText、TownTextに、都道府県、市区町村、町域をそれぞれ設定する前提で。

まず呼出元。

Dim res() As String
ConvZip2arrAddr("1600005",res)
PrefText = res(0)
CityText = res(1)
TownText = res(2)

まず呼出先。これは別モジュールを作成して記載しておけばいい。

Private Declare PtrSafe Function zcGetZipDecision Lib "MSYubin7.dll" Alias "GetZipDecision" _
                                                                            (ByVal ZipCode As String, _
                                                                            ByVal szKen As String, _
                                                                            ByVal szCty1 As String, _
                                                                            ByVal szCty2 As String, _
                                                                            ByVal szTwn As String, _
                                                                            ByVal szTwnExt As String) As Long

Public Sub ConvZip2arrAddr(ByRef zipCd As String, arrAddr() As String)
    
    Dim pref    As String * 40
    Dim city1   As String * 40
    Dim city2   As String * 40
    Dim town1   As String * 40
    Dim town2   As String * 500
    Dim arrRet(4)    As String
    
    On Error GoTo ErrFunc
    
    If zipCd = vbNullString Then Exit Sub
    If Len(zipCd) <> 7 Then Exit Sub

    If Val(zipCd) Then
        zcGetZipDecision zipCd, pref, city1, city2, town1, town2
        arrRet(0) = Left$(pref, InStr(pref, vbNullChar) - 1)
        arrRet(1) = Left$(city1, InStr(city1, vbNullChar) - 1)
        arrRet(2) = Left$(city2, InStr(city2, vbNullChar) - 1)
        arrRet(3) = Left$(town1, InStr(town1, vbNullChar) - 1)
        arrRet(4) = Left$(town2, InStr(town2, vbNullChar) - 1)
        ReDim arrAddr(0 To 2)
        arrAddr(0) = arrRet(0)
        arrAddr(1) = arrRet(1) & arrRet(2)
        arrAddr(2) = arrRet(3) & arrRet(4)
    End If
    Exit Sub
    
ErrFunc:
    Debug.Print "No." & Err.Number & ":" & Err.Description
End Sub

Access2019で試したが、他のバージョンでもそれほど違いはないと思う。

ExcelVBA覚書 On Error エラー発生後のエラー

VBAの例外処理の話。
JavaやC#とかだと、Try-CatchのCatchの中でのエラーについては、Catch内にさらにTry-Catchを入れるという手法を取ると思うのだけれど、VBAになると、少々めんどくさい。いやかなりめんどくさい話になる。

ブイサバ【Excel VBAサバイバル】~とりあえずここに来れば解決できる~『VBA|エラー処理を2回目以降も処理できる方法』

この記事でいくと、VBAの例外処理(On Error文)で気をつけておかなければならないことがあるようだが、
端的に言えば、下の2つのことを考慮するとよいということになる。

  1. エラー処理中のエラーはトラップされないヨ
  2. とはいえ、Resumeステートメントで、仕切り直しできるんだよ

というので実践編。

Sub Sample1   
    On Error Goto ErrLabel1
    *** エラー発生(1) ***
    Exit Sub
ErrLabel1:
    MsgBox "No." & Err.Number & Err.Description , "Error"
    Resume ErrLabel2    '←←←←ココで仕切り直し!!
ErrLabel2:
    On Error Resume Next
    *** エラー発生(2) ***
End Sub

まずは「On Error Goto ErrLabel1」で例外処理へスキップする処理を入れる。
エラー発生(1)の箇所でエラーが発生すると、ErrLabel1ラベルに飛ぶ。
エラーを表示させた後の「Resume ErrLabel2」というところが仕切り直しの箇所。
なので、Errをウォッチすると、「Resume ErrLabel2」の箇所ではエラーNoが設定されているが、ErrLabel2ラベル下の「On Error Resume Next」の行になると、エラーはクリアされている。

よって、ErrLabel2以降で、再度トラップ可能なOn Error文を指定してあげればよい。
(ここではResume
Nextにしているので、エラーがあると次行へ進むようになっている)

因みに、こういうことをやらずにErr.Clearとかしてみたらどうなるのか試したのだが、これだと2つ目のエラーはトラップされなかった。
んじゃぁ、Resumeじゃなくて、Gotoだったら?とやってみたが、この場合はErrにそのままエラー情報が残った状態で、ErrLabel2に飛んでいた。

なので、「Resume ラベル名」
面倒だがこういう手を使わなければならない。