Excel VBA 質問スレ Part75

■ このスレッドは過去ログ倉庫に格納されています
2022/02/09(水) 14:24:32.62ID:I0u44nFvd
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑2行に減ってるけど、同じ内容を3行に増やして貼り付けるナリ

ExcelのVBAに関する質問スレナリ
コード書き込みや作成依頼もOKナリ

※前スレ
Excel VBA 質問スレ Part74
https://mevius.5ch.net/test/read.cgi/tech/1639932059/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2022/04/13(水) 13:57:45.74ID:+aMOkW0p0
>>795
もうその図からマクロ実行させちゃえばいいじゃん
2022/04/13(水) 14:00:17.02ID:uBZa/q6E0
■質問
サウンド再生は何通りかあるけど、
一番遅延が小さい方法は何ですか?

winmmのPlaySound ?
800デフォルトの名無しさん (テテンテンテン MM8e-2p/j)
垢版 |
2022/04/13(水) 14:08:46.36ID:6qNApkxLM
>>798
多分それ自体わからんのちゃう?
Excel作った本人とかじゃなく事務員とかだろうし
2022/04/13(水) 15:42:21.02ID:7cmYTCQn0
3時間くらいかけてVBA作って、合間に別のエクセルファイル開いて、閉じようとしたら
「変更を保存しますか?」って出たので、保存せずに閉じたら。
VBAを作った方のファイルまで変更保存せずに閉じられてしまったーーー!!
どうにかならない?
802デフォルトの名無しさん (スップ Sd22-2p/j)
垢版 |
2022/04/13(水) 15:45:55.22ID:7IxClg8bd
とりあえず顧客に頭を下げてFAXでリスト送って頂いたのでしばらくはなんとかなりそうですがエクセルファイル自体のトラブルについては全員サッパリ意味不明なためどうしようも無さそうです…
(エクセルファイル作った方自身が既に会社にいないのでどうしようもない)

とりあえずエクセルファイルがどうする事もできないため私と社長ら数名は土日も休日出勤して1月から4月までの記録も全部紙ベースの資料に手書きで書き写す事になりそうです

しばらくは紙とペンでのアナログなやり方で回すしかないですがアドバイスくださった方ありがとうございました
2022/04/13(水) 17:20:07.59ID:SMVlXKyy0
>>801
3時間くらいなら今からやれよ
804デフォルトの名無しさん (ワッチョイ 068e-pUVk)
垢版 |
2022/04/13(水) 17:28:47.62ID:MldHjaMW0
>>802
あちこちマルチで書いて馬鹿かよ
どこかに金を出して頼めよ
ゆとりの馬鹿はこれだから
2022/04/13(水) 17:42:34.06ID:Wmi1ga+iM
>>801
該当のファイルを開いた状態でファイルタブのどこかにある自動保存云々が書いてある場所を探せ
運が良ければ一時ファイルが残ってる
残ってなけりゃ諦めろ
次からは動作確認をする前に保存する癖をつけるようにするんだな
2022/04/13(水) 19:21:42.96ID:9TA12m3K0
>>801
これがあるからコーティング中はOneDriveに置いとる
2022/04/13(水) 21:38:12.45ID:wBIIYhTid
>>805
何で誰でも言える極々普通のアドバイスをこんなに上から目線で言えるんだろう
2022/04/13(水) 21:47:36.66ID:MBul3VW80
便所の落書きにいちいち目くじら立てて突っ掛かるなよ
より一層老けて見えるぞ
2022/04/13(水) 22:55:33.89ID:uonj2wEf0
全国10エリアのそれぞれに、2016年度から6か年度分の「各年度集計用book」があり、
中身は1時間値と月合計を集計する等のクエリーが17あって、
これをsheet上のクエリーリストを基に
For Nextで順次更新・上書き保存するVBAを仕込んであります。

