アナログCPU:5108843109

ゲームと音楽とプログラミング(酒と女とロックンロールのノリで)

ExcelVBA入門 #10:定数を定義することとそのメリット

はじめに

久しぶりの記事追加です。
今回は、地味ながらもプログラミング言語問わずの人気者、「定数」について。

定数って何?

もしかしたら、中学か高校かの数学の時間に聞いたことがあるかもしれません。
それとだいたい同じで、「値が変化しないもの」です。

ちょっとVBAで書いてみましょう。
商品価格に消費税を加えた合計金額を計算するプログラムです。

Public Sub calcSum()
    Dim lSum As Long
    Dim lItemPrice1 As Long
    Dim lItemPrice2 As Long
    
    lItemPrice1 = Range("A1").Value
    lItemPrice2 = Range("A2").Value
    
    lSum = 0
    lSum = lSum + lItemPrice1 * 1.08
    lSum = lSum + lItemPrice2 * 1.08
    
    MsgBox "合計は" & lSum & "円です。"
End Sub

ここで、「1.08」は定数です。
セルのアドレス「A1」と「A2」も定数といえます。

これで何か問題あるの?

さて、ここで消費税が10%になったら…?
「1.08」を「1.1」に書き換える必要がありますね。
商品価格を保存するのが「A1」「A2」以外のセルになったら…?
これも「A1」「A2」を別のセルに変える必要がありますね。
数行しかないプログラムなのでまだともかく、ちょっと大きなものになると、全部書き換えるのは大変なことです。

じゃあどうすればいいの?

プログラムを最初から以下のようにしておきます。

Const TAX As Double = 1.08
Const ITEM_1_RANGE As String = "A1"
Const ITEM_2_RANGE As String = "A2"

Public Sub calcSum()
    Dim lSum As Long
    Dim lItemPrice1 As Long
    Dim lItemPrice2 As Long
    
    lItemPrice1 = Range(ITEM_1_RANGE).Value
    lItemPrice2 = Range(ITEM_2_RANGE).Value
    
    lSum = 0
    lSum = lSum + lItemPrice1 * TAX
    lSum = lSum + lItemPrice2 * TAX
    
    MsgBox "合計は" & lSum & "円です。"
End Sub

関数の前の「Const [定数名] As [型] = 値」で、定数を定義しています。
それから、消費税やセルのアドレスが入っていたところで、定義したものを用いるよう変更しています。
最初に定義しておけば、プログラム中に何度出てきても、変更するときは定義部分だけで済むのです。

尚、定数は最初に書いたとおり「値が変化しないもの」なので、
ここで定義した定数は、プログラム中で変更することはできません。

Const TAX As Double = 1.08

Public Sub calcSum()
    ' だめ(エラーになります)
    TAX = 1.1
End Sub

今回の例のように、
「(いつか変更する可能性はあるけれど)プログラムの動作中には変わらない数字や文字」を定義すると良いです。

おしまい

コード中に直接埋め込まれている数字を「マジックナンバー」と呼びます。
(一般的にはどうか知りませんが、新入社員の頃にそういう話を聞きました)
「なんの数字かわかんないけどちゃんと動く!不思議!」という皮肉を込めての呼び名だそう。

たしかに定義なんてしなくてもプログラムは動くわけですが、そのうち痛い目を見ます。
簡単なプログラムを書いているうちから、定義して使う癖をつけておくとよいかもしれません。

次回予告

次は…何書こうかな。未定です。

秀丸マクロの登録方法

気が付いたら今までの人生30年の半分は秀丸にお世話になっていました。

中学生の頃から親のPC使ってネットで二次創作小説を探しては秀丸にコピペ、フロッピーディスクに移して自分のPCへ。
自分のPCでもまた秀丸を開いて読み漁る…というオタク。


それはともかく、仕事を始めてからは作業の効率化を図るのに欠かせないのが秀丸マクロになっています。

マクロコードの記事は既にいくつか書いていますが、そもそも作り方をきちんと書いていなかったので残しておきます。

