Top > BLOG

 

BLOG

-( ..)φメモメモな日々-

徒然なるままに、不定期に綴る( ..)φメモメモ BLOG

どんな話題?

仕事内容に関すること、たまに休息 etc・・・

・win対応VBAをmac対応にもすべくapplescriptの勉強中なのでその格闘日誌

・VBA版→python版へのコンバージョン格闘日誌 不定期連載中

・webページからpythonを実行する・・・サーバー格闘日誌

・VBA備忘録 VBAのツール開発中は主にこれ

・COBOL、RPG格闘日誌 他

・コーヒーブレイク(雑談等)

※現在、月別に再編集中。

※本内容は、筆者の環境における実体験内容を綴ったものです。


4/26(金)

AKY開発日記 #76 JCL

 

作業中は、クラシック(ピアノ)を流しながら、作業に集中する。youtubeなどに集中できるクラシックなどは、何がそうさせるかはよくわからないが時間を忘れて、作業に没頭するものだ。

同様に、眠くなるクラシックもあるが、これは仕事中は厳禁だ。どうも周波数が関係しているようだが、ほんと眠くなってしまう(;'∀')

 

JCLにふとした機会から携わることになった。

JCLは、Job Control Languageの略称でメインコンピュータのオペレーティングシステム、特にIBMのz/OSなどで使用されるスクリプト言語らしい。

JCLはジョブ(一連のタスク)を制御し、どのプログラムを実行し、どのデータを利用するか、どのように処理を行うかを指定するために使用される。

 

いただいたサンプルコードを読み、JCLを学ぶ。

ネットに載っていない書き方が多数出てくるではないか。

ネットに載っているJCLの文法の基本は、JOBステートメント、EXECステートメント、DDステートメントとあるが、私がいただいたサンプルコードにはそれらがどれも入ってない。

・・・どうやら、JCLといっても、扱うメインコンピューターによって、それぞれ独自のJCLがあるようだ。

今、読み進めているコードは、ほぼFD文とあるが、どうもこれはDDステートメントに相当するらしい。

 

JCLを理解するに課題が山積している。

・プログラミング言語は、そのソースコード行ソースコード行で何の計算をしているか、どんなデータを操作しているのかなどみればなんとなくイメージができ、理解もできる。

 一方、JCLは、どうも計算やデータ操作を直接行うわけではないようだ、まずこの入りの時点で理解が追い付かず、加えて、ネットに載っているような通常の文法とは異なる書き方になっており、それに対するマニュアル類がネットでは見つからない、理解がなかなか進まないのが現状。

AIに頼るも、返ってくる返答は、どうも解釈が大変なのか、しまいにはそちらに確認してくださいのような内容である。

 

これを理解しないと、次のタスクへと進めないこともあるし、もうすぐGWですが、特に予定もない今年のGWは、JCLにどっぷり漬かりそうだ( ..)φメモメモ


4/24(水)

AKY開発日記 #75 VBAの文字列操作

 

どうも、いつもそうであるが、VBAの文字列操作を使う、しかし、他の新しいことを覚えると、断片的に何かが抜けてしま、文字列操作の文法についてまた調べる。改めてVBAの文字列操作をまとめる( ..)φメモメモ

 

<指定の文字列を抽出する>

・Left(検索対象文字列,長さ):文字列の先頭から「長さ」の分、抽出する

・Mid(検索対象文字列,開始,長さ):文字列の任意の位置(開始)から「長さ」の分、抽出する

・Right(検索対象文字列,長さ):文字列の最終位置から「長さ」の分、抽出する

 

<指定の文字の位置を調べる>

・InStr(検索対象の文字列,検索文字):任意の文字(検索文字)の位置を数値で返す(文字では返さない点に注意)

InStrの使い方

・ If InStr(検索対象の文字列,検索文字) Then

 その文字列に指定文字が含まれるかの判定目的。 = 0 でTrueの場合は、指定文字は存在しない

