VBA-5 関数を使う

戻り値のある関数
1.
2.
3.
4.
Function Test() As Integer
    'なんかの処理
    Test = 値
End Function
自分の名前(関数名)に代入するのって、慣れていないせいか、なんだか違和感が。


VBてアドレス渡しがデフォルトなんですね。
知らなかった。
ソースを見直してみると危険なコード書いてました。
関数の中で値を書き換えていなかったので何も起こらなくてすんだことは良かったのですが、逆にそのためにアドレス渡しだということに気付かなかったんですね。

あと、変数を宣言しなくても使えるんですよね。
Cに慣れてしまっているせいか、はっきり言って、宣言しないで変数使うのは怖いです。
変数の綴り間違えても気付かない。
変数の有効な範囲もわからない

宣言しないで変数を使った場合、型はどうなるんですかね?

にこ動 日刊VOCALOIDランキング

日刊VOCALOIDランキング
プログラムで動画を自動生成、自動アップロードしている日刊ランキングです。
ランキングとして、よりも新着紹介として見ています。
時間が約3分と手ごろなのもいいです。


新作チェックしていて「日刊から」というコメントで知りました。
そのコメントを初めて見たときは、
え、日刊? 気は確かか?
と思いましたよ。

おすすめのバックアップソフト

BunBackup
ミラーリング、日時でフォルダ分け、暗号化、圧縮など、いろいろな設定が出来るバックアップソフト

ポータブルHDDを買ったときに、バックアップソフトがついてきたので使ってみたのですが、バックアップしたファイルは独自の形式で1つのファイルにまとめられてしまいました。
バックアップしたファイルの一部だけをリストア(バックアップファイルを元に戻すこと)したくても、バックアップしたファイル全てを元に戻すので無駄な時間がかかってしまいます。

このBunBackupならファイル構造そのままの形でバックアップできるので、必要なファイルだけ元に戻すことが出来ます。

VBA-4 配列の初期化

これまでずっとC言語でプログラミングしてきたので、
文字列 = char型の配列
という認識だったのですが、VBには文字列を扱うString型があります。
つまり、文字列の扱いが違うわけです。


セルから取得した文字列に含まれている、ある文字を別の文字に置換する必要がありました。
置換そのものはReplace関数を使えばいいです。
配列の値の置換
1.
2.
3.
4.
5.
6.
7.
' nは置換対象の文字の数
' chは置換対象の文字の配列
' swは置換する文字の配列
For i = 0 To n
    rename = Replace(name, ch(i), sw(i))
    name = rename
Next l

が、問題は置換する対象の文字が多いこと。
VBAでは配列の初期化に
Dim ar As String = {"a", "b", "c"}
みたいな書き方ができないのです。

でも、Variant型とArray関数を使えば次のように配列の初期化ができます。
正確には、配列を値として持つVariant型の変数、らしいです。
Variant型というのは簡単に言うと、何でも入る変数。
配列の初期化
1.
2.
3.
4.
5.
Sub tes()
    Dim ar As Variant
    ar = Array("a", "b", "c", "d", "e", "f", "g")
    MsgBox UBound(ar)
End Sub

でも、文字列はStringに入れたいです。整数ならIntegerに入れたいです。
始から入れるデータの型はわかっているんだから、その型で宣言したいです。

ちなみに、この方法で初期化した場合、配列の要素の数を表すLengthプロパティは使えないみたいです。
要素数が知りたいときは、添え字の上限を返すUBound関数で取得できます。

そういやあ、宣言のときに指定した数字は要素の添え字の最大値なんですね。
C言語みたいに要素数となるわけじゃあないみたいです。

C
int a(3);
// a(0)~a(2)の3つ


VB
Dim a(3) As Integer
' a(0)~a(3)の4つ

にこちゅうに認定されました

子猫は独り遥か雪に埋もれてわたしを見つめる
投稿日は12/31。全く知りませんでした。

ソニック☆サイクラー
ちゃりんこダッシュ!

眠り姫
ピアノの雰囲気が好きです。

My Brand New Love
aan aan


研究室内で、私はそういう人、となっていました。

VBA-3 セルに名前を付ける

Excelの画面左上に「A1」とか今選択しているセルの名前が表示される窓があります。
ここをクリックして文字を入力すると、そのセルに自分で名前を付けることができます。

今度はこれを自動化します。


セルA5に「せる」と名前を付ける
1.
2.
3.
4.
'マクロの記録そのまま
Sub setName()
    ActiveWorkbook.Names.Add name:="せる", RefersToR1C1:="=sheet1!R5C1"
End Sub

変数を使って書き換え
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Sub setName()
    Dim i, j As Integer
    Dim str As String    'ワークシートの名前
    Dim name As String   'セルにつける名前
    str = ActiveSheet.name
    i = 5
    j = 1
    name = "せる"
    ActiveWorkbook.Names.Add name:=name, _
        RefersToR1C1:="=" & str & "!R" & i & "C" & j
End Sub

文字列の扱いが力任せな気がしますが、ほかの方法を思いつかなかったんです。
でも、&で文字列がつなげるのは便利ですね。

