ラベル 値の操作 の投稿を表示しています。 すべての投稿を表示
ラベル 値の操作 の投稿を表示しています。 すべての投稿を表示

VBA 2017年カレンダー作成




エクセル形式の2017年(2017年1月~12月)カレンダーです。
四半期は1月~3月を第1四半期としています。




コード
Sub calenddd()
Dim ws As Worksheet, i As Long
Dim firstDay As Date

'inputボックスに一日目を入力
firstDay = InputBox(Date, "最初の日", "YYYY/MM/DD")

Set ws = Worksheets(1)
    
With ws
 For i = 2 To 367 'めんどいので余分にとっておく
       
  If i <> 2 Then
   .Cells(i, 1) = Format(.Cells(i - 1, 1) + 1, "YYYY/MM/DD")
  Else
   .Cells(i, 1) = Format(firstDay, "YYYY/MM/DD")
  End If
     
    'スラッシュない形式
     .Cells(i, 2) = Format(.Cells(i, 1), "YYYYMMDD") 
    '曜日(略
     .Cells(i, 3) = Format(.Cells(i, 1), "aaa") 
    '曜日(フル
     .Cells(i, 4) = Format(.Cells(i, 1), "aaaa")
    'Yobi(Ryaku 
     .Cells(i, 5) = Format(.Cells(i, 1), "ddd") 
    'Yobi(Full
     .Cells(i, 6) = Format(.Cells(i, 1), "dddd")
    '和暦 
     .Cells(i, 7) = Format(.Cells(i, 1), "ggg") 
    '年月
     .Cells(i, 8) = Format(.Cells(i, 1), "YYYYMM") 
    '四半期
     .Cells(i, 9) = Format(.Cells(i, 1), "q") & "Q" 
    End If
 Next i
End With

End Sub



参照・類似ページ
日付表示書式指定(Format)関数
日付を取得する(Date)関数
年月日計算値(シリアル値)を取得する(DateSerial)関数

VBA 数式の挿入



数式の挿入


VBAを使ってセルに数式を入力する方法です。
VBA処理で計算するのではなくエクセルシートに数式を残します。

関数、メソッドなど
FormulaプロパティとFormulaR1C1プロパティの2種類で実行できます。
Range.Formula = "=A2+B2"
Range("A1").FormulaR1C1 = "=R2C1+R2C2"
「Formula =」以降はダブルクォーテーションで囲った中に「=数式」という形式で記述します。

「Formula =」以降変数を使用する場合はCells形式とAddressプロパティを使用します。

サンプルコード
Sub formula1()
Dim a As Long, b As Long
    
    'そのまま数式を直接
    Range("A1").Formula = "=A2+B2"
    '変数使う場合
    a = 1
    b = 2
    Range("A1").Formula = "=" & Cells(b, a).Address & "+" & Cells(b, b).Address
End Sub


解説
上記サンプルでは両方ともA1セルにA2+B2を入力しています。
(Cells形式+Addressだと既定値は絶対参照になるので"=$A$2+$B$2"になっています。
絶対参照ではなく相対参照にするには

        Range("A1").Formula = "=" & Cells(b, a).Address(RowAbsolute:=False, ColumnAbsolute:=False) & _
     "+" & Cells(b, b).Address(RowAbsolute:=False, ColumnAbsolute:=False)

としてAddressプロパティのRowAbsoluteとColumnAbsoluteをFalseにします。)

○その他
・「Formula =」あと["=…"]の[=]を入れないと文字列として扱われます。

・エクセル関数を使用する場合も基本的に同じです。
Sub formula2()
    Range("A1").Formula = "=sum(A2,B2)"
    Range("A1").Formula = "=sum(" & Cells(b, a).Address & "+" & Cells(b, b).Address & ")"
End Sub

VBA 文字の改行




ステートメント構文など
vbCrLf

VBAを使ってエクセル上で、もしくはフォームやメッセージボックスなどで改行する方法です。
エクセル上だとセルの編集中に[Alt+Enter]と同じ動作を再現します。