↓マクロのコードサンプル記事はこちら
honey8823.hateblo.jp

①マクロを作って保存

内容は省略しますが。

マクロを書いたら「.mac」という拡張子で保存します。
秀丸で「名前を付けて保存」しようとすると、ファイルの種類としても選択可能です。

保存先はどこでも良いのですが、
マクロファイル用のフォルダは用意されているのでそこに保存するのがベターでしょう。
(保存先のパスはマクロ登録画面で確認できます。詳しくは後述)

②保存したマクロを秀丸に登録

マクロを使うには、秀丸からマクロ登録する必要があります。
メニューバーの マクロ>マクロ登録 を選択すると、以下のような画面が出てきます。

マクロ登録画面
f:id:honey8823:20170120144022p:plain

一番下に書かれているのがマクロファイル保存用のフォルダです。

  • タイトル:任意のタイトルを入力
  • ファイル名:マクロを選択(上記のフォルダ以外にある場合は「...」から選択)
  • 編集:マクロの中身を編集できる

登録したいファイル名を指定して「OK」すれば登録完了です。
1~10に登録したマクロは、「Ctrl+番号(10の場合は0)」で実行できるようになります。

③登録したマクロにショートカットキーを割り当てる

「Ctrl+番号」でも充分便利なのですが、ファンクションキーやマウス操作などに割り当てることもできます。

メニューバーの その他>キー割り当て で設定可能です。
f:id:honey8823:20170120145140p:plain

左側でShift、Ctrl、Altとキーやマウス操作との組み合わせを選び、
右側で割り当てる処理を選びます。上のセレクトボックスを「メニュー/マクロ」にすると、②で登録したマクロが選べるようになります。

もともといろいろな機能が割り当てられているので、普段使っている機能をうっかりつぶさないように気を付けましょう。

駅メモ #18:あけましておめでとうございます

年末年始は愛媛まで行ったり福島まで行ったり。
新駅はそんなに取れていませんが、ミクさんのイベントや駅奪取のイベントがそこそこ進んだので良かったかな。

晴れ着ラッピング…ずるい…かわいい…
とりあえずふぶさんが出るまで回しました。

進捗:前回(12/26)からの比較

  • 駅 3102 → 3134(+32)
  • 路線 373 → 375(+2)
  • 都道府県 31 → 31(+0)
  • コンプ路線 177 → 179(+2)

育成進捗 ()内は前回比

  • [S]ふぶ 68/75 (Lv3up / 上限10up)
  • [S]しぐれ 22/75 (Lv6up / 上限5up)
  • [T]みらい 10/75 (上限5up)
  • [D]ありす 73/80 (上限5up)
  • [S]ミオ 6/80 (上限10up)
  • [D]くに 29/65 (Lv23up)
  • [A]ハル 8/60 (上限5up)
  • [S]アサ 70/75 (上限5up)
  • [S]カノン 19/55 (Lv14up)
  • [S]スピカ 46/55 (Lv4up)
  • [D]なほ 7/55 (上限5up)
  • [S]ヒメギ 1/55 (new!)

未所持

  • なつめ
  • ノア

その他進捗はこちら。
駅メモ:でんこ育成状況とコンプ進捗状況 - アナログCPU:5108843109

福袋を全部買い占めた結果、推し(ふぶ・いずな・ありす・アサ)が全員出てきたり新規ヒメギさんが出てきたりと非常に良かったです。買ってよかった。ノアどの出なかったけど。
スカウトチケットは誰に使うか悩んで温存中。


自分用育成メモ:

引き続きサポーター(+いろは・くに)育成強化中。

まずは久々に上限突破できたふぶさん・アサさんが最優先。

…なんですけど、やっぱりサポーター強化するにしてももっと厳選すべきかと考え中。

