Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


541 / 2272 ツリー ←次へ | 前へ→

【11208】四捨五入のPGをもう少し工夫したいのですが。 tomomi 09/10/6(火) 9:40 質問[未読]
【11209】Re:四捨五入のPGをもう少し工夫したいので... hatena 09/10/6(火) 18:12 回答[未読]
【11211】Re:四捨五入のPGをもう少し工夫したいので... tomomi 09/10/7(水) 9:38 回答[未読]
【11212】Re:四捨五入のPGをもう少し工夫したいので... hatena 09/10/7(水) 10:09 回答[未読]
【11213】Re:四捨五入のPGをもう少し工夫したいので... tomomi 09/10/7(水) 10:49 回答[未読]
【11214】Re:四捨五入のPGをもう少し工夫したいので... 超初心者 09/10/7(水) 11:33 発言[未読]
【11215】Re:四捨五入のPGをもう少し工夫したいので... tomomi 09/10/7(水) 14:11 発言[未読]
【11216】Re:四捨五入のPGをもう少し工夫したいので... 超初心者 09/10/7(水) 15:59 発言[未読]
【11217】Re:四捨五入のPGをもう少し工夫したいので... tomomi 09/10/13(火) 10:01 お礼[未読]
【11227】Re:ちょっとひどいのでは? たん 09/10/15(木) 22:35 発言[未読]
【11228】Re:ちょっとひどいのでは? tomomi 09/10/16(金) 8:57 回答[未読]

【11208】四捨五入のPGをもう少し工夫したいのです...
質問  tomomi  - 09/10/6(火) 9:40 -

引用なし
パスワード
   Option Compare Database
'ダイアログの変数を定義

Private Type OPENFILENAME
lStructSize As Long
hwndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
Flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As Long
lpfnHook As Long
lpTemplateName As String
End Type

Private Declare Function GetOpenFileName Lib "Comdlg32" Alias "GetOpenFileNameA" (lpofn As OPENFILENAME) As Long


'参照ボタンクリック時にファイルを開くダイアログを表示

Private Sub 参照_Click()

 Dim o As OPENFILENAME
  With o
   .lpstrFile = String(256, vbNullChar)

   .nMaxFile = LenB(o.lpstrFile)
   .lpstrFilter = "テキストファイル" & vbNullChar & "*.txt;*.csv"
   .lpstrInitialDir = "C:\AcpkDB"
   .lStructSize = LenB(o)
  End With
 GetOpenFileName o
 If o.lpstrFile = vbNullChar Then
  MsgBox "キャンセルされました"
  Me.テキスト0 = ""
  Exit Sub
 End If
  Me.テキスト0 = Left(o.lpstrFile, InStr(o.lpstrFile, vbNullChar) - 1)


'選択したテキストファイル内のデータをテキスト1に表示する。

Dim TargetFile As String, n As Long, buf As String
  n = FreeFile
  TargetFile = Me.テキスト0
  buf = Space(FileLen(TargetFile))
  Open TargetFile For Binary As #n
    Get #n, , buf
  Close #n
  Me.テキスト1 = buf
End Sub


'四捨五入ボタンを押したとき


Private Sub 四捨五入_Click()
Me.テキスト2 = TextConv(Me.テキスト1)

End Sub

Private Sub Form_Open(Cancel As Integer)
  'フォームを開いた時点で
  DoCmd.Restore
  Me.テキスト0 = ""
  Me.テキスト1 = ""
  Me.テキスト2 = ""
  
  
  'テキスト1,2は編集ロックをかける
  
  Me.テキスト1.Enabled = False
  Me.テキスト1.Locked = True
  
  Me.テキスト2.Enabled = False
  Me.テキスト2.Locked = True
  
End Sub

Private Sub クリア_Click()

'クリアボタンを押すことでテキスト0〜2の文字を全て消去する
  Me.テキスト0 = ""
  Me.テキスト1 = ""
  Me.テキスト2 = ""
  Me.参照.SetFocus
  
End Sub

Private Sub 終了_Click()
'終了ボタンを押すことで全てを終了する

  DoCmd.Quit
  
End Sub
'四捨五入

