めもぶろぐ

お勉強したこと、趣味なんかを適当に書いてます。。。

EXCEL VBA マクロメモ

プログラじゃないのですが、最近VBAで簡単なマクロを作る機会が増えてきました。

毎回作るたびに使い方を忘れるのでメモしておきます。
素人向けですかね。

例題に使用する表

Excelにそのまま貼り付けて使えます。
必要に応じて、表をテーブルデータに変換してください。

# LastName FirstName Age
1 AAA BBB 25
2 CCC DDD 47

表から値を取得

MacのOffice365から使用しています。
Windowsだとテーブル名はテーブル1とかになります。
MacでやってるとTable1と、英語で名前がつきます。

というか、macroに日本語が使えない?みたいです。

    Dim RangeValue As Range

    With Workbooks("Workbook1").Worksheets("Sheet1")
        '  Table1というテーブル名のデータ部とヘッダを取得
        Set RangeValue = .Range("Table1").CurrentRegion
        
        
        '  Table1というテーブル名のデータ部とヘッダを取得
        ' 上記とほぼ同義だが、CurrentRegionと少し範囲が変わるケースあり
        Set RangeValue = .Range("Table1").Resize(.Range("Table1").Rows.Count + 1)
        
    
        ' Table1というテーブル名のデータ部のみを取得
        Set RangeValue = .Range("Table1")
    End With
        
    ' テーブルデータを1行ずつ各列を出力            
    For Each data In RangeValue
        Debug.Print (data)
    Next
    
 ' 上記と同義
    For i = 1 To RangeValue.Rows.Count
        For j = 1 To RangeValue.Columns.Count
            Debug.Print ("ROW: " & i & ", Column: " & j)
        Next
    Next
    
    set RangeValue = Nothing

★ Debug.printの出力例
ROW: 1, Column: 1
ROW: 1, Column: 2
ROW: 1, Column: 3
ROW: 1, Column: 4
ROW: 1, Column: 5
ROW: 2, Column: 1
ROW: 2, Column: 2
ROW: 2, Column: 3
ROW: 2, Column: 4
ROW: 2, Column: 5
ROW: 3, Column: 1
ROW: 3, Column: 2
ROW: 3, Column: 3
ROW: 3, Column: 4
ROW: 3, Column: 5

列ごとに条件があればselect case とかでいい感じに対象データを条件に応じて処理が可能。

case文

    For i = 1 To RangeValue.Rows.Count
        For j = 1 To RangeValue.Columns.Count
        
            ' 条件はカンマ区切りでor指定が可能
            Select Case j
                Case 3, 4
                    Debug.Print ("ROW: " & i & ", Column: " & j)
                Case Else
                    Debug.Print ("Nothing")
            End Select
            
    ' この場合の書き方はlike演算子等が使用可能
            Select Case True
                Case RangeValue(i, j) Like "A*"
                    Debug.Print (RangeValue(i, j).Value)
            End Select

        Next
    Next

FSO(FileSystemObject)

Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")

If FSO.FileExists("C:\temp\testfile") Then
    FSO.MoveFile "C:\temp\testfile" "D:\gomi"
Else
    FSO.CreateTextFile "C:\temp\testfile"
End If

繰り返し処理

シートの1行目から一番下の行までを処理

for i = 1 to cells(rows.count, 1).end(xlup).row
     Debug.Print (i)
next

シートの1列目から一右の列までを処理

for i = 1 to cells(1, columns.count).end(xltoleft).column
     Debug.Print (i)
next

全シートを処理

Dim ws As Worksheet
For Each ws In Worksheets
    Debug.Print (ws.Name)
Next

全ブックを処理

Dim wb As Workbook
For Each wb In Workbooks
    Debug.Print (wb.Name)
Next

ファイルの書き込み

テキストファイルへ書き込み

DATA = "何かデータ"
'改行コードをLFにするんだったらvblf
' DATA = "何かデータ" & vbLf

Open ファイル名 For Output As #1
    Print #1, DATA
Close #1

テキストファイルへ書き込み(追記)

DATA = "何かデータ"
'改行コードをLFにするんだったらvblf
' DATA = "何かデータ" & vbLf

Open ファイル名 For Append As #1
    Print #1, DATA
Close #1

Excelファイルを開いたり閉じたり

Excelファイルを開く

Workboks.Open "D:\Book1.xlsx"

Excelファイルを読み取り専用で開く

Workbooks.Open FileName:="D:\Book2.xlsx", ReadOnly:=True

'意外と読み取り専用で開きなおすという処理が便利だったりする。
application.DisplayAlerts = False
Workbooks("Book1.xlsx").close
application.DisplayAlerts = True

workbooks.open FileName:="Book1.xlsx", _
    ReadOnly:=True

Excelファイルを閉じる

確認メッセージを出さない、かつ保存説ずに閉じるためには下記処理を実行

    ' 保存していないブックや、OSの設定で拡張子の表示をしていない場合は下記のように拡張子をしてせずに。
    Application.DisplayAlerts = False
    Workbooks("Book1").Close
    Application.DisplayAlerts = True
    


     '上記に該当しない場合は、基本的に拡張子まで指定された名前を使用すること。
    Application.DisplayAlerts = False
    Workbooks("Book1.xlsx").Close
    Application.DisplayAlerts = True

一つずつファイルを開きながらシートにコピー

処理の高速化

描画の停止

処理が終わったら最後にTrueにして、描画するように元に戻すこと

Application.ScreenUpdating = False

自動計算の停止

処理が終わったら最後にxlCalculationAutomaticでもとに戻すこと

Application.Calculation = xlCalculationManual

1行ずつの処理を一括処理

複数セルをいちいち処理してると時間がかかりますので
Rnageオブジェクトを結合して一括処理をすると早くなります。

Dim Rng As Rnage

If Rng Is Nothing Then
   Set Rng = Range("A1:G1")
Else
   Set Rng = Union(Rng, Range("A1:G1"))
End If

その他

エラーを無視

エラーを無視してでも処理を続けたいことがあると思います。そんな時は下記を実行しておきます。

On Error Resume Next


' もとに戻す時は
On Error Goto 0

ループ処理から抜ける場合【continue】

なぜかvbaにcontinueがありません。下記で代用します。

'continueしたいところで
GoTo continue


'continue先に記述
continue:


おわり

dein.vim導入メモ

dein.vimといういものでVIMプラグインを管理するのが流行りらしい。tomlファイルでプラグインを外だしで管理するみたいだけど、面倒なのでvimrcだけで管理しようと思います。

cd /tmp
mkdir /etc/.vim
curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh
sh installer.sh /etc/.vim
  • vimrcこれを追記

インストール後に出力される内容を貼り付ければOK

" Required:
set runtimepath+=/etc/.vim/repos/github.com/Shougo/dein.vim

" Required:
if dein#load_state('/etc/.vim')
  call dein#begin('/etc/.vim')

  " Let dein manage dein
  " Required:
  call dein#add('/etc/.vim/repos/github.com/Shougo/dein.vim')

  " Add or remove your plugins here:
  call dein#add('Shougo/neosnippet.vim')
  call dein#add('Shougo/neosnippet-snippets')
  call dein#add("Shougo/dein.vim")
  call dein#add("Shougo/neocomplete.vim")
  call dein#add("Shougo/neosnippet")
  call dein#add("Shougo/neosnippet-snippets")
  call dein#add("cohama/lexima.vim")
  call dein#add("itchyny/lightline.vim")
  call dein#add("nathanaelkane/vim-indent-guides")
  call dein#add("scrooloose/nerdtree")
  call dein#add("scrooloose/syntastic")
  call dein#add("tomasr/molokai")
  call dein#add("tpope/vim-surround")


  " You can specify revision/branch/tag.
  call dein#add('Shougo/deol.nvim', { 'rev': 'a1b5108fd' })

  " Required:
  call dein#end()
  call dein#save_state()
endif

" Required:
filetype plugin indent on
syntax enable

" If you want to install not installed plugins on startup.
if dein#check_install()
  call dein#install()
endif

"End dein Scripts-------------------------

"
"
" Disable AutoComplPop.
let g:acp_enableAtStartup = 0

" Use neocomplete.
let g:neocomplete#enable_at_startup = 1

" Use smartcase.
let g:neocomplete#enable_smart_case = 1

