ラベル 文字形式 の投稿を表示しています。 すべての投稿を表示
ラベル 文字形式 の投稿を表示しています。 すべての投稿を表示

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)と返してしまっています。

VBA 数値から文字列への変換




エクセル上で=text(cells,0)で変換できるのであまり需要はないかもしれないですが、
VBAを使って数値から文字列への変換を無理矢理気味にやってみました。

選択範囲セルで動くサンプルです。

○サンプルコード[text( ,0)]
Sub format_moji1()
    
    '選択範囲のセルの書式を文字列に変更
    Selection.NumberFormatLocal = "@"
    
    'それぞれのセルで処理
    Dim x As Range
        '一文字目が0だと取れてしまうので回避
        If Left(x, 1) <> 0 Then
            '指数化してしまうものを回避
            If InStr(x, "E") = 0 Then
                'ワークシート関数で…
                x = WorksheetFunction.Text(x, 0)
            End If
        End If
    Next
    
    'ブランクのセルに”0”が表示されてしまうのでブランクに再変換
    Selection.Replace What:="0", Replacement:="", LookAt:=xlWhole
    
   

End Sub


参照・類似ページ
NumberFormatLocal
Replace



○サンプルコード[sendkeys]
Sub format_moji2()
Dim r As Long, c As Long, i As Long, j As Long

    '選択範囲のセルの書式を文字列に変更
    Selection.NumberFormatLocal = "@"

    '選択範囲の列の数
    c = Selection.Columns.Count
    '選択範囲の行の数
    r = Selection.Rows.Count
    
    For i = 1 To c '列繰り返し
        For j = 1 To r '行繰り返し
            
            '編集のためF2キー
            Application.SendKeys "{F2}"
            
            'セルの書式=文字列反映
            Application.SendKeys "{Enter}"
            
        Next j
    Next i
    
    
End Sub





参照・類似ページ
SendKeysメソッド




速度的にはWorksheetFunction.Text関数の方が断然早いっぽいです。

ファイル、フォルダの名前を変更 Nameステートメント




構文など
Name oldpathname As newpathname 

エクセルVBAでファイル名やフォルダ名を変更するoldpathname を newpathname に変換するステートメントです。


名前 説明 備考
oldpathname 変更するファイル・フォルダ名をファイルパスを含めて指定する 必須
newpathname 新しいファイル・フォルダ名をファイルパスを含めて指定する 必須
指定項目

変換するファイル名はエクセルに限定されずテキストファイルや画像ファイル等も変換可能です。拡張子の変更は見た目上は可能ですが、構造は変更されません。


サンプルコード
Sub namae()
    
    '"左" をas以降に変換
    Name "C:\Document\dammy.txt" As "C:\Document\dammy.txt"

End Sub



エラー
既に同名のファイルが存在しています。(Error 58)


 ・原因
  newpathname にすでに存在しているファイル名を指定するとこのエラーメッセージが表示されます。
 ・対処法
  newpathname に別のファイル名を指定するか、既に存在するファイルを削除します。

VBA フォルダ内ファイル名一括変換



VBAでDir関数 やNameステートメントを使用してファイル名を一括で変更するコードです。


サンプルコード
Sub FileNameChange()
Dim FileP As String    

 'フォルダ選択のダイアログボックスを開く
  Application.FileDialog(msoFileDialogFolderPicker).Show
 '選択したフォルダのパス名を取得
  FileP = Application.FileDialog(msoFileDialogFolderPicker).SelectedItems(1)
    
 'ファイル名の変換
Dim FileA As String
 '選んだフォルダの拡張子xlsを含むファイルを返す
    FileA = Dir(FileP & "\*.xls*")
    
 'フォルダ内のファイルがなくなるまで繰り返す
    Do While FileA <> ""
    
     'ファイル名の変換
      Dim Str1 As String, Str2 As String
       '変換前の対象文字列
        Str1 = "201308" '←任意で変える部分
       '変換後の文字列
        Str2 = "201310" '←任意で変える部分
       '各ファイルのStr1部分をStr2に変換する
        Name FileP & "\" & FileA  As (Replace(FileP & "\" & FileA , Str1, Str2))
    
     'Dirの指定をなくす
        FileA = Dir()
    Loop
