文系seの備忘録

Excelの改行でひたすらスペースを打っていた機械音痴の文系seが日々の備忘録を綴る。

【Excelv VBA】 VBAにおける値渡しと参照渡し


<値渡し、参照渡しって?>

・関数の渡しかたは大きく分けて「値渡し」「参照渡し」の2種類ある。 


※ 言語によっては(JavaC#Python等)上記以外に「参照の値渡し」と分類されることもある。
   ポインタ渡しとも言ったりする。オブジェクトを渡す際に使われることが多い




・「値渡し (call by value)」


変数の値をコピーして関数に渡す方法。


例えば、
1.呼び出し元で文字列を宣言
2. 1を引数に、文字列を変更する関数を呼び出し
3. 2の結果をメッセージボックスで表示

というソースを作って違いを確認してみます。





以下のような文字列を宣言して・・・

str = "もとの文字です(*`▽´*)"

値渡しの関数に渡します。

Call CallByVal(str)


f:id:ron623:20180802163050p:plain

↑のように、変数はコピーして関数に渡されます。


f:id:ron623:20180802163321p:plain
そして、渡された関数にて値がかきかえられます。・・・関数内では、ですよ!


さて、関数内で文字列が色々と書き換えられて、呼び出し元に戻ってくるのは・・・
コピーした変数です。もとの値は何も変わっていません。

f:id:ron623:20180802164128p:plain


(全文)





・「参照渡し (call by reference)」


変数の参照情報を渡す方法。
先ほどの値渡しとは異なり、変数の在りかを渡します(変数を共有するといった感じ)ので、変数の中身を書き換えれば呼び出し元も変更されます。




先ほどと同じく、文字列を変更する関数を呼び出します。

f:id:ron623:20180802170927p:plain

この際、文字列がメモリのどこに格納されているかが情報として渡されます。





上記の図では、文字列は1001番地に格納されていることが分かります。


そして、変数そのものが書き換わりますので
f:id:ron623:20180802171518p:plain
✳︎すみません、、関数名がvalのままになってしまっています。refに読み替えて見てみてください


出力されるメッセージは変更された文字列となります。
f:id:ron623:20180802172129p:plain


(全文)







おまけ1
値渡しでもfunction関数を使用して戻り値を受け取れば変更値を受け取れる


おまけ2
javaの参照渡し(だいーーーぶ昔に書いた記事)
samooooon.hatenablog.com
javaのstring型は参照渡しだけど、呼び出し元で値を変えられない(immutable)

【Excelv VBA】 RangeとCellsって何が違うの?


この記事にて、セルに値を入力する簡単な例を書きましたが、

samooooon.hatenablog.com

この例では「Range」を使用してセル入力を行いました。

ただ、セル入力の方法にはもう一つあります。

Cells」です。


このふたつって何が違うんでしょう。
・・・私もよくわかってないので、グーグル先生に教えてもらいつつ違いを整理してみます。






■ Range

まずRange。


1. 表や枠組みが決まってるときに使う


英語の意味の通り、範囲を指定したり、設定する位置が決まっているときに使うことが多いようです。
例えば以下の伝票のように枠組みが決まってるような場合

f:id:ron623:20180701114032p:plain

こういう、毎回おんなじテンプレで出すようなものは値のみ変わりますので
Rangeを使用して変数のみ変えてあげればOKそうです。



2.範囲が複数セルにまたがる際に使う

MicrosoftVBA リファレンスによると、範囲を指定すると書いてあったのはRangeだけでした。
名前の通り、忠実に使用すれば問題ないってことですね。






つづいてCells。

■ Cells



1.単一セルを変数で指定して参照するときに使う


以下に、ファイルからテキストを読み込んでセルに書き出すサンプルを記載します。

Sub Sample()
  Dim buf As String, tmp As Variant, n As Long
  Open "C:\Data\Sample.csv" For Input As #1
    Do Until EOF(1)
      Line Input #1, buf
      Rem カンマの位置でデータを区切る
      tmp = Split(buf, ",")
      n = n + 1
Rem セルにデータを入力
Cells(n, 1).Value = tmp(0)
Cells(n, 2).Value = tmp(1)

    Loop
  Close #1
End Sub


→ 上記の場合、Rangeのときと違って伝票のきまった枠に書き出すわけでなく、読み込んだデータによって中身は様々ですので
変数で指定してあげるのが適切です。







(補足)

msdnによると
・Worksheet.Range プロパティ (Excel)
ワークシートのすべてのセル (現在使用されていないセルも含む) を表す Range オブジェクトを返します。
・Worksheet.Cells プロパティ (Excel)
ワークシートのすべてのセル (現在使用されていないセルも含む) を表す Range オブジェクトを返します。

→ Cellsオブジェクトっていうのはないんですよね。

f:id:ron623:20180701121428p:plain

どっちにも「セル」とあるように、普段はあまり意識せずセルの入力はRange、Cellsどちらでもできるかと思います。
ただ、パフォーマンスや用途を考えるようになったときに、考慮するとよいかと思われます。




<参考>
msdn
https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/worksheet-range-property-excel

https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/worksheet-cells-property-excel

【Excel VBA】 VBAってなに?マクロってなに?どうやんの?


EXCEL VBAってなに?
Visual Basic for Applications の略。
Microsoft Officeに含まれる拡張機能であり、ExcelとかWordで実行できる言語。(※ VBVisual BasicというMicrosoft社の開発言語で、VBAはOfficeで動くように改良されたもの)




■ マクロってなに?
関連する複数の操作や手順、命令などを一つにまとめ、必要に応じて呼び出すことができるようにする機能のこと。
マクロとVBAが混同されがちですが、ExcelVBAを使用して自動化したものって考えておく程度でいいと思います



Excelを開いて、「表示」タブの一番右のほうに「マクロ」があるので押してみると、、

f:id:ron623:20180701095907p:plain

「マクロの表示」と出てきます。
これがVBAという言語を用いて作られたマクロの一覧となります!





試しにマクロを作成してみましょう!!

「マクロ名」に名前を入れて、「作成」を押下します。

f:id:ron623:20180701103113p:plain




すると、マクロの編集画面が開きます。


f:id:ron623:20180701103454p:plain

なんか、勝手に、標準モジュールっとこに「Module1」という名前でマクロが作成されましたね。
基本的には標準モジュールにマクロを作成すると考えておけばOKです。
(こうしておけば、すべてのシートに対してマクロが有効になりますが、もし、シート1に対するマクロであったら、
シート2に対して実行しても、無効となってしまいます。)



以下のようなコードを書いて、実行してみます。
f:id:ron623:20180701104800p:plain



追加したのは以下の二行です。

Rem A1セルに値を入力する
Range("A1") = "おっととっと夏だぜ"

1行目は「コメント」です。処理を説明するために書くもので、実行はされません。
2行目は、エクセルシートの"A1"に文字を入力する処理です。




早速実行してみましょう!

マクロの編集画面の上部にある、再生ボタンを押す(F5キー)か、
f:id:ron623:20180701105428p:plain




編集画面をいったんとじて、「表示」タブの一番右の「マクロ」を押して作成した「test1」を実行します。
f:id:ron623:20180701105528p:plain





すると、A1に文字が入力されました。
f:id:ron623:20180701105715p:plain


めでたしめでたし。

このようにしてマクロを作成し、エクセルをはじめとするOffice作業の効率化をはかっていきます。

EXCEL VBA マクロを使ってみよう

気づけばSE生活も5年を過ぎました。

「ろくにパソコンをいじれない問題児な女の子が入ってきたぞ!」

と話題になったのも過去のおはなし。



・・・ええと、個人的な話はこのへんにして、しばらくExcelVBAプログラミングについて
触れていこうと思っています!




というのも、職場の後輩に教える機会があって。。
自分自身あまりやったことがなく改めて一から勉強しようと思ったので
記録に残そうと思いここに残していきますね~。



私が初めてVBAに触れたとき、どっから動かせばいいのかもわかんなかったし、
概念的なものも意味不明で、手探り状態でしたので
いい機会なので基本的なところからじっくりおさらいしていこうと思います!

色んなツールまとめ(随時更新)

日々の作業でよく使うツールをまとめておきます。



■ オフィス系

サクラエディタ
http://sakura-editor.sourceforge.net/download.html
テキストエディタgrep機能というファイルをまたいだ検索機能が便利。

検索したいディレクトリ、単語などを入れると
f:id:ron623:20160928160903p:plain

以下のように検索結果が出てくる。
f:id:ron623:20160928161144p:plain
詳細を見たい検索結果をダブルクリックすると、そのファイルの該当箇所にアクセスすることが出来る。

あと、色をカスタムできる。
f:id:ron623:20160928160904p:plain


・Cassava Editor
http://forest.watch.impress.co.jp/library/software/cassavaedit/
CSVエディター

openoffice
http://forest.watch.impress.co.jp/library/software/openoffice/
Microsoft Office」互換の無料のオフィス統合環境。
表計算、ワード、パワポと一通りそろっている。でもマイクロソフトのファイルを開くと互換性があるとはいえ
たまに壊れるので要バックアップ。

・職印くん
http://www.vector.co.jp/soft/win95/util/se171969.html
電子印鑑作成ツール



■ 接続ツール

・Tera Term(テラターム)
Windowsから他の端末に接続するときに使うソフト。
寺西さんがつくったからテラターム
http://forest.watch.impress.co.jp/library/software/utf8teraterm/




■プログラミング

sql developer
http://www.oracle.com/technetwork/jp/developer-tools/sql-developer/downloads/index.html
GUIoracleを操作できるツール。

eclipse
http://mergedoc.osdn.jp/
開発環境。java以外の他言語の開発にも使えます。
宣言に飛んだり、検索機能が充実していたり、インデントを一発で調整できたりと便利。

インストーラーの解凍にlhaplusを使うと中身が壊れることがあるので
その際は7-Zipを使用してみてください。
http://forest.watch.impress.co.jp/library/software/7zip/

WinMerge
http://forest.watch.impress.co.jp/library/software/winmerge/
ファイル比較。




仮想マシン


VirtualBox
https://www.virtualbox.org/wiki/Downloads

VMware
http://www.vmware.com/jp/products/player.html
ダウンロード > 無償製品 > Workstation Player

インストーラーをポチポチ押してくだけで仮想環境が構築できて簡単。
f:id:ron623:20160928161856p:plain

jenkinsからの実行時、意図したrubyのバージョンで実行されない(最新バージョンで実行されてしまう)


■ 問題
実行するノードに、指定しているrubyよりも新しいバージョンが入っている場合そのバージョンで実行されてしまう。



まず、実行するノードに直接はいって状態の確認。


C:\Users\guest>PATH
C:\Windows\system32;・・・(略)・・・C:\Ruby22-x64\bin;C:\Ruby23-x64\bin;

⇒ このマシンにはRuby2.3も入っている。


Rubyのバージョンは

C:\Users\guest>ruby -v
ruby 2.2.4p230 (2015-12-16 revision 53155)

2.2が実行されるように設定されている。
なので、マシンから直接たたけば2.2で実行される。


しかし、jenkinsでビルドすると2.3で実行されてしまう・・・・。




■ 原因

はっきりとは特定できてない。
けど、、jenkins > ノード > 環境変数にRuby2.3のパスもばっちり書かれていてパスが通った状態になっているので
これが原因で最新を見て実行されているのかな。。



■ 対策

ビルドするジョブの jenkinsの設定>スクリプト で実行したいrubyのバージョン以外を除外したパスをset path ~で設定する

set path=C:\Windows\system32;・・・(略)・・・C:\Ruby22-x64\bin;

「C:\Ruby23-x64\bin;」を除外してわざわざパスが通らないようにしてから実行するという対策をとりました。

これで2.2で動くようになりました。




・・・こんなことしなくても解決する方法があるはずですorz

WebdriverからFirefox起動時に"Unable to connect to host"エラー


最新のFirefoxに更新したら「Unable to connect to host」エラーが出た。



■ 原因

WebDriverのバージョンがFirefoxのバージョンに対応していないのが原因。



■ 対応

1.Firefoxの自動バージョンアップは設定で無効にしておく


2.FireFoxESR版を使用する

ESR版というのは「Extended Support Release」という法人向けの延長サポート版で、
最新機能が反映されるのは通常版に投入されてから数開発サイクル後になるが
安全性やセキュリティ面は考慮されているもの。

以下からダウンロードする

Web ブラウザ Mozilla Firefox — 各国語版の Firefox Extended Support Release をダウンロード — Mozilla


法人向けって書いてあるけど個人でダウンロードしても問題ありません。


最新である必要がなければESR版をおすすめします。