自分で付けた名前(ここでは「せる」)を消す
1.
2.
3.
Sub delN()
    ActiveWorkbook.Names("せる").Delete
End Sub

全ての名前を消す
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Sub delN()
    Dim name As String
    Dim i As Integer
    i = 1
    For Each nm In ActiveWorkbook.Names
        name = nm.NameLocal
        ActiveWorkbook.Names(name).Delete
        i = i + 1
    Next
End Sub


ループなんかを使ってたくさんのセルを処理させるとき、
セルを選択→処理
を繰り返すため画面が下や横に高速で流れていきます。

別に、流れていく画面を見る必要がないなら、マクロ実行中画面を更新しないようにするといいです。
画面更新の一時停止
1.
2.
3.
4.
5.
6.
7.
8.
9.
Sub macro()    
    '画面を更新しない
    Application.ScreenUpdating = False

    'なんかの処理

    '画面を更新する
    Application.ScreenUpdating = True
End Sub

きょうはもうつかれた ~そつろんはっぴゅおかい~

卒論の発表会がありました。
で、そのとき卒論も同時に提出するので、ここ数日間は発表用の資料を作りながら卒論も書いてました。

発表の資料を作るだけでなく発表の練習もしなければならないわけで、
基本的には、発表でどのような内容で、どのような順序で説明するのかを考えながら資料を作ってゆくのですが、今回は先輩が企業への報告会用に作ったものを卒論発表用に作り直すという形だったので作ること自体は楽でした。
ただ、話す内容をほとんど考えていないので、何を言えばいいのかが全くわからない。
とりあえず、企業への報告会での先輩の発表を思い出しながらしゃべってみたのですが、難しい。

発表時間は10分くらいです。
説明すべきことが多すぎて何を、どの順番で言えばいいのかが全くわかりません。

発表を先生や先輩に聞いてもらい、意見を聞きながら修正しました。


で、本番は問題なく発表できました。


ようやく発表が終わって、楽になったーと喜びたいのですが、これで全て終わりというわけではなく、これから卒論の修正をしなければならなりません。

それでも、一段落ついて、楽になったーと喜びたい。

それなのに会社の読書感想文を出さなければならず、もう、いや。
提出期限が、郵送して会社に届いた時点での日付となっていて、明日出さないと間に合いそうにないのです。
もう、いや、ねむい、つかれたよぅ

VBA-2 セルからリンクを張る

マクロの記録でリンクを張るコードを取得
1.
2.
3.
4.
5.
6.
7.
8.
'セルA1にリンクを設定する
Sub setLink()
    Cells(1, 1).Select
    ActiveSheet.Hyperlinks.Add _
        Anchor:=Selection, _
        Address:="<a href="http://tekitou.link" target="_blank" rel="noopener">http://tekitou.link", _
        TextToDisplay:="表示する文字列"
End Sub

定数部分を変数に変更
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
'アドレスはセルに記述してあるものとする
Sub setLink()
    Dim i, j As Integer
    Dim link As String
    
    i = 1
    j = 1
    Cells(i, j).Select
    link = Cells(i, j).Value
    ActiveSheet.Hyperlinks.Add _
        Anchor:=Selection, _
        Address:=link, _
        TextToDisplay:=link
End Sub

後は、i,jをループなんかで変化させればいいです。

リンクを解除する
1.
2.
3.
4.
Sub delLink()
    Sheets(1).Activate       'シート1を選択
    Cells.Hyperlinks.Delete  'シート内の全てのリンクを解除
End Sub

リンクを解除するとセルの枠やら書式やらもいっしょに解除されます。
書式は、文字色と下線を解除するため仕方がないと思いますが、なんで、枠も?


オブジェクト指向とか、全く理解できていないので、プロパティとか、メソッドとか、クラスとか、どういったものかのかが全くわかりません。

フォルダ構造のみをコピーする

フォルダ構造だけをコピーしたいときがあります。
普通にコピーすると中身も一緒にコピーされるので時間がかかるし、コピーした後で中身を消す必要があるので面倒です。

そんなときはコマンドプロンプト。
xcopy コピー元 コピー先 /e /t

オプションの
/e は空のサブディレクトリもコピーする
/t はディレクトリのみコピーする

てかこれ、ジャンルはプログラム?
まあ、いいや。

其は誰が涙か(ソハ タガ ナミダカ)

その日雪が降り
世界を白く染める

降り積もるその雪は
世界がいつもと違うことを物語る

電車

はしるはしる電車がはしる
かたんことんと電車がはしる
十人十色のおもい乗せ

にこ動 VOCALOID-SONG

わPさんのMEIKOが歌うSwallowtail Butterfly ~あいのうた~ (原曲はこっち)
最近のお気に入りです。

最近、リンちゃんの歌声が普通に聞こえるようになったのですが、
それはきっと、作者さんの技術が上がっているからです。
きっと。

Catch the Windとか
Promiseとか
TからSへとか
mirrorとか
ONPAとか
リンリンリンってしてくりん♪
なんかもいい感じです。

りんりん りんりん りんりん りんりん りんりん りんりん みかん♪