2013年1月23日水曜日

追加課題(1/23)

シート「6月度」(販売一覧)の販売データを入力するプログラムにおいて,キャンセルボタンを押すことで処理を中断できるようにせよ.
Sub 入力()
    Dim hiduke As String
    ActiveWindow.NewWindow
    ActiveWindow.NewWindow
    Windows.Arrange ArrangeStyle:=xlTiled
    Windows("第6章.xlsm:2").Activate
    Sheets("得意先リスト").Select
    Windows("第6章.xlsm:1").Activate
    Sheets("商品リスト").Select
    Windows("第6章.xlsm:3").Activate
    If Range("C6").Value = "" Then
        Range("C6").Select
    Else
        Range("C5").Select
        Selection.End(xlDown).Select
        ActiveCell.Offset(1, 0).Select
    End If
    Do While ActiveCell.Offset(0, -1).Value <> ""
        
        hiduke = InputBox("日付を入力してください" & Chr(13) & "日付入力を終了する場合にはキャンセルボタンを押してください", , , 200, 200)
        If hiduke = "" Then
            MsgBox "入力をキャンセルします(1)"
            Exit Do
        Else
            ActiveCell.FormulaR1C1 = hiduke
            ActiveCell.Offset(O, 1).Range("A1").Select
                
            hiduke = InputBox("得意先コードを入力してください", , , 200, 200)
            If hiduke = "" Then
                MsgBox "入力をキャンセルします(2)"
                Exit Do
            Else
                ActiveCell.FormulaR1C1 = hiduke
                ActiveCell.Offset(O, 2).Range("A1").Select


                hiduke = InputBox("商品コードを入力してください", , , 200, 200)
                If hiduke = "" Then
                    MsgBox "入力をキャンセルします(3)"
                    Exit Do
                Else
                    ActiveCell.FormulaR1C1 = hiduke
                    ActiveCell.Offset(O, 4).Range("A1").Select

                    hiduke = InputBox("数量を入力してください", , , 200, 200)
                    If hiduke = "" Then
                        MsgBox "入力をキャンセルします(4)"
                        Exit Do
                    Else
                        ActiveCell.FormulaR1C1 = hiduke
                        ActiveCell.Offset(1, -7).Range("A1").Select
                    End If
                End If
            End If
        End If
    Loop
    Windows("第6章.xlsm:2").Activate
    ActiveWindow.Close
    Windows("第6章.xlsm:1").Activate
    ActiveWindow.Close
    ActiveWindow.WindowState = xlMaximized
End Sub

2013年1月16日水曜日

追加課題(1/16)

シート「商品リスト」において,商品を追加する際に使用する対話的なプログラムを作成せよ.
方針:InputBox関数を利用.追加課題(12/28)を参考に,商品リストの最終行に移動し,そこから入力を開始.入力したセルの周囲に罫線を引く.

1.商品リストの最終行左端に移動
Sub 商品追加()
    Range("B5").Select
    Do While Not (ActiveCell.Value = "")
        ActiveCell.Offset(1, 0).Select
    Loop
End Sub

2.InputBoxを実行し,ユーザーが入力した商品コードを受け取る
Dim syouhinCode As String
syouhinCode = InputBox("商品コードを入力してください", "商品追加", , 100, 100)

3.商品コードをセルに書き込む
ActiveCell.Value = syouhinCode

4.セルの周囲に罫線を引く
ActiveCell.BorderAround ColorIndex:=1

5.一つ右のセルに移動
ActiveCell.Offset(0, 1).Select

(2~5を繰り返す)

6.完成!
6-1.素直に繰り返した場合
Sub 商品追加()
    '表の最終行に移動
    Range("B5").Select
    Do While Not (ActiveCell.Value = "")
        ActiveCell.Offset(1, 0).Select
    Loop
    '商品コードを入力
    Dim syouhinCode As String
    syouhinCode = InputBox("商品コードを入力してください", "商品追加", , 100, 100)
    ActiveCell.Value = syouhinCode
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
    '商品名を入力
    syouhinCode = InputBox("商品名を入力してください", "商品追加", , 100, 100)
    ActiveCell.Value = syouhinCode
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
    '色を入力
    syouhinCode = InputBox("色を入力してください", "商品追加", , 100, 100)
    ActiveCell.Value = syouhinCode
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
    '単価を入力
    syouhinCode = InputBox("単価を入力してください", "商品追加", , 100, 100)
    ActiveCell.Value = syouhinCode
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
    '輸入国を入力
    syouhinCode = InputBox("輸入国を入力してください", "商品追加", , 100, 100)
    ActiveCell.Value = syouhinCode
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
    '入荷状況を入力
    syouhinCode = InputBox("入荷状況を入力してください", "商品追加", , 100, 100)
    ActiveCell.Value = syouhinCode
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
End Sub

