Visual Basic(.NET以前)
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
] [
Twitter
]
開始行:
→言語・開発環境
→ExcelのVBA
→PowerShell他
#contents
*関連ニュース [#t5ba906d]
-[[Visual Basic 6.0の100%互換性 TwinBASICの紹介 - Qiita>...
-[[Windows 11はVB6.0アプリのサポートを継続するか - Qiita>...
--[[Support Statement for Visual Basic 6.0 | Microsoft Do...
-[[Rubberduck>https://github.com/rubberduck-vba/Rubberduc...
--Rubberduck is a COM add-in for the VBA IDE (VBE).
-[[物言わぬ多数派: Visual Basic 6 が今でも成功している理...
-[[VB6アプリをVistaで動かすための基礎知識>http://www.atma...
-[[Visual Basicの200X年問題>http://itpro.nikkeibp.co.jp/a...
--2005年:VBメインストリームサポート終了
--2008年:VB延長サポート終了 ←VB6での開発がサポートなしの...
--2009年:WindowsXPのメインストリームサポート終了
--2010年:Windows 2003 Serverメインストリームサポート終了
--2014年:WindowsXPの延長サポート終了
--2015年:Windows 2003 Server延長サポート終了
--2018年頃:Vista/Server 2008の延長サポート終了 ←VB6アプ...
-[[開発者によるVBの利用が急減>http://itpro.nikkeibp.co.jp...
--北米の開発者430人以上を対象に調査を実施したこところ,昨...
--Visual Basic 6.0以前のユーザーが減少しているほか,Visua...
--現在,最も利用率が高いのはJava(45%)で,以下C/C++(40...
*相互運用 [#a3be643d]
-[[VB6(VBA)からC#製DLLを呼ぶ際のマーシャリング術 - Qiita>...
*ファイルの存在確認 [#g54e043e]
-参照:http://atomsware.co.jp/cima/archives/2005/09/vb_1....
Private Function FileExist(sFileName As Variant) As Bool...
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
FileExist = fso.FileExists(sFileName)
Set fso = Nothing
End Function
--Microsoft Scripting Runtime (scrrun.dll)を参照するとよい
*フルパスの文字列からファイル名とパスを別々に切り出す [#h...
-参照で Microsoft Scripting Runtime を参照する
Dim fso As FileSystemObject
Set fso = New FileSystemObject
fnam = fso.GetFileName(fullpath)
path = fso.GetParentFolderName(fullpath)
*VBでハッシュテーブル [#lceac96c]
-http://ziomatrix18.blog68.fc2.com/blog-entry-502.html
-参照設定で「Microsoft Scripting Runtime」にチェックを入...
Dim hash As Scripting.Dictionary
Set hash = New Scripting.Dictionary
If hash.Exists("Key1") Then
hash.Item("Key1") = "Item1"
Else
hash.Add "Key1", "Item1"
End If
MsgBox hash.Item("Key1")
hash.RemoveAll
Set hash = Nothing
-注意点:このハッシュテーブルにはなんでも入れられるわけで...
*文字列操作 [#fc157d87]
-[[VBの文字列操作>http://homepage2.nifty.com/sak/w_sak3/d...
chr キャラクタコードの文字を返す
asc 文字のキャラクタコードを返す
str 数値を文字列に変換
val 文字列を数値に変換
space n 個の空白を生成
string 特定文字を n 個生成
trim 左右の全角半角空白を削除
ltrim 左側の全角半角空白を削除
rtrim 右側の全角半角空白を削除
lcase 小文字に変換
ucase 大文字に変換
left 左側より n 個の文字列を切り出し
mid n 番目から n 個の文字列を切り出し
mid ステートメントして使用すると文字列を置き換える
right 右側より n 個の文字列を切り出し
len 何文字あるか数える
instr 指定文字列が何番目から存在するか調べる
format 書式指定変換をする
now format と組み合わせて、today などを生成する
*配列のソート [#q7f7424e]
-http://www.geocities.co.jp/SilkRoad/4511/vb/strsort.htm
-VBには簡単なソートの仕組みは用意されてないので自分でソー...
Public Sub StrSort _
(ByRef strArray() As String, _
ByVal lngStart As Long, _
ByVal lngEnd As Long, _
Optional ByVal lngCompare As Long)
Dim lngBaseNumber As Long ...
Dim strBaseValue As String ...
Dim lngCounter As Long ...
Dim strBuffer As String ...
Dim i As Long ...
If lngStart >= lngEnd Then Exit Sub ...
lngBaseNumber = (lngStart + lngEnd) \ 2 ...
strBaseValue = strArray(lngBaseNumber) ...
strArray(lngBaseNumber) = strArray(lngStart) ...
lngCounter = lngStart ...
For i = (lngStart + 1) To lngEnd Step 1 ...
If StrComp(strArray(i), strBaseValue, lngCompare...
lngCounter = lngCounter + 1 ...
strBuffer = strArray(lngCounter) ...
strArray(lngCounter) = strArray(i)
strArray(i) = strBuffer
End If
Next i
strArray(lngStart) = strArray(lngCounter) ...
strArray(lngCounter) = strBaseValue ...
Call StrSort(strArray(), lngStart, lngCounter - 1) ...
Call StrSort(strArray(), lngCounter + 1, lngEnd) ...
End Sub
*指定フォルダ内のファイル名列挙 [#k3d3b362]
'ファイル名列挙
Dim Path As String
Path = folder & "\" & "*.*"
Dim fname As String
fname = Dir(path)
Dim fnames() As String
Dim i As Integer
i = 0
Do While fname <> ""
ReDim Preserve fnames(i)
fnames(i) = fname
i = i + 1
fname = Dir()
Loop
*他プロセスの同期的実行 [#k8360c9f]
-参考:http://www.ops.dti.ne.jp/~allergy/vb/vbvba.html#exec
Option Explicit
'プロセス処理用の宣言とか
Declare Function OpenProcess Lib "kernel32" (ByVal dwDes...
Declare Function CloseHandle Lib "kernel32" (ByVal hObje...
Declare Function WaitForSingleObject Lib "kernel32" (ByV...
Declare Function GetExitCodeProcess Lib "kernel32" (ByVa...
Public Const SYNCHRONIZE As Long = &H100000
Public Const PROCESS_QUERY_INFORMATION As Long = &H400
Public Const STANDARD_RIGHTS_REQUIRED As Long = &HF0000
Public Const PROCESS_ALL_ACCESS As Long = STANDARD_RIGHT...
Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessId As Long
dwThreadId As Long
End Type
Type STARTUPINFO
cb As Long
lpReserved As String
lpDesktop As String
lpTitle As String
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Byte
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type
Public Const NORMAL_PRIORITY_CLASS = &H20
Declare Function CreateProcess Lib "kernel32" Alias "Cre...
ByVal lpApplicationName As String, ByVal lpCommandLin...
lpProcessAttributes As Any, lpThreadAttributes As Any...
ByVal bInheritHandles As Long, ByVal dwCreationFlags ...
lpEnvironment As Any, ByVal lpCurrentDriectory As Str...
lpStartupInfo As STARTUPINFO, lpProcessInformation As...
Public Function Execute(cmd As String) As Integer
Dim pInfo As PROCESS_INFORMATION
Dim sInfo As STARTUPINFO
Dim lngRet As Long
Dim ecode As Long
sInfo.cb = LenB(sInfo)
lngRet = CreateProcess(vbNullString, _
cmd, _
ByVal 0&, _
ByVal 0&, _
1&, _
NORMAL_PRIORITY_CLASS, _
ByVal 0&, _
vbNullString, _
sInfo, _
pInfo)
WaitForSingleObject pInfo.hProcess, 100000
GetExitCodeProcess pInfo.hProcess, ecode ' 終了コー...
CloseHandle pInfo.hThread ' スレッドハンドルを閉じる
CloseHandle pInfo.hProcess ' プロセスハンドルを閉じる
End Function
*コントロールのフォントの異常? [#i593e55b]
-文字をMS Pゴシック サイズ9で作成したコントロールがExeに...
--(パソコンにログインだとOKだけど、ドメインでログイン...
-で、その状態でソースをいじるとWindowsまで落ちます
-対処方法は、MS UIゴシックに変更したら治りました
-(しかし本当にこんな基本的なバグがあるのか?何らかの特定...
*Round関数は四捨五入ではない [#vbd313f6]
-http://code.nanigac.com/source/view/74
VB6において、丸め関数は"INT","FIX","ROUND"があります。
このうち、"ROUND"は「最も近い偶数に丸める」という四捨五...
一般的なものとは違います(よく嵌るワナ)。
多くの Round() 関数の挙動もこの IEEE 754 に則った「偶数...
*VistaでのVB6対応 [#w23ef853]
-Vista でもVB6ランタイムは、提供される。
-また、IDEも動作させることができる(ようにする)。
-ただし、MSDEは未サポート。
-そのため、MSDEで実行しているアプリケーションは、SQL Serv...
*VBからVB.NETへの移行 [#c7a7db2b]
-[[VB6業務アプリはいつまで使えるの?:http://www.atmarkit....
-[[Upgrading Visual Basic 6.0 Applications to Visual Basi...
-[[VB6->VB.NETへの移行にかかる工数の見積もりツール:http:/...
*特殊なディレクトリの取得 [#v0e21937]
-My Documents やデスクトップなど、特殊フォルダの物理的フ...
-Windows2000 などでは、ユーザー毎にシステムフォルダのパス...
-勝手に "C:\My Documents" などと決めず、この関数を用いて...
-なお、Windows フォルダや System フォルダを取得したい場合...
-標準モジュールに記述します。
Option Explicit
OS が管理する特殊フォルダのItemIDListのポインタを取得する
Private Declare Function SHGetSpecialFolderLocation Lib ...
(ByVal hwndOwner As Long, ByVal nFolder As Long, ppidl A...
ItemIDList のポインタからフォルダの名前を取得する
Private Declare Function SHGetPathFromIDList Lib "Shell3...
(ByVal pidl As Long, ByVal pszPath As String) As Long
タスクメモリブロックを解放する
Private Declare Sub CoTaskMemFree Lib "Ole32" (ByVal pv ...
ID の値
Public Enum IDL_LIST
CSIDL_DESKTOP = &H0 '\デスクトッ...
CSIDL_PROGRAMS = &H2 '\プログラム...
CSIDL_PERSONAL = &H5 '\My Doucutents
CSIDL_FAVORITES = &H6 '\お気に入り
CSIDL_STARTUP = &H7 '\スタートア...
CSIDL_RECENT = &H8 '\最近使った...
CSIDL_SENDTO = &H9 '\送る
CSIDL_STARTMENU = &HB '\スタートメ...
CSIDL_DESKTOPDIRECTORY = &H10 '\デスクトッ...
CSIDL_NETHOOD = &H13 '\NetHood
CSIDL_FONTS = &H14 '\フォント
CSIDL_TEMPLATES = &H15 '\テンプレート
CSIDL_COMMON_STARTMENU = &H16 '\All User ス...
CSIDL_COMMON_PROGRAMS = &H17 '\All User プ...
CSIDL_COMMON_STARTUP = &H18 '\All User ス...
CSIDL_COMMON_DESKTOPDIRECTORY = &H19 '\All User デ...
CSIDL_APPDATA = &H1A '\アプリ定義...
CSIDL_PRINTHOOD = &H1B '\プリンタリ...
CSIDL_COMMON_FAVORITES = &H1F '\All User お...
CSIDL_INTERNET_CACHE = &H20 '\IEのキャッ...
CSIDL_COOKIES = &H21 '\クッキー用...
CSIDL_HISTORY = &H22 '\IEの履歴
CSIDL_INTERNET = &H1 'Virtual fold...
CSIDL_CONTROLS = &H3 'Virtual fold...
CSIDL_PRINTERS = &H4 'Virtual fold...
CSIDL_BITBUCKET = &HA 'Virtual fold...
CSIDL_DRIVES = &H11 'My Computer ...
'storage devi...
'The folder m...
CSIDL_NETWORK = &H12 'Network Neig...
'the root of ...
CSIDL_ALTSTARTUP = &H1D 'File system ...
CSIDL_COMMON_ALTSTARTUP = &H1E 'File system ...
'for all use...
End Enum
Private Const MAX_PATH = 260
Public Function GetSPFolderPath(ItemID As IDL_LIST) As S...
'機能
' 特殊フォルダのフルパスを取得します
'引数
' ItemID : 特殊フォルダを表す ID (インテリセンスが機...
'戻り値
' 特殊フォルダのフルパス名(文字列)
Dim lngRet As Long 'API からの戻り値
Dim pidlFolder As Long 'ItemIDList のポインタ ( pidl )
Dim strBuf As String '文字列を受け取るバッファ
'pidl 取得
lngRet = SHGetSpecialFolderLocation(0, ItemID, pidlFo...
If lngRet >= 0 Then
'文字列のバッファ確保
strBuf = String$(MAX_PATH, vbNullChar)
'pidl からフルパス取得
If SHGetPathFromIDList(pidlFolder, strBuf) <> 0 T...
'余った部分の不要なヌル文字を除去
strBuf = Left$(strBuf, InStr(strBuf, vbNullCh...
Else
'取得に失敗した場合は空文字を返す
strBuf = ""
End If
'後始末
CoTaskMemFree pidlFolder
GetSPFolderPath = strBuf
End If
End Function
-実行例:
--イミディエイトウィンドウでの実行例です。
?GetSPFolderPath(CSIDL_PERSONAL)
C:\Documents and Settings\lionel\My Documents
*Format関数で西暦→和暦に変換するには [#rf350a2f]
-Format("20060101", "GGGEE") のようにする
*Format関数の日付/時刻表示書式指定文字 [#vbbcbadb]
|記号|意味|h
|(:)|時刻の区切り記号です。オペレーティング システムの国...
|(/)|日付の区切り記号です。オペレーティング システムの国...
|c|ddddd および t t t t t の書式で表した日付と時刻を、日...
|d|日付を返します。1 桁の場合、先頭に 0 が付きません (1 ...
|dd|日付を返します。1 桁の場合、先頭に 0 が付きます (01 ...
|ddd|曜日を英語 (省略形) で返します (Sun 〜 Sat)。 |
|aaa|曜日を日本語 (省略形) で返します (日〜土)。 |
|dddd|曜日を英語で返します (Sunday 〜 Saturday)。 |
|aaaa|曜日を日本語で返します (日曜日〜土曜日)。 |
|ddddd|年、月、日を含む短い形式 (コントロール パネルで設...
|dddddd|年、月、日を含む長い形式 (コントロール パネルで設...
|w|曜日を表す数値を返します (日曜日が 1、土曜日が 7 とな...
|ww|その日が一年のうちで何週目に当たるかを表す数値を返し...
|m|月を表す数値を返します。1 桁の場合、先頭に 0 が付きま...
|mm|月を表す数値を返します。1 桁の場合、先頭に 0 が付きま...
|mmm|月の名前を英語 (省略形) の文字列に変換して返します (...
|mmmm|月の名前を英語で返します (January 〜 December)。 |
|oooo|月の名前を日本語で返します (1 月 〜 12 月)。 |
|q|1 年のうちで何番目の四半期に当たるかを表す数値を返しま...
|g|年号の頭文字を返します (M、T、S、H)。 |
|gg|年号の先頭の 1 文字を漢字で返します (明、大、昭、平)...
|ggg|年号を返します (明治、大正、昭和、平成)。 |
|e|年号に基づく和暦の年を返します。1 桁の場合、先頭に 0 ...
|ee|年号に基づく和暦の年を 2 桁の数値を使って返します。1 ...
|y|1 年のうちで何日目に当たるかを数値で返します (1 〜 366...
|yy|西暦の年を下 2 桁の数値で返します (00 〜 99)。 |
|yyyy|西暦の年を 4 桁の数値で返します (100 〜 9999)。 |
|h|時間を返します。1 桁の場合、先頭に 0 が付きません (0 ...
|hh|時間を返します。1 桁の場合、先頭に 0 が付きます (00 ...
|n|分を返します。1 桁の場合、先頭に 0 が付きません (0 〜 ...
|nn|分を返します。1 桁の場合、先頭に 0 が付きます (00 〜 ...
|s|秒を返します。1 桁の場合、先頭に 0 が付きません (0 〜 ...
|ss|秒を返します。1 桁の場合、先頭に 0 が付きます (00 〜 ...
|t|t t t t コントロール パネルで設定されている形式で時刻...
|AM/PM|時刻が正午以前の場合は大文字で AM を返し、正午〜午...
|am/pm|時刻が正午以前の場合は小文字で am を返し、正午〜午...
|A/P|時刻が正午以前の場合は大文字で A を返し、正午〜午後 ...
|a/p|時刻が正午以前の場合は小文字で a を返し、正午〜午後 ...
|AMPM|"12 時間制" が選択されていて、時刻が正午以前の場合...
*VBでの構造体の書き方 [#k78a39ef]
-最近VB使ってないので意外と忘れてしまうためメモ
Public Type Character
Name As String
Hp As Byte
Mp As Byte
Level As Byte
Exp As Byte
Gold As Byte
End Type
*VBでフォームの表示とクローズ [#u63506ef]
-しばらく使ってないとこんな基本も忘れてしまう…
-表示は
Dim f As New XxxForm
f.Show(vbModal)
-Closeは
Call Unload(Me)
Callをつけないと引数が値渡しとみなされてエラーになるので...
*VBの割り算での注意点 [#r451b29e]
-VBでは割り算の演算子は / と \ の2種類ある。/の場合、Int...
-ExcelのVBAでの検証プログラム↓これだとa=128以後はbの値が...
Sub test()
Dim a As Integer
Dim b As Integer
For a = 1 To 256
b = a / 256
ActiveSheet.Cells(a, 1) = b
ActiveSheet.Cells(a, 1).Select
DoEvents
Next
End Sub
-参考:http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?...
*VBで基数変換 [#y7a0918a]
-http://oshiete.goo.ne.jp/qa/872647.html
10進->16進
strTMP$ = Hex(intTMP$)
16進->10進
intTMP$= Val("&H" & "16進文字列")
*VBで正規表現 [#ve02bdf8]
-[[Microsoft Visual Basic 6.0 で正規表現を使用する方法>ht...
[プロジェクト] メニューの [参照設定] をクリックします。
[Microsoft VBScript Regular Expressions 5.5] をダブルク...
ツールボックスの [CommandButton] をダブルクリックします。
デフォルトで Command1 がフォームに追加されます。
[Command1] をダブルクリックして、コード ウィンドウを開き...
次のコードを Command1_Click イベント ハンドラに貼り付け...
MsgBox(TestRegExp("is.", "IS1 is2 IS3 is4"))
注 : この例では、「is.」というパターンが「IS1 is2 IS3 is...
かどうかが判定されます。特殊文字の ピリオド (.) はワイル...
使用できるため、任意の 1 文字と一致し、検索パターンと一...
ピリオド (.) を 2 つ検索パターンに追加した場合は、任意の...
ピリオド (.) を使用しない場合は、 検索パターンのみが表示...
次の関数を Command1_Click イベン ト ハンドラの後に追加し...
Function TestRegExp(myPattern As String, myString As Str...
'Create objects.
Dim objRegExp As RegExp
Dim objMatch As Match
Dim colMatches As MatchCollection
Dim RetStr As String
' Create a regular expression object.
Set objRegExp = New RegExp
'Set the pattern by using the Pattern property.
objRegExp.Pattern = myPattern
' Set Case Insensitivity.
objRegExp.IgnoreCase = True
'Set global applicability.
objRegExp.Global = True
'Test whether the String can be compared.
If (objRegExp.Test(myString) = True) Then
'Get the matches.
Set colMatches = objRegExp.Execute(myString) ' Exe...
For Each objMatch In colMatches ' Iterate Matches ...
RetStr = RetStr & "Match found at position "
RetStr = RetStr & objMatch.FirstIndex & ". Match V...
RetStr = RetStr & objMatch.Value & "'." & vbCrLf
Next
Else
RetStr = "String Matching Failed"
End If
TestRegExp = RetStr
End Function
[実行] メニューの [開始] をクリックして、アプリケーショ...
[Command1] をクリックします。
終了行:
→言語・開発環境
→ExcelのVBA
→PowerShell他
#contents
*関連ニュース [#t5ba906d]
-[[Visual Basic 6.0の100%互換性 TwinBASICの紹介 - Qiita>...
-[[Windows 11はVB6.0アプリのサポートを継続するか - Qiita>...
--[[Support Statement for Visual Basic 6.0 | Microsoft Do...
-[[Rubberduck>https://github.com/rubberduck-vba/Rubberduc...
--Rubberduck is a COM add-in for the VBA IDE (VBE).
-[[物言わぬ多数派: Visual Basic 6 が今でも成功している理...
-[[VB6アプリをVistaで動かすための基礎知識>http://www.atma...
-[[Visual Basicの200X年問題>http://itpro.nikkeibp.co.jp/a...
--2005年:VBメインストリームサポート終了
--2008年:VB延長サポート終了 ←VB6での開発がサポートなしの...
--2009年:WindowsXPのメインストリームサポート終了
--2010年:Windows 2003 Serverメインストリームサポート終了
--2014年:WindowsXPの延長サポート終了
--2015年:Windows 2003 Server延長サポート終了
--2018年頃:Vista/Server 2008の延長サポート終了 ←VB6アプ...
-[[開発者によるVBの利用が急減>http://itpro.nikkeibp.co.jp...
--北米の開発者430人以上を対象に調査を実施したこところ,昨...
--Visual Basic 6.0以前のユーザーが減少しているほか,Visua...
--現在,最も利用率が高いのはJava(45%)で,以下C/C++(40...
*相互運用 [#a3be643d]
-[[VB6(VBA)からC#製DLLを呼ぶ際のマーシャリング術 - Qiita>...
*ファイルの存在確認 [#g54e043e]
-参照:http://atomsware.co.jp/cima/archives/2005/09/vb_1....
Private Function FileExist(sFileName As Variant) As Bool...
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
FileExist = fso.FileExists(sFileName)
Set fso = Nothing
End Function
--Microsoft Scripting Runtime (scrrun.dll)を参照するとよい
*フルパスの文字列からファイル名とパスを別々に切り出す [#h...
-参照で Microsoft Scripting Runtime を参照する
Dim fso As FileSystemObject
Set fso = New FileSystemObject
fnam = fso.GetFileName(fullpath)
path = fso.GetParentFolderName(fullpath)
*VBでハッシュテーブル [#lceac96c]
-http://ziomatrix18.blog68.fc2.com/blog-entry-502.html
-参照設定で「Microsoft Scripting Runtime」にチェックを入...
Dim hash As Scripting.Dictionary
Set hash = New Scripting.Dictionary
If hash.Exists("Key1") Then
hash.Item("Key1") = "Item1"
Else
hash.Add "Key1", "Item1"
End If
MsgBox hash.Item("Key1")
hash.RemoveAll
Set hash = Nothing
-注意点:このハッシュテーブルにはなんでも入れられるわけで...
*文字列操作 [#fc157d87]
-[[VBの文字列操作>http://homepage2.nifty.com/sak/w_sak3/d...
chr キャラクタコードの文字を返す
asc 文字のキャラクタコードを返す
str 数値を文字列に変換
val 文字列を数値に変換
space n 個の空白を生成
string 特定文字を n 個生成
trim 左右の全角半角空白を削除
ltrim 左側の全角半角空白を削除
rtrim 右側の全角半角空白を削除
lcase 小文字に変換
ucase 大文字に変換
left 左側より n 個の文字列を切り出し
mid n 番目から n 個の文字列を切り出し
mid ステートメントして使用すると文字列を置き換える
right 右側より n 個の文字列を切り出し
len 何文字あるか数える
instr 指定文字列が何番目から存在するか調べる
format 書式指定変換をする
now format と組み合わせて、today などを生成する
*配列のソート [#q7f7424e]
-http://www.geocities.co.jp/SilkRoad/4511/vb/strsort.htm
-VBには簡単なソートの仕組みは用意されてないので自分でソー...
Public Sub StrSort _
(ByRef strArray() As String, _
ByVal lngStart As Long, _
ByVal lngEnd As Long, _
Optional ByVal lngCompare As Long)
Dim lngBaseNumber As Long ...
Dim strBaseValue As String ...
Dim lngCounter As Long ...
Dim strBuffer As String ...
Dim i As Long ...
If lngStart >= lngEnd Then Exit Sub ...
lngBaseNumber = (lngStart + lngEnd) \ 2 ...
strBaseValue = strArray(lngBaseNumber) ...
strArray(lngBaseNumber) = strArray(lngStart) ...
lngCounter = lngStart ...
For i = (lngStart + 1) To lngEnd Step 1 ...
If StrComp(strArray(i), strBaseValue, lngCompare...
lngCounter = lngCounter + 1 ...
strBuffer = strArray(lngCounter) ...
strArray(lngCounter) = strArray(i)
strArray(i) = strBuffer
End If
Next i
strArray(lngStart) = strArray(lngCounter) ...
strArray(lngCounter) = strBaseValue ...
Call StrSort(strArray(), lngStart, lngCounter - 1) ...
Call StrSort(strArray(), lngCounter + 1, lngEnd) ...
End Sub
*指定フォルダ内のファイル名列挙 [#k3d3b362]
'ファイル名列挙
Dim Path As String
Path = folder & "\" & "*.*"
Dim fname As String
fname = Dir(path)
Dim fnames() As String
Dim i As Integer
i = 0
Do While fname <> ""
ReDim Preserve fnames(i)
fnames(i) = fname
i = i + 1
fname = Dir()
Loop
*他プロセスの同期的実行 [#k8360c9f]
-参考:http://www.ops.dti.ne.jp/~allergy/vb/vbvba.html#exec
Option Explicit
'プロセス処理用の宣言とか
Declare Function OpenProcess Lib "kernel32" (ByVal dwDes...
Declare Function CloseHandle Lib "kernel32" (ByVal hObje...
Declare Function WaitForSingleObject Lib "kernel32" (ByV...
Declare Function GetExitCodeProcess Lib "kernel32" (ByVa...
Public Const SYNCHRONIZE As Long = &H100000
Public Const PROCESS_QUERY_INFORMATION As Long = &H400
Public Const STANDARD_RIGHTS_REQUIRED As Long = &HF0000
Public Const PROCESS_ALL_ACCESS As Long = STANDARD_RIGHT...
Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessId As Long
dwThreadId As Long
End Type
Type STARTUPINFO
cb As Long
lpReserved As String
lpDesktop As String
lpTitle As String
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Byte
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type
Public Const NORMAL_PRIORITY_CLASS = &H20
Declare Function CreateProcess Lib "kernel32" Alias "Cre...
ByVal lpApplicationName As String, ByVal lpCommandLin...
lpProcessAttributes As Any, lpThreadAttributes As Any...
ByVal bInheritHandles As Long, ByVal dwCreationFlags ...
lpEnvironment As Any, ByVal lpCurrentDriectory As Str...
lpStartupInfo As STARTUPINFO, lpProcessInformation As...
Public Function Execute(cmd As String) As Integer
Dim pInfo As PROCESS_INFORMATION
Dim sInfo As STARTUPINFO
Dim lngRet As Long
Dim ecode As Long
sInfo.cb = LenB(sInfo)
lngRet = CreateProcess(vbNullString, _
cmd, _
ByVal 0&, _
ByVal 0&, _
1&, _
NORMAL_PRIORITY_CLASS, _
ByVal 0&, _
vbNullString, _
sInfo, _
pInfo)
WaitForSingleObject pInfo.hProcess, 100000
GetExitCodeProcess pInfo.hProcess, ecode ' 終了コー...
CloseHandle pInfo.hThread ' スレッドハンドルを閉じる
CloseHandle pInfo.hProcess ' プロセスハンドルを閉じる
End Function
*コントロールのフォントの異常? [#i593e55b]
-文字をMS Pゴシック サイズ9で作成したコントロールがExeに...
--(パソコンにログインだとOKだけど、ドメインでログイン...
-で、その状態でソースをいじるとWindowsまで落ちます
-対処方法は、MS UIゴシックに変更したら治りました
-(しかし本当にこんな基本的なバグがあるのか?何らかの特定...
*Round関数は四捨五入ではない [#vbd313f6]
-http://code.nanigac.com/source/view/74
VB6において、丸め関数は"INT","FIX","ROUND"があります。
このうち、"ROUND"は「最も近い偶数に丸める」という四捨五...
一般的なものとは違います(よく嵌るワナ)。
多くの Round() 関数の挙動もこの IEEE 754 に則った「偶数...
*VistaでのVB6対応 [#w23ef853]
-Vista でもVB6ランタイムは、提供される。
-また、IDEも動作させることができる(ようにする)。
-ただし、MSDEは未サポート。
-そのため、MSDEで実行しているアプリケーションは、SQL Serv...
*VBからVB.NETへの移行 [#c7a7db2b]
-[[VB6業務アプリはいつまで使えるの?:http://www.atmarkit....
-[[Upgrading Visual Basic 6.0 Applications to Visual Basi...
-[[VB6->VB.NETへの移行にかかる工数の見積もりツール:http:/...
*特殊なディレクトリの取得 [#v0e21937]
-My Documents やデスクトップなど、特殊フォルダの物理的フ...
-Windows2000 などでは、ユーザー毎にシステムフォルダのパス...
-勝手に "C:\My Documents" などと決めず、この関数を用いて...
-なお、Windows フォルダや System フォルダを取得したい場合...
-標準モジュールに記述します。
Option Explicit
OS が管理する特殊フォルダのItemIDListのポインタを取得する
Private Declare Function SHGetSpecialFolderLocation Lib ...
(ByVal hwndOwner As Long, ByVal nFolder As Long, ppidl A...
ItemIDList のポインタからフォルダの名前を取得する
Private Declare Function SHGetPathFromIDList Lib "Shell3...
(ByVal pidl As Long, ByVal pszPath As String) As Long
タスクメモリブロックを解放する
Private Declare Sub CoTaskMemFree Lib "Ole32" (ByVal pv ...
ID の値
Public Enum IDL_LIST
CSIDL_DESKTOP = &H0 '\デスクトッ...
CSIDL_PROGRAMS = &H2 '\プログラム...
CSIDL_PERSONAL = &H5 '\My Doucutents
CSIDL_FAVORITES = &H6 '\お気に入り
CSIDL_STARTUP = &H7 '\スタートア...
CSIDL_RECENT = &H8 '\最近使った...
CSIDL_SENDTO = &H9 '\送る
CSIDL_STARTMENU = &HB '\スタートメ...
CSIDL_DESKTOPDIRECTORY = &H10 '\デスクトッ...
CSIDL_NETHOOD = &H13 '\NetHood
CSIDL_FONTS = &H14 '\フォント
CSIDL_TEMPLATES = &H15 '\テンプレート
CSIDL_COMMON_STARTMENU = &H16 '\All User ス...
CSIDL_COMMON_PROGRAMS = &H17 '\All User プ...
CSIDL_COMMON_STARTUP = &H18 '\All User ス...
CSIDL_COMMON_DESKTOPDIRECTORY = &H19 '\All User デ...
CSIDL_APPDATA = &H1A '\アプリ定義...
CSIDL_PRINTHOOD = &H1B '\プリンタリ...
CSIDL_COMMON_FAVORITES = &H1F '\All User お...
CSIDL_INTERNET_CACHE = &H20 '\IEのキャッ...
CSIDL_COOKIES = &H21 '\クッキー用...
CSIDL_HISTORY = &H22 '\IEの履歴
CSIDL_INTERNET = &H1 'Virtual fold...
CSIDL_CONTROLS = &H3 'Virtual fold...
CSIDL_PRINTERS = &H4 'Virtual fold...
CSIDL_BITBUCKET = &HA 'Virtual fold...
CSIDL_DRIVES = &H11 'My Computer ...
'storage devi...
'The folder m...
CSIDL_NETWORK = &H12 'Network Neig...
'the root of ...
CSIDL_ALTSTARTUP = &H1D 'File system ...
CSIDL_COMMON_ALTSTARTUP = &H1E 'File system ...
'for all use...
End Enum
Private Const MAX_PATH = 260
Public Function GetSPFolderPath(ItemID As IDL_LIST) As S...
'機能
' 特殊フォルダのフルパスを取得します
'引数
' ItemID : 特殊フォルダを表す ID (インテリセンスが機...
'戻り値
' 特殊フォルダのフルパス名(文字列)
Dim lngRet As Long 'API からの戻り値
Dim pidlFolder As Long 'ItemIDList のポインタ ( pidl )
Dim strBuf As String '文字列を受け取るバッファ
'pidl 取得
lngRet = SHGetSpecialFolderLocation(0, ItemID, pidlFo...
If lngRet >= 0 Then
'文字列のバッファ確保
strBuf = String$(MAX_PATH, vbNullChar)
'pidl からフルパス取得
If SHGetPathFromIDList(pidlFolder, strBuf) <> 0 T...
'余った部分の不要なヌル文字を除去
strBuf = Left$(strBuf, InStr(strBuf, vbNullCh...
Else
'取得に失敗した場合は空文字を返す
strBuf = ""
End If
'後始末
CoTaskMemFree pidlFolder
GetSPFolderPath = strBuf
End If
End Function
-実行例:
--イミディエイトウィンドウでの実行例です。
?GetSPFolderPath(CSIDL_PERSONAL)
C:\Documents and Settings\lionel\My Documents
*Format関数で西暦→和暦に変換するには [#rf350a2f]
-Format("20060101", "GGGEE") のようにする
*Format関数の日付/時刻表示書式指定文字 [#vbbcbadb]
|記号|意味|h
|(:)|時刻の区切り記号です。オペレーティング システムの国...
|(/)|日付の区切り記号です。オペレーティング システムの国...
|c|ddddd および t t t t t の書式で表した日付と時刻を、日...
|d|日付を返します。1 桁の場合、先頭に 0 が付きません (1 ...
|dd|日付を返します。1 桁の場合、先頭に 0 が付きます (01 ...
|ddd|曜日を英語 (省略形) で返します (Sun 〜 Sat)。 |
|aaa|曜日を日本語 (省略形) で返します (日〜土)。 |
|dddd|曜日を英語で返します (Sunday 〜 Saturday)。 |
|aaaa|曜日を日本語で返します (日曜日〜土曜日)。 |
|ddddd|年、月、日を含む短い形式 (コントロール パネルで設...
|dddddd|年、月、日を含む長い形式 (コントロール パネルで設...
|w|曜日を表す数値を返します (日曜日が 1、土曜日が 7 とな...
|ww|その日が一年のうちで何週目に当たるかを表す数値を返し...
|m|月を表す数値を返します。1 桁の場合、先頭に 0 が付きま...
|mm|月を表す数値を返します。1 桁の場合、先頭に 0 が付きま...
|mmm|月の名前を英語 (省略形) の文字列に変換して返します (...
|mmmm|月の名前を英語で返します (January 〜 December)。 |
|oooo|月の名前を日本語で返します (1 月 〜 12 月)。 |
|q|1 年のうちで何番目の四半期に当たるかを表す数値を返しま...
|g|年号の頭文字を返します (M、T、S、H)。 |
|gg|年号の先頭の 1 文字を漢字で返します (明、大、昭、平)...
|ggg|年号を返します (明治、大正、昭和、平成)。 |
|e|年号に基づく和暦の年を返します。1 桁の場合、先頭に 0 ...
|ee|年号に基づく和暦の年を 2 桁の数値を使って返します。1 ...
|y|1 年のうちで何日目に当たるかを数値で返します (1 〜 366...
|yy|西暦の年を下 2 桁の数値で返します (00 〜 99)。 |
|yyyy|西暦の年を 4 桁の数値で返します (100 〜 9999)。 |
|h|時間を返します。1 桁の場合、先頭に 0 が付きません (0 ...
|hh|時間を返します。1 桁の場合、先頭に 0 が付きます (00 ...
|n|分を返します。1 桁の場合、先頭に 0 が付きません (0 〜 ...
|nn|分を返します。1 桁の場合、先頭に 0 が付きます (00 〜 ...
|s|秒を返します。1 桁の場合、先頭に 0 が付きません (0 〜 ...
|ss|秒を返します。1 桁の場合、先頭に 0 が付きます (00 〜 ...
|t|t t t t コントロール パネルで設定されている形式で時刻...
|AM/PM|時刻が正午以前の場合は大文字で AM を返し、正午〜午...
|am/pm|時刻が正午以前の場合は小文字で am を返し、正午〜午...
|A/P|時刻が正午以前の場合は大文字で A を返し、正午〜午後 ...
|a/p|時刻が正午以前の場合は小文字で a を返し、正午〜午後 ...
|AMPM|"12 時間制" が選択されていて、時刻が正午以前の場合...
*VBでの構造体の書き方 [#k78a39ef]
-最近VB使ってないので意外と忘れてしまうためメモ
Public Type Character
Name As String
Hp As Byte
Mp As Byte
Level As Byte
Exp As Byte
Gold As Byte
End Type
*VBでフォームの表示とクローズ [#u63506ef]
-しばらく使ってないとこんな基本も忘れてしまう…
-表示は
Dim f As New XxxForm
f.Show(vbModal)
-Closeは
Call Unload(Me)
Callをつけないと引数が値渡しとみなされてエラーになるので...
*VBの割り算での注意点 [#r451b29e]
-VBでは割り算の演算子は / と \ の2種類ある。/の場合、Int...
-ExcelのVBAでの検証プログラム↓これだとa=128以後はbの値が...
Sub test()
Dim a As Integer
Dim b As Integer
For a = 1 To 256
b = a / 256
ActiveSheet.Cells(a, 1) = b
ActiveSheet.Cells(a, 1).Select
DoEvents
Next
End Sub
-参考:http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?...
*VBで基数変換 [#y7a0918a]
-http://oshiete.goo.ne.jp/qa/872647.html
10進->16進
strTMP$ = Hex(intTMP$)
16進->10進
intTMP$= Val("&H" & "16進文字列")
*VBで正規表現 [#ve02bdf8]
-[[Microsoft Visual Basic 6.0 で正規表現を使用する方法>ht...
[プロジェクト] メニューの [参照設定] をクリックします。
[Microsoft VBScript Regular Expressions 5.5] をダブルク...
ツールボックスの [CommandButton] をダブルクリックします。
デフォルトで Command1 がフォームに追加されます。
[Command1] をダブルクリックして、コード ウィンドウを開き...
次のコードを Command1_Click イベント ハンドラに貼り付け...
MsgBox(TestRegExp("is.", "IS1 is2 IS3 is4"))
注 : この例では、「is.」というパターンが「IS1 is2 IS3 is...
かどうかが判定されます。特殊文字の ピリオド (.) はワイル...
使用できるため、任意の 1 文字と一致し、検索パターンと一...
ピリオド (.) を 2 つ検索パターンに追加した場合は、任意の...
ピリオド (.) を使用しない場合は、 検索パターンのみが表示...
次の関数を Command1_Click イベン ト ハンドラの後に追加し...
Function TestRegExp(myPattern As String, myString As Str...
'Create objects.
Dim objRegExp As RegExp
Dim objMatch As Match
Dim colMatches As MatchCollection
Dim RetStr As String
' Create a regular expression object.
Set objRegExp = New RegExp
'Set the pattern by using the Pattern property.
objRegExp.Pattern = myPattern
' Set Case Insensitivity.
objRegExp.IgnoreCase = True
'Set global applicability.
objRegExp.Global = True
'Test whether the String can be compared.
If (objRegExp.Test(myString) = True) Then
'Get the matches.
Set colMatches = objRegExp.Execute(myString) ' Exe...
For Each objMatch In colMatches ' Iterate Matches ...
RetStr = RetStr & "Match found at position "
RetStr = RetStr & objMatch.FirstIndex & ". Match V...
RetStr = RetStr & objMatch.Value & "'." & vbCrLf
Next
Else
RetStr = "String Matching Failed"
End If
TestRegExp = RetStr
End Function
[実行] メニューの [開始] をクリックして、アプリケーショ...
[Command1] をクリックします。
ページ名: