VBA:パワポ: 一括テキスト処理

対象は図形、表の2つ。
一括でフォント統一、文字置換、図形余白を設定。

Sub 図形調整()
	cnt = 0
	For Each sld In ActivePresentation.Slides
		For Each shp In sld.Shapes
			If shp.HasTextFrame Then
				cnt = cnt + 1
				shp.TextFrame.TextRange.Font.Name = "Meiryo UI"
				shp.TextFrame.TextRange.Font.NameFarEast = "Meiryo UI"
				shp.TextFrame.TextRange.Text = Replace(shp.TextFrame.TextRange.Text, ":", ":")
				shp.TextFrame.TextRange.Text = Replace(shp.TextFrame.TextRange.Text, "(", "(")
				shp.TextFrame.TextRange.Text = Replace(shp.TextFrame.TextRange.Text, ")", ")")
				' 0.5 = 0.02 cm / 1 = 0.04 cm
				shp.TextFrame.MarginLeft = 1
				shp.TextFrame.MarginRight = 1
				shp.TextFrame.MarginTop = 1
				shp.TextFrame.MarginBottom = 1
			End If
		Next shp
	Next sld
	MsgBox "Done: " & cnt
End Sub

Sub TextBox調整()
	cnt = 0
	For Each sld In ActivePresentation.Slides
		For Each shp In sld.Shapes
			If shp.HasTable Then
				With shp.Table
				For i = 1 To .Columns.Count
					For j = 1 To .Rows.Count
						.Cell(j, i).Shape.TextFrame.TextRange.Font.Name = "Meiryo UI"
						.Cell(j, i).Shape.TextFrame.TextRange.Font.NameFarEast = "Meiryo UI"
						' 0.5 = 0.02 cm / 1 = 0.04 cm
						.Cell(j, i).Shape.TextFrame.MarginLeft = 4
						.Cell(j, i).Shape.TextFrame.MarginRight = 4
						.Cell(j, i).Shape.TextFrame.MarginTop = 1
						.Cell(j, i).Shape.TextFrame.MarginBottom = 1
					Next j
				Next i
				End With
			End If
		Next shp
	Next sld
	MsgBox "Done: " & cnt
End Sub

EXCEL: 一括シート名の取得

シート数が複数かつ、全てのシート名を取得したい場合、下記のマクロをイミディエイト画面にペースト&エンターすればOk

for i=1 to ActiveWorkbook.Sheets.Count:debug.Print Sheets(i).name:next

Excel: LENB(半角長さ)が機能しない場合の回避

自分のPC環境ではLENBが機能しない。
Excel環境(言語)設定が要因だと思うが、この為だけに変更したくない。
毎回プログラムを作るのも面倒。そこで1行だけのマクロを準備。
VBA(ALT+F11)起動後、イミディエイト画面(CTRL+G)を開いて下記をコピペ。
縦の開始、終了行をセット、結果をセットする列番号、対象の列の列名をセットして実行。

マクロなので取消が出来ないため、必ずファイル保存をしてから実行すること。
※何度か苦い思い出があるため、ここ重要!!

for i=2 to 10:cells(i,Range(“b1”).Column)=LenB(StrConv(cells(i,Range(“a1”).Column), vbFromUnicode)):next

Excel2016の初期フォントを変更

エクセルの初期フォントを変更したい場合、変更したBookを
下記の名前(テンプレート形式)で、下記の2つのフォルダにコピーする。

Book.xltx
C:\Users\XXXXX\AppData\Roaming\Microsoft\Excel\XLSTART
C:\Users\XXXXX\Documents\Office のカスタム テンプレート

上のフォルダの違いは、Excel起動時にテンプレート選択を有効にしているか否か。

メモ:
游ゴシック
游ゴシック Light

VBA:MS-Access(DAO)テンプレート

ExcelからMS-Accessのデータを簡易取り出し。

dbPath = "xxx.accdb"
Set dbe = CreateObject("DAO.DBEngine.120")
Set Db = dbe.Workspaces(0).OpenDatabase(dbPath, False)

Sql = "select x from xxxx where xx ="x"
Set dbRes = Db.OpenRecordset(Sql)
wkCMT = dbRes("x").Value

dbRes.Close
Db.Close
Set Db = Nothing
Set dbe = Nothing

 

VBA: WEBページ(HTML)をローカルに保存

指定のURLから生成されるHTMLをファイル化して、ローカルに保存する。

Private Declare Function DeleteUrlCacheEntry Lib "wininet" Alias "DeleteUrlCacheEntryW" ( _
    ByVal lpszUrlName As Long) As Long
Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileW" ( _
    ByVal pCaller As Long, _
    ByVal szURL As Long, _
    ByVal szFileName As Long, _
    ByVal dwReserved As Long, _
    ByVal lpfnCB As Long) As Long
 