6-2.データの受付を最初に行い,まとめて書き込みを行う場合
Sub 商品追加()
    '表の最終行に移動
    Range("B5").Select
    Do While Not (ActiveCell.Value = "")
        ActiveCell.Offset(1, 0).Select
    Loop
    
    '商品コードを受付
    Dim syouhinCode As String
    syouhinCode = InputBox("商品コードを入力してください", "商品追加", , 100, 100)
    '商品名を受付
    Dim syouhinName As String
    syouhinName = InputBox("商品名を入力してください", "商品追加", , 100, 100)
    '色を受付
    Dim syouhinColor As String
    syouhinColor = InputBox("色を入力してください", "商品追加", , 100, 100)
    '単価を受付
    Dim syouhinTanka As String
    syouhinTanka = InputBox("単価を入力してください", "商品追加", , 100, 100)
    '輸入国を受付
    Dim syouhinYunyuu As String
    syouhinYunyuu = InputBox("輸入国を入力してください", "商品追加", , 100, 100)
    '入荷状況を受付
    Dim syouhinNyuuka As String
    syouhinNyuuka = InputBox("入荷状況を入力してください", "商品追加", , 100, 100)
    
    '商品コードを書込
    ActiveCell.Value = syouhinCode
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
    '商品名を書込
    ActiveCell.Value = syouhinName
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
    '色を書込
    ActiveCell.Value = syouhinColor
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
    '単価を書込
    ActiveCell.Value = syouhinTanka
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
    '輸入国を書込
    ActiveCell.Value = syouhinYunyuu
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
    '入荷状況を書込
    ActiveCell.Value = syouhinNyuuka
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
End Sub

6-3.二次元配列を用いてデータを格納した場合
Sub 商品追加()
    '表の最終行に移動
    Range("B5").Select
    Do While Not (ActiveCell.Value = "")
        ActiveCell.Offset(1, 0).Select
    Loop
    
    Dim shouhin(5, 1) As String
    shouhin(0, 0) = ""
    shouhin(0, 1) = "商品コード"
    shouhin(1, 0) = ""
    shouhin(1, 1) = "商品名"
    shouhin(2, 0) = ""
    shouhin(2, 1) = "色"
    shouhin(3, 0) = ""
    shouhin(3, 1) = "単価"
    shouhin(4, 0) = ""
    shouhin(4, 1) = "輸入国"
    shouhin(5, 0) = ""
    shouhin(5, 1) = "入荷状況"
    
    '商品コードを受付
    shouhin(0, 0) = InputBox("商品コードを入力してください", "商品追加", , 100, 100)
    '商品名を受付
    shouhin(1, 0) = InputBox("商品名を入力してください", "商品追加", , 100, 100)
    '色を受付
    shouhin(2, 0) = InputBox("色を入力してください", "商品追加", , 100, 100)
    '単価を受付
    shouhin(3, 0) = InputBox("単価を入力してください", "商品追加", , 100, 100)
    '輸入国を受付
    shouhin(4, 0) = InputBox("輸入国を入力してください", "商品追加", , 100, 100)
    '入荷状況を受付
    shouhin(5, 0) = InputBox("入荷状況を入力してください", "商品追加", , 100, 100)
    
    '商品コードを書込
    ActiveCell.Value = shouhin(0, 0)
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
    '商品名を書込
    ActiveCell.Value = shouhin(1, 0)
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
    '色を書込
    ActiveCell.Value = shouhin(2, 0)
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
    '単価を書込
    ActiveCell.Value = shouhin(3, 0)
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
    '輸入国を書込
    ActiveCell.Value = shouhin(4, 0)
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
    '入荷状況を書込
    ActiveCell.Value = shouhin(5, 0)
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
End Sub