・Mid(検索対象の文字列,InStr(検索対象の文字列,検索文字),Len(検索対象の文字列))

 長さの代わりに、指定文字の位置を特定し、開始位置とする。

 InStrは、指定文字列とした場合、返す位置は、文字列の先頭文字である。

 

 

<文字の長さを返す>

・Len(文字列):文字列の長さを返す

・LenB(文字列):文字列をバイト単位で長さを返す(注:マルチバイトの長さを正確によりあらわせることからマルチバイト言語環境で重要だが、Unicode文字には2バイト以上使用する可能性もあり、使う際に注意が必要)

 

<文字列を置換する>

・Replace(文字列、変換前文字、変換後文字):文字列の中の変換前文字を変換後文字に置換する

 

<文字列の空白を削除>

・Trim(LTrim、RTrim):L~ 左側の空白、R~:右側の空白、Trim:両側の空白を削除する

 注意点は、文字列と文字列の間の空白は削除対象としない

 これが文字列操作で重要なところで、間の空白を削除等する場合は、Trim以外の方法で行う必要がある。

 

・UCase、LCase:U~大文字、L~小文字に置換。これは筆者の作業ではかなり重要。

 文字列の一致を調べる際、英語は、大文字、小文字が並ぶ。ユーザーのデータを用いることがあるため、その文字通りに認識すると、大文字の中に小文字が含まれているケースなどが混在した場合、文字列の判定がうまくいかないことがある。そういった場合に、あらかじめ UCaseにして、大文字化することで判定することによって、確実に判定できるようになる

 

・StrConv(文字列,指定形式オプション)・・・文字列を指定形式オプションに変換する。大文字や小文字、半角の操作などに使う

・Format(文字列,特定形式オプション)・・・文字列を指定形式オプションに変換する。数値や日付を操作する際などにつかう

 

 

エクセルでは、InStrの代わりにFindを使うけど、VBAではFindは文字列操作とはちょっと異なる。Findはその指定した条件に一致するセルを検索する。

 

まだありそうだけどこんなところです( ..)φメモメモ


4/22(月)

AKY開発日記 #74 OneDrive

 

OneDriveはマイクロソフト社が提供するクラウドストレージです。

PC使用中に、身の覚えのない警告メールがマイクロソフトからと突然届き、どうしようか迷った そんな話です。

 

OneDriveに関して、迷惑メールは日々、頻繁に来ます。

アカウントを凍結しますや、パスワードを変更してくださいなど。迷惑メールは、まず届いたアカウントで判断がつく場合があります。microsoftでないなら、即、迷惑メールと考えます。microsoftであった場合、次に着目するのは文章です(この場合、メールプレビューはオフにしておく。HTMLだとプレビュー感染の危険性もある。なので、筆者は基本、テキスト形式にしてます)

、や。がおかしいとこれまた不自然なので、迷惑メールと考えます。通常こういったメールは本当に送られる場合、自動でテンプレートがあるはずなので、こんな語尾のミスはないはずです。

あと、大企業なのに、なぜか連絡先が個人になっているなど、文章におかしな点があった場合は、迷惑メールと考えます。

 

そんな中で来たのが、あなたのアカウントのOneDriveの容量がいっぱいになってきてます。アップグレードを検討してくださいというもの。これは、どうもmicrosoftから本当に来てました。

こういう本当に届くメールがあるから、上記のような迷惑メールの判断する知識をある程度は持たざるを得ない。

 

OneDriveを意識的に使っていた覚えはないのですが、無料版の5GBが4.6GBとほぼ満杯になってました(;'∀')

しかもこのメールいままでスルーしてたのか、何通も過去に同じようなメールが来てました。。。

 

ストレージ管理をチェックします。

 

なんと、outlookの添付ファイルがほぼ占めていましたっと(-_-;)

 

↓OneDriveの画面( 5GB中4.6GB使用っ( ゚Д゚)!)

 

 

 ??とりあえずこのOneDriveにある添付ファイルはすでにローカルにあるものばかりで、不要でしたので、添付ファイル付きメールをちょろっと削除したら無事空き容量ができました。↓↓

しかし、なんでOneDriveに入っているのだろう。設定をした覚えもありません。