Function TextConv(文字列 As String) As String
 
 Const 数字データ = "0123456789.", 四捨五入 As Currency = 0.05
 Dim 数字列 As Integer, 変換数値 As String
 Dim Idx1 As Long, Idx2 As Long, 文字列数 As Long
 
 TextConv = 文字列
 文字列数 = Len(文字列) + 1
  
  For Idx1 = 1 To 文字列数
  
  If Idx1 <> 文字列数 And _
    InStr(1, 数字データ, Mid(文字列, Idx1, 1), vbBinaryCompare) > 0 Then
   数字列 = 数字列 + 1
   
  Else
  
   If 数字列 > 0 Then
    変換数値 = Mid(文字列, Idx1 - 数字列, 数字列)
    変換数値 = Format(Int((Val(変換数値) + 四捨五入) * 10) / 10, "0.00")
    
    If Len(変換数値) > 数字列 Then
     TextConv = Left(TextConv, Idx1 + Idx2 - 数字列 - 1) & NumStr & _
           Mid(文字列, Idx1)
     Idx2 = Idx2 + 1
    Else
    
     Mid(TextConv, Idx1 + Idx2 - 数字列, 数字列) = 変換数値
    
    End If
    
    数字列 = 0
   End If
  
  End If
 
 Next Idx1

End Function


突然の質問失礼します。
今大変困っておりまして・・・。アクセス初心者でいま
壁にぶつかってしまいました。色々な教本を読んでもうまく参考になるものがなくて困っております。
小数第二位の四捨五入小数点0.66などふたけたのものがあり0.70と二桁を四捨五入することは出来たのですが。

内容はといいますとテキスト内の数字を探し小数点の付いた数字を指定の桁数で四捨五入して表示できるようにしたいのです、どうプログラムを書き換えてよいものかわかりません。
色々と突然質問してしまってすみません。

アクセスは2000を使ってます。

上記の作成したプログラムを実行しますと
任意のテキストファイル参照ボタンをおしてリードし
テキスト2ボックスにテキストファイル内データが表示される。
内容は以下です

これは0.88ですが0.90になります。
これは0.19ですが0.20になります。
これは0.76ですが0.80になります。

これは四捨五入です。

というものが
四捨五入ボタンを押す事で
下記のように結果変化しテキスト3ボックスに表示されます

これは0.90ですが0.90になります。
これは0.20ですが0.20になります。
これは0.80ですが0.80になります。

これは四捨五入です。

としっかり動くのですが。ここまでは良いと致しまして。

ですが文を少し変えて
このようなふうにすると。

これは0.88ですが0.90になります。
これは0.1966ですが0.20になります。
これは0.7ですが0.80555になります。
これは0.861ですが0.90に112あ.43216なりま112b.4c3216す。

これは四捨五入です。

と、結果が

これは0.90ですが0.90になります。
これは0.2066ですが0.20になります。
これはですが0.800.80なります。
これは0.860.900.900.90ああ.4320.40ま112bb.4c3c321す。

これは四捨五入です。

0.1966は0.2066となり
0.7は消えてしまい。
0.861ですが〜  860.900.900.90ああ.4320.40ま112bb.4c3c321す。
となってしまい。

このような、大変わけのわからないものになってしまい。どこがおかしいのかも良くわかりません。

もうしわけございませんがアドバイスよろしくおねがいします。

【11209】Re:四捨五入のPGをもう少し工夫したいの...
回答  hatena  - 09/10/6(火) 18:12 -

引用なし
パスワード
   提示されたコードは数値の書式が 0.00 という前提になっているのでは。
このコードはtomomiさんが書いたものですか。

> これは0.88ですが0.90になります。
> これは0.1966ですが0.20になります。
> これは0.7ですが0.80555になります。
> これは0.861ですが0.90に112あ.43216なりま112b.4c3216す。
>
> これは四捨五入です。

この文章を変換後、どのようになるのが希望ですか。

また、その法則を論理的な言葉で説明してください。

【11211】Re:四捨五入のPGをもう少し工夫したいの...
回答  tomomi  - 09/10/7(水) 9:38 -

引用なし
パスワード
   ▼hatena さん:
>提示されたコードは数値の書式が 0.00 という前提になっているのでは。
>このコードはtomomiさんが書いたものですか。
 すみません。
 ネット内で似たような内容を検索した所出てきて引用させていただいた
 コードです。
