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

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

レス数が1000を超えています。これ以上書き込みはできません。
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つとか言う限定した仕様で作らんわ
0102デフォルトの名無しさん2015/09/19(土) 12:24:34.40ID:Yu07ddUr
クソみたいなプログラミング指南したがる奴はどこにでもおるんやね
0103デフォルトの名無しさん2015/09/19(土) 13:14:42.74ID:ZcnBR6n/
>>96
元データを配列にして、結果を求める部分はFunctionに分ける、ぐらいしか今できる対策はないかな
あとはソート、差分、平均の3段階に分けて処理するだけ
0104デフォルトの名無しさん2015/09/19(土) 13:24:02.90ID:QbvRavMs
してほしい。クソかどうかは、個々の受け手が決める。
0105892015/09/19(土) 18:44:08.61ID:Hkqr5ylJ
皆様、ご回答ありがとうございました
微妙に違いますが、95様の回答が現状といったところです
ただ、95様の回答が見やすくわかりやすいので、こちらに書き換えようと思います^_^;
比較対象が増えたら他の皆様の回答も検討ですが…今はこれで十分です
ありがとうございました
0106デフォルトの名無しさん2015/09/19(土) 21:01:11.75ID:x1zzYklZ
>>105
コード少し長くなるけどこうすれば同差でも答えが出る
あと、感知出来ないほどの微妙な差だけど
理論的には処理スピードが若干速い(はず)

s1 = Abs(A1 - A2)
s2 = Abs(A1 - A3)
s3 = Abs(A2 - A3)
If s1 < s2 Then
 If s1 < s3 Then
  x = (A1 + A2) / 2
 Else
  x = (A2 + A3) / 2
 End If
Else
 If s2 < s3 Then
  x = (A1 + A3) / 2
 End If
End If
0107デフォルトの名無しさん2015/09/19(土) 21:31:02.48ID:ZcnBR6n/
同差に対応したいなら < を <= にすればいいだけと違う?
この程度の分岐なら If をなくして論理式だけで計算する方法もある。保守性は悪くなるけど

s1 = Abs(A2 - A3)
s2 = Abs(A1 - A3)
s3 = Abs(A1 - A2)
x = ((-(s1 <= s2 And s1 <= s3) * (A2 + A3)) + (-(s2 <= s1 And s2 <= s3) * (A1 + A3)) + (-(s3 <= s1 And s3 <= s2) * (A1 + A2))) / 2
0108デフォルトの名無しさん2015/09/19(土) 21:56:47.05ID:Ser2uuvv
解決済みだけどループだとこうか

Dim myHeap(3)
myHeap(0) = -9 '例
myHeap(1) = 2 '例
myHeap(2) = -8 '例
myHeap(3) = myHeap(0)
For a = 0 To 2
 sa = Abs(myHeap(a) - myHeap(a + 1))
 If a = 0 Or sa < samin Then
  samin = sa
  kore = a
 End If
Next
Debug.Print (myHeap(kore) + myHeap(kore + 1)) / 2
0109デフォルトの名無しさん2015/09/20(日) 07:22:59.99ID:O6Xw3ijC
>>107
論理式でやることの是非は別にしてせめて IIf( ) 使え
0110デフォルトの名無しさん2015/09/20(日) 15:04:26.59ID:yJDvCFfh
アマゾンの注文詳細ページから、住所などの必要な情報を抜き出すソフトを作ってます。
0111sage2015/09/20(日) 15:07:31.62ID:yJDvCFfh
Sub GetTable3()
Dim ie As InternetExplorer

'IEを開いて操作対象画面へ遷移
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
ie.navigate "https://xxxxxxxxxxxxxxxxxx";
Call waitNavigation(ie)


Dim htdoc As HTMLDocument
Set htdoc = ie.document

Dim ObjTD As Object
Set ObjTD = htdoc.getElementsByTagName("TD")

Dim objDic As New Scripting.Dictionary


Dim i() As String
Dim SPL() As String

Dim k As Integer

ReDim Preserve i(5)
0112sage2015/09/20(日) 15:08:19.44ID:yJDvCFfh
i(0) = SearchTD(ObjTD, "配送先住所:", 2)
i(1) = SearchTD(ObjTD, "注文日:", 2)
i(2) = SearchTD(ObjTD, "出品者SKU:", 6)
i(3) = SearchTD(ObjTD, "総計:", 2)
i(4) = SearchTD(ObjTD, "小計:", 2)


SPL = Split(i(0), vbCrLf)
objDic.Add "郵便番号", SPL(1)
objDic.Add "都道府県", SPL(2)
objDic.Add "住所", SPL(3)
objDic.Add "氏名", SPL(4)

SPL = Split(i(1), vbCrLf)
objDic.Add "注文日", Replace(SPL(0), "注文日:", "")
objDic.Add "出荷予定日", Replace(SPL(1), "出荷予定日:", "")
objDic.Add "配送予定", Replace(SPL(2), "配送予定:", "")

For k = 0 To objDic.count - 1
Debug.Print objDic.Keys(k) & ":" & objDic.Item(objDic.Keys(k))
Next
End Sub
0113デフォルトの名無しさん2015/09/20(日) 15:09:39.89ID:yJDvCFfh
Function SearchTD(ObjTD As Object, Keyword As String, Num As Integer) As String
Dim ObjTag As Object
Dim count As Integer

For Each ObjTag In ObjTD
If InStr(ObjTag.innerText, Keyword) > 0 Then
count = count + 1
If count = Num Then
SearchTD = ObjTag.innerText
End If
End If
Next ObjTag
End Function


もっとスマートな方法ないでしょうか?
0114デフォルトの名無しさん2015/09/20(日) 15:12:22.42ID:pUWit5sQ
そういうのってAPIないの?
0115デフォルトの名無しさん2015/09/20(日) 15:31:10.32ID:N1tzaqkj
個別のユーザに属する情報にアクセスするAPIはなかったと思うよ
0116デフォルトの名無しさん2015/09/20(日) 16:04:25.93ID:WypcIozp
>>109
IIfは重いから使うくらいなら普通にIf使った方がいい。
0117デフォルトの名無しさん2015/09/20(日) 16:14:07.99ID:+ZypWgyJ
>>109
Elseを使わない場合は置き換える意味があまりない
素直にIfを使った方がいい
0118デフォルトの名無しさん2015/09/20(日) 16:17:27.99ID:Xw2a/eLo
どこらへんをスマートじゃないって思ったんだろうか
0119デフォルトの名無しさん2015/09/20(日) 16:32:54.96ID:+ZypWgyJ
スマートかどうかはおいといて、

objDic.Add "注文日", Replace(SPL(0), "注文日:", "")
objDic.Add "出荷予定日", Replace(SPL(1), "出荷予定日:", "")
objDic.Add "配送予定", Replace(SPL(2), "配送予定:", "")

の部分は同ようなじ文字列定数を2回ずつ書いてるから、配列とループでまとめられそうだな、と思って見てたら配送予定だけコロンが半角か
Webデザイナーがタコだとこういうとこで苦労させられるんだよな
0120デフォルトの名無しさん2015/09/20(日) 16:43:47.63ID:bBK+EjQi
実装したプログラマが無能だったんじゃないですかね
0121デフォルトの名無しさん2015/09/20(日) 16:48:05.91ID:+ZypWgyJ
なぜ配送予定日じゃなくて配送予定なのか
こういう不統一を見ると修正したくてムズムズする
01221132015/09/20(日) 17:02:28.33ID:yJDvCFfh
>>114 >>115
APIがないので、力技でやっています。

>>118
目的のデータを抽出する方法が、
もっと工夫できるかなと思った次第です。

>>119
おっしゃる通り、配列とループでまとめられそうです!

>>120
セミコロンの全角・半角は引っかかるところでした。
こういうの、困りますよね

>>121
Amazonの記載を合わせて、配送予定にしたんですが、
確かに、違和感ありまくりですね
01231132015/09/20(日) 17:06:50.78ID:yJDvCFfh
あとは、抽出したデータをどうやって保持するかで悩んでます。
一時的に保持するのは、配列 or Dictionary型変数でいいとして、

恒久的に残す方法としては、DBとエクセルのセル、
ほかに、手段はありますか?
0124デフォルトの名無しさん2015/09/20(日) 17:23:07.51ID:JN4sWUyx
恒久的に残すことを視野に入れてるなら、まず取得したHTMLを生で保存してからパースした方がいいとおもう
途中でHTMLの構造が変わっても対応できるし
01251132015/09/20(日) 18:23:04.09ID:yJDvCFfh
>>124
それは頭になかったです。
データの抽出個所が作り終わったら、
アマゾンの注文詳細ページを保存する処理を作ります。
ありがとうございました
0126デフォルトの名無しさん2015/09/20(日) 18:30:26.40ID:TCLy3oJX
後からあのデータも抜いとけばよかったってなっても生データが残ってれば対応できるし
0127デフォルトの名無しさん2015/09/20(日) 19:44:07.88ID:b29G919i
>>116-117
> この程度の分岐なら If をなくして論理式だけで計算する方法もある。

が前提なのに何を言ってるんだ?
0128デフォルトの名無しさん2015/09/20(日) 23:27:46.38ID:WP4lHv1X
論理式だとなんかメリットあんの?
とりあえずIfよりも分かりにくいのは明らかなデメリットなんだけど
0129デフォルトの名無しさん2015/09/20(日) 23:40:18.29ID:hazPNZsd
VBAだとどうか知らないけど、一般的に連続している計算同士が相互に干渉しないと判断される場合は
CPUが並列的に処理するので処理速度的に有利なんじゃないかな。
0130デフォルトの名無しさん2015/09/20(日) 23:49:20.24ID:y6XmTiAF
>>128
式の方が速い




気がする
0131デフォルトの名無しさん2015/09/21(月) 00:42:19.68ID:c1rO/cps
>>128
少ない行数で書ける。ブラックボックスなら行数が少ない方が全体の見通しが良くなる
式によってはIfを並べるより高速。今回のケースに当てはまるかどうかは知らん
0132デフォルトの名無しさん2015/09/21(月) 06:46:29.92ID:IJWaFyNv
>>128
> とりあえずIfよりも分かりにくい

そうか?
たいして変わらん気がするが

s1 = Abs(A2 - A3)
s2 = Abs(A1 - A3)
s3 = Abs(A1 - A2)
x = ( _
 IIf(s1 <= s2 And s1 <= s3, A2 + A3, 0) + _
 IIf(s2 <= s1 And s2 <= s3, A1 + A3, 0) + _
 IIf(s3 <= s1 And s3 <= s2, A1 + A2, 0) _
) / 2
0133デフォルトの名無しさん2015/09/21(月) 09:10:58.45ID:6Qd0iGUJ
If方式と論理式方式の悪いところを集めた見本だな
0134デフォルトの名無しさん2015/09/21(月) 09:11:25.29ID:dvC4p2Ci
シートを削除する時、対象のシートが存在しないとエラーになるので
事前に存在チェックをしたいのですが、どうやればいいですか
0135デフォルトの名無しさん2015/09/21(月) 09:31:03.68ID:6Qd0iGUJ
WorksheetsかSheetsをループして検査すればいいんじゃね
0136デフォルトの名無しさん2015/09/21(月) 09:36:42.45ID:c1rO/cps
On Errorで強行
0137デフォルトの名無しさん2015/09/21(月) 10:08:28.27ID:dvC4p2Ci
>>135
ありがとう
ググったら、シートの名前を総当たりで比較するコード例を見つけました
Worksheets.existsみたいなメソッドがあるかと探したんですが、ないっぽいですね

>>136
すいませんOn Error関係はさっぱりわからないのでこっちで行きます
0138デフォルトの名無しさん2015/09/21(月) 14:58:40.75ID:vgStNT9K
>>132
いやそれIIfですやん
0139デフォルトの名無しさん2015/09/21(月) 16:38:28.44ID:wnRm1ekA
IIfは関数だし真と偽の両方が必ず処理されて不要な方が捨てられる仕様だからステートメントのIfより遅すぎる
0140デフォルトの名無しさん2015/09/21(月) 22:08:43.77ID:yWuUj8Sk
遅い、読めない、エラー処理がない
VBA三大あってはならないこと
0141デフォルトの名無しさん2015/09/21(月) 23:34:57.55ID:c1rO/cps
えっ、VBAに速さを求めるの?
0142デフォルトの名無しさん2015/09/21(月) 23:39:12.00ID:2qBLgXMr
>>140
VBAできないやつが言いそうなことですな。
0143デフォルトの名無しさん2015/09/21(月) 23:55:08.30ID:yWuUj8Sk
>>142
VBAすら出来ない奴に言われても…
0144デフォルトの名無しさん2015/09/22(火) 00:31:49.37ID:1embjWoE
また出たよ。ケースバイケースだっての。この話終わり。
0145デフォルトの名無しさん2015/09/22(火) 15:56:29.50ID:0P5A+/ZK
>>143
はいはいw
0146デフォルトの名無しさん2015/09/22(火) 16:30:01.49ID:AVvFPFzY
返事は一回。
0147デフォルトの名無しさん2015/09/22(火) 17:50:15.04ID:DpphIHOi
>>146
ほ〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜いwwwww
0148デフォルトの名無しさん2015/09/23(水) 12:01:33.86ID:n9K2IqyH
シート上に
小さい正方形のShapeをたくさんランダムで貼り付けたいのですが
それぞれが絶対に一部でも重ならないようにするためには
どうすればいいですか?

n個目の正方形を加えるとき
既存のn-1個の正方形の座標と一辺の長さを調べて
1つ1つ重ならないか判定してもし重なったらずらすという作業になりますか?
0149デフォルトの名無しさん2015/09/23(水) 12:41:24.37ID:DYKiEO7L
>>148
正方形の大きさがすべて同じで座標が辺の整数倍でいいんなら、ワークシートのセルをその大きさにすればシェイプの有無は簡単に判定できる
0150デフォルトの名無しさん2015/09/23(水) 13:58:07.86ID:ey1JxzVK
>>148
具体的なコードは書けないけど、
あらかじめ頂点の座標を2次元配列で用意しといて、
その集合の中から正方形一個書く毎に使われた頂点座標を消していくってのはどう?
残ってる座標からならどれ選んでも重ならないことが確定してるんだから
一個ずつ判定する手間は掛からない
0151デフォルトの名無しさん2015/09/23(水) 14:13:05.07ID:z8WDBc2F
>>148
何がしたいかしらんが、素直に考えればそうなるだろ
重なるかどうかの判定方法とかは色々考える余地はあるかしれんが

>>149
もういっそシェイプいらんな、それw
セルに罫線でいい

>>150
何の2次元配列でどうやって格納するのか知らんが
その座標を用意する方法を聞きたいんじゃないのか
0152デフォルトの名無しさん2015/09/23(水) 14:19:13.96ID:swCBisty
まずシェイプが重なっている事を判別する方法をみつけて
あとはシェイプを作る前に完璧な配置を設計するか
配置しながら間引いていくか
配置し終わってから間引くかすればいいんじゃない
間引きすぎたら追加とあたり判定と間引きを繰り返せばいいし
0153デフォルトの名無しさん2015/09/23(水) 14:26:54.55ID:DOrhv1Zg
正方形の大きさはすべて同じなのか?
張り付ける角度は任意なのか?

で、だいぶ難易度が違うと思うぞ
0154デフォルトの名無しさん2015/09/23(水) 14:41:53.27ID:ey1JxzVK
>>151
シェイプの占める位置ってTop,Left,Hight,Widthで決まるんだし
それを使った分だけ消していけばいいんじゃねーかと思ったのよ
具体的にどうやるとかは考えてない
0155デフォルトの名無しさん2015/09/23(水) 15:16:01.93ID:ngr3Q2aD
Enum ShapeData
xPos
yPos
sHeight
sWidth
End Enum

Function ShapeHit(x, y, h, w) As Boolean
Static SData As New Collection
Dim xf As Boolean, yf As Boolean

If SData.Count Then
For Each shp In SData
xf = x > shp(xPos)
If xf Then xf = x < shp(xPos) + shp(sHeight) Else xf = x + h > shp(xPos)

yf = y > shp(yPos)
If yf Then yf = y < shp(yPos) + shp(sWidth) Else yf = y + w > shp(yPos)

If xf And yf Then Exit Function
Next
End If

SData.Add Array(x, y, h, w)
ShapeHit = True
End Function

動作確認してないけど2Dゲームの当り判定と一緒だからたぶん動くはず。
0156デフォルトの名無しさん2015/09/23(水) 16:21:12.46ID:BZkHtvev
>>148
まさかそれ、2次元のゲームで動くってことはないよな。

動くんなら移動量を含めた計算をしないとダメだぞ。
0157デフォルトの名無しさん2015/09/24(木) 11:10:17.96ID:UXZYq8x3
>>87
データがなくなるまでdoSomethingを実行するというコードなんだけど。
0158デフォルトの名無しさん2015/09/24(木) 21:53:53.16ID:/x273dIP
読取専用になってるブックに別ブックのセルの内容を転記することってできないとかな?
0159デフォルトの名無しさん2015/09/24(木) 22:05:15.99ID:fpN6Y8wB
日本語難しいですか?

"読 取 専 用"
難しくて理解できませんか?
0160デフォルトの名無しさん2015/09/24(木) 22:21:39.94ID:/x273dIP
>>159
だから、読取専用ブックになんとかして転記したいから聞いてんの。
0161デフォルトの名無しさん2015/09/24(木) 22:48:34.02ID:fpN6Y8wB
>>160
じゃあ
よみとり せんよう ではなく
ふつうに ひらきなさい よ。

なぜ よみとり せんよう なのかを
かんがえた ほう が よいですよ。
0162デフォルトの名無しさん2015/09/24(木) 22:54:40.56ID:X5tdJ92l
読み取り専用なのにデータを書き込みたいって、同じ質問がたしか半年ぐらい前にもあった
みんなで色々アイデアを出したけど、みんな却下された
何がやりたいんだよお前って感じで、この手の質問に答えるやついねえと思うわ
0163デフォルトの名無しさん2015/09/24(木) 22:58:09.35ID:hSB6OGIK
己の目と手を使い丹精込めて手打ちコピーしたらいいとおもうよ
0164デフォルトの名無しさん2015/09/24(木) 23:13:59.47ID:5nkRohqn
リネームして保存したらええねん w
0165デフォルトの名無しさん2015/09/25(金) 00:49:36.98ID:gfThCn3p
転記だといけると思ったのかな?
0166デフォルトの名無しさん2015/09/25(金) 01:04:43.50ID:W+wIO++a
テンキー使って転記
0167デフォルトの名無しさん2015/09/25(金) 04:34:28.43ID:bqWiJdiu
天気のいい日に転機が訪れる
0168デフォルトの名無しさん2015/09/25(金) 06:07:05.57ID:Wh7Co0U2
>>160
いや、冗談抜きに>>164で言ってるようにリネームして保存して、
元のブック削除して元のブックの名前にリネームし直せばいいんじゃないの?

最初リネームするとき現在時刻を年月日時分秒まで元ブック名の末尾にでも付けて、
一応存在チェックして存在してればまた違う名前にすればいいんじゃないのかな。

もし元ブックが削除されて、リネームで保存したブックを元の名前にリネームされる前に
同じフォルダに同名のブックが作成されるのが嫌ならオペレートでそれを禁止させればいいんじゃない?
0169デフォルトの名無しさん2015/09/25(金) 06:39:25.79ID:KPP4ZJCN
g = 1
Do While g < 101

i = 1
Do While i < 21
Range("BA2").Value = 11 + i
Range("BA3").Value = g
Range("CB" & (202 + (g * 20)) + i).Value = Range("BA9")
i = i + 1

Loop

g = g + 1
Loop

Range("BA3") = Range("CA221")
Range("BA2") = 11


こんなマクロを何十と起動するのですが、時間が掛かってしょうがないです
高速化できるならばお願いします
セルBA2、セルBA3の値が変わる度にエクセル側が20万項目くらい再計算してるのも問題だと思います
0170デフォルトの名無しさん2015/09/25(金) 07:22:08.47ID:Wh7Co0U2
>>169
まず、BA2とBA3に入る値はどこにも使われていないし、最後に書き換わるから、
内側のループでそれらを設定しているところは要らないよね。

で、多分ループ自体がいらなくて、BA9の値をCB223〜CB2222の範囲に設定した後、
ループ外の下2行を行うのと同義だと思うんだけど違う?
0171デフォルトの名無しさん2015/09/25(金) 08:02:12.59ID:EMZZqHNf
>>169
>>170
BA2とBA3は、BA9の値を作るのに使ってるんかじゃないかな?
最後に書き換えてるのが気になるんだよね。

>20万項目くらい再計算してるのも
って言ってるのも引っかかるし。

シートの各セルを調べ上げて計算式なんかも全部洗いだして
作り直したほうがいいかもよ?
セルに設定してる式をマクロに持ってくるとか、計算用にシートを別に用意するとかしないと、
再計算しないようにすることもできないから、高速化の道は険しいかもね。
0172デフォルトの名無しさん2015/09/25(金) 08:54:13.46ID:EjmAc1nd
早いパソコンかっちゃいなよ
0173デフォルトの名無しさん2015/09/25(金) 09:14:56.73ID:2FvsaI3a
式を埋め込みまくってそこにデータをコピーしてたのをコピーした後に再計算するようにしたら、20〜30分かかってたのが
一瞬で終わって、あれにはびっくらこいた w
0174デフォルトの名無しさん2015/09/25(金) 10:54:43.43ID:gfThCn3p
再計算は最後にまとめて、が早くする方法だろうね。
BA2,3と9の計算の間が何起こっているんだろう。
0175デフォルトの名無しさん2015/09/25(金) 10:56:52.10ID:QB41dI3S
Application.ScreenUpdating = Falseにしたら、気持ち速くなるかも。
01761692015/09/25(金) 17:42:20.27ID:KPP4ZJCN
>>171さんのご指摘通りBA9の値を作る為のマクロです
表の計算式ありきのマクロなので一旦別で計算するのも難しいですかね
作り直しを検討します。
今のCPUがi7.2600Kなのですが最新のに変えると速くなりそうですか?
0177デフォルトの名無しさん2015/09/25(金) 18:04:14.73ID:QB41dI3S
>>176
時間がかかるというのがどれくらいで、目標がどれくらいなのかわからないと回答できないと思う。

今1分かかっているのを1秒にしたいのならCPU交換じゃ無理だけど、30秒でいいなら高速な
PC買えば多分解決する。

うまい処理方法(アルゴリズム・ロジック)にすれば、今のままでも1秒で終わる可能性はある。
01781692015/09/25(金) 18:15:22.37ID:KPP4ZJCN
>>177
今で1時間20分くらい掛かってますね
CPU次第で半分近くになるってのも凄いです
0179デフォルトの名無しさん2015/09/25(金) 18:33:36.81ID:QB41dI3S
>>178
あ、「CPU交換」だけじゃ無理かも。
全部最新のパーツでCPUを i7-5775Cあたりにすれば倍くらいいくんじゃないかな。
0180デフォルトの名無しさん2015/09/25(金) 18:39:01.74ID:9bx+/Ihn
>>176
このマクロに関係するセルのうち、
計算式が入ってるセルは何個ぐらいあるの?
01811692015/09/25(金) 18:39:02.23ID:KPP4ZJCN
>>179
なるほど ありがとうございます
他の方も助言ありがとうございました!
01821692015/09/25(金) 18:42:43.82ID:KPP4ZJCN
>>180
100×300のセルを全て同時に計算してその中で最も高い値を
特定のセルに表示する

たぶんこれを数字が変わるごとにやってます
0183デフォルトの名無しさん2015/09/25(金) 18:56:48.21ID:NnuAglUK
VBAで何とかしたいっていうなら、そのセルの計算式を全部VBA内で計算するようにするパターンだな
最近のエクセルなら、セルの計算式は複数コアで並列計算できるけど、VBAでは無理だから逆に遅くなる可能性もある

コア数の多いCPUで実行するとか、クラスタで実行させるようなHPCサーバとか言うのもあったな
まあそれ以前にExcelでやるのが正しいのかどうか疑問だが
0184デフォルトの名無しさん2015/09/25(金) 20:05:47.61ID:jGXWQ+n4
Sub test()
Dim i As Long, g As Long
Dim fml As String, sp(2)

fml = Range("BA9").Formula

i = InStr(1, fml, "BA2")
g = InStr(1, fml, "BA3")

If i - 2 Then sp(0) = Mid(fml, 2, i - 1)
sp(1) = Mid(fml, i + 3, g - (i + 3))
If Len(fml) > g + 3 Then sp(2) = Mid(fml, g + 3, Len(fml) - (g + 3))

For g = 1 To 101
For i = 1 To 21
Range("CB" & (202 + (g * 20)) + i).Value = Evaluate(sp(0) & 11 + i & sp(1) & g & sp(2))
Next
Next

Range("BA3") = Range("CA221")
Range("BA2") = 11

End Sub

テストのしようも無いから動くか分からないけど、これでいけるんじゃないかな。
0185デフォルトの名無しさん2015/09/25(金) 20:22:33.28ID:jGXWQ+n4
と思ったけど100*300セルの数式の集合なのか。

30000程度の計算なら会社で使ってるwin7 32bit 4gb i3のショボいパソコンでも二秒かかってないから、
VBAに取り込んで計算した方が早いだろうな。
0186デフォルトの名無しさん2015/09/25(金) 23:08:36.82ID:6O5MjWHM
BA9の数式は?
初心者にはこの位の難易度が勉強になりそう
0187デフォルトの名無しさん2015/09/27(日) 09:24:25.84ID:8y/VKJg8
これからVBAの学習をしたいと思っているんですが、エクセル自体初級者レベルです。
(MOSのスペシャリストの方くらい)
Excelに詳しくないと難しいですか?
先にExcelの勉強をすべきか、どなたかアドバイス下さい。
オススメの本などもありましたら教えて頂けると嬉しいです。
0188デフォルトの名無しさん2015/09/27(日) 09:29:32.86ID:sLoOgNJF
test1だと、値代入 → 3秒停止 → 図形挿入ですが
test2だと、3秒停止 → 値代入、図形挿入になってしまいます。
test2でも、図形挿入 → 3秒停止 → 値代入にするには
どうすればよいでしょうか。
使用環境:Windows7(64bit)、EXCEL2010

======================================================
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub test1()
Cells(1, 2).Value = 1
Sleep 3000
ActiveSheet.Shapes.AddShape(msoShapeRectangle, 0, 0, 54, 13.5).Select
End Sub

Sub test2()
ActiveSheet.Shapes.AddShape(msoShapeRectangle, 0, 0, 54, 13.5).Select
Sleep 3000
Cells(1, 2).Value = 1
End Sub
0189デフォルトの名無しさん2015/09/27(日) 09:46:06.54ID:ebPtahUI
>>187
手動操作をVBAマクロとして吐き出す機能である「マクロの記録」が便利だから、
Excelの操作を覚えてからの方がVBAはとっつきやすいだろうね。

VBAに関してはネットで検索した方がよっぽど役に立つので本は必要ない。
0190デフォルトの名無しさん2015/09/27(日) 10:13:17.17ID:V6V0Y/p4
>>187
動機による
Excelの手操作を自動化して楽したいと思っている人なら、学ぶ価値はある
それ以外の人が学んでもモチベが続かないだろう

書籍は以下がオススメ
この操作を自動化するにはこうする、という形から入る人のための本
・仕事に役立つ ExcelVBA実用サンプル 第3版
0191デフォルトの名無しさん2015/09/27(日) 10:30:25.39ID:2CSdDWVz
>>188
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub test2()
  ActiveSheet.Shapes.AddShape(msoShapeRectangle, 0, 0, 54, 13.5).Select
  Cells(1, 2).Select
  Sleep 3000
  Cells(1, 2).Value = 1
End Sub
0192デフォルトの名無しさん2015/09/27(日) 10:32:52.49ID:2CSdDWVz
>>188
ちな、test1も3秒後には表示されてないよ
同じように3秒間隔で図形を2個挿入してみるとわかるけど、End Subのところで2個まとめて表示されてる
01931882015/09/27(日) 10:45:46.49ID:sLoOgNJF
>>191
ありがとうございます。助かりました。
0194デフォルトの名無しさん2015/09/27(日) 12:32:03.81ID:8y/VKJg8
>189-190
ありがとうございます!
とりあえずチャレンジしてみたいので、Webを見るところから始めてみます。
0195デフォルトの名無しさん2015/09/27(日) 19:41:37.36ID:y8jAuOzn
selectいらないし、DoEventsいれれば解決?

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub test1()
Cells(1, 2).value = 1
Sleep 3000
ActiveSheet.Shapes.AddShape msoShapeRectangle, 0, 0, 54, 13.5
End Sub

Sub test2()
ActiveSheet.Shapes.AddShape msoShapeRectangle, 0, 0, 54, 13.5
DoEvents
Sleep 3000
Cells(1, 2).value = 1
End Sub
0196デフォルトの名無しさん2015/09/27(日) 19:52:19.11ID:uZJD7NWm
俺もDoEventsで解決するはずだしそれが解決方法として正しいと思ったが
どうもうまくいかないな
DoEvents 2回続けてやるとうまく行った
まあ多分環境依存するんだろうけど、DoEvents走るタイミングの問題じゃないかな
0197デフォルトの名無しさん2015/09/27(日) 20:23:11.43ID:SBnm24wB
タイミングが悪いと最悪CPUのコア数だけDoEventsが必用になるんで互換性を考えるとSelectのが確実
あとは試してないけどワークシートの再描画させてみるとか

ScreenUpating = False
ShapesAdd〜
ScreenUpating = True

みたいに
0198デフォルトの名無しさん2015/09/27(日) 21:33:12.62ID:Vse6nDq1
変数1 = Range("a1").Value - 0.01

A1セルの値から0.01を引いた数を 変数1 としたいのですがどう書けばいいのでしょうか?(上の式はてきとうです。)
0199デフォルトの名無しさん2015/09/27(日) 21:34:54.32ID:Vse6nDq1
>>198
あれ?!?! 適当に書いた式で実行出来ましたwwwww 事故解決w
0200デフォルトの名無しさん2015/09/27(日) 21:36:04.98ID:y8jAuOzn
3秒のディレイがどのくらい正確なものが必要なのかわからないけど
こんな方法もあるよ。
Sub test2()
ActiveSheet.Shapes.AddShape msoShapeRectangle, 0, 0, 54, 13.5

Dim sTime As Single
sTime = Timer
Do While Timer < sTime + 3
DoEvents
Loop

Cells(1, 2).value = 1
End Sub
0201デフォルトの名無しさん2015/09/28(月) 19:39:38.05ID:9ibdMIuX
使ったこと無いけどApplication.OnTimeでもいけそう。
0202デフォルトの名無しさん2015/09/28(月) 21:41:41.22ID:Y6qP8tJG
ブックを閉じるときに変更があったなら閉じるのをキャンセルして、変更がなかったり、変更して上書き保存してたら普通に閉じるみたいなことはどのようにかく?savedプロパティは変更してなくても保存すりゃtrueだし
0203デフォルトの名無しさん2015/09/28(月) 21:57:25.58ID:65OblfGI
>>202
>変更がなかったり、変更して上書き保存してたら普通に閉じる
何も作らなくても、そうなってると思うけど。。。

>ブックを閉じるときに変更があったなら閉じるのをキャンセル
savedプロパティみて、Closeイベントでキャンセルすれば
いいんでない?
0204デフォルトの名無しさん2015/09/29(火) 06:56:45.94ID:WCs1snz9
>>203
savedプロパティって保存したかのプロパティで、変更したかどうかのプロパティではないでしょ。
0205デフォルトの名無しさん2015/09/29(火) 09:33:33.65ID:s91DJZ4E
>>204
おいおい
お前エクセル使ったことないだろ
0206デフォルトの名無しさん2015/09/29(火) 11:03:24.91ID:OJNpRsGt
質問なのですが
下記のマクロを、シートの数だけ繰り返すには
どうすればいいのでしょうか。
同じ形式のテーブルが8つのシートにあります。

Sub 集計()
ActiveSheet.ListObjects("テーブル2").ShowTotals = True
Range("テーブル2[[#Totals],[金額]]").Select
ActiveSheet.ListObjects("テーブル2").ListColumns("金額").TotalsCalculation = _
xlTotalsCalculationSum
End Sub
0207デフォルトの名無しさん2015/09/29(火) 12:34:06.35ID:s91DJZ4E
>>206
こうかな

Sub 集計()
  For Each sh In Worksheets
    sh.Activate
    ActiveSheet.ListObjects("テーブル2").ShowTotals = True
    Range("テーブル2[[#Totals],[金額]]").Select
    ActiveSheet.ListObjects("テーブル2").ListColumns("金額").TotalsCalculation = xlTotalsCalculationSum
  Next
End Sub
0208デフォルトの名無しさん2015/09/29(火) 14:44:56.33ID:CgRcTB6e
>>206
こんな風にも書けるよ。
コメントは消し試してみてね。

Sub 集計()
Dim sh As Worksheet
Dim co As New Collection '←Collection vba でググってみてね
co.Add Application.Worksheets("sheet1")
co.Add Application.Worksheets("sheet2")
co.Add Application.Worksheets("sheet3")
'↑集計したいシートをCollectionに格納(sheet8まで書くのがめんどくさかった)
'↓格納したCollectionでForループを回すだけ
For Each sh In co
sh.Activate '書かれたソース(↓)がActiveSheetだったのでアクティベートしただけ
'///////////////////////////////////////////////////////////////////////////////////////////////////
'ActiveSheet.ListObjects("テーブル2").ShowTotals = True
'Range("テーブル2[[#Totals],[金額]]").Select
'ActiveSheet.ListObjects("テーブル2").ListColumns("金額").TotalsCalculation = xlTotalsCalculationSum
'///////////////////////////////////////////////////////////////////////////////////////////////////
'↓動くかわからないけど、たぶんまとめるとこんな感じ。
With ActiveSheet.ListObjects("テーブル2")
.ShowTotals = True
.ListColumns("金額").TotalsCalculation = xlTotalsCalculationSum
End With
Next
Set co = Nothing
End Sub
0209デフォルトの名無しさん2015/09/29(火) 15:33:52.01ID:OJNpRsGt
>>207 >>208
有難う御座います!早速やってみます。
0210デフォルトの名無しさん2015/09/29(火) 21:36:31.19ID:ERVYo9cZ
>>204
Workbook.Saved プロパティ (Excel)
https://msdn.microsoft.com/ja-jp/library/office/ff196613.aspx
>>True の場合、ブックは最後に保存された状態から変更されていません。・・・・
0211デフォルトの名無しさん2015/10/02(金) 18:14:48.60ID:HA2gZYjF
ユーザーフォームを常に前面にするのはぐぐるとAPIを使った方法があるみたいですけど、Msgboxで出てくるのを同じように
前面にする方法って無いんですかね。
この前、OKボタンが他のアプリに隠れて無限ループに落ちいったか?と焦ったものでw
0212デフォルトの名無しさん2015/10/02(金) 18:44:25.51ID:QSVxa2C/
質問です。
現在以下のことを行うブックがありますが・・・(ブックAとします)

1. リアルタイム株価等を取得
2. 5秒間に取得した株価等をいろいろ計算
3. 計算した結果をシートに書き出す(5秒毎に1行が追加される)
4. 既にあるグラフの表示範囲を変更(最新の100行分のデータをグラフに表示)

1〜3の機能しかないブック(ブックB)と比較すると
1で取得した株価データは、ブックAよりもブックBの方が多い結果となりました。
4のグラフ操作に時間がかかっており、その間に変化した株価を取りこぼしているものと考えています。これを改善する方法をアドバイスして頂きたいのです。
完全に取りこぼしをなくすことはVBAでは無理かもしれませんが、
VBAで取りこぼしをなるべく減らすためのアイディアを教えて下さい。

