2009/03/09

ググるさん1ページ目に・・・


・・・検索ワード "おきつねさま" だけで載るようになった^_^; (70件圏内)

気まぐれで、以前シゴトで使ってたVBScriptとかの持ちネタを放出しだしたからか?w
そお云う引き出しなら まだまだあるのだがw♪

VBScriptで日付処理 それから・・・


C++で作成してる別アプリが完了次第、
VBScriptでの日付処理最終版にとりかかる予定。

ただ思うに、C++で .NetFrameworkを利用して、
日付関連の文字列返すActiveXオブジェクトを組んだほうが効率良い様な気も・・・

シェアウェアなら似たようなのあるみたいだけど、
   VisualBasic関数のラッパーDLL VBWRAP ver1.00    
日付だけでイイって向きには、コスト掛けてまでってのはチョットね・・・

Excelワークシート関数に・・・


DateSerialがナイことに、さっき気がついた・・・

ナニをイマサラと云われそうだが、ソレもソノ筈、
    '----------------------------------------         
'Worksheet向けDateSerial
'- Created by LazwardFox -

'update 200903090716 微修正
'Release200511291534

Public Function iDateSerial(Optional ByVal iYear As Variant = "", _
Optional ByVal iMonth As Variant = "", _
Optional ByVal iDay As Variant = "", _
Optional ByVal iFormat As Variant = "") As Variant
On Error Resume Next
Application.Volatile
Dim Result
Result = DateSerial(iYear, iMonth, iDay)
If IsError(Result) Then '※
Result = Now() '※
End If '※
If iFormat = "" Then
Else
Result = Format(Result, iFormat)
End If
iDateSerial = Result
End Function
こんなのツクってアドインとして組み込んで使っていたので、そのコトを忘れていた(;゚д゚)ァ....


Worksheet上で
   =iDateSerial(2009,3,0,"yyyy/mm/dd")    
こう使う。

当然、引数はセル参照を指定できるので、当時は それなりに使えたよ。

ちなみに、今日追加したのは、文字列返しの部分と、不正入力対応・・・
デモ、ホントに使うのなら、不正値での動作は、エラーを返すほうがイイのかも知れない・・・
そうしたい場合は、※印の行を消して使ってくださいなっと♪


P.S. コッチのほうが無難かも・・・
    '----------------------------------------         
'Worksheet向けDateSerial
'- Created by LazwardFox -

'update 200903090824 再微修正
'Release200511291534

Public Function iDateSerial(Optional ByVal iYear As Variant = "", _
Optional ByVal iMonth As Variant = "", _
Optional ByVal iDay As Variant = "", _
Optional ByVal iFormat As Variant = "") As Variant
On Error Resume Next
Application.Volatile
Dim Result
If iYear="" And iMonth="" And iDay="" Then
Result = Date()
Else
Result = DateSerial(iYear, iMonth, iDay)
End If
If iFormat = "" Then
Else
Result = Format(Result, iFormat)
End If
iDateSerial = Result
End Function

VBScriptで月末日取得 最強処理・・・


つか、VBSで無くとも応用できます、閏とか一切気にしなくてイイです。

今日の月の月末日は ってのは
   n = Now()
ny = Year(n)
nm = Month(n)

ML = DateValue(ny,nm+1,0)
コレだけ(爆)