" Set minimum syntax keyword length.
let g:neocomplete#sources#syntax#min_keyword_length = 3

" Define keyword.
if !exists('g:neocomplete#keyword_patterns')
    let g:neocomplete#keyword_patterns = {}
endif
let g:neocomplete#keyword_patterns['default'] = '\h\w*'

" Plugin key-mappings.
inoremap <expr><C-g>     neocomplete#undo_completion()
inoremap <expr><C-l>     neocomplete#complete_common_string()

" Recommended key-mappings.
" <CR>: close popup and save indent.
inoremap <silent> <CR> <C-r>=<SID>my_cr_function()<CR>
function! s:my_cr_function()
  return (pumvisible() ? "\<C-y>" : "" ) . "\<CR>"
  " For no inserting <CR> key.
  "return pumvisible() ? "\<C-y>" : "\<CR>"
endfunction
" <TAB>: completion.
inoremap <expr><TAB>  pumvisible() ? "\<C-n>" : "\<TAB>"
" <C-h>, <BS>: close popup and delete backword char.
"inoremap <expr><C-h> neocomplete#smart_close_popup()."\<C-h>"
"inoremap <expr><BS> neocomplete#smart_close_popup()."\<C-h>"
"
" Close popup by <Space>.
"inoremap <expr><Space> pumvisible() ? "\<C-y>" : "\<Space>"

" AutoComplPop like behavior.
let g:neocomplete#enable_auto_select = 1

" Shell like behavior(not recommended).
set completeopt+=longest
let g:neocomplete#enable_auto_select = 1
let g:neocomplete#disable_auto_complete = 1
"inoremap <expr><TAB>  pumvisible() ? "\<Down>" : "\<C-x>\<C-u>"

" Enable omni completion.
autocmd FileType css setlocal omnifunc=csscomplete#CompleteCSS
autocmd FileType html,markdown setlocal omnifunc=htmlcomplete#CompleteTags
autocmd FileType javascript setlocal omnifunc=javascriptcomplete#CompleteJS
autocmd FileType python setlocal omnifunc=pythoncomplete#Complete
autocmd FileType xml setlocal omnifunc=xmlcomplete#CompleteTags

" Enable heavy omni completion.
if !exists('g:neocomplete#sources#omni#input_patterns')
  let g:neocomplete#sources#omni#input_patterns = {}
endif
"let g:neocomplete#sources#omni#input_patterns.php = '[^. \t]->\h\w*\|\h\w*::'
"let g:neocomplete#sources#omni#input_patterns.c = '[^.[:digit:] *\t]\%(\.\|->\)'
"let g:neocomplete#sources#omni#input_patterns.cpp = '[^.[:digit:] *\t]\%(\.\|->\)\|\h\w*::'

" For perlomni.vim setting.
" https://github.com/c9s/perlomni.vim
let g:neocomplete#sources#omni#input_patterns.perl = '\h\w*->\h\w*\|\h\w*::'

" Enable snipMate compatibility feature.
let g:neosnippet#enable_snipmate_compatibility = 1

" Tell Neosnippet about the other snippets
let g:neosnippet#snippets_directory='~/.vim/bundle/vim-snippets/snippets'

let g:indent_guides_enable_on_vim_startup = 1
let g:indent_guides_auto_colors = 0
autocmd VimEnter,Colorscheme * :hi IndentGuidesOdd  guibg=red   ctermbg=3
autocmd VimEnter,Colorscheme * :hi IndentGuidesEven guibg=green ctermbg=4

"let g:lexima#default_rules = 1
let g:lexima_enable_basic_rules = 1
let g:lexima_enable_endwise_rules = 1
let g:lexima_enable_newline_rules = 1


let g:molokai_original = 1
let g:rehash256 = 1

ココまで来たら保存して閉じて、何かファイルを開けばプラグインの初回インストールが実行されます。


あとはプラグインごとに必要な設定をvimrcに設定しておけばOK


おわり

最新Firefoxにツリー型タブを導入したら、上部のタブを消す

どうしたものかと思ったらcssで制御できるようでした。
下記サイトを参考にさせてもらいました。

ありがとう!!!

qiita.com


おわり