サンプルコード
Sub kaigyo()
    Cells(1, 1) = "かいぎょう" & vbCrLf & "テスト1"
    Cells(1, 2) = "かいぎょう" & vbLf & "テスト2"
    Cells(1, 3) = "かいぎょう" & vbCr & "テスト3"
    Cells(1, 4) = "かいぎょう" & Chr(10) & "テスト4"
    Cells(1, 5) = "かいぎょう" & Chr(13) & "テスト5"
    Cells(1, 6) = "かいぎょう" & vbNewLine & "テスト6"
    
    Debug.Print "かいぎょう" & vbCrLf & "テスト1"
    Debug.Print "かいぎょう" & vbLf & "テスト2"
    Debug.Print "かいぎょう" & vbCr & "テスト3"
    Debug.Print "かいぎょう" & Chr(10) & "テスト4"
    Debug.Print "かいぎょう" & Chr(13) & "テスト5"
    Debug.Print "かいぎょう" & vbNewLine & "テスト6"

End Sub


実行結果イメージ



解説
vbLf(定義済みの定数)
Chr(10)(実際の値)
この二つは「ラインフィード」の略で原則的には1行下に移る動作をします。

vbCr(定義済みの定数)
Chr(13)(実際の値)
この二つは「キャリッジ・リターン」の略で原則的にカーソルなどを同一行の先頭位置に移動します。

ラインフィードとキャリッジ・リターンを合わせて
vbCrLf (定義済みの定数)
Chr(13)&(Chr(10)実際の値)
で改行を表すのが通常っぽいですが
VBA上であれば
vbNewLine (定義済みの定数)
で思うような動作が得られると思います。


関連・類似ページ
セルの文字列置換Replace

2016年カレンダー エクセル(VBA)




エクセル形式の2016年1月~2016年12月のカレンダーです。
四半期は4月~6月を第1四半期としています。




コード
Sub calenddd()
Dim ws As Worksheet, i As Long
Dim firstDay As Date

'inputボックスに一日目を入力
firstDay = InputBox(Date, "最初の日", "YYYY/MM/DD")

Set ws = Worksheets(1)
    
With ws
 For i = 2 To 367 'めんどいので余分にとっておく
       
  If i <> 2 Then
   .Cells(i, 1) = Format(.Cells(i - 1, 1) + 1, "YYYY/MM/DD")
  Else
   .Cells(i, 1) = Format(firstDay, "YYYY/MM/DD")
  End If
     
    'スラッシュない形式
     .Cells(i, 2) = Format(.Cells(i, 1), "YYYYMMDD") 
    '曜日(略
     .Cells(i, 3) = Format(.Cells(i, 1), "aaa") 
    '曜日(フル
     .Cells(i, 4) = Format(.Cells(i, 1), "aaaa")
    'Yobi(Ryaku 
     .Cells(i, 5) = Format(.Cells(i, 1), "ddd") 
    'Yobi(Full
     .Cells(i, 6) = Format(.Cells(i, 1), "dddd")
    '和暦 
     .Cells(i, 7) = Format(.Cells(i, 1), "ggg") 
    '年月
     .Cells(i, 8) = Format(.Cells(i, 1), "YYYYMM") 
        
    If Format(.Cells(i, 1), "q") = 1 Then
     '四半期
     .Cells(i, 9) = 4 & "Q" 
    Else
     '四半期
     .Cells(i, 9) = Format(.Cells(i, 1), "q") - 1 & "Q" 
    End If
 Next i
End With

End Sub


作成後のエクセルファイルはこちらです。
2016年カレンダー

参照・類似ページ
日付表示書式指定(Format)関数
日付を取得する(Date)関数
年月日計算値(シリアル値)を取得する(DateSerial)関数

2015年度カレンダー エクセル(VBA)




検索しても見付からなかったのでなんとなく作ってみました。
エクセル形式の2015年4月~2016年3月のカレンダーです。
四半期は4月~6月を第1四半期としています。


2015年度カレンダー


コード
Sub calenddd()
Dim ws As Worksheet, i As Long
Dim firstDay As Date

'inputボックスに一日目を入力
firstDay = InputBox(Date, "最初の日", "YYYY/MM/DD")

Set ws = Worksheets(1)
    