優良サイトではないので変数宣言省いてマスΨ(`∀´)Ψ

単に日付が欲しいだけで、イチイチ閏なんて計算してらんないって、バカらしくてw
ただ、税額処理だの、給与計算だのってぇのでは、意外に使える(実際使ってた)

+1 0 ってトコがツボ。大体殆どの開発環境で使えるし、
Excelワークシート関数なら
   =DATEVALUE(YEAR(NOW())&"/"&MONTH(NOW())+1&"/1")-1    
こうなる。

Excel/AccessなどのVBAでも有効な手段。
   Dim nYear As Integer ,nMonth As Integer

nYear = 2009
nMonth = 2

'日付値が欲しい場合
LastDay = DateSerial(nYear, nMonth + 1, 0)

'日のみ欲しい場合
LastDay = Day(DateSerial(nYear, nMonth + 1, 0))


Excelに対し、DateControls.xlaと云うExcelAddinファイルをツクって、
モジュールにFunctionsと銘打って、その中に記述していた関数、
Public宣言とApplication.Volatile記述で、ワークシート関数として使っていたブツ。
    '----------------------------------------         
'LastDayGet - Serial値から日付を取得し同月の末日を返す。
'- Created by LazwardFox -

'閏月対応

'update 200607031715 エラートラップ修正
'Release200511291534

Public Function LastDay(Optional ByVal Target As Variant = "") As Integer
On Error Resume Next
Application.Volatile
If Target = "" Or Target = 0 Or IsError(Target) Then
Target = Now()
End If
LastDay = Day(DateSerial(Year(Target), Month(Target) + 1, 0))
End Function


しかし、最近はExcelも使わなくなったなぁ・・・

って、職があった頃から、Excelには見切りつけて、
数百MB規模のデカいデータは、VBSで適宜処理して、AccessやSQL鯖にブチ込んで処理してたケドねww

つか、プーしてる今となっては、無用の長物だけどねww
<月末 日付取得 うるう Excel Access VBA>

云うたトコロで所詮・・・


元々Excel&AccessVBA使いが、以前、仕事の都合でVBScriptに手を出したので、移植モノも多いのデス。

なので、時折間違って、
    Public Function      
って、無意味に宣言記述してしまうコトも、いまだにあったり・・・^_^;

まぁ、日付に関しては、Script系では、VBAの使い良さに勝てないデスね・・・
・・・VBA:VisualBasic for Applicationの略
MSOffice製品のマクロ機能を司ってるのがコイシ。・・・って既知だろな、どうせ;

当然本家VisualBasicも、同様に処理できるので、
以前紹介したような、複雑なスクリプトなど無用の長物そのものなのデス。
だったらナンで書いたのか・・・ ソコに山があったのデス! (VBSで)ドコまでやれば、
そのヘン近づけられるかってのに興味があっただけなのデスww

VBScript実行が抑制される?・・・


VBScriptの.vbsファイルは、一部のセキュアアプリで実行が許可されないか、
実行確認画面をクリックする必要に迫られることがある。
(KingS●ft製のでヤラれたコトがある、数年前に・・・)
タスクで自動動作させたい向きには非常に厄介だ。

それらを避けたい場合は、.vbsファイルをエンコードして利用するコトで、
セキュアを維持しつつの自動化への解決となることが多い。

エンコード後の拡張子は .vbe

肝心のエンコーダは、 WindowsScriptEncoderと云うのが、
Microsoftサイトで配布(要認証)されているので、利用されたし。

ソースを読まれたくない場合などにも良いかと・・・w

VBScriptで鯖管理 そにょ1・・・


Update 20090311 0300
   ココのScriptも、以後のログにアーカイブ用意しました。    

Windowsのタスクに登録して、日毎フォルダを作成するだけのスクリプト。
当然設定は 1日1度 00:00 に 動作させる。

なんでそんなモノ要るのかって?
毎日定点で写真を撮ってるので、保存毎にフォルダ作るのが面倒になったからwww
ちなみに、ココで公開したスクリプトは、元々コレ向けだったものが多いですww

今回の分は、以前の仕事で、

"起動後、特定条件の日だけにデータ取得を動作させるよう、処理を自動化してくれ"

と依頼されて創ったモノをバラし、その断片に、新たな構想を加えて作成したモノです。
(確か、六曜で云う、大安 の日だけって指定だったと思う 当然Windowsのタスクにそんな器用な設定はない。)

iniファイル配置で、複数フォルダを対象に出来るのが、ちょっとだけ凝った点w
つか、コレに関しては、用途的に必須だったってのが事実^_^;

と云うのも、タスクにvbsやvbeを登録する場合、
ソレ自体はスクリプトであって、実行する本体ではないので、パラメータの指定が出来ないと云う罠が・・・
もっとも、ランタイム自体から記述してしまえばイイのだろうが、面倒だ。
どうせなら単純登録だけで使いたい・・・ と云う なんとも手抜きな欲がココまでさせたとも云える・・・
それに、複数のフォルダに同処理を施したかったってものあったので、iniファイルを読み込むカタチにしたと(´ヘ`;)

