つらつら Excel VBA

私の備忘録です。

Excel

フォルダを開く

どれもフォルダを開く処理。エラー処理を忘れないこと。 ThisWorkbook.FollowHyperlink folderPath CreateObject("WScript.Shell").Run folderPath shell "explorer " & folderPath, vbNormalFocus ' ファイルを選択した状態でフォルダを開く。フルパスであ…

ファイルのプロパティ取得

GetDetailsOf。作成日付や更新日付、アルバムやアーティスト、ビットレート等々のプロパティ情報を取得する。 '参照設定 'Microsoft Shell Controls And Automation Sub プロパティ取得() Dim fso As Object, file As Object Set fso = CreateObject("Script…

ベームベーム

円と弧円の組み合わせで描く。魔方陣や放射状の線、幾何学模様は中心を決めて描くとキレイ。 円を描く中心と半径を決めてオートシェイプを作る。 Option Explicit '線のデフォルトカラーと太さ。 Const LINE_BOLD As Long = 5 Const LINE_COLOR As Long = vb…

Choose関数

CHOOSE(インデックス、値1、値2、、、)インデックスは整数で1から指定する。指定した~番目の値が返る。 Excel2003では29個、Excel2007以降では254個まで。値部分にSUMとか式を入れ込んだりして複雑なものが作れる。 'エクセル数式 =CHOOSE(4, "A", "B", "C"…

mp3バイナリ解析

mp3タグが文字化けしないよう、文字コードが調べたかった。 最初の3バイトが「ID3」で21バイト目が「01」ならOK!とやるだけでよかった。 それだけでよかったのに、、、なんか長いのが出来た。 独学なので勘弁。 Option Explicit Sub メイン処理() Dim mp3b …

mp3バイナリ解析準備

必要なものを作っていく。 16進数と2進数の10進数変換マイナスや小数点以下の数値、エラーを考慮せずに作ったので取扱注意。 '16進数を2進数に変換 Function HexToBin(sHex As String) As String Dim rtnStr As String: rtnStr = "" Dim i As Long, tmp As S…

オートシェイプ名を配列にしてグループ化

オートシェイプを作るたびに名前を配列に格納し、最後に配列からグループ化。 Dim myShape As Shape Dim arrName() As String Set myShape = オートシェイプを作る処理01 Call ShapeNameArray(arrName, myShape.Name) '~略~ Set myShape = オートシェイプ…

円に添うワードアートを作る

このようにしたい。 文字を円状に変形させる手順は、図形の書式>文字の効果>変形>円。 オートシェイプの円を作成して直接文字を追加して文字を円状に変形させるとこうなる。内側すぎる。物足りない。 円とは別にワードアートを同じサイズで作ってみる。惜…

ステータスバーに進捗を表示

ステータスバーにプログレスバーぽいヤツを作った!小文字のLはカッコいい気がする! GIF見れない人用 よく見る■のパターン 以下ソース。 Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long) Sub ステータスバーのテスト() 'ThisWorkbook.Activat…

Excelのショートカットキー

※半角モード 行を選択 [Shift] + [スペース] 列を選択 [Ctrl] + [スペース] 全選択 [Ctrl] + [Shift] + [スペース]削除 [Ctrl] + [-] 挿入 [Ctrl] + [+]以上。

改ページの設定と取得

改ページはページの開始位置。 HPageBreaksとVPageBreaksがある。多分片方しか使わない。 '改ページ ActiveSheet.HPageBreaks.Add Range("A10") ActiveSheet.VPageBreaks.Add Range("B15") '改ページと解除 ActiveSheet.Range("F9").PageBreak = xlPageBreak…

2次元配列の回転