>
>> これは0.88ですが0.90になります。
>> これは0.1966ですが0.20になります。
>> これは0.7ですが0.80555になります。
>> これは0.861ですが0.90に112あ.43216なりま112b.4c3216す。
>>
>> これは四捨五入です。
>
>この文章を変換後、どのようになるのが希望ですか。
 
  hatenaさん返信ありがとうございます。
  小数点第何位を四捨五入するかによって

  ●小数第二位を四捨五入であれば

  結果はこうしたいのですが。

  これは0.90ですが0.90になります。
  これは0.2066ですが0.20になります。
  これは0.7ですが0.80555になります。
  これは0.901ですが0.90に112あ.43216なりま112b.4c3216す。 
 
  ●小数第三位を四捨五入であれば
  
  結果はこうしたいのですが。

  これは0.88ですが0.90になります。
  これは0.2006ですが0.20になります。
  これは0.7ですが0.81055になります。
  これは0.860ですが0.90に112あ.43216なりま112b.4c3216す。

 >また、その法則を論理的な言葉で説明してください。
 
  任意に四捨五入のする位置を決定し、どのようにと言いますと四捨五入する
  位置を数字入力等して決めてもらい、例えば、数字入力するテキストボック
  スに"3"と入れたら=少数第3位を四捨五入するに設定される。
  そして、少数第二位までしかない数字はそのままで。少数第3位のある数字
  はそこで四捨五入する、また、それ以上小数点以下のものがあれば、文字列
  として残したいという作業をしたいのですが。
 
  かなり難しいことですよね・・・・。
  ACCESS始めたばかりで良く理解が出来ていないところが多く申し訳ありません


  すみません質問ややこしくて。

【11212】Re:四捨五入のPGをもう少し工夫したいの...
回答  hatena  - 09/10/7(水) 10:09 -

引用なし
パスワード
   > すみません。
> ネット内で似たような内容を検索した所出てきて引用させていただいた
> コードです。

tomomiさんのVBAスキルを知りたかったため質問しました。
VBAスキルによって回答も変わってきますので。

今回の処理に関係ないコードも提示していると言うことは、
コードの内容、意味はほとんど理解できてないと思えますが、
どうですか。

少なくとも、今回の処理に関係ある部分だけ抜き出せるぐらいの
VBAスキルがないと、このサイトの下記の基本方針に該当することに
なりかねません。

-----------------------------------------------------------------
してはいけない質問について

 ・丸投げ
   「○○するにはどうすればいいか教えてください」といったような、
   コードを最初から最後まで教えてもらうことを期待するような質問
-------------------------------------------------------------------

関係あるコードのみ提示して、
自分でどのように修正してみたのか、
あるいはコード内で理解できない部分は、どこか、
など、自分が理解しようと努力したことを示すような
質問をしてください。

> >また、その法則を論理的な言葉で説明してください。
> 
>  任意に四捨五入のする位置を決定し、どのようにと言いますと四捨五入する
>  位置を数字入力等して決めてもらい、例えば、数字入力するテキストボック
>  スに"3"と入れたら=少数第3位を四捨五入するに設定される。
>  そして、少数第二位までしかない数字はそのままで。少数第3位のある数字
>  はそこで四捨五入する、また、それ以上小数点以下のものがあれば、文字列
>  として残したいという作業をしたいのですが。

例示されたデータでは、数値は 1未満(0.88, 0.2006・・)のものだけですが、
実際のデータもそうなのでしょうか。1以上のデータを含む場合もあるのでしょうか。

【11213】Re:四捨五入のPGをもう少し工夫したいの...
回答  tomomi  - 09/10/7(水) 10:49 -

引用なし
パスワード
   hatenaさん 
ご指導ありがとうございます。

>今回の処理に関係ないコードも提示していると言うことは、
>コードの内容、意味はほとんど理解できてないと思えますが、
>どうですか。

実際のところ申し訳ありませんが全ては理解できていません。
動きを調べてぬきだしてみました。

>少なくとも、今回の処理に関係ある部分だけ抜き出せるぐらいの
>VBAスキルがないと、このサイトの下記の基本方針に該当することに
>なりかねません。

下記内容が必要な部分で抜き出した見ました。 

Function TextConv(文字列 As String) As String
 
 Const 数字データ = "0123456789.", 四捨五入 As Currency = 0.05
 Dim 数字列 As Integer, 変換数値 As String
 Dim Idx1 As Long, Idx2 As Long, 文字列数 As Long
 
 TextConv = 文字列
 文字列数 = Len(文字列) + 1
  
  For Idx1 = 1 To 文字列数
  
  If Idx1 <> 文字列数 And _
    InStr(1, 数字データ, Mid(文字列, Idx1, 1), vbBinaryCompare) > 0 Then
   数字列 = 数字列 + 1
   
  Else
  
   If 数字列 > 0 Then
    変換数値 = Mid(文字列, Idx1 - 数字列, 数字列)
    変換数値 = Format(Int((Val(変換数値) + 四捨五入) * 10) / 10, "0.00")
    
    If Len(変換数値) > 数字列 Then
     TextConv = Left(TextConv, Idx1 + Idx2 - 数字列 - 1) & NumStr & _
           Mid(文字列, Idx1)
     Idx2 = Idx2 + 1
    Else
    
     Mid(TextConv, Idx1 + Idx2 - 数字列, 数字列) = 変換数値
    
    End If
    
    数字列 = 0
   End If
  
  End If
 
 Next Idx1