これとは別に、各エリアごとにやはりbookのフルパスリストを基に
For Nextで「各年度集計用book」を順次開いて、
中のVBAを実行するよう仕込んだ「各エリア一括更新book」を作りました。
(今さら2016年度を再集計するのは、たまにシレーッと修正が訴求修正が入るため)

これまで10ヶ月間ほどの月次更新では問題もなく動いてきたのですが、今月の更新で
・sheet名とクエリー名によるクエリー更新のステップでデバックエラーで止まった
・2つ目2017年度あたりのbookをVBAで開いたと思ったら、Excelごと落ちた
となり、不安定になりました。

モジュールごと再構成たり、「各年度用集計book」クエリー計算を簡略化して17ステップに削減したりして、
・タスクマネージャーでは動作中のメモリーは最大10GB/32GBくらい、CPU使用率は最大60%弱
・1つの「各年度集計用book」の所要時間に30秒程度
まで軽量化したのですが、今後もbook数が増えることを考えると
何か工夫のしどころはないものかと。

自分で気になっているのは、6か年度分のbook更新がどうにか上手くいっても、
「各エリア一括更新book」のプロジェクトに、
済んだはずの「各年度集計用book」の情報が残っていること。
https://i.imgur.com/BvkH6sr.png
よく分からないけれど、VBAが扱えるインスタンス数を超過しているのか?
これが残っていて良いのか、よくわかりません。

・Set wb = Workbooks.Open で開いて
・wb.Close SaveChanges:=True で上書き保存して閉じているのですが、
・For Next内で済んだ変数はできる限りNothingで開放
していますが、改善の余地はありますか?
2022/04/13(水) 23:53:53.55ID:uonj2wEf0
>>809 タイポ訂正
誤) 訴求修正
正) 遡及修正
2022/04/14(木) 08:48:02.28ID:jf4kHNax0
>>809
2022/04/14(木) 09:46:20.53ID:EGNxXvqd0
>>809
マクロを1つの専用ブックにまとめてみたら
2022/04/14(木) 13:25:49.47ID:E7ePXpuT0
VBAで他ブックのプロシージャを実行したいんだけど、実行まちをなくすことてできる?
Application.Run "Book2!Test2"
を実行したあと、"Book2!Test2"の処理終了を待たずに次の行に移りたいんだが。
2022/04/14(木) 13:53:36.44ID:TZzbtw0W0
非同期は無理
試してないけど、別のApplicationインスタンスを作成して
そちらでファイルを読み込んで実行とか
2022/04/14(木) 18:58:30.99ID:RElcaA4D0
メソッドを使い回したいときはクラスを別のクラスに参照渡ししてるんだけど、これってVBAに継承があれば機能的に処理できるのか
2022/04/14(木) 19:03:41.33ID:sxqTZKvqM
クラスのメンバーに他のクラスを入れるのがマイルド
2022/04/14(木) 19:25:43.40ID:RElcaA4D0
いいね
それ試してみよう
2022/04/14(木) 20:26:12.03ID:VI/N1Akx0
>>816
継承を委譲で置き換える、というだけですね…
2022/04/14(木) 21:25:22.08ID:YCtpuDrNx
参照設定なしでエクセルからアクセスファイルの操作をしようとしているのですが
フィールド定義の構文エラーが出ます。
テーブルの登録数を減らすと通りますが
上限か何かに引っかかっているのでしょうか?

Sub Test()

Dim CN As Object

Set CN = CreateObject("ADODB.Connection")
CN.Open "Provider = Microsoft.ACE.OLEDB.12.0; Data Source =" & "C:\Users\Downloads\データ.accdb"
CN.Execute "CREATE TABLE TBL(管理 INT,日付 DATE,番号 INT,内容 MEMO,担当 MEMO,OrderTeam MEMO,Place MEMO,Floor MEMO,GuestNum INT,種別 MEMO,物品 MEMO,対象 MEMO,状態 MEMO,時間1 MEMO,時間2 MEMO,Note MEMO,Total MEMO);"
CN.Close