私が今考えているのは、1〜4を分離する方法です。

(案1)
ブックCに記述したマクロで1,2を行い、計算した結果をブックDのシートに書き出す(3)。
ブックDに記述したマクロで4を行う。

(案2)
ブックDに記述したマクロで1,2を行い、計算した結果をCSVファイルに書き出す(3)。
ブックDに記述したマクロでCSVファイルを読み込み、4を行う。

他に何か良い方法がありましたら教えて下さい。
02132122015/10/02(金) 18:48:56.49ID:QSVxa2C/
間違えてました

(案2)
ブックDに記述した・・・書き出す(3)。 ← ブックCです
ブックDに記述した・・・4を行う。


将来的にはC#などで書くことになると思いますが、
現在VBAしか知らないので、取り急ぎ今できる改善を行いたいのです。
宜しくお願いします。
0214デフォルトの名無しさん2015/10/02(金) 19:14:22.02ID:NAtCgKRk
>>211
システムモーダル指定でいいんじゃね
MsgBox "TEST", vbSystemModal
0215デフォルトの名無しさん2015/10/02(金) 19:25:23.17ID:HA2gZYjF
>>214
おぉぉ、こういうのがあったんだ。。。。ありがとうです
0216デフォルトの名無しさん2015/10/02(金) 20:11:05.21ID:SAbURHhg
>>212,213
1と2をやるブックと
取得したデータから計算して3と4をやるブック
に分けてみては?
0217デフォルトの名無しさん2015/10/02(金) 20:16:28.51ID:A1PuY9yl
グラフの描画回数減らせばいいんじゃね、データ取得2回で1回とか
0218デフォルトの名無しさん2015/10/02(金) 22:12:04.22ID:lfSJUV9j
グラフが簡易的なものでもいいなら、htaのvbsで作ったら早くなる?
0219デフォルトの名無しさん2015/10/02(金) 23:08:06.73ID:QSVxa2C/
>>216
1と2のブックと、3と4のブックに分けるのですか?
2の計算結果をどのように一方のブックに渡せばいいのでしょうか?

>>217
グラフの描画は5秒に1回です。
データ取得はデータが変化したタイミングで行っています。
1秒に数度変化することもあれば数十秒間変化しないこともあります。

>> 218
htaがわからないので調べてみます。


レスありがとうございます。
0220デフォルトの名無しさん2015/10/02(金) 23:31:08.10ID:ky+9MSCK
自分でVBA組むより金払って違う言語で作って貰いなよ
0221デフォルトの名無しさん2015/10/02(金) 23:47:15.32ID:E7TOaV4P
っていうか難易度大して違わないんだからMeta Traderで組めばいいのに。
0222デフォルトの名無しさん2015/10/02(金) 23:58:30.46ID:QSVxa2C/
>>220
これで儲けられることが確実なら金払って作ってもらうことも考えますが、
なんせ儲けられるかどうか不明なもので・・・

>>221
後出しで申し訳ないのですが、
現在の株価だけでなく、瞬間瞬間の約定数(売買成立枚数)も参考に
売買タイミングを見極めようという試みなのです。
これはMeta Traderではできないことなのです。たぶん・・・。
0223デフォルトの名無しさん2015/10/03(土) 00:26:39.35ID:2BaZKaXa
>>222
残念だけど、あなたのやろうとしていることはかなり高度なのよ
株価データ取得・分析・グラフ描画処理をリアルタイムでこなす
ツールがあったら、投資するよりそれを売った方が儲かる
0224デフォルトの名無しさん2015/10/03(土) 00:31:04.27ID:cD86uwta
エクセルVBAでやるには向かない感じがする
コンセプトだけVBAで作って別の言語で実装しなおす位なら最初からVBA使わない方がいいと思う
0225デフォルトの名無しさん2015/10/03(土) 01:44:23.96ID:lC+q6YLW
>>223>>224
そうなのか。高度なのか。
全く取りこぼしなく全てのデータを取得して、ほぼリアルタイムにグラフ化というのは、
理想ではあるけれどそこまでは求めていないんです。
多少のデータ取りこぼしは仕方ないし、
グラフ化も、なんだったら3秒遅れてもいいんです。
ただ、今よりもデータの取りこぼしを少なくしたいんです。
ブックを分けて負荷を分散したら今よりマシになるかな?
それか他にもっといい方法はないかな?という相談なのです。

visual studio はインストール済みで、VBやC#で株価取得を解説してるサイトもブックマーク済みなんです。
でもなかなか腰が重くて・・・
プログラミング素人でVBAをやっと独学でなんとかというレベルなもので。

いろいろとありがとうございます。
まずは案1と案2を土日で作ってみます。
0226デフォルトの名無しさん2015/10/03(土) 02:51:18.28ID:RbSlktKi
データどうやって取得してるのか知らんが、データ欠損が問題で
リアルタイム性が低くて良いなら、まずデータ取得元にバッファかませられないか考えた方がいいんじゃね

グラフが重いならグラフを別ブックにすればトータルで早くなる可能性はたしかにあるけど
CSVで受け渡しは、ディスクのスピードの問題とかもあるし、そんなに有効ではない気がする
まあ、俺ならデータ取得とグラフ表示は別ブックで、バックエンドにDB用意するだろうな

C#かVBでちゃんとしたマルチスレッドのプログラム作れるレベルならそれで作れるけど
どっちにしろEXCELやVBA向きでないのはたしか
0227デフォルトの名無しさん2015/10/03(土) 07:11:30.16ID:topUSkbM
>>225
VB.NetやC#だったらむしろマルチスレッドを使えば比較的簡単に作れるかな。
気をつけなければならないのは、画面に反映させるときはDelegateを使わなければ出来ないと言うことと、
どんなデータをどっちでやらせるかの分割くらい。

VBAでそれをやりたいのであれば、バッチで取り込み用の別処理をそれぞれ起動して、
DB経由にでもしてVBAでそれを表示させるようにすれば取り敢えずDB側でデータの取りこぼしは減るんじゃなかろうか。

どっちにしても皆が言うように難易度的には業務で使ってるくらいの知識は必要になるだろうけどな。
0228デフォルトの名無しさん2015/10/03(土) 08:52:18.66ID:4VQgtYk9
人にVBAを教えるとき
 Variantは極力やめてちょ。
 1文字変数極力やめてちょ。
 全部SubじゃなくFunctionも使ってちょ。
 引数も使ってちょ。
 ActiveSheetとか状況により不確定なもの使わないでちょ。
 Range(〜)と不確定な書き方やめてちょ。(せめてワークシートから指定してちょ。)
とかいつ頃教えますか?
0229デフォルトの名無しさん2015/10/03(土) 09:48:56.53ID:C7I9pgK8
>>225
組み込み・制御などのリアルタイム処理と同じだね。
これらでは、データの取りこぼしを無くすようにする

データの取得が速い言語で、十分な容量のバッファメモリ、
Linuxのtmpfsのように、メモリ上に、ファイルを作って、
HDDにアクセスせず、共有メモリのまま、
データを次の処理へ渡す
0230デフォルトの名無しさん2015/10/03(土) 10:01:12.28ID:2BaZKaXa
>>228
コーディングルールは制定されていないの?
最初にそれを示すだけで済むことよ
0231デフォルトの名無しさん2015/10/03(土) 10:13:40.85ID:3kbtRnsC
>>228
> Variantは極力やめてちょ。
> 1文字変数極力やめてちょ。

この2つはルール化したらダメだよ。
0232デフォルトの名無しさん2015/10/03(土) 10:25:11.82ID:77jE6Sjm
まーた始まった
0233デフォルトの名無しさん2015/10/03(土) 12:31:07.32ID:ZKRFUKiL
コーディングのルールは宗教と同じで正解がないから話し合いや相談は無意味
何を書いてもマイルールにしかならない
組織やグループごとに代表がルールを決めたらそれに従う
代表が無知でタコだったらITドカタは泣くしかない

そんだけのことですよ
0234デフォルトの名無しさん2015/10/03(土) 12:32:12.66ID:8AsXeoHo
お前らに教えられたら教わった人が可哀想だからやめてください
02352122015/10/03(土) 12:41:18.03ID:lC+q6YLW
>>226>>227>>229
馬鹿なんでみなさんのレスを20%ぐらいしか理解できてませんがありがとうございます。

とりあえず以下でトライしてみます。

1. ブックAでデータ受信とデータ処理して処理結果を5秒間隔でクリップボードにテキストでコピーする。
(10項目ぐらいの処理結果数値をカンマで連結)

2. ブックAとは別プロセスで開いたブックBが1秒間隔でクリップボードをチェックし、
受け取っていない処理結果があればブックBのグラフデータ用のワークシート最終行に貼り付ける。
その後グラフの表示範囲を変更する。

問題は急用でこれから出掛けなければならないこと。
この案を形にして月曜の取引時間で動作をチェックしたいが時間が取れない・・・
0236デフォルトの名無しさん2015/10/03(土) 12:54:27.22ID:3kbtRnsC
考え方が偏向してたり知識が古かったりする人間がルール作ることはあり得る。
反発されないようにうまく誘導することだな。
0237デフォルトの名無しさん2015/10/03(土) 13:07:59.81ID:gOpJ5SBw
俺も数値とか文字とか、
あらかじめ何が入るか決まってるときには
LongなりStringなり、それ専用の変数使うし
オブジェクトもWorksheet型とかRange型とか、
極力対象を局限した型で宣言するけど
Variantじゃないと出来ない事ってあるから
そういうときにはVariant使わざるを得ない

一文字変数は
意味がある変数の時にはきちんと名前をつけるけど
たんなるループカウンタとかに長い変数名使うのって
むしろダメだと思うから、
そういうのはiとかjを使うようにしてる
0238デフォルトの名無しさん2015/10/03(土) 14:12:09.72ID:RbSlktKi
極力とか思うとか作る奴の主観で左右されるようなルールはルールの意味が無いわ
0239デフォルトの名無しさん2015/10/03(土) 14:17:39.55ID:vgl68Z+c
>>228
あなたに教えた人の顔が見たい
0240デフォルトの名無しさん2015/10/03(土) 14:31:43.77ID:0Knvo8cN
>>228
自己流だとほとんどやらかしてるわ。
複雑なもの作ってないからだけど。
0241デフォルトの名無しさん2015/10/03(土) 14:44:34.01ID:gOpJ5SBw
>>238
誰に向けての発言か知らないけど
直近で「極力」と「思う」を使ったのは俺だけみたいなんで一応返しとく

確かに、あの文章から「極力」と「思う」を抜けば
ルールの提言としても読めるけれども
俺は自分のやり方とその理由となる考え方を述べただけで
>>228みたいにルールとして言ってるんじゃないよ
0242デフォルトの名無しさん2015/10/03(土) 18:14:44.58ID:I/Jruoq4
FireFoxで現在開いてるタブを識別して、
そのタブで表示されているWebページから、
情報を取得したいのですが、
参考になるような資料を教えて下さい。
0243デフォルトの名無しさん2015/10/03(土) 18:21:30.26ID:QXlvwIIL
Office製品以外と連動したかったら別の言語使え。
それか自分でdllでも作って参照設定しとけ。
0244デフォルトの名無しさん2015/10/03(土) 18:26:13.89ID:qfZy55wa
そもそも君の目の前にある箱はなんだ?
ググればいいんじゃね
0245デフォルトの名無しさん2015/10/03(土) 20:17:03.11ID:y6+evVSu
質問スレ
0246デフォルトの名無しさん2015/10/03(土) 21:09:09.38ID:ZKRFUKiL
>>242
意外と大変みたいだけど、なんでFireFox?IEなら簡単なのに
http://blog.clockahead.com/2014/03/vbafirefox.html
0247デフォルトの名無しさん2015/10/03(土) 22:25:34.56ID:Z+kNACJt
接頭語でオブジェクトを入れる変数には頭にobjとか付ける規則がある現場だと
クラスを使い始めると接頭語がobjの変数だらけになるあれは頂けない
0248デフォルトの名無しさん2015/10/03(土) 22:39:44.64ID:5O2HV1Cv
んなもん、適時自分たちの環境に合わせりゃ良いだけだろ
0249デフォルトの名無しさん2015/10/03(土) 22:53:18.56ID:d7sRTTd7
>>248は多分適宜と言いたかったのですがバカなので許してあげてください
0250デフォルトの名無しさん2015/10/04(日) 00:41:18.06ID:g7SqYJ/X
オブジェクト型なんてめったに使わんからobjXXX変数だらけになんてならん
ただ、型名に対してプレフィックスの規定が網羅できんから、プレフィックス見ても型が分からん変数だらけになるけどw
0251デフォルトの名無しさん2015/10/04(日) 01:49:45.75ID:CaBe2KJ7
それじゃまさにハンガリアンじゃんかよ
禁止禁止
0252デフォルトの名無しさん2015/10/04(日) 02:03:43.01ID:FINVuytw
ジャンガリアンに見えた
0253デフォルトの名無しさん2015/10/04(日) 10:28:25.42ID:g7SqYJ/X
>>251
VB6やVBAの頃は推奨されてたんで
0254デフォルトの名無しさん2015/10/04(日) 11:07:49.29ID:CaBe2KJ7
>>253
>>236
0255デフォルトの名無しさん2015/10/04(日) 18:47:17.10ID:2AM+oKUz
質問失礼します。
このたびwin10にアップグレードしました。
今までexcelのVBAで下記の記述を使いIEを操作していたのですが、win10にかえてからIEを
VBAで呼び出せなくなりました。

CreateObject("InternetExplorer.application")


昨日からやり方をぐぐったりして試行錯誤していますが解決できませんでした。
今まで通りIEを呼び出す方法はあったりしますでしょうか?
0256デフォルトの名無しさん2015/10/04(日) 20:51:09.19ID:VSRvv5G9
>>255
10にIEはないよ。
0257デフォルトの名無しさん2015/10/04(日) 20:53:16.98ID:g7SqYJ/X
詳細は知らんが、たしかWin10にも互換性のためIEは載ってたはずだけど
0258デフォルトの名無しさん2015/10/04(日) 22:10:29.66ID:2AM+oKUz
>>256>>257
お返事ありがとうございます。
win10にIE自体はあるようですが、どうもいろいろやってみましたがVBAから呼び出せずに困り果てています。
とりあえず、あきらめてwin8にもどすことにしました。
ありがとうございました。
0259デフォルトの名無しさん2015/10/04(日) 22:14:44.41ID:KDkHjDHq
>>258
IEは使える状態なのに、VBAでは呼び出せないの?
win10でどうなるか知りたかったので、よかったら教えて欲しい。
0260デフォルトの名無しさん2015/10/04(日) 22:34:18.44ID:2AM+oKUz
>>259
IEはあります。
エクセルもVBAも問題なくうごくのですが、唯一IEをよびだすことができません。
自分は証券会社に自動でログインする際にCreateObject("InternetExplorer.application")
をつかっているのですが、IEをメインブラウザに設定しなおしたり、いろいろやてみましたがだめでした。
あまりプログラムの知識がないので、エラー原因などはわかりません。
0261デフォルトの名無しさん2015/10/04(日) 23:06:02.64ID:g7SqYJ/X
>>260
クリーンインストールしたWin10Proで、VBSからIE起動してNavigate出来るの確認した
ExcelかVBAの問題の可能性もあるけど、それWin8のときはちゃんと動いてたのか?

上がってるIE、32ビットか64ビットか分からんな
Win10ってどこで見分ければ良いんだろ
0262デフォルトの名無しさん2015/10/04(日) 23:19:34.71ID:mZWzOE0Z
>>260
7→8→10とアップデートしてきた環境たけど
自分のはちゃんと起動したな
エラーが出てるならエラーコードくらい貼ったら?
0263デフォルトの名無しさん2015/10/04(日) 23:20:01.96ID:oDZ+VI3p
ログイン先に問題があるじゃね
02642602015/10/05(月) 01:19:20.52ID:PnYDCBrn
>>261
win8.1では動いてます。
>>262
まじですか!自分のはwin8.1→10のノートパソコンですが駄目でした。
いまwin8.1に戻してしまったので、エラーコードかめんどくさがらずに書くべきでした。
すいません。原因不明のエラーと表示されていたきがします。
>>263
ログイン先に行く前の段階でエラーがでます。
Set objIE = CreateObject("InternetExplorer.application") ここでエラーになります。
0265デフォルトの名無しさん2015/10/05(月) 07:42:00.17ID:7DDjvrpa
ほんと、エラーが起きたってだけでそのメッセージが何かを書かない奴の多いこと多いこと
何考えてんだか
0266デフォルトの名無しさん2015/10/05(月) 08:43:26.84ID:1C0sZUC/
>>260
259です。
レスありがとう。

後の書き込みも含めて参考にします。
0267デフォルトの名無しさん2015/10/05(月) 13:56:42.70ID:CB+0+6Bh
>>264
一応聞くけど・・・
IEを手動で起動できるかためしてみました?
0268デフォルトの名無しさん2015/10/05(月) 14:42:30.01ID:PnYDCBrn
>>267
はい、ためしました。
ほかの証券会社のツールもIEからの起動が必要でそれは、ちゃんと動きました。

起動したIEの横にはみなれない黄色いニコちゃんマークがついていてそれをクリックすると、マイクロソフトに意見を送るみたいなものがでてきました。
0269デフォルトの名無しさん2015/10/06(火) 03:08:54.29ID:s30vzD+y
Worksheet_Calculateのイベント発生時に処理Aを行わせています。
Worksheet_Calculateのイベントが1分間発生しなかった時に処理Bを行わせたいのです。
それを実現する方法が浮かびません。どなたか教えて下さい。
Win7(64)+Excel2010です。
0270デフォルトの名無しさん2015/10/06(火) 03:41:02.57ID:RhU5oO7C
>>269
http://www.asahi-net.or.jp/~zn3y-ngi/YNxv214.html#8-1
0271デフォルトの名無しさん2015/10/06(火) 13:27:42.67ID:s30vzD+y
>>270
ありがとうございます。
ただもう少し詳しく教えて下さい。

Worksheet_Calculateの終了直前時刻をDate型変数に格納、
時刻を格納後に(Worksheet_Calculate内で)タイマーをセットするということですか?

1分以内にWorksheet_Calculateが開始された場合、タイマーを解除しなければなりませんが、
そのようなことはできるのでしょうか?
0272デフォルトの名無しさん2015/10/06(火) 14:00:40.81ID:hiQs0jh9
>>271
そういうのはフラグで管理する
1分のタイマーでフラグを立てる
メインはフラグを見て、立ってたら実行する、立ってなかったら実行しない
0273デフォルトの名無しさん2015/10/06(火) 14:11:14.62ID:hXnC6CWE
>>271
丁寧に聞いてるのはいいとしても、なんでも相手に聞いて、
自分で考えなくて済むっていうのは、相手に対して失礼ですよ。
どうすればいいのか、そのヒントをもらってるんだから、
方法に疑問が待ててるのなら、まずそれを試すべきではないですか?
0274デフォルトの名無しさん2015/10/06(火) 14:53:30.20ID:8pBv5L1n
>>271
> 1分以内にWorksheet_Calculateが開始された場合、タイマーを解除しなければなりませんが、
> そのようなことはできるのでしょうか?
できる。
できるが、解除には起動したときの情報が必要。

Private Sub Worksheet_Calculate()
  'タイマー起動済みなら解除する
  If Len(executeAt) > 0 Then
    Application.OnTime executeAt, "foo", , False
  End If

  'なにか処理する

  executeAt = Now() + TimeValue("00:00:05")
  Application.OnTime executeAt, "foo"
End Sub

'module1.bas
Public executeAt As String

Public Sub foo()
  executeAt = ""

  'なにか処理する
End Sub
0275デフォルトの名無しさん2015/10/06(火) 16:53:57.77ID:s30vzD+y
>>272
最後にWorksheet_Calculateを実行した時刻を記憶し
そこから1分以内にWorksheet_Calculateが実行されたフラグ=Falseにして、
フラグ=falseならプロシージャを実行しないということですか。
なるほどありがとうございました。

>>273
今エクセルできる環境でないのと、理解力が足りてないので好意に甘えてしまってます。
申し訳ありません。知恵をつけて頑張ります。

>>274
解除できるんですね。
あまり見かけない情報なのでとても参考になります。
ありがとうございました。
0276デフォルトの名無しさん2015/10/06(火) 17:22:28.83ID:8pBv5L1n
>>275
> 解除できるんですね。
> あまり見かけない情報なのでとても参考になります。
俺も今回ググって知ったからね。
「Application.OnTime 解除」でググったら、ここで聞くまでもなく解決したかもね。
0277デフォルトの名無しさん2015/10/10(土) 03:55:34.16ID:uc7CQwkx
昨日からVBAの学習を始めた者です。

<質問内容>
リストボックスにsheet2のA1:A13に入力されている内容を一覧表示したいのですが、何故かsheet1のA1:A13の内容が表示されてしまいます。
どの様な原因が考えられるでしょうか。お手数ですがご教授願いますm(__)m
(シートは「sheet1」、「sheet2」、「sheet3」があります)

<環境>
Windows7 home premium(64bit)+Excel2007

<作成手順>
1.「挿入>ユーザフォーム」からユーザーフォームを作成
2.「ツールボックス>リストボックス」からリストボックスを作成
3.作成したユーザーフォームを選択した状態でコードを表示し、以下のコードを入力

Option Explicit

Private Sub UserForm_Initialize()
Dim objsheet As Worksheet
Set objsheet = ThisWorkbook.Worksheets(3)

ListBox1.RowSource = objsheet.Range("a1:a13").Address
ListBox1.MultiSelect = fmMultiSelectExtended

End Sub

4.上記コードを標準モジュール(Module1)から以下の様に呼び出し実行
Sub Test()
ユーザーフォーム.Show
End Sub
02782772015/10/10(土) 04:07:02.62ID:uc7CQwkx
申し訳御座いません。作成手順の内容に一箇所誤記がございました。

誤: Set objsheet = ThisWorkbook.Worksheets(3)
正: Set objsheet = ThisWorkbook.Worksheets(2)

正しくは上記の通りです。


Worksheetsをインデックス指定、シート名指定とそれぞれ数パターン試してみたのですが
("sheet2")、("sheet3")や(2)、(3)の場合でも、sheet1のA1:A13の内容が表示されてしまいます。


以上
0279デフォルトの名無しさん2015/10/10(土) 05:55:55.11ID:C+B5gV9T
RowSource = "Sheet2!A1:A13"

俺は、
.ListBox1.AddItem.Cells(i,0) = Objsheet.Cells(i,1)
を薦めるけど
0280デフォルトの名無しさん2015/10/10(土) 09:13:52.25ID:PLSIx7MG
>>278
objsheet.Range("a1:a13").Address(1,1,1,1)

それか

Dim L(12) As String
Dim i As Long
Dim c As Range

With Worksheets("Sheet2")
Set c = Range(.Cells(1, 1), .Cells(1, 13))
End With

For Each x In c
ReDim Preserve L(i)
L(i) = x
i = i + 1
Next

ListBox1.List = L
0281デフォルトの名無しさん2015/10/10(土) 09:45:53.50ID:LK1jtOCB
>>280
最初にLを L(12) と宣言してるのに
わざわざループの中で毎回Redimする意味が分からない
あと x だけ宣言してない意味も分からない
0282デフォルトの名無しさん2015/10/10(土) 09:51:36.43ID:PLSIx7MG
>>281
ああ、ごめん。それはいつものクセだ。これだとエラー出るな。
仕事でやる時は要素数固定な方が稀なんで忘れてた。

ちなみにVariant型は宣言しない方が処理が早いんだよ。
0283デフォルトの名無しさん2015/10/10(土) 10:13:17.20ID:C9mCx++X
Address(1,1,1,1)なんて使い方初めて見た
確かに早いかもしれないけど、変数宣言してないほうが違和感凄い
277のコードはOption Explicit付いてるからそのままだと動かないね
0284デフォルトの名無しさん2015/10/10(土) 10:18:44.34ID:LK1jtOCB
>>282
俺も静的な配列の宣言ってやらないけど、
対象の要素数が不定であっても、
ループ前に確定してるならループに入る前にRedimしとくな
ループ内でRedimするのは
その時々で配列に入れるかどうかを判定してるときだけだね

あと、大して変わるとも思わんけど速くしたいなら
x もRange型で宣言するほうがいいんじゃないの?
0285デフォルトの名無しさん2015/10/10(土) 10:29:02.02ID:PLSIx7MG
>>284
Range型からRange型への代入よりRange型からVariant型への代入の方が早い。
たぶんRange→Variantだと丸ごとのmemcpyだけどRange→Rangeは要素毎にmemcpyしてるんだと思う。




っていうか他人のコードにいちゃもんつけてる暇あったら自分で書いて欲しい。
別に俺が皆様の為にコード書くスレじゃ無いし、いちいち指摘される意味が分からん。
0286デフォルトの名無しさん2015/10/10(土) 10:36:42.22ID:LK1jtOCB
>>285
>Range型からRange型への代入よりRange型からVariant型への代入の方が早い

へー、そうなんだ
Variantは遅いって固定観念があったんで試したこと無いから知らんかった
勉強になったよ、有難う
ちなみに、「早い」じゃなくて「速い」だよね

あと、あなた個人にいちゃもんつけてる積もりも無いんだよね
単純にコードの動作やなんかに疑問があっただけだから
人格攻撃とかではないことは分かってほしい
0287デフォルトの名無しさん2015/10/10(土) 10:47:25.91ID:bWA1pvcm
>>286
多分、人格どうのではなくて
「ウダウダ抜かすならテメーが書けよ糞が」
って言いたかったんじゃないかな
0288デフォルトの名無しさん2015/10/10(土) 11:07:48.09ID:LK1jtOCB
>>287
だからさ、そういうのが理解できないんだよ
コード自体大枠で問題ないから部分的に気になるところを指摘しただけで
お前が書けっていわれてもそんなに違ったもんにはならないよ

仮に書いてもこんな感じ
Dim L As String
Dim i As Long
Dim c As Range
Dim x As Range

With Worksheets("Sheet2")
 Set c = Range(.Cells(1, 1), .Cells(1, 13))
End With
ReDim L(12)
i = 0
For Each x In c
 L(i) = x
 i = i + 1
Next x

ListBox1.List = L

指摘以外で変えたのは i に初期値を入れてるのと、Next に添え字をつけたことぐらいかな
(あくまで個人的好みの問題なんであえて指摘では書かなかった)
あと、x をRangeで宣言してるのはあの時点ではVariantよりも速いと思っていたから
あるいは要素数決まってるんだしFor Next使うってのも有りかも知んない
0289デフォルトの名無しさん2015/10/10(土) 11:10:24.79ID:LK1jtOCB
>>288
あ、
Dim L() As String
だった
Variantならカッコ不要だけど、ほかはカッコつけて宣言しとかないと駄目だね
0290デフォルトの名無しさん2015/10/10(土) 11:40:09.15ID:PLSIx7MG
>>288
・知ったかぶるだけでコード書けないヤツが排除できる。
・余計な事を喋らなくて済むので好みの違いで水掛け論にならない。
・重複しても全部出した方が初心者でも比較しやすい。
・他人に改訂を強制出来る権利なんてないんだから改訂が必要だと思うなら自分ですべき。

理由としてはこんなもんじゃないかな。他人のコードに口を出すなら全部自分の流儀で1から書けよ、と。


>>277
Listbox1.List = Worksheets("Sheet2").Range("A1:A13").Value

という方法があった事を忘れていた。
0291デフォルトの名無しさん2015/10/10(土) 12:39:23.58ID:hKmSBUx+
頼まれてもいないのに人のコードをレビューして指摘を上げるのはトラブルの元だぜ
俺もリアルで人を怒らせてしまった経験あるぜ
やっぱり上司やレビュー会等、己がレビューを期待されている立場の時にやるべきだぜ
人のコードを見ると脊椎反射でレビューしてしまう癖のある人は気をつけようぜ


ところで、>>277の現象説明については、
Addressプロパティがシート名を含まないセル座標を返してくる仕様のため
その時点のActiveシートのセルが参照されてしまうってことでいいのかな

んー、過去にAddressプロパティを使って組んだシステムがあった気がする
恐いから週明けに確認しとこう
横からだけど参考になった
0292デフォルトの名無しさん2015/10/10(土) 13:27:44.59ID:LK1jtOCB
>>291
ここはそういうことするスレだと思ってる
ただ、指摘内容は個人的信条に掛かる部分は避けるけれど

変数の型宣言とか、ループ内で不要な処理は出来るだけ外に出すとかは
割合普遍的な内容だよね?

仮に俺がそれやってて誰かに言われても全然気にならないと言うか、
むしろ感謝するんで、まるで悪い事とは思ってない
多分、怒る人ってのは自分自身に対するプライドが無い人なんだと思う

もちろん、こんなのネットだから気軽に言えるんであって
リアルでそんな人に出くわしたら
係わり合いになるのを極力避けるだろうけどさ
0293デフォルトの名無しさん2015/10/10(土) 18:34:58.23ID:BWs8hoM+
>Variantは遅いって固定観念があったんで試したこと無いから知らんかった
VBA自体が遅いからVariantでも相対的に速く見えるんだよね
rangeオブジェクト直接使うより一旦variantに代入して配列として処理した方が速いし
ただフィルタとかの組み込みAPIはめちゃ速いから下手にforで回したりせず積極的に使って行きたい
0294デフォルトの名無しさん2015/10/10(土) 18:48:19.64ID:e9OvRw0M
>>292
ここは質問スレなんだけど
そういう基本的な事すら勘違いしてる人程、頼まれもしないのに他人に指摘をしたがる。
しかも勘違いしやすい人だから指摘の内容も間違っていたり偏っていたりする。
やはり、頼まれもしないのに自分勝手な指摘などするべきではないし
された方も、それを鵜呑みにすべきではない。
0295デフォルトの名無しさん2015/10/10(土) 19:55:36.82ID:LK1jtOCB
>>294

だからさ、別に>>280に書かれた「コード」について思うところを述べたのであって
>>280さん「個人」に対して指摘したわけじゃないのよ
言ってみれば俺のレスだって>>277さんやほかの人たち宛といってもいい
それを勘違いされちゃうとそれこそ基本的なこのスレの趣旨から外れちゃうと思うんだよね

指摘の内容が間違っているかどうかはこの際関係ないというか、
たとえケアレスミスであったにせよ>>280のコードも間違いであったわけで
そんなこと言い出したら誰もここに書き込めないよ
読んで間違ってると思ったら誰でも自由に書き込めば良いだけじゃん

所詮は2chの書き込みなわけで、それをただ鵜呑みにするなんて真似は
誰が書いたもんだろうとすべきではないのも同じことだしね
0296デフォルトの名無しさん2015/10/10(土) 20:15:44.13ID:PLSIx7MG
いや、だからコードに対して何か指摘したい事があるなら、
指摘する代わりに訂正したコードをレスすれば問題ないだろ。

コードは鵜呑みにしても正しいかどうかは結果が語ってくれるし。
0297デフォルトの名無しさん2015/10/10(土) 20:21:28.17ID:S77+iWrc
goto 命令で他のブックに記述されたプロシージャの GoTo 定義へ飛ばす事は出来ないのでしょうか?

-book1-
GoTo endbook2

-book2-
endbook2:
0298デフォルトの名無しさん2015/10/10(土) 20:27:19.33ID:PLSIx7MG
>>297
プロシージャ間でのGotoは出来ないはず。
0299デフォルトの名無しさん2015/10/10(土) 20:28:45.42ID:e9OvRw0M
>>295
> そんなこと言い出したら誰もここに書き込めないよ
> 読んで間違ってると思ったら誰でも自由に書き込めば良いだけじゃん
良くはないぞ。誰でも自由に書込めるのはその通りだが
スレにはスレの主旨というものがある。

特にここは質問スレだから、質問者は自分に対するレスを鵜呑みにしやすし
常駐してる訳ではないから、たとえその指摘が間違いだった事が分かっても
質問者はその経緯を見ていない事が多い。

しかも、質問の本筋と関係ない指摘によって質問者を余計に混乱させたり
スレが荒れる原因にもなる。今もそういう状態だと言っていいだろう。

結論としてはやはり、質問と関係ない指摘はすべきではない。
0300デフォルトの名無しさん2015/10/10(土) 21:29:45.80ID:LK1jtOCB
>>296
そこはまぁ、コード書くほどのことかどうかって話だよね
実際これまでもコード書かずにグダグダ言うだけの人はいたから
あなたの主張も分からんではないし、
だからこそおれも一応>>288にコード書いたんだけど
あれって結局書くほどのことも無いもんだったでしょ?
あの程度の違いだったら別に書く必要ないと思うわけですよ

それでもどうしてもコードだけしか認めないってのは
ちょっと狭量すぎるというか
絶対にコードは書かない人ってたちと逆の意味でやっぱり問題あると思うな

>>299
質問スレの主旨って質問者に対して直接安価つけた回答以外は
回答として認めないわけ?

俺は質問者に対してだけじゃなく、
それを傍から見てるほかの人たちに対するものでも別に問題ないし
そちらこそがむしろ本筋だとすら思ってる

実際、俺だってこのスレで自分では質問してなくても
いろいろ参考になる意見を読ませてもらって感謝してるもの
03012772015/10/10(土) 21:43:42.05ID:uc7CQwkx
なるほど!!

Addressプロパティはシート名を含まないセル座標を返す仕様なんですね。
Range.Address プロパティのリファレンスを見ただけではそこまで気付けませんでした。


まずは、以下の方法で試してみようと思いますが処理速度を考慮した
様々な記述方法をご紹介頂いたので今後の参考にしたいと思います。
(速いに越したこと無いですからね)

・Listbox1.List = Worksheets("Sheet2").Range("A1:A13").Value
・.ListBox1.AddItem.Cells(i,0) = Objsheet.Cells(i,1)
・objsheet.Range("a1:a13").Address(1,1,1,1)
・RowSource = "Sheet2!A1:A13"


ご回答下さった皆さん、本当に有難うございましたm(__)m
0302デフォルトの名無しさん2015/10/10(土) 22:01:39.36ID:e9OvRw0M
>>300
なるほど、お前はこのスレの本筋は
質問自体ではなく、常駐してる人同士の情報交換にある
と思っている訳だな。

ところで、お前が問題があると思っている
絶対にコードは書かないって人たち
も同じように、安易にコードを出して結論だけを示すのではなく
質問者に理屈を理解してもらう事がこのスレの本筋だと思っているのだろうな。

お前と同じだ。
どちらもそれなりに自分の信条はあるのだろうが
決してそれが唯一解ではない。

ただし
絶対にコードを出す事を厭う事
質問と関係ない指摘をする事
どちらも同じように、スレが荒れる原因になってる事も理解してくれ。
0303デフォルトの名無しさん2015/10/10(土) 22:05:31.62ID:LK1jtOCB
>>301
悪気は無いんですが結果的にスレを読みにくくしちゃってごめんなさいね

ただ、処理速度もさることながら
コード内でリスト内容に修正を加える必要が出た場合など、
後々の使い勝手も考慮するのがより望ましいかもしれません

その点で言うと、RowSourceでは後からの変更がやりにくいので
ListやAddItemを用いるほうが柔軟に対応しやすいようですよ

というようなことがこの辺に書いてありました
http://officetanaka.net/excel/vba/tips/tips139.htm

ご参考まで
0304デフォルトの名無しさん2015/10/10(土) 22:10:56.42ID:LK1jtOCB
>>302
>決してそれが唯一解ではない。