End Function


>関係あるコードのみ提示して、
>自分でどのように修正してみたのか、
>あるいはコード内で理解できない部分は、どこか、
>など、自分が理解しようと努力したことを示すような
>質問をしてください。

>例示されたデータでは、数値は 1未満(0.88, 0.2006・・)のものだけですが、
>実際のデータもそうなのでしょうか。1以上のデータを含む場合もあるのでしょうか。

1.65、5.635、52.52695など1以上の数字にも対応できるようにしたいです。
少数第二位の場合
1.70、5.605、52.50695
となるように。
少数第三位の場合
1.65、5.640、52.53095
となるように


四捨五入をするに当たりどこで四捨五入をするかを任意で決めれるように
悩んでみた結果ですがうまくいきません・・・

Function TextConv(文字列 As String) As String
 
 Const 数字データ = "0123456789.", 四捨五入 As Currency = 0.05
 Dim 少数第何位 As Integer
 Dim 数字列 As Integer, 変換数値 As String
 Dim Idx1 As Long, Idx2 As Long, 文字列数 As Long
 
 
 TextConv = 文字列
 文字列数 = Len(文字列) + 1
 変換数値 = 0
  For Idx1 = 1 To 文字列数
  
  If Idx1 <> 文字列数 And _
    InStr(1, 数字データ, Mid(文字列, Idx1, 1), vbBinaryCompare) > 0 Then
   数字列 = 数字列 + 1


  Else
  
   If 数字列 > 0 Then
    変換数値 = Mid(文字列, Idx1 - 数字列, 数字列)
    少数第何位 = Me.少数第何位
   Select Case 少数第何位
  
   Case 1
    変換数値 = Format(Int((Val(変換数値) + 四捨五入)) / "0.0")
   Case 2
    変換数値 = Format(Int((Val(変換数値) + 四捨五入) * 10) / 10, "0.00")
   Case 3
    変換数値 = Format(Int((Val(変換数値) + 四捨五入) * 100) / 100, "0.000")
   Case 4
    変換数値 = Format(Int((Val(変換数値) + 四捨五入) * 1000) / 1000, "0.0000")
   Case 5
    変換数値 = Format(Int((Val(変換数値) + 四捨五入) * 10000) / 10000, "0.00000")
   Case 6
    変換数値 = Format(Int((Val(変換数値) + 四捨五入) * 100000) / 100000, "0.000000")
   Case 7
    変換数値 = Format(Int((Val(変換数値) + 四捨五入) * 1000000) / 1000000, "0.0000000")
   Case 8
    変換数値 = Format(Int((Val(変換数値) + 四捨五入) * 10000000) / 10000000, "0.00000000")
   Case 9
    変換数値 = Format(Int((Val(変換数値) + 四捨五入) * 100000000) / 10000000, "0.00000000")
    
   End Select
    
    If Len(変換数値) > 数字列 Then
     TextConv = Left(TextConv, Idx1 + Idx2 - 数字列 - 1) & NumStr & Mid(文字列, Idx1)
     Idx2 = Idx2 + 1
    Else
    
     Mid(TextConv, Idx1 + Idx2 - 数字列, 数字列) = 変換数値
    
    End If
    
    数字列 = 0
   
  End If
  End If
 
 Next Idx1

End Function

とたとえば四捨五入の位を入れるテキストボックスに1〜9の数字を入れられた場合に処理を分けて見たりしたのですが。
1を入力ではオーバーフローしてしまい。

2入力でも
こんなデーターが

sdfg
fgsは0.7ですが0.80555dfgsdfhh。
egdは0.861ですが0.90に112あ.43216なりま112b.4c3216す。

こんなふうに
sdfg
fgsはですが0.800.80fgsdfhh。
egdは0.860.900.900.90ああ.4320.40ま112bb.4c3c321す。

なってしまいます。

【11214】Re:四捨五入のPGをもう少し工夫したいの...
発言  超初心者  - 09/10/7(水) 11:33 -

引用なし
パスワード
   ▼tomomi さん:
一部だけ。。。(中途半端ですみません)

Function TextConv 単体をこちらの環境で走らせてみたところ、
「NumStr」が定義されてない旨のエラーになりました。
そちらで動くということは、どこか別のところで定義されているのかもしれませんが、

おそらく内容がうまく格納されておらず、
> 0.7は消えてしまい。

> 〜 0.800.80なります 〜
の原因になっているかと思われます。

