月別アーカイブ: 2023年4月

Supports Zero-Starting!

ゼロ始まりに対応!

どんな理由があって、そうなったのか知りませんが、マークシート方式で行われる予定の大学入学共通テストサンプル問題、教科「情報Ⅰ」の解答の選択肢は、始まりが「1」ではなく、「0」からになってます・・・。

ディジタルのイメージから、「0」・「1」とつながる0始まりにしたのか?
それとも他に何か0から始めなければならない必然的な理由があるのか?
サンプル問題を作成した方に、その理由をぜひ伺ってみたい気もしますが・・・

今回は、My MarkSheet Reader を、解答の選択肢「0」始まりに対応させたというお話です。

【今回の記事】

1.なんで0始まりなの?
2.教科「情報」用マークシートを作成
3.ゼロ始まりに対応
4.まとめ
5.お願いとお断り

1.なんで0始まりなの?

大学入学共通テストの理科基礎科目は例外なく、解答の選択肢の始まりは「1」から。
物理も、化学も、生物も、地学も、全部、それが「1」になってるってのは、「選択肢の始まりは1から」って、誰もがそう感じるから・・・だと思うのですが。

教科「情報」では、なぜかそれが「0」からになってる・・・。

検索してみると、そのことに注意を促すWebサイトが複数見つかります。
例えば、選択肢の番号が「0」始まりであることに気付かず、「121」とマークしたつもりが実際には「010」だった。思い込みにはくれぐれも注意しましょう!・・・みたいな。

僕は、僕のマークシートリーダーをよくする云々ではなく、今回だけは、この無視できない現実にとにかく「対応する」ことにしました!

2.教科「情報」用マークシートを作成

まずはマークシートそのものを準備しなければいけません。これが理科の場合なら、選択肢の数は8個もあれば十分です。しかし、教科「情報」では、例えば著作権関係の内容を見てみると、著作者の権利として、氏名表示権、同一性保持権、複製権、上演権、演奏権、公衆送信権、口述権、展示権、頒布権、貸与権、翻訳権、翻案権の12の権利があることがわかります。これを解答の選択肢として準備する場合があり得ますから、選択肢の数は少なくても15程度、十分な余裕を持って設定した方がよさそうです。

幸いなことに僕のマークシートリーダーは、数学での利用を想定して選択肢数は最大16個まで対応できるように作成してあります。そこで、数学用のマークシートを改造して教科「情報」用のマークシートを作成することにしました。

Wordで作成した数学用マークシート

まず、行番号の「アイウエオ・・・」を「12345・・・」に書き換えます。

次に、マークを0始まりで15まで、16個用意します。
1行分作成したら、あとはひたすらコピペします。
これを3列分繰り返して、1列25問×3で75問に対応できるマークシートとしました。

列の行番号が半角のカタカナから、半角の数字2桁になったため、解答欄座標を取得するマーカー■■■(トリプルドット)の位置に関して若干の修正が必要でしたが、何とか思った通りの形に仕上げることができました。

完成した教科「情報」用マークシート

出来れば、問題数は100問まで対応可能としたいところですが、用紙サイズの関係もあり、75問でよしとすることにしました。どうしても75問以上の設問が必要な場合は、数学用途に2枚1セットで採点できるようにプログラムを組んであるので、それを活用すればなんとかなります。まぁ・・・試験時間60分なら、最大75問に対応していればOKでしょう。

完成した教科「情報」用マークシート

とりあえず、マークシートは完成です。ここまでは極めて順調に推移しました。次は、いよいよプログラムの改良です。

3.ゼロ始まりに対応

どのようにプログラムを改良しようかと考えた時、一瞬、教科「情報」専用のマークシートリーダーにしようか・・・と思ったのですが、やはり、そうではなく、1つのプログラムで様々な教科・科目に対応できる方が理想だと思い直し、選択肢の始まりは「0」とするか、「1」とするか、ユーザーが選べるようにプログラムを改良することにしました。

ユーザーが選択肢の始まりを「0」「1」のどちらかに設定できるよう改良

