痔になりやすい生活習慣とは?

コントロール配列にしたテキストボックスに数値を入力し、その数値に金種(10000円、5000円、1000円・・・)を乗算します。
そこで得られた結果を足して、ラベルに表示させたいと思っています。
現在、テキストボックスに数値を入れると
・小さい数値ならば、うまく加算できる
・大きい数値ならば、オーバーフローする
・何も記述しない(空白)とエラーがデータ型が違うという、エラーがでる

といった状態です。何がおかしいのか頭を悩ませていますので、アドバイスをお願いします。
***********************************************
For i = 0 To 8
Maisuu(i) = Val(txtKinsyu(i).Text)
Next i

lngGoukei = Maisuu(0) * 10000 + Maisuu(1) * 5000 + Maisuu(2) * 1000 _
+ Maisuu(3) * 500 + Maisuu(4) * 100 + Maisuu(5) * 50 _
+ Maisuu(6) * 10 + Maisuu(7) * 5 + Maisuu(8) * 1

lblGoukei.Caption = lngGoukei
***********************************************

このQ&Aに関連する最新のQ&A

A 回答 (4件)

この場合 Dim文で変数をLong(16桁数値)に宣言します。


それとテキストボックスが空白かどうかの判断をします。
IF文を追加しました。しかしまだ問題があります。
テキストに数字以外が入力された時はエラーになりそうですが...ここまででテストしてみて下さい。

Dim Maisuu(8) ,IngGoukei as Long

For i = 0 To 8
'テキストボックスが空白でない場合
If Len(txtKinsyu(i).Text)>0 then
Maisuu(i) = Val(txtKinsyu(i).Text)
Else
Maisuu(i)=0
End If
Next i

lngGoukei = Maisuu(0) * 10000 + Maisuu(1) * 5000 + Maisuu(2) * 1000 _
+ Maisuu(3) * 500 + Maisuu(4) * 100 + Maisuu(5) * 50 _
+ Maisuu(6) * 10 + Maisuu(7) * 5 + Maisuu(8) * 1

lblGoukei.Caption = lngGoukei
    • good
    • 0

これでいかがでしょうか? No.3 の laputart さんとほとんど同じです。



Dim i as Long, Maisuu(8) as Currency

For i = 0 To 8
 If IsNumeric(txtKinsyu(i).Text) Then
  Maisuu(i) = CCur(txtKinsyu(i).Text)
 Else
  Maisuu(i) = 0
 End If
Next

lblGoukei.Caption = CStr(Maisuu(0) * 10000 + Maisuu(1) * 5000 + ... + Maisuu(8) * 1)

最後の部分は省略させていただきました。
chieri23 さんが書かれていたものと同じコードです。

・オーバーフローは、Currency 型で宣言することで、とりあえず回避しています。もっと大きな金額の場合は、工夫がいります。
・データ型が違うというのは、空欄は数字ではないので、Val 関数で数値変換できないためのエラーです。IsNumeric 関数で回避しています。
    • good
    • 0
この回答へのお礼

ありがとうございます。
ちなみに私は数値以外の入力を避けるため、Keypressで次のように制限をかけました。

***********************************
If str >= "0" And str <= "9" Then
'数字の場合は何もしない
ElseIf str = Chr(8) then
'[BackSpace]がおされたときも何もしない
Else
KeyAscii = 0
'文字を無効にする
************************************

お礼日時:2003/05/12 19:14

課題か何かですか?



lngGoukeiは変数名からLong型と判断しましたが、Maisuu(i)は何型の配列
なのでしょうか?どっちにしろ lngGoukeiを振り切る値(Helpにてご自分で
上限を調べて下さい)が入った場合はオーバーフローします。

ちなみに3つ目の問題は空白かどうかチェックすればいいのでは?
    • good
    • 0
この回答へのお礼

そうですね・・・
課題ってほどでもないのですが。
問題はlong型で解決しました。
空白の問題はゴチャゴチャソースを直している間に何事もないように解決してしまったのです。
解決後のソースを参考までに載せておきます。
でも、何で解決したんでしょう・・・
これじゃあ勉強にならないですよね。
***********************************
'入力処理
For i = 0 To 8
lngMaisuu(i) = Val(txtKinsyu(i).Text)
Next i

lngGoukei = lngMaisuu(0) * 10000 + lngMaisuu(1) * 5000 + lngMaisuu(2) * 1000 _
+ lngMaisuu(3) * 500 + lngMaisuu(4) * 100 + lngMaisuu(5) * 50 _
+ lngMaisuu(6) * 10 + lngMaisuu(7) * 5 + lngMaisuu(8) * 1

'後始末処理

lblGoukei.Caption = lngGoukei

お礼日時:2003/05/12 19:11

ただ単に、インテジャー、ロングの範囲を超えているということじゃないのでしょうか?


もう一つ、大きな型で宣言してみたらいかがでしょうか?
    • good
    • 0
この回答へのお礼