そう、だから俺はコードを書かない人も排斥しないし、
スレチだ何だといって質問者を追い返す人たちに対してですら
別スレに行けばと提案はするけれど拒絶はしない

実のところ俺はこのスレの>>1なんだけど
前スレの>>1にあった束縛云々という文言を抜いたのは
そういう思いも込めてのことなんだよね
0305デフォルトの名無しさん2015/10/10(土) 22:40:02.38ID:PLSIx7MG
>>300
コピペして動くコードが貼られていれば便利だろ。
だからどんだけ些細な修正であれコードは貼ってくれ。

その上で問題の指摘なりなんなりごちゃごちゃ言うのは俺は構わない。
0306デフォルトの名無しさん2015/10/10(土) 22:47:28.14ID:LK1jtOCB
>>305

いや、その辺のさじ加減は書き手側に任せようよ

>>288も質問者やその他の人達に対して必要だとは思わないけど
>>287氏(に代表される「コード書かない人を許さない人達」)に対しては
必要な事だと思ったから書いたまでのこと
これからも必要があると判断すれば書くしそうじゃなきゃ書かない
0307デフォルトの名無しさん2015/10/10(土) 23:22:07.02ID:PLSIx7MG
次のスレには「指摘する時は同等の機能を持ったコードを必ず添えろ」という趣旨のテンプレが欲しいなぁ。
0308デフォルトの名無しさん2015/10/10(土) 23:34:41.84ID:LK1jtOCB
>>307
だからさぁ、そういうのって結局別スレの人達と同類じゃん
自分と異なる考え方だからといって
頭ごなしに拒絶するのは極力避けるべきだと思うよ
0309デフォルトの名無しさん2015/10/11(日) 06:49:55.78ID:v4cWO+Xb
ブックAのVBAでブックBを開いてあるものとする
その後、操作者がブックBを閉じたことを検出して
ブックAの特定のプロシージャを実行したいのだが、どうすればよいか
他ブックが閉じられたというイベントは存在しないようなので困っている
0310デフォルトの名無しさん2015/10/11(日) 07:01:13.52ID:/glPH0Mb
ブックBのBeforeCloseでブックAのプロシージャを動かすか、
ブックBをユーザーに操作させないかのどっちかくらいしかないんじゃないか。
0311デフォルトの名無しさん2015/10/11(日) 07:17:12.35ID:dc8fNJEd
ブックAの方でタイマーを仕掛けて、1秒間隔でブックBの存在を確認するとか
0312デフォルトの名無しさん2015/10/11(日) 19:27:33.17ID:fLjk4aVM
>>309
やりたい事が
他ブックの BeforeCloseイベント処理 であるなら可能

一応サンプル
★AppSetプロシージャを一度実行してやる必要がある★

[ThisWorkbookモジュール]へ
Option Explicit

Private WithEvents APP As Application

Private Sub APP_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)
  MsgBox Wb.Name & "がCLOSE"
End Sub

Sub AppSet()
  Set APP = Application
End Sub
0313デフォルトの名無しさん2015/10/11(日) 20:49:24.97ID:K+nxBSBI
>>309,312
Workbooks.Openは開いたブックへの参照を返すから、WithEvents付き変数で受ければそれでイベントハンドリングできる


Dim WithEvents b As Workbook

Sub 開く処理()
Set b = Workbooks.Open("c:\book1.xlsx")
End Sub

Private Sub b_BeforeClose(Cancel As Boolean)
If MsgBox("close?", vbYesNo) <> vbYes Then
Cancel = True
End If
End Sub
03143092015/10/11(日) 20:56:35.89ID:v4cWO+Xb
みなさんありがと
手動で保存されたブックBのデータを読み込んで
自動処理を走らせるので、BeforeCloseイベントではダメなんだ
>>311のやり方を検討してみる
0315デフォルトの名無しさん2015/10/12(月) 22:27:56.55ID:Ur21F95J
>>309
ブックBを閉じたことを検出するボタンを作ったほうがシンプルだと
思うのだが
0316デフォルトの名無しさん2015/10/13(火) 03:20:04.77ID:BftcgOPm
だったらブックBを読み込みボタンで良い気がするんだが
0317デフォルトの名無しさん2015/10/13(火) 10:16:15.75ID:v0mnZW8d
>>316
両方つけときゃいいでないの>w
0318デフォルトの名無しさん2015/10/13(火) 10:27:59.85ID:jBFoqp2r
>>302
> 質問と関係ない指摘をする事
> どちらも同じように、スレが荒れる原因になってる事も理解してくれ。

指摘を受けた人が暴れなければすむ話なんだけどね。
一方、指摘そのものは、受けた人のみならず第三者にも利益になることが多々ある。
なので、今後もみんなどんどん指摘して欲しい。
0319デフォルトの名無しさん2015/10/13(火) 10:29:37.14ID:jBFoqp2r
>>305
> コピペして動くコードが貼られていれば便利だろ。
> だからどんだけ些細な修正であれコードは貼ってくれ。

受け取る側がそれを強制しちゃうの?
問題解決になるキモがわかる断片的なコードで十分な場合も多いでしょ。
0320デフォルトの名無しさん2015/10/13(火) 14:59:16.74ID:v0mnZW8d
>>318
なるほど、318はどんどん指摘してほしいそうなので
みんなよろしくな!
0321デフォルトの名無しさん2015/10/13(火) 15:51:17.66ID:jBFoqp2r
自分のコードに何か言われるのが嫌なら、コード上げなきゃいいよね
0322デフォルトの名無しさん2015/10/13(火) 17:22:52.96ID:vdpuTcbV
気に入らないならこのスレ見なきゃいい
自分の思い通りにするのは無理と早く悟ってくれないかなあ
0323デフォルトの名無しさん2015/10/13(火) 20:10:10.75ID:6nIGFdyo
事の発端が「自分のコードのミスを指摘された事に文句を言った」という構図では無いのに誰と戦ってるんだ
0324デフォルトの名無しさん2015/10/14(水) 10:09:25.38ID:H3NHgayM
>>323
自分のコード: >>280
のミスを指摘された: >>281
事に文句を言った(人のコードにいちゃもんつけるな): >>285=>>280

というのが事の発端じゃないの?
0325デフォルトの名無しさん2015/10/14(水) 15:50:25.41ID:AS+yqKLJ
ブックのサイズが増えるとマクロに時間がかかってしまうことってありますか?
0326デフォルトの名無しさん2015/10/14(水) 16:51:03.01ID:btG23wVT
>>325
絶対条件ではないが、可能性はゼロではない
とくにシートにアクセスして書き換えや再計算が発生すると規模に応じた時間が掛かる場合
0327デフォルトの名無しさん2015/10/14(水) 18:26:49.84ID:AS+yqKLJ
そうなんですか
ただセルにデータが増えただけではマクロに影響はないですか?
0328デフォルトの名無しさん2015/10/14(水) 18:31:11.58ID:H3NHgayM
>>327
多分影響ないけど、心配なら実測したら?
0329デフォルトの名無しさん2015/10/14(水) 20:32:26.17ID:KtGF3f0I
マクロとデータが具体的にどういうものかが分かってないと「あり得る」以外言えないだろ。

めちゃくちゃ複雑な関数が1000*1000セルにびっしり詰まっててネックになってるかもしれないし、
マクロがシート上の情報によって処理時間を左右される類いのものかもしれないし。
0330デフォルトの名無しさん2015/10/14(水) 20:36:33.73ID:AS+yqKLJ
似たようなマクロ2つの処理時間がかなり違ったのでブックのサイズが増えたことが原因なのかと
思ったのですが違うみたいですね。どうもありがとうございました。
0331デフォルトの名無しさん2015/10/14(水) 20:46:42.90ID:KAxvZKuP
>>329
そりゃ処理するデータ量増えたら遅くなるのはあたりまえだろ w
普通に考えてマクロの処理は変わらない前提の質問だと思うぞ
0332デフォルトの名無しさん2015/10/15(木) 12:58:50.64ID:BCBs43Sq
>>325
>>331
Excelの作りを知っているわけではないから
マクロに影響がどう出るかはわからないよ。
データの量によってどう影響するかは、
どれくらいのデータ量を想定しているか325が考えて試すしかないよ。
0333デフォルトの名無しさん2015/10/15(木) 13:45:15.66ID:mYfmOhz6
>>332
お前はもうこのスレでレスするな
迷惑
0334デフォルトの名無しさん2015/10/15(木) 14:14:38.75ID:vaiTvozu
>>333
>>332はわりとまともな事言ってると思うけど?
そうやって貴方のように個人的主観で仕切ろうとする人のほうが
どっちかってーと迷惑に感じる
0335デフォルトの名無しさん2015/10/15(木) 14:28:16.56ID:aU04CjvL
質問させてくださいm(_ _)m

A列のセルに貼られた画像(1セルに1画像)の名前を
B列に書き出すには、どのようにするのが宜しいでしょうか?

かなりの行があります・・・
0336デフォルトの名無しさん2015/10/15(木) 15:00:20.15ID:VWNdFEFl
君の説明だけでは不可能
0337デフォルトの名無しさん2015/10/15(木) 15:01:14.19ID:mYfmOhz6
>>334
>>332
> Excelの作りを知っているわけではないから
> マクロに影響がどう出るかはわからないよ。
お前が知らない、わからないなんて知ったこっちゃない
いちいち報告するな

> データの量によってどう影響するかは、
> どれくらいのデータ量を想定しているか325が考えて試すしかないよ。
何人も同じ事言ってる
スレ読んでからレスしろ

って説明しなきゃわからんのか
0338デフォルトの名無しさん2015/10/15(木) 16:23:42.66ID:vaiTvozu
>>337
説明が間違ってるので分かり様が無い

まず
> Excelの作りを知っているわけではないから
> マクロに影響がどう出るかはわからないよ。

に関しては>>332個人が分る分らないではなく
本人 (または現物を見ている人間)以外には分らない
と言う一般的な意味だろうから
お前が云々という批判自体が的外れ

次に
>何人も同じ事言ってる
>スレ読んでからレスしろ
については
もしも複数人が同じ事を言ってはいけないのならば
二人目以降は全員同様の批判を受けねばならない
ちなみに、>>325自身に測定せよとアドバイスしてるのは
俺のみる限り>>328しか居ないように見える
つまり、何人も は言っていない
そしてその内容も若干違っているので
>>332が批判されるほどの理由とは思えない


そのうえで、それらの問題点を抜きにしたところで
君自身が他者の書き込みについて排除できる根拠にはなりえない
0339デフォルトの名無しさん2015/10/15(木) 16:35:33.53ID:BCBs43Sq
>>333
すまないねー迷惑だったかw
今後も自由に書きこみさせてもらうよー
0340デフォルトの名無しさん2015/10/15(木) 16:37:13.51ID:mYfmOhz6
>>338
> > Excelの作りを知っているわけではないから
> > マクロに影響がどう出るかはわからないよ。
>
> に関しては>>332個人が分る分らないではなく
> 本人 (または現物を見ている人間)以外には分らない
> と言う一般的な意味だろうから
> お前が云々という批判自体が的外れ
は?何言ってんの?
Excelの作りを知っている奴もいるかもしれないし、マクロに影響が出るかわかってる奴もいるかもしれないだろ
なんで「一般論」になるのか理解不能


> つまり、何人も は言っていない
何人もが言ってるのは

> データの量によってどう影響するかは
の方だ。つまりそれもわからんって言ってるに過ぎない

> 君自身が他者の書き込みについて排除できる根拠にはなりえない
自己矛盾もはなはだしいね
だったら俺に絡むな
0341デフォルトの名無しさん2015/10/15(木) 16:48:19.96ID:BCBs43Sq
まぁ敢えて言うならば、
331は質問の趣旨に答え切れてない気もするけどね。
聞かれているのは、
ブックの容量とマクロの実行速度に関する相関関係だし・・・。
0342デフォルトの名無しさん2015/10/15(木) 16:52:32.40ID:mYfmOhz6
>>341
まあ質問そのものが曖昧だったしな

俺は「同じマクロで同じ計算量の場合に、それ以外の要素でブックが肥大化したときに
そのマクロの実行時間に影響を及ぼすのか」という疑問なんじゃないかと思ったが

まあどっちにしても、気になるなら実測しろで終わりだな
0343デフォルトの名無しさん2015/10/15(木) 17:23:30.43ID:vaiTvozu
>>340
> 君自身が他者の書き込みについて排除できる根拠にはなりえない
自己矛盾もはなはだしいね
だったら俺に絡むな

俺は排除していないよ
自分にとって参考にならない意見は書き込むなと主張する人と
その人に批判された人ならば
どちらかと言えば前者(つまり貴方)の方が迷惑だ
と評しただけで
だから書き込むなと言った覚えは無い
0344デフォルトの名無しさん2015/10/15(木) 17:29:09.66ID:mYfmOhz6
>>343
「書き込むな」とは書いてないから俺を排除しようとしてるわけではないって言いたいのか

おめでてーな
0345デフォルトの名無しさん2015/10/15(木) 17:43:45.52ID:vaiTvozu
>>344
おめでてーかどうかはともかく
書いてない以上、そんなことを言われてもどうにもなんない

勝手に深読みしといて相手のせいにするってそれこそおめでてー人だ
0346デフォルトの名無しさん2015/10/15(木) 17:48:12.67ID:mYfmOhz6
>>345
お前、現実世界で誰かにナチュラルにハラスメントとかしてるんじゃねーの?
気をつけろよ
0347デフォルトの名無しさん2015/10/15(木) 17:51:49.74ID:vaiTvozu
>>346
自己矛盾してますねw
0348デフォルトの名無しさん2015/10/15(木) 17:53:36.22ID:BCBs43Sq
>>335
Excelのバージョンとかも書かないと無理よ。
俺の持っている2013では画像の名前は取れなかった。

以前ファイルパス取る方法とか質問あったけど、取れるって回答は無かったよ
古いVerでは代替テキストにはいっているとか書かれていたので参考にどうぞ。
0349デフォルトの名無しさん2015/10/15(木) 17:54:04.36ID:mYfmOhz6
俺は明確な意思を持ってゴミレスをdisった
何の自己矛盾もないが

一方、
俺はお前が排除しようとしていると感じている
お前は排除してないと言う

これ、ハラスメントの構図
0350デフォルトの名無しさん2015/10/15(木) 17:55:53.84ID:mYfmOhz6
あー、ナチュラルにの意味がわからんかったのか?

意識せずに、だ
0351デフォルトの名無しさん2015/10/15(木) 17:58:56.03ID:BCBs43Sq
>>349
さらっとひどいこと書きますねw
明確な意志をもってゴミレスをdisりましたかw
悪意あるんですね!
0352デフォルトの名無しさん2015/10/15(木) 18:01:58.99ID:vaiTvozu
>>349
明確な意思の下であれば
御自身のハラスメント行為自体にはなんら痛痒を感じないのであれば
お気の毒ですが何も言いようが無いですね
おそらく価値観が根底から違っていようと思われます
0353デフォルトの名無しさん2015/10/15(木) 18:09:46.58ID:mYfmOhz6
別にお前の価値観なんぞ誰も気にしてないわ

自分の価値観にあわない奴は悪ですか
おめでてーな
0354デフォルトの名無しさん2015/10/15(木) 18:17:08.26ID:vaiTvozu
>>353
>明確な意思の下であれば自身のハラスメント行為に痛痒を感じない

問題はこの部分ですよ?
これが私個人の独自な価値観かどうか、貴方は判断できませんか?
まぁ、出来ないからこんな事やってるんでしょうけれど
貴方個人がどう思うかよりは我々のやり取りが第三者から見てどう思われるかを
客観的にご覧になることをオススメします
もちろん、その点では私の方も
かなりうざがられているであろう事は確かですけどw
0355デフォルトの名無しさん2015/10/15(木) 18:26:10.01ID:mYfmOhz6
要するに個人攻撃したくて、なおかつ自分を正義側に起きたいってことか

>>333のレスすることになんの痛痒も感じてないよ?
それが何か?
0356デフォルトの名無しさん2015/10/15(木) 18:29:10.14ID:vaiTvozu
>>335

>それが何か?

ですから、それなら何も言いようが無いですよ

客観視してその程度なら本当にお気の毒ですけれど
私がどう思おうが、あるいは他のスレ住人がどう感じようが
貴方の気にする事ではないので気にしないでください
0357デフォルトの名無しさん2015/10/15(木) 18:31:13.32ID:mYfmOhz6
2chでそんなこと言われてもねー

あってないんじゃないの?
0358デフォルトの名無しさん2015/10/15(木) 18:32:50.41ID:vaiTvozu
どうしても気になっちゃうみたいですね
2chあってないんじゃないですか?
0359デフォルトの名無しさん2015/10/15(木) 18:41:27.86ID:BCBs43Sq
>>357
>Excelの作りを知っている奴もいるかもしれないし、マクロに影響が出るかわかってる奴もいるかもしれないだろ
でもさー、これって「無い」よね?
0360デフォルトの名無しさん2015/10/15(木) 19:54:11.73ID:9cYvWnzz
ユーザーフォーム内のリストボックスで選択した値がテキストボックスに表示されるように連動したいのですが、どのようにしたらよいでしょうか。
いろいろな行を選択するたびにそのテキストボックス内の値も自動で変わるようにしたいです。
0361デフォルトの名無しさん2015/10/15(木) 20:03:18.88ID:tI6xpC1E
>>360
Private Sub ListBox1_Click()
With Me.ListBox1
If .ListIndex = -1 Then Exit Sub
Me.TextBox1.Value = .Value
End With
End Sub
0362デフォルトの名無しさん2015/10/15(木) 20:04:30.41ID:BCBs43Sq
Private Sub UserForm_Initialize()
Me.ListBox1.AddItem "あ"
Me.ListBox1.AddItem "い"
Me.ListBox1.AddItem "う"
Me.ListBox1.Selected(0) = True
End Sub
Private Sub ListBox1_Change()
Me.TextBox1.Value = Me.ListBox1.Value
End Sub

あげる!
0363デフォルトの名無しさん2015/10/15(木) 20:13:59.47ID:HYYwmw2u
>>362
こら、ちゃんとageろ
0364デフォルトの名無しさん2015/10/15(木) 20:15:32.82ID:nQudxDlz
>>361
ダブルクリックの方が誤作動が少なさそう。
0365デフォルトの名無しさん2015/10/15(木) 20:16:49.73ID:9cYvWnzz
すみません、もしテキストボックスが3つあり、
リストボックス内で選択した行の1列目がテキストボックス1に、2列目がテキストボックス2へと連動する方法もよかったら教えてください、、。
0366デフォルトの名無しさん2015/10/15(木) 20:21:53.21ID:tI6xpC1E
>>365
Private Sub ListBox1_Click()
With Me.ListBox1
If .ListIndex = -1 Then Exit Sub

Me.TextBox1.Value = .List(.ListIndex, 0)
Me.TextBox2.Value = .List(.ListIndex, 1)
Me.TextBox3.Value = .List(.ListIndex, 2)
End With
End Sub
0367デフォルトの名無しさん2015/10/15(木) 20:27:39.66ID:9cYvWnzz
>>366
ありがとうございます><
あとひとつお聞きしたいのですが、
テキストボックスに値を入れると、それに連動したリストボックス内の値も変わるようにすることってできますか?
0368デフォルトの名無しさん2015/10/15(木) 20:27:42.79ID:9cYvWnzz
>>366
ありがとうございます><
あとひとつお聞きしたいのですが、
テキストボックスに値を入れると、それに連動したリストボックス内の値も変わるようにすることってできますか?
0369デフォルトの名無しさん2015/10/15(木) 20:28:19.35ID:tI6xpC1E
>>367
Private Sub TextBox1_Change()
With Me.ListBox1
If .ListIndex = -1 Then Exit Sub
.List(.ListIndex, 0) = Me.TextBox1.Value
End With
End Sub

Private Sub TextBox2_Change()
With Me.ListBox1
If .ListIndex = -1 Then Exit Sub
.List(.ListIndex, 1) = Me.TextBox2.Value
End With
End Sub

Private Sub TextBox3_Change()
With Me.ListBox1
If .ListIndex = -1 Then Exit Sub
.List(.ListIndex, 2) = Me.TextBox3.Value
End With
End Sub
0370デフォルトの名無しさん2015/10/15(木) 20:37:10.77ID:9cYvWnzz
なにもかもうまくいきました!!!ありがとうございます!!!!!
0371デフォルトの名無しさん2015/10/15(木) 20:53:07.25ID:9cYvWnzz
あ、先ほどの者ですが、何度もすみません。
連動したうえで、
ボタンを押すとリストボックスに行を増やして
かつテキストボックスの内容をリストボックス内に書き込むという動作もしたいのですが
どのようにすればよいでしょうか、、
0372デフォルトの名無しさん2015/10/15(木) 20:56:33.56ID:5t35flZv
無間地獄
0373デフォルトの名無しさん2015/10/15(木) 21:06:30.47ID:BCBs43Sq
>>370
本当に?
0374デフォルトの名無しさん2015/10/15(木) 21:34:47.96ID:wL4jkucx
最初から全部書けや。
面倒くせえ。
0375デフォルトの名無しさん2015/10/15(木) 22:04:16.06ID:pdOqA9hY
後出しの快感ってやつでそ。どんどん要求を出していってそれに応えろやって w
0376デフォルトの名無しさん2015/10/15(木) 22:06:17.26ID:AgRxHL3T
つか自分で 少しは考えろと 言いたい
考える事やめたら 若くしてボケるぞっと
0377デフォルトの名無しさん2015/10/15(木) 22:45:27.08ID:aGdx/ouK
>>359
> でもさー、これって「無い」よね?

それ悪魔の証明だから
0378デフォルトの名無しさん2015/10/15(木) 23:15:11.36ID:4mHovWtI
VBEでする参照設定って
当該ライブラリを使ってコードを書いた時に
入力支援を効かせるためのもので
コードの実行には関係していないって理解でいいですかね?
0379デフォルトの名無しさん2015/10/15(木) 23:18:17.40ID:DiiEBeOW
イベントをfalseにして、ワークブックをクローズして、その下にイベントをtrueにしても、trueは効かないんだな。どしよかな
0380デフォルトの名無しさん2015/10/15(木) 23:26:23.49ID:BCBs43Sq
>>377
いないことの証明はできないって言ってるみたいだけど、
いることの証明はできるんだ?w
そんな情報、公式に発表されてましたっけ?
0381デフォルトの名無しさん2015/10/15(木) 23:34:56.20ID:BCBs43Sq
>>378
ちがうよ。
static binding
とか
dynamic binding
で検索して勉強してみて!
0382デフォルトの名無しさん2015/10/16(金) 00:34:08.57ID:zUrsU6hF
質問です。
Excelでボタンを作成し、FTP通信処理をしたいのですが
.Runでエラーが起きてしまいます。(戻り値2)
シェル上では正常処理できる為、Excelでの記述の誤りがないか
教えて頂けたら幸いです。

sub ボタン()
Dim ret As Long
With CreateObject("Wscript.Shell")
ret = .Run("FTP -v -s:D:\test.txt >ftplog.txt", 3, True)
End With

End Sub
0383デフォルトの名無しさん2015/10/16(金) 00:34:45.41ID:WzZKv0aA
やたらスレが伸びているので、どうせ荒れてるんだろうなーと思って覗いたら案の定荒れてるわ。

このスレって昔から不自然に伸びてるときの理由ってこれしか無いよなw
0384デフォルトの名無しさん2015/10/16(金) 04:15:35.12ID:K5dVJZW/
>>382
エラーコード2はFTPシンタックスエラー
そのtest.txtに書かれたコマンドが間違ってる
0385デフォルトの名無しさん2015/10/16(金) 05:02:34.72ID:2dgCLobw
>>380
> いることの証明はできるんだ?w

はあ?
どうやったらそんなアホな結論にたどり着くんだよ w
0386デフォルトの名無しさん2015/10/16(金) 09:19:51.66ID:N0/epWSG
VBAの自体の質問ではないのですがエクセルでの開発についてアドバイス欲しいです。
営業用(1)と経理用(2)のエクセルファイルがそれぞれNファイル、1ファイルあるのですが
どちらも同じ金額データを入力しているので連携したいです。この場合はどのように連携するのが良いと思われますか。

(1) は受注毎に複数ファイルある
(2) は集計用なので(1)に入力された金額が縦に並んだ表形式
(1)に入力した各受注の金額が(2)に転記されると嬉しいです。リアルタイムでなくて問題ありません。

(1)を同じフォルダに全て入れておいて、(2)のボタン押下で順に読み込む方法しか思い浮かびませんでした。
なにか良いアイディアや経験などあれば教えてください。
0387デフォルトの名無しさん2015/10/16(金) 09:48:53.84ID:nroKKoB0
それでいいんじゃない?
0388デフォルトの名無しさん2015/10/16(金) 10:15:31.18ID:moEJh26J
>>359
> でもさー、これって「無い」よね?

> Excelの作りを知っている奴もいるかもしれないし、
BIFFやOOXMLの仕組みを熟知していたり、P-Codeへのコンパイルされること、
コンパイルされるタイミングをしっていたりすれば、それが「マクロ実行時間」に
影響されるかどうか判断できるかもしれない。

> マクロに影響が出るかわかってる奴もいるかもしれないだろ
こちらは、自分で実験すればわかるかもしれない。
あるいは、動的にExcelオブジェクトを作るマクロを作っていて、そのオブジェクトの
数とマクロの実行時間に関する知見を得ているなどのケースもある。

知識0%か100%ではなくて、その中間地点にいる人が、自分の知見に応じた
判断はでき得るだろう。
0389デフォルトの名無しさん2015/10/16(金) 10:29:31.50ID:moEJh26J
> こちらは、自分で実験すればわかるかもしれない。
例えば、

・Sheet1に対する読み書きをするマクロがあったとき、シート数が1, 10000で
 実行時間に違いがあるかどうか
・シート数が1, 10000のときに、Sheet1に対する処理と、Sheet10000に対する
 処理で実行時間に違いがあるかどうか
・Sheet1に対する読み書きをするマクロがあったとき、処理対象範囲以外に大量の
 データや書式設定、図形・グラフのExcelオブジェクトがあったときに、それが
 実行時間に影響を及ぼすかどうか
・VBEで、SheetX.basが1, 10000のときに、Sheet1.basの内容を実行する場合と、
 内容は同じだがSheet10000.basで実行するときに実行時間に差異はあるか

等々、実験項目はいろいろと考えられる。
まぁ、俺はしないけど。
0390デフォルトの名無しさん2015/10/16(金) 11:33:13.65ID:moEJh26J
しないとか言いつつ、一つだけ試してみた。

[シートを挿入する実行時間]

結論:既存のシート数に比例して、新規シート挿入の実行時間は増大する

50枚単位でかかった実行時間をプロット:
(Y軸の値は累計ではなく、直近の50シートの挿入にかかった時間)
https://gyazo.com/9d397cc04afd94f90b57fa301f8bc04c

これを見ると、存在するシート数に比例して、シート挿入には時間が
かかるようになることがわかる。

上記実行結果後のBookを保存後、さらに1000シート追加した結果:
https://gyazo.com/221afbe6128f04665d535e2128476020

最初の実験の最後の50シート追加に約2.5秒かかっているが、
ブックオープン後の1000〜1050シート追加に約2.7秒かかっていることから、
やはりシート挿入時間に関しては、既存のシート数に比例することがわかった。
0391デフォルトの名無しさん2015/10/16(金) 11:36:26.83ID:moEJh26J
あ、グラフの横軸は累計のシート数、縦軸は直近50枚の挿入にかかった実行時間(msec)。
0392デフォルトの名無しさん2015/10/16(金) 13:48:28.46ID:AXquxQwQ
>>388
>影響されるかどうか判断できるかもしれない。
でも、結局のところお前でもわからないんだろう?

じゃぁ、無いじゃん。
0を否定するなら1を出せよ。
0393デフォルトの名無しさん2015/10/16(金) 13:54:16.89ID:K5dVJZW/
>>392
「どちらとも断定できない」という場合もあるんですわよ?
0394デフォルトの名無しさん2015/10/16(金) 13:57:59.13ID:moEJh26J
>>392
> でも、結局のところお前でもわからないんだろう?
俺がわかるかどうかという問題ではない。
わかる人がいるかもしれないということだ。

> 0を否定するなら1を出せよ。
>>390の結果、少なくとも新規シート追加に関しては、何かを言えるようにはなった。
0395デフォルトの名無しさん2015/10/16(金) 14:19:17.50ID:AXquxQwQ
>わかる人がいるかもしれないということだ。
自分がわかるから、もしくはわかっている人を知っているから
無いということはありえないって発言できるわけでしょ。

自分でわかりもしないで、そんな人誰も知らないのに、無いということを
否定できる理由って何?
根拠もないのに他人の意見を否定したってことなんだよな。
俺の知っている限り、Excelの作りにまで言及した情報を発表している
ことを知らないから、無いよねって発言したけど。
それを否定するのだから、お前は知っているんだと思ったんだけど?

お前、自分の発言に関して無責任なんだなw
0396デフォルトの名無しさん2015/10/16(金) 14:31:16.51ID:moEJh26J
>>359
君が>>359かどうかわからないが、>>359はAもBも無いと言った。
なので、俺はBに関してはそういう知見を持った人がいるのではといい、実際実験してみるとある程度の知見は得られた。

Aに関しては、それがわかる人がいるかどうかは、今ここでは誰もわからないということだろう。
いるとも言えないが、いないとも言えない。
俺の主観では、そういう知見がある人はいると思う。今ここにいないだけで。
0397デフォルトの名無しさん2015/10/16(金) 14:33:59.84ID:moEJh26J
> Excelの作りにまで言及した情報を発表している
> ことを知らないから、無いよねって発言したけど。
ついでに言えば、BIFFやOOXMLの仕様は公開されているし、Office互換ソフトのコードも公開されているものがあるのだから、
そのソースを読めば何かがわかるかもしれない。
わからないかもしれないが。(というか、いちいちこういうエクスキューズするの面倒なんだが)
0398デフォルトの名無しさん2015/10/16(金) 16:34:43.72ID:c3hi3DeA
>>386
セルの計算式に、自分以外のブックも指定できたはず
詳しくはVBA関係ないからどっか適当な板かスレで聞いてくれ
0399デフォルトの名無しさん2015/10/16(金) 18:41:28.37ID:QoBFtYHr
>>386
営業とか経理じゃないんだけど
俺の場合だと
1秒ごとに収集されてる気象データ
(1日分が1ファイルだったり1週間分が1ファイルだったり、
データによってまちまち)を
1年分で一つのブック(1シート一月分、12シートで1ブック)に集約するマクロとか使ってるよ

読み込み元のファイル名に日付とか観測地点名が書かれてて、
それをマクロで読み取って適切な保存先ファイルの適切なセル位置に振り分けて追記していく感じ

保存先のデータがどこまで書かれてるかを調べて、
それ以降の名前のファイルしか読み込まないから
読み込み元のファイルを特定のフォルダに突っ込んだらあとはマクロ起動して放っとくだけ

読み込むファイルのフォーマット(どの列・どの行・にどんなデータが入ってるか)がきちんと定まっていれば
かなりの程度自動化できると思う

(まぁ、ウチの場合は集約したあとは色々解析作業もあるけど、
経理ならそういうの関係ないよね、せいぜいSumで合算する程度でしょ)

なんなら、サンプルどっかに上げてよ
(個人情報とか固有名詞の類は一切不要)
どの項目をどこに集計させたいのか、そういった意図が分ればそれでいいから
あとはファイルの名前とそれが置かれる位置というかフォルダ構造なんかは割りと重要
一々ファイル開かずにファイル名とフォルダの場所なんかからファイルの中身が類推できるようにしとくと
ファイルを開いて中身を確認する手間が省けるので処理が圧倒的に速くなる
0400デフォルトの名無しさん2015/10/16(金) 20:45:27.56ID:AviQ1U7E
>>386
俺の会社でもフォルダ指定して中のファイル片っ端から開いて必要なデータを集積する方式だわ。
営業用が担当別なら、その形式が一番楽だと思う。成果物を突っ込んどいて貰ってマクロで拾えばいいんだから。

経理用に入力したものを営業用に反映するとなると面倒くさくなるから話が変わってくるけど。

>>398
会社でそういう形式の関数使ってるけど同時に開かれている状態にしないと値が更新されないんだよな。
0401デフォルトの名無しさん2015/10/16(金) 20:50:28.91ID:WS6HRIwy
>>400
開いてなくてもリンクの更新は出来る
安易にマクロ使うまえにまずエクセルの使い方覚えた方がいいぞマジに
0402デフォルトの名無しさん2015/10/16(金) 21:05:46.46ID:wnEBCtLo
横だが
「Excelの作りを知っている」
って
「そのエクセルブックの構成を知っている」
って意味に解釈していたが Excel.exe の作りの事なのか?
0403デフォルトの名無しさん2015/10/16(金) 21:07:11.67ID:AviQ1U7E
>>401
ああ、やっぱ普通は更新出来るんだな。ローカルでテストしたときと動作が違って焦ったんだよな。
俺の会社だと暗号化するネットストレージを介してるせいなのか開くまで認識してくれないんだよ。
0404デフォルトの名無しさん2015/10/16(金) 22:04:25.50ID:SoxWpsox
営業が何人いるのかしらないけど、自分が作るのなら
営業側が入力するファイルから共有サーバかGAEなどに自動or手動でログを吐き出す様にする
エクセルファイルを集めて管理する手間は省きたい
0405デフォルトの名無しさん2015/10/16(金) 22:16:18.92ID:bIZ9qht1
>>348
ご回答いただき、ありがとうございましたm(_ _)m

なんとか、他の方法で解決できました。
0406デフォルトの名無しさん2015/10/17(土) 02:03:25.11ID:R2fw4Zxe
>>400
片っ端から開くとファイルサーバとかなかなか終わらなくね?おれはそれであきらめた
0407デフォルトの名無しさん2015/10/17(土) 08:01:41.29ID:OZbV6ZvF
>>406
アドレスが仮想化されててそのままでは読めないからローカルに落としてマクロに読み込んでるけど、
手動で持ち出すのと転送量変わらないんだから日常作業に支障を来すファイルサーバとか買い換えた方がいいんじゃね。
0408デフォルトの名無しさん2015/10/17(土) 09:52:36.96ID:lITdl3qE
>>407
ローカルに転送するのも、時間かかるから同じじゃないの?
0409デフォルトの名無しさん2015/10/17(土) 12:03:15.43ID:hE3s3H8k
初心者的な質問で申し訳ありません。
for next(i)の構文で変数を順番に変更する場合はどのように記載すればいいのでしょうか?
 hensuu & i = "test"
のような記載ではエラーが出るようです。

お手数をおかけしますが、ご教示のほどよろしくお願いいたします。
0410デフォルトの名無しさん2015/10/17(土) 12:29:35.99ID:gLjajuwO
配列をつかわないといけない
0411デフォルトの名無しさん2015/10/17(土) 12:47:37.92ID:OZbV6ZvF
>>409
ユーザーフォームのコントロールならMe.Controls("hensuu" & i).Value = "test"みたいな書き方出来るけど、
そういう事じゃないなら

Dim hensuu()
For i = l to u
   Redim Preserve hensuu(i)
   hensuu(i) = "test"
Next

みたいな事しないといけない。
0412デフォルトの名無しさん2015/10/17(土) 13:45:30.79ID:e7nna5Hr
>>409
皆が言ってるように、配列としてループで設定するのが一般的。