MsgBox "作成しました。"

End Sub
2022/04/14(木) 21:40:59.88ID:zMqJUzcEa
MsgBox は、End Sub の外に出して下さい。
このスレの流れ的に。
2022/04/14(木) 22:31:20.84ID:Ep0kCh050
フィールド名 DATE は?  予約語では?
他には、day、month、table、text、user、when、where、year、zone とかも
2022/04/14(木) 22:55:38.45ID:Ep0kCh050
すまん 読み間違いだった MEMOが多いような気がするが、それも多分外してるな すまん 居ないことにしといてくれ
2022/04/14(木) 23:23:47.63ID:fL/YN0Wd0
予約後はNote
[]で括れ
2022/04/14(木) 23:41:44.78ID:kOhvUD5R0
解決しました。
感謝です!
2022/04/15(金) 14:24:02.27ID:TsNK8La+0
>>816
クラスになじめなかったくせに
2022/04/15(金) 15:02:32.60ID:m9CVWFGZ0
う、うるさい!
2022/04/16(土) 10:04:25.26ID:g0AA3ay0p
無理してクラス使わんでもええんやで
2022/04/16(土) 10:12:12.08ID:94XVUrLP0
保健室でいいってことか
2022/04/16(土) 10:20:43.39ID:Xjbe7mxod
特別クラスにさえ入れてもらえないのk
2022/04/16(土) 14:51:07.70ID:gJCOre2S0
今は特殊学級は廃止されつつあると聞いたわ
差別に繋がるからだとか
2022/04/16(土) 14:55:23.27ID:pYTE49690
>>830
それな

・ひまわり学級導入
 差別だから廃止しろ!

・ひまわり学級撤廃
 障がい者と一緒に授業できるわけねーだろ!分けろ!

これを5年ぐらいの周期でず〜〜〜っと繰り返してる。少なくともここ30年はそう
2022/04/16(土) 15:07:04.56ID:rh08QZl8a
1年目 ひまわり学級導入
6年目 ひまわり学級撤廃
11年目 ひまわり学級導入
16年目 ひまわり学級撤廃
21年目 ひまわり学級導入
26年目 ひまわり学級撤廃

30年目、ひまわり学級は撤廃された状態
2022/04/16(土) 17:39:51.13ID:aIa1oxEK0
コールバイネームしたいから無理にクラス使うというのはある。
2022/04/16(土) 18:34:28.46ID:gJCOre2S0
自分が通っていた学校の特殊学級は8組て名称だった
6組まではノーマルで何故か7組が無くて8組が特殊だった。
2022/04/16(土) 18:39:26.14ID:vqf9SIAK0
>>833
何故無理にCallbyName使う必要があるの?
標準モジュールなら普通にApplication.Runじゃダメなの?
2022/04/17(日) 02:09:30.35ID:BVP+DOJH0
>>835
コールバックのやり方調べた時に、
何か忘れたけど、他は面倒な制約があって、
コールバイネームしか使わなくなった。
2022/04/17(日) 03:28:38.26ID:N2omx0Taa
たまーに出てくるオブジェクト指向の話。
もうオブジェクト指向なんて忘れたは。
2022/04/17(日) 07:38:47.19ID:X2S+9pHC0
ワイのコードは素人指向
2022/04/17(日) 09:54:53.72ID:c23oRZKe0
>>837
それでも知らんうちに使ってるんやで
使ってる奴に意識させないのがオブジェクト指向
840デフォルトの名無しさん (ブーイモ MM8f-3xp7)
垢版 |
2022/04/17(日) 10:13:47.49ID:a3I3T2VGM
excel vbaではオブジェクトを利用したプログラミングにはなるけど、
それだけでオブジェクト指向だとは言えないな
2022/04/17(日) 10:56:37.84ID:acUYvJMnd
玄人志向が玄人向けだったのは最初だけ
842デフォルトの名無しさん (ワッチョイ 77da-+xkO)
垢版 |
2022/04/18(月) 22:09:45.73ID:dtBLR+IO0
どなたか相談に乗っていただきたいです。
現在、大学の講義で使用するため関数を作成しているのですが、最後に関数に戻り値を入れる際に「代入式の左辺の関数呼び出しは、バリアント型またはオブジェクト型の値を返さなけれななりません。」
とコンパイルエラーが出てしまいます。このエラーはどのように解決したらよいでしょうか?
2022/04/18(月) 22:14:18.56ID:5XyRTXLN0
コード見ないとちょっときつい
844デフォルトの名無しさん (ワッチョイ 1701-u7hf)
垢版 |
2022/04/18(月) 22:20:21.18ID:JAMU3YD50
コード作成お願いします!