ありがとうございます!!
オーバーフローの問題はmaisuuをlong型にすることで解決しました!!

お礼日時:2003/05/12 19:04

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVBA テキストボックスの計算

ユーザーフォームの中にval関数を入力したTextBoxを3つ貼り、TextBox合計にその合計を表示させています。(Enterを押すたび表示がかわります)
この合計値というのは文字列なんでしょうか?数値なんでしょうか?
というのも、
TextBox7に
(TextBox合計 - TextBox5*600)\700
TextBox8に
TextBox5*600 + TextBox6*700 - TextBox合計
というのを表示させたいんですが、非表示のままで、動作しません。
検索方法を変えていろいろ調べているんですが、わからず質問させていただきました。
すみませんが、わかる方よろしくお願いします。

Aベストアンサー

もしかしたら、単にイベントに式を組み込んでいないだけだったりはしませんよね?
----------------------------------------------------------------------------------------
Private Sub TextBox5_Change()
TextBox7 = (Val(TextBox合計) - Val(TextBox5) * 600) \ 700
TextBox8 = Val(TextBox5) * 600 + Val(TextBox6) * 700 - Val(TextBox合計)
End Sub
----------------------------------------------------------------------------------------
Private Sub TextBox6_Change()
TextBox8 = Val(TextBox5) * 600 + Val(TextBox6) * 700 - Val(TextBox合計)
End Sub
----------------------------------------------------------------------------------------
Private Sub TextBox合計_Change()
TextBox7 = (Val(TextBox合計) - Val(TextBox5) * 600) \ 700
TextBox8 = Val(TextBox5) * 600 + Val(TextBox6) * 700 - Val(TextBox合計)
End Sub
----------------------------------------------------------------------------------------
※ リアル表示させるなら式の右辺に記述があるテキストボックスの「Change」イベントに記述しないと反応しません。
※ 通常テキストボックスは文字を返すのでそのままでは四則計算できないので「Val()」で変換しています。← これを「val関数を入力したTextBox」といっているのでしょうか?

もしかしたら、単にイベントに式を組み込んでいないだけだったりはしませんよね?
----------------------------------------------------------------------------------------
Private Sub TextBox5_Change()
TextBox7 = (Val(TextBox合計) - Val(TextBox5) * 600) \ 700
TextBox8 = Val(TextBox5) * 600 + Val(TextBox6) * 700 - Val(TextBox合計)
End Sub
----------------------------------------------------------------------------------------
Private Sub TextBox6_Change()
TextBox8 = Val(TextBox5)...続きを読む

Q【VB】コンボボックスにデータベースから取り出した値を入れたい

VB2005です。

表題の通りですがやり方がよくわかりません。
データベースに接続し、
SQLで重複しない値を取り出すところまではできています。

SQL=SELECT DISTINCT FieldName FROM TableName

VB6の時はこんなソースでした
Do Until rs.EOF
   Combo1.AddItem.Fields("FieldName")
   rs.MoveNext
Loop

VB2005ではどう書くのでしょう?
よろしくご教授ください。

Aベストアンサー

DataReaderを使用したサンプルです
※DBMSが記述されていないので、接続文字列はアクセスの場合です
※テキスト書きなので試験していません
※DataSetを使用する方法もありますが、コンボボックスに表示する程度ならDataReaderで大丈夫でしょう
※VB2005ならば、TableAdapterという便利なクラスがあるそうです
※VisualStudio2005 まださわってません orz

  Dim dbFilePath As String = "C:\testdb.mdb"
  Dim connectionString As String = String.Format("Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}", dbFilePath)
  Dim sql As String = "SELECT DISTINCT FieldName FROM TableName"
  Dim conn As New OleDbConnection(connectionString)
  Dim query As New OleDbCommand(sql, conn)

  Try
    conn.Open()
    Dim reader As OleDbDataReader = query.ExecuteReader()
    While (reader.Read())
      Me.ComboBox1.Items.Add(reader.Item("FieldName"))
    End While
    reader.Close()
  Catch ex As Exception
    MessageBox.Show(ex.Message)
  Finally
    conn.Close()
  End Try