設定欄に、最初の選択肢の番号を指定するVCLコントロールを設置するスペースを何とか作成し、そこにComboBox1個とLabelを2つ貼って、上の図のように選択肢の始まりの番号を指定できるようにしました。もちろん、ここで指定した番号は必要であればイニシャライズファイルに保存して、次回起動時も有効化されるように設定。このComboBoxの名前は思いついたまま適当に「cmbOneZeroSelect」として、読み取りコードを次のように改良します。

  begin
    //StringGridに読み取り結果を表示
    //オリジナルのプログラムは1行で終わってた
    //StringGrid1.Cells[intSG_Col,intSG_Row]:=strAnsList[intSG_k];
    //選択肢の0始まりに対応できるようコードを改良
    if cmbOneZeroSelect.Text='1' then
    begin
      StringGrid1.Cells[intSG_Col,intSG_Row]:=strAnsList[intSG_k];
    end else begin
      if (strAnsList[intSG_k]='99') or (strAnsList[intSG_k]='999') then
      begin
        StringGrid1.Cells[intSG_Col,intSG_Row]:=strAnsList[intSG_k];
      end else begin
        strAnsList[intSG_k]:=IntToStr(StrToInt(strAnsList[intSG_k])-1);
        StringGrid1.Cells[intSG_Col,intSG_Row]:=strAnsList[intSG_k];
      end;
    end;
    ・・・
  end;

早速、実行してみました!

数学用のマークシートを読み込ませて動作確認

よかった☆ 期待通りに動作してくれました!

ちなみに「999」は「空欄」、「99」は「複数マークあり」を意味します。
Gridコントロールをクリックすれば、当該箇所のマーク状態をチェックできます。
赤い色の矩形は、プログラムを実行した際の採点結果チェック実行時に、画面上に実際に表示される矩形です。
サンプル画像を3枚読むのに要した時間は772ミリ秒

1行16選択肢で、1列に25行、これが1枚に3列あるから、マークの数は合計1200個/枚あります。MyPC環境では、マークシート1枚について1200あるマークを約250ミリ秒で読み取ってますから・・・。1秒でほぼ4枚、1クラス40名分なら約10秒で読み取り完了です。

自分で言うのもなんですが、結構、高速に動作しているんじゃないか・・・と。

ただ、10万枚くらいは手作業で採点できそうな時間を開発に費やしてますが・・・。

4.まとめ

ようやく、大学入学共通テストの教科「情報」に対応したマークシートリーダーが出来ました。解答欄の選択肢の始まりが「0」か、「1」か、ただそれだけのことなのですが、両方にきちんと対応するのは、やっぱりそれなりに大変でした。

5.お願いとお断り

このサイトの内容を利用される場合は、自己責任でお願いします。ここに記載した内容を利用した結果、利用者および第三者に損害が発生したとしても、このサイトの管理者は一切責任を負えません。予め、ご了承ください。

This updated is support for use with high resolution devices

高DPIに対応しました!

これまでずっとPC画面の解像度は1366×768に固定して、この解像度での使用のみを前提に、僕はプログラムを書いてきた・・・。僕のプログラムが走るマシンは全部、この解像度だったから、それで何も問題は起きなかったのだけれど。

【今回の記事】

1.2880×1920の世界を知る
2.Formの表示がたいへんなコトに・・・
3.問題点を続々と発見!
4.exeを高DPI対応に設定
5.VCLの幅や高さを自動調整
6.まとめ
7.お願いとお断り

1.2880×1920の世界を知る

新しく支給されたPCの画面解像度は2880×1920で、拡大縮小率は150%に設定されてた。持ち運ぶことを考えると、ノートPCの画面サイズはそうそう大きく出来ないから、画面サイズが変わらないまま、解像度だけ上がってしまうと、相対的にアプリや文字の見た目はどんどん小さくなって、目にとてもやさしくない画面になる。だから拡大150%や拡大200%って設定が必要なんだと思うけど・・・。

取り敢えず、この環境で僕のプログラムを動かすとどうなるか、実験してみた。

1366×768、拡大率100%で表示した場合(開発時の設定)
2880×1920、拡大率100%で表示した場合

高解像度画面では、ボタンのCaptionが読めない・・・。

2.Formの表示がたいへんなコトに・・・

しかも、このプログラムから別のFormを呼び出すと・・・

たいへんなコトに・・・

自分的には、こう表示されてほしいのですが・・・
(今までは何の問題もなく、こう表示されていた)

この(今までの)ように表示するには、どうしたらイイ?

やばい。何としても高DPIに対応させないと、職場のみんなにプログラムを使ってもらうどころか、自分ひとりですら使えない。画面が高解像度になっただけで、こんな問題が生まれるなんて・・・。これまで考えたこともなかった。

けっこうショックが大きくて、心がまた折れかけたけど、この問題をクリアすれば、プログラムも、僕も、もっとよくなれるんだって、必死で自分に言い聞かせる。

3.問題点を続々と発見!

高解像度画面で一通り、プログラムの動作検証を行ってみると、見つけられただけで次のような問題が発生することがわかった。

① Formが設計時とは異なる大きさで表示される。
② 画面表示の拡大設定を行わないと、字が読めないくらい小さくなる。
③ 拡大設定時には、VCLコントロール(Toolbar)の幅や高さが意図しないものになる。

