ラベル Excel の投稿を表示しています。 すべての投稿を表示
ラベル Excel の投稿を表示しています。 すべての投稿を表示
2012/06/06

[Excel][VBA]自分自身(エクセルファイル)を削除するマクロ

[Excel][VBA]エクセルファイルからマクロを除去する | DevAchieveでは
マクロありファイルとマクロなしファイルの2種類ができてしまうので
マクロありファイルの方を削除してしまいたいという希望もあるはず。
そんな時にはこの自分自身を削除するマクロが役に立ちます。
そんなメタ操作できるのか!って感じですができちゃうんですね。凄い。
With ThisWorkbook 
    .Save 
    .ChangeFileAccess Mode:=xlReadOnly 
    Kill .FullName 
    .Close(False) 
End With 
できる逆引き Excel VBAを極める 勝ちワザ700
2010/2007/2003/2002対応 (「できる逆引き」シリーズ)
2012/06/05

[Excel][VBA]エクセルファイルからマクロを除去する


エクセル初回起動時にデータを読み込んでマクロで動的に表示を作成した後は
マクロをもう使わないので削除したいって時のための方法です。
マクロが残っていると起動時にセキュリティの警告が出たり、
利用者にマクロを見られるという問題を回避したい場合に使えます。

コピーとかでシートを移すとすべて移した段階で
何故かマクロも移るという現象が起こるので一枚シートを残してやる必要があります。
Sub CreateNoMacroBook()
    Dim fname As String
    Dim ns As Integer
    Dim cnt As Integer
    
    'マクロありブックの名前を取得
    fname = ActiveWorkbook.Name
    'マクロありブックのシート数を取得
    cnt = ActiveWorkbook.Worksheets.Count
    
    'すべてのシートをMoveするとエラーになるのでシートを追加
    Worksheets.Add After:=Worksheets(Worksheets.Count)
    '新規ブック作成時のデフォルトのシート数を保管
    ns = Application.SheetsInNewWorkbook
    '新規ブック作成時のシート数を変更
    Application.SheetsInNewWorkbook = 1
    '新規ブック作成
    Workbooks.Add
    '新規ブック作成時のデフォルトのシート数に戻す
    Application.SheetsInNewWorkbook = ns
    
    'マクロありブックのシートを新規ブックの"Sheet1"シートの前に移動
    For i = 1 To cnt
        Workbooks(fname).Worksheets(1).Move Before:=Workbooks(Workbooks.Count).Worksheets("Sheet1")
    Next i
    '表示用に新規ブックの一枚目のシートをアクティブにする
    Workbooks(Workbooks.Count).Worksheets(1).Activate
    
    Application.DisplayAlerts = False
    '新規ブックのデフォルトシート"Sheet1"を削除する
    Workbooks(Workbooks.Count).Worksheets("Sheet1").Delete
    'マクロありブックを保存せずに終了
    Workbooks(fname).Close SaveChanges:=False
    Application.DisplayAlerts = True
    
End Sub
できる逆引き Excel VBAを極める 勝ちワザ700
2010/2007/2003/2002対応 (「できる逆引き」シリーズ)
2012/05/20

[Excel][VBA]CSVファイルを読み込む


改行を含まないが、カンマを含む可能性があるCSVは
ダブルクオートで囲んでカンマ区切りにする。
例.
"foo","bar","baz"
"hoge","fuga","piyo"
上のような形式のCSVファイルをパースする手順
(1)一行で読み込み、先頭と終端の"を除去する
(2)","でSplitして配列にする

Function LoadCSV()
    Dim FileType, Prompt As String
    Dim FileNamePath As Variant
    Dim textline, CsvArray() As String
    Dim RowCnt As Long
    Dim ch1 As Long
    
    FileType = "CSV ファイル (*.csv),*.csv"
    Prompt = "CSV File を選択してください"
    
    FileNamePath = Application.GetOpenFilename(FileType, , Prompt)
    
    'キャンセルされた
    If FileNamePath = False Then End Funciton
    
    '空いているファイル番号の取得
    ch1 = FreeFile
    
    'FileNamePath のファイルをオープンします
    Open FileNamePath For Input As #ch1
    
    'エラーが発生したらファイルを閉じます
    On Error GoTo CloseFile
    
    '表の行番号の初期化
    RowCnt = 1
    
    'ファイルの終端まで
    Do Until EOF(ch1)
        '1行読み込む
        Line Input #ch1, textline
        'CSVをパース
        textline = Mid(textline, 2, Len(textline) - 2)
        CsvArray = Split(textline, """,""")
        
        '配列渡しでセルに代入
        Range(Cells(RowCnt, 1), Cells(RowCnt, UBound(CsvArray()) + 1)) = CsvArray()
        
        RowCnt = RowCnt + 1
    Loop
    
CloseFile:
    Close #ch1 'ファイルのクローズ
    
End Function

