follow us in feedly

WindowsのCakePHP3で発生したintlエラーを解決する

CakePHP3で開発するとintl拡張モジュールのエラーに出くわしますよね。
今回はWindowsらしい原因だったので、ちょっとハマりました。
ということで、解決した方法を書いていきます。

環境

  • Windows7
  • PHP 7.1.8
  • CakePHP 3.5.5

エラー内容

エラーはエクステンション関連の内容です。
なので、すぐに解決するだろうと思ってました。

Fatal error: You must enable the intl extension to use CakePHP.

intl拡張モジュールはあるし、php.iniにも設定してる

調べてみると解決方法として紹介されているのは、次の両方またはどちらかです。

  • intl拡張モジュールをインストールする
  • php.iniのextensionに設定する

でも、自分の環境ではどちらも問題ありませんでした。

C:¥php¥extにphp_intl.dllはあるし、
php.iniにも「extension=php_intl.dll」が設定されています。

Windows環境変数への設定が原因だった

モジュールも設定も問題ないのでハマりました。
Apacheの再起動とか、OSの再起動とか試してもやっぱりダメ。
そんななか、環境変数の設定をチェックしたところ。

ユーザー環境変数のほうにPHPのパスが書いてある。。。

すぐにシステム環境変数のほうにPHPのパスを追加して解決!
サイトが無事に表示されました。

まとめ

CakePHP3で見かけるintl拡張モジュールのエラー解決方法を紹介しました。
Windowsのシステム環境変数にPHPのパスを追加することで解決できます。
モジュールがないことやphp.iniの設定ばかりが原因ではないんですね。
Windows環境でCakePHP3を利用するときは注意してください。

エクスプレス予約から品川乗車で購入したけど東京駅から乗りたいとき

2018年になりました。
納品や年末年始を理由に更新が止まってましたが、こういう強制力のないことを再起動するのは大変ですね。

さて、年末年始はとても多くの人が東海道新幹線を利用しています。
そして、僕のように品川駅から購入したけど東京駅から乗りたいって人もいたと思います。
特に今回はエクスプレス予約からの予約だったので問い合わせをして解決しました。

品川駅から予約で東京駅から乗車できるか問い合わせてみた

料金は変わらないので何かしらの方法はあるだろうとは思ってました。

ただ、後述のようにエクスプレス予約上で乗車駅変更ができなかったし、ぶっつけ本番的に東京駅に行って乗れなかったら最悪なのでサポートに相談してみました。

エクスプレス予約のサポートに問い合わせをしたところ
以下をしてもらえれば東京駅で乗車できるとの回答でした。

  • IC利用はせず、切符を発券する
  • 駅係員のいる改札を通る

実際に問題なく東京駅を利用することができました。
降車の場合も同じです。

エクスプレス予約から同じ座席での乗降駅変更はできない

エクスプレス予約はいつでも予約変更できることがメリットのひとつ。
はじめは予約変更で対応できると思ったのですが、同じ座席での乗降駅の変更は無理でした。
(区間延長なので延長分の座席は予約した座席でないことを考えると当たり前なんだけど、いい感じにするのは大変なんでしょうか?)

一旦違う座席で変更して、元の座席でさらに変更すればできるかもしれませんが
年末年始という繁忙期の座席を手放す勇気なんてないです。
しかも、自分ひとり分ではないので再確保できなかったら何言われるかわからないですし。

という流れで問い合わせをして解決できた次第です。

まとめ

東海道新幹線のエクスプレス予約で品川駅から購入したけど東京駅から乗車したいときは

  • IC利用はせず、切符を発券する
  • 駅係員のいる改札をとおる

で乗車できます。

発券すればいいのでエクスプレス予約でなく券売機で購入した場合も駅係員に見せればいけると思います。
いつも東京駅乗車で購入しておけば良いんですけどね。

急に予定が変わったときなどの参考になれば幸いです。

MySQLのSETで単位指定したらエラーになるって知った

MySQLでバイナリログの最大サイズ設定を変更することがありました。
そのときに知ったSETでの設定方法について、備忘のためにも紹介します。

SETでの設定に単位を使用したらエラーになった

MySQLを再起動せずにmax_binlog_sizeを変更したかったので、SETを使って設定しようとしたらエラーになってしまいました。
エラーの原因は設定値に単位を使っていたからでした。

mysql> SET GLOBAL max_binlog_size = 512M;
ERROR 1232 (42000): Incorrect argument type to variable 'max_binlog_size'

なので、下記のように数値のみにしたところ問題なく実行されました。

mysql> SET GLOBAL max_binlog_size = 536870912;
Query OK, 0 rows affected (0.00 sec)

SETでは単位指定は使用できない

はじめはMySQLのバージョンが古いからかと思いましたが、SETでは単位(サフィックス)は使用できないとのこと。
下記、MySQL 5.6のマニュアルより引用します。

値乗数を指定するサフィクスは、サーバーの起動時に変数を設定するときに使用できますが、実行時に SET で値を設定するためには使用できません。一方、SET を使用すると、式を使用して変数の値を割り当てることができますが、サーバーの起動時に変数を設定するときには使用できません。たとえば、サーバーの起動時に次の 1 行目は有効ですが 2 行目は無効です。

shell> mysql --max_allowed_packet=16M
shell> mysql --max_allowed_packet=16*1024*1024

逆に、実行時に次の 2 行目は有効ですが 1 行目は無効です。

mysql> SET GLOBAL max_allowed_packet=16M;
mysql> SET GLOBAL max_allowed_packet=16*1024*1024;

まとめ

MySQLでSETを使った設定における値の指定方法についてご紹介しました。
SETを使う場合は、単位指定が不可であることを初めて知りました。

参考

MySQL :: MySQL 5.6 リファレンスマニュアル :: 5.1.5 システム変数の使用

Let’s EncryptをNginxに設定して常時SSL化する

本ブログの常時SSL化対応が完了しました。
約3年ぶりにブログ再開したことと、Let’s Encryptを試す機会になるということで
ずっと温めていたタスクの実行に踏み切ることができました。
Nginxの設定にはほぼ触れず、Let’s Encryptに関わる内容のみですが紹介していきます。

環境

  • CentOS 6.9
  • Nginx 1.12.2
  • Certbot 0.19.0

Certbotのダウンロード & 実行

クライアントソフトウェアのCertbotをダウンロードして実行し、証明書を取得します。

$ cd /usr/local/bin
$ sudo wget https://dl.eff.org/certbot-auto
$ sudo chmod a+x certbot-auto
$ sudo ./certbot-auto certonly --webroot -w /var/www/blog.77dogs.net/ -d blog.77dogs.net

エラーが発生

下記のエラーが発生しました。

certbot-auto: line 864: virtualenv: コマンドが見つかりません

対策

Python 2.7が必要なのでインストールして、その環境下でCertbotを実行します。

$ sudo yum install centos-release-scl
$ sudo yum install python27 python27-python-tools
$ sudo scl enable python27 bash
$ ./certbot-auto certonly --webroot -w /var/www/blog.77dogs.net/ -d blog.77dogs.net

別のエラーが発生

新たに下記のエラーが発生しました。

...
IMPORTANT NOTES:
 - The following errors were reported by the server:

Domain: blog.77dogs.net
   Type:   unauthorized
   Detail: Invalid response from
   http://54.92.40.15/.well-known/acme-challenge/fCmuZYV6nsMPOb_nAvTkH45be_DFHLxvvLuyXUCPrSg:
   "<html>
   <head><title>403 Forbidden</title></head>
   <body bgcolor="
white">
   <center>

<h1>403 Forbidden</h1>

</center>

<hr>

<center>"


To fix these errors, please make sure that your domain name was
   entered correctly and the DNS A/AAAA record(s) for that domain
   contain(s) the right IP address.
...

対策

/.well-known以下にアクセスできないので、本ブログのNginx設定ファイルに追記します。

<br />
location ^~ /.well-known/ {
  log_not_found off;
  access_log    off;
  autoindex     off;
  try_files     $uri $uri/ =404;
}

Nginxを再起動して、Certbotを再実行します。
これで証明書の取得は完了です。