6-4.プログラム内の同じ処理を行う部分をまとめた場合
Sub 商品追加()
    '表の最終行に移動
    Range("B5").Select
    Do While Not (ActiveCell.Value = "")
        ActiveCell.Offset(1, 0).Select
    Loop
    
    Dim shouhin(5, 1) As String
    shouhin(0, 0) = ""
    shouhin(0, 1) = "商品コード"
    shouhin(1, 0) = ""
    shouhin(1, 1) = "商品名"
    shouhin(2, 0) = ""
    shouhin(2, 1) = "色"
    shouhin(3, 0) = ""
    shouhin(3, 1) = "単価"
    shouhin(4, 0) = ""
    shouhin(4, 1) = "輸入国"
    shouhin(5, 0) = ""
    shouhin(5, 1) = "入荷状況"

    'データの受取
    Dim i As Integer
    For i = 0 To 5
        shouhin(i, 0) = InputBox(shouhin(i, 1) + "を入力してください", "商品追加", , 100, 100)
    Next i
    
    'データの書込
    Dim j As Integer
    For j = 0 To 5
        ActiveCell.Value = shouhin(j, 0)
        ActiveCell.BorderAround ColorIndex:=1
        ActiveCell.Offset(0, 1).Select
    Next j
End Sub

6-5.ループを1つにまとめた場合
Sub 商品追加()
    '表の最終行に移動
    Range("B5").Select
    Do While Not (ActiveCell.Value = "")
        ActiveCell.Offset(1, 0).Select
    Loop
    
    Dim shouhin(5, 1) As String
    shouhin(0, 0) = ""
    shouhin(0, 1) = "商品コード"
    shouhin(1, 0) = ""
    shouhin(1, 1) = "商品名"
    shouhin(2, 0) = ""
    shouhin(2, 1) = "色"
    shouhin(3, 0) = ""
    shouhin(3, 1) = "単価"
    shouhin(4, 0) = ""
    shouhin(4, 1) = "輸入国"
    shouhin(5, 0) = ""
    shouhin(5, 1) = "入荷状況"

    Dim i As Integer
    For i = 0 To 5
        shouhin(i, 0) = InputBox(shouhin(i, 1) + "を入力してください", "商品追加", , 100, 100)
        ActiveCell.Value = shouhin(i, 0)
        ActiveCell.BorderAround ColorIndex:=1
        ActiveCell.Offset(0, 1).Select
    Next i
End Sub

追加課題(1/15)

色検索プログラムをIf文のみで実装せよ.
(P168 MsgBox関数の戻り値参照)
Sub 色検索()
    Dim iro As Integer
    iro = MsgBox("ワインの色は赤ですか?", vbYesNo)
    If iro = 6 Then
        Range("B5").Select
        Selection.AutoFilter 3, "赤"
    Else
        iro = MsgBox("ワインの色は白ですか?", vbYesNo)
        If iro = 6 Then
            Range("B5").Select
            Selection.AutoFilter 3, "白"
        Else
            iro = MsgBox("ワインの色はロゼですか?", vbYesNo)
            If iro = 6 Then
                Range("B5").Select
                Selection.AutoFilter 3, "ロゼ"
            Else
                MsgBox "選択が間違っています" & Chr(13) & _
                "赤、白、ロゼの中から選択してください", vbOKOnly + vbExclamation
            End If
        End If
    End If
End Sub


輸入国検索プログラムもIf文のみで実装せよ.
Sub 輸入国検索()
    Dim kuni As Integer
    kuni = MsgBox("輸入国はイタリアですか?", vbYesNo)
    If kuni = 6 Then
        Range("B5").Select
        Selection.AutoFilter 5, "イタリア"
    Else
        kuni = MsgBox("輸入国はフランスですか?", vbYesNo)
        If kuni = 6 Then
            Range("B5").Select
            Selection.AutoFilter 5, "フランス"
        Else
            MsgBox "入力が間違っています" & Chr(13) & _
        "イタリア,フランスのいずれかを入力してください", vbOKOnly + vbExclamation
        End If
    End If
End Sub

2012年12月28日金曜日

追加課題(12/28)

追加課題
見出し1見出し2見出し3見出し4見出し5
内容11内容12内容13内容14内容15
内容21内容22内容23内容24内容25
内容31内容32内容33内容34内容35
内容41内容42内容43内容44内容45
内容51内容52内容53内容54内容55

既存のエクセル内の表に対して
 A.一番上の行を見出し行と見なし,黒背景白文字ボールドセンタリングを行う
 B.2行目以下について,偶数行と奇数行で背景色を交互に塗り分け