まず、①の問題の解決にチャレンジ。

FormCreate手続きでFormの幅を指定しても無駄。
まるで言うことを聞いてくれない。
いったいナニがどうなると、この問題が発生するのか?
これまで、こんな問題に出会ったこと、ないぞ・・・。

そう思いつつ、いろいろ調べてみると、次の情報を発見。

フォームを新規作成したらまずやる事 (Delphi)

https://ht-deko.com/ft1004.html#100408_02

明らかな既視感があったので、以前、どこかで見た情報に間違いないと思うのだけれど、知識として使ったことがなかったので、情報の有用性に気づいてなかった・・・。

この中に、Scaledプロパティに関して、次の記述が・・・

Scaled
常に False。True にすると OS の DPI (ユーザが指定した DPI) によってフォームサイズやコントロールサイズが勝手に変更されてしまいます。

(たぶん、コレだ・・・)

早速、すべてのFormのScaledプロパティをFalseに変更。なんでこんな問題を起こすような設定がデフォルトでTrueなんだ?・・・何か、大切な理由でもあるんだろうか?

動かして確認。

直った!(・・・というか、壊れなくなった)

これで①の問題は解決。思ったより簡単に解決できて、よかった!

4.exeを高DPI対応に設定

②の文字の大きさについて、Google先生にいろいろきいた結果、こちらもベストと思われる対応方法を発見。

Windows11でアプリやメニューが小さい時に行う高DPI設定

https://win11lab.info/win11-high-dpi/

設定方法は、次の通り。

exeを右クリックして表示されるサブメニューの「プロパティ」をクリック
「高DPI設定の変更」をクリック
「高い DPI スケールの動作を上書きします」のチェックボックスをチェックして、
拡大縮小の実行元は「システム」を選択。

で、OK → 適用 → OK と順にボタンを押して画面を閉じ、アプリを再起動すると、Formが適正な倍率で表示されてアプリやメニューが見やすくなった。ちなみに「システム」ではなく、「アプリケーション」では表示に変化がなく、「システム(拡張)」ではFontが高解像度化された感じに。

いちどexeにこの設定を実行しておけば、画面の解像度をいろいろ変更しても常にFormは適正な大きさで表示されるようになり、たいへん便利!

Windowsには、ほんとうにいろんな画面解像度の設定があるから、exeに対するこのおまじないは必須なのかもしれない・・・。これで②の問題も無事解決。

結局、②の問題は、プログラムではなく、OS側の設定の問題だった。

5.VCLの幅や高さを自動調整

最後に残った③の問題に取り組む。まず、これがどういう現象かと言うと・・・

手書き答案採点プログラムで、画面を横にスクロールさせるために作ったToolbarコントロールが、本来なら次のように表示されるはずなのに・・・

ToolButton1,2,3とBevel1の4つのコントロールの幅の合計値がToolbar1の表示サイズの幅となるはず

上の4の設定を行わず、かつ、画面の拡大縮小が100%でない場合には・・・

表示そのものが崩れてしまう・・・

職場のマシンたちは全部!デフォルト設定が「高解像度」で、画面の拡大率150%だから、何にもしないで僕のプログラムを配布されたままの状態で動かしたら、間違いなく、この問題が発生してしまう・・・。

マジ、困った・・・。

すがるような思いでGoogle先生に援けを乞う。すると・・・

03_高 DPI における画像の描画サイズ調整

http://mrxray.on.coocan.jp/Delphi/Others/DisplayDPI_Image.htm#03

またしても、Mr.XRAYさんのサイトに救いとなる情報を発見!

職場では、僕のことを「困った時の〇〇さん・・・」と呼ぶ人がいるけど、
僕にとってMr.XRAYさんは、「本当に困った時のMr.XRAYさん」です。

これまでにいったい何度、僕の窮地を救ってくださったことか・・・。
あらためてMr.XRAYさんに、心から感謝のありがとうです。

Mr.XRAYさんのホームページにあった情報をもとにプログラムを次のように修正。

procedure TFormCollaboration.btnSelectClick(Sender: TObject);

  //--------------------------------------------------------------------------
  //  ディスプレイの拡大縮小の比率を取得
  //  100% の時は 1.0.150% の時は 1.5 を返す
  //--------------------------------------------------------------------------
  function GetDpiRatio: Extended;
  var
    LXDpi : Integer;
  begin
    LXDpi := GetDeviceCaps(GetDC(0), LOGPIXELSX);
    Result := LXDpi / USER_DEFAULT_SCREEN_DPI;
  end;

