ExcelVBA

ExcelVBAのユーザーフォームでフォームの閉じ方

ダイアログを後でも出したり、情報を取得する用事があるならMe.Hide もう用事なしならUnload Me ネタ元 http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_080.html

ExcelVBAで存在するIEオブジェクトを探して根こそぎQuitする

Public Sub ie_quit() Dim objShell Dim objWindow Set objShell = CreateObject("Shell.Application") For Each objWindow In objShell.Windows If TypeName(objWindow.Document) = "HTMLDocument" Then objWindow.Quit Sleep 100 End If Next Set objShell…

ExcelVBA・マクロを簡単に高速化する方法

VBA・マクロの先頭付近に次の3行を追加する : Application.ScreenUpdating = False Application.EnableEvents = False Application.Calculation = xlCalculationManualVBA・マクロの最後付近に次の3行を追加する : Application.ScreenUpdating = T…

Excelマクロ実行中にキーボード/マウスを受け付けなくする

Application.Interactive = False ネタ元 http://msdn.microsoft.com/ja-jp/library/office/ff841248%28v=office.15%29.aspx

ExcelVBAでファイル削除

Kill(pathname)ネタ元 http://www.openreference.org/articles/view/340

Excel:VBA:UTF-8/LFのファイルを読み込む

ADODB.Stream を使います。 Sub loadLogFile2(ByRef fileName As Variant) Dim rowNo As Integer Dim readString As String Dim st As Object Set st = CreateObject("ADODB.Stream") 'ADODB.Stream生成 st.Type = 2 'オブジェクトに保存するデータの種類を…

ExcelVBAでコントロールキーを押されているかチェック

#If Win64 Then Private Declare PtrSafe Function GetAsyncKeyState Lib "user32.dll" (ByVal vKey As Long) As Long #Else Private Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal vKey As Long) As Long #End If ... If 0 <> GetAsyncKeySta…

定番のVBA関数でコンパイルエラーが出たときの対処法

参照不可のライブラリができてる可能性アリ。チェックしてみよう ネタ元 http://www.moug.net/tech/exvba/0150128.html

excelvbaで文字列をクリップボードにコピーしてから貼り付ける

DoEventsないと コケることある Dim buf As String, buf2 As String, CB As New DataObject buf = "tanaka" With CB .SetText buf ''変数のデータをDataObjectに格納する DoEvents .PutInClipboard ''DataObjectのデータをクリップボードに格納する DoEvents…

ExcelVBA アドインの関数を呼ぶ方法

Workbooks("アドインファイル名").Application.Run ("モジュールやシート名.関数やプロシジャ名") ネタ元 http://www.happy2-island.com/excelsmile/smile03/capter00712.shtml

Excelの参照設定で特定の項目をデフォルト環境オンにする方法

アドインとsite保存したモジュールでVBProject.References.AddFromGuidすればいいらしいが、Excelマクロのセキュリティで「VBAProjectプロジェクトへのアクセスを信頼する」をONにしないとエラーになる。自分で使う分にはいいが一般に広めるのに使うのは辛い…

ExcelVBAにてファイル保存ダイアログを使ってcsv/xlsで保存させる

拡張子をみて保存形式を切り替えてくれる Dim vntFileName As Variant 'ファイルを保存するダイアログを開きます vntFileName = _ Application.GetSaveAsFilename( _ InitialFileName:=ThisWorkbook.Name _ , FileFilter:="エクセルファイル(*.xls),*.xls" &…

ExcelVBAでIE操作 キャッシュ無効でNavigate

Flagsに4を指定 Const navNoReadFromCache = 4 ... objIE.Navigate "https://www.yahoo.co.jp", navNoReadFromCache なぜ4なのかはここの定義参照 typedef enum BrowserNavConstants { navOpenInNewWindow = 0x1, navNoHistory = 0x2, navNoReadFromCache = …

ExcelVBAで動いているExcelが32bitか64bitか判断する

#ifで Function GetExcelProcessBit() As String #If Win64 Then GetExcelProcessBit = "64" #Else GetExcelProcessBit = "32" #End If End Function

ExcelVBAで動いているWindowsが32bitか64bitか判断する

Function GetProcessBit() As String Dim colItems As Object Dim itm As Object Set colItems = CreateObject("WbemScripting.SWbemLocator").ConnectServer.ExecQuery("Select * From Win32_OperatingSystem") GetOSProcessBit = "32" For Each itm In col…

ExcelVBAでHTMLタグを外す

正規表現を使って簡単に Private Function cdataConv(str As String) As String Dim regEx As New RegExp regEx.Pattern = "<[^>]*>" regEx.Global = True cdataConv = regEx.Replace(str, "") End Function ネタ元 http://news.mynavi.jp/articles/2012/04/…

ExcelVBAのにはMAXが無いのでApplication.WorksheetFunction.Max()を使う

数式に使うMAXとMINのような関数が 当然、VBAの関数にもあると思っていました。 しかし実際にはありません。 最大と最小をVBAで求めるには、 ワークシート関数を使います。 ワークシート関数とは 数式に使うMAXとMINのような関数です。 すべてのワークシート…

ワークブックのカレントパスを知りたければActiveWorkbook.path

CurDir()だと、イマイチ思ったドライブのフォルダが取れないネタ元 http://stackoverflow.com/questions/19824164/how-to-get-current-working-directory-using-vba

VBAでIE操作 縦幅横幅指定

Height / Width というプロパティがあるので指定。 Dim IE As InternetExplorer Set IE = CreateObject("InternetExplorer.Application") With IE .Visible = True .Top = 200 .Left = 100 .Height = 400 .Width = 1000 .Resizable = False End Withネタ元 h…

セルの中の数字の部分だけを抽出

標準のVALUE()だと数字以外の文字が入っているとエラーになっちゃう。 オリジナルマクロにするのが楽みたい 'オリジナルValue() '最初の数字部分を返す '整数でいいなら As Integer でいいよ Function convValue(aArg) As Double Dim objRE As Object Dim st…

フォームのsubmitじゃなくて、画のボタンをクリックする

IMGタグ探してsrcが一定条件のもの見つけてClick Dim objImage For Each objImage In objIE.Document.getElementsByTagName("IMG") If InStr(objImage.src, "/pc/images/gm_home.gif") > 0 Then objImage.Click Exit For End If Next

エクセルシート内の全画像を削除

' シート内の全画像を削除 Sheets("シートA").Activate Dim pic For Each pic In ActiveSheet.Pictures pic.Delete Next

VBAでスクリーンキャプチャ(画面キャプチャ) API使ってファイルに保存版

鮮やかにキャプチャするモジュールが公開されていた。多謝!なくなると困るのでコピペ '****************************************************************************** '* 【参考元】 '* Microsoft Support '* 画面、フォーム、ウィンドウを取り込んで印…

IEの拡大率指定

.ExecWBメソッドで指定。.ExecWB メソッド では いろいろなコマンドを発行できるみたい。 Sub test2() Const OLECMDID_OPTICAL_ZOOM = 63 Const OLECMDEXECOPT_DODEFAULT = 0 Dim ObjIE As Object Dim ZoomRate As Variant ZoomRate = 70 '拡大率 Set ObjIE …

Excel VBAでIEを操作 最小化と最大化

ShowWindowを使う Dim ObjIE As Object '変数を定義 'Sleepを使用する場合のお約束 Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'ShowWindowを使用する場合のお約束 Declare Function ShowWindow Lib "user32" (ByVal hwindow As Long…

VBAでスクリーンキャプチャ(画面キャプチャ) keybd_event版

keybd_eventというAPIを利用。ただOSからのイベントになるようなので、マクロが動いてる最中だとキーイベントが通らなくてキャプチャ失敗ということがよくある。DoEventsやSleepでごまかしながらやってみる必要あり。 Private Declare Sub keybd_event Lib "…

IE操作。特定文字のあるaタグをクリック

[ExcelVBA]InnerTEXTでaタグの内側のテキストをとれる On Error Resume Next Dim i For i = 0 To 9 If InStr(objIE_livestar.Document.Links(i).InnerTEXT, "項目3") <> 0 Then objIE.Document.Links(i).Click IE_Complete objIE '表示終わるまで待つ処理(オ…

IEのバージョンを調べる

[excelVBA] Dim IEA As Object Dim FSO As Object Set IEA = CreateObject("InternetExplorer.Application") Set FSO = CreateObject("Scripting.FileSystemObject") MsgBox "IEのバージョンは" & FSO.GetFileVersion(IEA.FullName) & "です。" Set FSO = No…

C#で作成したDLLをExcelVBAで利用するにはregsvr32じゃなくてRegAsm.exeを使う

.NET で作成した COM 対応コンポーネントのレジストリ登録には regasm.exe を利用する。 regasm.exe /codebase XXX.DLL regasm.exeにはパスが通ってないので、 C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exeとかで。ちなみにcodebaseというのは…

Excelのバージョン値

[excelvba]Excel Version Excel Versionプロパティの戻り値 Excel 2013 15.0 Excel 2010 14.0 Excel 2007 12.0 Excel 2003 11.0 Excel 2002 10.0 Excel 2000 9.0 Excel 97 8.0 Excel 95 7.0 Excel 5.0 5.0 ネタ元 http://unsolublesugar.com/20130120/144522/

HTMLソースをダウンロードする

[excelVBA] XMLHTTPオブジェクトで簡単に習得できる Sub Sample() Dim Http, buf As String Set Http = CreateObject("MSXML2.XMLHTTP") Http.Open "GET", "http://www.officetanaka.net/other/index.htm", False Http.Send buf = StrConv(Http.ResponseBody…

Excelのバージョン

[excelvba]VBAでこうやってExcelのバージョンがとれます。 Sub Sample1() MsgBox Application.Version End Sub Versionプロパティは、次の文字列を返します。 Excel 2010 → 14.0 Excel 2007 → 12.0 Excel 2003 → 11.0 Excel 2002 → 10.0 Excel 2000 → 9.0 Ex…

IEの状態いろいろ

[excelvba] 初期化未完了状態(READYSTATE_UNINITIALIZED) objIE.Document.ReadyState = "uninitialized" ロード中状態(READYSTATE_LOADING) objIE.Document.ReadyState = "loading" ロード完了状態(READYSTATE_LOADED) objIE.Document.ReadyState = "loaded"…

IEの再読み込み(リフレッシュ)をするにはRefresh()

[excelvba] objIE.Refresh ブラウザの状態によっては失敗するので、On Error resume Next しとくといいです。ネタ元 http://web-easy-skill.blogspot.jp/2012/02/vbsurlnavigate-dim-objie-set-objie.html

ExcelVBAで、チェックボックスにチェックした状態を保存する方法

[excelvba] コントロールツールボックスを使った場合は、チェックボックスのプロパティウィンドを表示し、その中の「Linked Cell」欄にセル($C$2 など)を入力。 フォームの中のチェックボックスの場合、プロパティのControlSource欄にセル($C$2 など)を入…

セルの数式エラーを判定するには IsError()

[excelvba] エラーのあるセルの内容にアクセスしようとするとマクロ止まっちゃうので、ちゃんと分岐する必要あり。 If IsError(ActiveCell.Value) Then MsgBox "エラーです" Else MsgBox "正常です" End If ネタ元 http://www.moug.net/tech/exvba/0100047.h…

ファイル書き出しでWriteを使うと文字列でダブルクォーテーションがついちゃう。Printならつかない

[excelvba]Writeステートメントは出力する際にダブルクォーテーションで文字を囲みます。そうしないと正常に出力されません。エクセルのセルを出力する際も勝手にダブルクォーテーションで囲まれて出力されます。Printの場合はそのまま出力されるためダブル…

ワークシートの最終行、最終列を取得するのはけっこう難しい!

UsedRangeだけではNGなケースも。 <S6> 書式付きセルを除外する (UsedRange) With ActiveSheet.UsedRange MaxRow = .Find("*", , xlFormulas, , xlByRows, xlPrevious).Row MaxCol = .Find("*", , xlFormulas, , xlByColumns, xlPrevious).Column End With ネ</s6>…

シートの切り替えができないようにするには「シート見出しを非表示」が有効

強引に切り替えできなくするよりタブの非表示が楽 ActiveWindow.DisplayWorkbookTabs = False ネタ元 http://okwave.jp/qa/q2211213.html

時間を使って判定する

例:日本市場の立会時間 IsJikandesuyo = False If 9 <= Hour(Now) And Hour(Now) <= 15 Then If 11 = Hour(Now) Then If Minute(Now) <= 30 Then IsJikandesuyo = True End If ElseIf 12 = Hour(Now) Then If 30 <= Minute(Now) Then IsJikandesuyo = True …

ユーザーフォームを使ってvbOKやvbCancel処理する

フォームのコード Private Sub CommandButton_No_Click() UserForm1.Tag = vbCancel UserForm1.Hide End Sub Private Sub CommandButton_Yes_Click() UserForm1.Tag = vbOK UserForm1.Hide End Sub Private Sub UserForm_Initialize() UserForm1.Tag = vbCan…

シート内から配列にある文字がある場所を探す。だけど2つ以上見つかったらエラー

ただ探すだけならFind()を使ったほうがいいけれど、複数のパターンを同一視し、2個以上あるか調べるという処理のときはループで回したほうが楽。 '見つからなかったらNothingで返す 'シート内に複数同じ項目があったらエラー。Cells(65536, 256)で返す '大…

Excel VBAで列のアルファベットと番号を変換する関数

A=1 M=13 みたいな '番号から列アルファベットを取得する ' '引数 aNumber 数字 '戻り値 対応する番号、失敗時は"" Public Function ConvertNumberToAlphabet(ByVal aNumber As String) As String If Not IsNumeric(aNumber) Then ConvertNumberToAlphabet =…

すべて検索する

Findを使ったらFindNextで次々と検索できる。以前見つかったセルと同じセルが見つかったりしないかだけはチェック必要。 Sub Sample6() Dim FoundCell As Range, FirstCell As Range, Target As Range Set FoundCell = Cells.Find(What:="田中") If FoundCel…

IE操作:キャッシュを消す

たまにキャッシュが残ってるおかげで処理がおかしくなることがあるのを防ぐ 'DeleteUrlCacheEntryを使用する場合のお約束 Declare Function DeleteUrlCacheEntry Lib "wininet" _ Alias "DeleteUrlCacheEntryA" (ByVal lpszUrlName As String) As Long ・・…

Rangeから選択されているセルのアドレス・行・列番号 を調べる

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) StartRow = Target.Cells(1).Row StartColumn = Target.Cells(1).Column Max_Row = Target.Cells(Target.Count).Row Max_Column = Target.Cells(Target.Count).Column End Sub…

Excelが認知している最終行(列)を取得する

Option Explicit Sub TEST14() ' 最終セルを表示 MsgBox ActiveSheet.Cells.SpecialCells(xlLastCell).Address End Subネタ元 http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_030_100.html

インデックス指定でセルの選択

単一のセルB3を選択します。 Sub rei806() Worksheets("Sheet1").Activate Cells(3, 2).Select End Sub セル範囲A1:B3を選択します。 Sub rei807() Worksheets("Sheet1").Activate Range(Cells(1, 1), Cells(3, 2)).Select End Subネタ元 http://www.eurus.d…

選択されているセルのアドレス・行・列番号 を調べる

StartRow = LoopArea.Cells(1).Row StartColumn = LoopArea.Cells(1).Column Max_Row = LoopArea.Cells(LoopArea.Count).Row Max_Column = LoopArea.Cells(LoopArea.Count).Columnネタ元 http://www.k1simplify.com/vba/tipsleaf/leaf240.html

ThisWorkbook/ThisCellみたいな ThisSheetというのは無いので、ThisCell.Worksheet.Name を使う

マクロ実行しているシート名を知りたかったんだけど、どこにも情報なくて困った