セルのデータを左右回転、行列の入れ替え、右上を基準にした反転、180度回転、ランダムに再配置するヤツをまとめた。関数化してません。A1に作ってある表を回転してA20に吐き出します。 90度回転シリーズ。左へ90度回転、右へ90度回転、行列の入れ替え(左上…

Transposeで行列の反転

Sub 行と列を入れ替えて貼り付け() Selection.Copy Range("D1").PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, Transpose:=True Application.CutCopyMode = False End Sub Sub 反転して出力() Dim r As Range Set r = Selection '選択箇所 Dim arr ar…

ふりがな

数式で出すと漢字以外のフリガナも全部出る。 =PHONETIC(A1) 以下VBA。まずは表示から。 Selection.Phonetics.Visible = True 'フリガナ表示 Selection.Phonetics.Visible = False 'フリガナ非表示 フリガナの設定。漢字も設定できた。 Selection.Characters…

文字の書式(Characters)

A1内の文字に設定されている書式を他にもコピーしたい。 ネットで検索すると255文字だか256文字を超えた場合に書式が壊れるとか何とか出てきますが、そこまでテストしません。数文字でもおかしくなります。Excelは表計算ソフトです。自己責任。 Sub 選択部に…

セルと文字の書式削除

全部書式を削除したい。 Selection.ClearFormats 'セル書式のクリア 以下画像のような文字の書式は、セル書式のクリアでは消えない。同じ理由で他セルからのセル書式上書きでも消えない。 文字の書式は、文字自体を上書きしてしまえば消える!・・・たぶん消…

波線を作る(BuildFreeform)

オートシェイプを自分で自由に書ける! Sub 波線作成テスト() Dim myShape As Shape Dim ffb As FreeformBuilder Dim r As Range Set r = Range("A3") Set ffb = Shapes.BuildFreeform(msoEditingAuto, r.Left, r.Top) Dim i As Integer For i = 1 To 3 Set …

同心の円を連続作成

こんなの作りたい。アーチェリー! 円の中心位置と直径から図形のサイズを計算してオートシェイプを作成。 Sub テスト() Dim 中心点Left As Integer Dim 中心点Top As Integer 中心点Left = Range("E15").Left 中心点Top = Range("E15").Top Dim 直径 As Int…

For Eachの処理順番

順番は保証されてない模様。以下、確認用コード。 Set セル範囲 = Range("A1:E2") For Each v In セル範囲 Debug.Print v Next 二次元配列 = セル範囲 For Each d In 二次元配列 Debug.Print d Next テスト表 \ABCDE 112345 2678910 実行結果 セル範囲の出…

ヘッダーを除いたセル範囲を取得

Ctrl+Aで取得できる範囲から、Offsetで一行下げて、Resizeで一行減らす処理。 起点は何も考えずC7にしました。 Dim セル範囲 As Range With Range("C7").CurrentRegion Set セル範囲 = .Offset(1).Resize(.Rows.Count - 1) End With 以上。

配列をそのままセルに出力

配列をセルに出力する際、一次元配列は横方向に出力される。シート横方向の限界サイズで一次元配列を作成して出力してみた。 Excel2007以降では16,384列もあるが一瞬で終わる。 Option Base 0 Sub 一次元配列の出力テスト() Dim lastColumn As Long lastColu…

乱数と確率

エクセルの乱数は疑似乱数。セルに以下の数式を入れると出る。 =RAND() '0~1の間で乱数を生成 以下、VBA用。シード値については触れません。 Sub Test1() Randomize '乱数ジェネレータを初期化 Debug.Print Rnd '0~1の間で乱数を生成 End Sub 整数用の乱数…

曜日

日曜日~土曜日。1~7の数値に対応。セルに以下の式を入力。曜日や数値が出せる。 =TEXT(NOW(),"(aaa)") '(日)~(土) =TEXT(NOW(),"aaaa") '日曜日~土曜日 =WEEKDAY(NOW()) '1~7 セルの書式設定のユーザー定義でも出せる。aaa、(aaa)、ddddなどを設定。 VB…

CallByName

メゾッドやプロパティをテキストで指定して実行や取得ができる。 用途が思いつかない・・・ CallByName(object,procname,calltype,[args()]) calltype 値定数 1vbMethod 2vbGet 4vbLet 8vbSet 使用例 total = WorksheetFunction.Sum(Range("A1:B5")) total =…

CellsとRange

範囲を指定するならRangeを使う。Cellsは範囲指定ができない。 変数を使って動的な処理を行うならCellsを使う。固定セルならRangeを使う。 人に見せるなら上記を守る。 CellsとRangeを使い分ける。(私は出来てない) よくあるパターンから。 Dim r As Range…

簡潔に書こうとして失敗した

こんなの書いた。範囲拡大するだけ。 Sub test1() Dim rng As Range Set rng = Range("A1") With rng Set rng = .Resize(, 2) '列数拡大(1→2) Set rng = .Resize(3) '行数拡大(1→3) End With Debug.Print rng.Address End Sub .Resize(, 2)で列数が2に変わっ…

範囲を広げる(Offset、Resize)

上下左右1セルずつ選択範囲を広げたい。 1セル選択→9セル選択、4セル選択→16(18)セル選択みたいな感じのことをしたい。起点が1列目1行目の場合にOffsetでエラーが起きる。 これを無視すると簡単。 Sub 選択範囲を広げる1() On Error Resume Next Dim targetR…

罫線を引く、消す、有無を比較

罫線について使うプログラムと定数をまとめた。 '選択範囲に格子の線を引く Selection.Borders.LineStyle = xlContinuous ’実線 Selection.Borders.LineStyle = True '同じ結果 ' 選択範囲に中太、青色、格子線 ' 線の指定をせずとも罫線が出る不思議。 With…

プロシージャが大きすぎます

プログラムが大きいとエラー。64Kを超えるとダメとのこと。 8,000行くらい書いて実行したら上記のエラーが出ました。 Sub test() Dim iYear As Integer, iMonth As Integer, iDay As Integer Dim sMsg As String 'テストデータ iYear = 2023 iMonth = 2 iDay…

シートの表からHTMLテーブルを作成

tdとかtrを書くの面倒なので作った。 以下を実行するとエクセルシートの選択範囲をテーブル用HTMLに書き換える。直接セルを書き換えてしまうので注意。 ファイル保存してから実行、もしくは実行後に下の削除用を実行。 ' tableタグくらいは自分で書く。 Sub …