Download presentation
Presentation is loading. Please wait.
2
もう少しユーザーフレンドリーに改良できないだろうか
チェックボックス×4、テキストボックス×3、コマンドボタンを配置する。 コマンドボタンに機能を与える Dim a As Single, b As Single, c As Single '計算用変数 a = TextBox1.Text '数字1を変数aに取り込み b = TextBox2.Text '数字2を変数bに取り込み If CheckBox1.Value = True Then c = a + b '+にチェック If CheckBox2.Value = True Then c = a - b '-にチェック If CheckBox3.Value = True Then c = a * b '×にチェック If CheckBox4.Value = True Then c = a / b '÷にチェック TextBox3.Text = c 'チェックボックスのリセット CheckBox1.Value = False CheckBox2.Value = False CheckBox3.Value = False CheckBox4.Value = False 'テキストボックスのリセット TextBox1.Text = "" TextBox2.Text = "" TextBox3.Text = "" もう少しユーザーフレンドリーに改良できないだろうか
3
オプションボタン(OptionButton)を使うと
複数選択出来なくなってさらに使いやすい Dim a As Single, b As Single, c As Variant '計算用変数 変数cに工夫 'フールプルーフ 'テキストボックスが空白の場合、0を強制的に入れる If TextBox1.Text = "" Then TextBox1.Text = 0 If TextBox2.Text = "" Then TextBox2.Text = 0 '0で割ろうとした時は、強制的に+に変更する If CheckBox4.Value = True And TextBox2.Text = 0 Then MsgBox "0で割り算をする事はできません。" CheckBox4.Value = False '「÷」のチェックを外す CheckBox1.Value = True '強制的に「+」に変更 End If a = TextBox1.Text '数字1を変数aに取り込み b = TextBox2.Text '数字2を変数bに取り込み c = "計算不能" '四則計算にチェックが入っていないと、最後まで「計算不能」が残る If CheckBox1.Value = True Then c = a + b '+にチェック If CheckBox2.Value = True Then c = a - b '-にチェック If CheckBox3.Value = True Then c = a * b '×にチェック If CheckBox4.Value = True Then c = a / b '÷にチェック TextBox3.Text = c テキストボックスが空白だった場合 ~ ÷ 0 を実行しようとした場合 チェックが入っていなかった場合の ちょっとした工夫 変数cをVariant型で宣言しておいて あらかじめ「計算不能」と入れておく チェックが入っていなかったら 変数cの内容は上書きされない
5
参考:第10回授業のアルゴリズム教室
6
テキストボックス×3、 コマンドボタンを配置 アルゴリズム教室 ほぼそのままで、 データ最終行を探す iの値を最終行に設定
'アルゴリズム教室より A列の連続データのチェック Dim i As Integer, a As String For i = 1 To 'Integerの上限が32767 a = Cells(i, 1).Value 'I行A列のセルチェック If a = "" Then Exit For Next i = i '連続データの最終行 If i > 0 Then 'i>0:A列にデータあり、i=0:なし Dim v As Integer, b As Single, c As Single, d As Single c = 0 '合計用の変数cを初期化 For v = 1 To i b = Cells(v, 1).Value c = c + b '合計を計算 d = c / i '合計をデータ個数で割って平均を計算 TextBox1.Text = i '個数表示 TextBox2.Text = c '合計表示 TextBox3.Text = d '平均表示 Else TextBox1.Text = "計算不能" TextBox2.Text = "計算不能" TextBox3.Text = "計算不能" End If アルゴリズム教室 ほぼそのままで、 データ最終行を探す iの値を最終行に設定 A列が空でなければ 1行~i行までFor~Nextでループ i行の数値を変数bに取得して 変数cに加算 平均を計算 各種データを表示 A列が空の場合
7
実行速度を追求した場合 →For文を一つにした テキストボックス×3、 コマンドボタンを配置 アルゴリズム教室 ほぼそのままだが、
'アルゴリズム教室より A列の連続データのチェック Dim i As Integer, a As Variant 'aはチェックと数字取得兼用 Dim c As Single, d As Single '変数cが合計、dが平均 c = 0 '合計用の変数cを初期化 For i = 1 To 'Integerの上限が32767 a = Cells(i, 1).Value 'I行A列のセルチェック If a = "" Then Exit For c = c + a '【追加】合計を計算していく Next i = i '連続データの最終行 If i > 0 Then 'i>0:A列にデータあり、i=0:なし 'ここにあった合計計算のFor~Nextが消えた d = c / i '合計をデータ個数で割って平均を計算 TextBox1.Text = i '個数表示 TextBox2.Text = c '合計表示 TextBox3.Text = d '平均表示 Else TextBox1.Text = "計算不能" TextBox2.Text = "計算不能" TextBox3.Text = "計算不能" End If アルゴリズム教室 ほぼそのままだが、 合計の算出を ここに入れる A列が空でなければ 平均を計算 各種データを表示 A列が空の場合
8
「6」の部分を 変数iの値で 合成 アルゴリズム紹介 最大値や平均の求め方 セルに「関数」を書き込むことにより、
Excelの機能をそのまま利用する。 Cells(6, 1).Value = "=Average(A1:A6)" 連続データの終点を探す、と組み合わせるとさらに便利に! →文字列連結演算子「&」を上手く使うのがコツ! Dim i As Integer, a As String For i = 1 To 'アルゴリズム教室とほぼ同一 a = Cells(i, 1).Value If a = "" Then Exit For 'このときのiの値は空白行を指す Next i = i - 1 'iから1を引くことで最終データ行を指す Cells(1, 2).Value = "データ個数" 'B1セルに出力 Cells(2, 2).Value = i 'iがそのままデータ個数を示す B2セルに出力 Cells(3, 2).Value = "合計" 'B3セルに出力 Cells(4, 2).Value = "=Sum(A1:A" & i & ")" 'A1~Aiセルまでの合計 Cells(5, 2).Value = "平均" 'B5セルに出力 Cells(6, 2).Value = "=Average(A1:A" & i & ")" 'A1~Aiセルまでの最大値 「6」の部分を 変数iの値で 合成
9
レポートの質問への回答やアドバイスで紹介したテクニック
シート上のグラフの削除 「ChartObjects」オブジェクトを使って、グラフの個数のカウントや削除を行う 「グラフ1」を削除する ActiveSheet.ChartObjects("グラフ 1").Delete ただし、グラフの名前は作るたびに変わっていくので、 上のような固定的な指定は難しい シート上のグラフを全削除 If ChartObjects.Count > 0 Then ChartObjects.Delete シート上のグラフの個数が0より多ければ (シート上にグラフがあれば) グラフを全削除 このように記述しないと、Excel上にグラフがないときにエラーが出る
10
チェックボックス等のコントロールの一括操作
コントロールはOLEObjectsというコレクション(コントロールの集まり)でまとめて制御できる 連番になっているCheckBox1~4にまとめてチェックを入れる Dim i As Integer For i = 1 To 4 'チェックボックスの数 CheckBox1~4と連番になっていること OLEObjects("CheckBox" & i).Object.Value = True Next CheckBox1~4をFor文と文字列合成でここに代入している 上のOLEOBjects・・・を以下の様に書き替えると、コマンドボタンをまとめて使用不可に出来る' OLEObjects("CommandButton" & i).Object.Enabled = False ボタンやチェックボックスを一括で消す/表示する場合(上にあった.Objectを入れるとエラーが出る) OLEObjects("CommandButton" & i).Visible = True または False OLEObjects("CheckBox" & i).Visible = True または False 参考 Microsoft VBA リファレンス OLEObjectsコレクション
11
別の方法 解説 For Each : コレクションなどについて適用できる繰り返し構文
'連番でなくても正常動作、全チェックボックスにチェックを入れる For Each OLEObject In Me.OLEObjects If OLEObject.Name Like "CheckBox*" Then OLEObject.Object.Value = True Next 赤字を書き替えると対象のコントロールとプロパティを変更可能 「*」を消さないこと 解説 For Each : コレクションなどについて適用できる繰り返し構文 Like: 「Likeの前の文字列が~を含むなら」というIf文用の条件 *:ワイルドカード 数字、文字列に置き換わる CheckBox1やChackBox2など 全てをひっくるめる場合に使う したがって、上の記述の中心部分は、以下のような解釈になる If OLEObject.Name Like "CheckBox*" Then OLEObject.Object.Value = True For Each文でセル上のオブジェクト(コントロール)を全て走査し、 名前にCheckBoxで始まる文字列(つまりCheckBox1、CheckBox2、・・・・) が含まれていたら、そのオブジェクト(コントロール)のValueプロパティを Trueにする 参考 エクセルの学校 [[ ]] ROUGE氏のレスポンス
12
Excelに貼り付けた写真や図を消したり表示させたりする
【貼り付けた写真や図の名前を知る】 1. 写真や図を貼り付ける 2. 貼り付けた図をダブルクリック 3.「図ツール」の「書式」がタブに 追加される 4.オブジェクトの選択と表示を押す 5.図の名前をクリックして、コピー 3 4 1, 2 5 5 【VBAから表示/非表示】 例だと「図 6」(6は半角、図と6の間に半角空白) 表示: ActiveSheet.Shapes("図 6").Visible = True 非表示: ActiveSheet.Shapes("図 6").Visible = False ※全角・半角も厳密に指定
Similar presentations
© 2025 slidesplayer.net Inc.
All rights reserved.