PlusOne Blog

「VBA/エクセル」に関する記事

【エクセル】セルの結合を使用しないでレイアウトを整える方法

エクセルで、レイアウトをよく見せたいために、次のようにセルの結合を使ってレイアウトを整えることがあると思います。

 
しかし、セルの結合を使用すると、データの並べ替えやマクロでうまく動作しないで困ることがあります。
 
例)データの並べ替えを使用した場合のエラー


レイアウトを調整する場合は、セルの結合を利用しないで次のように調整することができますので、こちらを利用することをおススメします。
 

セルの結合を使用しないでレイアウトを整える方法

1、中央に表示したい範囲のセルを選択する

2、右クリック → 「セルの書式設定」

3、「配置」タグを選択して、横位置から「選択範囲内で中央」 → 「OK」

4、1で選択したセルの中央にレイアウトされます。


 
 

 

この記事を読む

【エクセル】エクセルのショートカットキー

エクセルを使用するとき、ショートカットキーを覚えていると作業時間が大きく短くなります。
次に紹介するショートカットキーは、エクセルで良く使う機能のショートカットキーになります。ぜひ、活用して効率よく作業しましょう。
 

 

下のPDFをダウンロードなどして、ご活用ください。

エクセル ショートカットキー
 

 

この記事を読む

【VBA】BOF プロパティ・EOF プロパティ

エクセルで Postgre を取り扱うときに、指定範囲内にデータがあるかどうかを判定するときの備忘録
 

BOF プロパティ・EOF プロパティ

BOF プロパティは、レコードの位置が Recordset オブジェクトの最初のレコードより前にあるかどうかを示します。
EOF プロパティは、レコードの位置が Recordset オブジェクトの最後のレコードより後にあるかどうかを示します。
 
例)

 Set RS = CreateObject("ADODB.Recordset")
 RS.Open SQL, CNN, 1
 MsgBox "RS.BOF ⇒ " & RS.BOF
 MsgBox "RS.EOF ⇒ " & RS.EOF

 

 
BOF、EOFも戻り値により、次のようにレコードとデータベースの関係を取得することができます。
・BOF、EOF のいずれかが True の場合、レコードはデータベース内にありません。
・BOF、EOF 共に True の場合、レコードはデータベース内にありません。
・BOF、EOF 共に False の場合、レコードはデータベース内にあります。
 

 

この記事を読む

【VBA】ユーザーフォームにボタンなどのコントロールを配置するとき

ユーザーフォームにボタンなどのコントロールを配置する方法の備忘録です。
(前回紹介した、「【VBA】VBAでエクセル外のオブジェクトを使うとき」に関連した内容になりますので、そちらの投稿も参考にしてください。)
 

ユーザーフォームにボタンなどのコントロールを配置する方法

ユーザーフォームにボタンなどのコントロールを配置する場合は、object.Add を使用します。

 Dim ctrl As Control
 Set Set Ctrl = object.Add(class [, Name [, Visible ]] )

 
class は、配置するコントロールに割り振られた class を指定します。Name には、コントロールに振り分ける名前を指定します。
具体的には、次のように記述します。

 Dim ctrl As Control
 Set ctrl = CreateObject("Forms.CommandButton.1" , "btn_01")

 
