!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
探検
Excel VBA 質問スレ Part75
レス数が900を超えています。1000を超えると表示できなくなるよ。
1デフォルトの名無しさん (スフッ Sd7f-wadS)
2022/02/09(水) 14:24:32.62ID:I0u44nFvd834デフォルトの名無しさん (ワッチョイ 17da-UOua)
2022/04/16(土) 18:34:28.46ID:gJCOre2S0 自分が通っていた学校の特殊学級は8組て名称だった
6組まではノーマルで何故か7組が無くて8組が特殊だった。
6組まではノーマルで何故か7組が無くて8組が特殊だった。
835デフォルトの名無しさん (ワッチョイ 9f4f-Ndav)
2022/04/16(土) 18:39:26.14ID:vqf9SIAK0836デフォルトの名無しさん (ワッチョイ d7da-dJ8g)
2022/04/17(日) 02:09:30.35ID:BVP+DOJH0837デフォルトの名無しさん (アウアウウー Sa1b-+1fN)
2022/04/17(日) 03:28:38.26ID:N2omx0Taa たまーに出てくるオブジェクト指向の話。
もうオブジェクト指向なんて忘れたは。
もうオブジェクト指向なんて忘れたは。
838デフォルトの名無しさん (ワッチョイ 9fda-wCJf)
2022/04/17(日) 07:38:47.19ID:X2S+9pHC0 ワイのコードは素人指向
839デフォルトの名無しさん (ワッチョイ 1701-hfAD)
2022/04/17(日) 09:54:53.72ID:c23oRZKe0840デフォルトの名無しさん (ブーイモ MM8f-3xp7)
2022/04/17(日) 10:13:47.49ID:a3I3T2VGM excel vbaではオブジェクトを利用したプログラミングにはなるけど、
それだけでオブジェクト指向だとは言えないな
それだけでオブジェクト指向だとは言えないな
841デフォルトの名無しさん (スプッッ Sddf-X/6k)
2022/04/17(日) 10:56:37.84ID:acUYvJMnd 玄人志向が玄人向けだったのは最初だけ
842デフォルトの名無しさん (ワッチョイ 77da-+xkO)
2022/04/18(月) 22:09:45.73ID:dtBLR+IO0 どなたか相談に乗っていただきたいです。
現在、大学の講義で使用するため関数を作成しているのですが、最後に関数に戻り値を入れる際に「代入式の左辺の関数呼び出しは、バリアント型またはオブジェクト型の値を返さなけれななりません。」
とコンパイルエラーが出てしまいます。このエラーはどのように解決したらよいでしょうか?
現在、大学の講義で使用するため関数を作成しているのですが、最後に関数に戻り値を入れる際に「代入式の左辺の関数呼び出しは、バリアント型またはオブジェクト型の値を返さなけれななりません。」
とコンパイルエラーが出てしまいます。このエラーはどのように解決したらよいでしょうか?
843デフォルトの名無しさん (ワッチョイ b768-fNw1)
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列目に代入
したいです。
できますかね?
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
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自体初めてなので何からしたらいいのかわかっていない状況です。
848デフォルトの名無しさん (ワッチョイ b768-fNw1)
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
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+IO0850デフォルトの名無しさん (ワッチョイ 1fbe-X/6k)
2022/04/18(月) 22:44:42.92ID:kMWXV8yj0851デフォルトの名無しさん (ワッチョイ 77da-+xkO)
2022/04/18(月) 22:46:49.95ID:dtBLR+IO0 >>850
小文字一文字とかでも大丈夫ですか?
小文字一文字とかでも大丈夫ですか?
852デフォルトの名無しさん (スプッッ Sd3f-DvUi)
2022/04/18(月) 22:48:03.57ID:tZvgKjwbd それが出来るのがFunctionの良いところよ
戻り値は配列とかに入れておけばok
戻り値は配列とかに入れておけばok
853デフォルトの名無しさん (ワッチョイ 1fbe-X/6k)
2022/04/18(月) 22:54:56.92ID:kMWXV8yj0854デフォルトの名無しさん (ワッチョイ b768-fNw1)
2022/04/18(月) 23:00:04.07ID:5XyRTXLN0 マナーってなんだよw
あとで自分が見て分からなくなるのが問題
赤の他人が見てもわかるような名前にしておくと、自分のためになる
あとで自分が見て分からなくなるのが問題
赤の他人が見てもわかるような名前にしておくと、自分のためになる
855デフォルトの名無しさん (ワッチョイ b768-fNw1)
2022/04/18(月) 23:00:47.59ID:5XyRTXLN0856デフォルトの名無しさん (ワッチョイ 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
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 ただ、まちがっているみたいです。
858デフォルトの名無しさん (ワッチョイ 9f01-0UVf)
2022/04/18(月) 23:03:10.61ID:wKhqv1yX0 >>850
Hight なんていう関数あったっけ?
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を求めたいです。
WL1からなる計算式で求められるWL2とWL1の関係が条件に合わない場合、WL1をWL1とWL2の平均をとって再度WL2を求めたいです。
861デフォルトの名無しさん (ワッチョイ 7749-qaox)
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
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は定数として関数の外にだす方が好き
863デフォルトの名無しさん (ワッチョイ b768-fNw1)
2022/04/19(火) 06:39:40.35ID:UDMLP6tq0864デフォルトの名無しさん (ワッチョイ 9f01-0UVf)
2022/04/19(火) 07:20:27.86ID:KrqnU+fb0865デフォルトの名無しさん (ワッチョイ b768-fNw1)
2022/04/19(火) 07:25:56.37ID:UDMLP6tq0 よく見たらhightかよクソがw
866デフォルトの名無しさん (ワッチョイ 97da-2Xjs)
2022/04/19(火) 07:48:45.10ID:muVDZfH30 >>860
ざっくり見た感じだけなので詳しく分からないけどその計算式って正しい?
その計算式の内容と判定条件だと初期値の値によっては計算が収束せずに振動を繰り返すことになるので
ループから脱出できなくなる気がする
ざっくり見た感じだけなので詳しく分からないけどその計算式って正しい?
その計算式の内容と判定条件だと初期値の値によっては計算が収束せずに振動を繰り返すことになるので
ループから脱出できなくなる気がする
867デフォルトの名無しさん (ワッチョイ bf14-4qoo)
2022/04/19(火) 12:03:50.63ID:SIyX6JLR0 Do?Loopの例文見ると条件はWhileが多い気がする
自分はUntil派なんですが
自分はUntil派なんですが
868デフォルトの名無しさん (ラクッペペ MM8f-ku93)
2022/04/19(火) 12:41:24.95ID:y80OoYXYM でっていう
869デフォルトの名無しさん (ワッチョイ ffbb-GYib)
2022/04/19(火) 12:53:32.89ID:Hbe28u0D0 Untilはコーディングミスで「なぜか抜けられない」状態が起きた時の解決がめんどくさいからあんま使いたくない
Whileならコーディングミスっても、値が範囲内でループし続けてるくらいしか原因がないから突き止めやすい
Whileならコーディングミスっても、値が範囲内でループし続けてるくらいしか原因がないから突き止めやすい
870デフォルトの名無しさん (ワッチョイ ff8e-lF56)
2022/04/19(火) 14:33:22.38ID:XaMNMP/i0 >>869
無能自慢?
無能自慢?
871デフォルトの名無しさん (ワッチョイ ffbb-GYib)
2022/04/19(火) 14:38:03.91ID:Hbe28u0D0872デフォルトの名無しさん (ワッチョイ 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
一応、大学から共有されている理論式がこんな感じなのでおそらく会ってます
一応、大学から共有されている理論式がこんな感じなのでおそらく会ってます
874デフォルトの名無しさん (オッペケ Sr8b-ny4V)
2022/04/19(火) 16:03:50.77ID:NrfRvlTVr どうでもいいけど、Excelってそういう計算やったほうがいいんだっけ
小数点以下になるようなものは避けたほうがいいって記憶がある
小数点以下になるようなものは避けたほうがいいって記憶がある
875デフォルトの名無しさん (ワッチョイ ffbb-GYib)
2022/04/19(火) 16:13:18.16ID:Hbe28u0D0 小数点以下の計算は誤った結果が出ることも結構あるから、
・型はCurrencyにして小数点以下5桁までにする
・可能であれば整数に直してから計算させる
くらいはしておいた方がいいね
・型は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
とりあえずこういった感じで修正したものの実行するとオーバーフローするみたいです。
何が原因でしょうか?
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条件で抜け出せなくなってしまったとかでしょうか?
878デフォルトの名無しさん (ワッチョイ ffbb-GYib)
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
内容はあまりわかっていないが、できそうな対策から
お察しの通り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を使うのだな
880デフォルトの名無しさん (ラクッペペ MM8f-/HVa)
2022/04/19(火) 17:07:08.59ID:3cTbAnobM 数値計算に固定小数点数のCurrecyは駄目
浮動小数点数のDlubleでないと直ぐにオーバーフローする
浮動小数点数の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
ありがとうございます!
ありがとうございます!
884デフォルトの名無しさん (ワッチョイ ffbb-GYib)
2022/04/19(火) 17:44:54.91ID:Hbe28u0D0 >>883
解決したみたいで何よりです
多分、0.001より小さいかの判定だけがネックだったんだと思う
もし1と比較している理由を教授に訊かれたら「VBAだと小数の計算が正確ではない事象があるため、回避できるように数式を書きました」と答えとき
解決したみたいで何よりです
多分、0.001より小さいかの判定だけがネックだったんだと思う
もし1と比較している理由を教授に訊かれたら「VBAだと小数の計算が正確ではない事象があるため、回避できるように数式を書きました」と答えとき
885デフォルトの名無しさん (ワッチョイ 77da-EdYG)
2022/04/19(火) 17:56:52.80ID:C02npA8w0886デフォルトの名無しさん (ワッチョイ 17da-UOua)
2022/04/19(火) 22:29:37.25ID:2A4xjXpz0 おー理解できたのなら大学の工機前頑張ってなー
887デフォルトの名無しさん (ワッチョイ b717-73NO)
2022/04/20(水) 00:08:28.33ID:Tl7YCJ+60 double型を使って除算をすると小数点以下の誤差が出る場合があるのはどのように解決したら良いでしょうか
四捨五入では本来算出したい数値からズレてしまいます
currency型なら誤差が発生しない聞いたのですがどうやら馬鹿が使う物らしいので何か別の方法をご教示頂けませんでしょうか
四捨五入では本来算出したい数値からズレてしまいます
currency型なら誤差が発生しない聞いたのですがどうやら馬鹿が使う物らしいので何か別の方法をご教示頂けませんでしょうか
888デフォルトの名無しさん (ワッチョイ ff8e-lF56)
2022/04/20(水) 00:24:45.89ID:TUC465n/0889デフォルトの名無しさん (ワッチョイ ffbb-0fbr)
2022/04/20(水) 00:37:19.89ID:EV0gbz680890デフォルトの名無しさん (ラクッペペ MM8f-/HVa)
2022/04/20(水) 02:03:14.67ID:HkpFcH5SM 実際のところ除算の丸め誤差が問題になることは少ない
数値計算では有効数字と桁数さえ把握していれば十分な精度で演算できる
というか浮動小数点だろうが固定小数点だろうが四捨五入すれば必ず丸め誤差は発生する
むしろ浮動小数点を扱う場合は桁数の差が大きい数値を加減算する時の情報落ちと、値が近い数値同士を減算する時の桁落ちの方が厄介
数値計算では有効数字と桁数さえ把握していれば十分な精度で演算できる
というか浮動小数点だろうが固定小数点だろうが四捨五入すれば必ず丸め誤差は発生する
むしろ浮動小数点を扱う場合は桁数の差が大きい数値を加減算する時の情報落ちと、値が近い数値同士を減算する時の桁落ちの方が厄介
891デフォルトの名無しさん (ワッチョイ b717-73NO)
2022/04/20(水) 02:16:34.57ID:Tl7YCJ+60 >>889
分かりにくかったらごめんなさい
・数十行(場合により数百行から千行弱)の作業計画表があってそれぞれ開始日、終了日、工数を作業担当者が決定し、それとは別に納期を設定します
・各行では作業日数を算出し、工数を日割り計算し、小数点第二位で四捨五入、最終日に余りを加算して進捗の計画とします
・作業担当者は日毎に各項目の進捗率を入力します
・作業担当者はこのファイルとは別に上位工程担当者との連絡シートを更新し、そこで発生する追加工数などをこのファイルで読み込みます
・上記データを元に様々な演算を行い、納期に対して進み見込みか遅れ見込みか、またそれが何日の見込みかを算出します
・結果を当初計画、進捗実績および予測、納期などをグラフで可視化
という仕様のツールなのですが2つ目のあたりで余計なズレが発生して演算が狂ってしまう場合があり、
currency型に値を放り込んで強引にズレが生じないようにしているのが現状です
100%発生するのではなく20物件に1件程度の発生率なので如何したものかと頭を悩ませております
分かりにくかったらごめんなさい
・数十行(場合により数百行から千行弱)の作業計画表があってそれぞれ開始日、終了日、工数を作業担当者が決定し、それとは別に納期を設定します
・各行では作業日数を算出し、工数を日割り計算し、小数点第二位で四捨五入、最終日に余りを加算して進捗の計画とします
・作業担当者は日毎に各項目の進捗率を入力します
・作業担当者はこのファイルとは別に上位工程担当者との連絡シートを更新し、そこで発生する追加工数などをこのファイルで読み込みます
・上記データを元に様々な演算を行い、納期に対して進み見込みか遅れ見込みか、またそれが何日の見込みかを算出します
・結果を当初計画、進捗実績および予測、納期などをグラフで可視化
という仕様のツールなのですが2つ目のあたりで余計なズレが発生して演算が狂ってしまう場合があり、
currency型に値を放り込んで強引にズレが生じないようにしているのが現状です
100%発生するのではなく20物件に1件程度の発生率なので如何したものかと頭を悩ませております
892デフォルトの名無しさん (ワンミングク MM7f-ATAd)
2022/04/20(水) 04:15:00.17ID:i+5dFZiZM >>891
算数わかる?
算数わかる?
893デフォルトの名無しさん (ラクッペペ MM8f-/HVa)
2022/04/20(水) 06:42:44.94ID:PPr2by3tM >891
2つ目のあたりというのがよく分からないけど箇条書きの2段目の項目のことなら処理の仕方が間違ってる
最後に余りを足すなら途中経過はすべて切捨てで処理、途中経過を四捨五入するなら全ての累積値を最後に被除数から引いて加算値を求める
どちらかで処理しないとズレるのは当たり前
2つ目のあたりというのがよく分からないけど箇条書きの2段目の項目のことなら処理の仕方が間違ってる
最後に余りを足すなら途中経過はすべて切捨てで処理、途中経過を四捨五入するなら全ての累積値を最後に被除数から引いて加算値を求める
どちらかで処理しないとズレるのは当たり前
894デフォルトの名無しさん (ワッチョイ 1701-hfAD)
2022/04/20(水) 07:19:32.03ID:Ls68Jrpy0 Currency型てのは誤差が出ないわけじゃなくて精度が固定されてるっていうことなんだけどな
そもそも工程表程度の精度で浮動小数点の誤差が問題になることなんてないだろうに
どうしても誤差が気になるなら割り算を商余で表現するとか演算順序の見直し(割り算を最後に)
そもそも工程表程度の精度で浮動小数点の誤差が問題になることなんてないだろうに
どうしても誤差が気になるなら割り算を商余で表現するとか演算順序の見直し(割り算を最後に)
895デフォルトの名無しさん (ブーイモ MMcf-73NO)
2022/04/20(水) 07:23:24.83ID:uFaPvbC9M >>893
余りは工数-日毎工数x作業日数で算出していましたが処理が違いますか?
勿論この場合余りが負の値になる状況もあるので正確には余りとは違う表現をするのが正しいのですが
これで算出した最終日の工数が3.5hになるべきところが3.49999hになるのは計算式の誤りですか?
余りは工数-日毎工数x作業日数で算出していましたが処理が違いますか?
勿論この場合余りが負の値になる状況もあるので正確には余りとは違う表現をするのが正しいのですが
これで算出した最終日の工数が3.5hになるべきところが3.49999hになるのは計算式の誤りですか?
896デフォルトの名無しさん (ワッチョイ 77ce-X/6k)
2022/04/20(水) 07:34:26.59ID:lCHITGXH0 >>895
最後に小数点以下第二位で四捨五入すればいいじゃん
最後に小数点以下第二位で四捨五入すればいいじゃん
897デフォルトの名無しさん (ワッチョイ 77ce-X/6k)
2022/04/20(水) 07:40:54.07ID:lCHITGXH0 >>895
どこでどれぐらい誤差が出るかは元データと計算式とデータ型によるから、その情報だけではどこが悪いか判断できない
工数は小数点以下第何位まで入力されてんの?
そもそもデータが1000行しかないんなら別にCurrencyのままでいいじゃん
仕事の目的はプログラミングじゃないんだから、結果がちゃんと出たんなら現時点ではそこで終わっとけ
誤差の処理をちゃんとやうとすると情報サイエンスの基礎をみっちりやらないと無理だから、今回の件とは別に自宅で時間かけて勉強しろ
どこでどれぐらい誤差が出るかは元データと計算式とデータ型によるから、その情報だけではどこが悪いか判断できない
工数は小数点以下第何位まで入力されてんの?
そもそもデータが1000行しかないんなら別にCurrencyのままでいいじゃん
仕事の目的はプログラミングじゃないんだから、結果がちゃんと出たんなら現時点ではそこで終わっとけ
誤差の処理をちゃんとやうとすると情報サイエンスの基礎をみっちりやらないと無理だから、今回の件とは別に自宅で時間かけて勉強しろ
898デフォルトの名無しさん (ブーイモ MMcf-73NO)
2022/04/20(水) 07:47:48.41ID:uFaPvbC9M >>896
四捨五入した値をdouble型に代入した際にもこの誤差が発生する場合もあったのですがその場合の対処はDoWhileで数値が丸められるまで四捨五入を繰り返す処理を噛ませれば良いですか?
それよりcurrency型に代入した方が処理を省略できるのではないでしょうか
担当者の癖や上位工程担当者の癖、物件の種類などを加味して分析して完了予測を出すためツール全体で2万弱のステップ数があり、可能な限り処理を早めたいです
まぁそんなの誤差の範囲じゃんとかもっと別に短縮出来る所あるだろって言われたらそれはそうってなるんですが
工数は小数点第一位までの入力です
四捨五入した値をdouble型に代入した際にもこの誤差が発生する場合もあったのですがその場合の対処はDoWhileで数値が丸められるまで四捨五入を繰り返す処理を噛ませれば良いですか?
それよりcurrency型に代入した方が処理を省略できるのではないでしょうか
担当者の癖や上位工程担当者の癖、物件の種類などを加味して分析して完了予測を出すためツール全体で2万弱のステップ数があり、可能な限り処理を早めたいです
まぁそんなの誤差の範囲じゃんとかもっと別に短縮出来る所あるだろって言われたらそれはそうってなるんですが
工数は小数点第一位までの入力です
899デフォルトの名無しさん (ワッチョイ 77ce-X/6k)
2022/04/20(水) 08:21:13.14ID:lCHITGXH0900デフォルトの名無しさん (ワッチョイ ff8e-lF56)
2022/04/20(水) 11:58:28.08ID:TUC465n/0 >>898
そもそも何が問題かわかってる?
コンピュータ(VBA)の割り算では例えば0.999999とかになる問題は常にあることと、有効桁数を常に頭に入れてロジックを組む必要がある
割り算した結果の少数点同士の足し算もできるだけ避ける
小数点以下は一桁と決まってるなら最初から10倍しといて見せる時だけ小数点を付ける
最終的に割り算したら四捨五入する
などなど当たり前のことをわかってないから数値が合わないように見える
こんなの基本だが
そもそも何が問題かわかってる?
コンピュータ(VBA)の割り算では例えば0.999999とかになる問題は常にあることと、有効桁数を常に頭に入れてロジックを組む必要がある
割り算した結果の少数点同士の足し算もできるだけ避ける
小数点以下は一桁と決まってるなら最初から10倍しといて見せる時だけ小数点を付ける
最終的に割り算したら四捨五入する
などなど当たり前のことをわかってないから数値が合わないように見える
こんなの基本だが
901デフォルトの名無しさん (ワッチョイ ff8e-lF56)
2022/04/20(水) 12:03:05.91ID:TUC465n/0 それと、変数や定数、埋め込み数値の型に気を付け、違う型同士の演算ではどういう結果になるかも言語の仕様を常に調べるのは当たり前のこと
902デフォルトの名無しさん (ワッチョイ ff63-0fbr)
2022/04/20(水) 12:14:09.69ID:AAz4B5BA0903デフォルトの名無しさん (ワッチョイ 9fda-+1fN)
2022/04/20(水) 12:39:04.97ID:dxBIrhD/0 プログラムの本質からは外れるけど、現場の工場要員を秒刻みで拘束することに繋がるのを
把握しておくべき 上の方の役員からの指示でのシステム構築なのか、現場の意見を汲んだ
システム化なのかでも変わってくるかも知らんが、古来そういうのは運用し出してから破綻する
相手がロボットならまだしも、自分だって作業を秒刻みで拘束されたら嫌気さすだろうに
システム構築する側の自己満足に過ぎないような無駄なヶ所に注力したところで給料泥棒化するだけ
実際には不良(材料不良・加工不良・落下などの破損・etc)が出たり加工機械の不具合で作業がSTOPしたり
余った時間をバッファに充てるだけじゃ無くて、敢えて余裕をもたせたプランニングを意識しないと
全社員から反発くらって、せっかくの仕事が無かったことにされる 黒歴史の予感しかしない
ロボットやオートメーション機器のためのプログラムだとしたらVBAは間違ってると思うし
把握しておくべき 上の方の役員からの指示でのシステム構築なのか、現場の意見を汲んだ
システム化なのかでも変わってくるかも知らんが、古来そういうのは運用し出してから破綻する
相手がロボットならまだしも、自分だって作業を秒刻みで拘束されたら嫌気さすだろうに
システム構築する側の自己満足に過ぎないような無駄なヶ所に注力したところで給料泥棒化するだけ
実際には不良(材料不良・加工不良・落下などの破損・etc)が出たり加工機械の不具合で作業がSTOPしたり
余った時間をバッファに充てるだけじゃ無くて、敢えて余裕をもたせたプランニングを意識しないと
全社員から反発くらって、せっかくの仕事が無かったことにされる 黒歴史の予感しかしない
ロボットやオートメーション機器のためのプログラムだとしたらVBAは間違ってると思うし
904デフォルトの名無しさん (ワッチョイ 5701-5h/q)
2022/04/20(水) 13:55:16.24ID:wuSnjbzX0 >>900
浮動小数点数は特定の桁数の2進数で表現できる数字に丸める表現方法で、10進数の有効桁数は関係ないんじゃ?
そもそも「有効桁数を頭に入れて〜」みたいな正確さを考えて使う型じゃなくて、曖昧で良い場合に使う。
小数同士の演算は(オーバーフローを無視すれば)固定小数点数で問題なく行えるから避ける必要ない。
浮動小数点数は特定の桁数の2進数で表現できる数字に丸める表現方法で、10進数の有効桁数は関係ないんじゃ?
そもそも「有効桁数を頭に入れて〜」みたいな正確さを考えて使う型じゃなくて、曖昧で良い場合に使う。
小数同士の演算は(オーバーフローを無視すれば)固定小数点数で問題なく行えるから避ける必要ない。
905デフォルトの名無しさん (ワッチョイ b7da-+1fN)
2022/04/20(水) 13:58:17.02ID:nqlym3kL0 基本は大事だから
何度でも繰り返しておくんなまし。
何度でも繰り返しておくんなまし。
906デフォルトの名無しさん (ワッチョイ 9f02-yjyo)
2022/04/20(水) 14:12:37.06ID:2WayYnGs0 質問ですが、
VBAからwebページのデータを取得するとき、
CreateObject("InternetExplorer.Application")とかってやりますが、
サポート終了後はどうなりますか?
Edgeでできる?
VBAからwebページのデータを取得するとき、
CreateObject("InternetExplorer.Application")とかってやりますが、
サポート終了後はどうなりますか?
Edgeでできる?
907デフォルトの名無しさん (ブーイモ MMcf-vdfA)
2022/04/20(水) 14:45:20.55ID:W96CmtFuM >>906
Selenium Webdriver
Selenium Webdriver
908デフォルトの名無しさん (ワッチョイ 5701-5h/q)
2022/04/20(水) 15:54:04.07ID:wuSnjbzX0 >>906
当分サポート終了はないけど、そうなったらできなくなる。
Edgeじゃできないから代替案を考える必要がある。
有名なのはSelenium、Chrome DevTool Protocol
前者はライブラリ(参照設定する奴)を利用者全員にインストールしてもらい、
更にブラウザとのバージョン互換性にも対応する必要がある
ただし動作環境はエクセルのみっていうVBA最大のメリットを失う
後者は単独で動作するモジュールが作られてる
VBA以外の言語の開発環境があるなら、
スクレイピング部分はそれで作成してVBAから呼び出すって方法もある。
自分はそうしてるよ
当分サポート終了はないけど、そうなったらできなくなる。
Edgeじゃできないから代替案を考える必要がある。
有名なのはSelenium、Chrome DevTool Protocol
前者はライブラリ(参照設定する奴)を利用者全員にインストールしてもらい、
更にブラウザとのバージョン互換性にも対応する必要がある
ただし動作環境はエクセルのみっていうVBA最大のメリットを失う
後者は単独で動作するモジュールが作られてる
VBA以外の言語の開発環境があるなら、
スクレイピング部分はそれで作成してVBAから呼び出すって方法もある。
自分はそうしてるよ
909デフォルトの名無しさん (ワッチョイ 5701-5h/q)
2022/04/20(水) 15:57:01.62ID:wuSnjbzX0 edgeじゃできない、は
CreateObject("InternetExplorer.Application") を使ってedgeを操作できないって意味ね
だからseleniumとかでedgeを操作することになる
CreateObject("InternetExplorer.Application") を使ってedgeを操作できないって意味ね
だからseleniumとかでedgeを操作することになる
910デフォルトの名無しさん (ワッチョイ ff8e-lF56)
2022/04/20(水) 16:15:46.15ID:TUC465n/0 >>904
わからないなら黙っていればいいのに
わからないなら黙っていればいいのに
911デフォルトの名無しさん (ラクッペペ MM8f-ku93)
2022/04/20(水) 16:20:42.29ID:oDE2bDUYM 固定小数点は格納するたびに四捨五入するようなもんだから誤差の蓄積は多いが
人間社会ではコレをヨシ!としているから問題ない
天文学的な計算では命中しないだろう
人間社会ではコレをヨシ!としているから問題ない
天文学的な計算では命中しないだろう
912デフォルトの名無しさん (ワッチョイ 9f02-yjyo)
2022/04/20(水) 16:26:01.75ID:2WayYnGs0 >>907
ありがとう。
ありがとう。
913デフォルトの名無しさん (ワッチョイ b72f-mbkD)
2022/04/20(水) 17:45:44.86ID:DAsyvBxD0 >>911
>固定小数点は格納するたびに四捨五入するようなもん
もってる精度の桁数を超えない限りそんなことはないわ
想定する桁数内で誤差がでないから固定小数点使うんだぞ
逆に一般的なプログラム言語の浮動小数点は小数以下桁数が浮動する癖に0.1が正確じゃなかったりするから問題なんだよ
>固定小数点は格納するたびに四捨五入するようなもん
もってる精度の桁数を超えない限りそんなことはないわ
想定する桁数内で誤差がでないから固定小数点使うんだぞ
逆に一般的なプログラム言語の浮動小数点は小数以下桁数が浮動する癖に0.1が正確じゃなかったりするから問題なんだよ
914デフォルトの名無しさん (ワッチョイ ffda-+1fN)
2022/04/20(水) 19:09:32.27ID:cVTwugEg0 0.1は0.1だよ
915デフォルトの名無しさん (ラクッペペ MM8f-/HVa)
2022/04/20(水) 19:25:53.48ID:FB1fQipzM 0.1E+15
桁数は10の15乗の1京
有効数字は1桁の0.1
値は1000兆でも数値は0.1
桁数は10の15乗の1京
有効数字は1桁の0.1
値は1000兆でも数値は0.1
916デフォルトの名無しさん (スプッッ Sd3f-DvUi)
2022/04/20(水) 19:43:46.55ID:lF2OJV8Ed Trunc関数で不要な桁をバッサリ逝けば良いんじゃない?
917デフォルトの名無しさん (ワッチョイ 9f02-yjyo)
2022/04/20(水) 20:09:02.82ID:2WayYnGs0 >>908
ありがとうございます。
iMacrosってのを試してました。
Selenium、Chrome DevTool Protocolを調べてみます。
Excelで入力ダイアログボックスを出して、入力した番号に応じて、そのページのデータを取りに行く、
ってことがやりたいです。
言語はなんでもいいですね。
できれば、Visual Studioを使いたいですが…w
ありがとうございます。
iMacrosってのを試してました。
Selenium、Chrome DevTool Protocolを調べてみます。
Excelで入力ダイアログボックスを出して、入力した番号に応じて、そのページのデータを取りに行く、
ってことがやりたいです。
言語はなんでもいいですね。
できれば、Visual Studioを使いたいですが…w
918デフォルトの名無しさん (ワッチョイ 9f4f-Ltfy)
2022/04/20(水) 20:56:24.65ID:by8HP/iQ0 なんだIEEE754仕様問題の話題か。
10進と16進(2進)の浮動小数差異が出るのはまぁある意味仕方がない。
固定小数点の型を持つ言語を使うか、割る前に何桁か分10のべき乗数を掛けて割った後に同じだけ割ってやって適当なところで諦めるか、というところが落としどころだろうね。
ちなみにEXCELの数式の四捨五入は本当に四捨五入だけど、VBAの四捨五入は銀行丸めだから気をつけてね。
10進と16進(2進)の浮動小数差異が出るのはまぁある意味仕方がない。
固定小数点の型を持つ言語を使うか、割る前に何桁か分10のべき乗数を掛けて割った後に同じだけ割ってやって適当なところで諦めるか、というところが落としどころだろうね。
ちなみにEXCELの数式の四捨五入は本当に四捨五入だけど、VBAの四捨五入は銀行丸めだから気をつけてね。
919デフォルトの名無しさん (スプッッ Sd3f-DvUi)
2022/04/20(水) 21:03:02.83ID:lF2OJV8Ed 因みにパワクエも銀行丸め
いい加減統一して欲しいわ
いい加減統一して欲しいわ
920デフォルトの名無しさん (ワッチョイ 57da-wCJf)
2022/04/20(水) 21:09:55.19ID:Q+UfmON+0 四捨五入はRound使わなくてもできるらしいで
知らんけど
知らんけど
921デフォルトの名無しさん (ワッチョイ 375f-CvXj)
2022/04/20(水) 21:17:52.87ID:Me5L26li0 >>906
おれも心配してたけどオートメーションの場合は6月以降も使えるらしいな
おれも心配してたけどオートメーションの場合は6月以降も使えるらしいな
922デフォルトの名無しさん (ワッチョイ b72f-mbkD)
2022/04/20(水) 22:25:36.74ID:DAsyvBxD0 >>918
暗黙の変換(丸め)を四捨五入というのは問題があるかと
暗黙の変換(丸め)を四捨五入というのは問題があるかと
923デフォルトの名無しさん (ワッチョイ 9f4f-Ltfy)
2022/04/20(水) 23:37:18.06ID:by8HP/iQ0 >>922
何故に暗黙の変換限定の話と思ったのかは分からないけど、型はなるべく明示的に変換しないとね。
その辺、VBAはOption Strict Onが使えないから大変。
もっとも、.Netでも匿名型を使うメソッドは固めてOption Strict Offに設定したモジュールに突っ込んでおく必要があるけど。
何故に暗黙の変換限定の話と思ったのかは分からないけど、型はなるべく明示的に変換しないとね。
その辺、VBAはOption Strict Onが使えないから大変。
もっとも、.Netでも匿名型を使うメソッドは固めてOption Strict Offに設定したモジュールに突っ込んでおく必要があるけど。
924デフォルトの名無しさん (ワッチョイ b72f-mbkD)
2022/04/21(木) 17:21:20.11ID:pjiVvgnX0 ああ、そうだな。Cxxxで明示的に型変換しても銀行丸めだから
暗黙の変換に限った話ではなかったな
匿名型のくだりは何を言ってるか意味不明だがな
匿名型は名前がついてないだけで厳密に型指定されているんだが
暗黙の変換に限った話ではなかったな
匿名型のくだりは何を言ってるか意味不明だがな
匿名型は名前がついてないだけで厳密に型指定されているんだが
925デフォルトの名無しさん (ワッチョイ 9f4f-Ltfy)
2022/04/21(木) 23:11:20.77ID:VWW2tbiZ0 CcxxとかじゃなくてもRound使ったって普通に銀行丸のだろ
926デフォルトの名無しさん (ワッチョイ 77ce-+1fN)
2022/04/22(金) 02:09:40.61ID:M5fmJ0ze0 ワークシート関数のROUNDは四捨五入
VBAのRound関数は銀行丸め
VB.netのMath.Roundメソッドも銀行丸め
これ真面目な話テストに出るし実務でもトラブルの元だからちゃんと覚えて使い分けろよ
VBAのRound関数は銀行丸め
VB.netのMath.Roundメソッドも銀行丸め
これ真面目な話テストに出るし実務でもトラブルの元だからちゃんと覚えて使い分けろよ
927デフォルトの名無しさん (ラクッペペ MM8f-/HVa)
2022/04/22(金) 08:50:16.15ID:Uci4ALKRM そもそも四捨五入や銀行丸めは暗黙の(型)変換でも何でもないけどな
928デフォルトの名無しさん (ササクッテロラ Sp8b-Ltfy)
2022/04/22(金) 12:17:14.78ID:6grDaRhxp VBAの四捨五入は型変換でやるもんだと思ってるんだろ
929デフォルトの名無しさん (アウアウウー Sa1b-+1fN)
2022/04/22(金) 12:26:05.45ID:Sb+Ase1ga VBAで全ての物事を解決したいと考えています。
まずはOCRからやっていきたいです。
次に、人工知能とビッグデータに関する VBA のライブラリを充実させたいです。
それができたら、VBA で、callbyName を使って、疑似マルチスレッド化してサーバーOSを作り、
メタバースを作りたいです。
どうしたらいいですか?
まずはOCRからやっていきたいです。
次に、人工知能とビッグデータに関する VBA のライブラリを充実させたいです。
それができたら、VBA で、callbyName を使って、疑似マルチスレッド化してサーバーOSを作り、
メタバースを作りたいです。
どうしたらいいですか?
930デフォルトの名無しさん (オッペケ Sr8b-ny4V)
2022/04/22(金) 12:56:56.20ID:JqjwtZFMr 沢山金がある
→MSに依頼する
少しだけ金がある
→スクールにでも通う
金が無い
→自力で調べろ
→MSに依頼する
少しだけ金がある
→スクールにでも通う
金が無い
→自力で調べろ
931デフォルトの名無しさん (ワッチョイ ffda-+1fN)
2022/04/22(金) 13:46:25.69ID:qHWul8Ex0 >>929
もう休み始まったのか羨ましいな
もう休み始まったのか羨ましいな
932デフォルトの名無しさん (ワッチョイ 1603-dMjb)
2022/04/23(土) 07:32:43.48ID:Q/JWtTUi0 VBAのコードをパスワードではなく
AccessのようにMDEまたはACCDE化して隠蔽できないのかね?
AccessのようにMDEまたはACCDE化して隠蔽できないのかね?
933デフォルトの名無しさん (ササクッテロ Spd7-5pfM)
2022/04/23(土) 13:58:03.66ID:yVxZarCbp あったとして、ワークシートが見れない
レス数が900を超えています。1000を超えると表示できなくなるよ。