var
  ・・・
  //高DPIに対応する
  VCL_Width:Extended;
  VCL_Height:Extended;

begin

  ・・・

  //解像度が変わると不具合がでる
  //r.Right := r.Left+ToolBar1.Width;
  //r.Bottom := r.Top+ToolBar1.Height;

  //解像度の変更に対応
  //幅
  VCL_Width := (ToolButton1.Width + 
    ToolButton2.Width + ToolButton3.Width + Bevel1.Width) * GetDpiRatio;
  r.Right := r.Left + Trunc(VCL_Width);
  //高さ
  VCL_Height := ToolBar1.Height * GetDpiRatio;
  r.Bottom := r.Top + Trunc(VCL_Height);

  ・・・

end;

GetDpiRatio関数を使ってディスプレイの拡大・縮小の比率を計算し、これをVCLコントロールの幅と高さに掛けて、コントロールが適切に描画されるように設定。

上記設定を行った後、実行中のToolbar
(フローティング状態で画面の任意の位置に埋め込む)

こうしてプログラム側でも、VCLコントロールの幅や高さを画面の拡大縮小に合わせるように設定しておけば、exeそのものに「高 DPI 設定の変更」を設定しなくても・・・

ちょっとカタチは崩れるけど、使えないレベルではない。
exeに「高 DPI 設定の変更」を設定せず、
拡大150%で実行してみた場合

これで③の問題も無事解決できた!

プログラムも、僕も、よくなれた☆

それは間違いない・・・から、いいんだけれど。
ひとりでも、戦えるかな・・・

Let me see you through.

空を見上げて・・・

I’m missing you.

そう思えてならない時が、あるんだ。

6.まとめ

(1)様々な画面解像度に対応するには、FormのScaledプロパティをFalseに設定。
(2)画面の拡大縮小に対応するにはプロパティの「高 DPI 設定の変更」を利用。
(3)画面の拡大縮小にプログラムコードでも対応可能。

7.お願いとお断り

このサイトの内容を利用される場合は、自己責任でお願いします。ここに記載した内容を利用した結果、利用者および第三者に損害が発生したとしても、このサイトの管理者は一切責任を負えません。予め、ご了承ください。

Let’s mount a counterattack from now on!

反撃を開始するぞ!

【今回の記事】

1.色が消えた!
2.BYODがあった
3.反撃開始!
4.お願いとお断り

1.色が消えた!

そのマシンを僕たちはCIJP3号機と呼んでいた・・・。
いちおう、解説すると、3機めのColor Inkjet PrinterだからCIJP3号機。規定の印刷契約枚数まではカラー・モノクロ問わず、同一料金で印刷可能な、愛すべきマシンだったが・・・。

今、僕の隣に CIJP3号機はいない。

あのマシンさえ、あれば・・・。この2週間、何度、その思いを繰り返したか、わからない。
気がつけば空を見上げて。なつかしい人たちの面影を思い浮かべて、涙し、大量印刷可能なマシンは、モノクロの輪転機しかない環境に涙し、毎日、心が折れに、折れまくった。

大量カラー印刷。それが「当たり前」に出来た世界から、「まったく」出来ない世界へ来たのだから、そう思うのは当然だけど。

正直、なんとかなるんじゃないか・・・と、あまく考えていた部分もあって・・・。
とにかく、このままでは命懸けで作った My Secret Weapon※1 が使えない。
マークシートリーダーは、カラー印刷ができなくてもまだなんとかなりそうだけれど・・・。手書き答案採点プログラムの返却用答案画像だけは・・・「赤」が使えないと、どうにもならない。

※1「赤」で採点記号を答案画像に印字する、手書き答案の採点プログラムのこと。

例えがよくないかもしれないが、心境的には、高性能(?)ミサイルはあるんだけれど、その発射装置が破壊されたってところだ。

せめて2色印刷※2ができないか・・・?

※22色印刷は、普通「黒」+カラー1色(例:赤)で行う印刷のこと。フルカラー印刷に比較すれば、ローコストでインパクトのある資料が作成できる。

そう考え、取り敢えず事務方の責任者にそれとなく伺ってみたが、現状、難しいではなく、「無理」である とのこと。しゅんとして孤独な作業部屋に戻り、また、空を見上げて、心に涙の雨を降らす。空は・・・あんなに青く、美しく、晴れて、きれいなのに。

なぜ・・・。

僕は聞きたいよ。これまでのすべてが、嘘だったって、思えばいいの?

やりたいことは、〇や × 、合計点を赤で印刷したいだけなんだけど・・・。

きっと、月面に一人取り残されて、太陽光の散乱のない、真っ暗な空に浮かぶ青い地球をみたら、こんな気持ちになるんじゃないか・・・。