訳あってどうしても変数名末尾に連番を付けて、それを作成した文字列で指定したい場合は
クラス上で変数をプロパティ化してCallByNameを使えば出来るけど、
余り初心者向きではないし、そこまでしてやりたい程のものかが分からない。
0413デフォルトの名無しさん2015/10/17(土) 14:24:02.50ID:0dOkPt0P
断言しよう
「おまえのやり方は間違っている、配列を使え」
04143862015/10/17(土) 15:56:42.15ID:2j9KNh6i
みなさまアドバイスありがとうございました。VBAでデータコピーを考えていましたがセル参照でもいいんですね。
状況をもう少し整理してみます。

受注表は1案件1ファイルです。ファイル名が受注番号になっています。
これが担当者ごとのフォルダに保存されています。
受注表のデータは案件毎に行数が異なります。

201510_001_案件1.xls
2015/10 100円
2015/11 200円
2015/12 200円

201510_002_案件2.xls
2015/10 100円
2015/11 200円

この内容を経理用のブックに空行なく転記したいというのが要望です。

2015_経理.xls
201510_001_案件1 2015/10 100円
201510_002_案件2 2015/10 100円
201510_001_案件1 2015/11 200円
201510_002_案件2 2015/11 200円
201510_001_案件1 2015/12 200円

受注番号がキーなので、経理ブックの作業用シートに転記してセル参照とかも頑張ればできそうな気がしてきました。
(シートの実際の内容はもっと複雑ですが・・・)
0415デフォルトの名無しさん2015/10/17(土) 16:48:39.81ID:NfHTY+ll
>>414
順不同でデータを片っ端から全部コピーしたあとキー1=日付、キー2=案件(ファイル名)でソートかけるのが簡単
0416デフォルトの名無しさん2015/10/17(土) 19:32:01.42ID:BDeZUpOB
>>414
行数不定の処理なんだからセル参照でやるよりもマクロのが楽だよ
経理用ファイルの最終行以降にどんどん追記するだけなんだから簡単じゃん
0417デフォルトの名無しさん2015/10/17(土) 19:45:14.38ID:uNJQ9dbe
営業データを日付固定にしてセル参照すんのが一番楽
0418デフォルトの名無しさん2015/10/17(土) 20:51:18.96ID:BDeZUpOB
>>417
俺にはよくわからんのだけど
受注表のデータが案件ごとに行数違うってのは日付固定だと解決できる話なの?
それにセル参照って対象が増えるたびに
オートフィルかなんかで増やさなきゃならんのでしょ?
マクロで追記させるほうがより柔軟かつ簡単だと思うんだけど?
0419デフォルトの名無しさん2015/10/17(土) 21:47:59.27ID:uNJQ9dbe
>>418
ああ、つまり1行目は一日、2行目は二日って固定すればいいだろっていう話。
そうすれば行数が変わらないだろ。
0420デフォルトの名無しさん2015/10/17(土) 22:02:13.46ID:7Lrcv902
バックエンドにちゃんとしたDB置いて、各受注表からそこにデータ投げろ
0421デフォルトの名無しさん2015/10/17(土) 22:06:22.09ID:BDeZUpOB
>>419
案件数とか営業担当者数とかもたぶん不定だと思うんだよね

結局、集計対照全体のデータ量(というか、使用されるセルの数)が
どれだけになるのか不確定なのだから
セル参照で対応させるのは難しいと思うんだ

セル参照は取り扱うデータのセル位置が不変の場合なら使えるんだけど、
この質問みたいにどんだけ表が延びるのかわからないケースだと
必ずしも向いてないんじゃなかろうか?

まぁ、それでもどうしてもセル参照でやるなら
担当者ごとの集計とか、日付ごとの集計とか、
とにかくワンクッションおいた中間集計を作って
(あるいはさらに複数の段階を経て)最終結果を取りまとめる
って言う手法もあるかもしれないんだけど
そこまでしてやるならマクロで一発で済ましたほうが簡単だと思うんだよね
0422デフォルトの名無しさん2015/10/17(土) 22:14:02.66ID:uNJQ9dbe
>>421
> 案件数とか営業担当者数とかもたぶん不定だと思うんだよね
不定はさすがに言いすぎだと思うがw
まあ、それがどの程度頻繁に変わるかは>>386でないと分からんな。
ただ、俺だったらどうしても必要になるまで極力コードは書かない。
0423デフォルトの名無しさん2015/10/18(日) 00:41:32.87ID:+wEml+zn
エクセルのマクロを作成したいのですがちょっとわからないので知恵をお貸しください

アクティブシート内に挿入された画像を一つ一つ写真1、写真2と名前を連番にしてつけたいのですが行き詰まっております。

Dim shp As shape
For each shp activesheet.shaps
If shp.type = msopicture then shp.name = "写真1 "
next
end sub
現在ここで行き詰まっているのですがこの構文だとアクティブシートにあるすべてのオブジェクトから写真だけを選択して写真1という名前に変更するというプログラムになってしまいます
俺がやりたいのは例えば5枚写真があれは写真1〜写真5となるように名前をつけていく作業です
上の構文をどのように治せば良いのか教えてください
0424デフォルトの名無しさん2015/10/18(日) 00:46:57.18ID:8xhftPvG
dim i
i = 1
ループ

i = i + 1
ループ終わり
0425デフォルトの名無しさん2015/10/18(日) 01:12:52.23ID:Vej+inz9
>>423
Dim shp As shape
For each shp in activesheet.shaps
If shp.type = msopicture then i = i + 1: shp.name = "写真" & i
next
end sub
0426デフォルトの名無しさん2015/10/18(日) 12:50:57.78ID:B0fgHUNR
VBAに限らないかもだけど
関数を呼び出して、その中でいろいろやってデータを返すと同時に
異常であるという情報も返したくなるのって、設計が悪いのかな
戻り値をVariant型にすれば実現はできるけれど、きっとお行儀が悪いって言われるよね

例として、以下のような関数を作りたくなることが自分は非常に多い
・日付の入ったセルオブジェクトを受け取り
・セルに入った日付に何らかの加工を施した日付を返すけれども
・不正な日付が入っていたり、範囲チェックで対象外の時にはFalseを返す
0427デフォルトの名無しさん2015/10/18(日) 13:01:05.02ID:2izk1DSP
多値は昔からあるし、別に悪い設計ではない。
最近になってgolangが多値でエラーを返す作法を復活させたしな。
ただvbではサポートされていないからどちらかを引数にするのが一般的なんじゃね。
0428デフォルトの名無しさん2015/10/18(日) 14:05:39.11ID:TxcjIUFo
>>426
気にすることなくVariantを使えばいいと思うよ。
0429デフォルトの名無しさん2015/10/18(日) 14:38:03.71ID:meYS3A+I
>>427
object返して、typeof(..) is で判定したらいいんじゃないかな?
Nullableにしといて、Nothing返すのはよくやるよ。
0430デフォルトの名無しさん2015/10/18(日) 15:28:09.69ID:0tCduqbt
call by nameでパラメータを渡すとか、構造体にするとか配列にするとか方法は色々ある
クラスを作ってプロパティを2つ用意する手もある
日付としてありえない特別な値(-1とか)を返すなんてのもよく使われる
0431デフォルトの名無しさん2015/10/18(日) 16:06:20.97ID:6KodRR6C
データベースからレコードの1項目を受け取る時に
関数の戻り値をBooleanにしてる。
レコードが存在すればtrue、無ければfalseに
んで、Trueの時に受け取りたい項目をByrefで設定した引数に入れるてるけど

受け取りたいのが1つだけでないなら>>430みたいに構造身体にすればいいだろうし
ま、やり方はいろいろあるだろうさ
0432デフォルトの名無しさん2015/10/18(日) 16:28:09.80ID:Vej+inz9
>>426
本来の戻り値をByRefで渡した変数に記録させて、Functionの戻り値でエラーを表現するのがスマートかな。
エラー発生時にTrueを返すようにするとif Function Then Goto ErrTrapみたいな形に出来るし。
0433デフォルトの名無しさん2015/10/18(日) 17:46:06.04ID:TxcjIUFo
>>432
いやそれは古くさいやり方なのでは?
0434デフォルトの名無しさん2015/10/18(日) 18:00:37.67ID:sNi9xDw1
>>433
使えるなら例外とかが一番いいと思うけど、古くさい言語の VBA なら >>432 とかでいいでしょ
個人的にはエラーの時に True を返すのはあまり好みでないけど
0435デフォルトの名無しさん2015/10/18(日) 22:30:17.60ID:GZ8Wzwdw
>>432はスマートと言ってるけどさすがにそれはないな。
Private な関数なら別にどうでもいいけど、PublicなコードではByRefでのoutよりは
IsEmptyなどで判別させる多値の方がいいよ。
0436デフォルトの名無しさん2015/10/18(日) 22:35:38.81ID:+wEml+zn
>>424-425
ありがとうございます!!!

これでやっと報告書のマクロが完成しそうです
本当に助かりました
0437デフォルトの名無しさん2015/10/19(月) 04:13:09.25ID:PfXrk4Nm
>>435
Variant使わない前提の話だからEmpty値にはならないのでは。
0438デフォルトの名無しさん2015/10/19(月) 06:58:53.77ID:q+3fvWeI
別に使わないとは明言されてないよう読み取れるけど
0439デフォルトの名無しさん2015/10/19(月) 07:22:17.86ID:JgpODEqs
>>426
将来的に見てもBoolean型で問題ないならBoolean型で返せばいいし、
落ちた後、どんな種類で落ちたかの判別が必要なら列挙型で返せばいいし、
もっと詳細な情報が欲しければエラーオブジェクトそのものを返せばいい。

更にどの関数で落ちたか、いつ落ちたか等の付加情報を設定したい場合は、
エラー情報を格納するクラスを作ってそのプロパティとして設定してやり、インスタンスを戻り値に設定する。

そこまで行くと実処理の戻り値で返す方法と、
エラー情報取得用のプロパティを作ってそこから返すようにする方法があるけど、
とりあえず前者でいいんじゃないかな。

あと、部品にしている場合、あえてそこでエラーを捕まえないと言う方法もあるよ。
呼び出し側でエラーを捕まえることで、呼び出し側に戻り値の型を意識させたくない場合とかね。
0440デフォルトの名無しさん2015/10/19(月) 08:13:15.70ID:haJ4nLKV
>>439
成功値も返したいからこその悩みではないのかな。
エラーならエラーオブジェクト返せば良いと思うけどな。
引数をbyrefにするべき場面としない方がいい場面の両方があるけど、
引数がクラスだとインスタンス作って初期化してから呼ばないといかんのか、インスタンス作って返してくれるのか責任範囲が外から見づらいから基本的には、インスタンス作ってくれるようなのは戻り値として返してほしい。
シングルスレッドになっちゃうけど、作れてなかったなら何かしらのエラーなんだから、
その時にはじめてエラーを取ればいいんじゃないの?
さっき作ってくれなかったけどなんてエラーだったの?みたいな。
マルチスレッドなら、戻り値を含めた結果専用のクラスがほしいけどね。
.netならGenericsで一発なのに。
0441デフォルトの名無しさん2015/10/19(月) 08:22:52.12ID:l1IvYy1d
>>435
ケースバイケースだとは思うけど、例えば Integer の値が欲しいのにエラーを返したいから Variant にするとかはちょっとどうかと思う
0442デフォルトの名無しさん2015/10/19(月) 09:24:15.57ID:aF0TbBtn
>>441
多分それは副作用を伴わない単純な関数なのだろうから、おっしゃる通りでしょうね。
0443デフォルトの名無しさん2015/10/19(月) 10:52:41.41ID:XMyRFhyg
>>399
> 営業とか経理じゃないんだけど
> 俺の場合だと
> 1秒ごとに収集されてる気象データ

さすがにデータベース使えよ。
何カ所で収集してるのかわからんけど、一箇所あたり、
1日で86,400レコード、
1ヶ月で約260万レコード、
1年で約3150万レコード。
0444デフォルトの名無しさん2015/10/19(月) 13:44:31.32ID:XMyRFhyg
>>426
> 例として、以下のような関数を作りたくなることが自分は非常に多い
> ・日付の入ったセルオブジェクトを受け取り
> ・セルに入った日付に何らかの加工を施した日付を返すけれども
> ・不正な日付が入っていたり、範囲チェックで対象外の時にはFalseを返す