CSVファイルフォーマットの解説:CodeZine

改行のある場合は1行ずつ読み込む方法じゃ無理だからもっと面倒。
値の中にダブルクオーテーションがある場合のエスケープなんかも考慮してない。
ある程度自由にCSV側の出力をいじれるならパースする方も楽。

2012/04/26

[Excel][VBA]シートの存在チェック

できる逆引き Excel VBAを極める 勝ちワザ700
2010/2007/2003/2002対応 (「できる逆引き」シリーズ)


国本 温子

インプレスジャパン

発売日:2012-02-09

シート名を渡すとそのシート名のシートが存在するかどうかチェックする。
Function IsExistSheet(SheetName As String) As Boolean

    Dim ws As Worksheet, flag As Boolean
    
    flag = False
    
    For Each ws In Worksheets
        If ws.Name = SheetName Then flag = True
    Next ws

    IsExistSheet = flag

End Function
2012/04/21

[Excel][VBA]入力規則でドロップダウンメニューを作る

できる逆引き Excel VBAを極める 勝ちワザ700
2010/2007/2003/2002対応 (「できる逆引き」シリーズ)


国本 温子

インプレスジャパン

発売日:2012-02-09


見た目はドロップダウンメニュー、入力規則で言うところのリストをVBAで作ります。
名前付き範囲を使えば別のシートのセル範囲を指定することも出来て便利ですよ。
With ActiveCell.Validation
    .Delete
    .Add Type:=xlValidateList, Formula1:="=名前付き範囲"
End With
2012/04/19

[Excel][VBA]エラーチェックを無効にしてエラーが出ないようにする

できる逆引き Excel VBAを極める 勝ちワザ700
2010/2007/2003/2002対応 (「できる逆引き」シリーズ)


国本 温子

インプレスジャパン

発売日:2012-02-09


Excelには様々なエラーチェック機能がありますが、それがむしろ迷惑になる場合があります。
なので無効にしてしまいましょう。

Excel全体でエラーチェックを無効にする

書式Application.ErrorCheckingOptions.BackgroundChecking = False

オプション一覧

BackgroundChecking
EmptyCellReferences
EvaluateToError
InconsistentFormula
NumberAsText
OmittedCells
TextDate
UnlockedFormulaCells
ErrorCheckingOptions プロパティ (Microsoft.Office.Interop.Excel)


特定のセルでエラーチェックを無効にする

書式ActiveCell.Errors.Item(xlEmptyCellReferences).Ignore = True

オプション一覧

xlEmptyCellReferences
xlEvaluateToError
xlInconsistentFormula
xlNumberAsText
xlOmittedCells
xlTextDate
xlUnlockedFormulaCells
2012/04/18

[Excel][VBA]セルに罫線を引く

できる逆引き Excel VBAを極める 勝ちワザ700
2010/2007/2003/2002対応 (「できる逆引き」シリーズ)

国本 温子
インプレスジャパン
発売日:2012-02-09

一番簡単な罫線の引き方はこんな感じ。
Range("A1:C3").Borders.LineStyle = xlContinuous

もっと細かく色々設定して罫線を引きたかったら次のページが参考になる。
書式 - 罫線 - EXCEL-LENCE web
2012/04/14

[Excel][VBA]連続したセルの終端の行番号・列番号を取得する

できる逆引き Excel VBAを極める 勝ちワザ700
2010/2007/2003/2002対応 (「できる逆引き」シリーズ)

国本 温子
インプレスジャパン
発売日:2012-02-09



データを入力させたらどれだけデータが入っているかを知りたくなりますよね?
必要なセルだけループ回して処理とかしやすくなりますし。
ということで取得方法を関数にしました。

空白を含まない連続したセルの終端の行番号・列番号を取得する

'右方向(xlToRight)に空白でないセルを探す
'指定した列がすべて空白、または埋まっている場合は256を返す
Function getColumn(row As Long, column As Long) As Long
    getColumn = Cells(row, column).End(xlToRight).Column
End Function

'下方向(xlDown)に空白でないセルを探す
'指定した行がすべて空白、または埋まっている場合は65536を返す
Function getRow(row As Long, column As Long) As Long
    getRow = Cells(row, column).End(xlDown).Row
End Function
欠点としては途中に空白セルがある場合には空白セルの一つで前で止まる。
入力漏れなんかを探すのには使えるかもしれない。

途中に空白を含むセルの終端の行番号・列番号を取得する

'Excelの最大列数(IV=256)から左方向(xlToLeft)に空白でないセルを探す
'指定した行がすべて空白、または埋まっている場合は1を返す
Function getColumn(row As Long) As Long
   getColumn = Range("IV" & row).End(xlToLeft).Column
End Function

'Excelの最大行数(65536)から上方向(xlUp)に空白でないセルを探す
'指定した列がすべて空白、または埋まっている場合は1を返す
Function getRow(column As Long) As Long
    getRow = Range(column & "65536").End(xlUp).Row