$ sudo service nginx restart
$ sudo scl enable python27 bash
$ ./certbot-auto certonly --webroot -w /var/www/blog.77dogs.net/ -d blog.77dogs.net

Nginxの設定

証明書が取得できたので、NginxにSSL設定をします。
Qualys SSL Labsの評価をA+にする設定をしてみました。
詳しい設定方法は書かないので参考サイトを参照してください。

自動更新設定

最後に、自動更新するようにcronの設定をします。
毎週日曜の23時に起動するように設定しました。
更新がなければ特に何もおこなわれません。

0 23 * * 0 /usr/bin/scl enable python27 "/usr/local/bin/certbot-auto renew -q --post-hook '/sbin/service nginx reload'"

まとめ

Let’s Encryptの証明書による常時SSL化の手順をご紹介しました。
証明書関連はほとんどCertbotがやってくれるので割りと簡単にできたように思います。
Nginxの設定については他サイトに任せていますが、参考になれば幸いです。

参考

MSYS2のpacmanで発生するGPGME errorの対応

Windowsでコマンドラインやターミナル環境を整えるためにMSYS2をインストールしました。
最近はWindowsで開発する機会もあったので作業環境を慣れた形にしたかったからです。
今回はMSYS2のパッケージ管理システムであるpacmanの初期設定に苦しむことに。
そのエラーと対応した内容をご紹介します。

環境

  • Windows 7
  • MSYS2 (mintty 2.8.1)
  • pacman 5.0.1

MSYS2のインストール

MSYS2のインストールはインストーラを実行して進めるだけなので簡単です。
詳しいインストール手順は、参考サイトを参照してください。

proxyの設定

proxy環境下で利用するので、C:/msys64/etc/profile.d/proxy.shを設定します。


export http_proxy=proxyserver.domain:port
export HTTP_PROXY=proxyserver.domain:port
export https_proxy=proxyserver.domain:port
export HTTPS_PROXY=proxyserver.domain:port
export no_proxy="localhost,127.0.0.1"
export NO_PROXY="localhost,127.0.0.1"

C:/msys64/etc/pacman.confを設定してcurlを使うようにします。


XferCommand = /usr/bin/curl -C - f %u &gt; %o # コメントを外す

pacmanの初期設定時にエラーが発生する

MSYS2のインストールが完了したら、pacmanの設定をします。
リポジトリの更新や既存パッケージのアップデートです。
ここで下記エラーが発生しました。

エラー内容


$ pacman -Sy
:: パッケージデータベースの同期中...
エラー: GPGME error: データがありません
エラー: mingw32 の更新に失敗しました (無効または破損したデータベース (PGP 鍵))
エラー: GPGME error: データがありません
エラー: mingw64 の更新に失敗しました (無効または破損したデータベース (PGP 鍵))
エラー: GPGME error: データがありません
エラー: msys の更新に失敗しました (無効または破損したデータベース (PGP 鍵))
エラー: データベースの同期に失敗しました
エラー: 処理を始められませんでした (無効または破損したデータベース (PGP 鍵))

調べるために英語でも出力したので載せておきます。


$ pacman -Sy
:: Synchronizing package databases...
error: GPGME error: No data
error: failed to update mingw32 (invalid or corrupted database (PGP signature))
error: GPGME error: No data
error: failed to update mingw64 (invalid or corrupted database (PGP signature))
error: GPGME error: No data
error: failed to update msys (invalid or corrupted database (PGP signature))
error: failed to synchronize any databases
error: failed to init transaction (invalid or corrupted database (PGP signature))

解決方法がなかなか見つからない

上記エラーで調べるといろいろ情報は出てきます。
ただ、自分の場合は原因が違うようで、解決には至らずハマりました。
参考にした情報の一部を載せておきます。 (内容が同じようなものもあると思います)

curlではなくwgetを利用したら解決した

解決できたのは、wgetを使う設定にしてみたことでした。
proxyの設定時に有効にしていたcurlがダメだったようです。
proxy環境の都合なのか理由はわからないままですが。