アサ・うらら・いろは あたりは入れ替えて使うのでノーカンとして、他に5人選ぶとすれば
ふぶ・スピカ・もえ・みこと・しぐれ…かな。
1人をサポートするだけならみこと・しぐれは両立しないので、あと1人…迷うけどセリアかなあ。
次点以降は ひいる>カノン>レイカ>ヒメギ>ミオ くらいの感じ。
3番目強化のミクさんと姉専用のくにさんは別枠。

そうすると、

  • カンスト目指して最優先:ふぶ>アサ
  • Lv50目指してリンクスコア中心:スピカ>(くに)
  • APorHPが200を超えるまで新駅ボーナス中心:いろは>みこと>しぐれ>セリア
  • カンスト済み:もえ)
  • (Lv50になったので当分保留:うらら)

という感じか。

駅メモ #17:プレイ開始1周年を過ぎて

12月3日にプレイ開始して365日目を迎えました。
f:id:honey8823:20161226160741p:plain:w400

f:id:honey8823:20161226160840p:plain:w400
瞬間的にですがデイリー1位ゲット。
(ログインして確認した瞬間は同じく365日目の旦那と並んで2位&3位だったところを、いくつかレーダー飛ばして無理矢理1位に…)

f:id:honey8823:20161226161057p:plain:w400
7892人目?くらいでした。

ということでこの日はデイリーランキング上位を目指す旅へ。

f:id:honey8823:20161226161154p:plain:w400
f:id:honey8823:20161226161243p:plain:w400
f:id:honey8823:20161226161517p:plain:w400
あとはスクリーンショット取り忘れましたがキングオブメモリー共感もゲット。

そんなこんなでデイリーランキングチャレンジは5位でした。
f:id:honey8823:20161226162314p:plain:w400

しかし1年…早いものです。
今見直してみると、最初はルナを選び、
1日目と2日目で レイカ・コタン・もえ・ふぶ を引いている…
もしかしてそこそこ引きが良かったのでは。
特にふぶさん・もえさんは1年間ずっと支えてくれていて大変助かってます。
ふぶさん最初から今までずっと嫁だよ(真顔)なかなか上限突破できないけど…



あとは、れいこさんのお仕事回数が5000を突破。
「れいこがいればなんでもできる」一番乗りいただきました。
f:id:honey8823:20161226162355p:plain:w400

次は10000回ですが…さすがにグランクラスの子を5000回使い続けるのはちょっとつらいかな…。


ミクさんを普通に育成してたらAPが低すぎて称号がどんどん溜まるのでこちらも記録してみましたが…ライバルが多すぎるw
f:id:honey8823:20161226162627p:plain:w250f:id:honey8823:20161226162630p:plain:w250
f:id:honey8823:20161226162633p:plain:w250f:id:honey8823:20161226162638p:plain:w250
f:id:honey8823:20161226162644p:plain:w250


進捗:前回(11/30)からの比較

  • 駅 2945 → 3102(+157)
  • 路線 371 → 373(+2)
  • 都道府県 30 → 31(+1)
  • コンプ路線 171 → 177(+6)

育成進捗 ()内は前回比

  • [T]いろは 35/60 (Lv1up)
  • [T]ダッチュー 50/55 (上限5up)
  • [S]スピカ 42/55 (Lv9up)
  • [D]なほ 7/50 (Lv6up)
  • [S]ミク 41/55 (new!)

未所持

  • なつめ
  • ヒメギ

その他進捗はこちら。
駅メモ:でんこ育成状況とコンプ進捗状況 - アナログCPU:5108843109


自分用育成メモ:

引き続きサポーター(+いろは)育成強化中。
最優先のふぶさん・アサさんは仮カンスト中。
その他はとりあえずLv50を目指したいわけですが、うららちゃんは達成。
ということで、現在の優先度は
 スピカ>いろは>ミク>しぐれ>みこと>カノン>レイカ>ひいる>セリア>ミオ
という感じ…ですが…
全員Lv50目指すのもなかなか大変そうなので、もうちょっと考えたいところ…。

パッシブスキル(スピカ・しぐれ・みこと)を優先しようかなあ。
しかしアタッカーほぼ使わないからしぐれちゃんも後回しかな。
あと、どうせみことさん育てるなら強化されたくにさんと併せて使ってみたいので、先にくにさん育ててみようか。