モノクロームの世界から眺める、フルカラーの地球。
あぁ、僕はあそこに住んでいたんだって・・・。

たのしかったなー。(T_T)

こうなったら、いっそのこと・・・

たかが250万だろ?
個人的に購入する分には何の問題もない はずだ。
思い切って、マシンを買うか?

でも、よく考えろ・・・
Delphi の使用許諾ライセンスが10個分買えるぞ。

バカ!
そんなにDelphi買って、どぉすんだ?

Object Pascalの信者は、絶滅危惧種の生存個体数グラフのように減少の一途をたどっているはずだ・・・

(それは〇県の〇科(科目名:〇)の教員数も同じだと思うが・・・)

だから Embarcadero Technologies, Inc. さんの営業収益増に貢献することはきみの悲願だろ? Delphiの未来がかかってるんだ・・・

あぁでも、今は・・・カラー印刷がどぉしてもしたいんだ。
A社の営業担当の方の名刺は、大切に保存してある。
電話して『ボク、1台買います!』って言えば、
それで済む話じゃないか。

おまえには、そのガッツと勇気がないのか・・・

(それは「勇気」ではなく、「無茶・無謀」だよ:亡くなった祖母の言葉)

ばぁちゃん、ごめんよ。
オレ、やっぱり大人になんか、なれないよ・・・

モノクロームの世界では、誰も気にしないことで、また、オレはこんなに悩んでる。なぜ、毎回毎回、オレばかり、誰も悩まないことで悩むんだ。

ふと THE STREET SLIDERS の、あの名曲が心に浮かぶ・・・

この曲、リアルタイムで聴いてたんだ・・・。
確か・・・大学2、3年の頃だから、もう30年も前のことだ・・・。

Please get out of my mind.
Please get out of my mind.
抜け殻になっちまうからさ。

Please get out of my mind.
Please get out of my mind.
何処かへ、消え失せてくれ。

THE STREET SLIDERS 「GET OUT OF MY MIND」より引用

あぁ・・・どうせ折れた心だ。
抜け殻のような気持ちを抱えて、
ひとりで苦しむのは、もうたくさんだ・・・

こんな消え失せて欲しい現実なんかに負けてたまるか・・・
七転八倒の人生でいいじゃないか・・・
何回倒れたって、オレは起き上がって見せる・・・

ここから抜け出すんだ。
今までだって何とかしてきたじゃないか・・・
そうだ・・・ ここに色がないのなら、
オレが色をつくってやる。

この色の消えた世界に・・・

2.BYODがあった

挫けそうな気持ちを抱えたまま、起案文書を書く。どうしても・・・、どうしても、このままでは終われない。My Secret Weapon が「もし使える状態」になれば、働き方改革にも大いに貢献できるはずだ。僕にできる唯一の社会貢献じゃないか。それに・・・

『僕がこの世から消えた後でも、動くプログラムを創る』

この夢を叶えないうちは死ねない・・・。なにか・・・、なにか、いい方法はないか・・・。
また、くすんだ窓ガラスの向こう側の空を見上げる、気がつけば、この2週間ですっかりそれがクセになってしまった・・・。

ふと、空よりずっと近いところ、天井に無線LANのアンテナが見えるのに気づく・・・

あの部屋の前の廊下にも・・・
その隣の部屋の前の廊下にも・・・
その隣の隣の部屋の前の廊下にも・・・それが・・・ある

そうだ。BYOD(Bring Your Own Device)環境があった。
カラー印刷の「紙」じゃなくて、「画像データ」、または「PDF文書」を、個人所有のタブレットに送信するんだ・・・。せっかく整備したBYOD環境の活用にもつながるし・・・。なにより「紙」を大量に消費するという、My Secret Weapon の最大の弱点も解消できる!

最高の解決方法だ!
なんとかなりそうだ!!

3.反撃開始!

スキャナーは幸い、使い慣れたものと同機種の複合機が、これまた幸い、僕の自由になる環境下に1台あった。ただ、スキャンした画像の転送先が設定されていなかったので、記憶を頼りにNASの中に適当なフォルダを作成して、そこに転送されるよう設定。セキュリティの部分でちょっと引っ掛かったけど、なんとか、クリア。そのへんにあったA4の印刷物を使ってテストした結果も良好。これで答案の読み取り準備はOKだ。

次は、僕のプログラムの改良。

まずは、マークシートリーダーで使用するExcelのマクロだ。今のままでは紙への印刷しかできないから、CheckBoxを追加して、これにチェックマークを入れて印刷ボタンをクリックしたら、採点結果を通知するPDFファイルを作成するようにすればイイ。

