初めて投稿します。Excelで選択した値を加算するプログラムを作ろうとしています。
現在以下のようにプログラミングしています。現状は加算されず、最初に選択された
値がlabel1に表示されてしまいます。もし分かる方いましたらご教授ください。
Option Explicit
Private Sub OK_Click()
Dim Answer As String
Dim objExcelApp As Workbook
Dim strExcelFile As String
Dim strExcelSheet As String
Dim n As Integer
Dim sum As Single
Answer = MsgBox("入力完了ですか?", vbYesNoCancel, "MsgBox")
If Answer = vbYes Then
教室表示.Caption = 教室.Text & vbCrLf & 教室表示.Caption
曜日表示.Caption = 曜日.Text
時限表示.Caption = 時限.Text
On Error Resume Next
'既存のExcelファイルの呼び出し
strExcelFile = "C:\エアコン電力.xls"
strExcelSheet = "一覧"
Set objExcelApp = GetObject("C:\エアコン電力.xls")
objExcelApp.Windows(1).Visible = True
objExcelApp.Application.Visible = True
If 教室.Text = "第1教室" Then
sum = sum + objExcelApp.ActiveSheet.Cells(25, 9).Value
ElseIf 教室.Text = "第2教室" Then
sum = sum + objExcelApp.ActiveSheet.Cells(27, 9).Value
ElseIf 教室.Text = "第3教室" Then
sum = sum + objExcelApp.ActiveSheet.Cells(28, 9).Value
ElseIf 教室.Text = "第4教室" Then
sum = sum + objExcelApp.ActiveSheet.Cells(29, 9).Value
ElseIf 教室.Text = "第5教室" Then
sum = sum + objExcelApp.ActiveSheet.Cells(30, 9).Value
End If
objExcelApp.Save
objExcelApp.Application.Quit
Label1.Caption = sum
ElseIf Answer = vbNo Then
曜日表示.Caption = 曜日.Text
時限表示.Caption = 時限.Text
教室表示.Caption = 教室.Text & vbCrLf & 教室表示.Caption
Else
Answer = vbCancel
教室.Text = ""
End If
End Sub
>初めて投稿します。Excelで選択した値を加算するプログラムを作ろうとしています。
初めてとおっしゃる割には
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200601/06010082.txt
の続きに見えますが。
>現在以下のようにプログラミングしています。現状は加算されず、最初に選択された
>値がlabel1に表示されてしまいます。もし分かる方いましたらご教授ください。
加算されていないのではなく、最初に選択した値だけを sum に加算しているので
そう見えているのでしょう。
If 〜 ElseIf 〜 End If では最初に条件が成立した時の処理しか実行されませんし。
ElseIf を伴う If 文の機能をヘルプで調べてみて、どこの If 文をどう変えれば
いいのかちょっと考えてみてください。
最初の1行目で、虚偽の情報が、あると
非常に不愉快ですね。
学校の課題とかで、上のリンクの質問者とは別人だったりして(^^;
もしかすると、OKボタンをクリックする度に加算されるようにしたいのでしょうか?
そうすると変数sumをプロシージャレベルではなくモジュールレベルで宣言する
必要があります。
Option Explicit
Private sum As Single
Private Sub OK_Click()
Dim Answer As String
Dim objExcelApp As Workbook
Dim strExcelFile As String
Dim strExcelSheet As String
Dim n As Integer
Answer = MsgBox("入力完了ですか?", vbYesNoCancel, "MsgBox")
Select Case Answer
Case vbYes
教室表示.Caption = 教室.Text & vbCrLf & 教室表示.Caption
曜日表示.Caption = 曜日.Text
時限表示.Caption = 時限.Text
On Error Resume Next
'既存のExcelファイルの呼び出し
strExcelFile = "C:\エアコン電力.xls"
strExcelSheet = "一覧"
Set objExcelApp = GetObject("C:\エアコン電力.xls")
objExcelApp.Windows(1).Visible = True
objExcelApp.Application.Visible = True
Select Case 教室.Text
Case "第1教室"
sum = sum + objExcelApp.ActiveSheet.Cells(25, 9).Value
Case "第2教室"
sum = sum + objExcelApp.ActiveSheet.Cells(27, 9).Value
Case "第3教室"
sum = sum + objExcelApp.ActiveSheet.Cells(28, 9).Value
Case "第4教室"
sum = sum + objExcelApp.ActiveSheet.Cells(29, 9).Value
Case "第5教室"
sum = sum + objExcelApp.ActiveSheet.Cells(30, 9).Value
End Select
objExcelApp.Save
objExcelApp.Application.Quit
Label1.Caption = sum
Case vbNo
曜日表示.Caption = 曜日.Text
時限表示.Caption = 時限.Text
教室表示.Caption = 教室.Text & vbCrLf & 教室表示.Caption
Case vbCancel
教室.Text = ""
End Select
End Sub
なるほど、
ハンドルネームまで同じと言うことは、
両者が課題の出ているところを元に付けてると、言うことになるわけか
前にも同じようなのが投稿されてました。すみません。これは学校でのVBの勉強課題です。
>もしかすると、OKボタンをクリックする度に加算されるようにしたいのでしょうか?
現在はコンボボックスから選択した内容を教室表示というlabelに取り込ませています。Msgbox=Noにしたらまた選択可能で、Yesなら選択された部分の値だけを取り込み、加算したあとに表示させたいです。
現在はコンボボックスに変更されているということですが、
どこがわからないのですか?
環境は何ですか?
やりたいことだけ書かれていても答えようが・・・
>どこがわからないのですか?
現状は最初に教室選択した値しか取り込んでいません。for文で回そうかなと思いましたが、うまくいきません。加算が出きないので悩んでいます。
>環境は何ですか?
環境はVB6です。
無能な私だとまだ質問の意図が正確に受け取れないのですが
まず貴方が何をSumしたいのかが受け取れません
エクセルにはどのようにデータが入っているのでしょうか?
少なくとも
9列目(I列)
25行目 第1教室のデータ
26行目
27行目 第2教室のデータ
28行目 第3教室のデータ
29行目 第4教室のデータ
30行目 第5教室のデータ
ということだけはわかりました
この5つのデータの中のデータを合算したいということですか?
動作としては
第1教室を選択>OKボタンを押す>メッセージでNoを選択する
再度教室を選択する(今度は第3教室)>OKボタンを押す>メッセージでOKを押す
第1教室のデータ+第3教室のデータを画面に表示する
以上の動作でよろしいのでしょうか?
曜日だなんだという言葉も出てきているが
その辺も一切情報が開示されてない以上回答側は無視して良いんですね?
後から、「前に○○質問しましたが今度は曜日も〜〜〜」なんてのはちょっとどうかと思うし・・・
>第1教室を選択>OKボタンを押す>メッセージでNoを選択する
再度教室を選択する(今度は第3教室)>OKボタンを押す>メッセージでOKを押す
第1教室のデータ+第3教室のデータを画面に表示する
葉月αさんの動作にしたいです。言葉足らずで申し訳ありません。曜日などは無視してかまいません。
本来ならば5つしか項目がないのがわかっていて
ユーザに選択させるのですから
チェックボックスコントロールを配列にして用いて判定するのが
筋のような気もしますが
OKorNOが押された時は教室.TEXTにどんどん連結されていきますね
例えば・・・
教室1を選択してメッセージでNOをクリックする
続けて教室1を選択してメッセージでNOをクリックする
さらに続けて教室1を選択してメッセージでOKをクリックした時はどうするのか
以下は一番最初に提示されたコードを元に見ていきます
>If 教室.Text = "第1教室" Then
これじゃぁ加算は出来ません
恐らく「教室.Text」はコンボボックスの値だと思いますが
当然選択している値でしか判定しないので合算はしてくれないでしょう
ここでユーザが何を選択したのかを知っているのは「教室表示.Caption」だけです
今回の仕様でForで回すとするならば
まず「教室表示.Caption」に格納されている文字列を判定する為に
改行コード区切で「教室表示.Caption」の値を配列に格納する必要が出てきます
区切る手段はSplitを
配列数取得手段はUBoundの使い方を自分で調べてください
そうすれば For 1 to 配列数 Step 1
を書いてあげればループできるでしょう
ループの書く位置程度は考えてください・・・でないと課題になりません
これで合算できるんじゃないでしょうか?
選択してボタンを押していく度に動的配列(Redim と Preserveを調べてください)にポコポコ
放り込んで行ってループさせる方が素直かと思います
もしくは教室分のBOOL型を用意して判定させるか・・・
>OKorNOが押された時は教室.TEXTにどんどん連結されていきますね
OKorNOが押された時は教室.Captionにどんどん連結されていきますね
ツイート | ![]() |