を実現
ここで,実装するべき機能は
 1.選択されたセルを開始位置として,そこから表が続く限り処理を繰り返す
   (表が終われば処理終了)
 2.1つめのif文で1行目か否かを判別し,1行目ならばAの処理を実行
 3.2つめのif文で2行目移行と判別できたら,その行が奇数行か偶数行か判別
  3-1.奇数行だった場合,少し薄めの色で背景を塗る
 3-2.偶数行だった場合,奇数行よりも少し濃いめの色で背景を塗る
です.


1.横方向に移動し,セルの内容を表示するプログラム
Sub ironuri1()
    Do While Not (ActiveCell.Value = "")
        MsgBox ActiveCell.Value
        ActiveCell.Offset(0, 1).Select
    Loop
End Sub
2.縦方向に移動し,セルの内容を表示するプログラム
Sub ironuri2()
    Do While Not (ActiveCell.Value = "")
        MsgBox ActiveCell.Value
        ActiveCell.Offset(1, 0).Select
    Loop
End Sub
3.横方向に移動し,セルの内容を表示するプログラム
  +行末までたどり着いたら自動的に改行
Sub ironuri3()
    Do While Not (ActiveCell.Value = "")
        MsgBox ActiveCell.Value
        ActiveCell.Offset(0, 1).Select
    Loop
    ActiveCell.Offset(1, 0).Select
End Sub
4.横方向に移動し,セルの内容を表示するプログラム
  +行末までたどり着いたら自動的に改行
  +表の左端まで移動
Sub ironuri4()
    Do While Not (ActiveCell.Value = "")
        MsgBox ActiveCell.Value
        ActiveCell.Offset(0, 1).Select
    Loop
    ActiveCell.Offset(1, -5).Select
End Sub
5.横方向に移動し,セルの内容を表示するプログラム
  +行末までたどり着いたら自動的に改行
  +「任意の大きさの」表の左端まで移動
Sub ironuri5()
    Dim i As Integer
    i = 1
    Do While Not (ActiveCell.Value = "")
        MsgBox ActiveCell.Value
        ActiveCell.Offset(0, 1).Select
        i = i + 1
    Loop
    ActiveCell.Offset(1, (-i + 1)).Select
End Sub
6.横方向に移動し,セルの内容を表示するプログラム
  +行末までたどり着いたら自動的に改行
  +「任意の大きさの」表の左端まで移動
  +移動後の行に対しても同様の処理を行う
  =任意の表の各セル全範囲を移動し,セルの内容を表示するプログラム
Sub ironuri6()
    Do While Not (ActiveCell.Value = "")
        Dim i As Integer
        i = 1
        Do While Not (ActiveCell.Value = "")
            MsgBox ActiveCell.Value
            ActiveCell.Offset(0, 1).Select
            i = i + 1
        Loop
        ActiveCell.Offset(0, (-i + 1)).Select
        ActiveCell.Offset(1, 0).Select
    Loop
End Sub
7.任意の表の各セル全範囲を移動し,セルの内容を表示するプログラム
  +行数把握
Sub ironuri7()
    Dim j As Integer
    j = 1
    Do While Not (ActiveCell.Value = "")
        Dim i As Integer
        i = 1
        Do While Not (ActiveCell.Value = "")
            MsgBox ActiveCell.Value & ", " & j & "行目"
            ActiveCell.Offset(0, 1).Select
            i = i + 1
        Loop
        ActiveCell.Offset(0, (-i + 1)).Select
        ActiveCell.Offset(1, 0).Select
        j = j + 1
    Loop
End Sub
8.任意の表の各セル全範囲を移動し,セルの内容を表示するプログラム
  +行数把握
  +1行目とその他の行で処理分岐
Sub ironuri8()
    Dim j As Integer
    j = 1
    Do While Not (ActiveCell.Value = "")
        Dim i As Integer
        i = 1
        Do While Not (ActiveCell.Value = "")
            If j = 1 Then
                MsgBox ActiveCell.Value & ", " & j & "行目(見出し行です)"
            Else
                MsgBox ActiveCell.Value & ", " & j & "行目(見出し行ではありません)"
            End If
            ActiveCell.Offset(0, 1).Select
            i = i + 1
        Loop
        ActiveCell.Offset(0, (-i + 1)).Select
        ActiveCell.Offset(1, 0).Select
        j = j + 1
    Loop
End Sub
9.任意の表の各セル全範囲を移動し,セルの内容を表示するプログラム
  +行数把握
  +1行目とその他の行で処理分岐
  +2行目以降の奇数行・偶数行で処理分岐
Sub ironuri9()
    Dim j As Integer
    j = 1
    Do While Not (ActiveCell.Value = "")
        Dim i As Integer
        i = 1
        Do While Not (ActiveCell.Value = "")
            If j = 1 Then
                MsgBox ActiveCell.Value & ", " & j & "行目(見出し行です)"
            Else
                If (j Mod 2) = 1 Then
                    MsgBox ActiveCell.Value & ", " & j & "行目(見出し行ではありません)(奇数行)"
                Else
                    MsgBox ActiveCell.Value & ", " & j & "行目(見出し行ではありません)(偶数行)"
                End If
            End If
            ActiveCell.Offset(0, 1).Select
            i = i + 1
        Loop
        ActiveCell.Offset(0, (-i + 1)).Select
        ActiveCell.Offset(1, 0).Select
        j = j + 1
    Loop
End Sub
10.任意の表の各セル全範囲を移動し,セルの内容を表示するプログラム
   +行数把握
   +1行目とその他の行で処理分岐
   +2行目以降の奇数行・偶数行で処理分岐
   +各行にあわせた処理を記述
Sub ironuri10()
    Dim j As Integer
    j = 1
    Do While Not (ActiveCell.Value = "")
        Dim i As Integer
        i = 1
        Do While Not (ActiveCell.Value = "")
            If j = 1 Then
                MsgBox ActiveCell.Value & ", " & j & "行目(見出し行です)"
                ActiveCell.Font.Bold = True
                ActiveCell.Font.ColorIndex = 2
                ActiveCell.Interior.ColorIndex = 1
            Else
                If (j Mod 2) = 1 Then
                    MsgBox ActiveCell.Value & ", " & j & "行目(見出し行ではありません)(奇数行)"
                    ActiveCell.Interior.ColorIndex = 15
                    ActiveCell.BorderAround ColorIndex:=1
                Else
                    MsgBox ActiveCell.Value & ", " & j & "行目(見出し行ではありません)(偶数行)"
                    ActiveCell.Interior.ColorIndex = 48
                    ActiveCell.BorderAround ColorIndex:=1
                End If
            End If
            ActiveCell.Offset(0, 1).Select
            i = i + 1
        Loop
        ActiveCell.Offset(0, (-i + 1)).Select
        ActiveCell.Offset(1, 0).Select
        j = j + 1
    Loop
End Sub

2012年12月25日火曜日

Select-Caseステートメント SAMPLE(Excel VBA)

shiken3()
Sub shiken3()
    Dim tensuu As Integer
    tensuu = Range("C26").Value
    If tensuu >= 80 Then
        MsgBox "合格です"
    Else
        If tensuu >= 60 Then
            MsgBox "追試です"
        Else
            MsgBox "不合格です"
        End If
    End If
End Sub

waribiki()
Sub waribiki()
    Dim kingaku As Currency
    kingaku = Range("C33").Value
    If Range("D33").Value = "一般" Then
        If kingaku >= 50000 Then
            MsgBox "一般:15%割引です"
        Else
            If kingaku >= 30000 Then
                MsgBox "一般:10%割引です"
            Else
                If kingaku >= 10000 Then
                    MsgBox "一般:5%割引です"
                Else
                    MsgBox "一般:割引なしです"
               End If
            End If
        End If
    Else
        If Range("D33").Value = "会員" Then
            If kingaku >= 50000 Then
                MsgBox "会員:30% 割引です"
            Else
                If kingaku >= 30000 Then
                    MsgBox "会員:20%割引です"
                Else
                    If kingaku >= 10000 Then
                        MsgBox "会員:10%割引です"
                    Else
                        MsgBox "会員:割引なしです"
                    End If
                End If
            End If
        End If
    End If
End Sub

iro()
Sub iro()
    Select Case Range("C34").Value
    Case "RED"
        strIro = "RED"
    Case "BLUE"
        strIro = "BLUE"
    Case "PINK"
        strIro = "PINK"
    Case "GREEN"
        strIro = "GREEN"
    Case Else
        strIro = "RED.BLUE.PINK.GREENのいずれかを入力してください"
    End Select
        MsgBox strIro
End Sub