vbaでmenuシートのセルA19にパラメタのセルが指定されていると仮定し、そのセルが空白でないか(指定されているか)を判定する方法は、こんな感じだ。
Sub parameterCheck()
Dim paramSpecified As integer
paramSpecified = 0
If WorkSheets("menu).Range("A10").Formula <>"" then paramSpecified = 1
End Sub
vbaでmenuシートのセルA19にパラメタのセルが指定されていると仮定し、そのセルが空白でないか(指定されているか)を判定する方法は、こんな感じだ。
Sub parameterCheck()
Dim paramSpecified As integer
paramSpecified = 0
If WorkSheets("menu).Range("A10").Formula <>"" then paramSpecified = 1
End Sub
vbaでsqlを使う時の小さいけれども大事なこと。
'(1) strSQL = "" strSQL = strSQL & " SELECT " strSQL = strSQL & "*" strSQL = strSQL & " FROM MEMBERS;" '(2) strSQL = "" strSQL = strSQL + " INSERT " strSQL = strSQL & " (NO,NAME) " strSQL = strSQL & " VALUES(1,'田中');"
excelのWORKDAY関数で前営業日(前の平日)を求める場合、WORKDAY(開始日+1,-1,祝日)とする。 開始日+1-1で開始日となり、日数に-1とすることで、前営業日(前の平日)が求まる。 excelのWORKDAY関数で翌営業日(後の平日)を求める場合、WORKDAY(開始日-1,1,祝日)とする。 開始日-1+1で開始日となり、日数に1とすることで、翌営業日(後の平日)が求まる。 なお、excelのWORKDAY関数の日数には0を指定することができない。0を指定すると正しく、営業日を得ることができない。
accessのクエリで値に応じて、特定の文字列、例えば分類を示すコードを設定した列を作りたい。どうすればいいのか? 例えば、商品名というフィールドに「特別」という文字列が含まれている場合は、分類に「特別」を、そうでなければ「普通」を設定するケースを考えてみる。 新しい列のフィールド名に分類:IIF([商品名] like "*特別*","特別",”普通") と書けばよい。 IIFという関数は、フィールドの値を判定し、TrueかFalseかで処理を分けることができるのだ。 このIIFの書き方を覚えると、色々と応用できるはずだ。 分類:IIF([商品名] like "*特別*","特別",IIF([商品名] like "*限定*","限定",”普通"))とすれば、限定という分類を簡単に増やすことができる。かっこの数に注意が必要だ。 歳をとると、こんなテクニックが簡単に出てこなくなる。そのためのメモだ。
vba 入力規則ーリストを設定する。
Sub SetupLISTBOX()
Dim maxRow As Long
maxRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp) 'A列で最大行を求める場合
With Range("C2:C" maxRow).Validation
.Delete
.Add Type:=xlValidateWholeNumber, _
Operator:=xlBetween, _
Formula1:="=Sheet2!$A$2:$A$100" ’Sheet2にリストの要素あり
End With
End Sub
或る日、突然、Windowsパソコンを共有することになった。 これまでは、夜間や早朝に無人運転していたバッチは、ログインしたままなので、エラーが起きた場合、その画面を見ることができた。 しかし、共有することになって、以降は、当然、ログインしたままにできない。 つまり、バッチは、ログインしていなくても実行できるようにした。そして、実行できた。 エラーが起きたら、プログラムはそのエラー画面を出したまま、止まっていた。だから、そのエラー画面を見ることができたのだった。 ところが、バッチで動かしたaccess、excelといったプログラムは、ログインしていないため(システムが動かしているため)、エラーが起こった場合にその画面を見ることができない。 すなわち、表からは見えないシステムの空間で実行されるので、実行中の画面もエラーで止まっている画面も全く見ることができないのである。 どうするかといえば、エラーの原因解明のための情報をログとして吐き出し、プログラムをキチンと終わらせておく必要がある。 つまり、On Error GoTo Error_Handlerをモジュールの先頭で宣言し、エラーの原因究明のじょうほうをログとして出力する、適切なError_Handler(msgbox)を書いておく。 或いは、システムが起動したプログラムを捕まえる方法は、あるのだろうか?
vbaでシートをコピーし、名前を付けて保存するコードは、excelのクセを踏まえた上で、コードを書いていく。
Sub CopyandSaveFile()
Dim file1 as String
'menuシートのBxxセルにあるファイル名をゲットしておく。
file1 = Worksheets("menu").Range("Bxx").Value
'まず、新しいブックを作成する。即ち、新しいファイルをオープンしておく。
Workbooks.add
'シートをコピーする。
Worksheet("table").Range("A1:G4").Copy
'シートを貼り付ける。
ActiveSheet.Range("A1:G4").PasteSpecialAll
'式を値にする。
ActiveSheet.Range("A2:G4").Value = ActiveSheet.Range("A2:G4").Value
'列幅を整える。
ActiveSheet.Range("A:G").Autofit
'名前を付けて保存する。
ActiveWorkbook.Saveas fileNmaes:=file1
'ファイルをクローズする。
ActiveWorkbook.Close
end Sub
Workbooks.addしたら、ActiveSheetは、新たに作成した空のファイルのシートになる。それがExcelの癖。そして、最後にファイルをクローズしておくのもexcelの癖に合わせるためだ。