とりあえず、C:/msys64/etc/pacman.confを下記のようにして無事に動作しました。
なんとなく設定を変えてみたら、あっさり解決することもありますよね。


#XferCommand = /usr/bin/curl -C - f %u &gt; %o # コメントアウトする
XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u # コメントを外す

まとめ

MSYS2のパッケージ管理システムであるpacmanのエラーと対応方法をご紹介しました。
pacmanがダウンロード時に利用するコマンドをcurlではなくwgetにすることで解決しました。
調べるといろいろな解決手段があるようなので、そのひとつとして参考なれば幸いです。

おまけ

MSYS2をちょっと快適に使えるかもしれない設定をします。
下記設定でシンボリックリンクの作成とWindowsの環境変数Pathの引き継ぎができるようになります。

C:/msys64/msys2.iniを編集します。


MSYS=winsymlinks:nativestrict # コメント外す シンボリックリンクの作成
#MSYS=error_start:mingw64/bin/qtcreator.exe|-debug|&lt;process-id&gt;
#CHERE_INVOKING=1
MSYS2_PATH_TYPE=inherit # コメント外す 環境変数引き継ぎ
MSYSTEM=MSYS

参考

Windows7のget-pip.pyで発生したエラーに対処する

前回記事にあるとおり、Windows上でPythonを使うことになりました。
ついでにPythonのパッケージ管理システムであるpipをインストールすることにしたのですが
ちょっとしたエラーが発生してすんなりとはいかなかったので対応方法をご紹介します。

環境

  • Windows 7
  • Python 3.6.3

get-pip.pyがエラーで動かない

ドキュメントに従ってインストールを試みるも下記エラーが発生。

エラー内容


Traceback (most recent call last):
  File "get-pip.py", line 20061, in &lt;module&gt;
    main()
  File "get-pip.py", line 194, in main
    bootstrap(tmpdir=tmpdir)
  File "get-pip.py", line 82, in bootstrap
    import pip
  File "&lt;frozen importlib._bootstrap&gt;", line 971, in _find_and_load
  File "&lt;frozen importlib._bootstrap&gt;", line 955, in _find_and_load_unlocked
  File "&lt;frozen importlib._bootstrap&gt;", line 656, in _load_unlocked
  File "&lt;frozen importlib._bootstrap&gt;", line 626, in _load_backward_compatible
  File "C:\Users\77dogs\AppData\Local\Temp\tmpqicpv3hr\pip.zip\pip\__init__.py", line 26, in &lt;module&gt;
  File "&lt;frozen importlib._bootstrap&gt;", line 971, in _find_and_load
  File "&lt;frozen importlib._bootstrap&gt;", line 955, in _find_and_load_unlocked
  File "&lt;frozen importlib._bootstrap&gt;", line 656, in _load_unlocked
  File "&lt;frozen importlib._bootstrap&gt;", line 626, in _load_backward_compatible
  File "C:\Users\77dogs\AppData\Local\Temp\tmpqicpv3hr\pip.zip\pip\utils\__init__.py", line 23, in &lt;module&gt;
  File "&lt;frozen importlib._bootstrap&gt;", line 971, in _find_and_load
  File "&lt;frozen importlib._bootstrap&gt;", line 955, in _find_and_load_unlocked
  File "&lt;frozen importlib._bootstrap&gt;", line 656, in _load_unlocked
  File "&lt;frozen importlib._bootstrap&gt;", line 626, in _load_backward_compatible
  File "C:\Users\77dogs\AppData\Local\Temp\tmpqicpv3hr\pip.zip\pip\locations.py", line 88, in &lt;module&gt;
  File "ntpath.py", line 75, in join
TypeError: expected str, bytes or os.PathLike object, not NoneType

対応方法

C:\python\python36._pthを編集します。
下記のようにコメントをはずして、siteモジュールをインポートするように設定します。
該当設定の直上コメントにも、”Uncomment”と書いてありますね。


python36.zip
.

# Uncomment to run site.main() automatically
import site # ←コメントをはずす

再実行

再度実行します。無事にインストールが完了しました。
プロキシ環境下での実行なのでオプションを付けています。