また、
> Idx2 = Idx2 + 1
これは、"0.7" と "0.70" という、文字列数の差が1のときは良いですが、
それ以外ではズレの原因となるかと思われます。


Midでの置換において、"0.1966" -> "0.20" = "0.2066"
となります。
つまり、同文字数でなければ、
> TextConv = Left(TextConv, Idx1 + Idx2 - 数字列 - 1) 〜
と同じような処理が必要かと思います。


というように、文字の位置や長さによって複雑化してしまうので
変数を準備し、そこに置換後の文字を入れていく、
という方法を取られた方が無難かもしれません。


参考までに。。。

【11215】Re:四捨五入のPGをもう少し工夫したいの...
発言  tomomi  - 09/10/7(水) 14:11 -

引用なし
パスワード
   ▼超初心者 さん:
ご連絡ありがとうございます!
「NumStr」は定義ミスでした・・・。
「NumStr」は間違いでそこには定義済みの、「変換数値」が入ります。
申し訳ありません。


>▼tomomi さん:
>一部だけ。。。(中途半端ですみません)
>
>Function TextConv 単体をこちらの環境で走らせてみたところ、
>「NumStr」が定義されてない旨のエラーになりました。
>そちらで動くということは、どこか別のところで定義されているのかもしれませんが、
>
>おそらく内容がうまく格納されておらず、
>> 0.7は消えてしまい。
>や
>> 〜 0.800.80なります 〜
>の原因になっているかと思われます。
>
>また、
>> Idx2 = Idx2 + 1
>これは、"0.7" と "0.70" という、文字列数の差が1のときは良いですが、
>それ以外ではズレの原因となるかと思われます。
>
>
このズレの原因部をどうすれば良いのかがわかりません。

>Midでの置換において、"0.1966" -> "0.20" = "0.2066"
>となります。
>つまり、同文字数でなければ、
>> TextConv = Left(TextConv, Idx1 + Idx2 - 数字列 - 1) 〜
>と同じような処理が必要かと思います。
>
>
>というように、文字の位置や長さによって複雑化してしまうので
>変数を準備し、そこに置換後の文字を入れていく、
>という方法を取られた方が無難かもしれません。
>
>
>参考までに。。。

【11216】Re:四捨五入のPGをもう少し工夫したいの...
発言  超初心者  - 09/10/7(水) 15:59 -

引用なし
パスワード
   ▼tomomi さん:
> Idx2 = Idx2 + 1
+1は単純に考えると、Len(変換数値) と 数字列 の差 ですよね?
そのつもりで、ここに設置しているのですよね?

であれば、修正もできるのでは?


と言っても、文字列の現在見ている位置も変わるので
単純ではなく、他のところの修正も必要そうです^^;;

私は頭の良い方ではないので、
位置関係を整理するのに時間かかりそうです^^;;


>>というように、文字の位置や長さによって複雑化してしまうので
>>変数を準備し、そこに置換後の文字を入れていく、
>>という方法を取られた方が無難かもしれません。
こちらの方法はご検討いただけないのでしょうか?
何か特別な理由でもおありでしょうか?

【11217】Re:四捨五入のPGをもう少し工夫したいの...
お礼  tomomi  - 09/10/13(火) 10:01 -

引用なし
パスワード
   >
>>>というように、文字の位置や長さによって複雑化してしまうので
>>>変数を準備し、そこに置換後の文字を入れていく、
>>>という方法を取られた方が無難かもしれません。
>こちらの方法はご検討いただけないのでしょうか?
>何か特別な理由でもおありでしょうか?

上記のアドバイスのおかげで、変数を置き。定義にあわせた式に変更した結果
正確な結果が得られました。本当助かりました。

【11227】Re:ちょっとひどいのでは?
発言  たん  - 09/10/15(木) 22:35 -

引用なし
パスワード
   他の方が、AccessClubで提示したコードを、

他の掲示板(こちら)で、拾ったコードだと言い訳して、
質問のようにみせかけるのは、ちょっとやり方が酷いのでは
ないでしょうか?

【11228】Re:ちょっとひどいのでは?
回答  tomomi  - 09/10/16(金) 8:57 -

引用なし
パスワード
   ▼たん さん:
>他の方が、AccessClubで提示したコードを、
>
>他の掲示板(こちら)で、拾ったコードだと言い訳して、
>質問のようにみせかけるのは、ちょっとやり方が酷いのでは
>ないでしょうか?

申し訳ございません、色々と話を
聞き無事内容が解決いたしました。
レスをつけていただき本当ありがとうございます。

541 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078195
(SS)C-BOARD v3.8 is Free