ProgID(プログラムID)の例を次にあげておきます。

 Set ctrl = Controls.Add("BARCODE.BarCodeCtrl.1")
 Set ctrl = Controls.Add("RefEdit.Ctrl")
 Set ctrl = Controls.Add("Forms.CheckBox.1") 'チェックボックス
 Set ctrl = Controls.Add("Forms.ComboBox.1") 'コンボボックス
 Set ctrl = Controls.Add("Forms.CommandButton.1") 'コマンドボタン
 Set ctrl = Controls.Add("Forms.Image.1") 'イメージ
 Set ctrl = Controls.Add("Forms.Label.1") 'ラベル
 Set ctrl = Controls.Add("Forms.ListBox.1") 'リストボックス
 Set ctrl = Controls.Add("Forms.MultiPage.1") 'マルチページ
 Set ctrl = Controls.Add("Forms.OptionButton.1") 'オプションボタン
 Set ctrl = Controls.Add("Forms.ScrollBar.1") 'スクロールバー
 Set ctrl = Controls.Add("Forms.SpinButton.1") 'スピンボタン
 Set ctrl = Controls.Add("Forms.TabStrip.1") 'タブストリップ
 Set ctrl = Controls.Add("Forms.TextBox.1") 'テキストボックス
 Set ctrl = Controls.Add("Forms.ToggleButton.1") 'トグルボタン
 Set ctrl = Controls.Add("MSComctlLib.ListViewCtrl")
 Set ctrl = Controls.Add("MSComctlLib.TreeCtrl")
 Set ctrl = Controls.Add("InkEd.InkEdit.1")
 Set ctrl = Controls.Add("MSInkaut.InkPicture.1")
 Set ctrl = Controls.Add("WMPlayer.OCX.7")

 
ワークシート上に設置する場合は、OLEObjects.Add を使用します。

 ActiveWorkbook.Worksheets("Sheet1").OLEObjects.Add ClassType:="Word.Document"

 

 

この記事を読む

【VBA】VBAでエクセル外のオブジェクトを使うとき

VBAでエクセル外のオブジェクトを使うときには、
参照設定でバインドする方法以外に、実行時にバインディングする方法があります。
その方法についての備忘録
 
参照設定でバインドする方法だと、エクセルのバージョンなどにより、参照するDictionaryのバージョンが異なります。このため、自分のPCでは参照できるが、他の人のPCでは参照できずエラーが出てしまうケースが発生してしまいます。
一方、実行時にバインディングする方法ではオブジェクトを直接バインドするため、こういったエラーは発生しません。
 

実行時にバインディングする方法

オブジェクトを作成する場合は、CreateObject を使用します。

 Dim obj As Object
 Set obj = CreateObject(class)

 
class は、appname.objecttype の形式で指定します。具体的には、次のように記述します。

 Dim obj As Object
 Set obj = CreateObject("ADODB.Connection")

 
ProgID(プログラムID)の例を次にあげておきます。

 Set obj = CreateObject("BARCODE.BarCodeCtrl.1")
 Set obj = CreateObject("Access.Application")
 Set obj = CreateObject("ADODB.Connection")
 Set obj = CreateObject("ADODB.Recordset")
 Set obj = CreateObject("ADODB.Stream")
 Set obj = CreateObject("DAO.DBEngine.120")
 Set obj = CreateObject("Excel.Application")
 Set obj = CreateObject("RefEdit.Ctrl")
 Set obj = CreateObject("Outlook.Application")
 Set obj = CreateObject("PowerPoint.Application")
 Set obj = CreateObject("Word.Application")
 Set obj = CreateObject("Word.Document")
 Set obj = CreateObject("htmlfile")
 Set obj = CreateObject("InternetExplorer.Application")
 Set obj = CreateObject("Microsoft.XMLDom")
 Set obj = CreateObject("Microsoft.XMLHTTP")
 Set obj = CreateObject("MSXML2.DOMDocument")
 Set obj = CreateObject("MSXML2.XMLHTTP")
 Set obj = CreateObject("Forms.CheckBox.1")
 Set obj = CreateObject("Forms.ComboBox.1")
 Set obj = CreateObject("Forms.CommandButton.1")
 Set obj = CreateObject("Forms.Image.1")
 Set obj = CreateObject("Forms.Label.1")
 Set obj = CreateObject("Forms.ListBox.1")
 Set obj = CreateObject("Forms.MultiPage.1")
 Set obj = CreateObject("Forms.OptionButton.1")
 Set obj = CreateObject("Forms.ScrollBar.1")
 Set obj = CreateObject("Forms.SpinButton.1")
 Set obj = CreateObject("Forms.TabStrip.1")
 Set obj = CreateObject("Forms.TextBox.1")
 Set obj = CreateObject("Forms.ToggleButton.1")
 Set obj = CreateObject("MSComctlLib.ListViewCtrl")
 Set obj = CreateObject("MSComctlLib.TreeCtrl")
 Set obj = CreateObject("Scriptlet.TypeLib")
 Set obj = CreateObject("CDO.Message")
 Set obj = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
 Set obj = CreateObject("InkEd.InkEdit.1")
 Set obj = CreateObject("Scripting.Dictionary")
 Set obj = CreateObject("Scripting.FileSystemObject")
 Set obj = CreateObject("Shell.Application")
 Set obj = CreateObject("MSInkaut.InkPicture.1")
 Set obj = CreateObject("VBScript.RegExp")
 Set obj = CreateObject("Wia.ImageFile")
 Set obj = CreateObject("WbemScripting.SWbemLocator")
 Set obj = CreateObject("WScript.Shell")
 Set obj = CreateObject("WScript.Network")
 Set obj = CreateObject("new:{6BF52A52-394A-11d3-B153-00C04F79FAA6}")

 

 

この記事を読む

【VBA】曜日を取得する

VBAで、特定の日付の曜日を取得する方法についての備忘録
日付関数 Weekday と、WeekdayName の2つがあり、それらについて紹介。

 

Weekday

 
Weekday 関数は、特定の日付の曜日を示す整数値を返す関数です。
 

 Weekday(曜日をしらべたい日付)

 
曜日をしらべたい日付には、”2021/2/2”のような文字列も可能です。
週の第1日目の曜日を示す値またはクラス名
・0:vbUseSystemDayOfWeek(PCのOSのシステム時間)

・1:vbSunday (日曜日)
・2:vbMonday (月曜日)
・3:vbTuesday (火曜日)
・4:vbWednesday (水曜日)
・5:vbThursday (木曜日)
・6:vbFriday (金曜日)
・7:vbSaturday (土曜日)
 
例)

 MsgBox Weekday("2021/2/2")

 
カレンダー通り、2(=火曜日)が表示されます。
 

WeekdayName

 
Weekday 関数では、曜日を表す数字が返ってくるだけなので、何曜日なのか分かりません。
そこで、WeekdayName 関数で、何曜日というテキストを返します。
 

 WeekdayName(Weekday関数で求めた曜日を表す数字, 「曜日」を省略するかどうか, )

 
例) 「曜日」を省略しない場合

 MsgBox WeekdayName(Weekday("2021/2/2"),false)

 
「火曜日」が表示されます。
 
例) 「曜日」を省略する場合

 MsgBox WeekdayName(Weekday("2021/2/2"),true)

 
「曜日」が省略され、「火」が表示されます。

 

 

この記事を読む

【VBA】日時を扱うデータ ~Date(日付)型とは~

VBAで日時を扱うときのデータについて、紹介していきます。
 
 

Date(日付)型とは

 
VBAでは、日時を扱うために、「日付型」というデータ型が用意されています。
この日付型を使うと、日付の比較や加算、引き算などの計算ができます。
 
VBAで、日付型を記述するときは「#」記号で囲みます。
#月/日/年 時:分:秒#の内容で記述します。
 

Sub macro1()
  Dim d1 As Date, d2 As Date, d3 As Date
  
  d1 = #12/24/2020# ' #月/日/年#
  d2 = #10:26:30 AM# ' #時/分/秒#
  d3 = #12/24/2020 10:26:30 AM# ' #月/日/年 時/分/秒#
     
  MsgBox d1 & vbCrLf & _
          d2 & vbCrLf & _
           d3
End Sub

 

 

文字列からDate型への自動変換

 
上記で紹介した記述法は見つらいので、文字列のように「”」記号で囲むこともできます。
文字列を日付型で定義したデータに代入すると、自動で日付型に変換されます。
 

Sub macro1()
  Dim d1 As Date, d2 As Date, d3 As Date
  
  d1 = "12/24/2020"
    d2 = "10:26:30 AM"
    d3 = "12/24/2020 10:26:30 AM"
     
  MsgBox d1 & vbCrLf & _
          d2 & vbCrLf & _
           d3
End Sub

 

 

 

DateAdd(“d”, 0, c1.Cells(i, 16))
 

この記事を読む
記事一覧に戻る