Public Sub test_download()
    If HTML_Download("http://xxxx", "C:\temp\test.html") <> 0 Then
        MsgBox "Fail!"
    Else
        MsgBox "Done!"
    End If
End Sub
 
Function HTML_Download(ByVal HTML_URL As String, ByVal SavePath As String) As Long
    DeleteUrlCacheEntry StrPtr(HTML_URL)
    HTML_Download = URLDownloadToFile(0, StrPtr(HTML_URL), StrPtr(SavePath), 0, 0)
End Function

VBA:HTML内から値の取り出し

HTMLファイル内にあるテーブル<table>内の値を取り出す。
今まではINSTR関数で地道に処理していたが、もっとスマートな方法を準備した。


Sub html_TD_value()
    Dim objXML As New MSHTML.HTMLDocument
    Dim htmlDoc As New MSHTML.HTMLDocument
    Dim htmlDoc2 As Object
    Dim htmlDoc3 As Object
    Dim htmlDoc4 As Object

    ' 事前に出力されたHTMLファイルを取り扱う
    Set htmlDoc = objXML.createDocumentFromUrl("file:///C:/temp/test.html", vbNullString)

    'wait処理が面倒だから0.5秒待つことにする(ローカルファイルアクセスのため高速なはず)
    Application.Wait [Now() + "0:00:00.5"]

   ' id="xxxx"まで飛ぶ
    Set htmlDoc2 = htmlDoc.getElementById("xxxx")
   '1行目(TR)は飛ばして2行目から処理
    For i = 1 To htmlDoc2.getElementsByTagName("tr").Length - 1

        ' 
<TR>まで飛ぶ
        Set htmlDoc3 = htmlDoc2.getElementsByTagName("tr")(i)
        For j = 0 To htmlDoc3.getElementsByTagName("td").Length - 1

            ' 
<TR>内の
<TD>まで飛ぶ
            Set htmlDoc4 = htmlDoc3.getElementsByTagName("td")(j)
            ' 
<TD>の値をゲット
            Debug.Print i, j, htmlDoc4.innerText

        Next
    Next
End Sub

WORDテクニック

行間の改善

14ptの大きさを境に突然行間が大きくなる
理由はググって頂くとして、
解消方法は行間オプションを開いて下記のチェックを外す
□ 1ページの行数を指定時に文字を行グリッド線に合わせる

初期設定にしたい場合は、
ホームタブ内のスタイルの「標準」を右クリックから変更を選び、段落設定を上記のように直す
この時に、下記の設定も忘れないこと
○ このテンプレートを使用した新規文書

 

段組み内での改行

通常、Ctrl+Enterで次ページ送りだが、
Shift+Ctrl+Enterを押すと、次の段組へ飛ぶことができる

 

余白を最初から狭くしておく

新規作成時に、広い余白が用紙を無駄にします
ページレイアウトのタブにて、ページ設定の右下にある小さなアイコン
*四角+右下矢印付き
これをWクリックを押して、ページ設定画面を表示させる
ここの左下の「規制に設定」を押して反映させる。

VBA: Outlook – 選択中mailに宛先など付与

Outlook上にて、
開いている(選択している)mailに対して、
規定の宛先・本文を追記(先頭に)します。

Sub Create_DHL_Mail()

	Dim objItem As MailItem
	Dim mTitle As String
	Dim mTo As String
	Dim mCc As String
	Dim mBody As String
	
	'付与する情報
	mTo = "xxxx@xxx.com"
	mCc = "xxxx@xxx.com"
	mBody = "既存mailの先頭に文章を追加する" &amp; vbCrLf &amp; "二行目です。"
	
	'現在開いているmail
	Set objItem = ActiveInspector.CurrentItem
	mTitle = objItem.Subject
	
	'開いているmailを書き換える
	objItem.To = mTo
	objItem.CC = mCc
	objItem.Body = mBody &amp; vbCrLf &amp; vbvrlf &amp; objItem.Body
	
End Sub

 

VBA:文字列検索&色付け

Sub moji_color()
    Dim area As Range, onesell As Range, i As Long
    Dim moji As Long, keyw As String
    '対象範囲と検索文字列
    Set area = Application.InputBox(Prompt:="検索対象をセル範囲してください。", Type:=8)
    keyw = Application.InputBox(Prompt:="色付けるキーワードは?", Type:=2)
    'セル範囲ループ
    For Each onesell In area
        moji = 1
        '1セル毎に文字チェック
        Do While moji <= Len(onesell)
            i = InStr(moji, UCase(onesell), UCase(keyw), 1)
            If i = 0 Then Exit Do
            '見つかったら赤くする
            onesell.Characters(i, Len(keyw)).Font.Color = vbRed
            moji = moji + i
        Loop
    Next
End Sub