End Function
途中で空白セルもある場合はコチラを使えば本当の終端で取得できる。

[Excel][VBA]SubとFunctionの違いとPublicとPrivateの違い

VBAを書いているとSubとFuctionというのが出てきますがイマイチ違いがわからなかったのでまとめます。

結論から言うと、以下の通りです。(※この記事は標準モジュールでの記述での話です)
マクロの実行ユーザー定義関数戻り値
Sub表示される表示されない返すことができない
Private Sub表示されない表示されない返すことができない
Function表示されない表示される返すことができる
Private Function表示されない表示されない返すことができる
どこに表示させたいかで使い分けもできますが、表示させない(Privateの)場合は
Sub と Function のどちらを使ってもあまり変わりません。

意識としては Sub は意味や内容がひとまとまりになっている処理を、
Function は汎用性の高く、そのまま移植できる処理を記述するものだと思っておけば良いと思います。

おすすめ書籍
できる逆引き Excel VBAを極める 勝ちワザ700
2010/2007/2003/2002対応 (「できる逆引き」シリーズ)

国本 温子
インプレスジャパン
発売日:2012-02-09

2012/04/07

[Excel][VBA]行や列の表示と非表示の切り替え

できる逆引き Excel VBAを極める 勝ちワザ700
2010/2007/2003/2002対応 (「できる逆引き」シリーズ)


国本 温子

インプレスジャパン

発売日:2012-02-09

Range("B2").EntireRow.Hidden = False '表示
Range("B2").EntireRow.Hidden = True '非表示
Rows(2).Hidden = False
Rows("2:2").Hidden = True
Rows("2:3").Hidden = False
Cells(2, 2).EntireRow.Hidden = True
Range("2:2").EntireRow.Hidden = False
Range("B2").EntireRow.Hidden = True

Range("B2").EntireColumn.Hidden = False '表示
Range("B2").EntireColumn.Hidden = True '非表示
Columns(2).Hidden = False
Columns("B:B").Hidden = True
Columns("B:C").Hidden = False
Cells(2, 2).EntireColumn.Hidden = True
Range("2:2").EntireColumn.Hidden = False
Range("B2").EntireColumn.Hidden = True
2012/03/31

[Excel][VBA]色々なセルの指定方法

'単一セルを行番号と列番号で指定
Cells(3, 2) 'B3
変数が使えるのでループなどで使いやすい。
文字列表示と引数の順番が逆であることに注意。
Cells(3, "B")
このように直接アルファベットで指定することも可能。

'すべてのセル
Cells

'単一行
Rows(2)
'複数行
Rows("1:3")
'すべての行
Rows

'単一列
Columns(2)
'複数列
Columns("A:C")
'すべての列
Columns

'Excel関数で指定するようにStringで範囲指定
Range(文字列)

'単一のセル
Range("B2")
'離れた複数のセル
Range("B2,C3")
'セル範囲
Range("A1:C3")
'離れたセル範囲
Range("A2:A3,B1:C1")
'行
Range("2:2")
'列
Range("B:B")
'複数行
Range("1:3")
'複数列
Range("A:C")
'離れた複数行
Range("1:1,3:3")
'離れた複数列
Range("A:A,C:C")
'名前付きセル範囲
Range("name") '名前定義で定義した範囲

応用
Range(Cells(row, column)[, Cells(row, column)])
太字部分は省略可能&複数指定可能。
変数を使用してセル範囲を指定することができる。

できる逆引き Excel VBAを極める 勝ちワザ700
2010/2007/2003/2002対応 (「できる逆引き」シリーズ)

国本 温子
インプレスジャパン
発売日:2012-02-09

[書評]できる逆引き Excel VBAを極める 勝ちワザ700
2010/2007/2003/2002対応 (「できる逆引き」シリーズ)

できる逆引き Excel VBAを極める 勝ちワザ700
2010/2007/2003/2002対応 (「できる逆引き」シリーズ)

国本 温子
インプレスジャパン
発売日:2012-02-09
ブクログでレビューを見る»
ネット上に散らばる対応バージョンもわからない情報を参考にするより
コレ一冊ある方が圧倒的に安心できる。
大抵の事はググるより本を見る方が早く見つかるし説明が詳しいので
Excel VBAをガリガリやる人は持っておいたほうが良いと思う。

VBA基礎文法最速マスター - いろいろ解析日記もあるけど他の言語と異なるところが多いのでコレだけじゃきつそう。
VBA自体の文法がわかってないとキツイので以下の本がオススメ。
Excel VBAのプログラミングのツボとコツがゼッタイにわかる本―最初からそう教えてくれればいいのに!Excel2007/2003対応
Excel VBAのプログラミングのツボとコツがゼッタイにわかる本
最初からそう教えてくれればいいのに!Excel2007/2003対応

タグ(RSS)