横だが、これは機能が直交してないね。
あ、設計に口出すのはNGだっけか?
0445デフォルトの名無しさん2015/10/19(月) 14:16:40.51ID:aF0TbBtn
>>444
その機能をひとつの関数でやっているとしたら分解したほうがいいけどね。まさかそれはないと信じたい。
0446デフォルトの名無しさん2015/10/19(月) 16:57:47.92ID:GKIe3Ccj
>>444-445
投げ込めば投げられた側でなんでもやってくれそうな関数作る人いるよね。
でも、結局投げ込む側でもエラー処理を書くという・・・。
じゃぁ、投げ込む前にチェックしてもいいじゃねっていう。
0447デフォルトの名無しさん2015/10/19(月) 17:47:44.09ID:aF0TbBtn
いろいろなことをやってくれる関数は有難いようで全然ありがたくない。単機能のほうが責任範囲が明確になるからいい。
0448デフォルトの名無しさん2015/10/19(月) 17:50:41.80ID:bIFzKXU5
Excelは2003しか持ってないんだけど
VBAのバージョンって最新のExcelと
違うんですか?
(´・ω・`)
0449デフォルトの名無しさん2015/10/19(月) 19:07:35.04ID:aF0TbBtn
>>448
LongPtrとか64bit対応絡みの新しいキーワードが登場してる。
あとDeclare文にはPtrSafeって付けなきゃいけないとか。
0450デフォルトの名無しさん2015/10/19(月) 20:07:53.08ID:l1IvYy1d
>>444
直交の意味わかって書いてる?

>>445
> 何らかの加工
の内容にもよるけど、加工するならエラーチェックするのは当たり前だし、何を分解しようとしてるんだろう…
0451デフォルトの名無しさん2015/10/19(月) 21:11:37.44ID:zICYHlOT
>>450
そりゃ 「日付に何らかの加工を施した日付を返す」関数を単独に切りだせってことだろ。
引数をDate型にして。
0452デフォルトの名無しさん2015/10/19(月) 21:43:46.61ID:qpkaMJyW
エクセルマクロって事務員が仕事の手抜きする為にしこしこ作るもんやで?
おまいらの付け焼刃のコーディング論なんかクソの役にも立たんねん
要するに余計なお世話なんやで!
0453デフォルトの名無しさん2015/10/19(月) 21:45:34.98ID:KNkiK4C3
質問なんですが
LONG_PTR型を使えるようになったVBAバージョンっていくつからかわかりますか?
またLong型を全てLONG_PTR型にすれば、使えるようになったバージョンから〜VBA7で、
オフィスが32bitも64bitも対応可能ってことになりますか?
0454デフォルトの名無しさん2015/10/20(火) 01:19:09.68ID:xZ1KRCFN
>>440
成功値ならエラーオブジェクトがNothingであることで判別が付くし、
エラー用のクラスを引数に持たせるなんて書いた覚えないんだけど、
何で引数に持たせると思ったの?
0455デフォルトの名無しさん2015/10/20(火) 02:20:56.20ID:tpteZREF
>>453
https://msdn.microsoft.com/ja-jp/library/office/gg264421.aspx
0456デフォルトの名無しさん2015/10/20(火) 07:13:45.13ID:ydswHXZH
>>454
byrefで、の流れでレスしてた。すまん。
実処理の結果と論理的な結果が別の変数に乖離するのが嫌なだけだよ。
エラー用のクラスが引数でも、成功値セットのクラスが引数でも同じ事で。
インは引数、アウトは戻り値が理想だよね、って話で、
俺はVariantは宣言したら使っても良いと思う。
0457デフォルトの名無しさん2015/10/20(火) 07:48:04.26ID:10B2/fqw
気象のやつはデータ混在しているのと確定値でない物もあるな。
閏秒のデータはどうなっているんだろう。
規定的には59、60,61秒での桁上がりがあるんだよね。
結構罠だよね
0458デフォルトの名無しさん2015/10/20(火) 10:20:00.56ID:haHjjt4S
>>450
> 直交の意味わかって書いてる?

凝集度が低く、なおかつ異なるレイヤー・ドメインの処理が混在していることを、
直交していないと俺は表現してるが、間違ってる?
0459デフォルトの名無しさん2015/10/20(火) 11:01:43.40ID:iuUw7odg
>>458
横だが、間違いだと思う。
0460デフォルトの名無しさん2015/10/20(火) 11:29:40.01ID:haHjjt4S
>>459
正しい意味は何?
0461デフォルトの名無しさん2015/10/20(火) 11:31:10.14ID:haHjjt4S
ちなみに、Wikipediaのこの説明は、俺の理解と離れてないと思ってる。

> ソフトウェアでの直交性は、機能間の組み合わせや順序について依存関係が小さい事を意味する場合が多い。具体的には次のような事例を指す。
> ・オブジェクトへの操作があるなら逆操作もある。
> ・プロパティ間に依存関係がない。
> ・不変契約が保持されている。
0462デフォルトの名無しさん2015/10/20(火) 11:58:14.44ID:iuUw7odg
かなり離れていると思う。
>>458に書かれていることと因果関係・相関関係はあるかもしれんが。
0463デフォルトの名無しさん2015/10/20(火) 12:21:52.14ID:6DVsWO41
直接には字の通り、垂直に交わる事。
転じて、無関係ってことやで直交て。
分かりにくい表現の代表みたいなもんだから
使うとむしろ馬鹿っぽい。
0464デフォルトの名無しさん2015/10/20(火) 12:38:08.75ID:yevMkF1y
>>458
それを直交してる/してないって表現するのは初めて聞いた
0465デフォルトの名無しさん2015/10/20(火) 12:53:13.15ID:9SyfYFZF
>>461
離れてないけど、
>>458は結果で、あくまで直交性としては、
並行ではない、の逆説的な意味で、機能が独立していること、逆変換可能であること、参照透過であること、じゃないかな。

目がくりっとしてて、耳が立っているのが柴犬、と
犬とは目が2つついてて、耳がついててワンと吠えるもの、
を混同して、
目がくりっとしてて耳が立っているのは目と耳があるから犬である、と言われても、三段論法以前の問題。
0466デフォルトの名無しさん2015/10/20(火) 13:04:01.33ID:haHjjt4S
>>465
> 機能が独立していること
うん、これが担保されていないので直交してないと表現したんだけど、どうも一般的じゃ
ないみたいだね。

これからは、使わないようにするよ。
0467デフォルトの名無しさん2015/10/20(火) 13:23:19.18ID:haHjjt4S
直交性に関する蛇足。

俺が直交性という言葉を知ったのは多分『達人プログラマー』で、そこにはこういう説明が
あったらしい。(今手元にないので確認できない)

直交性と DRY
https://gist.github.com/sunaot/625336
0468デフォルトの名無しさん2015/10/20(火) 16:44:20.95ID:iuUw7odg
>>465
直交性と参照透過は関係あるのかな?
というのも、たった今こういう記事を読んだから。
http://qiita.com/knaka/items/b18134d9d11b51da4e2e
0469デフォルトの名無しさん2015/10/20(火) 18:02:51.75ID:wXDHjVPO
>>468
参照透過であるからこそ、直交性があると思うけど、どうなんだろう。
論旨は面白かったけど。

厳密に言えば、モナドを持つ関数は直交性が無いとすら言えると思う。
解析的に考えると、それは関数じゃない。
0470デフォルトの名無しさん2015/10/20(火) 18:28:06.05ID:xsVY88X7
直交性はよくわかりませんがとりあえず直帰したいです
0471デフォルトの名無しさん2015/10/20(火) 21:03:13.42ID:wFL9h+A/
>>467
直交って何かと思ったら「次元」みたいな扱いか。
0472デフォルトの名無しさん2015/10/20(火) 21:47:59.14ID:cLnE5KNn
というか、複数の概念を独立した次元として扱えるるかってことですね。
6と10は独立してないけど、2,3,5の組み合わせに分解すると独立する3つの概念に分けられるみたいな。
0473デフォルトの名無しさん2015/10/20(火) 22:47:59.69ID:eF8264ko
一覧表があって、行の端に行ごとにボタンを配置して、ボタンを押すと、非表示にしてあるボタンの右例のデータに処理を加えるという処理をしたいのですが、ボタンクリックのイベント取得とボタンの行ごとに配置自動化とボタン配置横のセル取得は不可能でしょうか??
0474デフォルトの名無しさん2015/10/21(水) 00:53:02.66ID:ZXMR/M8n
そりゃ、可能だろ


文を改行して書いて!
0475デフォルトの名無しさん2015/10/21(水) 01:01:19.64ID:PkHZsUUS
直交性っていう言い方は初めて聞いたな。
結合度とは違うのか?
0476デフォルトの名無しさん2015/10/21(水) 01:03:12.03ID:H5R6aAd2
>>474
すいません、検索しても見つからず教えていただけないでしょうか?
0477デフォルトの名無しさん2015/10/21(水) 01:04:55.09ID:PkHZsUUS
>>473
ボタンは知らないけど、シェイプなら登録するマクロに引数持たせれば出来るんじゃないの?
0478デフォルトの名無しさん2015/10/21(水) 01:11:13.58ID:PNxVph4D
>>473
どこまで聞きたいのか分りずらいけど とりあえず。

※あるセルの上にボタンを配置したければ
 Set Sel = Range("C5")
 With ActiveSheet.Shapes("Button 1")
  .Left = Sel.Left
  .Top = Sel.Top
  .Height = Sel.Height
  .Width = Sel.Width
 End With
とかで出来る

※あるボタン(実際にはボタン左上の角)がどのセルにあるかは
 ActiveSheet.Shapes("Button 1").TopLeftCell
で取得できる

で ボタンが フォームコントロールなら登録したマクロ内で
 ActiveSheet.Shapes(Application.Caller).TopLeftCell
で押されたボタンが配置されてるセルが取得できる
0479デフォルトの名無しさん2015/10/21(水) 01:18:18.38ID:BhomK4j2
ボタン配置のマクロとかマクロを作るマクロはできないなーって思ってたんだが。
0480デフォルトの名無しさん2015/10/21(水) 01:23:26.93ID:PNxVph4D
>>479
マクロを作るマクロも可能だよ(正確にはプロシージャ)
初心者向きじゃないけど
0481デフォルトの名無しさん2015/10/21(水) 01:34:40.42ID:H5R6aAd2
>>478
トンです
0482デフォルトの名無しさん2015/10/21(水) 15:51:13.20ID:LkMjUTyJ
フォームにあるリストボックス内のすべての項目をそのままセルに反映させたいのですがどのようにすればよいでしょうか。
リストボックス内は4列あります。
0483デフォルトの名無しさん2015/10/21(水) 16:34:10.31ID:jN1Om2/z
列?
0484デフォルトの名無しさん2015/10/21(水) 16:41:04.20ID:ZXMR/M8n
リストボックスにある、すべての項目分だけループする
{
リストボックスから1つずつ項目を取得する。
それを、セルに代入する
}
0485デフォルトの名無しさん2015/10/21(水) 18:08:08.25ID:H5R6aAd2
ファイルのパスに次のように日付の情報をもってて
¥¥2015年度¥10月1日¥xxx.xls
これを分割、結合し、日付型でセルに格納するにはどうしたらいいでしょうか?
0486デフォルトの名無しさん2015/10/21(水) 18:29:15.59ID:KAyomFd3
やる事わかってんだからコード書けばいいじゃん
0487デフォルトの名無しさん2015/10/21(水) 18:35:49.80ID:H5R6aAd2
>>486
書き方がわかんないので。申し訳ない
0488デフォルトの名無しさん2015/10/21(水) 18:41:35.80ID:kluOGpTb
p = "\\2015年度\8月12日\xxx.xls"
y = Val(Mid(p, 3))
m = Val(Mid(p, 10))
d = Val(Mid(p, InStr(p, "月") + 1))
0489デフォルトの名無しさん2015/10/21(水) 18:44:59.78ID:PNxVph4D
Dim DD As Date
Dim X As Variant
Path = "\\2015年度\10月1日\xxx.xls"
X = Split(Path, "\")
DD = Left(X(2), 5) & X(3)
Debug.Print DD
0490デフォルトの名無しさん2015/10/21(水) 18:48:55.18ID:PNxVph4D
>>482
ついでたから
"フォーム"って "ユーザフォーム"の事だよね?
それで こゆことかな?

With ListBox1
  Range("A1").Resize(.ListCount, .ColumnCount) = .List
End With
0491デフォルトの名無しさん2015/10/21(水) 19:11:00.07ID:H5R6aAd2
>>489
これで日付型二なるんですか?
0492デフォルトの名無しさん2015/10/21(水) 19:21:40.43ID:vq6gVT+v
試せよ
0493デフォルトの名無しさん2015/10/21(水) 19:23:15.43ID:PNxVph4D
>>491
実際やった上で ならなかったのかな?
そこハッキリしてもらえる?
でどうなったかも

あと EXCELのバージョンは?俺は2013
0494デフォルトの名無しさん2015/10/21(水) 19:55:02.13ID:AyxO5/kI
>>484
意味わかるけど、それだとCとかJavaとかだよっと。
0495デフォルトの名無しさん2015/10/21(水) 20:05:40.83ID:AyxO5/kI
>>487
Dim path As String
path = "\\2015年度\10月21日\xxx.xls "
path = Replace(path, "\", "")
path = Replace(path, "年度", "/")
path = Replace(path, "月", "/")
path = Left(path, InStr(path, "日") - 1)
Debug.Print path
'どうぞ^^
0496デフォルトの名無しさん2015/10/21(水) 20:43:44.15ID:kPIHjX0M
>>495
path = "\\2015年度\10月21日\xxx.xls"
path = Replace(path, "\", "")
path = Replace(path, "度", "")
path = Left(path, InStr(path, "日"))
0497デフォルトの名無しさん2015/10/21(水) 21:04:24.47ID:AyxO5/kI
>>496
お前嫌いだわw
0498デフォルトの名無しさん2015/10/21(水) 21:18:48.27ID:AyxO5/kI
>>496
あと、間違ってるぞw
0499デフォルトの名無しさん2015/10/21(水) 21:31:54.39ID:PNxVph4D
>>485
もう一個作ってみた DateValue関数使ってるから問題ないと思うが・・・・
(正規表現のパターンは 問題なく抽出出来るというだけで 適当です)

Path = "\\2015年度\10月21日\xxx.xls "
With CreateObject("VBScript.RegExp")
  .Pattern = "\D*(\d*)\D*(\d*)\D*(\d*)"
  .Global = True
  Set X = .Execute(Path)(0).SubMatches
End With
Range("A1") = DateValue(X(0) & "/" & X(1) & "/" & X(2))
0500デフォルトの名無しさん2015/10/21(水) 22:23:48.23ID:FoBwPO4y
>>498
0501デフォルトの名無しさん2015/10/22(木) 01:02:44.17ID:LWUxr4XK
そもそも2015年度の1月1日は一般的に2016/01/01じゃないかと
0502デフォルトの名無しさん2015/10/22(木) 07:20:30.02ID:ZDrmESzi
年度を年に変換すればいいのか?まあ業界や業務によっては4月で年度が変わるとは限らないけど

p = "\\2015年度\10月22日\xxx.xls"
y = Val(Mid(p, 3))
m = Val(Mid(p, 10))
d = Val(Mid(p, InStr(p, "月") + 1))
If m <= 3 Then y = y + 1
n = DateSerial(y, m, d)
0503デフォルトの名無しさん2015/10/22(木) 13:15:57.14ID:MOe0leML
VBA初心者です。
繰り返し回数を分岐させたいのですがうまくいきません。
サンプルでこんな感じなのですが、繰り返し回数が無いものと認識されてしまいます。
作っているプログラムは、「for to」 以下の処理が長いので、分岐ごとにK を確定値として書くとコードが汚いなーと思いまして。。。
なんかいい方法はございますでしょうか

Sub test()
Dim k As Long
Dim i As Long

If Cells(1, 1) = 1 Then
k = 5
Else
k = 1
End If


For i = 2 To k
Cells(i, 1) = "AAA"
Next

End Sub
0504デフォルトの名無しさん2015/10/22(木) 13:33:06.72ID:XUAQn5SB
>>503
そのコードでは A1 が 1 以外の時 K=1 になる

これでは 後段の forが
For i = 2 To 1
となるのでループが回らない

で この時(A1 が 1 以外の時)はどうしたいの?

ちなみに
i=2→1 と iを減らしたい時は
For i = 2 To 1 step -1
とやらないといけないのだけど・・・
0505デフォルトの名無しさん2015/10/22(木) 14:23:49.51ID:S7H835Oy
>>503
構造化プログラミングで検索して勉強してみるといいかも。
VBAでの具体的なところでは、まずはsubやfunctionにして外に追い出す感じ。
ちょっと乱暴な説明でゴメン。
0506デフォルトの名無しさん2015/10/22(木) 15:09:41.55ID:MOe0leML
返信ありがとうございます。

>>504
ご指摘ありがとうございます。
例が間違ってました。
元のプログラムが動かなくて、
簡単な例を作ってみて、やっぱり動かないので、
繰り返し回数に変数を入れると動かないと勘違いしていたのですが、i=1が原因でしたか。。。。
動くんですね。

そのご指摘で、作ってるコードの繰り返し回数のif文の複数回分岐が間違って、
i=0となっていることに気が付きました。
stepも教えていただきありがとうございます。

>>505
ありがとうございます。
ちょうど今試してみました。ユーザ定義関数が超便利です。
0507デフォルトの名無しさん2015/10/22(木) 18:08:56.39ID:AgyudLkA
>>503
なにがしたいのかよくわからんが
こういうことがやりたいのかな

For i = 2 To k+1
Cells(i, 1) = "AAA"
Next
0508デフォルトの名無しさん2015/10/22(木) 20:30:31.00ID:kZtQWjvo
>>505
構造化とオブジェクト指向って多くの部分で重なってるよね??
0509デフォルトの名無しさん2015/10/22(木) 21:48:11.17ID:tUEKhMi2
初心者です、どうぞよろしくお願いします
エクセルでこういうのを作りたい
球団12と120人の選手がいて球団は1位〜120位まで欲しい選手が同列なく
いて選手もまた1〜12まで同列なくいきたい球団が決まってる
最初選手は一番目に志望を提出する。各球団は、1〜120の自分の順位に従って、10人に届くまで必ずキープする。
そこで、キープに入れなかった(トライアウトに落ちた)選手は第二希望に行く、そこで球団は今のキープ選手より順位が高い選手が来れば
入れ替えるし、来なかったらそのままにする。10人を満たしてなかった球団は必ず受け入れる。
これを繰り返して、全球団に10人ずつ選手を満たすまでやる。

というのをやってみたいんですが、選手と球団に乱数でそれぞれ重複のない順位を与える
というところでとまっています。
関数の使い方とか教えてください
0510デフォルトの名無しさん2015/10/22(木) 22:12:26.74ID:NqpfO95z
>>509
Dim 球団(1 To 12), 選手(1 To 120), 希望選手(1 To 120), 希望球団(1 To 12)

For k = 1 To 12
Erase 希望選手

For i = 1 To 120
Do
j = Int(Rnd Mod 120) + 1
If 希望順位(j) = 0 Then 希望順位(j) = i: Exit Do
Loop
Next

球団(k) = 希望順位
Next

For k = 1 To 120
Erase 希望球団

For i = 1 To 12
Do
j = Int(Rnd Mod 12) + 1
If 希望球団(j) = 0 Then 希望球団(j) = i: Exit Do
Loop
Next

選手(k) = 希望球団
Next
0511デフォルトの名無しさん2015/10/22(木) 22:15:01.81ID:NqpfO95z
あ、int(Rnd * 1000 Mod 120)+1 とかじゃないとダメか
0512デフォルトの名無しさん2015/10/22(木) 22:34:04.37ID:tUEKhMi2
>>510,511
御親切にありがとうございます。
すいません、これが例えばキープという制度はなく、
最初の希望で10人とったら確定になってしまい、落ちた選手が第二希望に行ったとしても
その第二希望の球団が10人になっていたら、入れ替えはなく自動的に3,4,5と落ちて行って
空いてるところに収まる場合はどうなりますか?
細かい違いなのですが、教えていただければ幸いです
0513デフォルトの名無しさん2015/10/22(木) 22:58:58.52ID:NqpfO95z
>>512
>>510はあくまで「12球団が希望するそれぞれの選手の順番」と「選手120人が希望するそれぞれの球団の順番」が揃っただけだから、
ここで得られたジグ配列を利用してキープなり先着順なりのアルゴリズムを実装する事になる。

それぞれの配列は

「球団(i)(j)」の時、「i球団がj番目に欲しい選手」
「選手(i)(j)」の時、「i選手がj番目に入りたい球団」

とする事が出来るはずなので後は自分で考えるなりしてくれ。
0514デフォルトの名無しさん2015/10/23(金) 07:07:59.29ID:cnjrTfag
>>508
そうだね。でも基本的に重なっている部分は
「基本的に同じコードは2度書かない」ということに回帰する。

VBAの場合一応クラスが使えるから、Object指向の言語を先に勉強すると、
きちんと場所ごとに役割付けされた、無駄な分岐のない
見やすく改修しやすいコードで組むことが出来るようになるね。
0515デフォルトの名無しさん2015/10/23(金) 08:04:19.01ID:NKqGTZsQ
>>514
重なっているというよりはレイヤの違う概念だな
本当は直交する概念と書きたかったけど、ちょこっと意味が違うなw
0516デフォルトの名無しさん2015/10/23(金) 12:02:54.11ID:p1/LXmyz
>>514
他人に使ってもらうことを考えるときはVBAのクラスは採用しづらい。
自分は全くクラスモジュールを使わないようにしている。
0517デフォルトの名無しさん2015/10/23(金) 12:12:13.25ID:C4TSXTyD
ユーザーフォーム関連で困っているのでご教授ください。

自社の台帳入力にあたり入力項目が多いので省力化と入力ミス防止のため、ユーザーフォームを用意しコマンドボタン押下で対象セルに一括登録するマクロを書きました。

ユーザーフォームは29箇所のテキストボックスと4箇所のコンボボックス構成され、編集されたかどうかを判定するためいずれかのオブジェクトでChangeイベントが有ったときにパブリック変数Changeで編集フラグを立てています。
コマンドボタン押下で呼び出されるプロシージャにはApplication.EnableEvents = Falseを記述しています。

動作は希望通りの物ができたのですが、コマンドボタン押下後の動きをF8で追っていくとなぜか特定のコンボボックスのチェンジイベントが発生し、
編集フラグの有無を判定後フラグなしの場合にフラグ立てるプロシージャ(Combobox1_Changeとします)に動作が移ります。

それが一度ならばまだしも各オブジェクトのValue値を対応するセルに入れるコード度にCombobox1_Changeを呼び出してしまいます(合計33回)。

いずれかのオブジェクトに入力された時点でフラグは立っているので無意味なコードを何度も繰り返し実行していることになります。

念のために”Combobox1_Change”を”Combobox1x_Change”とするなどして名称を変更した場合には他のプロシージャに動作が移る事はありません。

動作に支障はないものの、実行速度も気持ち遅く感じております。

どなたか原因がわかるかたいらっしゃいませんか?
0518デフォルトの名無しさん2015/10/23(金) 12:52:24.38ID:9JJo3sM8
>>517
編集されたかどうかを知りたいだけなら、フォームを開く前後で全項目の比較をすれば?
0519デフォルトの名無しさん2015/10/23(金) 13:52:01.55ID:C4TSXTyD
>>518
編集されたかどうかをチェンジイベントで判定している理由は、一つのレコードは一度の入力で完了するものではなく、項目によっては後日入力する必要があるため、

フォーム上のスピンボタンを押して通し番号を変更して他のレコードに移れる様にするためです。
0520デフォルトの名無しさん2015/10/23(金) 14:16:30.63ID:9JJo3sM8
>>519
> 編集されたかどうかをチェンジイベントで判定している理由は、一つのレコードは一度の入力で完了するものではなく、項目によっては後日入力する必要があるため、
これをまとめてやってはいけない理由がわからない。

> フォーム上のスピンボタンを押して通し番号を変更して他のレコードに移れる様にするためです。
スピンボタンを押したときにまとめてチェックすれば?
0521デフォルトの名無しさん2015/10/23(金) 14:19:17.14ID:9JJo3sM8
疑問その1: そもそも編集されたかどうかは、何のために知る必要があるの?

疑問その2: 仮に各項目毎に編集フラグがあったとして、1 → 2 → 1と変更されたら、
イベントハンドラで単にフラグを立てるだけだと、変更されたと見なしてしまうのでは?
0522デフォルトの名無しさん2015/10/23(金) 15:43:55.61ID:C4TSXTyD
>>520

>これをまとめてやってはいけない理由がわからない。

用途は受注の一元管理のための物です。
受注時、請求時、入金時に各項目を入力する物で、フォームをみれば未請求・未入金が分かるようにしてあります。
請求や入金時には該当する受注のレコードを表示して空欄を埋めます。

>スピンボタンを押したときにまとめてチェックすれば?

その方法の方がスマートと思います。
一度取り組んでみます。

>>521
>疑問その1: そもそも編集されたかどうかは、何のために知る必要があるの?

スピンボタンを押したときに変更されていればMsgboxで確認後にセルに上書きしてから別のレコードに移る為です。

>疑問その2: 仮に各項目毎に編集フラグがあったとして、1 → 2 → 1と変更されたら、
イベントハンドラで単にフラグを立てるだけだと、変更されたと見なしてしまうのでは?

おっしゃるとおりです。
変更有りと見なされて確認のMsgboxが出ますが上書きするだけのコードなので変更がなければキャンセルしてレコードは移ります。
なお編集フラグはフォームのコード上で一つしか用意していないのでどこかが編集されればフラグONとなります。

フラグの立て方やチェックのタイミングはご指摘された点も納得でき、私の至らない部分も理解できますが
ご教授いただきたいのはなぜ同じコンボボックスのチェンジイベントが何度も発生し同じコードが繰り返し呼び出されるのか、と言う点なんです。
0523デフォルトの名無しさん2015/10/23(金) 15:47:04.27ID:ivRzPMDy
ソースが無いとなんとも言えないんじゃないか
0524デフォルトの名無しさん2015/10/23(金) 16:09:40.49ID:6RpU4G8/
>>517
Private Sub UserForm_Initialize()
ComboBox1.AddItem "a"
ComboBox1.AddItem "b"
End Sub
Private Sub CommandButton1_Click()
Application.Worksheets("Sheet1").Range("A1").value = TextBox1.value
Application.Worksheets("Sheet1").Range("A2").value = ComboBox1.value
End Sub
Private Sub ComboBox1_Change()
MsgBox ""
End Sub
Private Sub TextBox1_Change()
MsgBox ""
End Sub
'なりませんけど?
0525デフォルトの名無しさん2015/10/23(金) 16:15:24.71ID:6RpU4G8/
>>517
>コマンドボタン押下後の動きをF8で追っていくと
追っていっているなら、コマンドボタンのチェンジイベントに行く
前のコード知ってますよね?
そこから辿れませんか?
連投しつれい。
0526デフォルトの名無しさん2015/10/23(金) 16:43:46.01ID:vuxsJR4x
>>517
俺も昔同じようなこと経験したな。
初心者なりにいろいろ試したけど結局解決せず、
イベントプロシージャを使わない方法に変更したなー
0527デフォルトの名無しさん2015/10/23(金) 16:47:18.61ID:Fl5byCeA
変更チェックを、changedイベントでやるセンスがわからん。
controlsをfor eachで舐めて、typename(control)で判断して、TexTboxなら.text、ComboBoxなら .valueを、;かなんかで繋げて返す関数作る。
For each ctl in me.Controls
 if typename(ctl)="TextBox" then ret=ret&ctl.Text
 :
next
なんて具合に。

で、その画面の初期値をセットし終わったらメンバ変数に関数から取得したその文字列持っておく。

保存時、関数呼び出して、メンバ変数に保存されてる文字列と一致しなかったら、変更あり。
イベントに頼りすぎ。

ComboBoxってValueに値入れたらChanged走るだろ。
TextBoxも、Textに値入れたら。
0528デフォルトの名無しさん2015/10/23(金) 17:05:55.98ID:C4TSXTyD
>>525
コマンドボタンを押した後の動作は

1 編集フラグを確認する変数を確認
2 編集されている場合は上書き確認のメッセージボックスを表示
3 OKボタンが押されれば各コントロールの値を指定するセルに代入するプロシージャ(登録処理)を呼び出す。

問題は3の登録処理プロシージャ内の

.Cells(参照行, 2).Value = ComboBox_受注者.Value
.Cells(参照行, 3).Value = TextBox_見積番号.Value
.Cells(参照行, 5).Value = ComboBox_受注先.Value

の様に対応するセルに各コントロールの値を渡すコード全てで”ComboBox_受注先_Change”が呼び出され実行されます。

入力されるセルは33箇所あるため33回呼び出しています。

>>526
イベントプロシージャを使わないのも選択の一つですが、原因を知りたいというのが一番です。

>>527
Valueに値をいれているのではなくセルに対応するコントロールのValueを渡しているんです。
(セルと対応するコントロールはそれぞれ対になっています)
なのにChangeイベントプロシージャが呼び出されます。
0529デフォルトの名無しさん2015/10/23(金) 17:06:50.36ID:6RpU4G8/
>>527
でもさ、Changeイベントで使う側が納得できるなら
BeforeUpdateイベントでも良くね?
0530デフォルトの名無しさん2015/10/23(金) 17:08:27.14ID:KQKbFmU6
>>517
RowSourceに指定されてるセルの内容が変わってもChange走るみたいだからそれじゃね
0531デフォルトの名無しさん2015/10/23(金) 17:19:50.77ID:C4TSXTyD
>>530
謎のChangeイベントが発生して何度も呼び出されるComboBoxのRowSourceは作業用のデータ格納用の別シートを参照しているんです。
0532デフォルトの名無しさん2015/10/23(金) 17:24:25.81ID:Fl5byCeA
>>528
コンボにセットしてる所が見えないからわからんけど、値で渡せてる?
>>529
Change、発生要因が多すぎ。
取り敢えず内容が変わるか、参照が変わるか、参照先の内容が変わると発生しよる。
0533デフォルトの名無しさん2015/10/23(金) 17:24:41.12ID:KQKbFmU6
>>531
じゃあ知らん。自分で確認しろ
関係ないと思われるコードをちょっとずつ削って行って
最終的にこれ以上削ると現象が発生しなくなるとこまで削れ

そのコード見ても原因がわからないようだったらそのコード晒して再度聞いてみ
0534デフォルトの名無しさん2015/10/23(金) 17:27:05.03ID:6RpU4G8/
>>530
それだ!
俺も確認した。

>>531
RowSourceで設定しないでClearとAddItemで頑張れば解決なんじゃないの?
0535デフォルトの名無しさん2015/10/23(金) 19:50:15.39ID:F3Hmui89
RowSourceってまず使わない機能だよな。
セルの値を弄るならフォーム要らないし、フォームで弄るならセル要らないし。
0536デフォルトの名無しさん2015/10/23(金) 20:09:19.74ID:NKqGTZsQ
Changeイベント編集前と同じ値に変更された時の無駄は気にしないの?
無駄を気にするんだったら編集前の値を保存しておくしかないよ。
0537デフォルトの名無しさん2015/10/23(金) 20:15:34.06ID:AqPItTe/
そもそもEnableEvents=Falseではユーザーフォームのイベントは止まらないよ
0538デフォルトの名無しさん2015/10/23(金) 23:56:25.83ID:gGW/KTGn
>>531
んじゃ、その
>作業用のデータ格納用の別シート
のセルが、代入先セルを参照しちゃってるとか?
気づかないうちにそうなってしまってる可能性はあるかもしれないよ?
てか、それくらいしか思いつかん。
0539デフォルトの名無しさん2015/10/24(土) 13:21:06.86ID:X34FC24z
レベルの低い質問で恐縮ですが。

Sub test()

Sheets.Add after:=ActiveSheet

ActiveSheet.Range("a1").Value = "1"
Sheet1.Range("a1").Value = "2"

End Sub

シートを追加して、追加したシートのA1に1
もともとあったシートのA1に2を代入するマクロについて

実行すると、追加後のシート2がアクティブの状態で終了しているのですがこれはどうしてでしょうか。
素人考えですが、その次の行で、Sheet1.Range("a1").Value = "2"入力している以上、元々あったシート1がアクティブな状態で
終了しないのでしょうか。
0540デフォルトの名無しさん2015/10/24(土) 13:30:11.03ID:NDQYSDCE
たかがセル入力くらいでいちいちシートがアクティブになるなんてイヤだ。

そう思わないか?
0541デフォルトの名無しさん2015/10/24(土) 14:03:12.90ID:YiK6tCta
>>539
代入とかではアクティブシートは変化しないよ
0542デフォルトの名無しさん2015/10/24(土) 14:28:38.49ID:tZ2jAKBl
単純にシートを追加した時点で追加したシートがアクティブになる仕様なだけなんでは。
0543デフォルトの名無しさん2015/10/24(土) 15:23:30.40ID:nr5gFTSO
なんかしらんが元のアクティブシートを覚えておいて
処理後にもっかいアクティブにしときゃええんちゃうか
0544デフォルトの名無しさん2015/10/24(土) 18:32:52.39ID:X34FC24z
>>540->>543
ありがとうございます、代入くらいでは変化しなさそうですね
0545デフォルトの名無しさん2015/10/24(土) 19:56:10.60ID:fS9+MhVN
あんまり関係ない話だけど
vbscriptでexcelマクロ動かした時
シートコピーするとコピー後シートが
ActiveSheetにならなくて
意外に思った時がありました
Worksheet.copyで戻り値がBooleanなのも
その時知ったなぁ…
0546デフォルトの名無しさん2015/10/24(土) 20:18:41.12ID:dOe1BR+K
>>545
>Worksheet.copyで戻り値がBoolean
詳しく

少なくとも2007でオブジェクトブラウザで確認しても戻り値なしだけど
0547デフォルトの名無しさん2015/10/25(日) 08:57:49.95ID:zmxboF+k
vbscript
0548デフォルトの名無しさん2015/10/25(日) 15:31:09.85ID:75RHDcLl
質問です。
どなたか教えてください。

関数でIFを用いて、『a及びbのときはc、d及びeのときはf』とした場合、cやfの出力値をセル内に入力した値に指定する方法はあるのでしょうか?

なかなかうまくいかなくて…
ご教授お願いします。
05495482015/10/25(日) 16:03:49.24ID:ukV3wqdd
あ、板違いでした。
申し訳ありません。
0550デフォルトの名無しさん2015/10/26(月) 21:25:03.69ID:Qg+0FyiQ
データの一覧の中から重複するものを持つ行を削除する二重ループなのですが

With Range(sWB.Worksheets(WORKING_SHEET).Cells(DATA_CELL, lastCol +
1).Address)
For j = (.CurrentRegion.Rows.Count - 1) To 2 Step -1
For k = j - 1 To 1 Step -1
If .Offset(j, 0) = .Offset(k, 0) Then
.Offset(k, 0).EntireRow.Delete
End If
Next k
Next j
End With

これでまわすと、一番上の行が重複していても削除されません
entireRow.deleteで消されることでどのように変わるのかがわかっておらず
どのように修正するのか教えていただけませんか
0551デフォルトの名無しさん2015/10/26(月) 21:59:27.14ID:gOYl/ZIw
>>550
相対位置と絶対位置がごっちゃになってる
ちゃんと追いかけるのが面倒なんで適当に書くけど、修正点は

If .Offset(j - 1, 0) = .Offset(k - 1, 0) Then
.Offset(k - 1, 0).EntireRow.Delete

あたりじゃないかなあ
0552デフォルトの名無しさん2015/10/26(月) 22:45:25.01ID:Qg+0FyiQ
んー、offsetのイメージがまだよく付いていないのです
一番最後にいったらj : 2 , k : 1 で、最後の行(=一番上の行)が判定されて
deleteされると思ってたのです

いただいた修正点ありがとうございます。なんで-1してるのかよくわかっておらず
もう少しご教示いただけると
0553デフォルトの名無しさん2015/10/26(月) 23:28:42.58ID:gOYl/ZIw
>>552
行番号、列番号は1から始まるけどOffsetは0から始まるから、全体から1を引いて数字を合わせないと1行目や1列目が処理されない
0554デフォルトの名無しさん2015/10/26(月) 23:31:26.74ID:Qg+0FyiQ
なるほど。そういうことですか
見直します、ありがとうございます
0555デフォルトの名無しさん2015/10/27(火) 21:04:54.55ID:1/71+vYi
VBAでクラスを使ったコードを書きたいとき
コンストラクタの機能がないようなのですが本当ですか?
無理矢理コンストラクタを実現したい場合どのようにするのが定石ですか?
0556デフォルトの名無しさん2015/10/28(水) 00:35:48.79ID:/L6hupTJ
shellを使わずにディレクトリを指定したフォルダを開く方法はありますか?
0557デフォルトの名無しさん2015/10/28(水) 00:41:50.97ID:uQQgy6QZ
>>555
ないのであきらめてinitとか適当なメソッド作って妥協
0558デフォルトの名無しさん2015/10/28(水) 00:58:57.54ID:MiGgg8V7
>>555
生成した直後に自前の初期化用メソッドを生成元から呼び出します。

こっちも質問です。
シングルトンなクラスを作りたいんですが、標準モジュールを介さないで作る方法はありますか?

標準モジュールを介すると、役割付けが難しくなったり、
専用の標準モジュールを用意したりしないといけなくなるから
出来れば直接クラスからインスタンスを取得する方法が知りたいです。
0559デフォルトの名無しさん2015/10/28(水) 03:16:35.85ID:Dygk5TrA
>>558
>シングルトンなクラス
知ってるとは思うけど、VBAで頑張るより
.NetからVBA使う方が早いよ。
というか、そこまでの要求に応える言語じゃないと思ってる。
0560デフォルトの名無しさん2015/10/28(水) 07:51:32.81ID:MiGgg8V7
>>559
今の仕事場の環境がVB6.0とEXCEL2003くらいしか無いから困っているのです。

VB6.0とVBAはほぼ同じ言語仕様と理解していますが、VB6.0かb蹙XCELを操作すると
EXCELのファイルを開くところのロジックから作成したり、Objectの解放を考慮したりと、
大掛かりになる割に根本的なところが解決しないのと、
システムに絡めると言うより、ツールとして単体で作成するものなので、VBA側で行いたいと思っています。

仰る通り.NetFreamworkが入れられればいいのですが、旧態依然とした社風の仕事場で、申請許可が下りないのです。
0561デフォルトの名無しさん2015/10/28(水) 09:19:30.50ID:YN+o7H1O
excel2003とか化石じゃないかw
0562デフォルトの名無しさん2015/10/28(水) 10:16:30.17ID:h5jRX9Pz
>>555
VBEでクラスモジュールを選択後、オブジェクト選択コンボボックスでClassを選択すると、
プロシージャコンボボックスでコンストラクタとデストラクタを選択できるようになる。
0563デフォルトの名無しさん2015/10/28(水) 10:23:12.86ID:h5jRX9Pz
>>559
> .NetからVBA使う方が早いよ。
VBAで呼び出しエントリを作って、.Netからは基本1回呼び出すだけ、処理はVBA内部で全部行う、
ってのが速い。
呼び出しコスト高杉なので、ループして.NetからVBAのメソッド呼び出しやオブジェクト操作なんか
すると目も当てられないことになる。
0564デフォルトの名無しさん2015/10/28(水) 10:27:37.32ID:h5jRX9Pz
>>555
そうそう、Class_Initialize()には引数は渡せないから、引数を渡してインスタンスを作りたいなら、
標準モジュールなんかにBuilderメソッドを作るしかない。
0565デフォルトの名無しさん2015/10/28(水) 12:08:47.68ID:DbWn1xdh
Createなんちゃら、ね
0566デフォルトの名無しさん2015/10/28(水) 17:03:07.27ID:Dygk5TrA
>>560,563
うーん、作るシステムにもよるんだけども、
I/O部分だけがExcelで済むのなら、
関数は.Netにもあるので言語をVBAにこだわる必要は無いよって
言いたかっただけなんだ。
あと、I/Oで早くするテクニックあるみたいよ(ググてね

>>560
>VBA側で行いたいと思っています。
オブジェクト指向的なプログラミングに関しては入門以下レベルだから、
VBAだと無理だと思う。
0567デフォルトの名無しさん2015/10/28(水) 17:08:53.22ID:JFpDXlQ+
VBAでやりたいとか言いながら、標準モジュールは使わないとか変な縛り入れるのは何考えてるんだろ
無いものを何とかする方法を探すのはまだ理解できるが、使えるもの使わないで違う方法探すのは
それなりの理由が無ければアホとしか言えん
0568デフォルトの名無しさん2015/10/28(水) 17:26:12.69ID:h5jRX9Pz
>>566
> 関数は.Netにもあるので言語をVBAにこだわる必要は無いよって
> 言いたかっただけなんだ。
.Netの機能そのものを使いたいなら、VBAで.Netの機能を使えばいいし。

> あと、I/Oで早くするテクニックあるみたいよ(ググてね
なんのことかわからないけど、呼び出し(アクセス)速度は速くできないのでは?
0569デフォルトの名無しさん2015/10/28(水) 19:08:09.22ID:8zJiOHJK
>>560
旧態依然な環境なら旧態依然な作り方しなよ

それか Excel 2003 なんて使ってる会社ならセキュリティなんて考えてないだろうから Visual Studio Community とか Express 入れてもばれないじゃね?
0570デフォルトの名無しさん2015/10/28(水) 19:22:24.06ID:Dygk5TrA
>>567
それって標準モジュールの利点と欠点を理解してないってことだよね。
突き詰めると、ThisWorkbook、Sheetとフォームとあとクラスモジュールを
どう使い分けるかを考えているのかどうか・・・あやしいよね。
0571デフォルトの名無しさん2015/10/28(水) 19:33:28.76ID:JCr0Dqqv
>>569
いや、もしかするとXPかもしれないぞ...
0572デフォルトの名無しさん2015/10/28(水) 19:48:12.05ID:8zJiOHJK
>>571
なので Express って書いてある
2010 までは XP でいけたと思う
0573デフォルトの名無しさん2015/10/28(水) 20:00:26.65ID:RbX1jPDs
>>568
>なんのことかわからないけど、呼び出し(アクセス)速度は速くできないのでは?

FSO使ってcsvをテキストファイルとして呼び出すのと、
Workbooks.Openメソッドで呼び出すのでは速度が違うとかそんな話なのかもしれない。


ところでDirectX3DのDLLって参照設定→参照でファイル名に「D3D」って入れると8〜11まで出てくるのに、
どれを選択しても「指定されたファイルへの参照は登録できません。」とエラー返されて終わるんだけど、
これって参照する方法ない?
0574デフォルトの名無しさん2015/10/28(水) 20:14:00.02ID:JCr0Dqqv
>>572
2010ってまだDLできたっけ?
0575デフォルトの名無しさん2015/10/28(水) 20:16:42.33ID:+AokFIEu
システム開発をしているのですが
オブジェクトの解放をしていなかったせいか。そのexcelファイルを開いて少し時間が経つとパソコンが全く動かなくなる現象が起きるようになりました
この場合、一旦すべてのオブジェクトを解放したほうがよいのでしょうか
その場合どのようにすればよいのでしょうか
0576デフォルトの名無しさん2015/10/28(水) 20:22:46.47ID:JCr0Dqqv
かなり理想に近い文章だ
0577デフォルトの名無しさん2015/10/28(水) 20:39:43.23ID:RbX1jPDs
オブジェクトの解放ってつまり掴んだメモリーを解放するって事?
VBAでは出来ないだろ。
0578デフォルトの名無しさん2015/10/28(水) 21:02:24.11ID:ESD9qix2
>>574
https://go.microsoft.com/?linkid=9709969
0579デフォルトの名無しさん2015/10/28(水) 21:24:06.01ID:vlhaUrmX
VBAに不可能などない(キリッ
0580デフォルトの名無しさん2015/10/28(水) 21:26:25.73ID:9zUX3+we
>>575
>そのexcelファイルを開いて少し時間が経つとパソコンが全く動かなくなる現象
ういるすじゃなかろか
0581デフォルトの名無しさん2015/10/28(水) 22:27:44.68ID:/L6hupTJ
>>575
難しいことはよくわからないけど10回に1回ぐらいそのマクロブックを保存するようにすると解決するかも。それでも重ければ毎回保存。
0582デフォルトの名無しさん2015/10/28(水) 23:50:57.84ID:Dygk5TrA
>>575
他のPCで実行してもそうなるのならコードを見直したほうがいいかもね。
0583デフォルトの名無しさん2015/10/29(木) 19:42:57.11ID:mqryS2Fp
質問です。

複数のdoc,docx 更にxlsx,xlsファイルのシート全てをpdfで保存する という動作をマクロで実現したい場合、以下のサイト様に紹介されているコードをどのように作り変えればよろしいでしょうか(どのようなコードを追加すればよろしいでしょうか)。
仕事で複数のファイルをどうしても一気にpdf化したいのです。お願いいたします。

「複数のWord文書をWordだけで連続PDF変換するマクロ作りました」とぐぐると一番上に出てくるHP
0584デフォルトの名無しさん2015/10/29(木) 21:29:42.58ID:RzJI2h1p
>>583
回答です
ttp://itpro.nikkeibp.co.jp/article/COLUMN/20140325/545792
0585デフォルトの名無しさん2015/10/29(木) 22:47:29.00ID:xm7GMR+N
>>24
今の所おれははない
0586デフォルトの名無しさん2015/10/29(木) 22:50:42.61ID:8NhOSfbI
1 -4.83
2 -0.97
3 -1.75
4 2.54
5 1.54
6 0.28
7 -0.18
8 -3.95
9 -3.61

ソートして大きい順に左の値を書き出すっていうマクロってどういう風に作ればいいですか。
0587デフォルトの名無しさん2015/10/29(木) 23:01:38.04ID:u08gCeGN
>>586
普通にシートでソートすればいいんじゃね?
http://officetanaka.net/excel/vba/tips/tips148.htm

VBA ONLYなら
配列に入れて ソートする(ソートアルゴリズムは自分で実装する)
0588デフォルトの名無しさん2015/10/29(木) 23:06:23.91ID:Q2L1bFVS
Rangeソートはめっちゃ速いぞ
VBAで自力ソートはいくらアルゴリズムを工夫しても太刀打ちできない
0589デフォルトの名無しさん2015/10/29(木) 23:14:00.65ID:LDv0f1Xe
>>588
そうか?
確認してみよう
0590デフォルトの名無しさん2015/10/29(木) 23:16:37.42ID:8NhOSfbI
>>587
>>588

連想配列とか使ってやれるかと思ってたんだけども rangeオブジェクトのがいいんだ
あざっすあざっす
0591デフォルトの名無しさん2015/10/29(木) 23:18:42.11ID:dmkvBav+
>>575
CPU使用率・メモリの使用量などを、チェックすれば?
0592デフォルトの名無しさん2015/10/29(木) 23:29:58.68ID:LDv0f1Xe
>>588
手元の環境で実測してみた

1.[A1:A1048576] に =Rand() を入れ、値コピーして固定する。
 Columns("A:A")をソートする。
  → 平均 1052ms

2.[A1:A1048576] を配列に入れる。
 その配列をソートしたときのインデックスを出力する
  → 平均 250ms
 インデックスを出力するのに引き続いて、そのインデックスに基づいてソートする
  → 平均 1340ms


「配列に入れる」部分の時間は含んでいない
0593デフォルトの名無しさん2015/10/30(金) 04:43:34.03ID:o6oPjLK7
>>592
配列でソートしたときの時間が出力も込みなら、どうやって出力したかも書いとけよ

ソートのアルゴリズムなんてかなり研究されてるから、そこに速度差が出る要素は少ないだろう
自前ソートが相対的に遅いのは、ソートそのものじゃなくてセルへの入出力に時間かかるからだし
0594デフォルトの名無しさん2015/10/30(金) 08:04:22.71ID:FKezdCzi
>>593
出力?
0595デフォルトの名無しさん2015/10/30(金) 11:34:20.61ID:MOhQGiL+
わざわざ自前でソートアルゴリズム組んだなら結果をいちいちセルに書き出したりしない。
0596デフォルトの名無しさん2015/10/30(金) 20:52:36.34ID:gPbmFrsE
>>592
えーとExcelでカラム1個だけソートなんてほぼありえないからA-Z辺りまでやってみては
VBAでRangeから受けた二次元配列のソートってどうやるんだったか
0597デフォルトの名無しさん2015/10/30(金) 23:15:04.12ID:AOFIcsmi
>>596
ソートのキーはどれか1カラムの値でいいの?
0598デフォルトの名無しさん2015/10/30(金) 23:49:36.47ID:AOFIcsmi
>>596
とりあえず実測してみた

1.[A1:Z1048576] に =Rand() を入れ、値コピーして固定する。
 Columns("A:A")をキーにしてシート上でソートする。
  → 平均 9495ms

2.[A1:Z1048576] を配列に入れる。
 最初の列をキーにしたインデックスを求め、そのインデックスに基づいて配列をソートする。
  → 平均 8923ms
   「配列に入れる」部分の時間は含んでいないし、結果をシートに書き込んでもいない。

どちらも3回やった結果の平均。
0599デフォルトの名無しさん2015/10/30(金) 23:52:59.57ID:AOFIcsmi
あ、もちろんソート前の[A1:Z1048576] の値を配列に入れてます。
0600デフォルトの名無しさん2015/10/31(土) 00:03:58.25ID:lS/K1V20
>>584
登録したありがとう
できればワードのマクロで、docもxlsも一気に行きたいです。
エクセルで個人用マクロブック使うと、会社のセキュリティに「使えません」などと言われるから使えん…(何故かワードの方はマクロ使える)
0601デフォルトの名無しさん2015/10/31(土) 02:17:06.29ID:XywDLt1T
If (Cells(i, 2 * j + 1).Value Like "*あいうえお*" And Not Cells(i, 2 * j) Is Nothing) Then

これでifの判定終わった後に Cells(i,2*j)の演算あるんだけど エラー出るんだがなんでやねん
0602デフォルトの名無しさん2015/10/31(土) 02:35:03.94ID:XywDLt1T
>>601 And Not Cells(i,2*j)="") Then でいけたけど
なんか釈然としねぇ 
0603デフォルトの名無しさん2015/10/31(土) 03:18:57.02ID:3FqIgxLp
演算子の優先順位は大丈夫か
0604デフォルトの名無しさん2015/10/31(土) 03:28:53.63ID:CVsb3S4r
>>601
なんでエラーの内容すら書かないのかねぇ
2007で試したけどcellsが範囲内ならエラーにはならなかった
EXCELのバージョンとエラーメッセージと、その時のi,jの値と該当セルの内容書け
0605デフォルトの名無しさん2015/10/31(土) 03:39:30.73ID:CVsb3S4r
>>598
ワークシートのソートは、まさにセルの並べ替えで、セルの書式情報込みで入れ替えて表示するから
書式どころかシートに結果出力しない状態と比べるのは条件に差がありすぎる気がする

入力も出力もシートじゃない前提ならEXCEL VBAを使うという選択そのものが疑問だし
0606デフォルトの名無しさん2015/10/31(土) 03:48:14.30ID:wDT+WWan
>>601
VBAにおける Nothing の意味を勘違いしてる気がするにゃ
0607デフォルトの名無しさん2015/10/31(土) 10:34:42.28ID:TXrsCx/i
特定のシートのイベントを一時的に停止させることはできますか?
Application.EnableEvents=False だと全てのイベントが停止されてしまいます
0608デフォルトの名無しさん2015/10/31(土) 10:35:57.41ID:D29NBcNU
>>605
データをソートするのは一連の処理の中の一部分に過ぎないので、そこだけを入出力の対象にするという発想はあまりない。
どちらかというと、配列処理の途中でソートするときだけは(スピードの観点で)シートへの入出力をすべきなのか、
という問題意識なんだと思います。
0609デフォルトの名無しさん2015/10/31(土) 12:11:30.86ID:hbeSIkWk
>>607
無理
別シートどころか、関係なさそうな別ブックですら止まる
独自にフラグ管理でもするしかない
0610デフォルトの名無しさん2015/10/31(土) 13:40:49.31ID:TXrsCx/i
>>609
無理ですか・・・
そのフラグ管理でどうにかしてみます。
ありがとうございました。
0611デフォルトの名無しさん2015/10/31(土) 18:52:09.69ID:CVsb3S4r
>>608
ああ、そういえばもともと、データの入力元も出力先も想定されてない話だったな

まず、VBAにソートはない
適当なソートライブラリがあるか、効率的なソートがすらすら書ける人なら自前でソートすればいい
でもそれが出来る人はこんなとこでそんな質問しないだろうから
シートに書き出してソートしろでいいんじゃね

速度差を問題にするならもうちょい条件を限定しないとダメだね
すくなくとも>>588はテストまでして反論するほどの説得力のある意見ではないわ
0612デフォルトの名無しさん2015/10/31(土) 18:59:15.08ID:t9Rmpodd
FSOつかっての再帰呼び出しを用いたファイル・フォルダの列挙の際に、if分書いて列挙するファイルを絞ってるんですが、ルートフォルダ内の全部のファイル一度みにいくため遅いのですが、fileseachオブジェクト使うとかなり早くなりますか?
0613デフォルトの名無しさん2015/10/31(土) 19:15:15.41ID:wDT+WWan
遅い・・・そして 代替え策(案)はある・・・
なら 実際に試してみれば いいじゃん
なにを躊躇してるの?
0614デフォルトの名無しさん2015/10/31(土) 20:13:02.37ID:35yXB8xC
教えたがりのくせに知らない事を聞かれると機嫌が悪くなる人w
0615デフォルトの名無しさん2015/10/31(土) 22:08:54.90ID:RIZFllKe
速度に不満が出てきたらFindFirstFileW使えばいいのよ
FindFirstFileAはUNICODEなファイル名読めないから使っちゃダメよ
0616デフォルトの名無しさん2015/10/31(土) 22:33:22.81ID:XywDLt1T
>>604 型が違うとかだったわ  ってかそもそもセルの中に値がなければその演算は行われないはずなんだよ
Nothing の意味を履き違えてるってことか
0617デフォルトの名無しさん2015/10/31(土) 22:35:21.19ID:TuS0NuwD
>>615
>UNICODEなファイル名読めないから使っちゃダメよ

それはどうだろう?
0618デフォルトの名無しさん2015/10/31(土) 22:41:22.09ID:35yXB8xC
ハーフポテトな俺たちに使えないものはないのよ
0619デフォルトの名無しさん2015/10/31(土) 22:42:56.14ID:j45KtvGb
>>612
というより、、、
>ルートフォルダ内の全部のファイル一度みにいくため遅いのですが
これを直さないと根本的に早くならないのでは?
0620デフォルトの名無しさん2015/10/31(土) 23:20:04.79ID:RIZFllKe
VB系ってEmptyとNullとNothingと0の扱いで意外とめんどくさい
0621デフォルトの名無しさん2015/10/31(土) 23:25:53.39ID:CVsb3S4r
>>616
もしお前が
If 条件A And 条件B という判定式で、条件Aが偽のとき条件Bが評価されないはず
と思っているなら、それは間違ってる
VBAはショートサーキット評価しない

ちなみに、>>601の式は、前と後ろでcellsの位置が違うから
前はちゃんとしたセルでも後ろは変なとこ参照するかもしれんぞ
まあ、コピペミスとかならいいけど

Nothingの意味はどう思ってるか知らんが、Cellsメソッド(かプロパティか)がNothingになることなんて多分ないと思うぞ
それはつまり不正なセルを参照しようとしてるってことで、その段階でおそらくエラーになる
0622デフォルトの名無しさん2015/10/31(土) 23:32:51.35ID:35yXB8xC
多分かよw
0623デフォルトの名無しさん2015/10/31(土) 23:38:54.72ID:3FqIgxLp
>>620
"" も入れてやってくれ
0624デフォルトの名無しさん2015/10/31(土) 23:46:48.36ID:TuS0NuwD
?IsMissing(Array())
True

もな
0625デフォルトの名無しさん2015/10/31(土) 23:47:00.48ID:CVsb3S4r
多分だよ
俺の経験上そうなだけで
MSの中の人でもないし、ない事を証明する事は出来ないから
0626デフォルトの名無しさん2015/11/01(日) 01:02:16.45ID:nNAG54N5
質問します。
以下のようにブックを追加して
Dim ExcelSheet As Object

sub hoge()
Set ExcelSheet = CreateObject("Excel.Sheet")

新しいブックExcelSheetのクローズイベントはどうやって拾えばよいのでしょうか
office2013です
よろしくお願いします
0627デフォルトの名無しさん2015/11/01(日) 01:14:19.28ID:4JFTzKCv
>>615
トンです。
API使うと早いんですか。コマンドのTREE /F、DIRとかの出力したものから拾う方が早いですかね。
0628デフォルトの名無しさん2015/11/01(日) 14:42:44.34ID:Ur9dhwuU
Excelのセルを使って
倉庫番を作りたいんですが
どうやったらいいんですか?
(´・ω・`)
0629デフォルトの名無しさん2015/11/01(日) 15:01:20.63ID:hA7HJBKq
おっさん
0630デフォルトの名無しさん2015/11/01(日) 15:26:57.79ID:VR25FJJg
>>628
その手の本が何冊か出ていますので買って勉強してください
0631デフォルトの名無しさん2015/11/01(日) 16:28:43.99ID:NTAf7jEe
まずはThinking rabbitに許可を取って下さい
0632デフォルトの名無しさん2015/11/01(日) 19:43:53.71ID:U7qRUw2S
売るの?
0633デフォルトの名無しさん2015/11/01(日) 20:11:34.06ID:HrqCcPCl
売らなくても「倉庫番」として発表したら著作権違反やで。
0634デフォルトの名無しさん2015/11/01(日) 20:28:04.95ID:8wBAqxRo
>>633
フルスクラッチで開発すれば著作権違反にはならんよ
商標権の侵害にはなるけど
0635デフォルトの名無しさん2015/11/01(日) 20:28:13.91ID:U7qRUw2S
じゃあ物置番で
0636デフォルトの名無しさん2015/11/02(月) 00:03:58.10ID:XspLzh3/
自分質問いいすか?
adodb.connectionってクローズしないまま終了するとやばい?それとも勝手にクローズしてくれる?
0637デフォルトの名無しさん2015/11/02(月) 01:42:57.39ID:SpPr0mCa
ADODBはインプロセスサーバだからいきなり終了しても大丈夫だよ
Excelなんかのアウトプロセスサーバは放置すると残ったままなのでやばい
0638デフォルトの名無しさん2015/11/02(月) 01:53:58.03ID:XspLzh3/
>>637
あざっす
0639デフォルトの名無しさん2015/11/02(月) 04:39:39.39ID:XPI4A8M9
>>626
[ThisWorkbook]モジュールへ
Public WithEvents Wb As Workbook
Private Sub WB_BeforeClose(Cancel As Boolean)
 Debug.Print "CLOSEします"
 Set Wb = Nothing
End Sub

んで
 Set ExcelSheet = CreateObject("Excel.Sheet")
 Set ThisWorkbook.Wb = ExcelSheet

所で
Workbooks.Add
で新規Workbookは作成できるけどわざわざ
CreateObject("Excel.Sheet")してる理由は何?
0640デフォルトの名無しさん2015/11/02(月) 22:50:06.16ID:TbNPfhjV
>>558
亀レスで申し訳ない。標準モジュールを介さないと言うのは難しいけど、
役割付けと言う意味では標準モジュールからクラスを生成してそこからインスタンスを取得するんじゃなくて、
クラスのメソッドやプロパティに標準モジュールの関数やプロパティを移譲してやることで
クラスの役割を崩さず使うことができるよ。

標準モジュールは増えるけど、クラスのコンストラクタで自分自身を生成して標準モジュールにそのインスタンスを格納すれば
クラスにGetInstanceメソッドを作って、そこから標準モジュールに格納したインスタンスを引っ張り出したり、
インスタンスのメソッドから移譲した標準モジュールのプロパティや関数を使用すればVB.Netで言うシェアードなメソッドやプロパティと
同じ効力を持たせることも出来る。

以前、属性を使えばクラスのみでシングルトンパターンを使えるような記述をどこかのページで見かけたけど、
長い目で見た場合こっちの方法もありだと思うよ。
0641デフォルトの名無しさん2015/11/03(火) 11:14:27.16ID:envUuh/v
>>639
ddです
できました。

ぐぐってもクラスモジュール使う方法とかしかなかったので
もっとスマートな方法が無いかなと思って。

>所で
>Workbooks.Add
>で新規Workbookは作成できるけどわざわざ
>CreateObject("Excel.Sheet")してる理由は何?
引き継ぎなんですよー、VBA触ったことのない俺にw

重ねてありがとう
0642デフォルトの名無しさん2015/11/03(火) 14:09:19.29ID:Y3S792fP
Dim t As Single
t = t + 0.1
こんな感じで足していくと丸め誤差ってやつが出てしまうので

Cells(1, 1) = Cells(1, 1) + Cells(r, c)
こんな感じにしようかと思うのですが、処理時間に大きな差がありますか?
0643デフォルトの名無しさん2015/11/03(火) 14:17:14.10ID:EOXYkI6s
>>642
Range型は処理が激重なので、Cell(1,1)〜Cell(rn,cn)を扱う場合は、
x = Range(Cells(1,1),Cells(rn,cn)).Value の様に二次元配列xに値を納めてからやるべき。
0644デフォルトの名無しさん2015/11/03(火) 14:28:23.16ID:Y3S792fP
>>643
激重でしたか・・・質問してよかったです。
その方法でやってみます。ありがとうございました。
0645デフォルトの名無しさん2015/11/03(火) 17:29:39.02ID:jJ+fP6VB
誤差の解消とどう結び付くのか?
0646デフォルトの名無しさん2015/11/03(火) 18:07:42.77ID:AG29+Pby
変数を介さずセルの値を直接演算すると丸め誤差が出ないのか?
初耳だが
0647デフォルトの名無しさん2015/11/03(火) 18:39:28.88ID:lYNSYSuY
As Singleを使う意図は?
0648デフォルトの名無しさん2015/11/03(火) 19:56:34.10ID:eldm4iEB
まだ未婚でシングルですので。
0649デフォルトの名無しさん2015/11/03(火) 19:59:48.72ID:j/7KwPnc
あ?ゼクシィ送りつけんぞダボが
0650デフォルトの名無しさん2015/11/03(火) 20:17:35.40ID:Y3S792fP
'→1にならない
Dim t As Single '単精度浮動小数点型
For i = 1 To 10
t = t + 0.1
Next i
──────────────
'Cells(9, 1)に0.1 →1になる
For i = 1 To 10
Cells(10, 1) = Cells(10, 1) + Cells(9, 1)
Next i
──────────────
'Range("A1:A10")に0.1 →1になる 
Dim H As Variant

H = Range("A1:A10")

For i = 1 To 10
Cells(12, 1) = H(i, 1) + Cells(12, 1)
Next i

>>645-647
自分なりにまとめてみたらこんな感じです。間違ってたらご指摘お願いします。
0651デフォルトの名無しさん2015/11/03(火) 20:32:20.50ID:iqBK8kpI
発想がおもしろいやつだな、その探究心は見習うべきもんがあるぞw
けど少数使いたいときはcurrency型使っとけ
0652デフォルトの名無しさん2015/11/03(火) 20:52:08.16ID:aZDmPuCy
>>650
それ1になるようでなってないよ。

Cells(12, 1) = 1.0
がFalseになるから試してみ?
0653デフォルトの名無しさん2015/11/03(火) 21:10:28.16ID:iKi9OwRH
>>650
これ試してみ

Sub macro1()
For i = 1 To 10
Cells(i, 1) = 0.1
Next i

Cells(12, 1) = 0
For i = 1 To 10
Cells(12, 1) = Cells(i, 1) + Cells(12, 1)
Next i

If Cells(12, 1) = 1 Then
Cells(13, 1) = "1です"
Else
Cells(13, 1) = "1ではありません"
End If
End Sub
0654デフォルトの名無しさん2015/11/03(火) 21:40:52.93ID:Y3S792fP
>>653
1です。
0655デフォルトの名無しさん2015/11/04(水) 01:31:57.49ID:tOBmWAwg
Win7Pro 64bit / Excel2010 64bitでの結果
http://i.imgur.com/VD1eyQN.png
0656デフォルトの名無しさん2015/11/04(水) 11:15:12.76ID:9QhHdSU3
継承の使えないVBAのクラスで
継承を実現するための定石はどうすることですか?
0657デフォルトの名無しさん2015/11/04(水) 11:16:32.91ID:gy7yyt3H
使わない(キリッ
0658デフォルトの名無しさん2015/11/04(水) 11:27:08.15ID:9QhHdSU3
こらそれは単純なプログラミングしかしないからだ
0659デフォルトの名無しさん2015/11/04(水) 11:29:19.55ID:Ws0cACQx
単純な事しかやった事ない
0660デフォルトの名無しさん2015/11/04(水) 11:49:04.84ID:fAjxwUJy
>>640
よくわからないけど、Module1.basにFunction getClass1Instance() as Class1を作る方が簡単じゃない?
0661デフォルトの名無しさん2015/11/04(水) 12:54:56.62ID:8eLhc3Ee
別に継承なくても複雑なプログラム書けるだろ
0662デフォルトの名無しさん2015/11/04(水) 13:20:30.30ID:GJw+yxSj
個人的な意見としては
EXCEL機能(VBAのではなく)範囲で利用する限りにおいて
継承が必要?って気もするな

有ったら便利かもだけど 無くても不便ではないと思う

元レスの定石云々は あまり気にしても仕方ない気がするな
0663デフォルトの名無しさん2015/11/04(水) 17:48:05.55ID:dQvoR8qC
VBAの文法がJavaScriptだったら
こんなに苦痛を感じないで済んだのになぁ
(´・ω・`)
0664デフォルトの名無しさん2015/11/04(水) 18:06:00.90ID:eiHA5R2A
Netの流儀をVBAに持ち込もうとすんなよ
0665デフォルトの名無しさん2015/11/04(水) 18:34:56.05ID:fAjxwUJy
.Netだったらーとか、.NetからVBA使えーとか言う奴増えたな
0666デフォルトの名無しさん2015/11/04(水) 19:16:16.17ID:cuFny4hP
どっと増えた
0667デフォルトの名無しさん2015/11/04(水) 19:35:21.74ID:8eLhc3Ee
どっと混む
とかあったなー
0668デフォルトの名無しさん2015/11/04(水) 19:47:56.51ID:JYWBjL30
.netでexcel操作するのってcomの解放とか面倒なんじゃないの?
今は違うのか?
0669デフォルトの名無しさん2015/11/04(水) 19:58:31.14ID:d5XQkmlg
クラスのメンバ変数として継承したいクラスを宣言しておけば継承と似たようなもんだろ。
0670デフォルトの名無しさん2015/11/04(水) 20:04:13.26ID:8eLhc3Ee
>>668
今でも面倒みたい
とりあえず必要なオブジェクトは IDisposable を継承して解放させる様にするだけでだいたい解消すると思うのに、自分で解放しろとか
マジでMSの考えてることはわからん
0671デフォルトの名無しさん2015/11/04(水) 20:07:20.36ID:oSFsMrp6
なんで、VBAでクラスの継承したいとか言い出してるのさ?
出来ない事を見つけるとやりたくなる阿呆とかか?
0672デフォルトの名無しさん2015/11/04(水) 20:15:26.95ID:oSFsMrp6
>>659
正確には、単純なことしかVBAではやらないっ!
だよ(*'-')b
0673デフォルトの名無しさん2015/11/04(水) 20:47:39.42ID:8eLhc3Ee
>>671
中途半端にクラスがあるからでしょ
定期的に沸いてくる
0674デフォルトの名無しさん2015/11/04(水) 21:00:48.88ID:oSFsMrp6
>>673
クラスクラスっていうけどさ、SheetもThisWorkbookもUserFormもクラスなんだけどね。
ちなみに、亀だけどシングルトン的に使うならThisWorkbookに作るのがおススメ。
本当に1つしか作れないし、実行時にインスタンス化(笑)も実施済みだけど。
Sheetに作ればワークシート作った分だけ用意できるけど、悪いことはいわない辞めておけw
標準モジュールでも出来るけど、関数名が被らない限り他モジュールから実行しちゃうんだよねぇ
0675デフォルトの名無しさん2015/11/04(水) 21:48:30.63ID:5MHDxyEy
>>674
何言ってるんだ?
独り言ならチラ裏にでも書いとけよ
0676デフォルトの名無しさん2015/11/04(水) 22:05:25.32ID:+mbJDLgZ
質問があります。どなたか教えて下さい。
Worksheets(1)のCells(1,"A")からCells(5,"A")には数字の1が記入されています。
以下のコードを実行したところ、i = 2 のときに"注"行を実行したところ、
Worksheets(1).Cells(1,"A")の値が消えてしまいました。

"注"行の先頭に"Set"が抜けていたことで思った通りの動作をしてくれなかったことは分かっています。
しかし、"Set"がなかったことで、なぜCells(1,"A")の値が消えてしまったのか理解できないのです。
どなたか解説していただけないでしょうか?


Public Sub test()

Dim i As Long
Dim ws As Worksheet
Dim myRange As Range
Set ws = ThisWorkbook.Worksheets(1)

For i = 1 To 5

If myRange Is Nothing Then
Set myRange = Cells(i, "A")
Else
myRange = Union(myRange, Cells(i, "A")) '注
End If

myRange.Select

Next i

End Sub
06776762015/11/04(水) 22:12:02.06ID:+mbJDLgZ
>>676に過ちがありました。
>>676を書き直します

質問があります。どなたか教えて下さい。
Worksheets(1)のCells(1,"A")からCells(5,"A")には数字の1が記入されています。
以下のコードを実行したところ、i = 2 のときに"注"行を実行したところ、
Worksheets(1).Cells(1,"A")の値が消えてしまいました。

"注"行の先頭に"Set"が抜けていたことで思った通りの動作をしてくれなかったことは分かっています。
しかし、"Set"がなかったことで、なぜCells(1,"A")の値が消えてしまったのか理解できないのです。
どなたか解説していただけないでしょうか?

Public Sub test()

Dim i As Long
Dim ws As Worksheet
Dim myRange As Range
Set ws = ThisWorkbook.Worksheets(1)

For i = 1 To 5

If myRange Is Nothing Then
Set myRange = ws.Cells(i, "A")
Else
myRange = Union(myRange, ws.Cells(i, "A")) '注
End If

myRange.Select

Next i

End Sub
0678デフォルトの名無しさん2015/11/04(水) 23:14:50.77ID:oGNSx2wd
>>656
継承先のクラスで継承元のインスタンスを生成して、
継承先に継承元の同名のメソッドやプロパティを同じシグネチャで作成して
継承元の対応したメソッドやプロパティに引き渡す。
0679デフォルトの名無しさん2015/11/04(水) 23:18:40.71ID:oGNSx2wd
>>674
それって複数のシングルトンクラスを設定したい場合どうするの?
0680デフォルトの名無しさん2015/11/05(木) 00:23:27.61ID:Y8qhuNI+
>>677
myRange = 〜

myRange.Value = 〜
の省略というだけのことなんじゃないの?
0681デフォルトの名無しさん2015/11/05(木) 03:20:53.20ID:SGiJi440
>678
なんの為の継承なんだかわからんコンポジしか作れませんけどね。。。
0682デフォルトの名無しさん2015/11/05(木) 03:23:59.24ID:SGiJi440
>>679
ワークシートに作るとか、UserFormに作ればいいんじゃね?
ただ、VBAでそこまでやる意味は、俺にはさっぱりわからんw
0683デフォルトの名無しさん2015/11/05(木) 06:33:22.89ID:3o5h/iDf
>>681
結局のところ、インタフェースで多態性を持たせるとき同じ挙動をさせたいメソッドやプロパティのシグネチャ合わせだよ。

だからコンポジションかと言われればコンポジション以外の何物でもないけど、
多重継承やオーバーライドを考えると全く意味がない訳でもない。
0684デフォルトの名無しさん2015/11/05(木) 07:25:10.38ID:3o5h/iDf
>>682
確かに暗黙のインスタンスを使えば実装は可能だね。

有り無しで言えば意見が分かれるところだろうけど、
あくまで俺個人の意見として言わせて貰えれば、
データモデル的に考えてViewに当たるものに
その辺のロジックを組み込むのってどうなの?
と思ってしまう。

今回の話はシングルトンの話なので、
シングルトンに限ればそれでいいのかもとも思うけど、
特定のメソッドやプロパティを同じクラスから生成したとき共通で使えるように出来ることを考えると、
>>640みたいのがいいと思う。

ただ、クラスと標準モジュールの2つが必要になるし、
シングルトンと言っておいて生成が必要になるのがちょっとアレだけど。
0685デフォルトの名無しさん2015/11/05(木) 09:48:04.61ID:L/V1S2sC
VBAのクラスって型の制約として使えるの?
つまり (ByRef a As myClass) というシグネチャーの引数にmyClassまたはその派生型以外のものを渡すと実行前に検出してくれる?
0686デフォルトの名無しさん2015/11/05(木) 10:10:18.65ID:raJNtqbt
>>685
> つまり (ByRef a As myClass) というシグネチャーの引数にmyClassまたはその派生型以外のものを渡すと実行前に検出してくれる?

Sub Foo(ByRef a As myClass)
End Sub

Sub Bar()
  Foo 1
End Sub

ってやってみればすぐにわかるよね。
0687デフォルトの名無しさん2015/11/05(木) 16:14:41.25ID:L/V1S2sC
>>686

Sub Foo(ByRef a As Object)
End Sub

Sub Bar()
  If True Then
    Foo Application
  Else
    Foo 1
  End If
End Sub

とやってエラーになったのでまあ使えることがわかった。
0688デフォルトの名無しさん2015/11/05(木) 16:19:57.94ID:raJNtqbt
>>687
こう書かないと伝わらなかったか。

> 実行前に検出してくれる?
実行しないと検出はできない。
なので、コードに誤りがあるかどうかは、C0カバレッジ100%のテストが必要。
0689デフォルトの名無しさん2015/11/05(木) 16:27:20.95ID:raJNtqbt
あ、>>687を試したら嘘ついてました。

>>687が正しい(実行しなくてもエラーを検出する)。
0690デフォルトの名無しさん2015/11/05(木) 18:44:09.50ID:tNVJsXcL
そもそも1はオブジェクト型じゃないからな
引数の型をObjectにしたら、オブジェク型全てOKになるんだが
一体何がやりたいんだ

あと
myClassで受けるプロシジャにmyClass以外渡しても、変数経由とかだと実行するまでエラーにならんぞ
Sub Foo(ByRef a As myClass)
End Sub

Sub Bar()
Dim x As New otherClass
Foo x
End Sub
とかだと実行時に型が一致しませんでエラーだ
0691デフォルトの名無しさん2015/11/05(木) 19:46:06.77ID:L/V1S2sC
>>690
それだと実際に渡すまではエラー出ないの?
0692デフォルトの名無しさん2015/11/05(木) 19:57:44.30ID:tNVJsXcL
>>691
実行時エラーかコンパイルエラーかしかないだろ
実行時だってんだからそうだよ
てかこのぐらい試せよ

つかむしろ
Foo 1
がコンパイルエラーではじかれる方がびっくりしたわw
0693デフォルトの名無しさん2015/11/05(木) 20:05:23.72ID:L/V1S2sC
>>692
家帰ったら試すが、実行時エラーじゃ型を定義する意味は激減だな。
0694デフォルトの名無しさん2015/11/05(木) 20:11:48.13ID:7jlVzvr3
VBAはオブジェクト指向入門言語ちゃうで
お前らエクセルマクロで何やらかす気やねん
0695デフォルトの名無しさん2015/11/05(木) 21:15:17.87ID:tNVJsXcL
>>693
型を定義するのにどんな意味を求めてるのか知らんが
基本VBAは型にゆるいからな
暗黙の変換と実行時バインドがある時点で、タイプセーフとか無理だし
0696デフォルトの名無しさん2015/11/06(金) 00:39:35.16ID:sPh/1JAe
ExcelVBAでデータをネットワークドライブにCSV出力するプログラムを作ったのですが、
Aと言うユーザが作った後に、Bと言うユーザがファイルを追記で出力しようとすると書き込みエラーになります。
フォルダには両ユーザのフルコントロールの権限をつけたのに、って思ったら
作成されたCSVファイルの権限がAのフルコントロール付いてるけど、
USERSが書き込み、変更権限が付いてない!
どうすれば、Aが作ったファイルを全てのユーザが書き込み、変更できるのでしょうか?
0697デフォルトの名無しさん2015/11/06(金) 04:24:26.81ID:hUa1dWCf
まずそのフォルダにどんなアクセス権付けられてるかちゃんと確認しろ
0698デフォルトの名無しさん2015/11/06(金) 13:29:13.28ID:Asg2U0oe
>>696
そりゃそーだろ、Aが作ったファイルなんだから。
そのファイルにUSERSのアクセス権付けたらいいんじゃないの?
0699デフォルトの名無しさん2015/11/07(土) 19:02:36.22ID:JApQLIrZ
質問です
以下のようにしたいんですが
A列、C列にははあらかじめソートされたデータが入ってます。(列での重複無し)
そして
B列にA列に有ってC列に有るか無いかの結果を
D列にはC列に有ってA列に有るか無いかの結果を
表示させたいのです。
知恵を貸してください。
お願いします。

A列   B列  C列   D列
すいか  有り  いちご  無し
ばなな  有り  すいか  有り
みかん  なし  ばなな  有り
めろん  なし  ぶどう  無し
りんご  有り  りんご  有り
0700デフォルトの名無しさん2015/11/07(土) 19:08:45.85ID:rG1cprAF
知恵はお前に会いたくないって言ってるぞ
0701デフォルトの名無しさん2015/11/07(土) 19:12:58.43ID:Lam93S6q
>>699
VBAじゃないけど
B1に=IF(COUNTIF($C:$C,$A1)>0,"有り","無し")
D1に=IF(COUNTIF($A:$A,$C1)>0,"有り","無し")
これソート関係ない気が
もっとうまい方法があったら教えてくり
0702デフォルトの名無しさん2015/11/07(土) 19:18:02.74ID:i5EknWhN
>>699
ifでいいんじゃない?
0703デフォルトの名無しさん2015/11/07(土) 19:20:53.28ID:JApQLIrZ
>>700
無能は黙ってろよ

>>701
即レス感謝です。
ソート関係ないですね。
0704デフォルトの名無しさん2015/11/07(土) 19:24:07.55ID:d1VYqAJy
>>699
セルに↓こんなのいれてみれば?
=IF(ISNA(VLOOKUP($A1,$C$1:$C$5,1,FALSE)),"無し","有り")
0705デフォルトの名無しさん2015/11/07(土) 19:26:36.61ID:rG1cprAF
無能もVBAじゃなくて関数でいいんじゃないかって思ったよ
0706デフォルトの名無しさん2015/11/07(土) 19:38:09.84ID:ES0HeH4l
質問者がVBAで回答を求めてるのに
意地の悪い回答ばかりだな
0707デフォルトの名無しさん2015/11/07(土) 19:42:17.97ID:jBlHaRhL
Sub test()
For Each x In Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp))
t = "無し"
For Each y In Range(Cells(1, 3), Cells(Rows.Count, 3).End(xlUp))
If x = y Then
t = "有り"
Exit For
End If
Next
x.Offset(0, 1).Value = t
Next

For Each x In Range(Cells(1, 3), Cells(Rows.Count, 3).End(xlUp))
t = "無し"
For Each y In Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp))
If x = y Then
t = "有り"
Exit For
End If
Next
x.Offset(0, 1).Value = t
Next
End Sub
0708デフォルトの名無しさん2015/11/07(土) 19:50:10.38ID:Lam93S6q
マクロ使わずに書けるならその方がいいんじゃないか派と
VBAで何でもできるもん派がいるのは判ってる
でもこの程度のことをVBAで数行に渡ってゴリゴリ書いてたら逆にえっ?この人…って思われちゃわない?
その辺のさじ加減が面倒臭いんだよねExcelて
0709デフォルトの名無しさん2015/11/07(土) 19:59:42.40ID:d1VYqAJy
>>706
じゃぁ、お前が書いてやればいいじゃねーか。
↓ほらよっ
Sub test()
Dim i As Integer
With Worksheets("Sheet1")
For i = 1 To 5
.Cells(i, 2) = "=IF(ISNA(VLOOKUP(" & .Cells(i, 1).AddressLocal(False, True, xlA1) & ",$C$1:$C$5,1,FALSE)),""無し"",""有り"")"
.Cells(i, 4) = "=IF(ISNA(VLOOKUP(" & .Cells(i, 3).AddressLocal(False, True, xlA1) & ",$A$1:$A$5,1,FALSE)),""無し"",""有り"")"
Next
.Calculate
End With
End Sub
0710デフォルトの名無しさん2015/11/07(土) 20:05:21.63ID:4vxbbZbw
知恵を貸してくれとは言ってたが、コード書いてくれとは言ってない可能性が
0711デフォルトの名無しさん2015/11/07(土) 20:15:55.24ID:d1VYqAJy
>>710
随分と贅沢な奴だなお前w
身の程を知ったほうがいいのではないか?
0712デフォルトの名無しさん2015/11/07(土) 20:20:06.00ID:KUjL8teW
ソートされてるって条件が付いてるんだから、その前提を使ったそれなりの効率の良さが求められているのでは?
と思ったが>>703を見るとそうでもないのか...
0713デフォルトの名無しさん2015/11/07(土) 20:20:13.82ID:4vxbbZbw
そんなん俺に言われても
0714デフォルトの名無しさん2015/11/07(土) 20:27:27.40ID:CmSsAW9j
>>699
ヒマだから おいらも作ってみた

数式で・・・・・・・
B1 =IF(ISNA(MATCH(A1,C:C,0)),"なし","有り")
D1 =IF(ISNA(MATCH(C1,A:A,0)),"なし","有り")
下へオートフィル

VBAで・・・・・・・
Sub test()
Set COL_A = Range(Cells(1, "A"), Cells(Rows.Count, "A").End(xlUp))
Set COL_C = Range(Cells(1, "C"), Cells(Rows.Count, "C").End(xlUp))
For Each R In Union(COL_A, COL_C)
  If Intersect(COL_A, R) Is Nothing Then
    Set X = COL_A
    Else
    Set X = COL_C
  End If
  If IsError(Application.Match(R.Value, X, 0)) Then
    MSG = "なし"
    Else
    MSG = "有り"
  End If
  R.Offset(0, 1).Value = MSG
Next
End Sub
0715デフォルトの名無しさん2015/11/07(土) 21:25:13.22ID:JApQLIrZ
みなさんありがとう
いやVBAでも関数でも良かったんだけどね。
ソートについてはVBAで考えていたら、
予めソートしておけば楽なんじゃないかなと思って。
勉強になります。
0716デフォルトの名無しさん2015/11/07(土) 21:39:12.54ID:KUjL8teW
>>715
値を検索する際には、「ソート済み」という前提があるのとないとじゃ当然最適なアルゴリズミは違ってくるけど、
気にしないならそれはそれでいいよ。
0717デフォルトの名無しさん2015/11/07(土) 22:54:59.05ID:KTkklJJg
気付かずに車輪の再発明をしてしまうのもまた一興 w
0718デフォルトの名無しさん2015/11/07(土) 22:59:30.17ID:leawWRzS
再発明はしたくないけど、目的の物を探すのってけっこう大変だし、著作権とか予算とかセキュリティなどの問題で使わせてもらえないこともあるんでな
0719デフォルトの名無しさん2015/11/08(日) 00:34:35.98ID:D4v6jEhQ
>>708
そういう人はそもそもExcelの質問スレで質問するだろ?
0720デフォルトの名無しさん2015/11/08(日) 13:08:22.12ID:iWdr+l4l
会社の従業員の殆どがExcelをワープロとして使っています
いったいどうしたらいいんですか?
(´・ω・`)
0721デフォルトの名無しさん2015/11/08(日) 13:45:09.36ID:eycfu8TN
温かく見守るしかないです
0722デフォルトの名無しさん2015/11/08(日) 13:46:05.72ID:eycfu8TN
Wordがダメすぎるからしょうがない
0723デフォルトの名無しさん2015/11/08(日) 14:09:27.08ID:1lE1VUkn
質問させてください。
"ERIC ↑" という文字をVBAに書き込むときはどうすればいいのでしょうか?
Debug.Print "Eric" & ChrW(160) & ChrW(50)
みたいな書き方だと思うのですが、中の番号を探す方法がわかりません。
半角スペースと上矢印、下矢印の番号をしりたいです。
0724デフォルトの名無しさん2015/11/08(日) 15:03:56.92ID:4syJE0gL
>>723
Debug.Print AscW("↓") ・・・・・ 8595が返る
Debug.Print ChrW(8595) ・・・・・ ↓ が返る
でよくね?

文字コードは大抵16進で表されるから
Debug.Print ChrW(&H2193)
の方がいいかもね(↓は UNICODEで U+2193)

後色々な文字の文字コードを調べるなら
IME のIMEパッドの文字一覧をで調べるといいかも
07257242015/11/08(日) 15:27:17.31ID:4syJE0gL
補足
セルに調べたい文字を書き込んで
Debug.Print AscW(Range("A1")); "&H" & Hex(AscW(Range("A1")))
でもいいかも
EXCEL VBAだから セルで表示できない文字調べても仕方ないもんね
0726デフォルトの名無しさん2015/11/08(日) 17:50:29.06ID:eycfu8TN
>>723
スペースも矢印も普通に文字列として入力できるのに、どうしてChrW関数に置き換えるの?

Debug.Print "ERIC ↑"

でいいじゃん

文字コードを調べるにはイミディエイトウィンドウで ?ascw("↑") Enter
あと半角スペースは1バイト文字だからChrWじゃなくてChr
0727デフォルトの名無しさん2015/11/08(日) 18:41:29.05ID:4syJE0gL
>>726
前半は同意するけど

文字コードを調べる時
UNICODE文字は EXCELのセルには表示できるけど
VBEでは使えないよ

あと
半角スペースは 一般的にはChr(32) とか Chr(&H20)だけど
ChrW(32) とか ChrW(&H20)
でも出来るんだなこれがwww
0728デフォルトの名無しさん2015/11/08(日) 21:54:59.82ID:9U70AhVJ
VBAで数字の曲芸をやることは可能ですが?
またそれをやっている所を記録した映像などはありますか?
0729デフォルトの名無しさん2015/11/08(日) 23:06:17.54ID:5q7P8191
>>728
数字の曲芸の意味が分かりません。
ちょっとあなたがジェスチャーした記録を
映像としてUPしてもらっていいですか?
0730デフォルトの名無しさん2015/11/08(日) 23:08:09.60ID:dtMWmvqa
おれ曲芸ぽいよ
0731デフォルトの名無しさん2015/11/08(日) 23:38:36.28ID:5qPDW9AB
>>725
>>726
>>727
ありがとうございます。調べ方が分からなかったので助かりましたm(__)m
0732デフォルトの名無しさん2015/11/08(日) 23:49:25.41ID:lmjHx9Sp
数と計算のサーカスだろ
0733デフォルトの名無しさん2015/11/11(水) 12:08:44.79ID:e90keXjW
現在VBA勉強中ですが質問です

inputboxに名前を打ち込んだ際、A列を検索して同じものがあれば隣のセルに+1
なければA列の一番下に入力

というものはどうすればできるでしょうか?
アドバイスお願いします
0734デフォルトの名無しさん2015/11/11(水) 12:16:15.73ID:3Ok9TAga
動的webページのタグの取り方教えてください
0735デフォルトの名無しさん2015/11/11(水) 14:54:40.23ID:PdNbA/m2
>>733
やりたいこと、動きそのまんまコードにすればいいよ

inputbox入力
  ↓
入力した値でA列 find
  ↓
同じのが ある→ 行番号取得、そして隣のセルに+1
 ない
  ↓
一番下のセルを検出、そしてinputboxの値を入力


>>734
どう動いてるのか知らんけど、その都度ソースコード取得すればいいんでねーの?
0736デフォルトの名無しさん2015/11/11(水) 16:41:59.06ID:e90keXjW
>>735
ありがとうございます大分まどろっこしいものになりましたができました!
0737デフォルトの名無しさん2015/11/11(水) 21:55:44.53ID:F3jwdTUF
VBA舐めてたわ
json解析もできるからrestでゴニョゴニョ捗る
0738デフォルトの名無しさん2015/11/12(木) 01:38:23.90ID:5wXTJ5Xw
数字のサーカスです
0739デフォルトの名無しさん2015/11/12(木) 07:25:50.18ID:uqfJS8Zf
>>735
静的だとそれで取得できるのですが動的だと出来ないのです
0740デフォルトの名無しさん2015/11/12(木) 08:46:22.76ID:LxPNMIkD
>>739
動的ってどういう意味で動的?
何が変化するのだね。
0741デフォルトの名無しさん2015/11/12(木) 10:11:39.31ID:HJaoNofA
AjaxでDOM書き換えとかじゃないの
0742デフォルトの名無しさん2015/11/12(木) 11:10:19.80ID:bUsaHM7z
>>740
JavaScriptがあるやつのこと
0743デフォルトの名無しさん2015/11/12(木) 11:51:28.03ID:LxPNMIkD
>>742


>>737
kwsk
0744デフォルトの名無しさん2015/11/12(木) 13:58:29.42ID:/sBFds8c
質問お願いします。
小数点や0が含まれた式を計算させて、オーバーフローエラーになるとき、ON ERRORメソッドでは回避できないのでしょうか?一応条件分岐では回避できます。
また、計算部分が複数箇所あり、その度に前後に
ON ERROR RESUME NEXT
ON ERROR GOTO 0
を入れ込むのは良くないことでしょうか?
07455112015/11/12(木) 16:39:30.25ID:tbcgbggA
>>744
計算した結果[強調]、正負関係なく桁がオーバーフロー(溢れる)時に
On ERRORでトラップ仕掛けるのは別に悪いことじゃないけど、
0やら小数点が含んでいるだけでOn ERRORでトラップ仕掛けるのは
出来るだろうけど、普通やらないよ。
入力値ならIFで分岐できるはず。

ところで、0が含まれるってなんだ?文字列なのか?
0746デフォルトの名無しさん2015/11/12(木) 17:08:30.00ID:cjIQ5Zop
>>743
サーバーとやり取り続けてるwebページだとフレーム経由でタグが更新されないから読み込みをしてもタグが見つからない
0747デフォルトの名無しさん2015/11/12(木) 21:59:51.93ID:72+u3ZNL
>>744
一つ重要な事を教えてやる
質問する人は「質問お願いします」でなく
「回答お願いします」と言え
0748デフォルトの名無しさん2015/11/12(木) 22:03:57.33ID:jgag/eef
>>747
ぼくちゃん最近日本語を覚えたばかりかなー?
0749デフォルトの名無しさん2015/11/12(木) 22:06:56.87ID:72+u3ZNL
>>748
絡んでくるなウザい
0750デフォルトの名無しさん2015/11/12(木) 22:12:42.31ID:ApRTr7Aj
>>743
オススメはしないけど、ScriptControlオブジェクトでjson作って、RESTで実装されたWebサービスにPOSTしたり、同サービスからGETで取得したjsonをワークシートに展開したり。
0751デフォルトの名無しさん2015/11/12(木) 22:19:36.54ID:jgag/eef
>>749
そんなこと言わずにおべんきょしましょ、おほーほほー
0752デフォルトの名無しさん2015/11/12(木) 22:34:51.86ID:dQRgNxQG
>>747
正しすぎてワロタ
0753デフォルトの名無しさん2015/11/13(金) 17:03:25.65ID:W62UPltE
すみません初心者ですがアドバイスください
B列を特定のセルの文字列(例"Q3")で検索して一致した行のみ表示したいんですがわかりません
B列をオートフィルタするコードのCriteria1:=をRange("Q3").valueに変更してみたりしたんですがエラー出ました

よろしくお願いします
0754デフォルトの名無しさん2015/11/13(金) 18:01:01.76ID:P+XOfJyO
>>753
Criteria1:=[Q3]
でいけると思う
[]で囲むのはEvaluateとか言うメソッドの別の書き方だそうなので
詳細はEvaluateでググッてください
0755デフォルトの名無しさん2015/11/13(金) 23:29:23.30ID:XwG+kSTV
>>753
Criteria1:=Range("a1").value
Criteria1:=Range("a1")
どっちでもいける
他がまちがってるんじゃね
0756デフォルトの名無しさん2015/11/14(土) 03:33:47.60ID:g/+4aqx+
Excel2010でA列とB列で複数行ある表のうち、
A列で空欄ではない最後の行が何行目かを取得したいのですが、
以下の条件にあったものが見つからず悩んでいます

【1】表の行数は変動する
【2】表には全部のセルに書式設定がある
【3】非表示の行がありえる
【4】A列には空白のセルもありえる
【5】A列は最終行も空白がありえるため、表全体の最終行はB列になりやすい

下のページの
<S6> 書式付きセルを除外する (UsedRange)
が近いんですが、表全体ではなくA列のみの最終行の位置が知りたく、
お知恵を拝借させていただけないでしょうか

http://www.niji.or.jp/home/toru/notes/8.html
0757デフォルトの名無しさん2015/11/14(土) 04:38:44.72ID:yb2PBsN5
その<S6>にあるfindでA列を後方に検索すればいいじゃん
0758デフォルトの名無しさん2015/11/14(土) 05:45:21.60ID:Va7f2G7P
>>753
> エラー出ました

相変わらずどんなエラーなのかは極秘事項なんだな
0759デフォルトの名無しさん2015/11/14(土) 05:58:38.14ID:Hu5fAc9a
すべてのA列の項目を、配列などに取得して、

配列の後ろから1つずつ、空白かどうかチェックしていく
0760デフォルトの名無しさん2015/11/14(土) 06:28:55.30ID:ztl7Hfgp
>>756
A列の最終行を取得すればいいだけなのでは?

Dim LastRow as Long
LastRow=Cells(Rows.Count, "A").End(xlup).Row
0761デフォルトの名無しさん2015/11/14(土) 09:54:29.82ID:O3XP1xgT
それって非表示にしてても行けたっけ?
0762デフォルトの名無しさん2015/11/14(土) 16:35:46.84ID:3kmXR5X0
リソース不足を解消するにはどうすればいいのですか?
1プロシージャに長いコードをかいてますが。プロシージャをわけると解消できますか?
アプリを再起動しても必ず同じ所で発生しPCを再起動すると少しだけ解消されるのですが
PCを再起動しなくても解消する方法は無いのでしょうか?
0763デフォルトの名無しさん2015/11/14(土) 18:17:24.03ID:kNDnibWg
>>762
アルゴリズムを見直す
処理系を変える
0764デフォルトの名無しさん2015/11/14(土) 19:24:10.70ID:fLmGhK2T
>>756
>>761
End(xlUP)では非表示セルを越えちゃうので、先に非表示セルの行を
調べておく必要があるかもね。
その後にEnd(xlUP)してそこから下に非表示の行を走査していけば
最終行がわかるんでないかな。

で、非表示セルの扱いがどういうものなのか全然わからないけどねw
07657642015/11/14(土) 19:29:23.72ID:fLmGhK2T
試してみたけど・・・
CPUがある程度速ければ、上から一行ずつ
舐めて行っても早いよ?w
0766デフォルトの名無しさん2015/11/14(土) 19:35:25.82ID:kNDnibWg
目的の列全体をコピー、作業用シートに貼り付け、これで非表示の行がすべて表示された状態になるんで、
そこで最下行を調べるのが一番手数が少ない
0767デフォルトの名無しさん2015/11/14(土) 19:45:04.54ID:5J2J2vpp
登録する時に最終行をメモさせるとか
0768デフォルトの名無しさん2015/11/14(土) 19:53:23.51ID:Q4j3YvGH
処理系とは?
0769デフォルトの名無しさん2015/11/14(土) 20:00:40.23ID:fLmGhK2T
>>762
メモリ増やせば直る時もある。
絶対に直るとは言えないけどね。
0770デフォルトの名無しさん2015/11/14(土) 21:41:45.23ID:YdrOLc06
>>762
そもそも何のリソースが不足したのかわからんのに答えようがない
同じ所で発生するのに、少しだけ解消されるとかも意味不明だし
0771デフォルトの名無しさん2015/11/14(土) 22:16:16.74ID:ajpWryyv
>>762
リソースの大きなものを開きっぱなしにしてるってことだから、Nothingで解放したりしてたらそう簡単には発生しないと思うけどね。
0772デフォルトの名無しさん2015/11/14(土) 22:36:42.42ID:3kmXR5X0
>>763
当たり前ながらそれにつきますね。
>>769
コアi7メモリー16GB積んでいるので違う問題のようです。
>>770
>>771
シートが100シートありますが60シート以上を書き換えようとし始めると発生し始めます。
50シートまではどんな無茶をしても動きます。
0773デフォルトの名無しさん2015/11/14(土) 23:22:05.45ID:3kmXR5X0
>>763
>>769
>>770
>>771
ループ構造に問題があったようで入れ子などを見直したところ100シートでも何事も無かったかのように処理し続けるようになりました。
やはり>>763が当たり前ながら最強ですね。
ありがとうございました。
0774デフォルトの名無しさん2015/11/14(土) 23:57:17.72ID:WtyxtZW4
VBAが書かれたブックと別のブックが保存されようとしたときに
処理を実行するようなことは出来ないでしょうか

名前を付けて保存をしようとしたときに
デフォルトのファイル名がbook1.xlsxではなくて
アクティブシート名になるようなアドインを作ってみようと思い

http://www.happy2-island.com/excelsmile/smile03/capter01006.shtml
↑まずはこちらを参考に作ろうとしたのですが、これだとアドイン自身が保存されたときしか
イベントが発生しないので、どうしたものかと
0775デフォルトの名無しさん2015/11/15(日) 00:08:40.06ID:Qu/OYjly
>>774
Option Explicit
Private WithEvents APPev As Application

Private Sub Workbook_Open()
  Set APPev = Application
End Sub

Private Sub APPev_WorkbookBeforeSave(ByVal Wb As Workbook, ByVal SaveAsUI As Boolean, Cancel As Boolean)
  MsgBox Wb.Name & "がセーブされようとしてます。"
End Sub
0776デフォルトの名無しさん2015/11/15(日) 05:01:56.28ID:f+hScbJE
初心者ですいません。
数値によって移動するシートを変えたいのですが
変動する数値のセルをA1とすると
18.5<A1≦25のときはシート2
25<A1≦30のときはシート3
30<A1≦35のときはシート4です。

if文を使って挑戦しているんですがなかなかうまく行きません。
ご指導の程お願いします。
0777デフォルトの名無しさん2015/11/15(日) 06:27:36.18ID:XwHDp+pV
>>776
sh = 1
Select Case [A1]
  Case Is <= 18.5
  Case Is <= 25: sh = 2
  Case Is <= 30: sh = 3
  Case Is <= 35: sh = 4
End Select
Sheets("Sheet" & sh).Select
0778デフォルトの名無しさん2015/11/15(日) 06:30:17.53ID:XwHDp+pV
>>776
A1 = [A1]
If 18.5 < A1 And A1 <= 25 Then Sheets("Sheet2").Select
If 25 < A1 And A1 <= 30 Then Sheets("Sheet3").Select
If 30 < A1 And A1 <= 35 Then Sheets("Sheet4").Select
0779デフォルトの名無しさん2015/11/15(日) 08:15:16.50ID:wSfPfP43
>>775
ありがとう
まさか出来るとは思いませんでした
あとはこのアドインの実用的かどうか・・・
いざ使ってみたら余計な名前がつけられて不便に感じるかも
0780デフォルトの名無しさん2015/11/15(日) 12:41:42.46ID:DwnIBkrT
Cells(N , 1).Formula = "=binomdist(v,n,P!A" & k & ")"

これがエラーになる原因を教えてください。
0781デフォルトの名無しさん2015/11/15(日) 13:35:34.89ID:8F7LnjGS
>>780
引数1個足りなくね?
0782デフォルトの名無しさん2015/11/15(日) 14:03:17.85ID:U1OtMApL
1.Workbooks.Add で新規ブックを作る
2.自ブックから任意のシートを新規ブックへコピーする
3.新規ブックから初期シートを削除する
4.名前を付けて保存する

というコードを書きたいです
この3で行う、「新規ブックから初期シートを削除」という処理に
汎用性を持たせるため、以下に対応する必要があると考えており
どう実現すべきか悩んでいます。よいアイディアがあったら教えてください

・初期シート枚数は設定で変えられるため、Sheet1〜3で決め打ち削除するのはNG
・コピーしたシート名が「Sheet5」等であった場合を考慮し、"Sheet" + 数字で決め打ち
削除するのはNG
0783デフォルトの名無しさん2015/11/15(日) 14:33:00.62ID:DwnIBkrT
>>781
最後の関数形式が抜けてました。

Cells(N , 1).Formula = "=binomdist(" & v & "," & N & ",P!A" & k & ",false)"
これでちゃんとできました。
0784デフォルトの名無しさん2015/11/15(日) 14:41:29.70ID:8F7LnjGS
>>782
> ・初期シート枚数は設定で変えられるため、Sheet1〜3で決め打ち削除するのはNG

VBA で一時的に変更すればいい

> ・コピーしたシート名が「Sheet5」等であった場合を考慮し、"Sheet" + 数字で決め打ち
> 削除するのはNG

CodeName で特定すればいい
0785デフォルトの名無しさん2015/11/15(日) 14:50:35.49ID:Qu/OYjly
>>782
新規ブックを作ってから コピーじゃなくて 最初からシートコピーでやる
 ・コピー先を指定しないと勝手にブックが作られる
 ・手動のシートコピーにも(新規ブック)あるよねあれをマクロの記録してみ分るから

Dim NewBook As Workbook
Sheets("Sheet1").Copy
Set NewBook = ActiveWorkbook
NewBook.SaveAs Filename:="D:\新規ブック.xlsm", FileFormat:=xlOpenXMLWorkbookMacroEnabled
0786デフォルトの名無しさん2015/11/15(日) 15:50:50.01ID:Qu/OYjly
>>785
案-2)
メンドイからコード作らないけど