End Sub



サンプルではファイル名の"201308"を"201310"という文字列に変換しています。
ファイル名の変換に使用しているReplace関数は、上記コードの状態ですと部分一致で置換します。


関連・類似ページ
Replace関数 (置換)
Dir関数 (フォルダの有無確認)
FileDialogオブジェクト (フォルダ選択のダイアログボックス)
Name ステートメント (ファイル名の変更)

日付表示書式指定 Format関数




Format(対象,format) 年月日時間の表示形式を変更する関数です。
date関数、Now関数やTime関数と組み合わせて日付、時間の表示形式を指定します。
西暦、和暦等でも表示できます。



文字 説明 備考
/(スラッシュ) 年月日の区切り位置 -
:(コロン) 時間の区切り位置 -
年月日・時間の既定の表記 -
y 01/01から数えた日数 1~366
yy 西暦下2桁 0~99
yyyy 西暦4桁 0~9999
m 1~12
mm 01~12
mmm 月(英語表記略称3文字) -
mmmm 月(英語表記) -
d 1~31
dd 01~31
ddd 曜日(英語表記略称3文字) -
dddd 曜日(英語表記) -
h 時間 0~23
hh 時間 00~23
n 0~59
nn 00~59
s 0~59
ss 00~59
AM/PM
am/pm
AM・PM(am・pm)を表記
hと併用で0~12時間表記
00~59
ss 00~59
g 和暦年号ローマ字1文字 M、T、S、H
gg 和暦年号漢字1文字 明、大、昭、平
ggg 和暦年号漢字 明治、大正、昭和、平成
e 和暦年 1~99
ee 和暦年 01~99
q 四半期 (1月→1)
Long Date yyyy年mm月dd日 表記 -
Long Time hh:nn:ss 表記 -
Format一覧


Format関数での結果はエクセルのセル上で必ずしも表現されるわけではないようです。
違いは例を参照してください。


例)エクセルに表示(元のセルの書式は標準)
Sub YMDhms()
    'サンプル
    Range("A2") = Format(Date, "yyyy/mm/dd")
    Range("A3") = Format(Time, "hh:mm:ss")
    Range("A4") = Format(Date, "c")
    '日付
    Range("A5") = Format(Date, "y")
    Range("A6") = Format(Date, "yy")
    Range("A7") = Format(Date, "yyyy")
    Range("A8") = Format(Date, "m")
    Range("A9") = Format(Date, "mm")
    Range("A10") = Format(Date + 80, "mmm")
    Range("A11") = Format(Date, "mmmm")
    Range("A12") = Format(Date, "d")
    Range("A13") = Format(Date, "dd")
    Range("A14") = Format(Date, "ddd")
    Range("A15") = Format(Date, "dddd")
    '時間
    Range("A16") = Format(Time, "h")
    Range("A17") = Format(Time, "hh")
    Range("A18") = Format(Time, "n")
    Range("A19") = Format(Time, "nn")
    Range("A20") = Format(Time, "s")
    Range("A21") = Format(Time, "ss")
    Range("A22") = Format(Time, "AM/PM")
    Range("A23") = Format(Time, "am/pm hh:mm")
    '和暦
    Range("A24") = Format(Date, "g")
    Range("A25") = Format(Date, "gg")
    Range("A26") = Format(Date, "ggg")
    Range("A27") = Format(Date, "e")
    Range("A28") = Format(Date, "ee")
    Range("A29") = Format(Date, "q")
    'その他
    Range("A30") = Format(Date, "Long Date")
    Range("A31") = Format(Time, "Long Time")
End Sub