しかも数年前のものから入ってました。初期設定のときなどにあわせて設定がなされていてそれにずっと気づかなかったのかもしれない。

 

また、数年すると同じ事が起こる・・・のですが、具体的な原因も解決方法もよくわからず。普段からOneDriveも使っていないし、これに時間を割くのもどうかと思いますので、とりあえず、直近のストレージいっぱいの問題は改善したのでこれでこの件はいったんクローズにしますっと( ..)φメモメモ


4/18(木)

AKY開発日記 #73 コーヒーブレイク

 

昨日、四国の方で大きな地震がありました

テレビは、ちょうど、その時間、私は、パソコンのモニタ代わりとして外部入力で使用してました。

 

深夜、突然、音が、無機質な音が一定のタイミングで。不協和音といった方がよいのか恐ろしさを覚える音が鳴り出しました。当時のモニタ画面から音が流れてくることのないようなタイミングで。

途端に、思い出しました。以前にもこんなことがあったと。

急いで、身構えしつつ、モニタ画面から地上波のNHKにテレビのチャンネルを変えると、緊急地震速報が流れてました。

 

ああ、テレビをオンにしていると、たとえ、地上波を見ていなくても、緊急の警告音は流れてくるのかなと(テレビごとの仕様の可能性もあるが)。なお、スマホからは緊急の警報音は流れてきませんでした。

 

思い返すと、ちょうどこの日の朝、および午後、以前にもBlogでも挙げていたが、近くのカラスの行動が異常に感じていた。何十羽だろう、複数の建物の屋上に陣取り、ずっと「かーかーかーかー」騒ぎ立てながら周りを飛んでいる。今日は一転して、カラスはいるにはいるが、数羽程度であり静かである。

カラスと地震の関係について眉唾であり、もちろん因果関係が証明されているわけでもないし、この時期だと繁殖期にもあたるので、縄張り争いなどの類にも思えてくるが、前回起こった台湾での大地震のときも、ちょうど朝からカラスがいつもより騒いでいたという奇妙な偶然でもあり、前回のことの重なり、デジャブからそう意識づけされてしまった筆者の頭の中での強引な結び付けにも思えてくるものです。

 

作業に使用しているノートPCの話。

数年前から結構長く、使われているPC、今日画面を見てみると、色が褪せている~~! なんか上の画面が緑っぽいと。経年劣化による画面焼けがはじまったかなと

 

ところが、よく考えると、エクセル、ペイントソフトなど白や薄いグレーの背景の場合、同様の症状が発生している、一方で、黒い背景のVSCODEの場合は、これがみられない。画面焼けの場合は、何かしらどの画面でも影響が出るはず。

これには原因がありました。Windows Beingの背景がどうやら影響しているっぽい。

今日はたまたま、森の中にいる野生の熊の壁紙となっており、ちょうど画面上が淡い緑色をしていました。Beingの壁紙を一つ前に戻すと、どこかの街の夜景、今度は、ペイントソフトの背景の下画面がオレンジがかってました。

おそらく、デスクトップの背景によって、ペイント、エクセルソフトなどの背景は少なからず影響されているのかもしれない(まあ、経年劣化の可能性も捨てきれないが)。とりあえず、画面焼けといった買い替えを考えるような故障ではなくてよかったです (;'∀')φメモメモ


4/16(火)

AKY開発日記 #72 VBA

 

「引数は省略できません」

VBAでたびたび見られるエラーです。

 

参照元、参照先で引数を入れ忘れたケースにこのエラーはでます。

 

あるFunctionの関数で発生しました。

元々 Subであったが、戻り値が必要になったので、SubをFunctionに変えました。

 

その途端にこのメッセージが出るようになりました。

 

Dim oStack As New Collection '戻り値が必要なために新規追加したもの

oStack = searchIf(i,endRow,ct,jt,st) 'searchIfは元々戻り値を必要とせず Subだった。

 

この状態でエラーが出てしまうと。

 

引数は何も変更していない。

変更したのは、戻り値が必要になったので「As Collection」のところ

private Function searchIf(i,endRow,ct,jt,st) As Collection

 

何度やってもエラーが出る。調べてもよくわからないので、

初歩に戻る。Subに戻すと、このエラーは出ない。

 

・・・

oStack に入れる際に頭の「Set」の入れ忘れがあったことに気づく。

そういえばコレクションはオブジェクト型でした(;'∀')

Set oStack = searchIf(i,endRow,ct,jt,st) 'Setの入れ忘れにより「引数は省略できません」になっていた

 

少し前までは、Collectionは宣言したあとに

Set ct = New Collection といったように2行で行っていたが、最近Collectionは、宣言時に New Collectionにして1行にしてしまってました。あとは、 Add か removeで使うくらいだから、Setのことが完全に抜けてました。

 

結局、初歩的なミスに悩まされた夕方でした。引数は省略できません が オブジェクト型のSetの入れ忘れとか、わかりにくいもんです~~(; ..)φメモメモ


4/15(月)

AKY開発日記 #72 VBA ~コレクションとスタック~

 

週が明けました。

4月早くも暑くなってきて半袖でいいかなって感じです。

 

今日はコレクションの新しい使い方についてです( ..)φメモメモ

 

こちらのソースはRPG言語で書かれたソースです。列位置固定式のソースです。

     C           WK0E      IFNE WK0F

     C           WKKNJ     IFEQ 0

     C                     Z-ADDPRLENG    LL      30

     C           @CR,LL    IFEQ WKCR0E

     C                     MOVEL*BLANK    @CR,LL

     C                     ELSE

     C           PRLENG    SUB  1         D

     C           @CR,D     IFEQ WKCR0E

     C                     MOVEL*BLANK    @CR,D

     C                     ELSE

     C                     MOVELWKCR0F    @CR,D

     C                     END

     C                     Z-ADDPRLENG    D

     C                     MOVEL*BLANK    @CR,D

     C                     END

     C                     ELSE

     C                     Z-ADDPRLENG    D

     C           @CR,D     IFEQ WKCR0E

     C                     MOVEL*BLANK    @CR,D

     C                     ELSE

     C           @CR,X     IFEQ WKCR0F

     C                     MOVEL*BLANK    @CR,D

     C                     ELSE

     C                     MOVELWKCR0F    @CR,D

     C                     END

     C                     END

     C                     END ←これ

 

     C                     END

 

この WKKNJ     IFEQ 0 のIF文は、「     C                     END ←これ」

が対応する END(ENDIF)です。

 

このように「IF~END」の位置関係をみつけたい、ブロックを把握したいとき、というかRPG言語は難しいぞ。。。ネスト構造が見た感じ、ENDが縦に4つ並ぶなど複雑そうなソース。今まで For文でこつこつif文の数やENDIFの数などを数え探していたが、どうもスタックが便利なようだ。

スタックはデータ構造の一種で、「後入れ先出し」(LIFO: Last In, First Out)の原則に従ってデータを管理します。つまり、最後に追加された要素が最初に取り出される仕組みであり、これがVBAではコレクションを使うと同じようなことができるようだ。

 

スタックの操作

スタックでは主に二つの操作となる。

プッシュ(Push) - 新しい要素をスタックのトップに追加

 

ポップ(Pop) - スタックのトップから要素を取り出し、それを削除。

 

 

VBAでは標準的なスタック型が提供されていないため、Collection クラスを使用してスタックの機能に似たものをつくる。Collection オブジェクトでは、Add メソッドで要素を追加(プッシュ)し、Remove メソッドで特定の位置の要素を削除(ポップ)することができる。

 

以下、その仕組みを適用してみたVBAのコード

対象範囲のIF文に対応するENDIFを見つける(MsgBox~と書かれたところが、みつかって処理内容を記述するところ)

 

Dim ifStack As New Collection ’スタックを模倣したコレクション

Dim currentIfLine As Long

Dim EndIfFlag As Boolean

Dim i As Long,j As Long

Dim mysht As Worksheet

Dim RowEnd As Long

 

Set mysht  = Worksheets("sheet1")

RowEnd = 50

 