VBA(Visual Basic for Applications)は、そんなに詳しくないけど、Object Pascal よりメジャーだし、参考資料はWebに山のようにあるはずだ。きっと、なんとか、なる・・・

チェックボックスを追加して、キャプションを「PDFに出力する」に設定

TabIndexも忘れずに変更。開始番号のテキストボックスのTabIndexが0、終了番号のテキストボックスは1、追加したチェックボックスは2、印刷実行のコマンドボタンは3、キャンセルボタンは4に設定する。

なんで、そうなってるのか、理解に苦しむんだけど、Delphiと違って、VBAでは「標準仕様」で、なんにもプログラムコードを書かなくてもEnterキー押し下げでフォーカスがTabIndexで指定したコントロールへ「勝手に」移動する。そのようなonKeyPress イベントが予め実装されているようだ。

Enterキー押し下げで、他の動作をさせたい場合はどうするのか知らないけど、便利と言えば便利な「標準仕様」であることは言うまでもない。でも、Delphiみたいな、すべてをプログラマが制御できる環境に慣れると、VBAの「標準仕様」には驚きというか、恐怖に近いものを感じてしまう。これは僕だけのことだろうか・・・。

この動作はDelphiのObject Pascalなら、次のコードを書かなければ実現できない。

//TEditのonKeyPress イベント
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  //Enterキーで次のコントロールへ
  if key = #13 then begin
    keybd_event(VK_TAB,0,0,0);
    Key := #0;
  end;
  //入力制限する場合 ここに記述する

end;

Form1のKeyPreview を True にする必要があったと思うが、状況によっては、これも使える。

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  //リターンキーで移動させる
  if Key = #13 then
  begin
    SelectNext(ActiveControl, True, True);
    Key := #0;
  end;
end;

だから、僕が作ったVBAのGUIをマウスなしで操作するなら、設計時にコントロールを移動したい順番にTabIndexを指定しておき、実行時には、まず開始番号をテキストボックスへ入力してEnter、次に終了番号をテキストボックスに入力してEnter、チェックボックスへフォーカスが勝手に移動したら、スペースキーを押し下げてチェックをON/OFFし、Tabキーを押してフォーカスを印刷実行のコマンドボタンへ移動。Enterキー押し下げで、印刷(or PDFファイル作成)が実行という手順になる。

Windows標準のコントロールの移動は、Enterキーではなく、Tabキーであることを忘れてはいけない。

印刷&PDFファイル作成部分は・・・

Private Sub CommandButton1_Click()

    Dim PrintNo1 As Integer
    Dim PrintNo2 As Integer
    Dim i As Integer
    
    'PDF出力用に追加
    Dim Rng As Range
    Dim fName As String
    
    If UserForm1.TextBox1.Text = "" Then
        MsgBox ("開始番号を半角数字で入力してください。")
        TextBox1.SetFocus
        Exit Sub
    End If
    
    If UserForm1.TextBox2.Text = "" Then
        MsgBox ("終了番号を半角数字で入力してください。")
        TextBox2.SetFocus
        Exit Sub
    End If
    
    PrintNo1 = UserForm1.TextBox1.Text
    PrintNo2 = UserForm1.TextBox2.Text
    i = PrintNo1

    For i = PrintNo1 To PrintNo2
        Range("A2").Select
        ActiveCell.FormulaR1C1 = i
        Range("B6:AB38").Select
    
        ActiveSheet.PageSetup.PrintArea = "$B$6:$AB$38"

        'PDFにする範囲を指定
        Set Rng = ActiveSheet.Range("B6:AB38")

        'PDFファイル名
        If i < 10 Then
            fName = Range("C8") & "0" & Range("E8") & "_" & Range("G8")
        Else
            fName = Range("C8") & Range("E8") & "_" & Range("G8")
        End If

        '全角&半角スペースを削除する
        fName = Replace(fName, " ", "")
        fName = Replace(fName, " ", "")
        
        If Not CheckBox1.Value Then
            '紙に印刷(テスト時にはここをコメント化する)
            ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
        Else
            'PDF出力
            Rng.ExportAsFixedFormat Type:=xlTypePDF, _
            Filename:=ActiveWorkbook.Path & "\" & fName & ".pdf"
        End If
        
    Next i
    
    Range("A2").Select

End Sub

なんでVBAなのに、PDF作成部分の代入演算子(?)が := なんだ?って疑問が・・・生まれたけど、取り敢えず、動かす方が先。

=と:=の違い

http://officetanaka.net/excel/vba/beginner/02.htm