デキルコトはってぇと、指定フォルダ配下に、
   [指定したフォルダ]
└ yyyy
└ mm
└ dd
と云うカタチでフォルダを追加するだけw
指定したターゲットフォルダは、既存していることが必須で、ない場合、処理は実行されません。
自動でターゲットフォルダを作成する処理も検討しましたが、セキュリティ的に疑問を感じた為ヤメました。

書式)
    DateFolderCreate.vbe {対象フォルダ名{,対象フォルダ名}    


パラメータ無指定の場合
   [スクリプトを起動したフォルダ]
└ 2009
└ 03
└ 09
と、なり、

コマンドラインやショートカットからの、パラメータ指定起動の場合、
   [指定したフォルダ]
└ 2009
└ 03
└ 09
と なります。

また、スクリプトが配されているフォルダに、スクリプトと同名のiniファイルがあり、
   C:\Target,C:\Target\Target   
ないし、
   C:\Target
C:\Target\Target
と記述があれば、

   C:\Target
├ 2009
│ └ 03
│ └ 09
└ Target
└ 2009
└ 03
└ 09
と、云う結果になります。

指定先に、対象が既存の場合は、スキップするようになっているので、殆ど意識無く使えます。


毎度のコトながら、役割ごとに関数化してあるので、流用もしやすいかと・・・

▼ウチの鯖たん上で、実働してるスクリプトそのもの・・・^_^;
    '***** ↓↓↓ScriptTitle↓↓↓ *********************************************************     
'PhotoFolderCreate
'- Created by LazwardFox -
'単独起動で、起動フォルダに日付でフォルダを作成。
'パラメータ指定で複数フォルダ上に同一処理を実行。

'注) 20090223 0300 タスクマネージャ動作時、直接指定の場合、パラメータ指定不可

' Update 20090223 1442 必要関数のみに削減
' Update 20090223 1438 関数拡張
' Update 20090223 0253 iniファイルによるフォルダ指定を可能に、スクリプトファイル名を変更して利用。
' Update 20090223 0253 iDT修正
' Update 20090223 0135 iDT修正
' Update 20090222 2141
' Release 20090222 2108
' DevStart 20090222 2014

'***** ↓↓↓ ObjectDecralations ↓↓↓ *************************************************
Set Parameters = WScript.Arguments 'パラメーター取得
Set Fs = WScript.CreateObject("Scripting.FileSystemObject") 'ファイル制御

'***** ↓↓↓ Decralations ↓↓↓ *************************************************
Dim arTargets, iRoot, tFolder, sCD, arCD, iChk, sCN

'***** ↓↓↓MainRoutine↓↓↓ *********************************************************
If Parameters.Count > 0 Then
arTargets = Split(Parameters(0),",")
Else
arTargets = TargetFolders()
End IF
arCD = Split(iDT("\"," ",":",1)(0),"\")
For Each iRoot In arTargets
If Fs.FolderExists(iRoot) Then
tFolder = iRoot
For Each iChk In arCD
sCN = Fs.BuildPath(tFolder,iChk)
If Fs.FolderExists(sCN) Then
Else
Fs.CreateFolder sCN
End If
tFolder = sCN
Next
Else
End If
Next
Set Fs = Nothing
Set WSHShell = Nothing
Wscript.Quit

'***** ↓↓↓Functions↓↓↓ *********************************************************
'------------------------------------
'iDT - 日時文字列 ないし 日/時配列取得 for VBScript
'- Created by LazwardFox -

'Update 20090228 0458 変数宣言変更
'Update 20090223 0959 時刻桁処理変更
'Update 20090223 0253 Len記述忘れ修正
'Update 20090223 0135 変数宣言忘れ修正
'Update 20090210 0218
'Update 20090210 0115
'Release 20090209 2035

' iDT (
' dSplitter - DateSplitString (Normal - "/")
' ,dtSeparater - Date/Time SepaleteString (Normal - " ")
' ,tSplitter - TimeSplitString (Normal - ":")
' ,Control - 配列化 0 or 1 (Default - 1)
' )

Public Function iDT(dSplitter,dtSeparater,tSplitter,Control)
Dim nX, nD, nS, strHMS, sResult 'Update 20090228 0458
nX = Now()
nD = FormatDateTime(Date(),0)
nS = ":" & Split(CStr(FormatDateTime(nX,3)),":")(2) 'Update 20090223 0951
strHMS = FormatDateTime(nX,4) & nS 'Update 20090223 0951
If tSplitter = ":" Then
Else
strHMS = Replace(strHMS,":",tSplitter)
End If
sResult = Cstr(Replace(nD,"/",dSplitter)) & "*" & strHMS
If Control = 1 Then
iDT = Split(sResult,"*")
Else
iDT = Replace(sResult,"*",dtSeparater)
End If
End Function

'------------------------------------
'TargetFolders
'- Created by LazwardFox -
'スクリプトと同名のiniファイルがあれば、内容を配列で取得
'対象フォルダを取得、iniファイルがあれば優先する。戻り値は配列

' Update 20090223 0550 変則的フォルダ名回避のため修正
' Release 20090223 0509

Public Function TargetFolders()
Dim sNFull, rFolder, sN, iniFile
sNFull = Wscript.ScriptFullName
rFolder = Fs.GetParentFolderName(sNFull)
sN = Fs.GetBaseName(sNFull)
iniFile = Fs.BuildPath(rFolder,sN & ".ini")
If Fs.FileExists(iniFile) Then
TargetFolders = iniLoader(iniFile,0)
Else
TargetFolders = Array(rFolder)
End If
End Function

'------------------------------------
'iniLoader - 対象をiniファイルより取得。
'- Created by LazwardFox -

' Update 20090223 0550 戻り値可変 [ 0 - 配列 ] [ 1 - カンマ区切り文字列 ]
' Release 20090223 0509

Public Function iniLoader(iniFile, Control)
Dim nS
nS = Fs.GetFile(iniFile).size
If nS = 0 Then
iniLoader = Array(Fs.GetParentFolderName(iniFile))
Else
Dim iFile, lResult, strResults
Set iFile = Fs.OpenTextFile(iniFile,1) 'iniファイルを読み取りモードで開く
WScript.Sleep 150
Do Until iFile.AtEndOfStream '読み込み
lResult = lResult & ";" & iFile.ReadLine & ";"
Loop
WScript.Sleep 150
iFile.Close 'Iniファイルを閉じる
strResults = Replace(Replace(lResult,";;",","),";","")
If Control = 0 Then
iniLoader = Split(strResults, ",")
Else
iniLoader = strResults
End If
End If
End Function


って、以前のログから読んでるヒトには、使用関数周り、ドコかで見覚え感ありありでしょうが、
まぁ、御愛嬌と云うコトでww

・・・つか、こんなのに用がある閲覧者が居るのかってコトのほうが、いささか疑問だが(´ヘ`;)
<そのまま使えるVBScript 日付 フォルダ 作成 自動化 複数 ルートフォルダ 指定可能>

もう・・・


いい加減、StyleSheetの宣言が鬱陶しくなってキタので、外部ファイル化した。

・・・って、単に今までのを集約して、テキストに貼っつけて、cssファイル作っただけなんだけどねw
ただ、自鯖上の各テストサイトの分、管理グダグダになってたのでスッキリした。