DataReaderを使用したサンプルです
※DBMSが記述されていないので、接続文字列はアクセスの場合です
※テキスト書きなので試験していません
※DataSetを使用する方法もありますが、コンボボックスに表示する程度ならDataReaderで大丈夫でしょう
※VB2005ならば、TableAdapterという便利なクラスがあるそうです
※VisualStudio2005 まださわってません orz

  Dim dbFilePath As String = "C:\testdb.mdb"
  Dim connectionString As String = String.Format("Provider=Microsoft.Jet.OLEDB.4.0; Data Sourc...続きを読む

QDataGridViewで指定したセルの値を取得

こんにちは。

VB2008のDataGridViewで指定したセルの値を取得をする方法がわかりません。
どなたか教えてください。

Aベストアンサー

こんばんは.

 Dim Data As String
 Data = Me.DataGridView(0, 2).Value
 MsgBox(Data)

みたいな感じで取れないですかね???

QTextBoxに半角数字のみの入力しかできないようにしたい

タイトルどおりです。
フォームに貼り付けた、TextBoxに、半角数字のみしか入力できないようにしたいです。
000000~999999までのコード(数字)を入力させるようにするわけですが、そのままだと半角英数も全角も入力できてしまいます。

GrapeCity社製のカスタムコントロール「InputMan」の“Number”を用いると簡単なのですが、これだとカーソルがボックス内の右端にきて、一の位から入力が始まってしまいます。
数字は、ボックス内の左側から入力されていくようにしたいのですが、“Number”だとなんか出来なさそう・・・?
(“Number”で左側から入力できるならそれがいいのですが)

そこで、TextBoxを使うことにしたのですが、TextBoxだと、半角数字のみしか入力できないような制限がかけるのかが、わかりません。

もし、お分かりの方がいらっしゃいましたら、ご教授下さいませ。

Aベストアンサー

コピペですみません。
VB6だと、

Private Sub TextBox_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case vbKeyBack, Asc("0") To Asc("9"), Asc("-"), Asc(".")
Case &H1 ' Ctrl + A
TextBox.SelStart = 0
TextBox.SelLength = Len(TextBox.Text)
Case &H3 ' Ctrl + C
Case &H16 ' Ctrl + V
Case &H18 ' Ctrl + X
Case &H1A ' Ctrl + Z
Case Else
KeyAscii = 0
End Select
End Sub

で、いかがでしょうか。

コピペですみません。
VB6だと、

Private Sub TextBox_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case vbKeyBack, Asc("0") To Asc("9"), Asc("-"), Asc(".")
Case &H1 ' Ctrl + A
TextBox.SelStart = 0
TextBox.SelLength = Len(TextBox.Text)
Case &H3 ' Ctrl + C
Case &H16 ...続きを読む

Qエクセル VBA ユーザーフォームを閉じる

ユーザーフォームを開く時は
UserForm1.Showですが
閉じる時は?
UserForm1.Close
だとコンパイルエラーになります。
End
にするしかないですか?

Aベストアンサー

Unload Me とか Unload UserForm1 でユーザーフォームを閉じることができます。

QエクセルVBAでテキストボックスの値の取得と変更について

エクセルのVBAを使ってシート上のテキストボックスのテキストを取得・変更するマクロを作成したいと思っていますがうまく行きませんので、お知恵を拝借したいとおもいます。

環境:WindowsXPでオフィス2002
状況:
エクセルブックa.xlsのシートに「コントロールツールボックス」のテキストボックスを配置(オブジェクト名はTEXTBOX_C)
エクセルブックb.xlsにコードを書き、a.xlsのTEXTBOX_CのプロパティのValueかTextを取りだしたい

試した事:
コントロールを配置したシートに次のマクロ
TEXTBOX_C.Text = "これはコントロールのテキストボックス"
を書くとテキストボックスに文字を入れ込めますが、別のエクセルブックからだと上手く行きません。

また、オートシェイプのテキストボックスの場合は簡単に出きるのですが、コントロールツールボックスではどうしても上手く行きませんので、対象法などご存知の方いらっしゃいましたら教えてください

Aベストアンサー

エクセルを新規に開きました。
そのSheet1に(コントロールツールボックスの)TextBoxを貼りつけました。
そのBook1から、ファイル-開くで別ブックを開きました。
別ブックのMojule1側に下記を書いて
Sub test02()
MsgBox Workbooks("book1").Worksheets("sheet1").textbox1.Text
End Sub
を実行すると、Book1のTextBoxに入れた文字列が表示
されました。
がそんな質問ではないのですか。

QVB.NETのDataGridで、選択行の特定の列の内容を取得したい

タイトルにあるとおり、DataGridを使用している場合、実行時に選択された行の特定の列の内容を取得するにはどのようにすればよいのでしょうか?

DataGridは複雑で、まだよくわかっていません。
よろしくお願いします。

Aベストアンサー

選択している行番号は、dataGrid1.CurrentRowIndexでわかります。
行、列を指定して各セルにアクセスするには、
dataGrid1(行番号,列番号)でいいので
dataGrid1(dataGrid1.CurrentRowIndex,列番号)
で選択されている行の特定の列の内容を取得できます。
註:番号は、0始まり

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

QVB.NETでラベルの大きさってどうやって変えるの?

VB.NETでラベルの大きさってどうやって変えるの?
バージョンは2008

Aベストアンサー

あれ?
普通に
Widthプロパティ
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.width%28VS.100%29.aspx
やHeightプロパティを変更すればできるはずだけど、コード、IDE問わず。
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.height%28VS.100%29.aspx

#まぁAutoSizeプロパティをfalseにしないと、Textプロパティに代入された文字列を格納するのに必要な最低限の大きさに自動で調整されちゃうみたいだけど。
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.autosize.aspx

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング