トップページtech
1002コメント402KB

Excel VBA 質問スレ Part38 [転載禁止]©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2015/09/07(月) 18:59:39.00ID:E2JS6OsF
ExcelのVBAに関する質問スレです

                   ___
       ___      /____ヽ      ____
      /____\    | |´・ω・`| |    /___ヽ
      .l |´・ω・`|  ニX二 . ̄ ̄ ̄  二X二  |´・ω・`| l 俺たちに任せろ
      !、 ̄ ̄ ̄  ヽ   |       |    /    ̄ ̄ ̄/
       ヽ_/ヽ、  ヽ__)  \__/\_/.   /_/  ノヽ_/
             ̄                ̄ ̄

このスレはコード書き込みOKです。
作成依頼もOKですが、作成依頼限定ではありません。

コードが嫌な人・作成依頼が嫌な人は別スレ建ててください。

※前スレ
Excel VBA 質問スレ Part37 [転載禁止]2ch.net
http://peace.2ch.net/test/read.cgi/tech/1420841190/
0002デフォルトの名無しさん2015/09/07(月) 19:05:13.76ID:E2JS6OsF
ちなみに作成依頼が嫌な人のスレはこっちに立ってます
http://peace.2ch.net/test/read.cgi/tech/1441619979/l50
0003デフォルトの名無しさん2015/09/07(月) 19:07:12.91ID:E2JS6OsF
ごめん、まちがえた
作成依頼が嫌な人のスレはこっちです
Excel VBA 質問スレ Part37 [転載禁止]2ch.net
http://peace.2ch.net/test/read.cgi/tech/1433920729/
0004デフォルトの名無しさん2015/09/08(火) 05:06:31.84ID:/+iyKv2W
webで拾ったコードですが

Sub Sample3()
With CreateObject("Wscript.Shell")
.Run "C:\Data\Image.JPG", 5
End With
End Sub



.Run "C:\Data\Image.JPG", 5


, 5

一体何を意味するのでしょうか?
0005デフォルトの名無しさん2015/09/08(火) 05:25:02.69ID:O1XLnjV5
>>4

この辺の話のことか?

http://www.happy2-island.com/vbs/cafe02/capter00110.shtml
0006デフォルトの名無しさん2015/09/08(火) 05:45:49.03ID:/+iyKv2W
>>5
はい引数5とは何を意味するのでしょうか?
0007デフォルトの名無しさん2015/09/08(火) 06:07:52.96ID:sMbWt4zd
>>6
https://msdn.microsoft.com/ja-jp/library/cc364421.aspx
0008デフォルトの名無しさん2015/09/08(火) 12:22:34.20ID:NVN8kZyV
拾ったものそのまんまポッケに入れちゃうのはなあ 
0009デフォルトの名無しさん2015/09/08(火) 23:24:02.41ID:fPKzpPbS
>>7
ありがとうございました。
>>5
この解説が5のみを飛ばしているので本当に悩みました。。
0010デフォルトの名無しさん2015/09/08(火) 23:25:38.02ID:fPKzpPbS
>>8
既に実装済みなので、口の中まで入ってましたw
0011デフォルトの名無しさん2015/09/09(水) 02:39:57.70ID:ectLRYRT
FileDateTime関数って作成日時あるいは最終更新日時って説明だけど、各々違う概念だよね。指定できないの?
0012デフォルトの名無しさん2015/09/09(水) 03:19:16.57ID:uHaCyZBl
FileSystemObject 使ったら?

ファイルの日付を取得する
http://www.happy2-island.com/vbs/cafe02/capter01102.shtml
0013デフォルトの名無しさん2015/09/09(水) 18:16:27.23ID:ectLRYRT
>>12
それはしってて、出来るのかどうか知りたい

ところで、fso関連でいうと、ファイル名の取得させると、動いてるんだけど、Excelが固まって、他のブックに切り替えもできないんだけど、回避方法ってあるかな?
0014デフォルトの名無しさん2015/09/09(水) 20:31:37.11ID:whASp/iz
fsoは便利だけど制限が多いからあえてVBAで使う意味はない
窓のファイル日付は作成/更新/参照の3種類があってWin32APIのGet/SetFileTimeで全部参照と変更可
それとファイル関係の操作は全部直接Win3APIでやるのがお勧め
0015デフォルトの名無しさん2015/09/09(水) 20:33:23.41ID:k4ZkuMcU
>>13
たぶんループ処理中の事だと思うけどDoEvents入れれば処理中でもシート弄れる。

そういやループ処理中は破棄した変数が解放されずにたまるから重くなるとかいう記事を見たんだけど、
ループ処理させずにループ処理と同じ事させる方法ってあんのかな。
0016デフォルトの名無しさん2015/09/09(水) 20:40:05.38ID:ectLRYRT
>>15
doeventいれたら、本来の処理はとまっちゃうんでしょ?
0017デフォルトの名無しさん2015/09/09(水) 21:04:33.91ID:k4ZkuMcU
>>16
それはStopだな。
0018デフォルトの名無しさん2015/09/09(水) 21:50:30.24ID:eA9RoHxO
ScreenUpdating=Falseは?
0019デフォルトの名無しさん2015/09/09(水) 21:57:22.44ID:xwZ52Y1A
たまには立ち止まって後ろを振り返ってみる事も必要なんだぜチンコ
0020デフォルトの名無しさん2015/09/09(水) 22:28:44.94ID:RVc7QyxG
振り返ると何してたのか分からなくなるから決して振り返らない。
0021デフォルトの名無しさん2015/09/09(水) 23:46:50.75ID:ectLRYRT
>>19
深いこといいたいの?
0022デフォルトの名無しさん2015/09/09(水) 23:57:22.72ID:jmO3TJP8
振り返るといつもきみが笑ってくれた
風のようにそっと
0023デフォルトの名無しさん2015/09/10(木) 07:54:04.30ID:c+ohyq4u
ふりむくな
ふりむくな安室
0024デフォルトの名無しさん2015/09/10(木) 19:35:14.64ID:wN8JFJBW
win10環境でIEの取り扱いに不具合は無いですか?
0025デフォルトの名無しさん2015/09/10(木) 20:03:34.12ID:0qqo7x+8
山は死にますか
0026デフォルトの名無しさん2015/09/10(木) 20:07:40.52ID:tchTbgrv
2つあってこっちがクソスレの方だっけ
0027デフォルトの名無しさん2015/09/10(木) 20:17:47.68ID:8yg+xC41
あなたがいる方がクソスレです
0028デフォルトの名無しさん2015/09/10(木) 22:28:54.26ID:+NpM52Lz
ふりむくな ふりむくな ふりむくな
君は ねらわれている
ふりむくな ふりむくな ふりむくな
地球を侵す者たちに 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)
0029デフォルトの名無しさん2015/09/11(金) 12:42:07.22ID:H41I+Dft
Chromeを操作したいんだけど、seleniumVBAってどう?
あまり深掘りしている情報も見つからず、使えるのか使えないのかもよくわからない。
0030デフォルトの名無しさん2015/09/11(金) 14:17:28.05ID:UJrMjXn0
ファイルを開いた年が2015年であれば「部長」
2016年であれば「専務」
って言う式をお願いします。
0031302015/09/11(金) 14:21:13.56ID:UJrMjXn0
すみませんスレ間違えました。移動します
0032デフォルトの名無しさん2015/09/11(金) 14:46:29.03ID:LOwfnHUO
2017年は常務だな!
0033デフォルトの名無しさん2015/09/11(金) 14:47:09.01ID:LOwfnHUO
すみませんスレ間違えました。移動します


…って、どこだw
0034デフォルトの名無しさん2015/09/11(金) 20:36:34.16ID:EmY3jWzK
NTFSアクセス権なのですが、特定のフォルダのサブフォルダやファイル含め、既存ユーザーのまま、権限だけを一括で変えられないでしょうか?
0035デフォルトの名無しさん2015/09/11(金) 20:44:59.84ID:2kUpW7Kd
>>34
管理者ユーザーならもちろん変えられるが、VBAと何の関係が?
0036デフォルトの名無しさん2015/09/11(金) 21:27:30.56ID:z1o7I+D1
>>32
降格かよ
0037デフォルトの名無しさん2015/09/11(金) 21:38:06.86ID:EmY3jWzK
>>35
どのように書くんですか?icacls
0038デフォルトの名無しさん2015/09/12(土) 15:37:15.80ID:PSC5C/np
選択した範囲の中で最も大きい値のセルを選択・移動するコードをお願いします

Range("A1:E8").Select
Selection.Find(What:=Application.WorksheetFunction.Max(Selection)).Select

こんな文を見つけたのですが、
オブジェクト変数またはwithブロック変数が設定されていません   と出ます
0039デフォルトの名無しさん2015/09/12(土) 16:16:29.83ID:KrhE9tL1
>>38
Function SelectionMax()
Sel = Selection.Value

For Each x In Sel
If M < x Then M = x
Next

SelectionMax = M
End Function
0040デフォルトの名無しさん2015/09/12(土) 17:02:30.82ID:h9KeNJ6o
>>38
Range("A1:E8")になんか値が入ってないとエラーがでるみたいよ
0041デフォルトの名無しさん2015/09/12(土) 20:37:06.04ID:GDHibxma
>>38
参照設定でexcelobjectがないとかなんとか
0042デフォルトの名無しさん2015/09/13(日) 00:25:42.27ID:f7snMU36
イミディエイトウインドは便利ですが
ここで変数やFor文を使えるようにできませんか?
0043デフォルトの名無しさん2015/09/13(日) 01:29:34.87ID:j8lACS4K
>>42
変数は定義できないだけで使えるけど?
複数の行にまたげないだけで、For文も使えるけど?

For i=1 to 10:Print i:Next
たとえばこんなの入力してみ
0044デフォルトの名無しさん2015/09/13(日) 09:21:02.53ID:Jm5r3jb9
拾い物で、恐縮なんですが、チェックボックスがフォームで作成されるんですが、
ActiveXに変更できないでしょうか?

'==================================================================================
Sub main()
Dim mkrng As Range
Dim lnkrng As Range
Dim crng As Range
Dim mcell() As Variant
Dim g0 As Long
Dim retcode As Long
Set mkrng = get_sctrng("チェックボックスを作成するセル範囲を選択してください")
If Not mkrng Is Nothing Then
Set lnkrng = get_sctrng("対応するリンクセル範囲を選択してください")
If Not lnkrng Is Nothing Then
g0 = 1
For Each crng In mkrng
With mkrng.Parent.CheckBoxes.Add(crng.Left, _
crng.Top, _
crng.Width, _
crng.Height)
.LinkedCell = lnkrng.Cells(g0).Address(, , , True)
If g0 < lnkrng.Count Then g0 = g0 + 1
End With
Next
End If
End If
End Sub
'==================================================================================
0045デフォルトの名無しさん2015/09/13(日) 09:21:55.18ID:Jm5r3jb9
続きです

Function get_sctrng(Optional mes As String, Optional mxact As Long = 1) As Range
Dim rng As Range
Dim retcode As Long
On Error Resume Next
retcode = 1
Set get_sctrng = Nothing
Do Until retcode = 0
Set rng = Application.InputBox(mes, , , , , , , 8)
If Err.Number = 0 Then
If rng.Areas.Count <= mxact Then
Set get_sctrng = rng
retcode = 0
End If
Else
retcode = 0
End If
Loop
On Error GoTo 0
End Function

お願いいたします。
0046デフォルトの名無しさん2015/09/13(日) 16:02:54.39ID:aOKPcKZx
「マクロの記録」でActiveXのチェックボックス追加で
以下のコードが記録されたけども


Sub Macro1()
'
' Macro1 Macro
'

'
  ActiveSheet.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Link:=False, _
   DisplayAsIcon:=False, Left:=56.25, Top:=14.25, Width:=107.25, Height _
   =18).Select
End Sub
0047デフォルトの名無しさん2015/09/13(日) 16:27:02.23ID:HYANgCcS
52歳主婦です。
COBOLを30年前にしていました。5年やって結婚退職しました。その後はプログラミングを一切やっていません
子供が大きくなったので事務のパートに行くことにしました。
昔プログラマーだったことを話すと、「VBAできるでしょ、この処理をマクロにして」と上司に言われました。
COBOLしかしていませんが、VBAをすぐに使えるようになるでしょうか?
このパートで首になったら、年齢的に清掃か介護の仕事しかありません。
参考書は大村あつし「かんたんプログラミング」を買いました、が
COBOLでいうところの「OPEN INPUTFILE」処理とかMOVE、WRITEが無いのでつまずいています。
0048デフォルトの名無しさん2015/09/13(日) 18:09:34.89ID:wPz1MVxW
>>47
COBOLの基礎概念を全て捨ててまっさらな脳で取り組んだ方が習得が早いと思いますよ
人に話すときには元プログラマーというと誤解されるのでにコポラーと言った方がいいです
0049デフォルトの名無しさん2015/09/13(日) 18:54:11.43ID:nhNM0pAX
COBOLで業務経験5年もあれば事務で使うVBA程度どうってことないよ
何も知らなくてもマクロの記録で適当に組み合わせれば即動く物ができるし
30年ブランクだとマクロよりExcelとかのOfficeの使い方の方が戸惑うんじゃないの
0050デフォルトの名無しさん2015/09/13(日) 20:27:24.18ID:8cqOMIq7
エクセルはやりたい事をそのまま検索すりゃだいたいの事はすぐ出てくるから苦労する事は特にないんだよな

あとは

・変数 = Range(...)でセルの内容を取り込む
・Range(...) = 変数で二次元配列の内容をセルに反映させる

っていうの覚えとけば後はIfとかForくらいしか使わないから楽
0051デフォルトの名無しさん2015/09/13(日) 22:34:33.36ID:3BsRFwaL
逆に漏れなんて、シェルスクリプトから、
C/C++、スクリプト言語まで、
10言語ぐらいプログラミングできるけど、
COBOLだけは理解不能だな

ハローワークでも、COBOLの募集はあるけど、
簡単に学べる本がない
0052デフォルトの名無しさん2015/09/13(日) 23:22:12.44ID:nQBKdNbg
リアルCOBOLのおばちゃまか
0053472015/09/13(日) 23:36:39.56ID:HYANgCcS
みなさんありがとうございます。
本のサンプルを見てるうちに
RANGE("A1" ).VALUE =
みたいにコーティングすれば、MOVE,WRITEが一度にできるとわかりました。
分岐とループはわかるのでなんとかできそうです。
VBAは独習用の参考書がたくさんあるのでいいですね。
COBOLは会社での徒弟制度でお師匠様(女性)から習いました。
0054デフォルトの名無しさん2015/09/13(日) 23:40:12.52ID:nJtJzwJH
頑張って。
私もメインフレームでCOBOLやっていて、ツール作りにVBAをやっていから。
0055デフォルトの名無しさん2015/09/14(月) 16:14:06.84ID:m92hyV44
>>53
VBEの使い方をマスターすれば問題ないと思う

やりたい事を検索すれば参考になるコードはすぐ見れるから
デバッグを効率よくするためにVBEに早くなれて下さい
0056デフォルトの名無しさん2015/09/14(月) 18:35:12.98ID:KuhWma5+
2013になってVBAのヘルプがまともに使えなくなってない?

PCがネットに繋がってないんでオフラインで使える
Excel 2013 Developer Documentation.chm
てのをダウンロードしたんだけど、英語版なのはまだ良いとして
肝心のヘルプとしての機能がちゃんとしてないのか
関数のパラメータとか調べたくてもそれが出てこない

例えばFormatで使える書式をみたくてFormatで検索しても
あんまり関係ない情報ばかりが出てきて、欲しい情報は見つからない
しょうがないから自前のスマホでネット検索して調べてるんだけど
古い機種なんで画面小さくて見辛いんで仕事が捗らないこと甚だしい

これってどうしたらいいの?
もうちょっとまともなオフラインのヘルプファイルってないのかな?
0057デフォルトの名無しさん2015/09/14(月) 21:38:55.02ID:EGWtHR3Q
iPadでヘルプを見る
0058デフォルトの名無しさん2015/09/14(月) 22:12:07.98ID:pXK5pJDJ
>>56
オフラインどころかオンラインでもまともなものはない
逆引系の本買いなさい
技術者たるもの知識集めに金を惜しんではならない
0059デフォルトの名無しさん2015/09/14(月) 22:37:26.37ID:KuhWma5+
>>57
iPad持ってない
というかApple製品は何も持ってない
iTunesすらダウンロードしてない

Apple製品って物自体は良い製品なんだろうとは思うんだけど
やたらユーザーを支配したがるというか囲い込みたがる姿勢が嫌いなんだよね
MSも段々その傾向が出てきてて嫌な雰囲気だけど……


>>58
>オフラインどころかオンラインでもまともなものはない

マジか……orz
2010までは割とヘルプみながらで作れたんだけどなぁ……
0060デフォルトの名無しさん2015/09/15(火) 22:19:24.42ID:KQEQzEy1
2016もF1押すとブラウザが開いてネット上のヘルプを表示しようとする
ネットにつながってないと「ページが表示できません」になる
オフラインのヘルプが欲しかったら、それだけのために2010あたりをインストールするしかないのかも?
0061デフォルトの名無しさん2015/09/15(火) 23:18:02.10ID:wIsrso68
エクセル201064bit版で
ゲーム作ろうと思ってるんだけど
なぜかGetAsyncKeyStateがうまく作動しない・・・

標準モジュールで
Declare PtrSafe Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As LongLong
て宣言しているんだが

実行してみると
なぜかずっとそのキーが押された状態になってるんだ。
GetAsyncKeyState(37)'左
GetAsyncKeyState(38)'上
GetAsyncKeyState(39)'右
GetAsyncKeyState(40)'下
のキーはもちろん、ほかのキーもほとんどだめ
とおもったら
GetAsyncKeyState(17)'ctrl
GetAsyncKeyState(18)'alt
とかは正常に作動する(とはいっても安定しないが)
なんでなんだろう
だれか教えてくれちょ
0062デフォルトの名無しさん2015/09/15(火) 23:50:30.65ID:KQEQzEy1
>>61
押されたかどうかをどうやって判断してんのか、その部分のコード晒して
0063デフォルトの名無しさん2015/09/16(水) 00:25:03.03ID:rMn0Czew
>>62
ほぼとあるサイトのサンプルままなんだが
Sub test4()
Dim i As Long
Dim x As Long
Dim y As Long
Dim n As Long
Dim objChar(1 To 8) As Range
Dim IngPtn As Long
Dim rightflg As Boolean
Dim leftflg As Boolean
Dim upflg As Boolean
Dim downflg As Boolean
'パターン番号の制御用 最初は1
IngPtn = 1
'キャラの初期位置
x = 1
y = 1
'キャラの形
Set objChar(1) = Range(Cells(1, 1), Cells(15, 15))
Set objChar(2) = Range(Cells(1, 16), Cells(15, 30))
Set objChar(3) = Range(Cells(16, 1), Cells(30, 15))
Set objChar(4) = Range(Cells(16, 16), Cells(30, 30))
Set objChar(5) = Range(Cells(31, 1), Cells(45, 15))
Set objChar(6) = Range(Cells(31, 16), Cells(45, 30))
Set objChar(7) = Range(Cells(46, 1), Cells(60, 15))
Set objChar(8) = Range(Cells(46, 16), Cells(60, 30))
rightflg = True
leftflg = False
upflg = False
downflg = False
ナガイからわける
0064デフォルトの名無しさん2015/09/16(水) 00:28:44.51ID:rMn0Czew
Do Until False
'左
If GetAsyncKeyState(37) <> 0 Then
x = x - 1
leftflg = True
rightflg = False
upflg = False
downflg = False
'左端のときはそれ以上左に行かない
If x < 1 Then
x = 1
End If
End If
'右
If GetAsyncKeyState(39) <> 0 Then
x = x + 1
rightflg = True
leftflg = False
upflg = False
downflg = False
'右端のときはそれ以上右に行かない
If x > 500 Then
x = 500
End If
End If
0065デフォルトの名無しさん2015/09/16(水) 00:29:34.16ID:rMn0Czew
'上
If GetAsyncKeyState(38) <> 0 Then
y = y - 1
rightflg = False
leftflg = False
upflg = True
downflg = False
'上端のときはそれ以上上に行かない
If y < -50 Then
y = -50
End If
End If
'下
If GetAsyncKeyState(40) <> 0 Then
y = y + 1
rightflg = False
leftflg = False
upflg = False
downflg = True
'下端のときはそれ以上下に行かない
If y > 500 Then
y = 500
End If
End If
0066デフォルトの名無しさん2015/09/16(水) 00:30:34.16ID:rMn0Czew
'キャラを描写
objChar(IngPtn).Copy _
Destination:=Range(Cells(150 + y, x), Cells(100 + y, x + 15))
'パターン番号の変更です 1,2,1,2…を繰り返します
IngPtn = IngPtn + 1
If rightflg = True And IngPtn >= 3 Then
IngPtn = 1
End If
If leftflg = True And IngPtn >= 5 Then
IngPtn = 3
End If
If downflg = True And IngPtn >= 7 Then
IngPtn = 5
End If
If upflg = True And IngPtn >= 9 Then
IngPtn = 7
End If
'時間稼ぎのループです
For j = 1 To 3000: DoEvents: Next
Loop
End Sub


確認方法は
GetAsyncKeyStateをコメントアウトしたり、引数を(17)とかにしたら正常に動くことからして判断
ちなみにずっと押されていると思われる→キーとかは引数としてではなく、普通に使う分にはなんも問題がないから
キーボードに問題があるとかではないと思う
0067デフォルトの名無しさん2015/09/16(水) 00:39:19.36ID:j2/nQOKD
>>64
おかしい部分が2個所ある

1つ目、GetAsyncKeyStateの戻り値はintだから
Declare PtrSafe Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Integer
としないといけない

2つ目、GetAsyncKeyStateで単純に押されたかどうかだけを調べたい時はMSBだけをチェックする
If GetAsyncKeyState(37) And &h8000 <> 0 Then

ネットを見ると、同じように間違ってるサンプルがいくつもあるから注意すべし
とこにWin32APIを使う時は、まずはMSDNを当たること
https://msdn.microsoft.com/ja-jp/library/cc364583.aspx
0068デフォルトの名無しさん2015/09/16(水) 01:10:16.98ID:rMn0Czew
>>67
おおいけた!!!
知恵袋で聞いてもできなかったのに
さんくす!!!
0069デフォルトの名無しさん2015/09/16(水) 01:25:56.15ID:vIYm92da
即答スゲー
0070デフォルトの名無しさん2015/09/16(水) 01:47:25.86ID:Cx9YrWpB
化け物しかいねー。
0071デフォルトの名無しさん2015/09/16(水) 02:28:05.78ID:9fL6Ueyi
2chにはたまに、バケモンが出没するな
0072デフォルトの名無しさん2015/09/16(水) 12:24:37.69ID:9lfWhZ9r
intをvbのIntegerで受けるのはバケモンというよりバカモンだろ
0073デフォルトの名無しさん2015/09/16(水) 12:28:57.22ID:MQ6WnVci
これにはバラモンもびっくり
0074デフォルトの名無しさん2015/09/16(水) 15:09:32.12ID:zUxOp5Ef
MSDN見ると戻り値の型がSHORTだし、intは単に書き間違いじゃね?
だからIntegerで受けるのはあってると思う
0075デフォルトの名無しさん2015/09/17(木) 20:40:42.90ID:7HP4sLLY
Win32APIとかまったく知らない初心者からの
ものすごい低レベルな質問で恐縮なんだけど
>>64の1行目にある
Do Until False
って、何でこういう書き方してるの?
ただ単に Do だけでも変わらないって事はないの?
0076デフォルトの名無しさん2015/09/17(木) 21:56:36.75ID:0bI43Uux
>>75
Doだけでも同じ動作はする
実際の理由は書いた奴に聞かんとわからんが
Doだけだと、Loop側に条件書いてる可能性があるから
前判定で明示的に無限ループさせてる事を解りやすくする為だろうな
0077デフォルトの名無しさん2015/09/18(金) 00:26:17.93ID:k7q6/Xtn
>>76
どうもありがとう
なるほど、やっぱり論理判定上の意味合いはなかったんだね
もしかして俺の知らないような特殊な構文があるのかと思ってたよ
0078デフォルトの名無しさん2015/09/18(金) 00:29:54.32ID:cBOk0nK1
全く判りやすくないと思う
本来の条件をコメントアウトしてるだけだろう
0079752015/09/18(金) 05:58:20.79ID:k7q6/Xtn
>>78
それはつまり
Do Until Hoge = False
だとか書いてあったところを
Do Until False
にしたんだろうってこと?

そんな中途半端な端折り方するかなぁ?
ここでさらすために関係ないところを消したのなら、
普通だったら Do だけにすると思うよ
もしくは、デバッグ時の一時的な措置としてなら条件部分は消さないで
Do の後ろを’でコメントアウトさせるとかするよね

まぁ、仮にどういう理由での端折り方だったとしても
Do とDo Until False でコードとしての挙動が変わらないなら
>>75での疑問への答えには関係ないことだけど
0080デフォルトの名無しさん2015/09/18(金) 06:03:01.62ID:/9LiLA2g
単にWhileかUntil付けないとDo文が成立しないと思い込んでるだけじゃないの。
C++でゲーム作る時は Do{...}While(1) とかやるし。
0081デフォルトの名無しさん2015/09/18(金) 08:10:17.90ID:vvwUaO7x
>>80
> Do{...}While(1) とかやるし。

for( ; ; ){ ... } だろ
そもそも C++ はすべて小文字だし
0082デフォルトの名無しさん2015/09/18(金) 12:04:15.66ID:kHPw/fq6
無限ループする時は
do while true
っていつも書いてる。
誰かが書いてるのを流用して覚えたのかな、わからんわ。
0083デフォルトの名無しさん2015/09/18(金) 15:42:42.50ID:TFTTQabP
日常業務で無限ループとか必用ないだろ
VBAでいったい何作ってんだよ
0084デフォルトの名無しさん2015/09/18(金) 16:30:22.86ID:+Yui8Vmg
>>83
>>61
>ゲーム作ろうと思ってるんだけど
まあ、VBAが向いてるとは思わんが
0085デフォルトの名無しさん2015/09/18(金) 17:37:12.00ID:F1j6zTfg
>>83
こういうのありがちかもと思った。

Do While True
 buf = getData()
 If buf = "" Then
  Exit Do
 End If
 doSomething buf
Loop
0086デフォルトの名無しさん2015/09/18(金) 17:39:38.80ID:RwvEkWDv
>>83
採番処理のリトライとか
0087デフォルトの名無しさん2015/09/18(金) 18:48:13.04ID:fLNXHY+l
>>85
そういう場合はgetData()の中でループしてデータが入ってくるまで待つように作った方がいいんじゃないか?
さもなくばデータの有無を取得するためのメソッドかプロパティか変数を用意するのが筋だと思うんだが
無限ループで待つのはあんまりいい実装じゃ無いと思う
0088デフォルトの名無しさん2015/09/18(金) 20:00:01.78ID:WxafZwof
>>87
人のコードを見たら脊椎反射で添削するのやめろよ
荒れる元だ
添削は頼まれた時だけにしろ
0089デフォルトの名無しさん2015/09/18(金) 20:13:59.39ID:h/Y8JD3x
数値の処理について質問です

3と4と8だったら、3と4の平均値で3.5
5と8と9だったら、8と9の平均値で8.5
の様に、三つの数字のうち近い二つの平均値を出す場合、どういう処理が一番スマートでしょうか?
自分が思いつくのが
@3つのうち2つの数字の選んで差を出す
Aそれを全部比較
Bそれをifで処理する…

我ながらかっこわるい処理だと思ってます
もっと簡単にできないでしょうか?
0090デフォルトの名無しさん2015/09/18(金) 20:52:02.69ID:EolSINtJ
>>89
それでいいんじゃね?
自分だったら 数値を配列にいれてFORループ処理するにゃ
(やる事は基本 >>89と同じだけど)

あと すべて同差だったらどうするの?
0091デフォルトの名無しさん2015/09/18(金) 22:10:16.34ID:/9LiLA2g
Function NearAverage(ParamArray arg())
Dim lAbs(), index As Long

For i = 0 To UBound(arg)
For j = 0 To UBound(arg)
If i <> j Then
ReDim Preserve lAbs(1, index)
lAbs(0, index) = Abs(arg(i) - arg(j))
lAbs(1, index) = (arg(i) + arg(j)) / 2
index = index + 1
End If
Next
Next

If index Then
h = lAbs(0, 0)
ans = lAbs(1, 0)

For i = 0 To index - 1
If h > lAbs(0, i) Then h = lAbs(0, i): ans = lAbs(1, i)
Next
End If

NearAverage = ans
End Function

俺もこんな方法しか思い浮かばないわ。他に解があるのかな。

>>81
実際に作ろうとするとWhileの部分には終了用のフラグとか入るからFor文は無いんじゃないか。
あと全部小文字ってので昔は「VBAは頭文字が大文字になるからかっこ悪いなぁ」とか思ってた時期があった事を思い出した。
まぁ後はゲーム製作スレとかでやる話だな。
0092デフォルトの名無しさん2015/09/18(金) 22:18:51.55ID:+Yui8Vmg
>>91
>Whileの部分には終了用のフラグとか入るから
明示的に無限ループさせるって話だったはずなんだが
forの無限ループも他言語ならそこそこ見る定形処理
0093デフォルトの名無しさん2015/09/18(金) 22:24:50.90ID:+Yui8Vmg
>>89
要素が三つしかなくてソートされてるなら、1−2番目か2−3番目かしかないから
それぞれの差とって比較して、小さいほうの平均取ればいいんじゃね
ソートされてないなら、ソートしてもいいけど、三つぐらいなら総当たりでもいいか
0094デフォルトの名無しさん2015/09/19(土) 00:49:55.88ID:qwiT5joB
>>90のすべて同差だったらどうするのってのに質問者からの回答が欲しいね w
0095デフォルトの名無しさん2015/09/19(土) 03:20:58.94ID:ZcnBR6n/
元データが3つだと工夫の余地なくない?
手抜きだから同差だと答えが出ない
元データA1〜A3 → 狭い方の平均x

s1 = Abs(A1 - A2)
s2 = Abs(A1 - A3)
s3 = Abs(A2 - A3)
If s1 < s2 And s1 < s3 Then x = (A1 + A2) / 2
If s2 < s1 And s2 < s3 Then x = (A1 + A3) / 2
If s3 < s1 And s3 < s2 Then x = (A2 + A3) / 2
0096デフォルトの名無しさん2015/09/19(土) 08:02:54.18ID:U6It5g+s
君ら考え方がおかしくないか
これは近い値の集合を得る処理と平均値を取る処理の2つに分けて考えるべき
一緒くたにして複雑にすることはない
>>95みたいな物を書いた後仕様変更で3つが4つ5つに増えていったらどうするの
0097デフォルトの名無しさん2015/09/19(土) 09:12:51.40ID:xryWHhpW
>>96
> 一緒くたにして複雑にすることはない

そんなことしてる奴はいないけど?
0098デフォルトの名無しさん2015/09/19(土) 09:49:54.54ID:zNER9jB5
>>96
>>91
0099デフォルトの名無しさん2015/09/19(土) 09:58:07.05ID:x1zzYklZ
>>91
indexとか配列とかなくした

Dim h, i As Long, j As Long
If UBound(arg) > 0 Then
h = Abs(arg(0) - arg(1))
NearAverage = (arg(0) + arg(1)) / 2
For i = 0 To UBound(arg) - 1
For j = i + 1 To UBound(arg)
If h > Abs(arg(i) - arg(j)) Then
h = Abs(arg(i) - arg(j))
NearAverage = (arg(i) + arg(j)) / 2
End If
Next j
Next i
End If
0100デフォルトの名無しさん2015/09/19(土) 10:51:53.04ID:zNER9jB5
>>99
そういや捨てるならスタックする必要無かったわな。
0101デフォルトの名無しさん2015/09/19(土) 11:01:51.71ID:GIof26cq
>>96
増えそうなら初めから3つとか言う限定した仕様で作らんわ
■ このスレッドは過去ログ倉庫に格納されています