例)debug.printに表示
Sub YMDhms2()
    'サンプル
    Debug.Print Format(Date, "yyyy/mm/dd")
    Debug.Print Format(Time, "hh:mm:ss")
    Debug.Print Format(Date, "c")
    '日付
    Debug.Print Format(Date, "y")
    Debug.Print Format(Date, "yy")
    Debug.Print Format(Date, "yyyy")
    Debug.Print Format(Date, "m")
    Debug.Print Format(Date, "mm")
    Debug.Print Format(Date + 80, "mmm")
    Debug.Print Format(Date, "mmmm")
    Debug.Print Format(Date, "d")
    Debug.Print Format(Date, "dd")
    Debug.Print Format(Date, "ddd")
    Debug.Print Format(Date, "dddd")
    '時間
    Debug.Print Format(Time, "h")
    Debug.Print Format(Time, "hh")
    Debug.Print Format(Time, "n")
    Debug.Print Format(Time, "nn")
    Debug.Print Format(Time, "s")
    Debug.Print Format(Time, "ss")
    Debug.Print Format(Time, "AM/PM")
    Debug.Print Format(Time, "am/pm hh:mm")
    '和暦
    Debug.Print Format(Date, "g")
    Debug.Print Format(Date, "gg")
    Debug.Print Format(Date, "ggg")
    Debug.Print Format(Date, "e")
    Debug.Print Format(Date, "ee")
    Debug.Print Format(Date, "q")
    'その他
    Debug.Print Format(Date, "Long Date")
    Debug.Print Format(Time, "Long Time")
End Sub

セルの書式設定 NumberFormatLocalプロパティ



Range.NumberFormatLocal = "表示形式"

セル(Range、Cell)のプロパティです。
エクセル上での「セルの書式設定」で表示形式の分類を「ユーザー定義」の種類で指定するのと同様の処理です。
書式の設定をする方法は他にFormat関数がありますが、エクセル上で表現する場合はこのRange.NumberFormatLocalプロパティを使用するほうが思い通りに出来るとおもいます。

形式 説明 備考
% パーセント表示 "0"・"#"と使う 0.0%
@ 文字列 - @
. 小数点 "0"・"#"と使う 0.0
, 桁区切り "0"・"#"と使う #,###
: 日時 "h"・"m"・"s"と使う
1=24h
hh:mm:ss
/ 日付 "y"・"m"・"d"等と使う
1=1900/01/01
yy/mm/dd
(西暦年月日)
G/標準 標準 - G/標準
"任意指定文字" 指定文字 "" を & で結ぶ "ggge" & "年" & "mm" & "月" & "dd" & "日"
(和合年月日)
(その他) 1000円単位でマイナス赤字 - "
\
" & "#,###,;" & "
\
" & "[赤]-#,###,"
表示形式一覧

・"0"と"#"の違い
"0"は指定された桁に値がなければ"0"と表示されます。
"#"は指定された桁に値がなければ空白になります。
関連
数値表示書式指定 Format関数


Sub NFL()
    Range("a2").NumberFormatLocal = "0.0%"
    Range("a3").NumberFormatLocal = "@"
    Range("a4").NumberFormatLocal = "#,###.#"
    Range("a5").NumberFormatLocal = "0,000.0"
    Range("a6").NumberFormatLocal = "hh:mm:ss"
    Range("a7").NumberFormatLocal = "yy/mm/dd"
    Range("a8").NumberFormatLocal = "G/標準"
    Range("a9").NumberFormatLocal = "ggge" & "年" & "mm" & "月" & "dd" & "日"
    Range("a10").NumberFormatLocal = "\" & "#,###,;" & "\" & "[赤]-#,###,"
End Sub


結果

年月日計算値(シリアル値)を取得する DateSerial関数



DateSerial(year, month, day)
シリアル値とは計算処理出来る年月日時の数値です。


例)セルに日付を入力する
Sub SampleDateSerial()
    'YYYY/MM/DD表記
    Range("A1") = DateSerial(2013, 4, 15)
    
    'YYYY/MM/DD表記(年月日のデータから)
    Dim Da As Long
    Da = 20130401
    
    Range("A2") = DateSerial(Left(Da, 4), Mid(Da, 5, 2), Right(Da, 2))
End Sub

日付を取得する Date関数



