つらつら Excel VBA

私の備忘録です。

VBA

範囲を広げる(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 …

演算誤差

VBAに限らずコンピュータであれば演算誤差は起こる。 演算誤差の有無は、仕様を決めた人と数式とかプログラム書く人に委ねられる。 最近は誤差のこと忘れてた(笑)同じ動作のプログラムを2つ用意。違うのは変数だけ。 Sub 演算誤差の確認() Dim d As Double…

RGB値から色名を知りたい

VBA

インターネットで定数一覧を探してエクセルシート上で作った脳筋コード。 定数値以外の色名は知らん。 '定数名を返す力技。 Function ColorName(iColor) As String Dim returnStr As String Select Case iColor Case 0: returnStr = "rgbBlack" Case 1002588…

オートシェイプの文字をグラデーション

何回か虹グラデーションを作って分かったけど、緑色をそのままrgbGreenで虹を作るとなんか美しくない。固定観念に囚われず好きな色で作るべし。ちなみに虹が7色なのは日本と数国だけ、8色の国や2~6色の国もある。文字のグラデーションをする際に0~1の範囲…

四角形グラデーションテスト

テスト結果 以下テストコード Sub 四角形グラデーションテスト() Dim r As Range Set r = ThisWorkbook.Worksheets("Sheet1").Range("A2") Do While r.Value <> "" With r.Interior .Pattern = xlPatternRectangularGradient '四角形 With .Gradient 'グラデ…

背景色の線グラデーションテスト

きれいなグラデーションを作るにはセンスが必要!私には無理。テスト結果 以下、テストコード Sub 線グラデーションテスト() With ActiveSheet.Range("A1").Interior .Pattern = xlPatternLinearGradient .Gradient.Degree = 0 With .Gradient.ColorStops .C…

背景色の線グラデーション

背景色を装飾する。グラデーションだけど、ぼかしは極力抑えました。グラデーションとは...? Sub 線グラデーションテスト() Call FillStripeColor(range("A1"), rgbWhite, rgbBlue, 45, 2) Call FillStripeColor(range("B1"), rgbWhite, rgbGreen, 135, 2) …

ArrayList

Callの有無が混在してますが書き方の一例なので見逃して下さい。 '.NET Framework 3.5 (.NET 2.0および3.0を含む) がインストールされている必要がある。 '「Windowsの機能の有効化または無効化」で設定変更の必要がある。 Sub TestArrayList() Dim arrayLis…

配列の初期値入れ込み

配列リテラルの場合は番号が1からになる模様。ふしぎ! 2次元配列と配列の入れ子(ジャグ配列)は書き方が違うので注意。 Option Base 0 Sub 配列テスト() Dim myArray, ar, a Dim i As Integer, j As Integer '1次元配列 ReDim myArray(3) myArray(0) = "お…

多次元配列の完全一致検索

For Each便利。 Sub テスト() '適当に8次元配列を用意 Dim myArray(9, 9, 9, 9, 9, 9, 9, 9) As Variant '適当なテストデータ myArray(1, 1, 8, 7, 5, 8, 8, 8) = "test1" myArray(8, 8, 8, 1, 1, 8, 7, 5) = "test" myArray(5, 8, 8, 8, 1, 1, 8, 7) = "tes…

Filterで配列を部分一致絞り込み

一次元配列限定だけど、配列を絞れる! myArray = Filter(myArray, "文字", False) 'True:文字を含む、False:文字を含まない こんな感じ。 Sub 配列を絞りたい() Dim myArray myArray = Array("北海道", "~略~", "沖縄県") myArray = Filter(myArray, "県"…

TEXTJOIN関数

できるだけ楽に県名の配列を用意したい。 ネットで県のリストを探してExcelのA1にコピペ、TEXTJOIN関数で繋げる。 =TEXTJOIN(""",""",TRUE,A1:A47) 'TEXTJOIN関数の結果 北海道","青森県","岩手県","宮城県","秋田県","山形県","福島県","茨城県","栃木県","…

ドルマーク付きの関数と変数の型

ドルマーク付きの関数は文字列型で返す関数。付いてない関数はVariant型で返す関数。ドルマーク付き関数を使うとNull判定が必要になる。絶対嫌だ。 文字列型の変数宣言時にもドルマークが使える。 Dim a$ Debug.Print TypeName(a) ’Stringが返る a = " test …

固定長文字列変数の宣言

String宣言の後にアスタリスク(*)と定数を指定することで、文字数固定の変数を宣言することができる! Sub 固定長文字列() Dim s As String * 10 s = "テスト文字列" Debug.Print Len(s) Debug.Print "s=[" & s & "]" Debug.Print Asc(Right(s, 1)) End Sub …

ChromeDriverの手動更新

手動更新です。今後の為には自動更新の方が良い。間違いない。 ドライバーが古いぞ!というエラー。 本家ChromeDriverのサイト。新しいドライバーを探します。 sites.google.com Windowsなら赤丸選択ダウンロード。 SeleniumBasicインストールフォルダ内のch…

時間はhh:mm:ssの形で入力する

mm:ssのつもりでExcelシートに入力してもhh:mmになる。見た目に騙されない。Excelが認識するように入力するのだ。 時間と思われるデータの頭に「00:」を追加してhh:mm:ssの形にした。 Sub 分秒を時分秒にする案() 'Excelシートに書き込む前のデータを想定。 …

文字コードの取得

分からない文字に遭遇したら、文字コードを調べてググる。Shift-JISとASCIIコードは互換性がある! Sub 文字コード確認用() Dim i As Long Dim s As String Dim sCode As String With Selection For i = 1 To Len(.Value) s = Mid(.Value, i, 1) 'Shift-JIS …

囲まれた文字を抽出

フォルダを上階層から全部作る

指定したフォルダが無ければ全部作ってしまえば良い。 仕様変更が原因だったとしてもエラーにならなくなる!怒られてしまえ! 'フォルダが無ければ上階層から全部作る。 Function makeFolder(fullPath As String) As Boolean On Error GoTo err1 'fullPath =…

ランダムファイル名(FSO)

'ランダムファイル名を生成(FSO) Function getRndFileName() As String 'Dim FSO As Object 'Set FSO = CreateObject("Scripting.FileSystemObject") Dim FSO As FileSystemObject Set FSO = New FileSystemObject getRndFileName = FSO.GetTempName 'getR…

オートシェイプを画像として保存

'オートシェイプを画像として保存 Sub saveShapeImage(myShape As Shape, outputPath As String) 'シート内にチャートオブジェクトを作成 Dim myChart As ChartObject Set myChart = ActiveSheet.ChartObjects.Add( _ Left:=0, _ Top:=0, _ Width:=myShape.W…

図の背景を透過にする

Sub 選択図を透過にするテスト() 'オブジェクトが選択されているか If VarType(Selection) <> vbObject Then Exit Sub Dim myShape As ShapeRange Set myShape = Selection.ShapeRange With myShape.PictureFormat .TransparentBackground = msoTrue .Transp…

QRコード(Access)

Google先生のAPIは永遠に使える訳ではないので回避策としてテスト。Accessランタイム インストールバーコードはAccessのコントロールなのでAccessが必要!無ければランタイムでよい!Accessランタイムは無料!さすMicrosoft 早速ダウンロードしてインストー…

QRコード(Google先生)

Google Chart API。パラメータ詳細は調べてません。URLエンコードすれば多分漢字が使える! ブラウザなどで以下のURLにアクセスするとQRコード画像が返される。さすGoogle先生 myURL = "https://chart.apis.google.com/chart?cht=qr&chs=100x100&chl=TEST" '…

セル結合の確認

If Range("A1").MergeCells Then Debug.Print "結合されています" End If With Range("A2") Debug.Print .MergeArea.Address '結合範囲 Debug.Print .MergeArea.Count 'セル数 Debug.Print .MergeArea.Rows.Count '行数 Debug.Print .MergeArea.Columns.Coun…

セル結合

Range("E1:G1000").Merge Range("E1").UnMerge 以下、テスト用コード '確認メッセージ非表示 Application.DisplayAlerts = False Dim iRow As Long Dim sh As Worksheet Set sh = ThisWorkbook.Worksheets("Sheet1") 'セル結合1 For iRow = 1 To 1000 sh.Cel…

Application.OnTimeで繰り返し処理

引数を付けるにはシングルクォーテーションでマクロと引数を囲む! ダブルクォーテーションを2連続で書くのはエスケープ処理という回避方法。ダブルクォ(略)を文字として認識させたい時などに使います。他言語では¥マーク等が使われます。 '抜粋 Procedur…