
Game Changer & Make Some Noise
hello vonnie
Game of Thrones Daily
EXPECTATIONS

Jar Jar Binks Fan Club
sheepfilms
art blog(derogatory)

blake kathryn
KIROKAZE
he wasn't even looking at me and he found me

Product Placement
Keni

izzy's playlists!
h
🪼

PR's Tumblrdome
occasionally subtle
Monterey Bay Aquarium

Love Begins
★

seen from United States
seen from United States

seen from Dominican Republic

seen from United States
seen from United States

seen from United Kingdom
seen from United States
seen from United States
seen from United Arab Emirates
seen from United Kingdom

seen from United States
seen from United States
seen from Russia
seen from United States

seen from United Kingdom
seen from United States
seen from Bangladesh
seen from Singapore

seen from Poland
seen from United States
@vba-memo-blog
【ExcelVBA】Word/パワポ/Visio/PDFの総ページ数を取得するマクロ
*Word
Private Function get_page_cnt_word(sFile As String, sPath As String) As Long 'ページ数の取得を行う関数(Word) '引数:処理対象のファイル名、処理対象ファイルの格納フォルダ
Dim wdApp As Object Dim wdDoc As Object Dim lCount As Long
Set wdApp = CreateObject("Word.Application")
'ファイルオープン Set wdDoc = wdApp.Documents.Open(sPath & "\" & sFile) 'ページ数取得 lCount = wdDoc.ComputeStatistics(Statistic:=wdStatisticPages, IncludeFootnotesAndEndnotes:=True)
'WORDを閉じる wdDoc.Close wdApp.Application.Quit
'ページ数表示 get_page_cnt_word = lCount
'オブジェクト変数を解放 Set wdDoc = Nothing Set wdApp = Nothing
End Function
*Power Point
Private Function get_page_cnt_ppt(sFile As String, sPath As String) As Long 'ページ数の取得を行う関数(パワポ) '引数:処理対象のファイル名、処理対象ファイルの格納フォルダ
Dim pp As Object Dim lCount As Long
Set pp = CreateObject("PowerPoint.application")
With pp .Presentations.Open sPath & "\" & sFile, ReadOnly:=True lCount = .activepresentation.slides.Count .Presentations(sFile).Close .Quit End With
Set pp = Nothing get_page_cnt_ppt = lCount
End Function
*Visio
Private Function get_page_cnt_vsd(sFile As String, sPath As String) As Long 'ページ数の取得を行う関数(visio) '引数:処理対象のファイル名、処理対象ファイルの格納フォルダ Dim visio As Object Dim lCount As Long
Set visio = CreateObject("Visio.Application")
With visio .Documents.Open sPath & "\" & sFile lCount = .ActiveDocument.Pages.Count .Documents(sFile).Close .Quit End With
Set visio = Nothing get_page_cnt_vsd = lCount
End Function
原因① Dir関数がファイルへのアクセスを保持してしまう場合 いくつかtxtファイルが抽出された場合、 なんらかのハンドルがつかまれてしまうようで 参照しなかったファイルにロックがかかってしまいます。 これを防ぐには ループを抜けたあとに Dir (vbNullString) を呼び出してやることで解放が行えるようです。 TakyuLog/Dir関数での解放 ようするにこういうこと Dir (vbNullString) ' RmDir を呼び出す前にこいつを実施 RmDir DirectoryPath
tsvファイルを開くとき、セルの書式を「文字列」で読み込む方法
Dim vTmpInfo(256) As Variant Dim i As Integer For i = 0 To 256 vTmpInfo(i) = Array(i, 2)※ Next Workbooks.OpenText filename:=sFilePath, _ Origin:=932, DataType:=xlDelimited, TextQualifier:= _ xlDoubleQuote, Tab:=True, _ FieldInfo:=vTmpInfo, TrailingMinusNumbers:=True ※FieldInfoは読み込むときのデータの形式を指定するパラメーター。 (行番号,データ形式)で指定する。
データ形式はこんな感じ。 xlTextFormat 2 テキスト形式 xlGeneralFormat 1 一般形式 xlYMDFormat 5 YMD 日付形式
Findメソッドが失敗したときの対応
◇注意点 Findメソッドの結果を受ける変数は、Range型またはVariant型で宣言する
結果を変数に格納するときはsetが必要となる
Findメソッドで、指定した値が見つからなかったときはNothingを返す。
◇例 Dim rFind as range
set rFind as .range([範囲指定]).find("ほげほげ")
if rFind is nothing then '見つからなかったときの処理 else '見つかったときの処理 end if
動的配列
dim hoge() '最初に配列の数を指定しないで宣言
i = function_hogehoge() '配列の数が決まったら
Redim hoge(i) '再宣言して配列の数を決める
Autofilter解決
http://vba-memo.tumblr.com/post/52695337151/autofilter
なんてこたあない
Operator:=xlFilterValues
のつけ忘れ
これでおk xxx.AutoFilter Field:=指定のカラム, _ Criteria1:=Split(hoge, ","), Operator:=xlFilterValues
AutoFilterの絞込みで悩んだ
◇バリアント型の変数いくつか値が入っていて、その値をautoFilterの絞り込み条件としたい場合どうやって設定するか (条件の数は場合によって変わる)
たとえば。。。
条件が入ってる変数:hoge hogeの中身:"ああ,いい,うう"←これ全てを絞り込み条件として使いたい
◇ダメだった例その1 xxx.autoFilter Field:=xxx,Criteria1:=Array(hoge) ⇒"ああ,いい,うう"が一塊の絞り込み条件として設定される
◇ダメだった例その2 xxx.autoFilter Field:=xxx,Criteria1:=Split(hoge, ",") ⇒最後の"うう"だけが絞込み条件として設定される
◇ダメだった例その3 xxx.autoFilter Field:=xxx,Criteria1:=hoge ⇒"ああ,いい,うう"が一塊の絞り込み条件として設定される
解決した http://vba-memo.tumblr.com/post/52696506434/autofilter
配列の添え字の数を返す関数
UBound:配列の添え字の最大数を返す LBound:配列の添え字の最小数を返す
参考: http://msdn.microsoft.com/ja-jp/library/cc437658(v=vs.71).aspx
バリアント型を配列として扱うときに使える
Split関数で文字列を区切る
◇Spilit関数 spilit(元の文字列,区切り文字)
◇Spilit関数の戻り値は配列。 通常は、バリアント型で受ける。
◇使用例 dim moji as variant
moji = spilit("あああ,いいい,ううう",",")
罫線の線の種類
.range(cell).border1.LineStyle = 定数
として設定する
定数 罫線の種類 xlContinuous 実線(細) xlDash 破線 xlDashDot 一点鎖線 xlDashDotDot 二点鎖線 xlDot 点線 xlDouble 二重線 xlSlantDashDot 斜め斜線 xlLineStyleNone 無し
ユーザ型でセル位置を保存する入れ物を作っておくと便利
たとえばこんな感じに
type CellsData iRow as integer icol as integer end type
fsoを使うときの準備
Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject")
指定のブックに含まれるシート一覧を出力
Sub makecelllist()
Dim sh As Object Dim row_num As Long Dim col_num As Long Dim wb As Workbook Dim ws As Worksheet
Workbooks.Open filepath
Set wb = Workbooks("filename.xls") Set ws = ThisWorkbook.Sheets("sheetname") row_num = 1 col_num = 1
For Each sh In wb.Sheets ws.Cells(row_num, col_num).Value = sh.Name 'valueはつけなくても大丈夫 row_num = row_num + 1 Next sh
End Sub
マクロの実行速度が速くなるおまじない
マクロ開始時に指定する
Application.ScreenUpdating = False '画面更新をしない Application.Calculation = xlManual '自動計算をしない
マクロ終了前に元に戻すこと
Application.ScreenUpdating = True '画面更新をする Application.Calculation = xlAutomatic '自動計算をする
workbook.save と workbook.saveAs の違い
save:上書き保存 saveAs:オプションを指定して保存(名前、パスワードの有無、ファイル形式など)
saveas filename:= xxxx.xls ↑保存するときにディレクトリを指定しないとカレントディレクトリに保存される
for と for eachを考える
セルを一個一個確認しながらループをまわすより、For Each Inを使ったほうが良い場合もある?
for i = 0 to END xxx = .cells(i,j) next i
↑これだと終了条件を指定しなければいけないけど
for each i in range xxx = i next i
↑これなら前もって特定の範囲をrangeに入れておけば、終了条件はいらない (rangeの中身が終わればおしまい)