With mysht

For i = 1 To RowEnd

 

 if InStr(.Cells(i,"A"),"IF") Then

    ifStack.Add i   '開始IF文の行をスタックに追加(Push)

    currentIfLine = i ’現在行を取得

    EndIfFlag = False 'EndIfの処理の終わりを管理するフラグ。終わったらTrue

    For j = i+1 To RowEnd

 

       'ネストのIF文を探索(繰返文も終わりがENDなので同様にスタック追加対象とする)

       If InStr(.Cells(i,"列位置"),"IF") or InStr(.Cells(i,"列位置"),"DO") Then

          ifStack.Add j   'スタックに追加(Push)

       End If

 

 

       'ENDIFを探索(EndIfFlagがFalseの場合、まだ対象のENDIFが見つかってない)

       if not EndIfFlag and InStr(.Cells(i,"列位置"),"END") Then

           if ifStack(ifStack.Count) = currentIfLine Then

                MessageBox "End行":J   'この処理の箇所で判明する

                EndIfFlag = True '対象のENDIFが見つかったので処理完了、Trueにする

           End If

           ifStack.Remove ifStack.Count 最後の IF文を削除(Pop)

       End If

       If EndIfFlag Then Exit For '処理完了であれば、ループを抜ける

    Next

 ENd If

Next

End With

 

PushとPopの箇所がスタック操作。要は今回のケースでは、IF文が出てきたらPush操作で追加する、ENDと比較の際は、スタックの最後の内容と比較、違ったら、それはネストのIFになるので、スタックから最後のIf文を削除するPop操作を実行する。これの繰り返しで最終的に両者が一致するという仕組み。

仕組みがわかってくると、ネストされた構造の把握にほんと便利そうだ。

 

今回は IF~ENDIFだが、ちょっとこのソースに足すことで Elseも同様に可能です。

 

コレクションの新しい使い方を学びましたっと( ..)φメモメモ 


4/12(金)

AKY開発日記 #72 コーヒーブレイク

 

少し経ってしまったが、月の壁紙を更新。

4月だからやっぱり桜でしょうか。

近くの桜の画像です。桜を見ていると、ほんと春を感じますねえ。

 

最近のタスクはどうにもアイデアが頻繁に求められ、そのアイデアが何かと枯渇しやすい。

なもんでタスクの進捗が芳しくない。

枯渇してくると、どうにもコーヒーが飲みたくなる。

んで、まあコーヒーの飲むペースが早くなる。

 

近くのセブンで売っている、1リットルのセブンのパッケージのコーヒー(無糖)、

スターバックスのパッケージのコーヒーのペットボトル

BOSS缶

これらを日替わりでいつも飲んでます。

なんかコーヒーのありありはどーにも苦手で、砂糖なしミルクなしのブラックにしてます。

 

だからって煮詰まったアイデアが解決されるわけではないですが。

多い時には、1度に1本以上を飲むこともしばしば。ちょっと飲みすぎかもと思う、4月のある日でした(;'∀')


4/10(水)

AKY開発日記 #71 VBA

 

ブックの各シートをすべて一番上を選択した状態で終了する

 

これ、結構重要な処理である。ツールのマクロは処理の際、エクセルを操作する、時には操作が残ってしまうこともある。傾向としてあるのが、コピペ残し(Application.CutCopyModeの入れ忘れ)、スクロールダウンしたままなど)、これを残したまま人手に渡るのは・・・と思うと。

 

Dim i As Integer

 

For i = 1 To Worksheets.Count

    With Worksheets(i)

        .Activate

        .Range("A1").Select

        ActiveWindow.ScrollRow = 1

        ActiveWindow.ScrollColumn = 1

    End With

Next

 

Worksheets("開始ボタン").Activate

 

Worksheets("開始ボタン").Range("A1").Select

 

ブックのシートを順々に回って、セルのA1を選択した状態にする。

Scroll~を入れておかないと、スクロールダウンしたままのケースがある。選択した状態にしただけではスクロールダウンは解除されない。

 

いつもツールの完成に近づくと、このコードを忘れてしまう。