1)Workbooks.Add で新規ブックを作った後 新規ブックのシート一つを残してシートを削除
2)シートコピー

で元々あったのは1コしか残ってないから 決め打ちでもなんでもどうぞで削除
(ま 1) の段階で残ったシートを set Delsh = sheets(1) とかで保存しておくかな)
0787デフォルトの名無しさん2015/11/15(日) 16:43:36.15ID:glSFMc+2
新規ブックにシートコピーしたら新規ブックのコピーされたシートがアクティブになるんじゃね(適当)
アクティブシートの名前取得して、それ以外の名前のシートを削除すれば?
0788デフォルトの名無しさん2015/11/16(月) 07:10:24.44ID:mW+43vMn
自分なら新規ブック作った際に配列でシート保存しておいて
コピーしたら配列のシート削除かな
0789デフォルトの名無しさん2015/11/16(月) 08:39:12.21ID:z+/eAFMG
基本的な質問かもしれませんが
標準モジュールや、フォームモジュールや、(つかったことないけど)クラスモジュールの
宣言セクションに書いたグローバル変数というものは
Excelが起動している限り値は保存されたままですか?
(つまり再度マクロを実行したとき以前の値は残ったままですか?)
0790デフォルトの名無しさん2015/11/16(月) 08:42:02.06ID:DfObBX38
>>782
テンプレートって知ってる?
0791デフォルトの名無しさん2015/11/16(月) 08:44:40.22ID:DfObBX38
>>789
試せばわかるんじゃない?
むしろ、何故自分で確かめないの?
0792デフォルトの名無しさん2015/11/16(月) 08:51:06.23ID:z+/eAFMG
>>791
検証のしかたに自信がないのです。
初心者じゃない人からみたら屁(へ)なのかもしれないけど。
0793デフォルトの名無しさん2015/11/16(月) 09:14:09.40ID:DfObBX38
>>792
インタープリターってキーワードで探して勉強するといいよ。
0794デフォルトの名無しさん2015/11/16(月) 09:45:59.39ID:wa4jS3Um
そういうやり方に頼らないほうが
変数等の初期化処理はちゃんとやりましょう
0795デフォルトの名無しさん2015/11/16(月) 10:07:55.61ID:g8+LQh40
>>789
そういう残したい値はどこかのセルに格納するといいかと。
処理が終わったら保存。始まるときに読み込む。
0796デフォルトの名無しさん2015/11/16(月) 10:25:14.27ID:UZGUWiAW
残したいとは言ってなさそうな雰囲気
0797デフォルトの名無しさん2015/11/16(月) 10:51:28.35ID:CN0jLd+v
パブリック変数はエラー出すとゼロになることしか知らん
0798デフォルトの名無しさん2015/11/16(月) 11:23:37.90ID:8QL6McHq
>>754-755
返事遅れて申し訳ありませんできましたありがとうございました
0799デフォルトの名無しさん2015/11/16(月) 15:11:20.34ID:z+/eAFMG
残したいとは言ってませんよ。
VBAを根本から理解したいだけなのです。

逆にそれをあいまいのままセルに保存して結果がOKならすべてよしの態度はそれでよく生きていけますね。
分からないことがあればそのつどクリアにして疑問を残さない。
それこそスキルの高いプログラマへの近道です。
不明なことがあれば気持ちが悪くてしかたがない。
0800デフォルトの名無しさん2015/11/16(月) 15:18:38.31ID:nWXpmO/G
意識高すぎで草
0801デフォルトの名無しさん2015/11/16(月) 15:37:56.94ID:oUXAj10G
>>799
ググるという発想/テクもないのかね
https://support.microsoft.com/ja-jp/kb/408871
0802デフォルトの名無しさん2015/11/16(月) 16:31:08.19ID:ID4NoRjJ
ゲラゲラ
テレビ見るのもテレビの中身全て把握しないと見ることが出来ないのよ www
0803デフォルトの名無しさん2015/11/16(月) 16:41:31.88ID:T14TAZ6I
>>799
マジレスしてあげる。

「スキルの高いプログラマへの近道」とは

疑問があれば 自分が今入手できる資料から 自力で調べる癖をつける事。

(安易に人に聞くのは 「スキルの高いプログラマ」とは言わない)

そして インターネット上にある資料もまた "自分が今入手できる資料"である
http://o.8ch.net/xlv.png
0804デフォルトの名無しさん2015/11/16(月) 16:42:31.62ID:T14TAZ6I
げ ごめん他に上げようとしてた画像までついちゃった
0805デフォルトの名無しさん2015/11/16(月) 17:07:30.17ID:tsbe4Ola
言わなきゃ崇高な意見で通ったのに
0806デフォルトの名無しさん2015/11/16(月) 17:15:38.23ID:g8+LQh40
ま、ここで聞く前にMSDNくらいみとけよとは思うね。
見てるのでしょうが。
0807デフォルトの名無しさん2015/11/16(月) 17:24:11.22ID:oUXAj10G
>>799
> 分からないことがあればそのつどクリアにして疑問を残さない。
> それこそスキルの高いプログラマへの近道です。
とか書かなければいいのに
プログラミングスキル磨く前に、コミュスキル磨けよ
0808デフォルトの名無しさん2015/11/16(月) 18:23:57.38ID:dogpyWBA
俺もパブリック変数がいつクリアされるのかなんて知らないけど
そもそもパブリック変数は極力使わない主義なんで知らなくても困んないな

(どんなことだって知らないより知ってるほうが良いに決まってるから、
知りたくないわけではないけれど、積極的に調べたいとは思わない)
0809デフォルトの名無しさん2015/11/16(月) 18:35:10.51ID:CN0jLd+v
宮島きれい!!
0810デフォルトの名無しさん2015/11/16(月) 19:55:02.38ID:kepj2JWF
VBAに「決められた手順に沿って目的通りに動いてくれればそれでいい」以上を求めるのが間違い。
0811デフォルトの名無しさん2015/11/16(月) 20:02:28.21ID:cus/qZQl
>>794 が正論だと思うけどな

>>799
> VBAを根本から理解したい

と言うなら、MSに入社して内部ドキュメントやソース見るしかないっしょ
0812デフォルトの名無しさん2015/11/16(月) 20:47:56.47ID:JVdZFBYH
便所の落書きが何かの根本を理解する助けになると本当に思ってるのならまず病院行った方がいい
0813デフォルトの名無しさん2015/11/16(月) 21:06:00.95ID:DfObBX38
>>799
VBAを根本から理解する必要なんてないっ!w
もともとExcelは手動で動くツールなんだから、
使えるとこだけ使えばいいだけの言語なんだよ。
>>801
お前、やさしいなw
0814デフォルトの名無しさん2015/11/16(月) 21:11:01.89ID:nSSKBNI/
おれは朝ボタンを押したらその日の仕事を全部やらせるようにしてるけどな
コケてないかたまに見てるだけ
0815デフォルトの名無しさん2015/11/16(月) 22:41:21.39ID:rCJBCYee
>>789
標準モジュールは残ったまま。
クラスモジュールはインスタンスのスコープの通り。
フォームモジュールはNewするとクラスと同じ挙動。
暗黙のインスタンスを使うとDisposeすれば消えるかと思いきや確か残ったと思った。

俺も変数はPublicで指定しない派。極力使わないんじゃなくて絶対使わない。代わりにプロパティにして引き渡す。

カプセル化と言うこともあるけど、色んな所で外部から使われてて実際今の動きでどこで使われてるのかよく分からないとき、
ブレークポイント仕掛けることが出来るんだよね。それだけでも恩恵を受けられる。ReadOnlyにも出来るし。
0816デフォルトの名無しさん2015/11/16(月) 23:45:32.01ID:1xD5vPnC
>>799
「スキルの高いプログラムへの近道」?

無いよ。そんなもん。

分からないことがあればその都度クリアにして疑問を残さない?

当たり前だが、何故先に自分で調べない?
調べる手段が妥当なものか分からなければ、何故そこから調べない?
聞くにしても、そこからじゃないのか?

効率の為作業の手間を省くことを考えるのならまだ理解出来るが、
こんなところで端折って聞いて手間を省く人に
「スキルの高いプログラムの近道」なんてそれこそ
程遠いものなのではないのか?
0817デフォルトの名無しさん2015/11/17(火) 02:44:16.04ID:dUScYQf8
爆釣りやないかいwww
0818デフォルトの名無しさん2015/11/17(火) 03:02:23.04ID:+A3liqn5
http://mastiff.2ch.net/test/read.cgi/nanmin/1436633202/170
  ↑ ↑ ↑ ↑ ↑ ↑ 
0819デフォルトの名無しさん2015/11/17(火) 07:10:39.47ID:jh7GVhAs
public変数普通に使うわ
基本ドキュメント加工のツール程度で
引数で渡すとかかったるいし
そのせいでたくさんの引数とかプロパティとか
頭悪すぎ
0820デフォルトの名無しさん2015/11/17(火) 07:17:04.06ID:onwvO4ZW
>>819
素人おつ
0821デフォルトの名無しさん2015/11/17(火) 07:17:11.85ID:m77ny3nF
>>819
もうちょっと勉強した方がいいと思うよ
0822デフォルトの名無しさん2015/11/17(火) 07:50:59.33ID:7jPVJtKG
>>816
ていうか、些末なことがいちいち気になって先に進めなくなる人は
スキルの高いプログラマになれないと思う
できる人はそういうのをどんどん飛ばして進んでいく
0823デフォルトの名無しさん2015/11/17(火) 12:26:06.50ID:2Fofbo04
publicって使わないほうがいいの?
カウンタの i j k とか行、列の r c なんかはpublicにしてるんだけど良くないのかな?

あとシートにデータを出すプロシージャ名ってなんてつけたらいいですか
0824デフォルトの名無しさん2015/11/17(火) 12:45:41.83ID:mHdSHoPC
>>823
>あとシートにデータを出すプロシージャ名ってなんてつけたらいいですか

「シートにデータを出す」でいいやん
0825デフォルトの名無しさん2015/11/17(火) 12:58:45.67ID:bCeQZw0e
>>823

>>801 が紹介してる MSのサイト
https://support.microsoft.com/ja-jp/kb/408871
の詳細 読めば分ると思うけど

使っちゃいけないんじゃなくて
"Public変数が アプリケーション(Excel等)終了時まで有効であることを期待する"
のがいけないって事 消える場合があるから。

個人的な意見だけど
マクロ実行〜終了までの間 プロシージャ間の 値のやり取りに
引数で渡さないで Public変数を使うってのは アリだと思う。
0826デフォルトの名無しさん2015/11/17(火) 14:11:12.19ID:bCeQZw0e
>>823
>>カウンタの i j k とか行、列の r c なんかはpublicにしてるんだけど良くないのかな?
これ良く使う変数を外に出したって事?

弊害分って使う分にはいいけど 下だとループ一回しか回らんぞ!

Public i

Sub test()
 For i = 1 To 100
   Debug.Print i
   Call test2
 Next
End Sub

Sub test2()
  For i = 1 To 100
  Next
End Sub
0827デフォルトの名無しさん2015/11/17(火) 14:38:02.11ID:rqjb3MzO
パブリックはいろんなプロシージャの変数になるから連鎖的にバグる可能性があるって話だろ。
でかいプロジェクトだったら怖くて使えん。
でかいプロジェクトだとちゃんとコードを組み立てる前に因数分解して、
事前に変数定義しておかないと事故ると思われる。
0828デフォルトの名無しさん2015/11/17(火) 14:46:20.53ID:5GItqN9R
ど素人が自分のプログラミング手法を語り出した。
0829デフォルトの名無しさん2015/11/17(火) 15:12:50.93ID:rqjb3MzO
>>828
素人の経験しか無いけど、そんなもんじゃない?
変数重複をまとめんの、結構怖いのよ。
プロはseが変数定義までやるんでしょ?
0830デフォルトの名無しさん2015/11/17(火) 15:39:27.79ID:5GItqN9R
>>829
もう黙っとけ。
0831デフォルトの名無しさん2015/11/17(火) 15:43:10.70ID:rqjb3MzO
>>830
文句言うだけのプロは要らないです
0832デフォルトの名無しさん2015/11/17(火) 15:45:19.63ID:9RRwqlz1
ループカウンタをパブリックにするのって何とも言えない背徳感がある
0833デフォルトの名無しさん2015/11/17(火) 15:49:36.68ID:5GItqN9R
また、誰もが俺様に無料で教えるべき君か。
やれやれ。
0834デフォルトの名無しさん2015/11/17(火) 16:11:03.00ID:9V6jMaPI
くだらない論争はどうでも良いんで、次の質問の方、どうぞ〜 w
0835デフォルトの名無しさん2015/11/17(火) 17:30:01.97ID:pgYKwvHC
ループの i とか、その場限りの変数をPublicにするのってどういう意味があるんだろう
メモリ空間を数バイト節約?
0836デフォルトの名無しさん2015/11/17(火) 17:41:46.00ID:2kaFLAzj
このiは俺が守る、みたいな脳内設定で楽しくプログラミングを行いたい
0837デフォルトの名無しさん2015/11/17(火) 19:39:09.29ID:zqx4r6yz
エラー時の黄色マーカーをキーボードで一つ前二つ前の位置に動かすことはできますか?
0838デフォルトの名無しさん2015/11/17(火) 20:19:37.12ID:fRH1iweo
>>835
バイト数節約だろうな。
プロシージャやファンクションを呼び出す度に微量ながらメモリが解放されずに蓄積していくから、
メモリ容量がカツカツなPCで大量のデータ扱う時とか違ってきたりする。
0839デフォルトの名無しさん2015/11/17(火) 20:28:08.93ID:fRH1iweo
まぁタイトなシステムを運用するならいっそWindows APIからポインタ掴んでしまった方が楽なんだろうけど。
あと変数は大量になるならCollection型か二次元変数で運用すると楽。
0840デフォルトの名無しさん2015/11/17(火) 21:21:46.18ID:pgYKwvHC
>>838
1ギガバイトの配列を確保するプロシージャを作って実験してみたけど、ループで何回呼んでもエラーにならなかった
少なくとも変数領域は開放されてるか、足りなくなった時点でガベージコレクションなりしてるはず
0841デフォルトの名無しさん2015/11/17(火) 21:50:16.41ID:WOkwm5aA
エラー番号438の「オブジェクトは、このプロパティまたはメソッドをサポートしていません」が出るんですが、違うPCで実行するとエラーなく動きます。なにが考えられますか??
0842デフォルトの名無しさん2015/11/17(火) 21:56:19.42ID:bCeQZw0e
>>841
>>なにが考えられますか??
色々

エラーの出たコードと
環境を晒せ O/S EXCELのバージョン(エラー出るやつ/出ないやつ両方)

上記が 極秘事項 なら ここでの回答は期待しないように
0843デフォルトの名無しさん2015/11/17(火) 22:03:02.33ID:5Jh+kDEC
参照設定とか?
0844デフォルトの名無しさん2015/11/17(火) 23:50:13.53ID:uYtrfvr1
コンポーネントのセットアップの漏れ
参照設定 とか regsvr とかいつものやつだろ
0845デフォルトの名無しさん2015/11/18(水) 00:59:15.51ID:Jz4YR4IO
>>844
ありがとうございます。
その場合、復旧策はどのようにされているのですか?
0846デフォルトの名無しさん2015/11/18(水) 01:03:53.97ID:TDMaRkG6
何のオブジェクトで発生しているかわからないと解決策も出ないよ。
0847デフォルトの名無しさん2015/11/18(水) 01:19:47.66ID:4OAuBkhO
>>829
半分正解だと思うよ。
他には例えばその変数に対して後に共通の使用制限を掛けたかったりした場合、
Publicな変数に直接値を設定している場合は全て使用箇所を洗い出して修正しなければならないけど、
プロパティならそのプロパティの中でチェックロジックを一つ書けば済んだりするからね。

>>839
それってプロパティにして引数でByRefで渡してやるのとどっちが楽なの?
0848デフォルトの名無しさん2015/11/18(水) 01:24:48.76ID:4OAuBkhO
>>845
とりあえずエラーが出てない方と出てる方の参照設定を比較して、
エラーが出てる方の参照設定にチェックボックスのチェックが外れてるのが無いか確認してみたら?

後環境が同じかどうか。
0849デフォルトの名無しさん2015/11/18(水) 01:48:16.81ID:4OAuBkhO
>>840
>>838が言ってるのは「プロシージャを呼んだとき、微量ながらメモリが解放されず蓄積される」だったんだけど、
プロシージャを抜けるか否かが書いて無かったんで、俺は勝手に、呼んだときには戻り先アドレスをスタックに保持していることを言ってて
抜けた時には解放というかスタックポインタが指すアドレスが戻り先アドレスを格納している分、
マイナスされることを言ってるのかと思ってたけど、

確かに呼んで抜けた後ではないと一言も書いてないな。

でも呼んで抜けた後のことを言ってて、メモリが解放されていないとしたらそれは普通にメモリリークだな。

ちなみにプロシージャ呼んで抜けないで、またプロシージャ呼んでメモリに何か溜まってくか確認したければ
ただ再帰するだけで抜けない処理を書けば多分それらしいエラーで落ちるんじゃないかな。
0850デフォルトの名無しさん2015/11/18(水) 06:16:25.93ID:laMD8+R/
>>841
A.method() でエラーになるのは、
Aを納めたライブラリが、環境にないとか、
参照設定していないとか

また新ライブラリでは、Aの機能が追加されていて、
旧ライブラリには、method()が存在しないとか
0851デフォルトの名無しさん2015/11/18(水) 07:09:48.74ID:lhHws3CR
excelスレで大きいプロジェクトとか語るプロジェクトの規模しりたいわ
0852デフォルトの名無しさん2015/11/18(水) 08:16:54.28ID:vC96tygE
>>849
プロシージャから抜ける前にローカル変数が解放されるなんてありえないから、わざわざ考える必用もない
>>383の言う「解放されずに蓄積」って、抜けた後の話をしたかったんじゃないの?

それと、再帰しまくればメモリ不足で落ちるのも当然
すべての変数をグローバルにしたところで、戻りアドレスを入れるスタックが足りなくなる
0853デフォルトの名無しさん2015/11/18(水) 08:20:21.93ID:vC96tygE
Excel2010で

Sub a()
  z = 1
End Sub

というプロシージャを入力したら、変数のzが勝手に大文字になったんだけど、
Zっていうメソッドかプロシージャがどこかにあるの?
0854デフォルトの名無しさん2015/11/18(水) 09:13:28.61ID:4OAuBkhO
>>852
えー?
じゃ、VBAではプロシージャ呼び出して抜けるだけで恒久的にメモリリークを起こすってこと?

流石にそれは無いと思うな
0855デフォルトの名無しさん2015/11/18(水) 09:39:25.37ID:vC96tygE
>>854
メモリリークすると主張してる(ように読み取れる)のは>>383

俺は(実用上の問題がないレベルで)メモリリークはないと信じたいけど証明する方法を思い付かない
>>840の実験では確認できなかったが、これだけでは証明したことにはならない

それと、話が前後するけど「メモリリーク」の定義はここを参考にしてる
http://kuenishi.hatenadiary.jp/entry/2013/04/23/162205
人によって微妙に解釈が違うんで、前提がブレると話がかみ合わなくなる
0856デフォルトの名無しさん2015/11/18(水) 11:22:26.36ID:qFKoL/+T
プロシージャから抜ける「前に」の意味が人によって食い違ってるだけじゃないの?
0857デフォルトの名無しさん2015/11/18(水) 11:30:05.77ID:FZwVjyKL
スタックという概念を知らない奴が紛れ込んでるぞ。
0858デフォルトの名無しさん2015/11/18(水) 11:36:08.02ID:FZwVjyKL
>>840
> 少なくとも変数領域は開放されてるか、足りなくなった時点でガベージコレクションなりしてるはず
VBAには参照カウンタ方式のGCしかないから、足りなくなれば即エラーでしょうね。
0859デフォルトの名無しさん2015/11/18(水) 13:54:20.88ID:a5bQZItB
質問です。
画面更新をfalseにしたとき、ステータスバーも止まりますか?変数をバーに見れるようにしてるのですが、自分のは、初めは動いて途中で動かなくなります。
0860デフォルトの名無しさん2015/11/18(水) 14:00:42.87ID:FZwVjyKL
>>859
vba screenupdating statusbar
でググれ。
0861デフォルトの名無しさん2015/11/18(水) 14:58:23.61ID:02WNUve2
>>853
それ多分 VBEがお節介してるのよ
これやってみ

Dim A
と入れて 直ぐ消す a と入れる A と変換される
Dim a
と入れて 直ぐ消す A と入れる a と変換される
0862デフォルトの名無しさん2015/11/18(水) 15:52:20.50ID:TDMaRkG6
>>859
表示の前にdoeventsを入れてる?
0863デフォルトの名無しさん2015/11/18(水) 16:00:11.39ID:vC96tygE
>>861
いやそれが、Excelを再起動して、いきなり入れた変数名が大文字になるんだけど
何かの参照モジュールかなあ、よくわからん
0864デフォルトの名無しさん2015/11/18(水) 16:06:46.67ID:FZwVjyKL
>>863
VBE -> F2 -> Zで検索
08653832015/11/18(水) 16:15:01.16ID:DqoVhAo1
>>855
俺、そんなこと言ったっけかな?
0866デフォルトの名無しさん2015/11/18(水) 20:01:10.74ID:vC96tygE
>>864
それも見たけど何も情報が得られなかった
0867デフォルトの名無しさん2015/11/18(水) 20:01:51.29ID:vC96tygE
ずっとリンクミスってた
>>383じゃなくて>>838
0868デフォルトの名無しさん2015/11/18(水) 20:06:52.94ID:JdonKPYc
ユーザーフォームの重なり具合を表現するのにZ値を設定できたはず・・・と思ったらZOrderだった。
何かのプロパティを見ていた時に「へぇ、Zなんだ」と思った覚えはあるんだけどなんだったか。
0869デフォルトの名無しさん2015/11/19(木) 01:31:34.93ID:EtF1o3wQ
>>853 & >>863 & >>866

VBEのオブジェクトブラウザで ちゃんと検索した?

俺は EXCEL2013だけど
Excel.ThreeDFormatクラスに Z プロパティ あるぞ
0870デフォルトの名無しさん2015/11/19(木) 10:22:38.65ID:hJSHK18p
まさか、オブジェクトブラウザの使い方がわからなかったのか?
0871デフォルトの名無しさん2015/11/19(木) 11:07:31.19ID:gKODW9Xi
>>870
わかってないかも
上のボックスでExcelを選んで下のボックスに「Z」と入れて双眼鏡をクリックしたら、部分一致で大量に出て来て絞り込めず
「"Z"」「Zプロパティ」も試したけど検索結果がゼロ
08728692015/11/19(木) 12:44:57.38ID:EtF1o3wQ
>>871
"上のボックスでExcelを選んで下のボックスに「Z」と入れて双眼鏡をクリック"
ここまでやっといてなぜ地道に調べようとしないの? 大量ってそんなに大量か?
ほんとに 解決したいの?

つか メンバーは 名前順に並んでるようだから Z なんて最後から見てけば一発www
0873デフォルトの名無しさん2015/11/19(木) 14:43:04.40ID:OmqIhiXU
>>872
ブラウザの使い方がわかってないだけでした
ライブラリ、クラス、メンバーの順にソートされてて最後の方だけ見ればいいって今まで気付かなかった
0874デフォルトの名無しさん2015/11/19(木) 16:41:17.46ID:hJSHK18p
今回の教訓:
・スクロールバーのHeightが小さいというだけで、検索をあきらめてしまう人がいる
・ソートされていてもそれに気づかない人がいる。ソートされているのなら、どこがソートされているのかをわかりやすくすべし
0875デフォルトの名無しさん2015/11/19(木) 18:57:13.33ID:d514a0LQ
今回の教訓:
・プログラマーの中にも目検索を苦にしない剛の者がいる
0876デフォルトの名無しさん2015/11/19(木) 19:03:06.37ID:Lg8nrm8g
あとgoogle検索の日本語サイトのみをデフォルトにしてるやつな
何がインターネットで何もヒットしませんでした、だよ。英語サイトで腐るほどサンプルあるのに
0877デフォルトの名無しさん2015/11/19(木) 19:56:21.12ID:XvH4OpeA
今回の教訓:
見慣れないプロパティの詳細は知る必要が無い
0878デフォルトの名無しさん2015/11/20(金) 10:20:10.64ID:6+z5DNVR
質問お願いします。
複数SUBプロシージャで、共通の定数を使いたい場合、モジュールの一番上に書くと思うのですが、初心者で使い方が、詳しくわかりません、、
例えば、
dim SR as LONG '基準行
SR = 3

というものをブック内のモジュール全体に適用したい場合、どう書けばいいのでしょうか?
よろしくお願いします。
0879デフォルトの名無しさん2015/11/20(金) 11:00:05.40ID:crZ4naS7
Public Const
0880デフォルトの名無しさん2015/11/20(金) 12:17:16.98ID:ncw+fVNT
Public Const SR = 3
と書いて、LONGなどタイプは省略して大丈夫でしょうか?助かりました。携帯からで文字汚くてすいません。
0881デフォルトの名無しさん2015/11/20(金) 15:18:59.42ID:9w4YMh2C
質問です
某カードゲームを再現するプログラムを作っているんですがドローがうまくいきません
1.かぶり防止の※がドローするたびに消える(記憶しないので結局かぶる)
2.横に移動してほしいが移動しない(G22から横の列に順に表示)
が問題で抽選プログラムの作成を参考にしました
Sub drow()
Dim Ret As Integer, i As Integer, Num As Integer
i = 0
Num = 1
Columns("E:E").ClearContents
While i < Num
Ret = Int((40 * Rnd) + 1) + 1
If Cells(Ret, 5).Value <> "*" Then
Cells(Ret, 5) = "*"
i = i + 1
Cells(Ret, 1).Copy Destination:=Cells(22, 6 + i)
End If
Wend
End Sub

どこを変えれば問題解決できるかアドバイスください
初心者ですいません
0882デフォルトの名無しさん2015/11/20(金) 15:22:00.88ID:jtoAKsdN
他人が書いたコードってどんな動作するのかイメージできないw
デバッガーさんは大変なんだなぁ…
0883デフォルトの名無しさん2015/11/20(金) 15:43:30.34ID:v3U3Slwh
>>881
> かぶり防止の※がドローするたびに消える(記憶しないので結局かぶる)
とか言われても、なんのことやらさっぱりわかりません。

某カードゲームなどと言葉を濁さずに、名称を明確にするか、そうしたくないのなら
目的をはっきりさせ、draw()の前提(状態)がどうなっているのかを説明してください。
0884デフォルトの名無しさん2015/11/20(金) 15:56:55.70ID:9w4YMh2C
>>883
まずE列はすべて空白
デッキ(A2~A41)からカードを1枚ランダム選んでドローする(このときドローしたカードのE列に※を入れる)
ここまでが前提
次ドローするときにE列に※のないところを探してドロー(このとき※をE列に入れる。前の※と合わせて2つ※がある)
というコードにしたいのですが1枚目のドローで付けた※が消えて2枚目のところに移る(※は1つのまま)ので
次のドローで1枚目が再び出る可能性がある(かぶる)
ということです説明下手で申し訳ありません
カードゲームは遊戯王ですね
0885デフォルトの名無しさん2015/11/20(金) 16:15:12.98ID:v3U3Slwh
>>884
なるほど、目的と手段はわかりました。
なら、こうですね。

' デッキをもとに戻すときに呼ぶ
Sub InitializeDeck()
  Columns("E:E").ClearContents
End Sub

Sub draw()
  Dim Ret As Integer
  While True
    Ret = Int((40 * Rnd) + 1) + 1
    If Cells(Ret, 5).Value <> "*" Then
      Cells(Ret, 5) = "*"
      Cells(Ret, 1).Copy Destination:=Cells(22, 6 + i)
      Exit Sub
    End If
  Wend
End Sub