With ws
 For i = 2 To 367 'めんどいので余分にとっておく
       
  If i <> 2 Then
   .Cells(i, 1) = Format(.Cells(i - 1, 1) + 1, "YYYY/MM/DD")
  Else
   .Cells(i, 1) = Format(firstDay, "YYYY/MM/DD")
  End If
     
    'スラッシュない形式
     .Cells(i, 2) = Format(.Cells(i, 1), "YYYYMMDD") 
    '曜日(略
     .Cells(i, 3) = Format(.Cells(i, 1), "aaa") 
    '曜日(フル
     .Cells(i, 4) = Format(.Cells(i, 1), "aaaa")
    'Yobi(Ryaku 
     .Cells(i, 5) = Format(.Cells(i, 1), "ddd") 
    'Yobi(Full
     .Cells(i, 6) = Format(.Cells(i, 1), "dddd")
    '和暦 
     .Cells(i, 7) = Format(.Cells(i, 1), "ggg") 
    '年月
     .Cells(i, 8) = Format(.Cells(i, 1), "YYYYMM") 
        
    If Format(.Cells(i, 1), "q") = 1 Then
     '四半期
     .Cells(i, 9) = 4 & "Q" 
    Else
     '四半期
     .Cells(i, 9) = Format(.Cells(i, 1), "q") - 1 & "Q" 
    End If
 Next i
End With

End Sub


参照・類似ページ
日付表示書式指定(Format)関数
日付を取得する(Date)関数
年月日計算値(シリアル値)を取得する(DateSerial)関数

VBAでMysqlのタイムスタンプのようなもの



MySQLのTIMESTAMPである'2015-03-17 14:16:15'のような書式をエクセル上で作成する方法です。

使用する関数はDate,Time, Format, NumberFormatLocal です。



単純にDate関数,Time関数を使うと…
Sub TimeStamp()

    Cells(2, 2) = Date
    Cells(3, 2) = Time

End Sub



エクセルのデフォルトの表記だとこんな感じになります。(環境によって異なる結果になると思います。)


Format関数を噛ませると
Sub TimeStamp()

    Cells(2, 2) = Date
    Cells(3, 2) = Time

End Sub


エクセル上では同じように見えます。

なのでエクセルでも"yyyy-mm-dd hh:mm:ss"と表記したい時はまずはNumberFormatLocalプロパティを使ってセルの書式を変える手間が必要になります。
Sub TimeStamp()
    Cells(2, 2) = Format(Date, "yyyy-mm-dd")
    Cells(3, 2) = Format(Time, "hh:mm:ss")

    Cells(4, 2).NumberFormatLocal = "yyyy-mm-dd hh:mm:ss"
    Cells(4, 2) = Format(Date, "yyyy-mm-dd") _
     & " " & Format(Time, "hh:mm:ss")
End Sub




こんな感じになります。



特に問題なく動きますが時間の分の部分は"mm"じゃなくて"nn"の方が好ましいようです。

VBA 文字数を数える



Len(string)

対象文字(引数:string)の文字数を返す関数です。
引数:stringに変数を使用する場合は文字列型であるstringにしないと 変数の型の文字数を返してしまい違う値になります。


例 
Sub SampleLen()
    Dim a As String
    Dim b As String
    Dim c, d As Long, e As Double
    '変数に値を入れる
    a = Cells(2, 2) 'aaa(string)
    b = Cells(3, 2) '123(string)
    c = Cells(4, 2) '123(variant)
    d = Cells(5, 2) '123(long)
    e = Cells(6, 2) '123(double)
    
    '3列目に文字数を返す
    Cells(2, 3) = Len(a)
    Cells(3, 3) = Len(b)
    Cells(4, 3) = Len(c)
    Cells(5, 3) = Len(d)
    Cells(6, 3) = Len(e)
    
End Sub



↑のようにlong、doubleの型を宣言した変数の場合はそれぞれ4(long),8(double)と返してしまっています。

文字列内の文字列検索と位置取得 InStr



InStr(start, string1, string2)
InStr(検索開始位置, 検索対象文字列, 検索する文字)

~~(string2)を含む文字列の検索方法です。
検索文字がない場合は0を返すので文字の有無の判断として使用できます。
文字列[string1]から指定した文字列[string2]を検索し、最初に見つかった文字位置 (先頭からその位置までの文字数) を返します。
開始位置[start]を整数で指定できます。