今回も過去の遺物から拾い起す羽目に。

とりあえず忘れないように( ..)φメモメモ

 


4/9(火)

AKY開発日記 #71 昨日の件の解決編

 

blog更新しようと思ったら、このページにはこれ以上入力できませんよと、仕様オーバーのメッセージが出てきた。とりあえず、他の引っ越しは後でやるとして、新規ページを作り書き込み。

 

昨日の問題であった、マクロが動かなくなる件は、他力ですが、解決しました。

 

どうやら、移すシートにフィルタオプションのフィルタリングが入っていたようで、これが原因で起こっていたようです。どうも、フィルタリングをしたままの場合、フィルタリングの中身を見に行ってる??仕組みはよくわからないが、メモリやCPUの負荷が極端にあがってしまうようでPC負荷が耐え切れなくなり、落ちてしまうっぽい。

 

筆者の扱うデータは数千行~数万行、列も結構ある、大きめなファイルだと思う。このファイルを別件の調査でフィルタリングしたままにしていたらしく、そのシートの状態でコピペしようとしていたようで起こりまくってたようです。

 

なんとか古いファイルを本格的に呼び起こす必要がなくなってホッとしているが、この手のエラーはエラーメッセージで出るわけでもなく、ほんとわかりづらい。おまけにエクセルが突然終了という、マクロが壊れてしまうんではないかという懸念まで発生してしまう始末。

 

シートをコピペする際は、コピペ元のフィルタリング状況を必ずチェックしてからコピペを実行しよう、ほんと、気を付けよう・・・( ..)φメモメモ


4/8(月)

AKY開発日記 #70 マクロでやってしまったかなあ

 

メジャーリーグが朝放送するような季節になり、どうにも少しずつ生活時間に乱れが生じはじめてます。朝早く起きると、当然ながら、日中は眠くなりやすい。そんなこんなで今週もはじまります。

 

VBAについての( ..)φメモメモ

 

' 新しいワークブックを保存

' "sheet1"と"sheet2"・・・をコピーして新しいワークブックにペースト

ThisWorkbook.Worksheets(Array("sheet1名前", "sheet2名前",・・・)).Copy

Set newWb = ActiveWorkbook  ' コピーによって作成された新しいワークブック

newWb.SaveAs filename:=uniqueFolderPass & saveName, _

 

             FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False

 

今のワークブックから複数のシートをコピーして別のブックを新規作成し、コピペするソース。

一枚のシートから複数のシートで適用できるので使いまわしできます。なお1枚のシートの場合、Array(はいらないです。

 

ここにも落とし穴がありました。

マクロでワークブックから別のワークブックへの作業は日常茶飯事です。先日、それが突然、使えなくなりました。

 

しかも恐ろしいことに、この過程でフリーズを起こしてしまい、挙句の果てにエクセルが強制再起動がかかってしまいます。オートメーションエラーならまだわかる(というかこのエラーも見たくはない)。

何度やっても同じ現象が起こってしまう。

 

筆者は、同時に恐ろしいことを覚え、これを繰り返しているとマクロツール自体が壊れてしまうんでないかと。急ぎ、これ以上の悪化を恐れ、ひたすらバックアップを取っておきました(;'∀')。ただ今更バックアップをとってもすでに問題が発生しているのだから後の祭りになりそう(;'∀')

 

結局、原因がわからずじまい。エラーが起こる箇所は、何とか上記のようなコピペの部分であること自体は特定ができました。この処理を行うサブルーチンを実行しないと、この現象は起こらない。

 

ChatGPTにたずねてみたが、適切な回答が得られず、さっぱりわからん(-_-;)

さて、本現象は金曜の帰宅直前に発生し、数時間格闘するも解決せず、週末休みを経て、週明けになったのだが、日を持ち越せば解決するんではと甘い考えをいだいているも、結局変わらず(;'∀')。そりゃそうですね。。。

マクロを入れてるツール本体自体壊れたんかなあ。

仕方ないので、一部、再作業となるが、少し前のバックアップを漁ることにします( ノД`)シクシク…