別に1〜31日まで入力して使ったり、月に合わせて手動で29〜31日を入力すれば良いだけだが、それでも簡単な関数で間違いがより少なくなるから良いではないか!?ということで、よく使う表組みなだけにWordpressで作成手順を明記することにした。
詳細は下記からどうぞ〜♡
・Excel :シフト表を作成する時に29日以降は関数で処理
これを次は更にシフト表と配置表を連動させ、個人別に出力させるのをVBAと関数でそれぞれ作ってみようと思っている。
結構参考になるんじゃないかな?と思っているが、どうだろう?
それでは、またね〜
2021年10月27日
2020年10月19日
ExcelVBAからAPIのMSGBOXを使い最前面に表示し処理待ちをする
2021.12.09追記
Wordpressでこの記事で使っているAPI-MSGBOXを表示し、UWSCで1秒後に自動的にOKを押すという記事を書いたので、ココにも更新しておく。
「VBA ExcelVBAでMessageBoxを最前面表示し1秒後OKを押す」
以下・・・本文
私が自作しているコピペツールは元々手動でExcelシートにWebから貼付けをしていた挙動をそのままUWSCに置き換えてExcelVBAでシートにコピペするように作成したので、とてもプログラミング的な動きではない!
初めからプログラミングを意識するなら、WebからのコピペをテキストデータもしくはCSV形式でファイルに保存して、後から編集でExcelもしくはAccessで表形式にデータ形式を整えデータベース投入するという手法が一般的だと思うが、なにぶん馬券購入しながらのプログラム作成になった為、ちょっとずつ作業を自動化するという方法を取った。もちろん手動でやっていたことをプログラミングするだけなので、コピペ作業のプログラミングは簡単なモノで良く、また先行で作成していたコピペ後のデータベース投入までは今までのExcelやAccessで作成したモノがそのまま使えるというメリットとその過程で作成される成果物がそのままブログで使用できるという効果もある。
ただプログラムとしてはやはり継ぎ接ぎなので、どうしてもUWSCとExcelVBAの切替部分でのタイムラグが発生する場合があり、SleepやWaitでは回避できないプログラミングの弱点があるのも確かだ。ここでMSGBOXを利用して、WAIT状態を作りツールの切替時(今回だとUWSCの起動時にMSGBOXを挟むことで)にMSGBOXで一旦止めてから次の処理に移ると、ほぼタイムラグの発生の問題は改善されるので、無駄なSleep命令を入れなくても快適に動くことが分かった。ただWeb表示の最前面に表示することはできない。
処理はちゃんと止まるので、ExcelやAccessを手動で表示切替すればメッセージが表示される。ここから処理を再開しすれば良いのだが、できればMSGBOXを最前面に表示し手動切替のワンクリックは省きたい。
EXCEL VBAでMessageBoxを表示させると
※これでも良いが、ExcelシートからUWSCやPythonを使ってChromeを起動しコピペを行えばウィンドウにはChromeでWeb画面が表示されておりメッセージ(MessageBox)は隠れてしまう。Web画面の上にメッセージ表示するようにしたい。
こんな時用にAPIのMessageBoxを使えるようにVBAで関数化しておけば、メッセージをトップ表示したいときはこの関数を使えば良いということになる。(これはググれば例文は簡単に見つかるので現行のVBAで使用できるようにちょっとだけ変更して使用する)
但し、、、
これだと半自動が限界であり、完全自動化するにはPythonだけで組みなおす方がベターな気はするが・・・
私の使い方だと、そろそろJRA-VANデータラボを投入した方が良いのか?と思えてきた。
早速明日準備してみようかな?と思っている。これで更にブログネタが増えるかも知れないね〜( ̄▽ ̄)
ちなみに秋華賞は、まったくダメでしたね〜私の本命馬マイティは・・・どこへ〜
それでは、またね〜
Wordpressでこの記事で使っているAPI-MSGBOXを表示し、UWSCで1秒後に自動的にOKを押すという記事を書いたので、ココにも更新しておく。
「VBA ExcelVBAでMessageBoxを最前面表示し1秒後OKを押す」
以下・・・本文
私が自作しているコピペツールは元々手動でExcelシートにWebから貼付けをしていた挙動をそのままUWSCに置き換えてExcelVBAでシートにコピペするように作成したので、とてもプログラミング的な動きではない!
初めからプログラミングを意識するなら、WebからのコピペをテキストデータもしくはCSV形式でファイルに保存して、後から編集でExcelもしくはAccessで表形式にデータ形式を整えデータベース投入するという手法が一般的だと思うが、なにぶん馬券購入しながらのプログラム作成になった為、ちょっとずつ作業を自動化するという方法を取った。もちろん手動でやっていたことをプログラミングするだけなので、コピペ作業のプログラミングは簡単なモノで良く、また先行で作成していたコピペ後のデータベース投入までは今までのExcelやAccessで作成したモノがそのまま使えるというメリットとその過程で作成される成果物がそのままブログで使用できるという効果もある。
ただプログラムとしてはやはり継ぎ接ぎなので、どうしてもUWSCとExcelVBAの切替部分でのタイムラグが発生する場合があり、SleepやWaitでは回避できないプログラミングの弱点があるのも確かだ。ここでMSGBOXを利用して、WAIT状態を作りツールの切替時(今回だとUWSCの起動時にMSGBOXを挟むことで)にMSGBOXで一旦止めてから次の処理に移ると、ほぼタイムラグの発生の問題は改善されるので、無駄なSleep命令を入れなくても快適に動くことが分かった。ただWeb表示の最前面に表示することはできない。
処理はちゃんと止まるので、ExcelやAccessを手動で表示切替すればメッセージが表示される。ここから処理を再開しすれば良いのだが、できればMSGBOXを最前面に表示し手動切替のワンクリックは省きたい。
EXCEL VBAでMessageBoxを表示させると
Sub test_VBAmsgbox()
Dim RET As Variant
'VBA MSGBOX TEST
RET = MsgBox("vba-message", vbOKOnly, "vba-title")
End Sub
※これでも良いが、ExcelシートからUWSCやPythonを使ってChromeを起動しコピペを行えばウィンドウにはChromeでWeb画面が表示されておりメッセージ(MessageBox)は隠れてしまう。Web画面の上にメッセージ表示するようにしたい。
こんな時用にAPIのMessageBoxを使えるようにVBAで関数化しておけば、メッセージをトップ表示したいときはこの関数を使えば良いということになる。(これはググれば例文は簡単に見つかるので現行のVBAで使用できるようにちょっとだけ変更して使用する)
'APIのMessageBox利用指定
Declare PtrSafe Function MessageBox Lib "user32.dll" Alias " _
MessageBoxA" ( _
ByVal hWnd As Long, _
ByVal msgC As String, _
ByVal msgT As String, _
ByVal uType As Long) As Long
'OKボタンフラグ
Public Const MB_OK = &H0
'最前面フラグ
Public Const MB_TOPMOST = &H40000
Sub test_APImsgbox()
Dim RET As Variant
'API MSGBOX TEST
RET = TopMostMsgBox("message", "title")
End Sub
Function TopMostMsgBox(c, t)
Dim msgT As String
Dim msgC As String
msgT = t
msgC = c
MessageBox 0, msgC, msgT, MB_OK Or MB_TOPMOST
End Function
但し、、、
これだと半自動が限界であり、完全自動化するにはPythonだけで組みなおす方がベターな気はするが・・・
私の使い方だと、そろそろJRA-VANデータラボを投入した方が良いのか?と思えてきた。
早速明日準備してみようかな?と思っている。これで更にブログネタが増えるかも知れないね〜( ̄▽ ̄)
ちなみに秋華賞は、まったくダメでしたね〜私の本命馬マイティは・・・どこへ〜
それでは、またね〜
2020年07月14日
ExcelVBA:別ブックからシートをコピペする雛形
別のブックを開いて内容をコピペする(概要)
これはvbaがちょっと長くなるから3部構成で説明する。
プログラムというのは、基本的に動きを理解しないと使えないか?というと既に出来上がっているモノは案外そのまま使える。元々用意されているExcel関数は「引数」というのがあるので、ある程度調べてからでないとちゃんと動かないが、今回のように2つ以上のブックを開いて1つのブックに纏めるというのは、自分でコツコツ組み立てるよりも既に動いている自作関数やモジュールを組み合わせて、パターン化しておく方が良い。
2つのブックを開いて、Access投入用に1つのブックに纏めておくなんてことは、これからもVBAを使うならあらゆる場面で役に立つからね〜
T「処理概要」
@今VBAを書いているExcelブックが親になる= ThisWorkbook.Activate
これさえ分かれば、通常のシート間でのセルのやり取りと同じなので、徐々に理解はできる。初めはパターン例文そのままコピペして動作確認さえすれば良い。たくさんvbaを組めばそのうち内容は理解する。
AコピペしたいブックをReadonlyで読み込む。
B処理をする(必要なセル範囲をコピペする)
これだけ〜( 一一)
U「ブックOpen判定」※このまま使え〜る。
実際にしようしているサンプルなども載せているので、コチラもよろしく〜
VBA 別ブックからシートをコピペする雛形
マクロで半自動化!go!go!!programming
プログラミングは自分のことに使うと楽しいのだ。
それでは、またね〜(^^♪
これはvbaがちょっと長くなるから3部構成で説明する。
プログラムというのは、基本的に動きを理解しないと使えないか?というと既に出来上がっているモノは案外そのまま使える。元々用意されているExcel関数は「引数」というのがあるので、ある程度調べてからでないとちゃんと動かないが、今回のように2つ以上のブックを開いて1つのブックに纏めるというのは、自分でコツコツ組み立てるよりも既に動いている自作関数やモジュールを組み合わせて、パターン化しておく方が良い。
2つのブックを開いて、Access投入用に1つのブックに纏めておくなんてことは、これからもVBAを使うならあらゆる場面で役に立つからね〜
T「処理概要」
@今VBAを書いているExcelブックが親になる= ThisWorkbook.Activate
これさえ分かれば、通常のシート間でのセルのやり取りと同じなので、徐々に理解はできる。初めはパターン例文そのままコピペして動作確認さえすれば良い。たくさんvbaを組めばそのうち内容は理解する。
AコピペしたいブックをReadonlyで読み込む。
B処理をする(必要なセル範囲をコピペする)
これだけ〜( 一一)
U「ブックOpen判定」※このまま使え〜る。
'// ブックオープン判定関数
Function IsBookOpened(a_sFilePath) As Boolean
On Error Resume Next
'// 保存済みのブックか判定
Open a_sFilePath For Append As #1
Close #1
If Err.Number > 0 Then
'// 既に開かれている場合
IsBookOpened = True
Else
'// 開かれていない場合
IsBookOpened = False
End If
End Function
V他ブックの内容をコピペする(パターン化する)Function OpenBk(opPath As String) As Variant
Dim ex As Excel.Application '// 処理用Excel
Dim wb As Workbook ' コピーするために開いたブック
Dim sPath As String '// ブックファイルパス
Dim r As Range '// 取得対象のセル範囲
Dim sht As Worksheet '// 参照シート
Dim bFlg As Boolean
OpenBk = False
'// 開くブックを指定(コピーしたいデータが入っている方)
sPath = opPath
'// 既に開かれているか確認
bFlg = IsBookOpened(sPath)
'// 開かれている場合
If bFlg Then
Set ex = New Excel.Application
'// 新規Excelで読み取り専用で開く
Set wb = ex.Workbooks.Open _
(Filename:=sPath, UpdateLinks:=0, ReadOnly:=True, IgnoreReadOnlyRecommended:=True)
Else
'// 現ブックで読み取り専用で開く
Set wb = Workbooks.Open _
(Filename:=sPath, UpdateLinks:=0, ReadOnly:=True, IgnoreReadOnlyRecommended:=True)
End If
ThisWorkbook.Activate 'ここでコレを入れないとちゃんとコピペしないから!
※このVBA処理を書いているモジュールを含むブックがThisWorkbookになる!
''' 「ここから処理を書く」
'''※ これはやりたい処理を通常通りセル間の処理でかけば良い。
''' 「ここまで処理」'// ブックを閉じる
Call wb.Close
If bFlg = True Then
Call ex.Application.Quit
End If
OpenBk = True
End Function
実際にしようしているサンプルなども載せているので、コチラもよろしく〜
VBA 別ブックからシートをコピペする雛形
マクロで半自動化!go!go!!programming
プログラミングは自分のことに使うと楽しいのだ。
それでは、またね〜(^^♪
2020年07月09日
ExcelVBA:Dir関数
競馬ファンの皆様そしてプログラム大好きな皆様こんにちは〜♡
GIも終わりそろそろWordpressの方も復帰しようかと考えております。ブログということだけならココで十分なんだけど、Wordpressって使うのにサバ借りたりして金がかかる割にうまく動かなかったりデータベースの設定間違えてファイル潰してログインできなくなったりと大変な面はあるんだけど、今はまだ個人的に結構面白かったりするだよね。
さてしばらく更新が滞っているWordpressなので、今回小ネタをここで整理してから記事をぶち込もうと思っている。
まずはDir関数
ファイルやファルダーが存在するのかどうか?を調べることができる関数。
これは使えると便利だよね〜
同じフォーマットで日付順のExcelデータを作成して保存しておき、あるタイミングで一括してAccess(データベース)に表データを投入するということができる。
例:土日の競馬データを日付別場別に管理して、当週の終わりに(もしくは次回の開催日までに)データベースにそのデータを一括投入する。といった使い方ができる。
私は実際こんな風に使っていますね〜
これで指定したファルダーのファイル名を全部Excelシートに書き出し、最新の開催日から4日前(-3)までのデータを対象としAccess投入用シートを作成する(投入用に土日のデータをコピペするだけのことなんだけどね)
Dir関数、システム的には必ず使う関数だけど毎度〃手が覚えるほど入力する構文ではないので、しばらく間が空くと、あれ?なんやったけ?あのファイル調べるヤツ・・・ってなるので、メモっておく必要はある。
それでは、今日はこのへんで。。。ExcelVBAリハ中うひひ
GIも終わりそろそろWordpressの方も復帰しようかと考えております。ブログということだけならココで十分なんだけど、Wordpressって使うのにサバ借りたりして金がかかる割にうまく動かなかったりデータベースの設定間違えてファイル潰してログインできなくなったりと大変な面はあるんだけど、今はまだ個人的に結構面白かったりするだよね。
さてしばらく更新が滞っているWordpressなので、今回小ネタをここで整理してから記事をぶち込もうと思っている。
まずはDir関数
ファイルやファルダーが存在するのかどうか?を調べることができる関数。
これは使えると便利だよね〜
同じフォーマットで日付順のExcelデータを作成して保存しておき、あるタイミングで一括してAccess(データベース)に表データを投入するということができる。
例:土日の競馬データを日付別場別に管理して、当週の終わりに(もしくは次回の開催日までに)データベースにそのデータを一括投入する。といった使い方ができる。
【構文】
Dir ( [PathName] [, Attributes] )
【戻り値】 文字列型 (String)
引数 Attributes に指定可能な定数
vbNormal 0 デフォルト
vbDirectory 16 フォルダ
※コピペ使用ではこの2つをよく使う
基本的な使い方はググればたくさんあるので、ここでは割愛する。
私は実際こんな風に使っていますね〜
' フォルダの存在確認
If Dir(strPathName, vbDirectory) = "" Then
MsgBox "指定のフォルダは存在しません。", vbExclamation, "出走馬フォルダーのPATH設定"
Exit Function
End If
これで指定したファルダーのファイル名を全部Excelシートに書き出し、最新の開催日から4日前(-3)までのデータを対象としAccess投入用シートを作成する(投入用に土日のデータをコピペするだけのことなんだけどね)
Dir関数、システム的には必ず使う関数だけど毎度〃手が覚えるほど入力する構文ではないので、しばらく間が空くと、あれ?なんやったけ?あのファイル調べるヤツ・・・ってなるので、メモっておく必要はある。
それでは、今日はこのへんで。。。ExcelVBAリハ中うひひ
タグ:Dir関数