$ python get-pip.py --proxy="[user:passwd@]proxy.server:port"
Collecting pip
  Downloading pip-9.0.1-py2.py3-none-any.whl (1.3MB)
Collecting setuptools
  Downloading setuptools-36.5.0-py2.py3-none-any.whl (478kB)
Collecting wheel
  Downloading wheel-0.30.0-py2.py3-none-any.whl (49kB)
Installing collected packages: pip, setuptools, wheel
Successfully installed pip-9.0.1 setuptools-36.5.0 wheel-0.30.0

まとめ

pipのインストール時に発生したエラーの対応方法をご紹介しました。
「import site」のコメントをはずすことで解消されます。
proxyオプションとあわせて参考なれば幸いです。

参考

pip — pip 9.0.1 documentation
python 3.6 embed cannot get pip · Issue #7 · pypa/get-pip

Windows版Python3でCSVをSQLiteに保存する

前回のWindows版PHPでのCSVパース問題を解決するためPythonを採用しました。
今回は、そのWindows + PythonでCSVを取り込む方法をご紹介します。
詳細な解説はほとんどなく、ほぼソースコードのみです。

環境

  • Windows 7
  • Python 3.6.3

ソースコード

CSVを読み込んでデータベースに保存します。
仕事で作ったものなので改変しています。

# -*- coding: utf-8 -*-

import os
import io
import sys
import csv
import sqlite3

# 標準出力の文字コードをUTF-8にする
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

# ディレクトリを移動
os.chdir(r'C:\Users\77dogs\Sample')

# データベースに接続
conn = sqlite3.connect('db\contents.sqlite3')
c = conn.cursor()

# contentsテーブルのカラムを取得
sql = 'SELECT * FROM contents LIMIT 1'
c.execute(sql)
columns = []
for row in c.description:
    columns.append(row[0])

sql = 'INSERT INTO contents (%s) VALUES (%s)' \
        % (','.join(columns), ('?,' * len(columns)).rstrip(','))

# CSVの読み込み &amp; 保存
with open('csv\data.csv', encoding='utf-8') as csvfile:
    reader = csv.reader(csvfile, delimiter=',', quotechar='"')
    next(reader)  # ヘッダ読み捨て

    for row in reader:
        c.execute(sql, tuple(row))  # SQLを実行
        conn.commit()  # commit()は必須

conn.close()

標準出力の文字コードを変更する

MSYS2にprint()で出力したときに文字化けしたのでその対策。
sys.stdoutのデフォルトの文字コードはCP932なのでUTF-8に変更。
ちなみに、上記ソースコードにはprint()はありません。

print(sys.stdout.encoding)  # cp932
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
print(sys.stdout.encoding)  # utf-8

raw文字列によってエスケープシーケンスを無効にする

エスケープシーケンス(\n, \t など)として解釈してほしくない場合の対策。
下記の場合は、「\U」があるのでraw文字列でないとエラーになる。

# SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
os.chdir('C:\Users\77dogs\Sample')

# raw文字列(r'文字列')だとエスケープシーケンスを無効化
os.chdir(r'C:\Users\77dogs\Sample')

まとめ

Windows + Python3を使って無事にCSVの取り込むができました。
情報もたくさんあるので、多少のつまづきはあったものの簡単に実装できました。
ファイルパスにバックスラッシュを使う場合はエスケープシーケンスに注意です。
はじめてのPython成果物ですが参考になれば幸いです。

参考

sys.stdout のエンコードを変更する in Python3.0
raw文字列 – 文字列 – Python入門
エスケープシーケンス – 文字列 – Python入門
Pythonでsqlite

Windows版PHPでCSVが正しくパースされない問題に悩んだ

仕事でちょっとした多言語サイトを開発することになったわけですが
掲載情報をCSVで取り込むときに正しくパースされない問題に悩まされました。
ということで、解決(?)するまでの経緯を書いていきます。

環境

Windows7
PHP 7.1.8
SQLite 3.20.0

Windows7 + PHPでマルチバイト文字のCSVのパースができなかった

今回、開発するサイトは多言語のサイトです。
日本語に加えて英語、韓国語、中国語(繁体字・簡体字)も扱います。