Date
(Excelの"Today()"関数と同義)


現在のシステム日付の値を取得する関数です。
デフォルトだと 年・月・日の間にスラッシュ("/")を入れた値を取得します。(例:2013/4/17)
形式を変更するには Format関数 を使用します。


例 セルに日付を入力する(2013年4月17日実行)
Sub SampleDate1()
    
    'デフォルト(YYYY/MM/DD表記)
    Range("A1") = Date
    
    'YYYYMMDD表記_1 (前日)
    Range("A2") = Format(Date - 1, "yyyymmdd")

    'YYYYMMDD表記_2 (翌日)
    '(前から4文字(年)、5文字目から2文字(月)、後ろから2文字(日))
    Range("A3") = Left(Date + 1, 4) & Mid(Date + 1, 6, 2) & Right(Date + 1, 2)
    
End Sub

Dateは"+1"のように今日の日付を起点に計算ができます。

結果

VBA セルの文字列置換




セル内の文字列置換

セル内の文字列・値を置換する方法についての解説とサンプルコードです。

関数、メソッドなど
Range.Replace What:=, Replacement:=, LookAt:=

Rangeが置換するセル、Whatが置換対象の文字列、Replacementが置換後の文字列です。
Rangeにセルの範囲を指定した場合は一括での置き換え処理になります。
引数で大文字・小文字の区別、全角・半角の区別、置換え対象文字列の全体・部分一致の選択などが出来ます。

引数で指定した値はメソッド実行後にエクセル上での置換及び検索のダイアログボックスでも継続して反映されてしまいます。
Replaceメソッド、Findメソッド使用後はデフォルトの値に戻す処理の実行をするサンプルコードも掲載しています。(コード2参照

引数一覧
名前 説明 備考
What 置換対象文字列 Variant 必須
Replacement 置換後文字列 Variant 必須
LookAt 置き換え対象文字列の部分
or完全一致
xlWhole or
xlPart
規定値:xlPart
SearchOrder 列or行から検索 xlByColumns
xlByRows
規定値:xlByRows
MatchCase 大文字小文字の区別する
orしない
True or False 規定値:False
MatchByte 2Byteと1Byteの区別する
orしない
True or False 規定値:False
SearchFormat 書式の指定 規定値:False
ReplaceFormat 書式 規定値:False


コード1
選択セルのスペースを全角半角問わずに削除
Sub SampleReplace2()

    '半角スペース
    Selection.Replace What:=" ", Replacement:=""

    '全角スペース
    Selection.Replace What:=" ", Replacement:=""

End Sub


コード2
置換設定の初期化(デフォルトに変更)
Sub rReplaceTes2()
    '書式検索のクリアをする
    Application.FindFormat.Clear
    Application.ReplaceFormat.Clear
    
    '置換対象文字を省略してデフォルトの置換をする
    Selection.Replace What:="", Replacement:="", Lookat:=xlPart, _
    Searchorder:=xlByRows, MatchCase:=False, MatchByte:=False
End Sub
ダイアログボックス初期化の際の置換対象書式はSearchFormatではなくてFindFormatに指定します。


コード3

Sub rReplaceTes3()

    'セルA1にある文字列"DIV"を消す
    Range("a1").Replace what:="DIV", Replacement:="", lookat:=xlPart, MatchCase:=False

    'セルA1:C5にある文字列"span"を消す
    Range(Cells(1, 1), Cells(5, 3)).Replace what:="span", Replacement:="", lookat:=xlWhole
    
    'D,E列にある文字列"html"を消す
    Columns("d:e").Replace what:="html", Replacement:="", lookat:=xlPart

    '書式検索のクリアをする
    Application.FindFormat.Clear
    Application.ReplaceFormat.Clear
    
    '置換対象文字を省略してデフォルトの置換をする
    Selection.Replace What:="", Replacement:="", Lookat:=xlPart, _
    Searchorder:=xlByRows, MatchCase:=False, MatchByte:=False

End Sub


関連ページ
文字列置換[Replace]関数
文字列検索[Find]メソッド