2つのcsvがあってどちらも1列目に主キーがあります。
B:15列目の対応するキーの値を
A:3列目に代入
したいです。

できますかね?
845デフォルトの名無しさん (ワッチョイ 77da-+xkO)
垢版 |
2022/04/18(月) 22:25:33.62ID:dtBLR+IO0
Sub TEST1()
Dim Hight As Double, Time As Double
Hight = 0.4
Time = 2#
MsgBox WaveLength(Hight, Time)
End Sub

Function WaveLength(Hight, Time) As Double

Dim G As Double, PAI As Double
Dim WL0 As Double, WL1 As Double, WL2 As Double

G = 9.80665
PAI = WorksheetFunction.Pi()

WL0 = G * Time * Time / (2# * PAI)
WL1 = WL0

Do While ((WL2 - WL1) / WL1) >= 0.001
WL2 = WL0 * Worksheet.Tanh((2) * PAI * Hight / WL1)
If ((WL2 - WL1) / WL1) < 0.001 Then Exit Do
WL1 = 0.5 * (WL1 + WL2)
Loop

WaveLength() = WL2


End Function
846デフォルトの名無しさん (ワッチョイ 77da-+xkO)
垢版 |
2022/04/18(月) 22:26:31.08ID:dtBLR+IO0
>>845
こういった感じです
847デフォルトの名無しさん (ワッチョイ 77da-+xkO)
垢版 |
2022/04/18(月) 22:27:22.86ID:dtBLR+IO0
VBA自体初めてなので何からしたらいいのかわかっていない状況です。
2022/04/18(月) 22:30:08.42ID:5XyRTXLN0
>>845
functionの返り値使いたい時はfunction名に代入すればok。カッコは不要

Sub TEST1()
MsgBox WaveLength(Hight, Time)
End Sub

Function WaveLength(Hight, Time) As Double
WaveLength = 5
End Function
849デフォルトの名無しさん (ワッチョイ 77da-+xkO)
垢版 |
2022/04/18(月) 22:41:26.28ID:dtBLR+IO0
>>848
できました。ありがとうございます。
すみません、もう少し相談させていただいてもよろしいですか?
ループさせる際に値を変化させてDoにもどすことはできますか?
2022/04/18(月) 22:44:42.92ID:kMWXV8yj0
>>847
本筋と関係ない話だけど、HightとTimeは変数名に使わない方がいいよ
同じ名前の関数が既に存在するからトラブルの原因になる
別の単語か略語を考えて
851デフォルトの名無しさん (ワッチョイ 77da-+xkO)
垢版 |
2022/04/18(月) 22:46:49.95ID:dtBLR+IO0
>>850
小文字一文字とかでも大丈夫ですか?
2022/04/18(月) 22:48:03.57ID:tZvgKjwbd
それが出来るのがFunctionの良いところよ
戻り値は配列とかに入れておけばok
2022/04/18(月) 22:54:56.92ID:kMWXV8yj0
>>851
1文字でも動くけど、誰が見ても意味のわかる言葉にするのがマナー
どうしても別の単語を決められなかったら、Height1とかTime1とかにしとけばいい
1文字にするよりはマシ
2022/04/18(月) 23:00:04.07ID:5XyRTXLN0
マナーってなんだよw
あとで自分が見て分からなくなるのが問題
赤の他人が見てもわかるような名前にしておくと、自分のためになる
2022/04/18(月) 23:00:47.59ID:5XyRTXLN0
>>849
>ループさせる際に値を変化させてDoにもどすことはできますか?
言ってる意味がよくわからんかった
856デフォルトの名無しさん (ワッチョイ 77da-+xkO)
垢版 |
2022/04/18(月) 23:01:50.92ID:dtBLR+IO0
とりあえず、できました。
Sub TEST1()
Dim hight1 As Double, Time1 As Double
hight1 = 0.4
Time1 = 2#
MsgBox WaveLength(hight1, Time1)
End Sub

Function WaveLength(hight1, Time1) As Double

Dim G As Double, PAI As Double
Dim WL0 As Double, WL1 As Double, WL2 As Double

G = 9.80665
PAI = WorksheetFunction.Pi()

WL0 = G * Time1 * Time1 / (2# * PAI)
WL1 = WL0

Do While ((WL2 - WL1) / WL1) >= 0.001
WL2 = WL0 * Worksheet.Tanh((2) * PAI * hight1 / WL1)
WL1 = 0.5 * (WL1 + WL2)
Loop

WaveLength = WL2

End Function
857デフォルトの名無しさん (ワッチョイ 77da-+xkO)
垢版 |
2022/04/18(月) 23:03:04.12ID:dtBLR+IO0
ただ、まちがっているみたいです。
2022/04/18(月) 23:03:10.61ID:wKhqv1yX0
>>850
Hight なんていう関数あったっけ?
859デフォルトの名無しさん (ワッチョイ 77da-+xkO)
垢版 |
2022/04/18(月) 23:09:31.78ID:dtBLR+IO0
Doの中でWL2=WL0*tanh(2*PAI*H/WL1)を実行して、((WL2-WL1)/WL1)の絶対値が0.001より小さい場合には関数にWL2を代入して、0.001より大きい場合にはWL1=0.5*(WL1+WL2))と変換して再度Doを行うという繰り返しです。
860デフォルトの名無しさん (ワッチョイ 77da-+xkO)
垢版 |
2022/04/18(月) 23:13:08.37ID:dtBLR+IO0
すみません、わかりにくいですね。
WL1からなる計算式で求められるWL2とWL1の関係が条件に合わない場合、WL1をWL1とWL2の平均をとって再度WL2を求めたいです。
2022/04/18(月) 23:55:22.83ID:6SbGdBJw0
Do
WL2 = WL0 * Worksheet.Tanh((2) * PAI * hight1 / WL1)
If Abs((WL2 - WL1) / WL1) < 0.001 Then Exit Do

WL1 = 0.5 * (WL1 + WL2)
Loop
862デフォルトの名無しさん (アウアウウー Sa1b-729v)
垢版 |
2022/04/19(火) 05:01:48.08ID:dRTEe6m5a
どうでもいいが GやPAIは定数として関数の外にだす方が好き
2022/04/19(火) 06:39:40.35ID:UDMLP6tq0
>>858
cellsのプロパティにある
文脈的に予約後ってコトぐらいwかるだろ
2022/04/19(火) 07:20:27.86ID:KrqnU+fb0
>>863
Cells w
それを言うなら Range だし、Range にあるのは Height な
そもそも単なるプロパティ名で関数でも予約後でもないし
2022/04/19(火) 07:25:56.37ID:UDMLP6tq0
よく見たらhightかよクソがw
2022/04/19(火) 07:48:45.10ID:muVDZfH30
>>860
ざっくり見た感じだけなので詳しく分からないけどその計算式って正しい?
その計算式の内容と判定条件だと初期値の値によっては計算が収束せずに振動を繰り返すことになるので
ループから脱出できなくなる気がする
2022/04/19(火) 12:03:50.63ID:SIyX6JLR0
Do?Loopの例文見ると条件はWhileが多い気がする
自分はUntil派なんですが
2022/04/19(火) 12:41:24.95ID:y80OoYXYM
でっていう
2022/04/19(火) 12:53:32.89ID:Hbe28u0D0
Untilはコーディングミスで「なぜか抜けられない」状態が起きた時の解決がめんどくさいからあんま使いたくない
Whileならコーディングミスっても、値が範囲内でループし続けてるくらいしか原因がないから突き止めやすい
870デフォルトの名無しさん (ワッチョイ ff8e-lF56)
垢版 |
2022/04/19(火) 14:33:22.38ID:XaMNMP/i0
>>869
無能自慢?
2022/04/19(火) 14:38:03.91ID:Hbe28u0D0
>>870
リスクは減らしたいってだけの話
自分一人だけがマクロいじるとは限らないし
872デフォルトの名無しさん (ワッチョイ ff8e-lF56)
垢版 |
2022/04/19(火) 15:06:19.06ID:XaMNMP/i0
>>871
いや、お前が無能なだけ
873デフォルトの名無しさん (ガックシ 068f-EdYG)
垢版 |
2022/04/19(火) 15:24:45.82ID:Cixyrkk96
https://imgur.com/srNrR8t
一応、大学から共有されている理論式がこんな感じなのでおそらく会ってます
2022/04/19(火) 16:03:50.77ID:NrfRvlTVr
どうでもいいけど、Excelってそういう計算やったほうがいいんだっけ
小数点以下になるようなものは避けたほうがいいって記憶がある
2022/04/19(火) 16:13:18.16ID:Hbe28u0D0
小数点以下の計算は誤った結果が出ることも結構あるから、
・型はCurrencyにして小数点以下5桁までにする
・可能であれば整数に直してから計算させる
くらいはしておいた方がいいね
876デフォルトの名無しさん (ガックシ 068f-EdYG)
垢版 |
2022/04/19(火) 16:39:16.39ID:Cixyrkk96
Function WaveLength(Height1, Time1) As Double

Dim G As Double, PAI As Double
Dim WL0 As Currency, WL1 As Currency, WL2 As Currency

G = 9.80665
PAI = WorksheetFunction.Pi()

WL0 = G * Time1 * Time1 / (2# * PAI)
WL1 = WL0
WL2 = WL0 * WorksheetFunction.Tanh(2 * PAI * Height / WL1)


Do
WL2 = WL0 * WorksheetFunction.Tanh(2 * PAI * Height / WL1)

If Abs((WL2 - WL1) / WL1) < 0.001 Then Exit Do

WL1 = 0.5 * (WL1 + WL2)
Loop

WaveLength = WL2

End Function
とりあえずこういった感じで修正したものの実行するとオーバーフローするみたいです。
何が原因でしょうか?
877デフォルトの名無しさん (ガックシ 068f-EdYG)
垢版 |
2022/04/19(火) 16:41:24.14ID:Cixyrkk96
IF条件で抜け出せなくなってしまったとかでしょうか?
2022/04/19(火) 16:59:26.12ID:Hbe28u0D0
>>876
内容はあまりわかっていないが、できそうな対策から
お察しの通りLoopを抜ける判定が上手く行ってないと推測される
オーバーフロー対策に、書き換え可能であればDoじゃなくてForNextに書き換えたほうがいいかも

Function WaveLength(Height1, Time1) As Double
↑引数は接頭にByValかByRefかを書く 多分ByVal
そして引数の型も明記する 特にTime1はDate型かそれ以外か明記が必要
Dim G As Double, PAI As Double
 ↑どっちもCurrencyでいいかと
Dim WL0 As Currency, WL1 As Currency, WL2 As Currency
G = 9.80665
PAI = WorksheetFunction.Pi()
WL0 = G * Time1 * Time1 / (2# * PAI)
WL1 = WL0
'WL2 = WL0 * WorksheetFunction.Tanh(2 * PAI * Height / WL1)
 ↑ここのWL2はいらない
Do
WL2 = WL0 * WorksheetFunction.Tanh(2 * PAI * Height / WL1)
 ↑HeightはHeight1にする

'If Abs((WL2 - WL1) / WL1) < 0.001 Then Exit Do
'WL1 = 0.5 * (WL1 + WL2)
 ↑ここ2行は↓のように書き換える
 If Abs((WL2 - WL1) / WL1) *1000< 1 Then
   Exit Do
  Else’上の条件を満たしていないときはこの値を代入して処理を続けますよの記載にする
  WL1 = 0.5 * (WL1 + WL2)
  End If
Loop

WaveLength = WL2
879デフォルトの名無しさん (ワッチョイ ff8e-lF56)
垢版 |
2022/04/19(火) 17:04:43.35ID:XaMNMP/i0
馬鹿だからCurrencyを使うのだな
2022/04/19(火) 17:07:08.59ID:3cTbAnobM
数値計算に固定小数点数のCurrecyは駄目
浮動小数点数のDlubleでないと直ぐにオーバーフローする
881デフォルトの名無しさん (ワッチョイ 77da-EdYG)
垢版 |
2022/04/19(火) 17:34:34.65ID:C02npA8w0
解決しました!!本当にありがとうございます!
882デフォルトの名無しさん (ワッチョイ 77da-EdYG)
垢版 |
2022/04/19(火) 17:35:09.38ID:C02npA8w0
めっちゃ興奮するw
883デフォルトの名無しさん (ワッチョイ 77da-EdYG)
垢版 |
2022/04/19(火) 17:37:09.90ID:C02npA8w0
>>878
ありがとうございます!
2022/04/19(火) 17:44:54.91ID:Hbe28u0D0
>>883
解決したみたいで何よりです
多分、0.001より小さいかの判定だけがネックだったんだと思う
もし1と比較している理由を教授に訊かれたら「VBAだと小数の計算が正確ではない事象があるため、回避できるように数式を書きました」と答えとき
885デフォルトの名無しさん (ワッチョイ 77da-EdYG)
垢版 |
2022/04/19(火) 17:56:52.80ID:C02npA8w0
>>884
わかりました!
今回は本当助かりました。本当にありがとうございました。
2022/04/19(火) 22:29:37.25ID:2A4xjXpz0
おー理解できたのなら大学の工機前頑張ってなー
2022/04/20(水) 00:08:28.33ID:Tl7YCJ+60
double型を使って除算をすると小数点以下の誤差が出る場合があるのはどのように解決したら良いでしょうか
四捨五入では本来算出したい数値からズレてしまいます
currency型なら誤差が発生しない聞いたのですがどうやら馬鹿が使う物らしいので何か別の方法をご教示頂けませんでしょうか
888デフォルトの名無しさん (ワッチョイ ff8e-lF56)
垢版 |
2022/04/20(水) 00:24:45.89ID:TUC465n/0
>>887
馬鹿が悔しくて質問か?
除算で1÷3だったらどうなると思う?
2022/04/20(水) 00:37:19.89ID:EV0gbz680
>>887
除算した結果をどうしたいのかによる
結果を他の数値と比較したいのなら、比較したい数値に除数を掛けて比較する
2022/04/20(水) 02:03:14.67ID:HkpFcH5SM
実際のところ除算の丸め誤差が問題になることは少ない
数値計算では有効数字と桁数さえ把握していれば十分な精度で演算できる
というか浮動小数点だろうが固定小数点だろうが四捨五入すれば必ず丸め誤差は発生する
むしろ浮動小数点を扱う場合は桁数の差が大きい数値を加減算する時の情報落ちと、値が近い数値同士を減算する時の桁落ちの方が厄介
2022/04/20(水) 02:16:34.57ID:Tl7YCJ+60
>>889
分かりにくかったらごめんなさい
・数十行(場合により数百行から千行弱)の作業計画表があってそれぞれ開始日、終了日、工数を作業担当者が決定し、それとは別に納期を設定します
・各行では作業日数を算出し、工数を日割り計算し、小数点第二位で四捨五入、最終日に余りを加算して進捗の計画とします
・作業担当者は日毎に各項目の進捗率を入力します
・作業担当者はこのファイルとは別に上位工程担当者との連絡シートを更新し、そこで発生する追加工数などをこのファイルで読み込みます
・上記データを元に様々な演算を行い、納期に対して進み見込みか遅れ見込みか、またそれが何日の見込みかを算出します
・結果を当初計画、進捗実績および予測、納期などをグラフで可視化

という仕様のツールなのですが2つ目のあたりで余計なズレが発生して演算が狂ってしまう場合があり、
currency型に値を放り込んで強引にズレが生じないようにしているのが現状です
100%発生するのではなく20物件に1件程度の発生率なので如何したものかと頭を悩ませております
2022/04/20(水) 04:15:00.17ID:i+5dFZiZM
>>891
算数わかる?
2022/04/20(水) 06:42:44.94ID:PPr2by3tM
>891
2つ目のあたりというのがよく分からないけど箇条書きの2段目の項目のことなら処理の仕方が間違ってる
最後に余りを足すなら途中経過はすべて切捨てで処理、途中経過を四捨五入するなら全ての累積値を最後に被除数から引いて加算値を求める
どちらかで処理しないとズレるのは当たり前
2022/04/20(水) 07:19:32.03ID:Ls68Jrpy0
Currency型てのは誤差が出ないわけじゃなくて精度が固定されてるっていうことなんだけどな
そもそも工程表程度の精度で浮動小数点の誤差が問題になることなんてないだろうに
どうしても誤差が気になるなら割り算を商余で表現するとか演算順序の見直し(割り算を最後に)
2022/04/20(水) 07:23:24.83ID:uFaPvbC9M
>>893
余りは工数-日毎工数x作業日数で算出していましたが処理が違いますか?
勿論この場合余りが負の値になる状況もあるので正確には余りとは違う表現をするのが正しいのですが
これで算出した最終日の工数が3.5hになるべきところが3.49999hになるのは計算式の誤りですか?
2022/04/20(水) 07:34:26.59ID:lCHITGXH0
>>895
最後に小数点以下第二位で四捨五入すればいいじゃん
2022/04/20(水) 07:40:54.07ID:lCHITGXH0
>>895
どこでどれぐらい誤差が出るかは元データと計算式とデータ型によるから、その情報だけではどこが悪いか判断できない
工数は小数点以下第何位まで入力されてんの?

そもそもデータが1000行しかないんなら別にCurrencyのままでいいじゃん
仕事の目的はプログラミングじゃないんだから、結果がちゃんと出たんなら現時点ではそこで終わっとけ
誤差の処理をちゃんとやうとすると情報サイエンスの基礎をみっちりやらないと無理だから、今回の件とは別に自宅で時間かけて勉強しろ
2022/04/20(水) 07:47:48.41ID:uFaPvbC9M
>>896
四捨五入した値をdouble型に代入した際にもこの誤差が発生する場合もあったのですがその場合の対処はDoWhileで数値が丸められるまで四捨五入を繰り返す処理を噛ませれば良いですか?
それよりcurrency型に代入した方が処理を省略できるのではないでしょうか
担当者の癖や上位工程担当者の癖、物件の種類などを加味して分析して完了予測を出すためツール全体で2万弱のステップ数があり、可能な限り処理を早めたいです
まぁそんなの誤差の範囲じゃんとかもっと別に短縮出来る所あるだろって言われたらそれはそうってなるんですが

工数は小数点第一位までの入力です
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況