ということで、しばらくは
 スピカ>(くに)>みこと>いろは>ミク>しぐれ
という感じかな。

ならば
 リンクスコア狙いは スピカ>ミク
 新駅ボーナス狙いは (くに)>みこと>いろは
となるか。

駅奪取のニャッピーデー検証

駅奪取の「5周年ニャッシュ」を引き当てたので、機能「5のつく日はニャッピーデー」でもらえるアイテム検証。
まだ始まったばかりなので、まずは気長に記録していきます。

バッテリー10(1個)から駅奪取シールまで、当たり外れの振れ幅がなかなか大きいですね。

駅メモコラボも終わり、ログインし忘れも多いので歯抜けです…

日付 もらえたアイテム
2016-12-05 バッテリー100 1個
2016-12-15 バッテリー100 1個
2016-12-25 時短タイマー 1個
2017-01-05 ベーシックガチャチケット 1個
2017-01-15 バッテリー100 1個
2017-01-25 時短タイマー 1個
2017-02-05 強奪チーズ1day 1個
2017-02-15 おつかいチケット 1個
2017-02-25 強奪チーズ1day 1個
2017-03-05 強奪チーズ5min 1個
2017-03-15 (記録忘れ…)
2017-03-25 神の手(3個入り) 1個
2017-04-05 駅奪取シール 5個
2017-04-15 神の手(3個入り) 1個
2017-04-25 バッテリー50 1個
2017-05-05 バッテリー10 1個
2017-05-15 ニャッシュ用スタミナオイル30 1個
2017-05-25 (ログイン忘れ)
2017-06-05 (ログイン忘れ)
2017-06-15 強奪チーズ1h 1個
2017-06-25 ベーシックガチャチケット 1個
2017-07-05
2017-07-15
2017-07-25

駅メモ:でんこ育成状況とコンプ進捗状況

随時更新します。

都道府県コンプ状況

凸・カンストグランクラスの記録(記載は達成順)

  • 上限突破完了
    • ニャッシュ
    • りんご
    • コタン
    • (もえ)
    • いおり
    • ルナ
    • ひいる
    • (れいこ)
    • るる
    • レン
    • レーノ
    • いちほ
    • (いずな)
    • そら
    • Liko
    • セリア
    • (ありす)
    • ミオ
    • ほこね
    • みこと
    • みらい
    • イムラ
    • レイカ
    • (ふぶ)
    • みろく
    • メロ
    • (アサ)
    • うらら
  • カンスト
    • (れいこ)
    • いずな
    • (もえ)
    • (ふぶ)
    • ありす
    • (アサ)
  • グランクラス
    • れいこ
    • もえ
    • ふぶ
    • アサ

駅メモ #16:3人目のカンスト

もえさんもカンスト

f:id:honey8823:20161130172803p:plain:w400

進捗:前回(10/31)からの比較

  • 駅 2935 → 2945(+10)
  • 路線 371 → 371(+0)
  • 都道府県 30 → 30(+0)
  • コンプ路線 170 → 171(+1)

無事にハッカドールイベントの250駅を突破したので2号さんをお迎えし、
2周年ガチャであたる・なほも確保。
現時点で未所持はなつめだけになりました。
12月の新でんこはまたそろそろアタッカーかな?

育成進捗(今回から変化のあったのだけ残すことにする) ()内は前回比 ☆は凸完了、★はカンスト
[S]セリア 8/80 (上限5up) ☆
[S]もえ 80/80 (Lv9up) ★
[D]しいら 11/75 (上限5up)
[A]イムラ 50/70 (上限5up)
[S]しぐれ 16/70 (Lv9up / 上限5up)
[S]うらら 47/65 (Lv16up / 上限5up)
[T]チコ 18/60 (上限5up)
[A]レーノ 8/80 (Lv1up) ☆
[D]ありす 72/75 (Lv2up)
[S]ミオ 6/70 (上限5up)
[S]みこと 23/75 (上限10up)
[D]くに 6/60 (上限5up)
[D]にちな 9/70 (上限10up)
[A]そら 8/80 (上限5up) ☆
[S]アサ 70/70 (Lv5up)
[A]さいか 13/60 (上限5up)
[S]カノン 1/55 (上限5up)
[A]あたる 1/50 (new!)
[S]スピカ 21/55 (Lv20up / 上限5up)
[D]なほ 1/50 (new!)
[A]Liko 6/80 (上限5up) ☆
[T]ハッカ1号 1/50 (new!)
[T]ハッカ2号 1/50 (new!)
[T]ハッカ3号 1/55 (上限5up)

未所持
・なつめ

凸&カンスト状況
駅メモの育成状況 - アナログCPU:5108843109


自分用育成メモ:

相変わらずサポーター育成強化中。サポーターじゃないけどいろはも加えよう。
もえさんが無事カンストしたので、優先度としては
 ふぶ>アサ>うらら>スピカ>いろは>しぐれ>みこと>カノン>レイカ>ひいる>セリア>ミオ
という感じかな。
ふぶ・アサは仮カンスト中なので(ただし上限突破次第最優先で育てる)
当面のリンクスコア狙いは うらら>いろは>みこと>スピカ
新駅ボーナス狙いは スピカ>いろは>しぐれ>みこと
でいこう。ひとまずLv30,Lv50を目処にという感じで。


そしてやっぱりマイルや経験値に影響の出にくいところではれいこさんの回数稼ぎ継続中。

整数かどうか、またその範囲をチェックする関数

整数かどうかを一発チェックしてくれる関数を探していたのですが見つからず。
…えっ、本当にない…? いやあるでしょ…?
しかし見つからなかったので、とりあえず作りました。誰か知ってたら教えてください。

せっかくなので範囲チェックもやってくれるオマケ付きです。

で、「範囲チェックが不要なときもあるので、引数の最小値・最大値が省略されたかどうか」を調べる方法を探し…
IsMissingという関数で調べることは可能というのは分かったのですが、引数がVariantでなければならない様子。うーむ…

参考
VB6・VBA関数メモ:IsMissing関数 | フィロの村note

関数

Private Function checkLong(ByVal vNum As Variant, Optional ByVal lMinNum, Optional ByVal lMaxNum)

    If CLng(vNum) <> vNum Then
        ' 引数が整数でない場合FALSE
        checkLong = False
        Exit Function
    End If
    
    If IsMissing(lMinNum) = False Then
        ' 最小値が指定されている場合
        If vNum < lMinNum Then
            ' 引数が最小値を下回っている場合FALSE
            checkLong = False
            Exit Function
        End If
    End If

    If IsMissing(lMaxNum) = False Then
        ' 最大値が指定されている場合
        If lMaxNum < vNum Then
            ' 引数が最大値を上回っている場合FALSE
            checkLong = False
            Exit Function
        End If
    End If

    checkLong = True

End Function

使用例

Debug.Print checkLong(5)       ' True :整数
Debug.Print checkLong(3.1)     ' False:整数でない
Debug.Print checkLong(5, 1, 9) ' True :整数(1~9の範囲内)
Debug.Print checkLong(5, 6, 9) ' False:整数(6~9の範囲外)

ブックを開くとき/閉じるときの処理

普通どおり標準モジュールにマクロを作るとき、プロシージャ名を
「Auto_Open」にすればブックを開いたとき、
「Auto_Close」にすれば閉じるときに
そのプロシージャが起動します。

「ブックを開いたら今日のおみくじを表示」みたいなお遊びから
「閉じる前に設定内容等を強制保存」まで色々と使えそうです。

尚、イベントプロシージャを使用する方法もあります。
詳細はこちら。
エクセルExcel大事典 VBAマクロ イベントプロシージャ Open Target Cancel EnableEvents Volatile

これだけではなんなのでサンプルを。
ブックを開閉するタイミングで特定のシートを非表示にするサンプルです。

Option Explicit

Const SHEETNAME As String = "samplesheet" 'シート名

'*
'* ファイルオープン時の自動実行
'*
Public Sub Auto_Open()
    ' シートを非表示に(VeryHiddenならExcel画面での再表示は不可)
    ThisWorkbook.Sheets(SHEETNAME).Visible = xlSheetVeryHidden
   
End Sub

'*
'* ファイルクローズ時の自動実行
'*
Public Sub Auto_Close()
    ' シートを非表示に
    ThisWorkbook.Sheets(SHEETNAME).Visible = xlSheetVeryHidden
End Sub

301 VS 302

開発中のサイトで、https://でアクセスされたらhttp://にリダイレクトしたり
その逆をやったり、という事案があり、リダイレクトについて諸々調べてたので残しておきます。

HTTPステータスコード

リダイレクトをかます時に、HTTPステータスコードを乗っけることができるらしい。
ほほう。今回のケースだと何か特別乗っけないといけないのかしら?

HTTPステータスコードっていうと、
「403 Forbidden」「404 Not Found」とかいうアレ。
とりあえずいろいろ調べてみる。

参考
HTTPステータスコード - Wikipedia
よく見るHTTPステータスコード一覧とその意味を理解する | SEO HACKS公式ブログ

ざっと見た感じ、301か302かな…?
と思って検索してみたら、案の定「301vs302」みたいな記事がごろごろ。

参考
SEOを正しく行う為に301リダイレクトや302リダイレクトを理解する | SEO Imagination!ブログ
SEO的に301リダイレクトは是が非か? | ランサーズ社長日記
301リダイレクトと302リダイレクト、meta refreshの設定方法や使い方 | WP SEOブログ
Google、モバイル向けサイトのリダイレクトには301よりも302を使うように推奨を変更 | 海外SEO情報ブログ
chromeは、301リダイレクトをキャッシュしている - too_youngの日記

いろいろ貼りましたが、まとめると…

  • 301
    • 引越しなど、その後ずっと移動先URLを使用する場合に使用
    • 「○○.jp/hoge」から「○○.jp/hoge/」に移動させる際もこちら
    • googleからの評価などが移動先URLに引き継がれる
      • 評価やアクセスの一本化
      • 移動元URLは検索結果に出なくなる?
    • 301に設定していても200が返る現象もあるらしい?
    • 環境によっては移動先URLに直接アクセスするようキャッシュされる
  • 302
    • メンテ中など、一時的に移動先URLに移動させたい場合に使用
    • googleからの評価などの移動は発生しない
      • 移動元も移動先も検索結果に出る(が評価は分散する)?
    • ただし、302が何度も検知されるサイトについては301として扱われる場合もある
    • 「○○.jp/index.html」のサイトを「○○.jp」として検索結果に出すのにも有効
      • 「○○.jp」でアクセスしてもらって「○○.jp/index.html」に遷移させる
    • バイル端末でPCサイトにアクセスした際のモバイルページへのリダイレクトは302推奨
    • あくまで一時的なものなのでキャッシュはされない

という感じですかね。

実際の挙動は以下のような感じだそうです。

301リダイレクトと302リダイレクトの違い | 海外SEO情報ブログ

うーん、今回の場合、httpをhttpsに転送したりその逆だったり…
どっちのURLも存在するから引っ越すわけではないし、
かといって一時的な移動でもないし、
っつーかその微妙な違いが上記のパターンにちゃんと当てはまるんかいな…
要するにどちらを使えば…。

…と迷いましたが、301を採用することにしました。
決め手にしたのは、
301の場合→「○○.jp/hoge」から「○○.jp/hoge/」への移動
302の場合→「○○.jp」から「○○.jp/index.html」への移動
というところです。
移動元を検索エンジンに残したいか残したくないかですね。


そして実際にHTTPステータスコードを乗っけたいとき、PHPではhttp_response_codeを使用すればOK。

PHP: http_response_code - Manual