上の疑問について、調べてみた結果、VBAで、引数に値を設定するときに使用される記号が「:=」であるとのこと。初めて知りました。

サンプルデータだから、超簡略化して・・・

これで実行すると・・・

こうなると、ボタンのCaptionは「実行」だけの方がいいかな?

結果は・・・、次の通り。

できた! できた!!

PDFファイルの内容は・・・

あとは、このPDFファイルをBYOD環境を利用して、個人所有のタブレット端末へ送信する仕組みを構築すれば、いい。それは仲間と協力すれば、必ずできる。

魂の抜け殻みたいな状態の・・・今の僕でも、取り敢えず、ここまでは・・・できた。
明日、朝、目が覚めたら、手書き答案採点プログラムの合計点印刷手続きを改良して、「紙」へ印刷するのではなく、上で行った作業と同様に、今度は指定フォルダ内に返却用答案画像ファイルを作成&保存できるようにしよう。アルゴリズムは同じだから、Delphiでも必ずできるはずだ。

プログラムも、僕も、よくなるんだ・・・。
それで、いいじゃないか。
また、ゼロから創めればいいだけのことじゃないか・・・。

今までだって、全部ゼロから作ってきたんだ。
そうだ。僕は・・・ 精一杯、やった。
その時々で、僕にできることは全部やった。
後悔など、何ひとつない。

それが今、また、ゼロに戻っただけだ。

この・・・色のない世界に、色を創るのは僕だ。
僕にしか、出来ない仕事だ。
僕が色を創るんだ。

僕があきらめない限り、
この夢は・・・実現できる可能性を残している。

僕にしか、出来ない仕事をしてみせる・・・。

あきらめるもんか。
やるぞ!

4.お願いとお断り

このサイトの内容を利用される場合は、自己責任でお願いします。記載した内容を利用した結果、利用者および第三者に損害が発生したとしても、このサイトの管理者は一切責任を負えません。予め、ご了承ください。

タンデム・シート

2023年3月31日(金)、僕は自由になった。

だったら、4月1日(土)は、

どこへ行こうか・・・
何をしようか・・・

先週の終末は、雨だった。
今週末、この地域は・・・晴れの予報だ。
それなら土曜日の、いちばん、は・・・ 16歳の頃から決まってる。

ずっと雨だったから、止まったままの・・・
ダブル・オーバー・ヘッド・カムシャフト・・・ インライン4。
そうだ。僕の空冷四気筒DOHCエンジンに、火を入れよう。

右のリアショックからは、オイルが漏れてる・・・
30年モノだもの、壊れないほうが不思議。

空冷の四気筒エンジンが、当たり前に存在した時代があったことを、
聞き伝えではなく、原体験として語れるのは・・
もしかして、僕らの世代が・・・最後、なんじゃないか・・・?

30年を・・・さらに越えて、時はこんなに流れても・・・
きみの見た目は、なんにも、変わらない。

初めて出会った、あの日のままさ・・・。
タンクも、それから、エンジンも、まだ輝きを残してる。

でも、お互い、年齢を重ねた・・・。
ウソだろって・・・本気で、思うよ。
出会って、もう、30年・・・。

燃料チャージはキャブレターだから、駆けだすには十分な暖気運転が必要だし、
例え、オイルが熱くなっても、今はもう、1万回転以上は怖くて回せない・・・

きみを壊したくない気持ちは、もちろん、本当だけど。
僕も、もう、若くないんだ。身体がエンジンの回転数に追いつかない・・・
いつも、動きが一瞬遅れるのを感じる・・・それも、本当なんだ・・・。

僕だけの偏見かな?
きみが大好きな理由さ・・・

キャブレター吸気のエンジンには・・・、うまく言葉に出来ないんだけれど、
インジェクター仕様のエンジンには絶対にない、楽しさ があるんだ。
チョークを引いて、掛けるエンジンなんて・・・
もしかしたら今は、知らない人のほうが、多いんじゃないか。

「掛かるかな・・・?」って、スターターを廻す度に感じる、ドキドキ感。
そして、掛かった瞬間の、言葉にできない・・・うれしさ。

きみのエンジンに、もし、キックペダルがあったら、
エンジンを掛ける度に・・・僕は泣き崩れていた・・・かも、しれない。

こんなに好きなのに、
もう二度とラインアップされることのない・・・
空冷四気筒DOHCエンジン。

・・・だから、僕は、繰り返してしまう。

きみへの想いと、
過去と、
現在とが、
交差する時を。

雨の日に、火酒を片手に、これまでにいったい何時間・・・
きみのエンジンを眺めたことだろう。

晴れた日には、16歳だった・・・、あの日に還って。
きみのエンジンの咆哮を、何度、たまらない想いで・・・聴いたことだろう。

