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

2011年6月4日土曜日

VBAにおける分岐とループ

分岐とループをテーマに、お年玉プログラムを作成。


からの〜



仕様は以下な感じ。

  • 名前をユーザーに入力させる。
  • 次に年齢を入力させる。
  • お年玉の金額が表示される。
  • 入力がなかった場合は無限に質問を繰り返す。
  • 一行ずつの処理



つかった構文などの紹介はプログラム内にコメントとして書きました。


 Sub Otoshidama()

 'とりあえずA2からスタート。
 '指定したセルに飛ぶには[指定したいセル].Select
 [A2].Select
    
    '現在のセルが空セルになるまでループを回す
    'if を始めたら必ず最後はend ifでif文を閉じる
    Do Until ActiveCell.Value = ""
         If (ActiveCell.Value <> "") Then
             ActiveCell.Offset(1, 0).Select
         End If
    Loop
    
    '----名前入力部分------
    
    '変数定義
    Dim name As String
    
    '値が入力されるまで質問を続ける
    '<>は「〜ではない」、""は空文字を示す。
    Do Until ActiveCell.Value <> ""
    
        'ユーザーに入力させるウィンドウはInputBox
        name = InputBox("お名前は?", "質問その1", "")
         If (name <> "") Then
             ActiveCell.Value = name
         End If
    Loop
    
    
    '----年齢入力部分------
    
    '移動して年齢入力にうつる
    ActiveCell.Offset(0, 1).Select
    
    '変数定義
    Dim ageString As String
    Dim age As Integer
    
    '値が入力されるまで質問を続ける
    Do Until ageString <> ""
        ageString = InputBox("年齢は?", "質問その2", "")
    Loop
    
    '文字列を整数型に変換し、0以上ならセルに入力させる
     age = CInt(ageString)
     If (age >= 0) Then
        ActiveCell.Value = age
    End If
    
    
    '----お年玉金額判定&入力部分------
    
    '移動して年齢入力にうつる
    ActiveCell.Offset(0, 1).Select
    
    If (age < 5) Then
         ActiveCell.Value = 500
    ElseIf (age < 10) Then
        ActiveCell.Value = 1000
    ElseIf (age < 15) Then
         ActiveCell.Value = 5000
    Else
        ActiveCell.Value = "自分で働け"
        
    End If
    
 End Sub


ちなみに、ifの中の条件はカッコでくくってても、カッコが無くてもあっても大丈夫みたいです。
VBAでメソッド分け的なことはどうするんでしょ。。。読みにくくて仕方ない(長いから)。

勉強します。

2011年5月26日木曜日

Excel VBAで文字列の結合

Excel VBAを使って、文字列の結合を行う。

例えば何かのテストをしたいとき。

SQL文やその他もろもろの長い命令文をいろんな変数で試したいとき、
コピペして、""の間を消去しては文字を埋め、また次行にいって""の間を消去しては文字を埋め。。。では疲れる。
なので、こんなものがあれば、ちょっとでも使えるかなと思って、書いてみた。あとはもちろん、VBAの練習も兼ねて。

<サンプル画面>
これが元々の表。今回は、自分で入れ替えたい単語は2語にして、それらを決まった文章に当てはめたものを右側に書き出していく。



結果はこちら。こんなかんじなのをつくりました。




今回はそこまで複雑ではないので、一気に載せようかしら。

Sub 結合()

    '文字列の定義
    Dim s As String
    Dim t As String
    Dim r As String
    
    s = "私の名前は"
    t = "です。"
    r = "歳です。"
    
    'C2セルを選択する
    Cells(2, 3).Select
    
    '年齢が空欄になっている行まで処理を続ける
    Do Until ((ActiveCell.Offset(0, -1).Value = ""))
        With ActiveCell
    
      '名前と年齢と日本語を結合する(演算子は「+」or「&」)
      '「+」は数値加算の意味が含まれ紛らわしいため「&」で統一
        .Value = s & .Offset(0, -2).Value & t & .Offset(0, -1) & r
        .Offset(1, 0).Select
        End With
    Loop
End Sub



そして完成と。

ちなみに、今回試しに「デバッグ機能」も使ってみた。



Eclipseと同じ感じで「ステップイン」「ステップオーバー」でデバッグができました。

2011年5月21日土曜日

簡単なマクロ構築とボタン化

まずは簡単なマクロを組むことから始めた。

どんなものかっていうと、


こんなふうな、to doリストがあったとして、「思いついた日」というところにカーソルを合わせたまま、ボタンを押すと。。。


「思いついた日」には今日の日付、「終了予定日」には2週間後の日付が自動的に設定される。というもの。

では、ちょっとずつコメントも含めて、ソースコードを紹介。

まずは関数定義。

'「思いついた日設定」という関数を定義する
Sub 思いついた日設定()
    
'関数を終了する
End Sub


次に、ちょっとソースコードを省略する感じで書いてみる。
ActiveCellとは、現在カーソルが合っているセルのこと。

With ActiveCell

End With


では中身を埋めていく。

現在の選択しているセルに日付を入れる。

'ActiveCell →「現在選択しているセル」 
        'Value→セルに値(数値や文字列)
        'Date→日付関数
        .Value = Date
        .VerticalAlignment = xlVAlignCenter
        .Font.Size = 14


思いついた日と同じ行にある「終了予定日」のセルに、思いついた日から14日後の日付を設定。

'Offset(m,n)はオブジェクトからみて、
        'm行下、n行右のセルを対象にするという意味
        Set cel = .Offset(0, 2).Range("A1")

        ' 色は赤に設定
        cel.Font.ColorIndex = 3
        cel.Font.Size = 14
        cel.VerticalAlignment = xlVAlignCenter
        cel.Value = Date + 14


以下、全体のソースコード。


Sub 思いついた日設定()

    With ActiveCell

        .Value = Date
        .VerticalAlignment = xlVAlignCenter
        .Font.Size = 14
    
        Set cel = .Offset(0, 2).Range("A1")
        cel.Font.ColorIndex = 3
        cel.Font.Size = 14
        cel.VerticalAlignment = xlVAlignCenter
        cel.Value = Date + 14
        
    End With
 
End Sub



さて、このソースコードは命令だけを書いたもの。ボタンに組み込むには、別作業が必要。
excel2010や2007なら、

「開発」→「フォームコントロール」→「ボタン」

で、ボタンを設定。マクロの登録について、ウィンドウが自動で開くので、さきほど自分が書いたマクロを選択すれば完成。

*デフォルトでは、開発メニューはないはず。以下のページ参照。
Excel2010でコントロールツールボックスはどこ