各言語のCSVをPHPのSplFileObjectで読み込もうとするも
日本語、韓国語、中国語といったマルチバイト文字の言語が適切にパースされませんでした。
文字コードはすべてUTF-8です。

文字エンコードをしてみる

UTF-8のまま読みたかったが仕方がないので、下記のとおりにエンコードすることに。
すると、いい感じにパースされたので、「解決!」と思ったのだけど。。。

  • 日本語→CP932
  • 韓国語→CP949
  • 繁体字→CP950
  • 簡体字→CP936

エンコードできない文字がある

いい感じだったのは日本語、韓国語まで。
繁体字になってエンコードできない文字(?になってる)があることが判明。
簡体字も繁体字ほどではないにしろ同様で、よくよくみると韓国語もまれにあるという状況でした。

setlocaleも試してみる

文字化けするのなら、UTF-8でなんとかするしかないかと考えて
setlocale()をするもパース位置が変わる程度で解決には至らず。

ちなみに、Windowsでのsetlocale()はセットの仕方に注意。

# これだとセットできない
setlocale(LC_ALL, 'ja_JP'):

# これだとセットできる
setlocale(LC_ALL, 'Japanese_Japan');
setlocale(LC_ALL, 'Japanese_Japan.932');
setlocale(LC_ALL, 'ja-JP');

他の環境での動きを見てみる

以下の3つの環境でどうなるかを見てみた。

  • CendOS6 + PHP5.3
  • Windows7 + Python3
  • Windows PowerShell

結果としては、上記の環境ではUTF-8のまま問題なくパースできました。
ということで、Windows版PHPがダメらしいということがわかったのです。

Windows7 + Python3でやることにした

時間も限られているので、PHPでの解決は諦めることにして
Windows7 + Python3でCSVを取り込むことにしました。

理由としては、

  • 今回は諸事情によりWindows環境でやるしかないこと
  • PowerShellでもいいのだけど、Pythonを使ってみたかったからです。

ここにはPythonでの詳細は書きませんが無事に取り込めました。

まとめ

Windows7 + PHPでの開発で遭遇したCSVのパース問題をご紹介しました。

  • CSVがマルチバイト文字の言語だと正しくパースされなかった
  • 各言語をUTF-8からエンコードするとパースはされたが一部文字化けした
  • setlocale()するも期待した結果は得られなかった

結局、Windows版PHPがダメだと判断して、Pythonを使うことで解決しました。
Windows + PHPでの開発をお考えの方はご注意ください。

Excel VBAで選択中セルのURLをQRコード表示する

約3年ぶりの更新ですね。
今回もどこまで続けられるのかは誰にもわかりません。

1発目は、はじめて使ったExcel VBAについて。
仕事の中で「こんなの作れない?」とお願いされたのがきっかけです。

作ったのは、選択中セルにあるURLをQRコードに変換して表示するもの。
ExcelのURL一覧をスマートフォンで確認していくのに使うようです。
バージョンはExcel 2013です。
もともとは仕事用なので業務に特化したところは変えてます。

ソースコード

ソースコードはこんな感じです。
ユーザーフォーム (UrlForm.frm)は使ってみたかっただけです。
これくらいならInputBoxを使ったほうが楽だと思う。

MakeQRCodeModule.bas

Option Explicit

Sub MakeQRcode()
  On Error GoTo ErrorMsg

  Dim url As String
  Dim objIE As Object

  '選択中のセルからURLを取得
  url = ActiveCell.Value

  'URLが取得できない場合はフォーム入力(1回のみ)
  If url = Empty Then
    UrlForm.Tag = "Cancel"
    UrlForm.Show

    'OKボタン以外(キャンセルボタン、閉じるボタン)は終了
    If Not UrlForm.Tag = "OK" Then
      Exit Sub
    End If

    'テキストボックスにURLが入力されなかったら終了
    If UrlForm.UrlTextBox.Value = Empty Then
      MsgBox ("URLが取得できません")
      Exit Sub
    End If

    'テキストボックスからURLを取得
    url = UrlForm.UrlTextBox.Value
  End If

  'Google Chart APIのURLを作成
  url = "http://chart.apis.google.com/chart?cht=qr&amp;chs=150x150&amp;chl=" &amp; Application.WorksheetFunction.EncodeURL(url)

  'Internet ExplorerでGoogle Chart APIからQRコードを取得して表示
  Set objIE = CreateObject("InternetExplorer.Application")
  With objIE
    .Visible = True
    .Top = 100
    .Left = 500
    .Width = 500
    .Height = 500
    .Navigate (url)
  End With

  Do While objIE.Busy = True Or objIE.ReadyState &lt;&gt; 4
    DoEvents
  Loop

  Exit Sub