ただし、この方法は効率がよくありません。
例えば最後の1枚を探すのに、何度もループする必要があります。
運が良ければ最初の1回で見つかるかもしれませんが、運が悪ければ数百回以上ループ
することになったりします。

効率の良い方法は、
「vba カード シャッフル」
でググってみてください。
0886デフォルトの名無しさん2015/11/20(金) 16:16:34.67ID:EMNpTxJu
毎回引かずに予め40枚の使用順をランダムに割り振っておいてそれを順番に使ってけばいいんじゃないの
0887デフォルトの名無しさん2015/11/20(金) 16:20:05.34ID:SDujThbm
おっさんにはわかんねw
0888デフォルトの名無しさん2015/11/20(金) 16:26:37.37ID:9w4YMh2C
>>885
わかりました調べてみます
アドバイスありがとうございました
0889デフォルトの名無しさん2015/11/20(金) 16:43:40.25ID:v3U3Slwh
>>888
あ、カードのドローに関しては>>885のコードで十分なので、今「効率の良い方法」を
調べる必要はないですよ。
0890デフォルトの名無しさん2015/11/20(金) 17:22:51.71ID:bjWlxKQH
まず「ドロー」の意味がわからないという
0891デフォルトの名無しさん2015/11/20(金) 17:56:13.24ID:v3U3Slwh
>>890
山札から1枚引くこと。
0892デフォルトの名無しさん2015/11/20(金) 22:41:36.81ID:T6pTyJHc
>>890
www
スレチすまん。つぼったので
0893デフォルトの名無しさん2015/11/21(土) 00:15:10.10ID:wd0wtgf/
ドローって引き分けじゃないんだ。

そういやUNOでドロー2とかあったね。
0894デフォルトの名無しさん2015/11/22(日) 13:18:55.56ID:/KJjC5bJ
テキストボックスの値を順に比較する方法について、効率が良い方法を教えてください

1.テキストボックスは5個ある
それぞれに1-5の名前を割り当てる

2.テキストボックスの1-5の順に数字が書き込まれる
ただし、すべてに書き込まれるわけではなく、3個や4個のように途中で終わるときもある

3.終わった際、書き込まれなかったテキストボックスには(未入力)が書き込まれる

の条件で、作業が進められたとき値の比較を順に比較したいのです

A.比較する順は1と2、1と3、1と4、1と5、2と3、2と4の用に、小さい番号から比較していく

B.同じ値が出たらその値を採用、処理を中止する

for-nextの処理かと思ったのですが、うまく組み立てられなくて…
数が少なければすべての処理を記載しても良いのですが、実際のテキストボックスは30あり、正直きついです

どなたかアドバイスをいただけないでしょうか?
0895デフォルトの名無しさん2015/11/22(日) 13:46:32.12ID:DI65Cz5F
iPadからでデバックできないからちょいと違うかもだけど
for n =1 to 29
for m = n+2 to 30
(nとmで比較の処理)
next
next
こんな感じでどうでしょう
0896デフォルトの名無しさん2015/11/22(日) 13:47:18.97ID:DI65Cz5F
みすった
for n =1 to 29
for m = n+2 to 30
(nとmで比較の処理)
next n
next m
こうだ
0897デフォルトの名無しさん2015/11/22(日) 14:28:17.99ID:RKyMns7I
n+1だろ
あと .Text <> "(未入力)" Then 〜 も必用かもしれない
0898デフォルトの名無しさん2015/11/22(日) 15:15:27.32ID:2bfwfHEs
Private Sub CommandButton1_Click()
 Dim m, n, v
 Dim txtBoxs As New Collection
 Dim found As Boolean
 Dim blankIdxs As New Collection

 With txtBoxs
  .Add TextBox1
  .Add TextBox2
  .Add TextBox3
  .Add TextBox4
  .Add TextBox5
 End With
 
 found = False
 For m = 1 To 5
  If txtBoxs(m).Text = "" Then
    blankIdxs.Add m
  Else
   For n = m + 1 To 5
    If (Not found) And (txtBoxs(m).Text = txtBoxs(n).Text) Then
     MsgBox Join(Array("採用!", txtBoxs(m).Text, "m=" & m, "n=" & n), ",")
     found = True
    End If
   Next n
  End If
 Next m

 For Each v In blankIdxs
  txtBoxs(v).Text = "(未入力)"
 Next
End Sub
0899デフォルトの名無しさん2015/11/22(日) 15:29:17.11ID:5iyagoiC
VBAで符号なし32bit長の整数を簡単に扱いたいんだけどどうやるの?
0900デフォルトの名無しさん2015/11/22(日) 16:14:04.75ID:yPUHF/WV
>>899
> 簡単に扱いたい

無理です
はい、次の方どうぞ
0901デフォルトの名無しさん2015/11/22(日) 18:06:52.35ID:mUPczM8Q
>>899
0〜&hffffまでを正の整数として扱いたいってことだろか?

Long型の元格納している変数に&h8000をプラスしてDouble型に代入して&hffffでAndを取ってやれば
とりあえず&h8000〜&h7fffを&h0000〜&hffffに見立てることは出来るだろうから、
そう言う変換式を挟んでやって正の数として使ってやるんじゃダメなの?
0902デフォルトの名無しさん2015/11/23(月) 10:20:26.98ID:hVNn8eBY
二次元配列について質問お願いします。
data(100,1)にデータが格納してあり、列単位でシートに貼り付けたいのですが、書き方がわかりません、、、
.Range(”A1:A101”) = data(100,0)
.Range(”D1:D101”) = data(100,1)
のように列を分けて貼り付けたいのですが、貼り付けされずにスルーされてしまいます。
原因わかりますでしょうか?
0903デフォルトの名無しさん2015/11/23(月) 11:17:35.75ID:KcCqoYqM
>>902
VBAでは配列を1列ずつに分けることはできない
スピード重視なら最初から配列を2つに分けておくのが一番早い
どうしても2次元配列が必用なら、For Nextで1個ずつセルに書き込むとか、作業列に書き込んでからRange.Copyするみたいな方法しかない

配列を2つに分ける場合の書き方
Dim dataA(100, 0)
Dim dataD(100, 0)
.Range("A1:A101") = dataA
.Range("D1:D101") = dataD
0904デフォルトの名無しさん2015/11/23(月) 12:16:11.17ID:rlgjQim1
Variant型変数はセル範囲や配列も代入できるでしたっけ?
この辺のしくみを竹を割ったようにサッパリと分かりやすく解説していただけないでしょうか?
0905デフォルトの名無しさん2015/11/23(月) 12:52:14.25ID:7znI8Mox
Variantは基本的になんでも格納できる

まずオブジェクトとそれ以外の区別をちゃんと理解しないとダメ
そしてデフォルトプロパティという概念を理解しないとダメ
0906デフォルトの名無しさん2015/11/23(月) 13:22:18.52ID:TfJpaPii
グラフの参照範囲を書換えたり、
条件付き書式が多用されているシートの値を書換えたりするマクロがあるんですが、
実行速度を早くしたいときは
Application.ScreenUpdating = Falseにすればいいんですか?
Application.Calculation = xlCalculationManualも必要ですか?
書き換え範囲に数式はないのでこちらは不要かな?
0907デフォルトの名無しさん2015/11/23(月) 13:36:09.38ID:rbzy+nqq
>>902
.Range(”A1:B101”) = data
とすれば配列全体を一度に貼り付けられるので、そのあとシート上で移動させる。
0908デフォルトの名無しさん2015/11/23(月) 15:06:42.40ID:hVNn8eBY
>>903
>>907
助かりました。配列が分割出来ないのは知りませんでした。一つ前の列の数値を利用したいので二次元と思ったのですが、一次元で作り直してみます。
0909デフォルトの名無しさん2015/11/23(月) 17:10:55.90ID:rbzy+nqq
>>908
役に立つかとうかはわからないけど、ジャグ配列というものがある。
x = Array(Array(0, 1, 2), Array(7, 8, 9))
というように、配列を要素に持つ配列だ。これだと x(0) とx(1) を個別に扱える。
09109062015/11/23(月) 17:18:07.07ID:TfJpaPii
以下のコードを条件を変えながら実行してみましたが、
画面更新停止させず、再計算も自動が一番早かったです。
画面更新を停止させたり再計算を止めると早くなるとの解説をよくみかけるのですが、
どうしてこの場合は早くならないのでしょうか?

Public Sub ChartUpdate_test()

Dim Data1, Data2
Dim lngtime As Long
Dim i As Long
lngtime = GetTickCount

With ThisWorkbook.Worksheets("Chart")

Data1 = .Cells(3, "U").Resize(100, 10).Value
Data2 = .Cells(3, "AA").Resize(100, 10).Value

For i = 1 To 50
'Application.ScreenUpdating = False
'Application.Calculation = xlCalculationManual
.Cells(3, "U").Resize(100, 10) = Data2
.Cells(3, "AA").Resize(100, 10) = Data1
.Cells(3, "U").Resize(100, 10) = Data1
.Cells(3, "AA").Resize(100, 10) = Data2
'Application.Calculation = xlCalculationAutomatic
'Application.ScreenUpdating = True
Next i
End With

Debug.Print GetTickCount - lngtime

End Sub
09119062015/11/23(月) 17:22:42.35ID:TfJpaPii
>>910のコードの補足です。

"Chart"シートにはグラフが2つあり、
1枚目のグラフはCells(3, "U").Resize(100, 10)の範囲をグラフに表示しており、
2枚目のグラフはCells(3, "AA").Resize(100, 10)の範囲をグラフに表示しています。

コード自体は、2つのグラフのデータを入れ替えて、また元に戻すといった無意味なものです。
Application.ScreenUpdating = False や 'Application.ScreenUpdating = False で
どのくらい早くなるのか知りたかっただけです。
0912デフォルトの名無しさん2015/11/23(月) 17:58:11.65ID:7znI8Mox
ループの中で毎回オンオフするからじゃね
普通はループ入る前に停止して、ループ終わってから再開させるもんだぞ
0913デフォルトの名無しさん2015/11/23(月) 18:14:33.51ID:ubAplNXM
>>911
For文の外で切り替えたら速くならない?
1回ループする毎にTrueにしてるんだと、あんまり意味ないと思う
0914デフォルトの名無しさん2015/11/23(月) 18:30:35.23ID:TfJpaPii
>>912>>913
あ、早くなりました。そういうことか。
でもこれって、逆に言えば、
Application.ScreenUpdating = False を実行したり、
Application.Calculation = xlCalculationManual を実行するのに結構時間がかかるってことですよね?

>>910のFor〜nextの間の処理1回程度なら
Application.ScreenUpdating = False や
Application.Calculation = xlCalculationManual を実行しない方が早いってことは。

Application.ScreenUpdating = False や
Application.Calculation = xlCalculationManual はお決まりのように今までは追加してたけど、
時間のかからない処理なら逆に遅くなることもあるということか。

なるほど、勉強になりました。
ありがとうございました。
0915デフォルトの名無しさん2015/11/23(月) 18:35:24.05ID:TfJpaPii
オブジェクトにアクセスするのは時間がかかるとか、よく聞きますけど、
Application.ScreenUpdating = False や
pplication.Calculation = xlCalculationManual なんかも時間がかかる処理なんでしょうか?

他に時間がかかる処理(プロパティの参照やメソッドの実行など)ってどういうものがありますか?
今後、早いコードを書くための参考にしたいのです。
0916デフォルトの名無しさん2015/11/23(月) 18:43:27.06ID:rlgjQim1
>>905
そんなダメダメ言われても困るのですが。
どういうことですか?
0917デフォルトの名無しさん2015/11/23(月) 20:06:34.31ID:FbIB0zhM
>>915
速いコードとかくだらん事考えるな
マクロになった時点でお前が手作業でシコシコシコるより数百倍以上は速いんだから
余計な事考える時間があったらその分早く動くもの完成させろ馬鹿
0918デフォルトの名無しさん2015/11/23(月) 21:11:07.24ID:P+HbInR8
高速化はこれでいいんじゃない
http://officetanaka.net/excel/vba/speed/
0919デフォルトの名無しさん2015/11/23(月) 21:27:15.23ID:LhpXJjp9
>>914-915
> でもこれって、逆に言えば、
> Application.ScreenUpdating = False を実行したり、
> Application.Calculation = xlCalculationManual を実行するのに結構時間がかかるってことですよね?

なんでそんな結論になるかなあ…

> Application.ScreenUpdating = False

で画面更新したり

> Application.Calculation = xlCalculationManual

で再計算してるだけでしょ
0920デフォルトの名無しさん2015/11/23(月) 22:25:28.69ID:TfJpaPii
>>919

>なんでそんな結論になるかなあ…

画面更新停止したり
自動再計算を停止しても

画面更新停止しなくて
自動再計算を停止しないよりも遅いっていうのは、
そういうことじゃないんですかね?
0921デフォルトの名無しさん2015/11/23(月) 22:46:54.47ID:FbIB0zhM
>>920
わからんなら質問するなよ迷惑なアホだな
0922デフォルトの名無しさん2015/11/23(月) 22:49:24.37ID:jO9cC4Sq
>>920
画面更新とかイベントとかっていうのは停止中はオブジェクト単位でタスク命令が蓄積されて、有効になった途端に計算しはじめるから、
件のコードではNextの前に毎回実行されていたのが、ループ外で一回に変わって結果として処理が速くなった。
0923デフォルトの名無しさん2015/11/23(月) 22:56:17.49ID:TfJpaPii
>>921
わからんから質問しとるんじゃ
質問に答える能力がないなら黙っとけよ

>>922
Application.ScreenUpdating = False や、
Application.Calculation = xlCalculationManual の実行自体にはそれほど時間はかからないということですか?
0924デフォルトの名無しさん2015/11/23(月) 22:56:46.02ID:wZZgGgBT
>>920
多分>>919の人は書き間違えてる。

本当は
>> Application.ScreenUpdating = True
>で画面更新したり
>> Application.Calculation = xlCalculationAutomatic
>で再計算してるだけでしょ

と書きたかったんだと思う。

つまり画面更新や再計算の停止に時間が掛かるんじゃなくて、
画面更新再開やシート再計算の時点でその処理が実行されるから
そこで時間掛かってるわけで、
それをループ内で毎回やってたら時間が掛かって当然のこと。
0925デフォルトの名無しさん2015/11/23(月) 22:59:30.00ID:FbIB0zhM
はい黙っとけ頂きましたw
馬鹿だからって噛みつけばいいってもんじゃねーぞカス
0926デフォルトの名無しさん2015/11/23(月) 23:20:43.71ID:adyi0o7H
VBAって難しいの?
0927デフォルトの名無しさん2015/11/23(月) 23:28:48.88ID:7LxGgx6+
比較対象とか個人差とか
0928デフォルトの名無しさん2015/11/23(月) 23:40:57.09ID:jO9cC4Sq
>>923
Sub test()
tm = Timer
For i = 0 To 999
Application.ScreenUpdating = True
Next
Debug.Print Timer - tm
End Sub

とかやってみると一回当り5ミリ秒。Falseでは計測不能(0秒)。
つまり画面の再描画自体には時間が掛かるけど変数へのアクセスに時間が掛かるわけではない。
常識的に考えてマクロの実行時と終了時に一回ずつしかやらないものなので、まじない程度に入れておいても問題にはならない。
0929デフォルトの名無しさん2015/11/24(火) 01:10:08.31ID:XArPpnwT
>>926
言語として見ると処理系の挙動が独特でそれに慣れるのが難しいとも言える
プログラム的に正しく見えても意図通り動かないこともしばしば
仕様も明確にされてないから参考書数冊程度では把握できなかったり人に聞いたほうが早かったりする
0930デフォルトの名無しさん2015/11/24(火) 20:11:48.67ID:95n+nHLv
>>929
そうですか・・
一番闇っぽい部分は何でしょうね?
0931デフォルトの名無しさん2015/11/24(火) 20:23:49.84ID:edldGU/z
隠匿されているという意味ではメモリ管理
0932デフォルトの名無しさん2015/11/24(火) 21:25:08.77ID:PlNbYIXP
>>930
生半可便利なVariant型
0933デフォルトの名無しさん2015/11/24(火) 21:38:53.41ID:XArPpnwT
メモリといえばシート操作を連続でやるとExcel側がメモリリークしていくんで
一定回数でワークブックを開き直すみたいなアホな処理を強要される
他所様から見たらこいつメモリリークするコード書いてやがると要らぬ誤解を受けたりする
0934デフォルトの名無しさん2015/11/24(火) 21:40:15.07ID:95n+nHLv
>>932
でもVariantなくなったら困るし。だからVB.netには移行できない。
0935デフォルトの名無しさん2015/11/24(火) 21:57:28.94ID:81SgT53K
データの入力規則で
・入力値の種類
  →ユーザー設定
空白を無視する→チェックオフ
ドロップダウンリストから選択する→チェックオン

元の値
すいか,ばなな,みかん,めろん,りんご

と設定したセルで
VBAから「みかん」を選択する(要はドロップダウンリストのn番目を指定する)
コードはどう書けばよろしいのでしょうか?

よろしくおねがいします。
0936デフォルトの名無しさん2015/11/24(火) 21:59:37.42ID:0UvAxM6X
元の値のセル番号を使えばいいじゃん
0937デフォルトの名無しさん2015/11/24(火) 22:04:51.11ID:81SgT53K
>>936
ユーザー直設定です
0938デフォルトの名無しさん2015/11/24(火) 22:45:05.46ID:XVN89A4W
>>935
Excelのバージョンは?
俺2013だけど "ユーザ設定"で "元の値"つう項目ないんだけど
0939デフォルトの名無しさん2015/11/24(火) 23:06:22.13ID:TYqNM0v/
ワークシートを最後の2つ一括で削除するにはどうかけばいい?
0940デフォルトの名無しさん2015/11/24(火) 23:08:14.02ID:81SgT53K
>>938
レスどうもです

Microsoft Office Personal 2013
です

http://i.imgur.com/RQw8vnM.png

な、具合です。

あ、>>936さんもレスどうもです。
0941デフォルトの名無しさん2015/11/24(火) 23:21:57.76ID:XVN89A4W
>>935 940

・入力値の種類
  →リスト
じゃないのよ

List = Range("a1").Validation.Formula1
Listarry = Split(List, ",")
Range("a1") = Listarry(2)   'n番目-1 を指定
0942デフォルトの名無しさん2015/11/24(火) 23:31:10.46ID:81SgT53K
>>941
おー、すまん。

で、できた!
今年一番の感謝!!
0943デフォルトの名無しさん2015/11/25(水) 00:42:07.43ID:k75udVUc
>>939
Worksheets(Array(Worksheets.Count-1, Worksheets.Count)).Delete
0944デフォルトの名無しさん2015/11/25(水) 11:03:02.92ID:W4Dtt94w
複数セルの日付の集合から、日付xの直近の日付を取得したくて、
関数maxで配列関数を使って条件付き最大値を求める方法と、
関数DMAXを使って条件付き最大値を求める方法を思い付いたのですが、両方うまくいきません。

Maxの方は配列関数のコードの書き方がさっぱりで挫折してます。
ググっても何も出てきません。

DMAX(データベース、フィールド、検索条件)の方は、
この検索条件には通常2セル以上の範囲を指定する必要がありまして、
ここに変数を入れたいのですが書き方がダメらしく動きません。

解決方法はありますでしょうか。
0945デフォルトの名無しさん2015/11/25(水) 13:37:27.70ID:SJUIx2JE
つか、VBAか、それ?
ここはVBAのスレだけど
0946デフォルトの名無しさん2015/11/25(水) 14:11:55.73ID:W4Dtt94w
>>945
VBAじゃないかもしんないですね。
コードを見たことがない。
やっぱりできないのかなー。
0947デフォルトの名無しさん2015/11/25(水) 14:32:59.09ID:Q7BYyzgj
>>944
無ければ作ればいいじゃない。
https://msdn.microsoft.com/ja-jp/library/office/gg251417(v=office.15).aspx
0948デフォルトの名無しさん2015/11/25(水) 14:36:44.96ID:6fc7ZrCM
>>946
関数でやるならこっちが詳しい人いるかも。

Excel総合相談所 120 [転載禁止]©2ch.net
http://peace.2ch.net/test/read.cgi/bsoft/1445988669/
0949デフォルトの名無しさん2015/11/25(水) 14:39:22.53ID:8iY9CP3j
>>946
普通にやれば?

Sub foo(d As Date, r As Range)
  recentdate = "2099/12/31"

  For Each c In r
    If c.Value > d And c.Value < recentdate Then
      recentdate = c.Value
    End If
  Next

  Debug.Print recentdate
End Sub
0950デフォルトの名無しさん2015/11/25(水) 14:48:02.75ID:Q7BYyzgj
ところで、配列関数って何?
初めて聞いたよ。
0951デフォルトの名無しさん2015/11/25(水) 15:02:17.86ID:W4Dtt94w
>>950
http://www.eurus.dti.ne.jp/~yoneyama/Excel/waza/max.html
これです。
簡単で好きなんです。
0952デフォルトの名無しさん2015/11/25(水) 15:13:01.05ID:yxQ7T38W
ここ見てると、たまにVBA上級本なんかよりも
はるかに難しいことやってる人がけっこういるみたいなんだけど
そういうことはどこで勉強できるん?
0953デフォルトの名無しさん2015/11/25(水) 15:36:34.17ID:Q7BYyzgj
>>952
どこででもかな。多言語も全て参考になるよ。
多言語の知識がVBAに必要とは全く思わないから、
出来ないと思った時点で、頑張る必要は無い言語だとも思う。
只、考えの切り口を変えるだけで、意外とあっさり出来てしまうことがあったりするだけ。
0954デフォルトの名無しさん2015/11/25(水) 15:41:54.87ID:8iY9CP3j
>>952
そのはるかに難しいことの大部分は、書籍かMSDBかWebにある。
0955デフォルトの名無しさん2015/11/25(水) 15:42:32.16ID:8iY9CP3j
誤) MSDB
正) MSDN
0956デフォルトの名無しさん2015/11/25(水) 16:12:46.56ID:LoKzz2Cb
>>952
そんなに難しい話題あったっけ?
0957デフォルトの名無しさん2015/11/25(水) 16:14:36.90ID:Q7BYyzgj
>>949
リテラル大丈夫なんだっけ?
0958デフォルトの名無しさん2015/11/25(水) 16:24:39.44ID:8iY9CP3j
>>957
質問の意味がわからない。
0959デフォルトの名無しさん2015/11/25(水) 19:07:12.52ID:bucl0FkB
>>943
トン
できれば数は可変にしたいのですが
0960デフォルトの名無しさん2015/11/25(水) 19:16:14.20ID:Y7LXrVIm
>>959
Worksheets(Worksheets.Count) で最後のシート(タブが一番右のシート)は指定できるんだから
For Nextで好きなだけループさせたら良いよ
0961デフォルトの名無しさん2015/11/25(水) 19:35:49.61ID:bucl0FkB
>>960
トン
0962デフォルトの名無しさん2015/11/26(木) 00:37:14.71ID:lO2ICC3C
エクセルファイル開いたら
いつ開いても毎分ジャスト00秒にマクロを自動実行するコードを作りたいです
ONTIMEでやろうとしたら訳が分からなくなってしまいました
良ければコード作成お願いします
0963デフォルトの名無しさん2015/11/26(木) 00:43:23.30ID:PaTJPcd0
>>962
時間は日本標準時とパソコンの時間があってだな
0964デフォルトの名無しさん2015/11/26(木) 02:59:35.16ID:flHxSkRK
>>962
次の 00秒に実行って
Application.OnTime TimeSerial(Hour(Now()), Minute(Now()) + 1, 0), "マクロ"
で出来るぞ
毎分って指定できないから 実行されるマクロの最後で 自身を再スケジュールする
0965デフォルトの名無しさん2015/11/26(木) 18:43:15.52ID:K+PhK5Oc
2つのシートの内容(Valueと考えてもらって結構です)
が全く同じであることをチェックしたいのですが
Cells(1,1)からCells(シート名.Rows.Count, シート名.Columns.Count)まで
1セルずつForとIfでチェックしていくのは現実的でないと感じています
他のやり方があれば教えてください
0966デフォルトの名無しさん2015/11/26(木) 19:23:57.78ID:gyWZp0Bb
>>928
レスが遅くなり申し訳ありません。

時間計測までしていただきありがとうございます。
なるほど納得しました。
おまじない入れておくことにします。
0967デフォルトの名無しさん2015/11/26(木) 19:42:18.45ID:NcY8OWJd
>>965
CSVをcmdからFC
遅いけどコードは簡単

つか、Rows.Count/Columns.Countまでって、マジか?
そんな巨大データ、入力終わる前にExcelが落ちそうな気がするんだが
0968デフォルトの名無しさん2015/11/26(木) 20:10:03.20ID:A9Opz0M4
>>965
> 1セルずつForとIfでチェックしていくのは現実的でないと感じています

理由は?
普通にやるならそれが一番簡単だと思うし、配列に入れて比較すればそれほど遅くないし
0969デフォルトの名無しさん2015/11/26(木) 20:12:12.88ID:L9oQ022U
>>965
Sub test()
x = A.UsedRange
y = B.UsedRange

For i = LBound(x, 1) To UBound(x, 1)
For j = LBound(x, 2) To UBound(x, 2)
If x(i, j) <> y(i, j) Then Stop
Next
Next

End Sub

全く同じでない限りどこかで止まる。
0970デフォルトの名無しさん2015/11/26(木) 20:33:44.99ID:PB3DqV4H
adoのレコードセットのフィールドの値とるために
レコードセット!range("a1")
といった感じで書いたんですか、とれません。
どう書けばとれるんでしょうか?
0971デフォルトの名無しさん2015/11/26(木) 21:40:23.70ID:lO2ICC3C
>>964
ありがとうございます 助かりました!
0972デフォルトの名無しさん2015/11/26(木) 22:10:56.13ID:flHxSkRK
>>970
やっぱ その書いた全文は 極秘事項で
「・・・といった感じで書いたんです」
と感じ しか教えてくれんのね

そんなんで分るかボケ

ところで ADOの使い方間違ってる
そゆう変数の使い方は出来ないよ

Range("A1") とかかないで [A1] と書くみたいな
省略した書き方は最初に覚えない方が良いとおもうぞ
0973デフォルトの名無しさん2015/11/26(木) 22:18:45.30ID:PB3DqV4H
>>972
トン
[a1]だけで、セルのバリューでフィールドとれるんですか。
0974デフォルトの名無しさん2015/11/26(木) 22:23:05.36ID:flHxSkRK
最後の1行読め 覚えるなと言ってる
つまり
レコードセット!フィルード
の形式を使うなって事
0975デフォルトの名無しさん2015/11/26(木) 23:14:10.18ID:PB3DqV4H
>>974
たとえばサンプルとして以下の場合、次の部分はどう書くんですか?省略せず
Debug.Print rs!売上日, rs!社員名, rs!性別, rs!売上額, rs!職種

Sub ADORecordset修正()

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Set cn = CurrentProject.Connection
Set rs = New ADODB.Recordset

rs.Open "T_売り上げ管理", cn, adOpenForwardOnly, adLockReadOnly

Do Until rs.EOF '--- A
Debug.Print rs!売上日, rs!社員名, rs!性別, rs!売上額, rs!職種
rs.MoveNext '--- B
Loop

rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing

End Sub
0976デフォルトの名無しさん2015/11/26(木) 23:37:34.92ID:flHxSkRK
rs.Fields("売上日")
とかじゃね?
0977デフォルトの名無しさん2015/11/27(金) 16:58:24.01ID:ueGoHWsY
sheet2のA5〜A3800まで1000〜9999までの数字が重複なくランダムにあり、
sheet1のA2〜A5500まで1000〜9999までの数字が重複なくランダムにある状態で、
sheet1とsheet2のAセルの値が一致した場合、一致した行のsheet2のD〜Gセルの値を一致した行のsheet1のD〜Gセルに
入れたいのですが、下記の2重ループだと時間がかかってしまいます。
もっと時間を短縮したいのですが、何か方法はないでしょうか?

Sub test()
Application.ScreenUpdating = False

With Worksheets("sheet1")
For rw = 2 To 5500
For cnt = 5 To 3800
If .Cells(rw, 1).Value = Cells(cnt, 1).Value Then
.Cells(rw, 4).Value = Cells(cnt, 4).Value
.Cells(rw, 5).Value = Cells(cnt, 5).Value
.Cells(rw, 6).Value = Cells(cnt, 6).Value
.Cells(rw, 7).Value = Cells(cnt, 7).Value
Exit For
End If
Next
Next
End With

Application.ScreenUpdating = True
End Sub
0978デフォルトの名無しさん2015/11/27(金) 17:48:36.75ID:S34hIKoL
大量のセルにアクセスするなら一旦配列に入れろってのが常套手段

が、なんかそのぐらいならワークシート関数だけで出来る気がする
0979デフォルトの名無しさん2015/11/27(金) 19:47:14.80ID:D4cHMDIr
>>977
Sub test()
With Worksheets("Sheet1")
s1 = Range(.Cells(2, 1), .Cells(5500, 7))
End With

With Worksheets("Sheet2")
s2 = Range(.Cells(5, 1), .Cells(3800, 7))
End With

For i = LBound(s1, 1) To UBound(s1, 1)
For j = LBound(s2, 1) To UBound(s2, 1)
If s1(i, 1) = s2(j, 1) Then
For k = 4 To 7
s1(i, k) = s2(j, k)
Next
End If
Next
Next

With Worksheets("Sheet1")
Range(.Cells(2, 1), .Cells(5500, 7)) = s1
End With
End Sub
0980デフォルトの名無しさん2015/11/27(金) 19:51:50.81ID:9HV+ag/s
>>977
なんぼか前の過去スレで
ビンゴゲームのプログラムというかアルゴリズムの話題が出て
そこで出てたんだけどさ

二つのセルの値を順に調べるんじゃなくて
最初に要素数9000個の配列変数を2つ宣言して
そこに対応するセルの行番号に順に入れてくの

つまり、
Dim Sh1(0 to 8999),Sh2(0 to 8999)
とか宣言して
Sheets1のA2が4926で、A3が1297だったら
Sh1(4926 - 1000)=2、Sh1(1297 - 1000)=3、
とかこんな感じ
(1000引いてるのは配列の添え字と実際の数字が1000ずれてるから)
Sh2()も同じように入れていって、
最終的にFor i =0 To 8999 で
Sh1(i)とSh2(i)を順に比較していって
同じ数字なら重複だからそれにそった処理をする
どっちかしか入ってないとき(あるいは両方とも空の時)は重複してないから次へ進む
って感じで処理するというやり方

各シート内のセル間では値の重複がないからこれでいけるんだよね
果たして速いかどうかは知らないけど
0981デフォルトの名無しさん2015/11/27(金) 19:58:09.79ID:9HV+ag/s
>>980はちょっと説明が変だった

Sh1(i)とSh2(i)が両方とも空じゃなかったら
Sh1(i)に入った行に対応したセルと
Sh2(i) に入った行に対応したセルの値がどっちも同じ(i + 1000)ってことになる
だった
0982デフォルトの名無しさん2015/11/27(金) 20:11:45.18ID:WCZ3L9M0
>>977
まこれだけでも
約2000万回(5500x3800)のループから 約5500回のループになるから
大分ちがうとおもうよ
(シート2をループさせれば3800回だけどこの辺は下を参考にして変更してね)

Dim Ws1_R As Range
Dim Ws2_R As Range
Dim R As Range
Dim ROW As Variant 'Variantでないとダメよん
Application.ScreenUpdating = False
Set Ws1_R = Worksheets("SHEET1").Range("A2:A5500")
Set Ws2_R = Worksheets("SHEET2").Range("A5:A3800")
For Each R In Ws1_R
 ROW = Application.Match(R.Value, Ws2_R, 0)
 If Not IsError(ROW) Then
  R.Offset(0, 3).Resize(1, 4).Value = Ws2_R.Cells(ROW).Offset(0, 3).Resize(1, 4).Value
 End If
Next
Application.ScreenUpdating = True

テストしたら 絶対一致しないパターンだと
>>977 が 67s で 上が0.5s
さらに高速化しようとしたら配列だぬ
0983デフォルトの名無しさん2015/11/27(金) 20:15:46.59ID:da9bxK3g
うめ
0984デフォルトの名無しさん2015/11/27(金) 20:39:25.69ID:9HV+ag/s
>>983
埋めるならまず次スレを建てよう

ということで次スレ
http://peace.2ch.net/test/read.cgi/tech/1448624205/l50
09859772015/11/27(金) 21:08:32.35ID:ueGoHWsY
>>978->>982
皆さんレスありがとうございました。
特に>>979さん、>>982さんのコードで以前の100分の1程度の時間で完了できるように
なり、これでやりたいことがかなり効率的にできるようになりました。
本当にありがとうございました。
0986デフォルトの名無しさん2015/11/28(土) 04:28:56.18ID:pUzfW1Xj
うめ
0987デフォルトの名無しさん2015/11/28(土) 13:52:20.90ID:49Yj8K8D
力技でコード組んでも、工夫で軽くなるんだなー。
感動する。
0988デフォルトの名無しさん2015/11/28(土) 20:36:51.89ID:7Nzrztmy
うめ
0989デフォルトの名無しさん2015/11/28(土) 22:52:24.75ID:W/xTcAqm
バラク・小浜
0990デフォルトの名無しさん2015/11/29(日) 04:07:41.64ID:go0WztlF
>>988
ウメモッチーノ
0991デフォルトの名無しさん2015/11/29(日) 05:02:15.01ID:AkCGW1ae
うめ
0992デフォルトの名無しさん2015/11/29(日) 06:38:16.41ID:ofqZS0/w
うめ
0993デフォルトの名無しさん2015/11/29(日) 09:20:45.32ID:UjY32LCs
>>985
いまさらながら>>980のアルゴリズムでコード書いてみた
このコードだと各セルの値が整数でないとダメとか、
若干の制約はあるけど実行スピードは速いみたいよ

Sub test()
Dim rw As Long
Dim tmp As Long
Dim idx() As Long
ReDim idx(0 To 9999)
Application.ScreenUpdating = False
With ThisWorkbook.Sheets(2)
For rw = 5 To 3800
idx(.Cells(rw, 1).Value) = rw
Next rw
End With
With ThisWorkbook.Sheets(1)
For rw = 2 To 5500
tmp = idx(.Cells(rw, 1).Value)
If tmp > 0 Then
.Cells(rw, 4).Resize(1, 4).Value = ThisWorkbook.Sheets(2).Cells(tmp, 4).Resize(1, 4).Value
End If
Next rw
End With
Application.ScreenUpdating = True
End Sub
0994デフォルトの名無しさん2015/11/29(日) 12:56:50.04ID:Yod17yPO
>>977
シートをソートしてから突き合わせればすぐ終わるだろ
0995デフォルトの名無しさん2015/11/29(日) 20:34:50.04ID:/hdNGIJ1
うめ
0996デフォルトの名無しさん2015/11/30(月) 04:32:25.41ID:D4iMrDsB
0997デフォルトの名無しさん2015/11/30(月) 04:33:47.91ID:TNWuC1ai
うめ
0998デフォルトの名無しさん2015/11/30(月) 07:52:45.09ID:s0H/5W+p
sub ume()
0999デフォルトの名無しさん2015/11/30(月) 09:02:54.56ID:BURmYQFZ
そこはsubじゃなくてSubと書けよと
1000デフォルトの名無しさん2015/11/30(月) 09:05:39.16ID:LH7PQQfb
End Sub
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
10021002Over 1000Thread
2ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 2ちゃんねる専用ブラウザからの広告除去
★ 2ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
http://premium.2ch.net/
http://pink-chan-store.myshopify.com/
レス数が1000を超えています。これ以上書き込みはできません。