例(string1 = "ABCDE.xls" 、エクセル上に表示します)
Sub ins()
    Dim Moji As String
    Moji = "ABCDE.xls"

    '".xls"の位置を取得
    Range("a1") = InStr(Moji, ".xls")

    '".xls"以前の文字を抜き出す
    Range("a2") = Mid(Moji, 1, InStr(Moji, ".xls") - 1)
End Sub


上の例では省略可能な開始位置[start]は指定していませんので[string1]の1文字目から数えています。


例2(文字の存在有無を確認)
Sub searchIns()
    Dim ws As Worksheet
    Dim i As Long 'カウント用
    
    Set ws = ActiveSheet '対象ワークシート
        
        For i = 1 To 10  'セルA1~A10まで検索する
            '1文字目から検索して"1"が一個以上あるか検索
            If InStr(1, ws.Cells(i, 1), 1) <> 0 Then  '"1"が0個じゃない
                
                ws.Cells(i, 2) = "A" 'セルのB列にAと記入
            
            Else: End If  '"1"が0個なら何もしない
        Next i
        
End Sub

文字列から指定した数の文字列を返す(Left, Mid, Right)関数



Left(string , length)

Right(string , length)

Mid(string , start , length)

Left・Rightはそれぞれ左右から指定する文字列[string]から、指定する文字数[length]を返します。
Mid関数の場合は開始位置[start]を整数で指定します。


例(エクセル上に表示します)
Sub LRM1()
    Dim Moji As String
    Moji = "あいうえおかきくけこ"
    
  '左から3文字抜き出す
    Range("a1") = Left(Moji, 3)
  
  '右から4文字抜き出す
    Range("a2") = Right(Moji, 4)
  
  '4文字目から3文字抜き出す
    Range("a3") = Mid(Moji, 4, 3)
  
  '5文字目からすべて抜き出す
    Range("a4") = Mid(Moji, 5)

End Sub


結果

mid関数で[length]を省略すると[start]以降の全てを抜きだします。(例の4つ目)

文字列置換 Replace関数



Replace( expression, find, replace, start, count, compare )

文字列の置換をする関数です。
Expression(対象文字列)のFind(検索文字列)を置換文字列(Replace)にします。
セルの文字列置換を行う場合はRange.Replaceメソッドを使うのが良いと思います。

<Replace(1,2,3)>
<3を含む1の2を3にします。>

指定項目 説明 備考
expression 置換する文字列を含む文字列式 必須
find 検索する文字列 必須
replace 置換する文字列 必須
start 引数 expression 内の内部文字列の
検索開始位置
既定値:1
(1文字目から)
count 置換する文字列数 既定値:-1
(対象すべて置換)
compare 文字列比較のモードを表す数値 既定値:0
(バイナリモード)
引数一覧


例)文字列が含む"スペース"を取り除く
Sub SampleReplace()

    Dim Moji As String

    Moji = "あい うえお"
    MsgBox (Moji & " [Replace]→ " & Replace(Moji, " ", ""))

End Sub



セル内の文字列置換はこちらです。
セルの文字列置換 Replaceメソッド

文字列の変換 全角/半角、大文字/小文字、ひらがな/カタカナ



StrConv( string, conversion )

StrConvは、文字列 string を指定のフォーマット conversion に変換する関数です。
フォーマットconversionに定数を指定することによって文字列の大文字、小文字、半角、全角、ひらがな、カタカナなどへの変換をすることができます。


conversionに指定できる定数一覧
名前 変換後形式 備考
vbUpperCase 大文字 1
vbLowerCase 小文字 2
vbProperCase 先頭の文字を大文字 3
vbWide 全角 4
vbNarrow 半角 1
vbKatakana カタカナ 16
vbHiragana ひらがな 32
vbUnicode UNICODE 64
vbFromUnicode システムの既定のコード 128 (ANSI文字列)

※ StrConv : Convert(変換する) & String(文字列)


サンプル1)エクセル上で半角に変換
Sub StrConvNarrow()
Dim r As Range
    Set r = ActiveSheet.Range("A1")
    
    '半角(vbNarrow)に変換
    ActiveSheet.Range("B1") = StrConv(r, vbNarrow)
End Sub






数字から文字列への変換等は NumberFormatLocal プロパティを使用します。