ErrorMsg:
  MsgBox ("Error:" &amp; Err.Description)
End Sub

UrlForm.frm

Private Sub okButton_Click()
  UrlForm.Tag = "OK"
  UrlForm.Hide
End Sub

Private Sub cancelButton_Click()
  UrlForm.Hide
End Sub

Private Sub UrlForm_Activate()
  UrlForm.UrlTextBox.SetFocus
End Sub

ポイント

選択中の結合セルの値を取得

結合されたセルから取得する必要があったので
調べていくつか出てきた方法を試したけど取得できず。
結局、下記のようなセルの値を取得する方法でできました。

ActiveCell.Value

Excel 2013だからできたのかもしれないです。
上記の全ソースコードにはないけど業務用バージョンでは使ってるので紹介。

ユーザーフォームのどのボタンをクリックしたか判別する

キャンセルボタンをクリックしたときにエラー表示なしで終了するために実装。

まず、UserFormのTagプロパティに情報を入れる。

UrlForm.Tag = "OK"

そうすると、モジュール側で判定できるようになります。

If Not UrlForm.Tag = "OK" Then
  Exit Sub
End If

この方法が調べたなかで一番シンプルでした。
Tagプロパティに入れた情報は終了しても残るので、フォームを起動するごとに初期化してます。

ユーザーフォームのフォーカス

テキストボックスにフォーカスさせるならSetFocusメソッドを使う。
ユーザーフォーム表示時にセットする場合は、Activateイベント内でメソッドを呼ぶ。
Initializeイベント内で呼び出してもできませんでした。

まとめ

今回は、選択中セルにあるURLをQRコードに変換して表示するExcel VBAを作りました。
いくつか苦労したポイントを紹介していますが、QRコードを表示したいだけなら
Google Chart APIのURLを作成してIEを起動すればいいので、もっと簡単にできると思います。
初Excel VBAということもあってよろしくない実装もあるかもですが、参考になれば幸いです。

参考

Excel VBA 入門講座
Excel VBA入門
VBAでIE制御ライブラリの追加 | IE操作の自動化
Excel VBA を学ぶなら moug モーグ | 即効テクニック | Tagプロパティを利用してユーザーフォームからの情報を受け取る

久米島に行ってきました – 久米島旅行記 その1

夏旅行ということで久米島に3泊4日で行ってきた。
沖縄は8年ぶりぐらいで、久米島は初めて。

行ったことがないことと、宮古島とかよりちょっと安いかな
という理由で決まった久米島だけど、いいところでした。

まずは初日。
羽田から那覇を経由して久米島へ。

那覇で時間があったので、空港を出てランチに行こうということで、
JAL機内でもらえた「ちゅらナビ」に載っていた守礼そばに行く。
ゆいレール赤嶺駅(那覇空港から1駅)の南口を出て、徒歩7分ぐらい。

軟骨ソーキそばとじゅーしー(沖縄の炊き込みご飯)と小鉢のランチセットを注文。
意外と時間に余裕がなく、急いで食べて空港に戻ることに。
そばも美味しく、島唄のライブ演奏が始まるなど良い感じだったのに
味わいながら食べることも、ゆっくりしていくこともできなかったのは残念。

守礼そばのランチセット

その後、空港で久米島行きの保安検査場から、出発ゲートまでの短い間で
チケットを落とすというハプニングもあったが、久米島に無事に到着。
拾ってくださった親切な方、ありがとうございました。

続く

« Prev