お互いに年齢を重ねた・・・だから、スライダーもありかな・・・って

こんなに美しい機械を、僕は他に知らない。
これを造ったひとは、いったい、どんなひとなんだろう。

焼けたオイルの匂いが好き

憧れてたんだ・・・

『あいつとララバイ』の研二くんの駆る『Z2』に・・・

僕のは・・・1990年2月発売の KAWASAKI ZEP400 Type C2。
オリジナルのメーターはC3以降のと違って、砲弾型じゃなかったから、
SUZUKIのバンディットのを、無理やり、くっつけた。
心配した車検も、このままで、通った!

正直、C3以降のオリジナルよりインパクトがあるんじゃないかな?
このメーター。あんまりないでしょう?
白い文字盤と、オレンジの指針の組み合わせが、好きなんだ。

別の日のスナップ。オイルが漏れていたリアショックをオーリンズに交換。

ミラーも角ばったノーマルのじゃなくて、
丸いZ2タイプのショートミラーに変えた。
おかげで、後ろは、なぁーんにも見えなくなったけど、気にしてない。
昔は、右側だけ付けてたけど・・・、規則では左もないとダメみたいだ・・・。

ウインカーは、オリジナルのはプラスチックが劣化して折れちゃったから、
一昨年、ずっと憧れてた・・・、小さなヨーロピアンタイプのに、替えた。

ステップは、BEET 工業の『スーパーバンク・バックステップ』
ノーマルのは、おとなしすぎたから、ステップ位置を少し後ろ、少し、上へ変えた。
タンデムステップが付くのが、うれしかった・・・。

彼女は、真夜中に一度だけ、乗ってくれた。
あれからタンデムは1回もしてないけど・・・。

ずっとセパレートだった・・・ハンドル。
取り回しと、何より車検がたいへんだから、今はノーマルに戻した。
あの頃は毎週末、上野のバイク街に、通いつめて、夢に見たカタチを探したんだ。

セパレート・ハンドルにしてた頃は・・・
トップブリッジ外して、ハンドル付けて・・・
タンクに干渉しないか、何度も確かめてから、ハンドル位置を決めて・・・

ウインカーやチョークの操作ユニットがセットできるよう、
そうだ。ハンドルに穴を開ける加工を、ドリル片手にやったんだ・・・。

ガレージのそこだけ、光が当たって、輝いてる感じだった。

組み上がったハンドルを握った、その瞬間。
今でも覚えてる。

きみと、ひとつになれた・・・気がした。

マフラーは、定番の、モリワキの直管。
焼けて錆びる度に、サンドペーパーをかけて、耐熱塗料を塗り直した・・・。
アクセルを開ければ・・・車検対応って、マジ、ウソだろ・・・ってくらいの・・・いい音。
3速、8000回転あたりのエキゾースト・ノートが最高・・・気持ちイイ。

雨の日は絶対に乗らないから、後ろのフェンダーは取り外した。
ナンバーを取り付けるための代替部品は、厚さ2mmのアルミ板を半日かけて、糸鋸で切り出して作った。気が遠くなるような作業だったけど・・・

すごく、楽しかったな・・・。

サイドカウルとシールも、テールカウルも、それから、尾灯も・・・
全部、Z2タイプの、それに、変えた。

もちろん、タンクのエンブレムは旧字体の KAWASAKI に。
古い両面テープはギター用のオレンジ・オイルで剥がした。

あの夜は・・・ ガレージの中が、いい匂いだったな・・・。

全部、よく見なければ、わからないけど。
自己満足だから、イイんだ。

オイルクーラーは、今はノーマルだけど・・・
前は EARL’S のそれを付けてた。
ホースの部品が劣化して割れちゃってから、交換して、そのままになってる・・・

認めたくなんか、ないけど・・・
そうだ、確かに、30年という「時」が、流れたんんだ。

時に、激しく、
時に、静かに。

きみが、赤茶けたサビなんて、まだ知らずに輝いてた、あの日から・・・

今は、もうお互いに、時代遅れさ・・・。でも、それでいいじゃないか・・・

永遠にとまるな・・・
きみの鼓動。

僕は・・・ きみが、大好きだ。

4月1日の空は、気持ちよく、晴れた

『タンデム・シートに乗らないか・・・』

 隣で、クルマのハンドルを握る彼女に、そう、聞いてみた。

『怖いから、イイ』

 きみは、覚えてるか・・・

 菜の花が、咲いてたよな・・・
 すごい、気持ちよかった。

 彼女が待つ場所へ、
 きみと走った・・・。

 あの日を。