Excel VBA 質問スレ Part38 [転載禁止]©5ch.io
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2015/09/07(月) 18:59:39.00ID:E2JS6OsF___
___ /____ヽ ____
/____\ | |´・ω・`| | /___ヽ
.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:E2JS6OsFhttp://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:/+iyKv2WSub 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この辺の話のことか?
http://www.happy2-island.com/vbs/cafe02/capter00110.shtml
0006デフォルトの名無しさん
2015/09/08(火) 05:45:49.03ID:/+iyKv2Wはい引数5とは何を意味するのでしょうか?
0007デフォルトの名無しさん
2015/09/08(火) 06:07:52.96ID:sMbWt4zdhttps://msdn.microsoft.com/ja-jp/library/cc364421.aspx
0008デフォルトの名無しさん
2015/09/08(火) 12:22:34.20ID:NVN8kZyV0009デフォルトの名無しさん
2015/09/08(火) 23:24:02.41ID:fPKzpPbSありがとうございました。
>>5
この解説が5のみを飛ばしているので本当に悩みました。。
0010デフォルトの名無しさん
2015/09/08(火) 23:25:38.02ID:fPKzpPbS既に実装済みなので、口の中まで入ってましたw
0011デフォルトの名無しさん
2015/09/09(水) 02:39:57.70ID:ectLRYRT0012デフォルトの名無しさん
2015/09/09(水) 03:19:16.57ID:uHaCyZBlファイルの日付を取得する
http://www.happy2-island.com/vbs/cafe02/capter01102.shtml
0013デフォルトの名無しさん
2015/09/09(水) 18:16:27.23ID:ectLRYRTそれはしってて、出来るのかどうか知りたい
ところで、fso関連でいうと、ファイル名の取得させると、動いてるんだけど、Excelが固まって、他のブックに切り替えもできないんだけど、回避方法ってあるかな?
0014デフォルトの名無しさん
2015/09/09(水) 20:31:37.11ID:whASp/iz窓のファイル日付は作成/更新/参照の3種類があってWin32APIのGet/SetFileTimeで全部参照と変更可
それとファイル関係の操作は全部直接Win3APIでやるのがお勧め
0015デフォルトの名無しさん
2015/09/09(水) 20:33:23.41ID:k4ZkuMcUたぶんループ処理中の事だと思うけどDoEvents入れれば処理中でもシート弄れる。
そういやループ処理中は破棄した変数が解放されずにたまるから重くなるとかいう記事を見たんだけど、
ループ処理させずにループ処理と同じ事させる方法ってあんのかな。
0016デフォルトの名無しさん
2015/09/09(水) 20:40:05.38ID:ectLRYRTdoeventいれたら、本来の処理はとまっちゃうんでしょ?
0017デフォルトの名無しさん
2015/09/09(水) 21:04:33.91ID:k4ZkuMcUそれはStopだな。
0018デフォルトの名無しさん
2015/09/09(水) 21:50:30.24ID:eA9RoHxO0019デフォルトの名無しさん
2015/09/09(水) 21:57:22.44ID:xwZ52Y1A0020デフォルトの名無しさん
2015/09/09(水) 22:28:44.94ID:RVc7QyxG0021デフォルトの名無しさん
2015/09/09(水) 23:46:50.75ID:ectLRYRT深いこといいたいの?
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:wN8JFJBW0025デフォルトの名無しさん
2015/09/10(木) 20:03:34.12ID:0qqo7x+80026デフォルトの名無しさん
2015/09/10(木) 20:07:40.52ID:tchTbgrv0027デフォルトの名無しさん
2015/09/10(木) 20:17:47.68ID:8yg+xC410028デフォルトの名無しさん
2015/09/10(木) 22:28:54.26ID:+NpM52Lz君は ねらわれている
ふりむくな ふりむくな ふりむくな
地球を侵す者たちに 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)
0029デフォルトの名無しさん
2015/09/11(金) 12:42:07.22ID:H41I+Dftあまり深掘りしている情報も見つからず、使えるのか使えないのかもよくわからない。
0030デフォルトの名無しさん
2015/09/11(金) 14:17:28.05ID:UJrMjXn02016年であれば「専務」
って言う式をお願いします。
003130
2015/09/11(金) 14:21:13.56ID:UJrMjXn00032デフォルトの名無しさん
2015/09/11(金) 14:46:29.03ID:LOwfnHUO0033デフォルトの名無しさん
2015/09/11(金) 14:47:09.01ID:LOwfnHUO…って、どこだw
0034デフォルトの名無しさん
2015/09/11(金) 20:36:34.16ID:EmY3jWzK0035デフォルトの名無しさん
2015/09/11(金) 20:44:59.84ID:2kUpW7Kd管理者ユーザーならもちろん変えられるが、VBAと何の関係が?
0036デフォルトの名無しさん
2015/09/11(金) 21:27:30.56ID:z1o7I+D1降格かよ
0037デフォルトの名無しさん
2015/09/11(金) 21:38:06.86ID:EmY3jWzKどのように書くんですか?icacls
0038デフォルトの名無しさん
2015/09/12(土) 15:37:15.80ID:PSC5C/npRange("A1:E8").Select
Selection.Find(What:=Application.WorksheetFunction.Max(Selection)).Select
こんな文を見つけたのですが、
オブジェクト変数またはwithブロック変数が設定されていません と出ます
0039デフォルトの名無しさん
2015/09/12(土) 16:16:29.83ID:KrhE9tL1Function 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:h9KeNJ6oRange("A1:E8")になんか値が入ってないとエラーがでるみたいよ
0041デフォルトの名無しさん
2015/09/12(土) 20:37:06.04ID:GDHibxma参照設定でexcelobjectがないとかなんとか
0042デフォルトの名無しさん
2015/09/13(日) 00:25:42.27ID:f7snMU36ここで変数やFor文を使えるようにできませんか?
0043デフォルトの名無しさん
2015/09/13(日) 01:29:34.87ID:j8lACS4K変数は定義できないだけで使えるけど?
複数の行にまたげないだけで、For文も使えるけど?
For i=1 to 10:Print i:Next
たとえばこんなの入力してみ
0044デフォルトの名無しさん
2015/09/13(日) 09:21:02.53ID:Jm5r3jb9ActiveXに変更できないでしょうか?
'==================================================================================
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:Jm5r3jb9Function 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以下のコードが記録されたけども
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:HYANgCcSCOBOLを30年前にしていました。5年やって結婚退職しました。その後はプログラミングを一切やっていません
子供が大きくなったので事務のパートに行くことにしました。
昔プログラマーだったことを話すと、「VBAできるでしょ、この処理をマクロにして」と上司に言われました。
COBOLしかしていませんが、VBAをすぐに使えるようになるでしょうか?
このパートで首になったら、年齢的に清掃か介護の仕事しかありません。
参考書は大村あつし「かんたんプログラミング」を買いました、が
COBOLでいうところの「OPEN INPUTFILE」処理とかMOVE、WRITEが無いのでつまずいています。
0048デフォルトの名無しさん
2015/09/13(日) 18:09:34.89ID:wPz1MVxWCOBOLの基礎概念を全て捨ててまっさらな脳で取り組んだ方が習得が早いと思いますよ
人に話すときには元プログラマーというと誤解されるのでにコポラーと言った方がいいです
0049デフォルトの名無しさん
2015/09/13(日) 18:54:11.43ID:nhNM0pAX何も知らなくてもマクロの記録で適当に組み合わせれば即動く物ができるし
30年ブランクだとマクロよりExcelとかのOfficeの使い方の方が戸惑うんじゃないの
0050デフォルトの名無しさん
2015/09/13(日) 20:27:24.18ID:8cqOMIq7あとは
・変数 = Range(...)でセルの内容を取り込む
・Range(...) = 変数で二次元配列の内容をセルに反映させる
っていうの覚えとけば後はIfとかForくらいしか使わないから楽
0051デフォルトの名無しさん
2015/09/13(日) 22:34:33.36ID:3BsRFwaLC/C++、スクリプト言語まで、
10言語ぐらいプログラミングできるけど、
COBOLだけは理解不能だな
ハローワークでも、COBOLの募集はあるけど、
簡単に学べる本がない
0052デフォルトの名無しさん
2015/09/13(日) 23:22:12.44ID:nQBKdNbg005347
2015/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:m92hyV44VBEの使い方をマスターすれば問題ないと思う
やりたい事を検索すれば参考になるコードはすぐ見れるから
デバッグを効率よくするためにVBEに早くなれて下さい
0056デフォルトの名無しさん
2015/09/14(月) 18:35:12.98ID:KuhWma5+PCがネットに繋がってないんでオフラインで使える
Excel 2013 Developer Documentation.chm
てのをダウンロードしたんだけど、英語版なのはまだ良いとして
肝心のヘルプとしての機能がちゃんとしてないのか
関数のパラメータとか調べたくてもそれが出てこない
例えばFormatで使える書式をみたくてFormatで検索しても
あんまり関係ない情報ばかりが出てきて、欲しい情報は見つからない
しょうがないから自前のスマホでネット検索して調べてるんだけど
古い機種なんで画面小さくて見辛いんで仕事が捗らないこと甚だしい
これってどうしたらいいの?
もうちょっとまともなオフラインのヘルプファイルってないのかな?
0057デフォルトの名無しさん
2015/09/14(月) 21:38:55.02ID:EGWtHR3Q0058デフォルトの名無しさん
2015/09/14(月) 22:12:07.98ID:pXK5pJDJオフラインどころかオンラインでもまともなものはない
逆引系の本買いなさい
技術者たるもの知識集めに金を惜しんではならない
0059デフォルトの名無しさん
2015/09/14(月) 22:37:26.37ID:KuhWma5+iPad持ってない
というかApple製品は何も持ってない
iTunesすらダウンロードしてない
Apple製品って物自体は良い製品なんだろうとは思うんだけど
やたらユーザーを支配したがるというか囲い込みたがる姿勢が嫌いなんだよね
MSも段々その傾向が出てきてて嫌な雰囲気だけど……
>>58
>オフラインどころかオンラインでもまともなものはない
マジか……orz
2010までは割とヘルプみながらで作れたんだけどなぁ……
0060デフォルトの名無しさん
2015/09/15(火) 22:19:24.42ID:KQEQzEy1ネットにつながってないと「ページが表示できません」になる
オフラインのヘルプが欲しかったら、それだけのために2010あたりをインストールするしかないのかも?
0061デフォルトの名無しさん
2015/09/15(火) 23:18:02.10ID:wIsrso68ゲーム作ろうと思ってるんだけど
なぜか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押されたかどうかをどうやって判断してんのか、その部分のコード晒して
0063デフォルトの名無しさん
2015/09/16(水) 00:25:03.03ID:rMn0Czewほぼとあるサイトのサンプルままなんだが
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'左
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:rMn0CzewIf 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:rMn0CzewobjChar(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おかしい部分が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おおいけた!!!
知恵袋で聞いてもできなかったのに
さんくす!!!
0069デフォルトの名無しさん
2015/09/16(水) 01:25:56.15ID:vIYm92da0070デフォルトの名無しさん
2015/09/16(水) 01:47:25.86ID:Cx9YrWpB0071デフォルトの名無しさん
2015/09/16(水) 02:28:05.78ID:9fL6Ueyi0072デフォルトの名無しさん
2015/09/16(水) 12:24:37.69ID:9lfWhZ9r0073デフォルトの名無しさん
2015/09/16(水) 12:28:57.22ID:MQ6WnVci0074デフォルトの名無しさん
2015/09/16(水) 15:09:32.12ID:zUxOp5EfだからIntegerで受けるのはあってると思う
0075デフォルトの名無しさん
2015/09/17(木) 20:40:42.90ID:7HP4sLLYものすごい低レベルな質問で恐縮なんだけど
>>64の1行目にある
Do Until False
って、何でこういう書き方してるの?
ただ単に Do だけでも変わらないって事はないの?
0076デフォルトの名無しさん
2015/09/17(木) 21:56:36.75ID:0bI43UuxDoだけでも同じ動作はする
実際の理由は書いた奴に聞かんとわからんが
Doだけだと、Loop側に条件書いてる可能性があるから
前判定で明示的に無限ループさせてる事を解りやすくする為だろうな
0077デフォルトの名無しさん
2015/09/18(金) 00:26:17.93ID:k7q6/Xtnどうもありがとう
なるほど、やっぱり論理判定上の意味合いはなかったんだね
もしかして俺の知らないような特殊な構文があるのかと思ってたよ
0078デフォルトの名無しさん
2015/09/18(金) 00:29:54.32ID:cBOk0nK1本来の条件をコメントアウトしてるだけだろう
007975
2015/09/18(金) 05:58:20.79ID:k7q6/Xtnそれはつまり
Do Until Hoge = False
だとか書いてあったところを
Do Until False
にしたんだろうってこと?
そんな中途半端な端折り方するかなぁ?
ここでさらすために関係ないところを消したのなら、
普通だったら Do だけにすると思うよ
もしくは、デバッグ時の一時的な措置としてなら条件部分は消さないで
Do の後ろを’でコメントアウトさせるとかするよね
まぁ、仮にどういう理由での端折り方だったとしても
Do とDo Until False でコードとしての挙動が変わらないなら
>>75での疑問への答えには関係ないことだけど
0080デフォルトの名無しさん
2015/09/18(金) 06:03:01.62ID:/9LiLA2gC++でゲーム作る時は Do{...}While(1) とかやるし。
0081デフォルトの名無しさん
2015/09/18(金) 08:10:17.90ID:vvwUaO7x> Do{...}While(1) とかやるし。
for( ; ; ){ ... } だろ
そもそも C++ はすべて小文字だし
0082デフォルトの名無しさん
2015/09/18(金) 12:04:15.66ID:kHPw/fq6do while true
っていつも書いてる。
誰かが書いてるのを流用して覚えたのかな、わからんわ。
0083デフォルトの名無しさん
2015/09/18(金) 15:42:42.50ID:TFTTQabPVBAでいったい何作ってんだよ
0084デフォルトの名無しさん
2015/09/18(金) 16:30:22.86ID:+Yui8Vmg>>61
>ゲーム作ろうと思ってるんだけど
まあ、VBAが向いてるとは思わんが
0085デフォルトの名無しさん
2015/09/18(金) 17:37:12.00ID:F1j6zTfgこういうのありがちかもと思った。
Do While True
buf = getData()
If buf = "" Then
Exit Do
End If
doSomething buf
Loop
0086デフォルトの名無しさん
2015/09/18(金) 17:39:38.80ID:RwvEkWDv採番処理のリトライとか
0087デフォルトの名無しさん
2015/09/18(金) 18:48:13.04ID:fLNXHY+lそういう場合はgetData()の中でループしてデータが入ってくるまで待つように作った方がいいんじゃないか?
さもなくばデータの有無を取得するためのメソッドかプロパティか変数を用意するのが筋だと思うんだが
無限ループで待つのはあんまりいい実装じゃ無いと思う
0088デフォルトの名無しさん
2015/09/18(金) 20:00:01.78ID:WxafZwof人のコードを見たら脊椎反射で添削するのやめろよ
荒れる元だ
添削は頼まれた時だけにしろ
0089デフォルトの名無しさん
2015/09/18(金) 20:13:59.39ID:h/Y8JD3x3と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それでいいんじゃね?
自分だったら 数値を配列にいれてFORループ処理するにゃ
(やる事は基本 >>89と同じだけど)
あと すべて同差だったらどうするの?
0091デフォルトの名無しさん
2015/09/18(金) 22:10:16.34ID:/9LiLA2gDim 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>Whileの部分には終了用のフラグとか入るから
明示的に無限ループさせるって話だったはずなんだが
forの無限ループも他言語ならそこそこ見る定形処理
0093デフォルトの名無しさん
2015/09/18(金) 22:24:50.90ID:+Yui8Vmg要素が三つしかなくてソートされてるなら、1−2番目か2−3番目かしかないから
それぞれの差とって比較して、小さいほうの平均取ればいいんじゃね
ソートされてないなら、ソートしてもいいけど、三つぐらいなら総当たりでもいいか
0094デフォルトの名無しさん
2015/09/19(土) 00:49:55.88ID:qwiT5joB0095デフォルトの名無しさん
2015/09/19(土) 03:20:58.94ID:ZcnBR6n/手抜きだから同差だと答えが出ない
元データ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> 一緒くたにして複雑にすることはない
そんなことしてる奴はいないけど?
0098デフォルトの名無しさん
2015/09/19(土) 09:49:54.54ID:zNER9jB5>>91
0099デフォルトの名無しさん
2015/09/19(土) 09:58:07.05ID:x1zzYklZindexとか配列とかなくした
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そういや捨てるならスタックする必要無かったわな。
0101デフォルトの名無しさん
2015/09/19(土) 11:01:51.71ID:GIof26cq増えそうなら初めから3つとか言う限定した仕様で作らんわ
0102デフォルトの名無しさん
2015/09/19(土) 12:24:34.40ID:Yu07ddUr0103デフォルトの名無しさん
2015/09/19(土) 13:14:42.74ID:ZcnBR6n/元データを配列にして、結果を求める部分はFunctionに分ける、ぐらいしか今できる対策はないかな
あとはソート、差分、平均の3段階に分けて処理するだけ
0104デフォルトの名無しさん
2015/09/19(土) 13:24:02.90ID:QbvRavMs010589
2015/09/19(土) 18:44:08.61ID:Hkqr5ylJ微妙に違いますが、95様の回答が現状といったところです
ただ、95様の回答が見やすくわかりやすいので、こちらに書き換えようと思います^_^;
比較対象が増えたら他の皆様の回答も検討ですが…今はこれで十分です
ありがとうございました
0106デフォルトの名無しさん
2015/09/19(土) 21:01:11.75ID:x1zzYklZコード少し長くなるけどこうすれば同差でも答えが出る
あと、感知出来ないほどの微妙な差だけど
理論的には処理スピードが若干速い(はず)
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:Ser2uuvvDim 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論理式でやることの是非は別にしてせめて IIf( ) 使え
0110デフォルトの名無しさん
2015/09/20(日) 15:04:26.59ID:yJDvCFfh0111sage
2015/09/20(日) 15:07:31.62ID:yJDvCFfhDim 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)
0112sage
2015/09/20(日) 15:08:19.44ID:yJDvCFfhi(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:yJDvCFfhDim 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:pUWit5sQ0115デフォルトの名無しさん
2015/09/20(日) 15:31:10.32ID:N1tzaqkj0116デフォルトの名無しさん
2015/09/20(日) 16:04:25.93ID:WypcIozpIIfは重いから使うくらいなら普通にIf使った方がいい。
0117デフォルトの名無しさん
2015/09/20(日) 16:14:07.99ID:+ZypWgyJElseを使わない場合は置き換える意味があまりない
素直にIfを使った方がいい
0118デフォルトの名無しさん
2015/09/20(日) 16:17:27.99ID:Xw2a/eLo0119デフォルトの名無しさん
2015/09/20(日) 16:32:54.96ID:+ZypWgyJobjDic.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+EjQi0121デフォルトの名無しさん
2015/09/20(日) 16:48:05.91ID:+ZypWgyJこういう不統一を見ると修正したくてムズムズする
0122113
2015/09/20(日) 17:02:28.33ID:yJDvCFfhAPIがないので、力技でやっています。
>>118
目的のデータを抽出する方法が、
もっと工夫できるかなと思った次第です。
>>119
おっしゃる通り、配列とループでまとめられそうです!
>>120
セミコロンの全角・半角は引っかかるところでした。
こういうの、困りますよね
>>121
Amazonの記載を合わせて、配送予定にしたんですが、
確かに、違和感ありまくりですね
0123113
2015/09/20(日) 17:06:50.78ID:yJDvCFfh一時的に保持するのは、配列 or Dictionary型変数でいいとして、
恒久的に残す方法としては、DBとエクセルのセル、
ほかに、手段はありますか?
0124デフォルトの名無しさん
2015/09/20(日) 17:23:07.51ID:JN4sWUyx途中でHTMLの構造が変わっても対応できるし
0125113
2015/09/20(日) 18:23:04.09ID:yJDvCFfhそれは頭になかったです。
データの抽出個所が作り終わったら、
アマゾンの注文詳細ページを保存する処理を作ります。
ありがとうございました
0126デフォルトの名無しさん
2015/09/20(日) 18:30:26.40ID:TCLy3oJX0127デフォルトの名無しさん
2015/09/20(日) 19:44:07.88ID:b29G919i> この程度の分岐なら If をなくして論理式だけで計算する方法もある。
が前提なのに何を言ってるんだ?
0128デフォルトの名無しさん
2015/09/20(日) 23:27:46.38ID:WP4lHv1XとりあえずIfよりも分かりにくいのは明らかなデメリットなんだけど
0129デフォルトの名無しさん
2015/09/20(日) 23:40:18.29ID:hazPNZsdCPUが並列的に処理するので処理速度的に有利なんじゃないかな。
0130デフォルトの名無しさん
2015/09/20(日) 23:49:20.24ID:y6XmTiAF式の方が速い
気がする
0131デフォルトの名無しさん
2015/09/21(月) 00:42:19.68ID:c1rO/cps少ない行数で書ける。ブラックボックスなら行数が少ない方が全体の見通しが良くなる
式によってはIfを並べるより高速。今回のケースに当てはまるかどうかは知らん
0132デフォルトの名無しさん
2015/09/21(月) 06:46:29.92ID:IJWaFyNv> とりあえず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:6Qd0iGUJ0134デフォルトの名無しさん
2015/09/21(月) 09:11:25.29ID:dvC4p2Ci事前に存在チェックをしたいのですが、どうやればいいですか
0135デフォルトの名無しさん
2015/09/21(月) 09:31:03.68ID:6Qd0iGUJ0136デフォルトの名無しさん
2015/09/21(月) 09:36:42.45ID:c1rO/cps0137デフォルトの名無しさん
2015/09/21(月) 10:08:28.27ID:dvC4p2Ciありがとう
ググったら、シートの名前を総当たりで比較するコード例を見つけました
Worksheets.existsみたいなメソッドがあるかと探したんですが、ないっぽいですね
>>136
すいませんOn Error関係はさっぱりわからないのでこっちで行きます
0138デフォルトの名無しさん
2015/09/21(月) 14:58:40.75ID:vgStNT9KいやそれIIfですやん
0139デフォルトの名無しさん
2015/09/21(月) 16:38:28.44ID:wnRm1ekA0140デフォルトの名無しさん
2015/09/21(月) 22:08:43.77ID:yWuUj8SkVBA三大あってはならないこと
0141デフォルトの名無しさん
2015/09/21(月) 23:34:57.55ID:c1rO/cps0142デフォルトの名無しさん
2015/09/21(月) 23:39:12.00ID:2qBLgXMrVBAできないやつが言いそうなことですな。
0143デフォルトの名無しさん
2015/09/21(月) 23:55:08.30ID:yWuUj8SkVBAすら出来ない奴に言われても…
0144デフォルトの名無しさん
2015/09/22(火) 00:31:49.37ID:1embjWoE0145デフォルトの名無しさん
2015/09/22(火) 15:56:29.50ID:0P5A+/ZKはいはいw
0146デフォルトの名無しさん
2015/09/22(火) 16:30:01.49ID:AVvFPFzY0147デフォルトの名無しさん
2015/09/22(火) 17:50:15.04ID:DpphIHOiほ〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜い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正方形の大きさがすべて同じで座標が辺の整数倍でいいんなら、ワークシートのセルをその大きさにすればシェイプの有無は簡単に判定できる
0150デフォルトの名無しさん
2015/09/23(水) 13:58:07.86ID:ey1JxzVK具体的なコードは書けないけど、
あらかじめ頂点の座標を2次元配列で用意しといて、
その集合の中から正方形一個書く毎に使われた頂点座標を消していくってのはどう?
残ってる座標からならどれ選んでも重ならないことが確定してるんだから
一個ずつ判定する手間は掛からない
0151デフォルトの名無しさん
2015/09/23(水) 14:13:05.07ID:z8WDBc2F何がしたいかしらんが、素直に考えればそうなるだろ
重なるかどうかの判定方法とかは色々考える余地はあるかしれんが
>>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シェイプの占める位置ってTop,Left,Hight,Widthで決まるんだし
それを使った分だけ消していけばいいんじゃねーかと思ったのよ
具体的にどうやるとかは考えてない
0155デフォルトの名無しさん
2015/09/23(水) 15:16:01.93ID:ngr3Q2aDxPos
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まさかそれ、2次元のゲームで動くってことはないよな。
動くんなら移動量を含めた計算をしないとダメだぞ。
0157デフォルトの名無しさん
2015/09/24(木) 11:10:17.96ID:UXZYq8x3データがなくなるまでdoSomethingを実行するというコードなんだけど。
0158デフォルトの名無しさん
2015/09/24(木) 21:53:53.16ID:/x273dIP0159デフォルトの名無しさん
2015/09/24(木) 22:05:15.99ID:fpN6Y8wB"読 取 専 用"
難しくて理解できませんか?
0160デフォルトの名無しさん
2015/09/24(木) 22:21:39.94ID:/x273dIPだから、読取専用ブックになんとかして転記したいから聞いてんの。
0161デフォルトの名無しさん
2015/09/24(木) 22:48:34.02ID:fpN6Y8wBじゃあ
よみとり せんよう ではなく
ふつうに ひらきなさい よ。
なぜ よみとり せんよう なのかを
かんがえた ほう が よいですよ。
0162デフォルトの名無しさん
2015/09/24(木) 22:54:40.56ID:X5tdJ92lみんなで色々アイデアを出したけど、みんな却下された
何がやりたいんだよお前って感じで、この手の質問に答えるやついねえと思うわ
0163デフォルトの名無しさん
2015/09/24(木) 22:58:09.35ID:hSB6OGIK0164デフォルトの名無しさん
2015/09/24(木) 23:13:59.47ID:5nkRohqn0165デフォルトの名無しさん
2015/09/25(金) 00:49:36.98ID:gfThCn3p0166デフォルトの名無しさん
2015/09/25(金) 01:04:43.50ID:W+wIO++a0167デフォルトの名無しさん
2015/09/25(金) 04:34:28.43ID:bqWiJdiu0168デフォルトの名無しさん
2015/09/25(金) 06:07:05.57ID:Wh7Co0U2いや、冗談抜きに>>164で言ってるようにリネームして保存して、
元のブック削除して元のブックの名前にリネームし直せばいいんじゃないの?
最初リネームするとき現在時刻を年月日時分秒まで元ブック名の末尾にでも付けて、
一応存在チェックして存在してればまた違う名前にすればいいんじゃないのかな。
もし元ブックが削除されて、リネームで保存したブックを元の名前にリネームされる前に
同じフォルダに同名のブックが作成されるのが嫌ならオペレートでそれを禁止させればいいんじゃない?
0169デフォルトの名無しさん
2015/09/25(金) 06:39:25.79ID:KPP4ZJCNDo 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まず、BA2とBA3に入る値はどこにも使われていないし、最後に書き換わるから、
内側のループでそれらを設定しているところは要らないよね。
で、多分ループ自体がいらなくて、BA9の値をCB223〜CB2222の範囲に設定した後、
ループ外の下2行を行うのと同義だと思うんだけど違う?
0171デフォルトの名無しさん
2015/09/25(金) 08:02:12.59ID:EMZZqHNf>>170
BA2とBA3は、BA9の値を作るのに使ってるんかじゃないかな?
最後に書き換えてるのが気になるんだよね。
>20万項目くらい再計算してるのも
って言ってるのも引っかかるし。
シートの各セルを調べ上げて計算式なんかも全部洗いだして
作り直したほうがいいかもよ?
セルに設定してる式をマクロに持ってくるとか、計算用にシートを別に用意するとかしないと、
再計算しないようにすることもできないから、高速化の道は険しいかもね。
0172デフォルトの名無しさん
2015/09/25(金) 08:54:13.46ID:EjmAc1nd0173デフォルトの名無しさん
2015/09/25(金) 09:14:56.73ID:2FvsaI3a一瞬で終わって、あれにはびっくらこいた w
0174デフォルトの名無しさん
2015/09/25(金) 10:54:43.43ID:gfThCn3pBA2,3と9の計算の間が何起こっているんだろう。
0175デフォルトの名無しさん
2015/09/25(金) 10:56:52.10ID:QB41dI3S0176169
2015/09/25(金) 17:42:20.27ID:KPP4ZJCN表の計算式ありきのマクロなので一旦別で計算するのも難しいですかね
作り直しを検討します。
今のCPUがi7.2600Kなのですが最新のに変えると速くなりそうですか?
0177デフォルトの名無しさん
2015/09/25(金) 18:04:14.73ID:QB41dI3S時間がかかるというのがどれくらいで、目標がどれくらいなのかわからないと回答できないと思う。
今1分かかっているのを1秒にしたいのならCPU交換じゃ無理だけど、30秒でいいなら高速な
PC買えば多分解決する。
うまい処理方法(アルゴリズム・ロジック)にすれば、今のままでも1秒で終わる可能性はある。
0179デフォルトの名無しさん
2015/09/25(金) 18:33:36.81ID:QB41dI3Sあ、「CPU交換」だけじゃ無理かも。
全部最新のパーツでCPUを i7-5775Cあたりにすれば倍くらいいくんじゃないかな。
0180デフォルトの名無しさん
2015/09/25(金) 18:39:01.74ID:9bx+/Ihnこのマクロに関係するセルのうち、
計算式が入ってるセルは何個ぐらいあるの?
0182169
2015/09/25(金) 18:42:43.82ID:KPP4ZJCN100×300のセルを全て同時に計算してその中で最も高い値を
特定のセルに表示する
たぶんこれを数字が変わるごとにやってます
0183デフォルトの名無しさん
2015/09/25(金) 18:56:48.21ID:NnuAglUK最近のエクセルなら、セルの計算式は複数コアで並列計算できるけど、VBAでは無理だから逆に遅くなる可能性もある
コア数の多いCPUで実行するとか、クラスタで実行させるようなHPCサーバとか言うのもあったな
まあそれ以前にExcelでやるのが正しいのかどうか疑問だが
0184デフォルトの名無しさん
2015/09/25(金) 20:05:47.61ID:jGXWQ+n4Dim 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+n430000程度の計算なら会社で使ってるwin7 32bit 4gb i3のショボいパソコンでも二秒かかってないから、
VBAに取り込んで計算した方が早いだろうな。
0186デフォルトの名無しさん
2015/09/25(金) 23:08:36.82ID:6O5MjWHM初心者にはこの位の難易度が勉強になりそう
0187デフォルトの名無しさん
2015/09/27(日) 09:24:25.84ID:8y/VKJg8(MOSのスペシャリストの方くらい)
Excelに詳しくないと難しいですか?
先にExcelの勉強をすべきか、どなたかアドバイス下さい。
オススメの本などもありましたら教えて頂けると嬉しいです。
0188デフォルトの名無しさん
2015/09/27(日) 09:29:32.86ID:sLoOgNJFtest2だと、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手動操作をVBAマクロとして吐き出す機能である「マクロの記録」が便利だから、
Excelの操作を覚えてからの方がVBAはとっつきやすいだろうね。
VBAに関してはネットで検索した方がよっぽど役に立つので本は必要ない。
0190デフォルトの名無しさん
2015/09/27(日) 10:13:17.17ID:V6V0Y/p4動機による
Excelの手操作を自動化して楽したいと思っている人なら、学ぶ価値はある
それ以外の人が学んでもモチベが続かないだろう
書籍は以下がオススメ
この操作を自動化するにはこうする、という形から入る人のための本
・仕事に役立つ ExcelVBA実用サンプル 第3版
0191デフォルトの名無しさん
2015/09/27(日) 10:30:25.39ID:2CSdDWVzDeclare 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ちな、test1も3秒後には表示されてないよ
同じように3秒間隔で図形を2個挿入してみるとわかるけど、End Subのところで2個まとめて表示されてる
0194デフォルトの名無しさん
2015/09/27(日) 12:32:03.81ID:8y/VKJg8ありがとうございます!
とりあえずチャレンジしてみたいので、Webを見るところから始めてみます。
0195デフォルトの名無しさん
2015/09/27(日) 19:41:37.36ID:y8jAuOznDeclare 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 2回続けてやるとうまく行った
まあ多分環境依存するんだろうけど、DoEvents走るタイミングの問題じゃないかな
0197デフォルトの名無しさん
2015/09/27(日) 20:23:11.43ID:SBnm24wBあとは試してないけどワークシートの再描画させてみるとか
ScreenUpating = False
ShapesAdd〜
ScreenUpating = True
みたいに
0198デフォルトの名無しさん
2015/09/27(日) 21:33:12.62ID:Vse6nDq1A1セルの値から0.01を引いた数を 変数1 としたいのですがどう書けばいいのでしょうか?(上の式はてきとうです。)
0199デフォルトの名無しさん
2015/09/27(日) 21:34:54.32ID:Vse6nDq1あれ?!?! 適当に書いた式で実行出来ましたwwwww 事故解決w
0200デフォルトの名無しさん
2015/09/27(日) 21:36:04.98ID:y8jAuOznこんな方法もあるよ。
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:9ibdMIuX0202デフォルトの名無しさん
2015/09/28(月) 21:41:41.22ID:Y6qP8tJG0203デフォルトの名無しさん
2015/09/28(月) 21:57:25.58ID:65OblfGI>変更がなかったり、変更して上書き保存してたら普通に閉じる
何も作らなくても、そうなってると思うけど。。。
>ブックを閉じるときに変更があったなら閉じるのをキャンセル
savedプロパティみて、Closeイベントでキャンセルすれば
いいんでない?
0204デフォルトの名無しさん
2015/09/29(火) 06:56:45.94ID:WCs1snz9savedプロパティって保存したかのプロパティで、変更したかどうかのプロパティではないでしょ。
0205デフォルトの名無しさん
2015/09/29(火) 09:33:33.65ID:s91DJZ4Eおいおい
お前エクセル使ったことないだろ
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こうかな
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こんな風にも書けるよ。
コメントは消し試してみてね。
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
0210デフォルトの名無しさん
2015/09/29(火) 21:36:31.19ID:ERVYo9cZWorkbook.Saved プロパティ (Excel)
https://msdn.microsoft.com/ja-jp/library/office/ff196613.aspx
>>True の場合、ブックは最後に保存された状態から変更されていません。・・・・
0211デフォルトの名無しさん
2015/10/02(金) 18:14:48.60ID:HA2gZYjF前面にする方法って無いんですかね。
この前、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を行う。
他に何か良い方法がありましたら教えて下さい。
0213212
2015/10/02(金) 18:48:56.49ID:QSVxa2C/(案2)
ブックDに記述した・・・書き出す(3)。 ← ブックCです
ブックDに記述した・・・4を行う。
将来的にはC#などで書くことになると思いますが、
現在VBAしか知らないので、取り急ぎ今できる改善を行いたいのです。
宜しくお願いします。
0214デフォルトの名無しさん
2015/10/02(金) 19:14:22.02ID:NAtCgKRkシステムモーダル指定でいいんじゃね
MsgBox "TEST", vbSystemModal
0215デフォルトの名無しさん
2015/10/02(金) 19:25:23.17ID:HA2gZYjFおぉぉ、こういうのがあったんだ。。。。ありがとうです
0216デフォルトの名無しさん
2015/10/02(金) 20:11:05.21ID:SAbURHhg1と2をやるブックと
取得したデータから計算して3と4をやるブック
に分けてみては?
0217デフォルトの名無しさん
2015/10/02(金) 20:16:28.51ID:A1PuY9yl0218デフォルトの名無しさん
2015/10/02(金) 22:12:04.22ID:lfSJUV9j0219デフォルトの名無しさん
2015/10/02(金) 23:08:06.73ID:QSVxa2C/1と2のブックと、3と4のブックに分けるのですか?
2の計算結果をどのように一方のブックに渡せばいいのでしょうか?
>>217
グラフの描画は5秒に1回です。
データ取得はデータが変化したタイミングで行っています。
1秒に数度変化することもあれば数十秒間変化しないこともあります。
>> 218
htaがわからないので調べてみます。
レスありがとうございます。
0220デフォルトの名無しさん
2015/10/02(金) 23:31:08.10ID:ky+9MSCK0221デフォルトの名無しさん
2015/10/02(金) 23:47:15.32ID:E7TOaV4P0222デフォルトの名無しさん
2015/10/02(金) 23:58:30.46ID:QSVxa2C/これで儲けられることが確実なら金払って作ってもらうことも考えますが、
なんせ儲けられるかどうか不明なもので・・・
>>221
後出しで申し訳ないのですが、
現在の株価だけでなく、瞬間瞬間の約定数(売買成立枚数)も参考に
売買タイミングを見極めようという試みなのです。
これはMeta Traderではできないことなのです。たぶん・・・。
0223デフォルトの名無しさん
2015/10/03(土) 00:26:39.35ID:2BaZKaXa残念だけど、あなたのやろうとしていることはかなり高度なのよ
株価データ取得・分析・グラフ描画処理をリアルタイムでこなす
ツールがあったら、投資するよりそれを売った方が儲かる
0224デフォルトの名無しさん
2015/10/03(土) 00:31:04.27ID:cD86uwtaコンセプトだけVBAで作って別の言語で実装しなおす位なら最初からVBA使わない方がいいと思う
0225デフォルトの名無しさん
2015/10/03(土) 01:44:23.96ID:lC+q6YLWそうなのか。高度なのか。
全く取りこぼしなく全てのデータを取得して、ほぼリアルタイムにグラフ化というのは、
理想ではあるけれどそこまでは求めていないんです。
多少のデータ取りこぼしは仕方ないし、
グラフ化も、なんだったら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:topUSkbMVB.NetやC#だったらむしろマルチスレッドを使えば比較的簡単に作れるかな。
気をつけなければならないのは、画面に反映させるときはDelegateを使わなければ出来ないと言うことと、
どんなデータをどっちでやらせるかの分割くらい。
VBAでそれをやりたいのであれば、バッチで取り込み用の別処理をそれぞれ起動して、
DB経由にでもしてVBAでそれを表示させるようにすれば取り敢えずDB側でデータの取りこぼしは減るんじゃなかろうか。
どっちにしても皆が言うように難易度的には業務で使ってるくらいの知識は必要になるだろうけどな。
0228デフォルトの名無しさん
2015/10/03(土) 08:52:18.66ID:4VQgtYk9Variantは極力やめてちょ。
1文字変数極力やめてちょ。
全部SubじゃなくFunctionも使ってちょ。
引数も使ってちょ。
ActiveSheetとか状況により不確定なもの使わないでちょ。
Range(〜)と不確定な書き方やめてちょ。(せめてワークシートから指定してちょ。)
とかいつ頃教えますか?
0229デフォルトの名無しさん
2015/10/03(土) 09:48:56.53ID:C7I9pgK8組み込み・制御などのリアルタイム処理と同じだね。
これらでは、データの取りこぼしを無くすようにする
データの取得が速い言語で、十分な容量のバッファメモリ、
Linuxのtmpfsのように、メモリ上に、ファイルを作って、
HDDにアクセスせず、共有メモリのまま、
データを次の処理へ渡す
0230デフォルトの名無しさん
2015/10/03(土) 10:01:12.28ID:2BaZKaXaコーディングルールは制定されていないの?
最初にそれを示すだけで済むことよ
0231デフォルトの名無しさん
2015/10/03(土) 10:13:40.85ID:3kbtRnsC> Variantは極力やめてちょ。
> 1文字変数極力やめてちょ。
この2つはルール化したらダメだよ。
0232デフォルトの名無しさん
2015/10/03(土) 10:25:11.82ID:77jE6Sjm0233デフォルトの名無しさん
2015/10/03(土) 12:31:07.32ID:ZKRFUKiL何を書いてもマイルールにしかならない
組織やグループごとに代表がルールを決めたらそれに従う
代表が無知でタコだったらITドカタは泣くしかない
そんだけのことですよ
0234デフォルトの名無しさん
2015/10/03(土) 12:32:12.66ID:8AsXeoHo0235212
2015/10/03(土) 12:41:18.03ID:lC+q6YLW馬鹿なんでみなさんのレスを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:RbSlktKi0239デフォルトの名無しさん
2015/10/03(土) 14:17:39.55ID:vgl68Z+cあなたに教えた人の顔が見たい
0240デフォルトの名無しさん
2015/10/03(土) 14:31:43.77ID:0Knvo8cN自己流だとほとんどやらかしてるわ。
複雑なもの作ってないからだけど。
0241デフォルトの名無しさん
2015/10/03(土) 14:44:34.01ID:gOpJ5SBw誰に向けての発言か知らないけど
直近で「極力」と「思う」を使ったのは俺だけみたいなんで一応返しとく
確かに、あの文章から「極力」と「思う」を抜けば
ルールの提言としても読めるけれども
俺は自分のやり方とその理由となる考え方を述べただけで
>>228みたいにルールとして言ってるんじゃないよ
0242デフォルトの名無しさん
2015/10/03(土) 18:14:44.58ID:I/Jruoq4そのタブで表示されているWebページから、
情報を取得したいのですが、
参考になるような資料を教えて下さい。
0243デフォルトの名無しさん
2015/10/03(土) 18:21:30.26ID:QXlvwIILそれか自分でdllでも作って参照設定しとけ。
0244デフォルトの名無しさん
2015/10/03(土) 18:26:13.89ID:qfZy55waググればいいんじゃね
0245デフォルトの名無しさん
2015/10/03(土) 20:17:03.11ID:y6+evVSu0246デフォルトの名無しさん
2015/10/03(土) 21:09:09.38ID:ZKRFUKiL意外と大変みたいだけど、なんでFireFox?IEなら簡単なのに
http://blog.clockahead.com/2014/03/vbafirefox.html
0247デフォルトの名無しさん
2015/10/03(土) 22:25:34.56ID:Z+kNACJtクラスを使い始めると接頭語がobjの変数だらけになるあれは頂けない
0248デフォルトの名無しさん
2015/10/03(土) 22:39:44.64ID:5O2HV1Cv0249デフォルトの名無しさん
2015/10/03(土) 22:53:18.56ID:d7sRTTd70250デフォルトの名無しさん
2015/10/04(日) 00:41:18.06ID:g7SqYJ/Xただ、型名に対してプレフィックスの規定が網羅できんから、プレフィックス見ても型が分からん変数だらけになるけどw
0251デフォルトの名無しさん
2015/10/04(日) 01:49:45.75ID:CaBe2KJ7禁止禁止
0252デフォルトの名無しさん
2015/10/04(日) 02:03:43.01ID:FINVuytw0253デフォルトの名無しさん
2015/10/04(日) 10:28:25.42ID:g7SqYJ/XVB6やVBAの頃は推奨されてたんで
0254デフォルトの名無しさん
2015/10/04(日) 11:07:49.29ID:CaBe2KJ7>>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:VSRvv5G910にIEはないよ。
0257デフォルトの名無しさん
2015/10/04(日) 20:53:16.98ID:g7SqYJ/X0258デフォルトの名無しさん
2015/10/04(日) 22:10:29.66ID:2AM+oKUzお返事ありがとうございます。
win10にIE自体はあるようですが、どうもいろいろやってみましたがVBAから呼び出せずに困り果てています。
とりあえず、あきらめてwin8にもどすことにしました。
ありがとうございました。
0259デフォルトの名無しさん
2015/10/04(日) 22:14:44.41ID:KDkHjDHqIEは使える状態なのに、VBAでは呼び出せないの?
win10でどうなるか知りたかったので、よかったら教えて欲しい。
0260デフォルトの名無しさん
2015/10/04(日) 22:34:18.44ID:2AM+oKUzIEはあります。
エクセルもVBAも問題なくうごくのですが、唯一IEをよびだすことができません。
自分は証券会社に自動でログインする際にCreateObject("InternetExplorer.application")
をつかっているのですが、IEをメインブラウザに設定しなおしたり、いろいろやてみましたがだめでした。
あまりプログラムの知識がないので、エラー原因などはわかりません。
0261デフォルトの名無しさん
2015/10/04(日) 23:06:02.64ID:g7SqYJ/XクリーンインストールしたWin10Proで、VBSからIE起動してNavigate出来るの確認した
ExcelかVBAの問題の可能性もあるけど、それWin8のときはちゃんと動いてたのか?
上がってるIE、32ビットか64ビットか分からんな
Win10ってどこで見分ければ良いんだろ
0262デフォルトの名無しさん
2015/10/04(日) 23:19:34.71ID:mZWzOE0Z7→8→10とアップデートしてきた環境たけど
自分のはちゃんと起動したな
エラーが出てるならエラーコードくらい貼ったら?
0263デフォルトの名無しさん
2015/10/04(日) 23:20:01.96ID:oDZ+VI3p0264260
2015/10/05(月) 01:19:20.52ID:PnYDCBrnwin8.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/259です。
レスありがとう。
後の書き込みも含めて参考にします。
0267デフォルトの名無しさん
2015/10/05(月) 13:56:42.70ID:CB+0+6Bh一応聞くけど・・・
IEを手動で起動できるかためしてみました?
0268デフォルトの名無しさん
2015/10/05(月) 14:42:30.01ID:PnYDCBrnはい、ためしました。
ほかの証券会社のツールもIEからの起動が必要でそれは、ちゃんと動きました。
起動したIEの横にはみなれない黄色いニコちゃんマークがついていてそれをクリックすると、マイクロソフトに意見を送るみたいなものがでてきました。
0269デフォルトの名無しさん
2015/10/06(火) 03:08:54.29ID:s30vzD+yWorksheet_Calculateのイベントが1分間発生しなかった時に処理Bを行わせたいのです。
それを実現する方法が浮かびません。どなたか教えて下さい。
Win7(64)+Excel2010です。
0270デフォルトの名無しさん
2015/10/06(火) 03:41:02.57ID:RhU5oO7Chttp://www.asahi-net.or.jp/~zn3y-ngi/YNxv214.html#8-1
0271デフォルトの名無しさん
2015/10/06(火) 13:27:42.67ID:s30vzD+yありがとうございます。
ただもう少し詳しく教えて下さい。
Worksheet_Calculateの終了直前時刻をDate型変数に格納、
時刻を格納後に(Worksheet_Calculate内で)タイマーをセットするということですか?
1分以内にWorksheet_Calculateが開始された場合、タイマーを解除しなければなりませんが、
そのようなことはできるのでしょうか?
0272デフォルトの名無しさん
2015/10/06(火) 14:00:40.81ID:hiQs0jh9そういうのはフラグで管理する
1分のタイマーでフラグを立てる
メインはフラグを見て、立ってたら実行する、立ってなかったら実行しない
0273デフォルトの名無しさん
2015/10/06(火) 14:11:14.62ID:hXnC6CWE丁寧に聞いてるのはいいとしても、なんでも相手に聞いて、
自分で考えなくて済むっていうのは、相手に対して失礼ですよ。
どうすればいいのか、そのヒントをもらってるんだから、
方法に疑問が待ててるのなら、まずそれを試すべきではないですか?
0274デフォルトの名無しさん
2015/10/06(火) 14:53:30.20ID:8pBv5L1n> 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最後にWorksheet_Calculateを実行した時刻を記憶し
そこから1分以内にWorksheet_Calculateが実行されたフラグ=Falseにして、
フラグ=falseならプロシージャを実行しないということですか。
なるほどありがとうございました。
>>273
今エクセルできる環境でないのと、理解力が足りてないので好意に甘えてしまってます。
申し訳ありません。知恵をつけて頑張ります。
>>274
解除できるんですね。
あまり見かけない情報なのでとても参考になります。
ありがとうございました。
0276デフォルトの名無しさん
2015/10/06(火) 17:22:28.83ID:8pBv5L1n> 解除できるんですね。
> あまり見かけない情報なのでとても参考になります。
俺も今回ググって知ったからね。
「Application.OnTime 解除」でググったら、ここで聞くまでもなく解決したかもね。
0277デフォルトの名無しさん
2015/10/10(土) 03:55:34.16ID:uc7CQwkx<質問内容>
リストボックスに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
0278277
2015/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俺は、
.ListBox1.AddItem.Cells(i,0) = Objsheet.Cells(i,1)
を薦めるけど
0280デフォルトの名無しさん
2015/10/10(土) 09:13:52.25ID:PLSIx7MGobjsheet.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最初にLを L(12) と宣言してるのに
わざわざループの中で毎回Redimする意味が分からない
あと x だけ宣言してない意味も分からない
0282デフォルトの名無しさん
2015/10/10(土) 09:51:36.43ID:PLSIx7MGああ、ごめん。それはいつものクセだ。これだとエラー出るな。
仕事でやる時は要素数固定な方が稀なんで忘れてた。
ちなみにVariant型は宣言しない方が処理が早いんだよ。
0283デフォルトの名無しさん
2015/10/10(土) 10:13:17.20ID:C9mCx++X確かに早いかもしれないけど、変数宣言してないほうが違和感凄い
277のコードはOption Explicit付いてるからそのままだと動かないね
0284デフォルトの名無しさん
2015/10/10(土) 10:18:44.34ID:LK1jtOCB俺も静的な配列の宣言ってやらないけど、
対象の要素数が不定であっても、
ループ前に確定してるならループに入る前にRedimしとくな
ループ内でRedimするのは
その時々で配列に入れるかどうかを判定してるときだけだね
あと、大して変わるとも思わんけど速くしたいなら
x もRange型で宣言するほうがいいんじゃないの?
0285デフォルトの名無しさん
2015/10/10(土) 10:29:02.02ID:PLSIx7MGRange型からRange型への代入よりRange型からVariant型への代入の方が早い。
たぶんRange→Variantだと丸ごとのmemcpyだけどRange→Rangeは要素毎にmemcpyしてるんだと思う。
っていうか他人のコードにいちゃもんつけてる暇あったら自分で書いて欲しい。
別に俺が皆様の為にコード書くスレじゃ無いし、いちいち指摘される意味が分からん。
0286デフォルトの名無しさん
2015/10/10(土) 10:36:42.22ID:LK1jtOCB>Range型からRange型への代入よりRange型からVariant型への代入の方が早い
へー、そうなんだ
Variantは遅いって固定観念があったんで試したこと無いから知らんかった
勉強になったよ、有難う
ちなみに、「早い」じゃなくて「速い」だよね
あと、あなた個人にいちゃもんつけてる積もりも無いんだよね
単純にコードの動作やなんかに疑問があっただけだから
人格攻撃とかではないことは分かってほしい
0287デフォルトの名無しさん
2015/10/10(土) 10:47:25.91ID:bWA1pvcm多分、人格どうのではなくて
「ウダウダ抜かすならテメーが書けよ糞が」
って言いたかったんじゃないかな
0288デフォルトの名無しさん
2015/10/10(土) 11:07:48.09ID:LK1jtOCBだからさ、そういうのが理解できないんだよ
コード自体大枠で問題ないから部分的に気になるところを指摘しただけで
お前が書けっていわれてもそんなに違ったもんにはならないよ
仮に書いてもこんな感じ
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あ、
Dim L() As String
だった
Variantならカッコ不要だけど、ほかはカッコつけて宣言しとかないと駄目だね
0290デフォルトの名無しさん
2015/10/10(土) 11:40:09.15ID:PLSIx7MG・知ったかぶるだけでコード書けないヤツが排除できる。
・余計な事を喋らなくて済むので好みの違いで水掛け論にならない。
・重複しても全部出した方が初心者でも比較しやすい。
・他人に改訂を強制出来る権利なんてないんだから改訂が必要だと思うなら自分ですべき。
理由としてはこんなもんじゃないかな。他人のコードに口を出すなら全部自分の流儀で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ここはそういうことするスレだと思ってる
ただ、指摘内容は個人的信条に掛かる部分は避けるけれど
変数の型宣言とか、ループ内で不要な処理は出来るだけ外に出すとかは
割合普遍的な内容だよね?
仮に俺がそれやってて誰かに言われても全然気にならないと言うか、
むしろ感謝するんで、まるで悪い事とは思ってない
多分、怒る人ってのは自分自身に対するプライドが無い人なんだと思う
もちろん、こんなのネットだから気軽に言えるんであって
リアルでそんな人に出くわしたら
係わり合いになるのを極力避けるだろうけどさ
0293デフォルトの名無しさん
2015/10/10(土) 18:34:58.23ID:BWs8hoM+VBA自体が遅いからVariantでも相対的に速く見えるんだよね
rangeオブジェクト直接使うより一旦variantに代入して配列として処理した方が速いし
ただフィルタとかの組み込みAPIはめちゃ速いから下手にforで回したりせず積極的に使って行きたい
0294デフォルトの名無しさん
2015/10/10(土) 18:48:19.64ID:e9OvRw0Mここは質問スレなんだけど
そういう基本的な事すら勘違いしてる人程、頼まれもしないのに他人に指摘をしたがる。
しかも勘違いしやすい人だから指摘の内容も間違っていたり偏っていたりする。
やはり、頼まれもしないのに自分勝手な指摘などするべきではないし
された方も、それを鵜呑みにすべきではない。
0295デフォルトの名無しさん
2015/10/10(土) 19:55:36.82ID:LK1jtOCBだからさ、別に>>280に書かれた「コード」について思うところを述べたのであって
>>280さん「個人」に対して指摘したわけじゃないのよ
言ってみれば俺のレスだって>>277さんやほかの人たち宛といってもいい
それを勘違いされちゃうとそれこそ基本的なこのスレの趣旨から外れちゃうと思うんだよね
指摘の内容が間違っているかどうかはこの際関係ないというか、
たとえケアレスミスであったにせよ>>280のコードも間違いであったわけで
そんなこと言い出したら誰もここに書き込めないよ
読んで間違ってると思ったら誰でも自由に書き込めば良いだけじゃん
所詮は2chの書き込みなわけで、それをただ鵜呑みにするなんて真似は
誰が書いたもんだろうとすべきではないのも同じことだしね
0296デフォルトの名無しさん
2015/10/10(土) 20:15:44.13ID:PLSIx7MG指摘する代わりに訂正したコードをレスすれば問題ないだろ。
コードは鵜呑みにしても正しいかどうかは結果が語ってくれるし。
0297デフォルトの名無しさん
2015/10/10(土) 20:21:28.17ID:S77+iWrc-book1-
GoTo endbook2
↓
-book2-
endbook2:
0298デフォルトの名無しさん
2015/10/10(土) 20:27:19.33ID:PLSIx7MGプロシージャ間でのGotoは出来ないはず。
0299デフォルトの名無しさん
2015/10/10(土) 20:28:45.42ID:e9OvRw0M> そんなこと言い出したら誰もここに書き込めないよ
> 読んで間違ってると思ったら誰でも自由に書き込めば良いだけじゃん
良くはないぞ。誰でも自由に書込めるのはその通りだが
スレにはスレの主旨というものがある。
特にここは質問スレだから、質問者は自分に対するレスを鵜呑みにしやすし
常駐してる訳ではないから、たとえその指摘が間違いだった事が分かっても
質問者はその経緯を見ていない事が多い。
しかも、質問の本筋と関係ない指摘によって質問者を余計に混乱させたり
スレが荒れる原因にもなる。今もそういう状態だと言っていいだろう。
結論としてはやはり、質問と関係ない指摘はすべきではない。
0300デフォルトの名無しさん
2015/10/10(土) 21:29:45.80ID:LK1jtOCBそこはまぁ、コード書くほどのことかどうかって話だよね
実際これまでもコード書かずにグダグダ言うだけの人はいたから
あなたの主張も分からんではないし、
だからこそおれも一応>>288にコード書いたんだけど
あれって結局書くほどのことも無いもんだったでしょ?
あの程度の違いだったら別に書く必要ないと思うわけですよ
それでもどうしてもコードだけしか認めないってのは
ちょっと狭量すぎるというか
絶対にコードは書かない人ってたちと逆の意味でやっぱり問題あると思うな
>>299
質問スレの主旨って質問者に対して直接安価つけた回答以外は
回答として認めないわけ?
俺は質問者に対してだけじゃなく、
それを傍から見てるほかの人たちに対するものでも別に問題ないし
そちらこそがむしろ本筋だとすら思ってる
実際、俺だってこのスレで自分では質問してなくても
いろいろ参考になる意見を読ませてもらって感謝してるもの
0301277
2015/10/10(土) 21:43:42.05ID:uc7CQwkxAddressプロパティはシート名を含まないセル座標を返す仕様なんですね。
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なるほど、お前はこのスレの本筋は
質問自体ではなく、常駐してる人同士の情報交換にある
と思っている訳だな。
ところで、お前が問題があると思っている
絶対にコードは書かないって人たち
も同じように、安易にコードを出して結論だけを示すのではなく
質問者に理屈を理解してもらう事がこのスレの本筋だと思っているのだろうな。
お前と同じだ。
どちらもそれなりに自分の信条はあるのだろうが
決してそれが唯一解ではない。
ただし
絶対にコードを出す事を厭う事
質問と関係ない指摘をする事
どちらも同じように、スレが荒れる原因になってる事も理解してくれ。
0303デフォルトの名無しさん
2015/10/10(土) 22:05:31.62ID:LK1jtOCB悪気は無いんですが結果的にスレを読みにくくしちゃってごめんなさいね
ただ、処理速度もさることながら
コード内でリスト内容に修正を加える必要が出た場合など、
後々の使い勝手も考慮するのがより望ましいかもしれません
その点で言うと、RowSourceでは後からの変更がやりにくいので
ListやAddItemを用いるほうが柔軟に対応しやすいようですよ
というようなことがこの辺に書いてありました
http://officetanaka.net/excel/vba/tips/tips139.htm
ご参考まで
0304デフォルトの名無しさん
2015/10/10(土) 22:10:56.42ID:LK1jtOCB>決してそれが唯一解ではない。
そう、だから俺はコードを書かない人も排斥しないし、
スレチだ何だといって質問者を追い返す人たちに対してですら
別スレに行けばと提案はするけれど拒絶はしない
実のところ俺はこのスレの>>1なんだけど
前スレの>>1にあった束縛云々という文言を抜いたのは
そういう思いも込めてのことなんだよね
0305デフォルトの名無しさん
2015/10/10(土) 22:40:02.38ID:PLSIx7MGコピペして動くコードが貼られていれば便利だろ。
だからどんだけ些細な修正であれコードは貼ってくれ。
その上で問題の指摘なりなんなりごちゃごちゃ言うのは俺は構わない。
0306デフォルトの名無しさん
2015/10/10(土) 22:47:28.14ID:LK1jtOCBいや、その辺のさじ加減は書き手側に任せようよ
>>288も質問者やその他の人達に対して必要だとは思わないけど
>>287氏(に代表される「コード書かない人を許さない人達」)に対しては
必要な事だと思ったから書いたまでのこと
これからも必要があると判断すれば書くしそうじゃなきゃ書かない
0307デフォルトの名無しさん
2015/10/10(土) 23:22:07.02ID:PLSIx7MG0308デフォルトの名無しさん
2015/10/10(土) 23:34:41.84ID:LK1jtOCBだからさぁ、そういうのって結局別スレの人達と同類じゃん
自分と異なる考え方だからといって
頭ごなしに拒絶するのは極力避けるべきだと思うよ
0309デフォルトの名無しさん
2015/10/11(日) 06:49:55.78ID:v4cWO+Xbその後、操作者がブックBを閉じたことを検出して
ブックAの特定のプロシージャを実行したいのだが、どうすればよいか
他ブックが閉じられたというイベントは存在しないようなので困っている
0310デフォルトの名無しさん
2015/10/11(日) 07:01:13.52ID:/glPH0MbブックBをユーザーに操作させないかのどっちかくらいしかないんじゃないか。
0311デフォルトの名無しさん
2015/10/11(日) 07:17:12.35ID:dc8fNJEd0312デフォルトの名無しさん
2015/10/11(日) 19:27:33.17ID:fLjk4aVMやりたい事が
他ブックの 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+nxBSBIWorkbooks.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
0314309
2015/10/11(日) 20:56:35.89ID:v4cWO+Xb手動で保存されたブックBのデータを読み込んで
自動処理を走らせるので、BeforeCloseイベントではダメなんだ
>>311のやり方を検討してみる
0315デフォルトの名無しさん
2015/10/12(月) 22:27:56.55ID:Ur21F95JブックBを閉じたことを検出するボタンを作ったほうがシンプルだと
思うのだが
0316デフォルトの名無しさん
2015/10/13(火) 03:20:04.77ID:BftcgOPm0317デフォルトの名無しさん
2015/10/13(火) 10:16:15.75ID:v0mnZW8d両方つけときゃいいでないの>w
0318デフォルトの名無しさん
2015/10/13(火) 10:27:59.85ID:jBFoqp2r> 質問と関係ない指摘をする事
> どちらも同じように、スレが荒れる原因になってる事も理解してくれ。
指摘を受けた人が暴れなければすむ話なんだけどね。
一方、指摘そのものは、受けた人のみならず第三者にも利益になることが多々ある。
なので、今後もみんなどんどん指摘して欲しい。
0319デフォルトの名無しさん
2015/10/13(火) 10:29:37.14ID:jBFoqp2r> コピペして動くコードが貼られていれば便利だろ。
> だからどんだけ些細な修正であれコードは貼ってくれ。
受け取る側がそれを強制しちゃうの?
問題解決になるキモがわかる断片的なコードで十分な場合も多いでしょ。
0320デフォルトの名無しさん
2015/10/13(火) 14:59:16.74ID:v0mnZW8dなるほど、318はどんどん指摘してほしいそうなので
みんなよろしくな!
0321デフォルトの名無しさん
2015/10/13(火) 15:51:17.66ID:jBFoqp2r0322デフォルトの名無しさん
2015/10/13(火) 17:22:52.96ID:vdpuTcbV自分の思い通りにするのは無理と早く悟ってくれないかなあ
0323デフォルトの名無しさん
2015/10/13(火) 20:10:10.75ID:6nIGFdyo0324デフォルトの名無しさん
2015/10/14(水) 10:09:25.38ID:H3NHgayM自分のコード: >>280
のミスを指摘された: >>281
事に文句を言った(人のコードにいちゃもんつけるな): >>285=>>280
というのが事の発端じゃないの?
0325デフォルトの名無しさん
2015/10/14(水) 15:50:25.41ID:AS+yqKLJ0326デフォルトの名無しさん
2015/10/14(水) 16:51:03.01ID:btG23wVT絶対条件ではないが、可能性はゼロではない
とくにシートにアクセスして書き換えや再計算が発生すると規模に応じた時間が掛かる場合
0327デフォルトの名無しさん
2015/10/14(水) 18:26:49.84ID:AS+yqKLJただセルにデータが増えただけではマクロに影響はないですか?
0328デフォルトの名無しさん
2015/10/14(水) 18:31:11.58ID:H3NHgayM多分影響ないけど、心配なら実測したら?
0329デフォルトの名無しさん
2015/10/14(水) 20:32:26.17ID:KtGF3f0Iめちゃくちゃ複雑な関数が1000*1000セルにびっしり詰まっててネックになってるかもしれないし、
マクロがシート上の情報によって処理時間を左右される類いのものかもしれないし。
0330デフォルトの名無しさん
2015/10/14(水) 20:36:33.73ID:AS+yqKLJ思ったのですが違うみたいですね。どうもありがとうございました。
0331デフォルトの名無しさん
2015/10/14(水) 20:46:42.90ID:KAxvZKuPそりゃ処理するデータ量増えたら遅くなるのはあたりまえだろ w
普通に考えてマクロの処理は変わらない前提の質問だと思うぞ
0332デフォルトの名無しさん
2015/10/15(木) 12:58:50.64ID:BCBs43Sq>>331
Excelの作りを知っているわけではないから
マクロに影響がどう出るかはわからないよ。
データの量によってどう影響するかは、
どれくらいのデータ量を想定しているか325が考えて試すしかないよ。
0333デフォルトの名無しさん
2015/10/15(木) 13:45:15.66ID:mYfmOhz6お前はもうこのスレでレスするな
迷惑
0334デフォルトの名無しさん
2015/10/15(木) 14:14:38.75ID:vaiTvozu>>332はわりとまともな事言ってると思うけど?
そうやって貴方のように個人的主観で仕切ろうとする人のほうが
どっちかってーと迷惑に感じる
0335デフォルトの名無しさん
2015/10/15(木) 14:28:16.56ID:aU04CjvLA列のセルに貼られた画像(1セルに1画像)の名前を
B列に書き出すには、どのようにするのが宜しいでしょうか?
かなりの行があります・・・
0336デフォルトの名無しさん
2015/10/15(木) 15:00:20.15ID:VWNdFEFl0337デフォルトの名無しさん
2015/10/15(木) 15:01:14.19ID:mYfmOhz6>>332
> Excelの作りを知っているわけではないから
> マクロに影響がどう出るかはわからないよ。
お前が知らない、わからないなんて知ったこっちゃない
いちいち報告するな
> データの量によってどう影響するかは、
> どれくらいのデータ量を想定しているか325が考えて試すしかないよ。
何人も同じ事言ってる
スレ読んでからレスしろ
って説明しなきゃわからんのか
0338デフォルトの名無しさん
2015/10/15(木) 16:23:42.66ID:vaiTvozu説明が間違ってるので分かり様が無い
まず
> Excelの作りを知っているわけではないから
> マクロに影響がどう出るかはわからないよ。
に関しては>>332個人が分る分らないではなく
本人 (または現物を見ている人間)以外には分らない
と言う一般的な意味だろうから
お前が云々という批判自体が的外れ
次に
>何人も同じ事言ってる
>スレ読んでからレスしろ
については
もしも複数人が同じ事を言ってはいけないのならば
二人目以降は全員同様の批判を受けねばならない
ちなみに、>>325自身に測定せよとアドバイスしてるのは
俺のみる限り>>328しか居ないように見える
つまり、何人も は言っていない
そしてその内容も若干違っているので
>>332が批判されるほどの理由とは思えない
そのうえで、それらの問題点を抜きにしたところで
君自身が他者の書き込みについて排除できる根拠にはなりえない
0339デフォルトの名無しさん
2015/10/15(木) 16:35:33.53ID:BCBs43Sqすまないねー迷惑だったかw
今後も自由に書きこみさせてもらうよー
0340デフォルトの名無しさん
2015/10/15(木) 16:37:13.51ID:mYfmOhz6> > Excelの作りを知っているわけではないから
> > マクロに影響がどう出るかはわからないよ。
>
> に関しては>>332個人が分る分らないではなく
> 本人 (または現物を見ている人間)以外には分らない
> と言う一般的な意味だろうから
> お前が云々という批判自体が的外れ
は?何言ってんの?
Excelの作りを知っている奴もいるかもしれないし、マクロに影響が出るかわかってる奴もいるかもしれないだろ
なんで「一般論」になるのか理解不能
> つまり、何人も は言っていない
何人もが言ってるのは
> データの量によってどう影響するかは
の方だ。つまりそれもわからんって言ってるに過ぎない
> 君自身が他者の書き込みについて排除できる根拠にはなりえない
自己矛盾もはなはだしいね
だったら俺に絡むな
0341デフォルトの名無しさん
2015/10/15(木) 16:48:19.96ID:BCBs43Sq331は質問の趣旨に答え切れてない気もするけどね。
聞かれているのは、
ブックの容量とマクロの実行速度に関する相関関係だし・・・。
0342デフォルトの名無しさん
2015/10/15(木) 16:52:32.40ID:mYfmOhz6まあ質問そのものが曖昧だったしな
俺は「同じマクロで同じ計算量の場合に、それ以外の要素でブックが肥大化したときに
そのマクロの実行時間に影響を及ぼすのか」という疑問なんじゃないかと思ったが
まあどっちにしても、気になるなら実測しろで終わりだな
0343デフォルトの名無しさん
2015/10/15(木) 17:23:30.43ID:vaiTvozu> 君自身が他者の書き込みについて排除できる根拠にはなりえない
自己矛盾もはなはだしいね
だったら俺に絡むな
俺は排除していないよ
自分にとって参考にならない意見は書き込むなと主張する人と
その人に批判された人ならば
どちらかと言えば前者(つまり貴方)の方が迷惑だ
と評しただけで
だから書き込むなと言った覚えは無い
0344デフォルトの名無しさん
2015/10/15(木) 17:29:09.66ID:mYfmOhz6「書き込むな」とは書いてないから俺を排除しようとしてるわけではないって言いたいのか
おめでてーな
0345デフォルトの名無しさん
2015/10/15(木) 17:43:45.52ID:vaiTvozuおめでてーかどうかはともかく
書いてない以上、そんなことを言われてもどうにもなんない
勝手に深読みしといて相手のせいにするってそれこそおめでてー人だ
0346デフォルトの名無しさん
2015/10/15(木) 17:48:12.67ID:mYfmOhz6お前、現実世界で誰かにナチュラルにハラスメントとかしてるんじゃねーの?
気をつけろよ
0347デフォルトの名無しさん
2015/10/15(木) 17:51:49.74ID:vaiTvozu自己矛盾してますねw
0348デフォルトの名無しさん
2015/10/15(木) 17:53:36.22ID:BCBs43SqExcelのバージョンとかも書かないと無理よ。
俺の持っている2013では画像の名前は取れなかった。
以前ファイルパス取る方法とか質問あったけど、取れるって回答は無かったよ
古いVerでは代替テキストにはいっているとか書かれていたので参考にどうぞ。
0349デフォルトの名無しさん
2015/10/15(木) 17:54:04.36ID:mYfmOhz6何の自己矛盾もないが
一方、
俺はお前が排除しようとしていると感じている
お前は排除してないと言う
これ、ハラスメントの構図
0350デフォルトの名無しさん
2015/10/15(木) 17:55:53.84ID:mYfmOhz6意識せずに、だ
0351デフォルトの名無しさん
2015/10/15(木) 17:58:56.03ID:BCBs43Sqさらっとひどいこと書きますねw
明確な意志をもってゴミレスをdisりましたかw
悪意あるんですね!
0352デフォルトの名無しさん
2015/10/15(木) 18:01:58.99ID:vaiTvozu明確な意思の下であれば
御自身のハラスメント行為自体にはなんら痛痒を感じないのであれば
お気の毒ですが何も言いようが無いですね
おそらく価値観が根底から違っていようと思われます
0353デフォルトの名無しさん
2015/10/15(木) 18:09:46.58ID:mYfmOhz6自分の価値観にあわない奴は悪ですか
おめでてーな
0354デフォルトの名無しさん
2015/10/15(木) 18:17:08.26ID:vaiTvozu>明確な意思の下であれば自身のハラスメント行為に痛痒を感じない
問題はこの部分ですよ?
これが私個人の独自な価値観かどうか、貴方は判断できませんか?
まぁ、出来ないからこんな事やってるんでしょうけれど
貴方個人がどう思うかよりは我々のやり取りが第三者から見てどう思われるかを
客観的にご覧になることをオススメします
もちろん、その点では私の方も
かなりうざがられているであろう事は確かですけどw
0355デフォルトの名無しさん
2015/10/15(木) 18:26:10.01ID:mYfmOhz6>>333のレスすることになんの痛痒も感じてないよ?
それが何か?
0356デフォルトの名無しさん
2015/10/15(木) 18:29:10.14ID:vaiTvozu>それが何か?
ですから、それなら何も言いようが無いですよ
客観視してその程度なら本当にお気の毒ですけれど
私がどう思おうが、あるいは他のスレ住人がどう感じようが
貴方の気にする事ではないので気にしないでください
0357デフォルトの名無しさん
2015/10/15(木) 18:31:13.32ID:mYfmOhz6あってないんじゃないの?
0358デフォルトの名無しさん
2015/10/15(木) 18:32:50.41ID:vaiTvozu2chあってないんじゃないですか?
0359デフォルトの名無しさん
2015/10/15(木) 18:41:27.86ID:BCBs43Sq>Excelの作りを知っている奴もいるかもしれないし、マクロに影響が出るかわかってる奴もいるかもしれないだろ
でもさー、これって「無い」よね?
0360デフォルトの名無しさん
2015/10/15(木) 19:54:11.73ID:9cYvWnzzいろいろな行を選択するたびにそのテキストボックス内の値も自動で変わるようにしたいです。
0361デフォルトの名無しさん
2015/10/15(木) 20:03:18.88ID:tI6xpC1EPrivate 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:BCBs43SqMe.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こら、ちゃんとageろ
0364デフォルトの名無しさん
2015/10/15(木) 20:15:32.82ID:nQudxDlzダブルクリックの方が誤作動が少なさそう。
0365デフォルトの名無しさん
2015/10/15(木) 20:16:49.73ID:9cYvWnzzリストボックス内で選択した行の1列目がテキストボックス1に、2列目がテキストボックス2へと連動する方法もよかったら教えてください、、。
0366デフォルトの名無しさん
2015/10/15(木) 20:21:53.21ID:tI6xpC1EPrivate 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ありがとうございます><
あとひとつお聞きしたいのですが、
テキストボックスに値を入れると、それに連動したリストボックス内の値も変わるようにすることってできますか?
0368デフォルトの名無しさん
2015/10/15(木) 20:27:42.79ID:9cYvWnzzありがとうございます><
あとひとつお聞きしたいのですが、
テキストボックスに値を入れると、それに連動したリストボックス内の値も変わるようにすることってできますか?
0369デフォルトの名無しさん
2015/10/15(木) 20:28:19.35ID:tI6xpC1EPrivate 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:9cYvWnzz0371デフォルトの名無しさん
2015/10/15(木) 20:53:07.25ID:9cYvWnzz連動したうえで、
ボタンを押すとリストボックスに行を増やして
かつテキストボックスの内容をリストボックス内に書き込むという動作もしたいのですが
どのようにすればよいでしょうか、、
0372デフォルトの名無しさん
2015/10/15(木) 20:56:33.56ID:5t35flZv0373デフォルトの名無しさん
2015/10/15(木) 21:06:30.47ID:BCBs43Sq本当に?
0374デフォルトの名無しさん
2015/10/15(木) 21:34:47.96ID:wL4jkucx面倒くせえ。
0375デフォルトの名無しさん
2015/10/15(木) 22:04:16.06ID:pdOqA9hY0376デフォルトの名無しさん
2015/10/15(木) 22:06:17.26ID:AgRxHL3T考える事やめたら 若くしてボケるぞっと
0377デフォルトの名無しさん
2015/10/15(木) 22:45:27.08ID:aGdx/ouK> でもさー、これって「無い」よね?
それ悪魔の証明だから
0378デフォルトの名無しさん
2015/10/15(木) 23:15:11.36ID:4mHovWtI当該ライブラリを使ってコードを書いた時に
入力支援を効かせるためのもので
コードの実行には関係していないって理解でいいですかね?
0379デフォルトの名無しさん
2015/10/15(木) 23:18:17.40ID:DiiEBeOW0380デフォルトの名無しさん
2015/10/15(木) 23:26:23.49ID:BCBs43Sqいないことの証明はできないって言ってるみたいだけど、
いることの証明はできるんだ?w
そんな情報、公式に発表されてましたっけ?
0381デフォルトの名無しさん
2015/10/15(木) 23:34:56.20ID:BCBs43Sqちがうよ。
static binding
とか
dynamic binding
で検索して勉強してみて!
0382デフォルトの名無しさん
2015/10/16(金) 00:34:08.57ID:zUrsU6hFExcelでボタンを作成し、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/エラーコード2はFTPシンタックスエラー
そのtest.txtに書かれたコマンドが間違ってる
0385デフォルトの名無しさん
2015/10/16(金) 05:02:34.72ID:2dgCLobw> いることの証明はできるんだ?w
はあ?
どうやったらそんなアホな結論にたどり着くんだよ w
0386デフォルトの名無しさん
2015/10/16(金) 09:19:51.66ID:N0/epWSG営業用(1)と経理用(2)のエクセルファイルがそれぞれNファイル、1ファイルあるのですが
どちらも同じ金額データを入力しているので連携したいです。この場合はどのように連携するのが良いと思われますか。
(1) は受注毎に複数ファイルある
(2) は集計用なので(1)に入力された金額が縦に並んだ表形式
(1)に入力した各受注の金額が(2)に転記されると嬉しいです。リアルタイムでなくて問題ありません。
(1)を同じフォルダに全て入れておいて、(2)のボタン押下で順に読み込む方法しか思い浮かびませんでした。
なにか良いアイディアや経験などあれば教えてください。
0387デフォルトの名無しさん
2015/10/16(金) 09:48:53.84ID:nroKKoB00388デフォルトの名無しさん
2015/10/16(金) 10:15:31.18ID:moEJh26J> でもさー、これって「無い」よね?
> 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:moEJh26J0392デフォルトの名無しさん
2015/10/16(金) 13:48:28.46ID:AXquxQwQ>影響されるかどうか判断できるかもしれない。
でも、結局のところお前でもわからないんだろう?
じゃぁ、無いじゃん。
0を否定するなら1を出せよ。
0393デフォルトの名無しさん
2015/10/16(金) 13:54:16.89ID:K5dVJZW/「どちらとも断定できない」という場合もあるんですわよ?
0394デフォルトの名無しさん
2015/10/16(金) 13:57:59.13ID:moEJh26J> でも、結局のところお前でもわからないんだろう?
俺がわかるかどうかという問題ではない。
わかる人がいるかもしれないということだ。
> 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はAもBも無いと言った。
なので、俺はBに関してはそういう知見を持った人がいるのではといい、実際実験してみるとある程度の知見は得られた。
Aに関しては、それがわかる人がいるかどうかは、今ここでは誰もわからないということだろう。
いるとも言えないが、いないとも言えない。
俺の主観では、そういう知見がある人はいると思う。今ここにいないだけで。
0397デフォルトの名無しさん
2015/10/16(金) 14:33:59.84ID:moEJh26J> ことを知らないから、無いよねって発言したけど。
ついでに言えば、BIFFやOOXMLの仕様は公開されているし、Office互換ソフトのコードも公開されているものがあるのだから、
そのソースを読めば何かがわかるかもしれない。
わからないかもしれないが。(というか、いちいちこういうエクスキューズするの面倒なんだが)
0398デフォルトの名無しさん
2015/10/16(金) 16:34:43.72ID:c3hi3DeAセルの計算式に、自分以外のブックも指定できたはず
詳しくはVBA関係ないからどっか適当な板かスレで聞いてくれ
0399デフォルトの名無しさん
2015/10/16(金) 18:41:28.37ID:QoBFtYHr営業とか経理じゃないんだけど
俺の場合だと
1秒ごとに収集されてる気象データ
(1日分が1ファイルだったり1週間分が1ファイルだったり、
データによってまちまち)を
1年分で一つのブック(1シート一月分、12シートで1ブック)に集約するマクロとか使ってるよ
読み込み元のファイル名に日付とか観測地点名が書かれてて、
それをマクロで読み取って適切な保存先ファイルの適切なセル位置に振り分けて追記していく感じ
保存先のデータがどこまで書かれてるかを調べて、
それ以降の名前のファイルしか読み込まないから
読み込み元のファイルを特定のフォルダに突っ込んだらあとはマクロ起動して放っとくだけ
読み込むファイルのフォーマット(どの列・どの行・にどんなデータが入ってるか)がきちんと定まっていれば
かなりの程度自動化できると思う
(まぁ、ウチの場合は集約したあとは色々解析作業もあるけど、
経理ならそういうの関係ないよね、せいぜいSumで合算する程度でしょ)
なんなら、サンプルどっかに上げてよ
(個人情報とか固有名詞の類は一切不要)
どの項目をどこに集計させたいのか、そういった意図が分ればそれでいいから
あとはファイルの名前とそれが置かれる位置というかフォルダ構造なんかは割りと重要
一々ファイル開かずにファイル名とフォルダの場所なんかからファイルの中身が類推できるようにしとくと
ファイルを開いて中身を確認する手間が省けるので処理が圧倒的に速くなる
0400デフォルトの名無しさん
2015/10/16(金) 20:45:27.56ID:AviQ1U7E俺の会社でもフォルダ指定して中のファイル片っ端から開いて必要なデータを集積する方式だわ。
営業用が担当別なら、その形式が一番楽だと思う。成果物を突っ込んどいて貰ってマクロで拾えばいいんだから。
経理用に入力したものを営業用に反映するとなると面倒くさくなるから話が変わってくるけど。
>>398
会社でそういう形式の関数使ってるけど同時に開かれている状態にしないと値が更新されないんだよな。
0401デフォルトの名無しさん
2015/10/16(金) 20:50:28.91ID:WS6HRIwy開いてなくてもリンクの更新は出来る
安易にマクロ使うまえにまずエクセルの使い方覚えた方がいいぞマジに
0402デフォルトの名無しさん
2015/10/16(金) 21:05:46.46ID:wnEBCtLo「Excelの作りを知っている」
って
「そのエクセルブックの構成を知っている」
って意味に解釈していたが Excel.exe の作りの事なのか?
0403デフォルトの名無しさん
2015/10/16(金) 21:07:11.67ID:AviQ1U7Eああ、やっぱ普通は更新出来るんだな。ローカルでテストしたときと動作が違って焦ったんだよな。
俺の会社だと暗号化するネットストレージを介してるせいなのか開くまで認識してくれないんだよ。
0404デフォルトの名無しさん
2015/10/16(金) 22:04:25.50ID:SoxWpsox営業側が入力するファイルから共有サーバかGAEなどに自動or手動でログを吐き出す様にする
エクセルファイルを集めて管理する手間は省きたい
0405デフォルトの名無しさん
2015/10/16(金) 22:16:18.92ID:bIZ9qht1ご回答いただき、ありがとうございましたm(_ _)m
なんとか、他の方法で解決できました。
0406デフォルトの名無しさん
2015/10/17(土) 02:03:25.11ID:R2fw4Zxe片っ端から開くとファイルサーバとかなかなか終わらなくね?おれはそれであきらめた
0407デフォルトの名無しさん
2015/10/17(土) 08:01:41.29ID:OZbV6ZvFアドレスが仮想化されててそのままでは読めないからローカルに落としてマクロに読み込んでるけど、
手動で持ち出すのと転送量変わらないんだから日常作業に支障を来すファイルサーバとか買い換えた方がいいんじゃね。
0408デフォルトの名無しさん
2015/10/17(土) 09:52:36.96ID:lITdl3qEローカルに転送するのも、時間かかるから同じじゃないの?
0409デフォルトの名無しさん
2015/10/17(土) 12:03:15.43ID:hE3s3H8kfor next(i)の構文で変数を順番に変更する場合はどのように記載すればいいのでしょうか?
hensuu & i = "test"
のような記載ではエラーが出るようです。
お手数をおかけしますが、ご教示のほどよろしくお願いいたします。
0410デフォルトの名無しさん
2015/10/17(土) 12:29:35.99ID:gLjajuwO0411デフォルトの名無しさん
2015/10/17(土) 12:47:37.92ID:OZbV6ZvFユーザーフォームのコントロールなら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皆が言ってるように、配列としてループで設定するのが一般的。
訳あってどうしても変数名末尾に連番を付けて、それを作成した文字列で指定したい場合は
クラス上で変数をプロパティ化してCallByNameを使えば出来るけど、
余り初心者向きではないし、そこまでしてやりたい程のものかが分からない。
0413デフォルトの名無しさん
2015/10/17(土) 14:24:02.50ID:0dOkPt0P「おまえのやり方は間違っている、配列を使え」
0414386
2015/10/17(土) 15:56:42.15ID:2j9KNh6i状況をもう少し整理してみます。
受注表は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順不同でデータを片っ端から全部コピーしたあとキー1=日付、キー2=案件(ファイル名)でソートかけるのが簡単
0416デフォルトの名無しさん
2015/10/17(土) 19:32:01.42ID:BDeZUpOB行数不定の処理なんだからセル参照でやるよりもマクロのが楽だよ
経理用ファイルの最終行以降にどんどん追記するだけなんだから簡単じゃん
0417デフォルトの名無しさん
2015/10/17(土) 19:45:14.38ID:uNJQ9dbe0418デフォルトの名無しさん
2015/10/17(土) 20:51:18.96ID:BDeZUpOB俺にはよくわからんのだけど
受注表のデータが案件ごとに行数違うってのは日付固定だと解決できる話なの?
それにセル参照って対象が増えるたびに
オートフィルかなんかで増やさなきゃならんのでしょ?
マクロで追記させるほうがより柔軟かつ簡単だと思うんだけど?
0419デフォルトの名無しさん
2015/10/17(土) 21:47:59.27ID:uNJQ9dbeああ、つまり1行目は一日、2行目は二日って固定すればいいだろっていう話。
そうすれば行数が変わらないだろ。
0420デフォルトの名無しさん
2015/10/17(土) 22:02:13.46ID:7Lrcv9020421デフォルトの名無しさん
2015/10/17(土) 22:06:22.09ID:BDeZUpOB案件数とか営業担当者数とかもたぶん不定だと思うんだよね
結局、集計対照全体のデータ量(というか、使用されるセルの数)が
どれだけになるのか不確定なのだから
セル参照で対応させるのは難しいと思うんだ
セル参照は取り扱うデータのセル位置が不変の場合なら使えるんだけど、
この質問みたいにどんだけ表が延びるのかわからないケースだと
必ずしも向いてないんじゃなかろうか?
まぁ、それでもどうしてもセル参照でやるなら
担当者ごとの集計とか、日付ごとの集計とか、
とにかくワンクッションおいた中間集計を作って
(あるいはさらに複数の段階を経て)最終結果を取りまとめる
って言う手法もあるかもしれないんだけど
そこまでしてやるならマクロで一発で済ましたほうが簡単だと思うんだよね
0422デフォルトの名無しさん
2015/10/17(土) 22:14:02.66ID:uNJQ9dbe> 案件数とか営業担当者数とかもたぶん不定だと思うんだよね
不定はさすがに言いすぎだと思うが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:8xhftPvGi = 1
ループ
i = i + 1
ループ終わり
0425デフォルトの名無しさん
2015/10/18(日) 01:12:52.23ID:Vej+inz9Dim 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関数を呼び出して、その中でいろいろやってデータを返すと同時に
異常であるという情報も返したくなるのって、設計が悪いのかな
戻り値をVariant型にすれば実現はできるけれど、きっとお行儀が悪いって言われるよね
例として、以下のような関数を作りたくなることが自分は非常に多い
・日付の入ったセルオブジェクトを受け取り
・セルに入った日付に何らかの加工を施した日付を返すけれども
・不正な日付が入っていたり、範囲チェックで対象外の時にはFalseを返す
0427デフォルトの名無しさん
2015/10/18(日) 13:01:05.02ID:2izk1DSP最近になってgolangが多値でエラーを返す作法を復活させたしな。
ただvbではサポートされていないからどちらかを引数にするのが一般的なんじゃね。
0428デフォルトの名無しさん
2015/10/18(日) 14:05:39.11ID:TxcjIUFo気にすることなくVariantを使えばいいと思うよ。
0429デフォルトの名無しさん
2015/10/18(日) 14:38:03.71ID:meYS3A+Iobject返して、typeof(..) is で判定したらいいんじゃないかな?
Nullableにしといて、Nothing返すのはよくやるよ。
0430デフォルトの名無しさん
2015/10/18(日) 15:28:09.69ID:0tCduqbtクラスを作ってプロパティを2つ用意する手もある
日付としてありえない特別な値(-1とか)を返すなんてのもよく使われる
0431デフォルトの名無しさん
2015/10/18(日) 16:06:20.97ID:6KodRR6C関数の戻り値をBooleanにしてる。
レコードが存在すればtrue、無ければfalseに
んで、Trueの時に受け取りたい項目をByrefで設定した引数に入れるてるけど
受け取りたいのが1つだけでないなら>>430みたいに構造身体にすればいいだろうし
ま、やり方はいろいろあるだろうさ
0432デフォルトの名無しさん
2015/10/18(日) 16:28:09.80ID:Vej+inz9本来の戻り値をByRefで渡した変数に記録させて、Functionの戻り値でエラーを表現するのがスマートかな。
エラー発生時にTrueを返すようにするとif Function Then Goto ErrTrapみたいな形に出来るし。
0433デフォルトの名無しさん
2015/10/18(日) 17:46:06.04ID:TxcjIUFoいやそれは古くさいやり方なのでは?
0434デフォルトの名無しさん
2015/10/18(日) 18:00:37.67ID:sNi9xDw1使えるなら例外とかが一番いいと思うけど、古くさい言語の VBA なら >>432 とかでいいでしょ
個人的にはエラーの時に True を返すのはあまり好みでないけど
0435デフォルトの名無しさん
2015/10/18(日) 22:30:17.60ID:GZ8WzwdwPrivate な関数なら別にどうでもいいけど、PublicなコードではByRefでのoutよりは
IsEmptyなどで判別させる多値の方がいいよ。
0436デフォルトの名無しさん
2015/10/18(日) 22:35:38.81ID:+wEml+znありがとうございます!!!
これでやっと報告書のマクロが完成しそうです
本当に助かりました
0437デフォルトの名無しさん
2015/10/19(月) 04:13:09.25ID:PfXrk4NmVariant使わない前提の話だからEmpty値にはならないのでは。
0438デフォルトの名無しさん
2015/10/19(月) 06:58:53.77ID:q+3fvWeI0439デフォルトの名無しさん
2015/10/19(月) 07:22:17.86ID:JgpODEqs将来的に見てもBoolean型で問題ないならBoolean型で返せばいいし、
落ちた後、どんな種類で落ちたかの判別が必要なら列挙型で返せばいいし、
もっと詳細な情報が欲しければエラーオブジェクトそのものを返せばいい。
更にどの関数で落ちたか、いつ落ちたか等の付加情報を設定したい場合は、
エラー情報を格納するクラスを作ってそのプロパティとして設定してやり、インスタンスを戻り値に設定する。
そこまで行くと実処理の戻り値で返す方法と、
エラー情報取得用のプロパティを作ってそこから返すようにする方法があるけど、
とりあえず前者でいいんじゃないかな。
あと、部品にしている場合、あえてそこでエラーを捕まえないと言う方法もあるよ。
呼び出し側でエラーを捕まえることで、呼び出し側に戻り値の型を意識させたくない場合とかね。
0440デフォルトの名無しさん
2015/10/19(月) 08:13:15.70ID:haJ4nLKV成功値も返したいからこその悩みではないのかな。
エラーならエラーオブジェクト返せば良いと思うけどな。
引数をbyrefにするべき場面としない方がいい場面の両方があるけど、
引数がクラスだとインスタンス作って初期化してから呼ばないといかんのか、インスタンス作って返してくれるのか責任範囲が外から見づらいから基本的には、インスタンス作ってくれるようなのは戻り値として返してほしい。
シングルスレッドになっちゃうけど、作れてなかったなら何かしらのエラーなんだから、
その時にはじめてエラーを取ればいいんじゃないの?
さっき作ってくれなかったけどなんてエラーだったの?みたいな。
マルチスレッドなら、戻り値を含めた結果専用のクラスがほしいけどね。
.netならGenericsで一発なのに。
0441デフォルトの名無しさん
2015/10/19(月) 08:22:52.12ID:l1IvYy1dケースバイケースだとは思うけど、例えば Integer の値が欲しいのにエラーを返したいから Variant にするとかはちょっとどうかと思う
0442デフォルトの名無しさん
2015/10/19(月) 09:24:15.57ID:aF0TbBtn多分それは副作用を伴わない単純な関数なのだろうから、おっしゃる通りでしょうね。
0443デフォルトの名無しさん
2015/10/19(月) 10:52:41.41ID:XMyRFhyg> 営業とか経理じゃないんだけど
> 俺の場合だと
> 1秒ごとに収集されてる気象データ
さすがにデータベース使えよ。
何カ所で収集してるのかわからんけど、一箇所あたり、
1日で86,400レコード、
1ヶ月で約260万レコード、
1年で約3150万レコード。
0444デフォルトの名無しさん
2015/10/19(月) 13:44:31.32ID:XMyRFhyg> 例として、以下のような関数を作りたくなることが自分は非常に多い
> ・日付の入ったセルオブジェクトを受け取り
> ・セルに入った日付に何らかの加工を施した日付を返すけれども
> ・不正な日付が入っていたり、範囲チェックで対象外の時にはFalseを返す
横だが、これは機能が直交してないね。
あ、設計に口出すのはNGだっけか?
0445デフォルトの名無しさん
2015/10/19(月) 14:16:40.51ID:aF0TbBtnその機能をひとつの関数でやっているとしたら分解したほうがいいけどね。まさかそれはないと信じたい。
0446デフォルトの名無しさん
2015/10/19(月) 16:57:47.92ID:GKIe3Ccj投げ込めば投げられた側でなんでもやってくれそうな関数作る人いるよね。
でも、結局投げ込む側でもエラー処理を書くという・・・。
じゃぁ、投げ込む前にチェックしてもいいじゃねっていう。
0447デフォルトの名無しさん
2015/10/19(月) 17:47:44.09ID:aF0TbBtn0448デフォルトの名無しさん
2015/10/19(月) 17:50:41.80ID:bIFzKXU5VBAのバージョンって最新のExcelと
違うんですか?
(´・ω・`)
0449デフォルトの名無しさん
2015/10/19(月) 19:07:35.04ID:aF0TbBtnLongPtrとか64bit対応絡みの新しいキーワードが登場してる。
あとDeclare文にはPtrSafeって付けなきゃいけないとか。
0450デフォルトの名無しさん
2015/10/19(月) 20:07:53.08ID:l1IvYy1d直交の意味わかって書いてる?
>>445
> 何らかの加工
の内容にもよるけど、加工するならエラーチェックするのは当たり前だし、何を分解しようとしてるんだろう…
0451デフォルトの名無しさん
2015/10/19(月) 21:11:37.44ID:zICYHlOTそりゃ 「日付に何らかの加工を施した日付を返す」関数を単独に切りだせってことだろ。
引数をDate型にして。
0452デフォルトの名無しさん
2015/10/19(月) 21:43:46.61ID:qpkaMJyWおまいらの付け焼刃のコーディング論なんかクソの役にも立たんねん
要するに余計なお世話なんやで!
0453デフォルトの名無しさん
2015/10/19(月) 21:45:34.98ID:KNkiK4C3LONG_PTR型を使えるようになったVBAバージョンっていくつからかわかりますか?
またLong型を全てLONG_PTR型にすれば、使えるようになったバージョンから〜VBA7で、
オフィスが32bitも64bitも対応可能ってことになりますか?
0454デフォルトの名無しさん
2015/10/20(火) 01:19:09.68ID:xZ1KRCFN成功値ならエラーオブジェクトがNothingであることで判別が付くし、
エラー用のクラスを引数に持たせるなんて書いた覚えないんだけど、
何で引数に持たせると思ったの?
0455デフォルトの名無しさん
2015/10/20(火) 02:20:56.20ID:tpteZREFhttps://msdn.microsoft.com/ja-jp/library/office/gg264421.aspx
0456デフォルトの名無しさん
2015/10/20(火) 07:13:45.13ID:ydswHXZHbyrefで、の流れでレスしてた。すまん。
実処理の結果と論理的な結果が別の変数に乖離するのが嫌なだけだよ。
エラー用のクラスが引数でも、成功値セットのクラスが引数でも同じ事で。
インは引数、アウトは戻り値が理想だよね、って話で、
俺はVariantは宣言したら使っても良いと思う。
0457デフォルトの名無しさん
2015/10/20(火) 07:48:04.26ID:10B2/fqw閏秒のデータはどうなっているんだろう。
規定的には59、60,61秒での桁上がりがあるんだよね。
結構罠だよね
0458デフォルトの名無しさん
2015/10/20(火) 10:20:00.56ID:haHjjt4S> 直交の意味わかって書いてる?
凝集度が低く、なおかつ異なるレイヤー・ドメインの処理が混在していることを、
直交していないと俺は表現してるが、間違ってる?
0459デフォルトの名無しさん
2015/10/20(火) 11:01:43.40ID:iuUw7odg横だが、間違いだと思う。
0460デフォルトの名無しさん
2015/10/20(火) 11:29:40.01ID:haHjjt4S正しい意味は何?
0461デフォルトの名無しさん
2015/10/20(火) 11:31:10.14ID:haHjjt4S> ソフトウェアでの直交性は、機能間の組み合わせや順序について依存関係が小さい事を意味する場合が多い。具体的には次のような事例を指す。
> ・オブジェクトへの操作があるなら逆操作もある。
> ・プロパティ間に依存関係がない。
> ・不変契約が保持されている。
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それを直交してる/してないって表現するのは初めて聞いた
0465デフォルトの名無しさん
2015/10/20(火) 12:53:13.15ID:9SyfYFZF離れてないけど、
>>458は結果で、あくまで直交性としては、
並行ではない、の逆説的な意味で、機能が独立していること、逆変換可能であること、参照透過であること、じゃないかな。
目がくりっとしてて、耳が立っているのが柴犬、と
犬とは目が2つついてて、耳がついててワンと吠えるもの、
を混同して、
目がくりっとしてて耳が立っているのは目と耳があるから犬である、と言われても、三段論法以前の問題。
0466デフォルトの名無しさん
2015/10/20(火) 13:04:01.33ID:haHjjt4S> 機能が独立していること
うん、これが担保されていないので直交してないと表現したんだけど、どうも一般的じゃ
ないみたいだね。
これからは、使わないようにするよ。
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直交性と参照透過は関係あるのかな?
というのも、たった今こういう記事を読んだから。
http://qiita.com/knaka/items/b18134d9d11b51da4e2e
0469デフォルトの名無しさん
2015/10/20(火) 18:02:51.75ID:wXDHjVPO参照透過であるからこそ、直交性があると思うけど、どうなんだろう。
論旨は面白かったけど。
厳密に言えば、モナドを持つ関数は直交性が無いとすら言えると思う。
解析的に考えると、それは関数じゃない。
0470デフォルトの名無しさん
2015/10/20(火) 18:28:06.05ID:xsVY88X70471デフォルトの名無しさん
2015/10/20(火) 21:03:13.42ID:wFL9h+A/直交って何かと思ったら「次元」みたいな扱いか。
0472デフォルトの名無しさん
2015/10/20(火) 21:47:59.14ID:cLnE5KNn6と10は独立してないけど、2,3,5の組み合わせに分解すると独立する3つの概念に分けられるみたいな。
0473デフォルトの名無しさん
2015/10/20(火) 22:47:59.69ID:eF8264ko0474デフォルトの名無しさん
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すいません、検索しても見つからず教えていただけないでしょうか?
0477デフォルトの名無しさん
2015/10/21(水) 01:04:55.09ID:PkHZsUUSボタンは知らないけど、シェイプなら登録するマクロに引数持たせれば出来るんじゃないの?
0478デフォルトの名無しさん
2015/10/21(水) 01:11:13.58ID:PNxVph4Dどこまで聞きたいのか分りずらいけど とりあえず。
※あるセルの上にボタンを配置したければ
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:BhomK4j20480デフォルトの名無しさん
2015/10/21(水) 01:23:26.93ID:PNxVph4Dマクロを作るマクロも可能だよ(正確にはプロシージャ)
初心者向きじゃないけど
0481デフォルトの名無しさん
2015/10/21(水) 01:34:40.42ID:H5R6aAd2トンです
0482デフォルトの名無しさん
2015/10/21(水) 15:51:13.20ID:LkMjUTyJリストボックス内は4列あります。
0483デフォルトの名無しさん
2015/10/21(水) 16:34:10.31ID:jN1Om2/z0484デフォルトの名無しさん
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:KAyomFd30487デフォルトの名無しさん
2015/10/21(水) 18:35:49.80ID:H5R6aAd2書き方がわかんないので。申し訳ない
0488デフォルトの名無しさん
2015/10/21(水) 18:41:35.80ID:kluOGpTby = Val(Mid(p, 3))
m = Val(Mid(p, 10))
d = Val(Mid(p, InStr(p, "月") + 1))
0489デフォルトの名無しさん
2015/10/21(水) 18:44:59.78ID:PNxVph4DDim 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ついでたから
"フォーム"って "ユーザフォーム"の事だよね?
それで こゆことかな?
With ListBox1
Range("A1").Resize(.ListCount, .ColumnCount) = .List
End With
0491デフォルトの名無しさん
2015/10/21(水) 19:11:00.07ID:H5R6aAd2これで日付型二なるんですか?
0492デフォルトの名無しさん
2015/10/21(水) 19:21:40.43ID:vq6gVT+v0493デフォルトの名無しさん
2015/10/21(水) 19:23:15.43ID:PNxVph4D実際やった上で ならなかったのかな?
そこハッキリしてもらえる?
でどうなったかも
あと EXCELのバージョンは?俺は2013
0494デフォルトの名無しさん
2015/10/21(水) 19:55:02.13ID:AyxO5/kI意味わかるけど、それだとCとかJavaとかだよっと。
0495デフォルトの名無しさん
2015/10/21(水) 20:05:40.83ID:AyxO5/kIDim 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:kPIHjX0Mpath = "\\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お前嫌いだわw
0498デフォルトの名無しさん
2015/10/21(水) 21:18:48.27ID:AyxO5/kIあと、間違ってるぞw
0499デフォルトの名無しさん
2015/10/21(水) 21:31:54.39ID:PNxVph4Dもう一個作ってみた 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?
0501デフォルトの名無しさん
2015/10/22(木) 01:02:44.17ID:LWUxr4XK0502デフォルトの名無しさん
2015/10/22(木) 07:20:30.02ID:ZDrmESzip = "\\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繰り返し回数を分岐させたいのですがうまくいきません。
サンプルでこんな感じなのですが、繰り返し回数が無いものと認識されてしまいます。
作っているプログラムは、「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そのコードでは 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構造化プログラミングで検索して勉強してみるといいかも。
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なにがしたいのかよくわからんが
こういうことがやりたいのかな
For i = 2 To k+1
Cells(i, 1) = "AAA"
Next
0508デフォルトの名無しさん
2015/10/22(木) 20:30:31.00ID:kZtQWjvo構造化とオブジェクト指向って多くの部分で重なってるよね??
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:NqpfO95zDim 球団(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:NqpfO95z0512デフォルトの名無しさん
2015/10/22(木) 22:34:04.37ID:tUEKhMi2御親切にありがとうございます。
すいません、これが例えばキープという制度はなく、
最初の希望で10人とったら確定になってしまい、落ちた選手が第二希望に行ったとしても
その第二希望の球団が10人になっていたら、入れ替えはなく自動的に3,4,5と落ちて行って
空いてるところに収まる場合はどうなりますか?
細かい違いなのですが、教えていただければ幸いです
0513デフォルトの名無しさん
2015/10/22(木) 22:58:58.52ID:NqpfO95z>>510はあくまで「12球団が希望するそれぞれの選手の順番」と「選手120人が希望するそれぞれの球団の順番」が揃っただけだから、
ここで得られたジグ配列を利用してキープなり先着順なりのアルゴリズムを実装する事になる。
それぞれの配列は
「球団(i)(j)」の時、「i球団がj番目に欲しい選手」
「選手(i)(j)」の時、「i選手がj番目に入りたい球団」
とする事が出来るはずなので後は自分で考えるなりしてくれ。
0514デフォルトの名無しさん
2015/10/23(金) 07:07:59.29ID:cnjrTfagそうだね。でも基本的に重なっている部分は
「基本的に同じコードは2度書かない」ということに回帰する。
VBAの場合一応クラスが使えるから、Object指向の言語を先に勉強すると、
きちんと場所ごとに役割付けされた、無駄な分岐のない
見やすく改修しやすいコードで組むことが出来るようになるね。
0515デフォルトの名無しさん
2015/10/23(金) 08:04:19.01ID:NKqGTZsQ重なっているというよりはレイヤの違う概念だな
本当は直交する概念と書きたかったけど、ちょこっと意味が違うなw
0516デフォルトの名無しさん
2015/10/23(金) 12:02:54.11ID:p1/LXmyz他人に使ってもらうことを考えるときは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編集されたかどうかを知りたいだけなら、フォームを開く前後で全項目の比較をすれば?
0519デフォルトの名無しさん
2015/10/23(金) 13:52:01.55ID:C4TSXTyD編集されたかどうかをチェンジイベントで判定している理由は、一つのレコードは一度の入力で完了するものではなく、項目によっては後日入力する必要があるため、
フォーム上のスピンボタンを押して通し番号を変更して他のレコードに移れる様にするためです。
0520デフォルトの名無しさん
2015/10/23(金) 14:16:30.63ID:9JJo3sM8> 編集されたかどうかをチェンジイベントで判定している理由は、一つのレコードは一度の入力で完了するものではなく、項目によっては後日入力する必要があるため、
これをまとめてやってはいけない理由がわからない。
> フォーム上のスピンボタンを押して通し番号を変更して他のレコードに移れる様にするためです。
スピンボタンを押したときにまとめてチェックすれば?
0521デフォルトの名無しさん
2015/10/23(金) 14:19:17.14ID:9JJo3sM8疑問その2: 仮に各項目毎に編集フラグがあったとして、1 → 2 → 1と変更されたら、
イベントハンドラで単にフラグを立てるだけだと、変更されたと見なしてしまうのでは?
0522デフォルトの名無しさん
2015/10/23(金) 15:43:55.61ID:C4TSXTyD>これをまとめてやってはいけない理由がわからない。
用途は受注の一元管理のための物です。
受注時、請求時、入金時に各項目を入力する物で、フォームをみれば未請求・未入金が分かるようにしてあります。
請求や入金時には該当する受注のレコードを表示して空欄を埋めます。
>スピンボタンを押したときにまとめてチェックすれば?
その方法の方がスマートと思います。
一度取り組んでみます。
>>521
>疑問その1: そもそも編集されたかどうかは、何のために知る必要があるの?
スピンボタンを押したときに変更されていればMsgboxで確認後にセルに上書きしてから別のレコードに移る為です。
>疑問その2: 仮に各項目毎に編集フラグがあったとして、1 → 2 → 1と変更されたら、
イベントハンドラで単にフラグを立てるだけだと、変更されたと見なしてしまうのでは?
おっしゃるとおりです。
変更有りと見なされて確認のMsgboxが出ますが上書きするだけのコードなので変更がなければキャンセルしてレコードは移ります。
なお編集フラグはフォームのコード上で一つしか用意していないのでどこかが編集されればフラグONとなります。
フラグの立て方やチェックのタイミングはご指摘された点も納得でき、私の至らない部分も理解できますが
ご教授いただきたいのはなぜ同じコンボボックスのチェンジイベントが何度も発生し同じコードが繰り返し呼び出されるのか、と言う点なんです。
0523デフォルトの名無しさん
2015/10/23(金) 15:47:04.27ID:ivRzPMDy0524デフォルトの名無しさん
2015/10/23(金) 16:09:40.49ID:6RpU4G8/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/>コマンドボタン押下後の動きをF8で追っていくと
追っていっているなら、コマンドボタンのチェンジイベントに行く
前のコード知ってますよね?
そこから辿れませんか?
連投しつれい。
0526デフォルトの名無しさん
2015/10/23(金) 16:43:46.01ID:vuxsJR4x俺も昔同じようなこと経験したな。
初心者なりにいろいろ試したけど結局解決せず、
イベントプロシージャを使わない方法に変更したなー
0527デフォルトの名無しさん
2015/10/23(金) 16:47:18.61ID:Fl5byCeAcontrolsを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コマンドボタンを押した後の動作は
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/でもさ、Changeイベントで使う側が納得できるなら
BeforeUpdateイベントでも良くね?
0530デフォルトの名無しさん
2015/10/23(金) 17:08:27.14ID:KQKbFmU6RowSourceに指定されてるセルの内容が変わってもChange走るみたいだからそれじゃね
0531デフォルトの名無しさん
2015/10/23(金) 17:19:50.77ID:C4TSXTyD謎のChangeイベントが発生して何度も呼び出されるComboBoxのRowSourceは作業用のデータ格納用の別シートを参照しているんです。
0532デフォルトの名無しさん
2015/10/23(金) 17:24:25.81ID:Fl5byCeAコンボにセットしてる所が見えないからわからんけど、値で渡せてる?
>>529
Change、発生要因が多すぎ。
取り敢えず内容が変わるか、参照が変わるか、参照先の内容が変わると発生しよる。
0533デフォルトの名無しさん
2015/10/23(金) 17:24:41.12ID:KQKbFmU6じゃあ知らん。自分で確認しろ
関係ないと思われるコードをちょっとずつ削って行って
最終的にこれ以上削ると現象が発生しなくなるとこまで削れ
そのコード見ても原因がわからないようだったらそのコード晒して再度聞いてみ
0534デフォルトの名無しさん
2015/10/23(金) 17:27:05.03ID:6RpU4G8/それだ!
俺も確認した。
>>531
RowSourceで設定しないでClearとAddItemで頑張れば解決なんじゃないの?
0535デフォルトの名無しさん
2015/10/23(金) 19:50:15.39ID:F3Hmui89セルの値を弄るならフォーム要らないし、フォームで弄るならセル要らないし。
0536デフォルトの名無しさん
2015/10/23(金) 20:09:19.74ID:NKqGTZsQ無駄を気にするんだったら編集前の値を保存しておくしかないよ。
0537デフォルトの名無しさん
2015/10/23(金) 20:15:34.06ID:AqPItTe/0538デフォルトの名無しさん
2015/10/23(金) 23:56:25.83ID:gGW/KTGnんじゃ、その
>作業用のデータ格納用の別シート
のセルが、代入先セルを参照しちゃってるとか?
気づかないうちにそうなってしまってる可能性はあるかもしれないよ?
てか、それくらいしか思いつかん。
0539デフォルトの名無しさん
2015/10/24(土) 13:21:06.86ID:X34FC24zSub 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代入とかではアクティブシートは変化しないよ
0542デフォルトの名無しさん
2015/10/24(土) 14:28:38.49ID:tZ2jAKBl0543デフォルトの名無しさん
2015/10/24(土) 15:23:30.40ID:nr5gFTSO処理後にもっかいアクティブにしときゃええんちゃうか
0544デフォルトの名無しさん
2015/10/24(土) 18:32:52.39ID:X34FC24zありがとうございます、代入くらいでは変化しなさそうですね
0545デフォルトの名無しさん
2015/10/24(土) 19:56:10.60ID:fS9+MhVNvbscriptでexcelマクロ動かした時
シートコピーするとコピー後シートが
ActiveSheetにならなくて
意外に思った時がありました
Worksheet.copyで戻り値がBooleanなのも
その時知ったなぁ…
0546デフォルトの名無しさん
2015/10/24(土) 20:18:41.12ID:dOe1BR+K>Worksheet.copyで戻り値がBoolean
詳しく
少なくとも2007でオブジェクトブラウザで確認しても戻り値なしだけど
0547デフォルトの名無しさん
2015/10/25(日) 08:57:49.95ID:zmxboF+k0548デフォルトの名無しさん
2015/10/25(日) 15:31:09.85ID:75RHDcLlどなたか教えてください。
関数でIFを用いて、『a及びbのときはc、d及びeのときはf』とした場合、cやfの出力値をセル内に入力した値に指定する方法はあるのでしょうか?
なかなかうまくいかなくて…
ご教授お願いします。
0549548
2015/10/25(日) 16:03:49.24ID:ukV3wqdd申し訳ありません。
0550デフォルトの名無しさん
2015/10/26(月) 21:25:03.69ID:Qg+0FyiQWith 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相対位置と絶対位置がごっちゃになってる
ちゃんと追いかけるのが面倒なんで適当に書くけど、修正点は
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一番最後にいったらj : 2 , k : 1 で、最後の行(=一番上の行)が判定されて
deleteされると思ってたのです
いただいた修正点ありがとうございます。なんで-1してるのかよくわかっておらず
もう少しご教示いただけると
0553デフォルトの名無しさん
2015/10/26(月) 23:28:42.58ID:gOYl/ZIw行番号、列番号は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コンストラクタの機能がないようなのですが本当ですか?
無理矢理コンストラクタを実現したい場合どのようにするのが定石ですか?
0556デフォルトの名無しさん
2015/10/28(水) 00:35:48.79ID:/L6hupTJ0557デフォルトの名無しさん
2015/10/28(水) 00:41:50.97ID:uQQgy6QZないのであきらめてinitとか適当なメソッド作って妥協
0558デフォルトの名無しさん
2015/10/28(水) 00:58:57.54ID:MiGgg8V7生成した直後に自前の初期化用メソッドを生成元から呼び出します。
こっちも質問です。
シングルトンなクラスを作りたいんですが、標準モジュールを介さないで作る方法はありますか?
標準モジュールを介すると、役割付けが難しくなったり、
専用の標準モジュールを用意したりしないといけなくなるから
出来れば直接クラスからインスタンスを取得する方法が知りたいです。
0559デフォルトの名無しさん
2015/10/28(水) 03:16:35.85ID:Dygk5TrA>シングルトンなクラス
知ってるとは思うけど、VBAで頑張るより
.NetからVBA使う方が早いよ。
というか、そこまでの要求に応える言語じゃないと思ってる。
0560デフォルトの名無しさん
2015/10/28(水) 07:51:32.81ID:MiGgg8V7今の仕事場の環境がVB6.0とEXCEL2003くらいしか無いから困っているのです。
VB6.0とVBAはほぼ同じ言語仕様と理解していますが、VB6.0かb蹙XCELを操作すると
EXCELのファイルを開くところのロジックから作成したり、Objectの解放を考慮したりと、
大掛かりになる割に根本的なところが解決しないのと、
システムに絡めると言うより、ツールとして単体で作成するものなので、VBA側で行いたいと思っています。
仰る通り.NetFreamworkが入れられればいいのですが、旧態依然とした社風の仕事場で、申請許可が下りないのです。
0561デフォルトの名無しさん
2015/10/28(水) 09:19:30.50ID:YN+o7H1O0562デフォルトの名無しさん
2015/10/28(水) 10:16:30.17ID:h5jRX9PzVBEでクラスモジュールを選択後、オブジェクト選択コンボボックスでClassを選択すると、
プロシージャコンボボックスでコンストラクタとデストラクタを選択できるようになる。
0563デフォルトの名無しさん
2015/10/28(水) 10:23:12.86ID:h5jRX9Pz> .NetからVBA使う方が早いよ。
VBAで呼び出しエントリを作って、.Netからは基本1回呼び出すだけ、処理はVBA内部で全部行う、
ってのが速い。
呼び出しコスト高杉なので、ループして.NetからVBAのメソッド呼び出しやオブジェクト操作なんか
すると目も当てられないことになる。
0564デフォルトの名無しさん
2015/10/28(水) 10:27:37.32ID:h5jRX9Pzそうそう、Class_Initialize()には引数は渡せないから、引数を渡してインスタンスを作りたいなら、
標準モジュールなんかにBuilderメソッドを作るしかない。
0565デフォルトの名無しさん
2015/10/28(水) 12:08:47.68ID:DbWn1xdh0566デフォルトの名無しさん
2015/10/28(水) 17:03:07.27ID:Dygk5TrAうーん、作るシステムにもよるんだけども、
I/O部分だけがExcelで済むのなら、
関数は.Netにもあるので言語をVBAにこだわる必要は無いよって
言いたかっただけなんだ。
あと、I/Oで早くするテクニックあるみたいよ(ググてね
>>560
>VBA側で行いたいと思っています。
オブジェクト指向的なプログラミングに関しては入門以下レベルだから、
VBAだと無理だと思う。
0567デフォルトの名無しさん
2015/10/28(水) 17:08:53.22ID:JFpDXlQ+無いものを何とかする方法を探すのはまだ理解できるが、使えるもの使わないで違う方法探すのは
それなりの理由が無ければアホとしか言えん
0568デフォルトの名無しさん
2015/10/28(水) 17:26:12.69ID:h5jRX9Pz> 関数は.Netにもあるので言語をVBAにこだわる必要は無いよって
> 言いたかっただけなんだ。
.Netの機能そのものを使いたいなら、VBAで.Netの機能を使えばいいし。
> あと、I/Oで早くするテクニックあるみたいよ(ググてね
なんのことかわからないけど、呼び出し(アクセス)速度は速くできないのでは?
0569デフォルトの名無しさん
2015/10/28(水) 19:08:09.22ID:8zJiOHJK旧態依然な環境なら旧態依然な作り方しなよ
それか Excel 2003 なんて使ってる会社ならセキュリティなんて考えてないだろうから Visual Studio Community とか Express 入れてもばれないじゃね?
0570デフォルトの名無しさん
2015/10/28(水) 19:22:24.06ID:Dygk5TrAそれって標準モジュールの利点と欠点を理解してないってことだよね。
突き詰めると、ThisWorkbook、Sheetとフォームとあとクラスモジュールを
どう使い分けるかを考えているのかどうか・・・あやしいよね。
0571デフォルトの名無しさん
2015/10/28(水) 19:33:28.76ID:JCr0Dqqvいや、もしかするとXPかもしれないぞ...
0572デフォルトの名無しさん
2015/10/28(水) 19:48:12.05ID:8zJiOHJKなので Express って書いてある
2010 までは XP でいけたと思う
0573デフォルトの名無しさん
2015/10/28(水) 20:00:26.65ID:RbX1jPDs>なんのことかわからないけど、呼び出し(アクセス)速度は速くできないのでは?
FSO使ってcsvをテキストファイルとして呼び出すのと、
Workbooks.Openメソッドで呼び出すのでは速度が違うとかそんな話なのかもしれない。
ところでDirectX3DのDLLって参照設定→参照でファイル名に「D3D」って入れると8〜11まで出てくるのに、
どれを選択しても「指定されたファイルへの参照は登録できません。」とエラー返されて終わるんだけど、
これって参照する方法ない?
0574デフォルトの名無しさん
2015/10/28(水) 20:14:00.02ID:JCr0Dqqv2010ってまだDLできたっけ?
0575デフォルトの名無しさん
2015/10/28(水) 20:16:42.33ID:+AokFIEuオブジェクトの解放をしていなかったせいか。そのexcelファイルを開いて少し時間が経つとパソコンが全く動かなくなる現象が起きるようになりました
この場合、一旦すべてのオブジェクトを解放したほうがよいのでしょうか
その場合どのようにすればよいのでしょうか
0576デフォルトの名無しさん
2015/10/28(水) 20:22:46.47ID:JCr0Dqqv0577デフォルトの名無しさん
2015/10/28(水) 20:39:43.23ID:RbX1jPDsVBAでは出来ないだろ。
0578デフォルトの名無しさん
2015/10/28(水) 21:02:24.11ID:ESD9qix2https://go.microsoft.com/?linkid=9709969
0579デフォルトの名無しさん
2015/10/28(水) 21:24:06.01ID:vlhaUrmX0580デフォルトの名無しさん
2015/10/28(水) 21:26:25.73ID:9zUX3+we>そのexcelファイルを開いて少し時間が経つとパソコンが全く動かなくなる現象
ういるすじゃなかろか
0581デフォルトの名無しさん
2015/10/28(水) 22:27:44.68ID:/L6hupTJ難しいことはよくわからないけど10回に1回ぐらいそのマクロブックを保存するようにすると解決するかも。それでも重ければ毎回保存。
0582デフォルトの名無しさん
2015/10/28(水) 23:50:57.84ID:Dygk5TrA他の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回答です
ttp://itpro.nikkeibp.co.jp/article/COLUMN/20140325/545792
0585デフォルトの名無しさん
2015/10/29(木) 22:47:29.00ID:xm7GMR+N今の所おれははない
0586デフォルトの名無しさん
2015/10/29(木) 22:50:42.61ID:8NhOSfbI2 -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普通にシートでソートすればいいんじゃね?
http://officetanaka.net/excel/vba/tips/tips148.htm
VBA ONLYなら
配列に入れて ソートする(ソートアルゴリズムは自分で実装する)
0588デフォルトの名無しさん
2015/10/29(木) 23:06:23.91ID:Q2L1bFVSVBAで自力ソートはいくらアルゴリズムを工夫しても太刀打ちできない
0589デフォルトの名無しさん
2015/10/29(木) 23:14:00.65ID:LDv0f1Xeそうか?
確認してみよう
0590デフォルトの名無しさん
2015/10/29(木) 23:16:37.42ID:8NhOSfbI>>588
連想配列とか使ってやれるかと思ってたんだけども rangeオブジェクトのがいいんだ
あざっすあざっす
0591デフォルトの名無しさん
2015/10/29(木) 23:18:42.11ID:dmkvBav+CPU使用率・メモリの使用量などを、チェックすれば?
0592デフォルトの名無しさん
2015/10/29(木) 23:29:58.68ID:LDv0f1Xe手元の環境で実測してみた
1.[A1:A1048576] に =Rand() を入れ、値コピーして固定する。
Columns("A:A")をソートする。
→ 平均 1052ms
2.[A1:A1048576] を配列に入れる。
その配列をソートしたときのインデックスを出力する
→ 平均 250ms
インデックスを出力するのに引き続いて、そのインデックスに基づいてソートする
→ 平均 1340ms
「配列に入れる」部分の時間は含んでいない
0593デフォルトの名無しさん
2015/10/30(金) 04:43:34.03ID:o6oPjLK7配列でソートしたときの時間が出力も込みなら、どうやって出力したかも書いとけよ
ソートのアルゴリズムなんてかなり研究されてるから、そこに速度差が出る要素は少ないだろう
自前ソートが相対的に遅いのは、ソートそのものじゃなくてセルへの入出力に時間かかるからだし
0594デフォルトの名無しさん
2015/10/30(金) 08:04:22.71ID:FKezdCzi出力?
0595デフォルトの名無しさん
2015/10/30(金) 11:34:20.61ID:MOhQGiL+0596デフォルトの名無しさん
2015/10/30(金) 20:52:36.34ID:gPbmFrsEえーとExcelでカラム1個だけソートなんてほぼありえないからA-Z辺りまでやってみては
VBAでRangeから受けた二次元配列のソートってどうやるんだったか
0597デフォルトの名無しさん
2015/10/30(金) 23:15:04.12ID:AOFIcsmiソートのキーはどれか1カラムの値でいいの?
0598デフォルトの名無しさん
2015/10/30(金) 23:49:36.47ID:AOFIcsmiとりあえず実測してみた
1.[A1:Z1048576] に =Rand() を入れ、値コピーして固定する。
Columns("A:A")をキーにしてシート上でソートする。
→ 平均 9495ms
2.[A1:Z1048576] を配列に入れる。
最初の列をキーにしたインデックスを求め、そのインデックスに基づいて配列をソートする。
→ 平均 8923ms
「配列に入れる」部分の時間は含んでいないし、結果をシートに書き込んでもいない。
どちらも3回やった結果の平均。
0599デフォルトの名無しさん
2015/10/30(金) 23:52:59.57ID:AOFIcsmi0600デフォルトの名無しさん
2015/10/31(土) 00:03:58.25ID:lS/K1V20登録したありがとう
できればワードのマクロで、docもxlsも一気に行きたいです。
エクセルで個人用マクロブック使うと、会社のセキュリティに「使えません」などと言われるから使えん…(何故かワードの方はマクロ使える)
0601デフォルトの名無しさん
2015/10/31(土) 02:17:06.29ID:XywDLt1Tこれでifの判定終わった後に Cells(i,2*j)の演算あるんだけど エラー出るんだがなんでやねん
0602デフォルトの名無しさん
2015/10/31(土) 02:35:03.94ID:XywDLt1Tなんか釈然としねぇ
0603デフォルトの名無しさん
2015/10/31(土) 03:18:57.02ID:3FqIgxLp0604デフォルトの名無しさん
2015/10/31(土) 03:28:53.63ID:CVsb3S4rなんでエラーの内容すら書かないのかねぇ
2007で試したけどcellsが範囲内ならエラーにはならなかった
EXCELのバージョンとエラーメッセージと、その時のi,jの値と該当セルの内容書け
0605デフォルトの名無しさん
2015/10/31(土) 03:39:30.73ID:CVsb3S4rワークシートのソートは、まさにセルの並べ替えで、セルの書式情報込みで入れ替えて表示するから
書式どころかシートに結果出力しない状態と比べるのは条件に差がありすぎる気がする
入力も出力もシートじゃない前提ならEXCEL VBAを使うという選択そのものが疑問だし
0606デフォルトの名無しさん
2015/10/31(土) 03:48:14.30ID:wDT+WWanVBAにおける Nothing の意味を勘違いしてる気がするにゃ
0607デフォルトの名無しさん
2015/10/31(土) 10:34:42.28ID:TXrsCx/iApplication.EnableEvents=False だと全てのイベントが停止されてしまいます
0608デフォルトの名無しさん
2015/10/31(土) 10:35:57.41ID:D29NBcNUデータをソートするのは一連の処理の中の一部分に過ぎないので、そこだけを入出力の対象にするという発想はあまりない。
どちらかというと、配列処理の途中でソートするときだけは(スピードの観点で)シートへの入出力をすべきなのか、
という問題意識なんだと思います。
0609デフォルトの名無しさん
2015/10/31(土) 12:11:30.86ID:hbeSIkWk無理
別シートどころか、関係なさそうな別ブックですら止まる
独自にフラグ管理でもするしかない
0610デフォルトの名無しさん
2015/10/31(土) 13:40:49.31ID:TXrsCx/i無理ですか・・・
そのフラグ管理でどうにかしてみます。
ありがとうございました。
0611デフォルトの名無しさん
2015/10/31(土) 18:52:09.69ID:CVsb3S4rああ、そういえばもともと、データの入力元も出力先も想定されてない話だったな
まず、VBAにソートはない
適当なソートライブラリがあるか、効率的なソートがすらすら書ける人なら自前でソートすればいい
でもそれが出来る人はこんなとこでそんな質問しないだろうから
シートに書き出してソートしろでいいんじゃね
速度差を問題にするならもうちょい条件を限定しないとダメだね
すくなくとも>>588はテストまでして反論するほどの説得力のある意見ではないわ
0612デフォルトの名無しさん
2015/10/31(土) 18:59:15.08ID:t9Rmpodd0613デフォルトの名無しさん
2015/10/31(土) 19:15:15.41ID:wDT+WWanなら 実際に試してみれば いいじゃん
なにを躊躇してるの?
0614デフォルトの名無しさん
2015/10/31(土) 20:13:02.37ID:35yXB8xC0615デフォルトの名無しさん
2015/10/31(土) 22:08:54.90ID:RIZFllKeFindFirstFileAはUNICODEなファイル名読めないから使っちゃダメよ
0616デフォルトの名無しさん
2015/10/31(土) 22:33:22.81ID:XywDLt1TNothing の意味を履き違えてるってことか
0617デフォルトの名無しさん
2015/10/31(土) 22:35:21.19ID:TuS0NuwD>UNICODEなファイル名読めないから使っちゃダメよ
それはどうだろう?
0618デフォルトの名無しさん
2015/10/31(土) 22:41:22.09ID:35yXB8xC0619デフォルトの名無しさん
2015/10/31(土) 22:42:56.14ID:j45KtvGbというより、、、
>ルートフォルダ内の全部のファイル一度みにいくため遅いのですが
これを直さないと根本的に早くならないのでは?
0620デフォルトの名無しさん
2015/10/31(土) 23:20:04.79ID:RIZFllKe0621デフォルトの名無しさん
2015/10/31(土) 23:25:53.39ID:CVsb3S4rもしお前が
If 条件A And 条件B という判定式で、条件Aが偽のとき条件Bが評価されないはず
と思っているなら、それは間違ってる
VBAはショートサーキット評価しない
ちなみに、>>601の式は、前と後ろでcellsの位置が違うから
前はちゃんとしたセルでも後ろは変なとこ参照するかもしれんぞ
まあ、コピペミスとかならいいけど
Nothingの意味はどう思ってるか知らんが、Cellsメソッド(かプロパティか)がNothingになることなんて多分ないと思うぞ
それはつまり不正なセルを参照しようとしてるってことで、その段階でおそらくエラーになる
0622デフォルトの名無しさん
2015/10/31(土) 23:32:51.35ID:35yXB8xC0623デフォルトの名無しさん
2015/10/31(土) 23:38:54.72ID:3FqIgxLp"" も入れてやってくれ
0624デフォルトの名無しさん
2015/10/31(土) 23:46:48.36ID:TuS0NuwDTrue
もな
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トンです。
API使うと早いんですか。コマンドのTREE /F、DIRとかの出力したものから拾う方が早いですかね。
0628デフォルトの名無しさん
2015/11/01(日) 14:42:44.34ID:Ur9dhwuU倉庫番を作りたいんですが
どうやったらいいんですか?
(´・ω・`)
0629デフォルトの名無しさん
2015/11/01(日) 15:01:20.63ID:hA7HJBKq0630デフォルトの名無しさん
2015/11/01(日) 15:26:57.79ID:VR25FJJgその手の本が何冊か出ていますので買って勉強してください
0631デフォルトの名無しさん
2015/11/01(日) 16:28:43.99ID:NTAf7jEe0632デフォルトの名無しさん
2015/11/01(日) 19:43:53.71ID:U7qRUw2S0633デフォルトの名無しさん
2015/11/01(日) 20:11:34.06ID:HrqCcPCl0634デフォルトの名無しさん
2015/11/01(日) 20:28:04.95ID:8wBAqxRoフルスクラッチで開発すれば著作権違反にはならんよ
商標権の侵害にはなるけど
0635デフォルトの名無しさん
2015/11/01(日) 20:28:13.91ID:U7qRUw2S0636デフォルトの名無しさん
2015/11/02(月) 00:03:58.10ID:XspLzh3/adodb.connectionってクローズしないまま終了するとやばい?それとも勝手にクローズしてくれる?
0637デフォルトの名無しさん
2015/11/02(月) 01:42:57.39ID:SpPr0mCaExcelなんかのアウトプロセスサーバは放置すると残ったままなのでやばい
0638デフォルトの名無しさん
2015/11/02(月) 01:53:58.03ID:XspLzh3/あざっす
0639デフォルトの名無しさん
2015/11/02(月) 04:39:39.39ID:XPI4A8M9[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亀レスで申し訳ない。標準モジュールを介さないと言うのは難しいけど、
役割付けと言う意味では標準モジュールからクラスを生成してそこからインスタンスを取得するんじゃなくて、
クラスのメソッドやプロパティに標準モジュールの関数やプロパティを移譲してやることで
クラスの役割を崩さず使うことができるよ。
標準モジュールは増えるけど、クラスのコンストラクタで自分自身を生成して標準モジュールにそのインスタンスを格納すれば
クラスにGetInstanceメソッドを作って、そこから標準モジュールに格納したインスタンスを引っ張り出したり、
インスタンスのメソッドから移譲した標準モジュールのプロパティや関数を使用すればVB.Netで言うシェアードなメソッドやプロパティと
同じ効力を持たせることも出来る。
以前、属性を使えばクラスのみでシングルトンパターンを使えるような記述をどこかのページで見かけたけど、
長い目で見た場合こっちの方法もありだと思うよ。
0641デフォルトの名無しさん
2015/11/03(火) 11:14:27.16ID:envUuh/vddです
できました。
ぐぐってもクラスモジュール使う方法とかしかなかったので
もっとスマートな方法が無いかなと思って。
>所で
>Workbooks.Add
>で新規Workbookは作成できるけどわざわざ
>CreateObject("Excel.Sheet")してる理由は何?
引き継ぎなんですよー、VBA触ったことのない俺にw
重ねてありがとう
0642デフォルトの名無しさん
2015/11/03(火) 14:09:19.29ID:Y3S792fPt = t + 0.1
こんな感じで足していくと丸め誤差ってやつが出てしまうので
Cells(1, 1) = Cells(1, 1) + Cells(r, c)
こんな感じにしようかと思うのですが、処理時間に大きな差がありますか?
0643デフォルトの名無しさん
2015/11/03(火) 14:17:14.10ID:EOXYkI6sRange型は処理が激重なので、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激重でしたか・・・質問してよかったです。
その方法でやってみます。ありがとうございました。
0645デフォルトの名無しさん
2015/11/03(火) 17:29:39.02ID:jJ+fP6VB0646デフォルトの名無しさん
2015/11/03(火) 18:07:42.77ID:AG29+Pby初耳だが
0647デフォルトの名無しさん
2015/11/03(火) 18:39:28.88ID:lYNSYSuY0648デフォルトの名無しさん
2015/11/03(火) 19:56:34.10ID:eldm4iEB0649デフォルトの名無しさん
2015/11/03(火) 19:59:48.72ID:j/7KwPnc0650デフォルトの名無しさん
2015/11/03(火) 20:17:35.40ID:Y3S792fPDim 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けど少数使いたいときはcurrency型使っとけ
0652デフォルトの名無しさん
2015/11/03(火) 20:52:08.16ID:aZDmPuCyそれ1になるようでなってないよ。
Cells(12, 1) = 1.0
がFalseになるから試してみ?
0653デフォルトの名無しさん
2015/11/03(火) 21:10:28.16ID:iKi9OwRHこれ試してみ
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:Y3S792fP1です。
0655デフォルトの名無しさん
2015/11/04(水) 01:31:57.49ID:tOBmWAwghttp://i.imgur.com/VD1eyQN.png
0656デフォルトの名無しさん
2015/11/04(水) 11:15:12.76ID:9QhHdSU3継承を実現するための定石はどうすることですか?
0657デフォルトの名無しさん
2015/11/04(水) 11:16:32.91ID:gy7yyt3H0658デフォルトの名無しさん
2015/11/04(水) 11:27:08.15ID:9QhHdSU30659デフォルトの名無しさん
2015/11/04(水) 11:29:19.55ID:Ws0cACQx0660デフォルトの名無しさん
2015/11/04(水) 11:49:04.84ID:fAjxwUJyよくわからないけど、Module1.basにFunction getClass1Instance() as Class1を作る方が簡単じゃない?
0661デフォルトの名無しさん
2015/11/04(水) 12:54:56.62ID:8eLhc3Ee0662デフォルトの名無しさん
2015/11/04(水) 13:20:30.30ID:GJw+yxSjEXCEL機能(VBAのではなく)範囲で利用する限りにおいて
継承が必要?って気もするな
有ったら便利かもだけど 無くても不便ではないと思う
元レスの定石云々は あまり気にしても仕方ない気がするな
0663デフォルトの名無しさん
2015/11/04(水) 17:48:05.55ID:dQvoR8qCこんなに苦痛を感じないで済んだのになぁ
(´・ω・`)
0664デフォルトの名無しさん
2015/11/04(水) 18:06:00.90ID:eiHA5R2A0665デフォルトの名無しさん
2015/11/04(水) 18:34:56.05ID:fAjxwUJy0666デフォルトの名無しさん
2015/11/04(水) 19:16:16.17ID:cuFny4hP0667デフォルトの名無しさん
2015/11/04(水) 19:35:21.74ID:8eLhc3Eeとかあったなー
0668デフォルトの名無しさん
2015/11/04(水) 19:47:56.51ID:JYWBjL30今は違うのか?
0669デフォルトの名無しさん
2015/11/04(水) 19:58:31.14ID:d5XQkmlg0670デフォルトの名無しさん
2015/11/04(水) 20:04:13.26ID:8eLhc3Ee今でも面倒みたい
とりあえず必要なオブジェクトは IDisposable を継承して解放させる様にするだけでだいたい解消すると思うのに、自分で解放しろとか
マジでMSの考えてることはわからん
0671デフォルトの名無しさん
2015/11/04(水) 20:07:20.36ID:oSFsMrp6出来ない事を見つけるとやりたくなる阿呆とかか?
0672デフォルトの名無しさん
2015/11/04(水) 20:15:26.95ID:oSFsMrp6正確には、単純なことしかVBAではやらないっ!
だよ(*'-')b
0673デフォルトの名無しさん
2015/11/04(水) 20:47:39.42ID:8eLhc3Ee中途半端にクラスがあるからでしょ
定期的に沸いてくる
0674デフォルトの名無しさん
2015/11/04(水) 21:00:48.88ID:oSFsMrp6クラスクラスっていうけどさ、SheetもThisWorkbookもUserFormもクラスなんだけどね。
ちなみに、亀だけどシングルトン的に使うならThisWorkbookに作るのがおススメ。
本当に1つしか作れないし、実行時にインスタンス化(笑)も実施済みだけど。
Sheetに作ればワークシート作った分だけ用意できるけど、悪いことはいわない辞めておけw
標準モジュールでも出来るけど、関数名が被らない限り他モジュールから実行しちゃうんだよねぇ
0675デフォルトの名無しさん
2015/11/04(水) 21:48:30.63ID:5MHDxyEy何言ってるんだ?
独り言ならチラ裏にでも書いとけよ
0676デフォルトの名無しさん
2015/11/04(水) 22:05:25.32ID:+mbJDLgZWorksheets(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
0677676
2015/11/04(水) 22:12:02.06ID:+mbJDLgZ>>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継承先のクラスで継承元のインスタンスを生成して、
継承先に継承元の同名のメソッドやプロパティを同じシグネチャで作成して
継承元の対応したメソッドやプロパティに引き渡す。
0679デフォルトの名無しさん
2015/11/04(水) 23:18:40.71ID:oGNSx2wdそれって複数のシングルトンクラスを設定したい場合どうするの?
0680デフォルトの名無しさん
2015/11/05(木) 00:23:27.61ID:Y8qhuNI+myRange = 〜
は
myRange.Value = 〜
の省略というだけのことなんじゃないの?
0681デフォルトの名無しさん
2015/11/05(木) 03:20:53.20ID:SGiJi440なんの為の継承なんだかわからんコンポジしか作れませんけどね。。。
0682デフォルトの名無しさん
2015/11/05(木) 03:23:59.24ID:SGiJi440ワークシートに作るとか、UserFormに作ればいいんじゃね?
ただ、VBAでそこまでやる意味は、俺にはさっぱりわからんw
0683デフォルトの名無しさん
2015/11/05(木) 06:33:22.89ID:3o5h/iDf結局のところ、インタフェースで多態性を持たせるとき同じ挙動をさせたいメソッドやプロパティのシグネチャ合わせだよ。
だからコンポジションかと言われればコンポジション以外の何物でもないけど、
多重継承やオーバーライドを考えると全く意味がない訳でもない。
0684デフォルトの名無しさん
2015/11/05(木) 07:25:10.38ID:3o5h/iDf確かに暗黙のインスタンスを使えば実装は可能だね。
有り無しで言えば意見が分かれるところだろうけど、
あくまで俺個人の意見として言わせて貰えれば、
データモデル的に考えてViewに当たるものに
その辺のロジックを組み込むのってどうなの?
と思ってしまう。
今回の話はシングルトンの話なので、
シングルトンに限ればそれでいいのかもとも思うけど、
特定のメソッドやプロパティを同じクラスから生成したとき共通で使えるように出来ることを考えると、
>>640みたいのがいいと思う。
ただ、クラスと標準モジュールの2つが必要になるし、
シングルトンと言っておいて生成が必要になるのがちょっとアレだけど。
0685デフォルトの名無しさん
2015/11/05(木) 09:48:04.61ID:L/V1S2sCつまり (ByRef a As myClass) というシグネチャーの引数にmyClassまたはその派生型以外のものを渡すと実行前に検出してくれる?
0686デフォルトの名無しさん
2015/11/05(木) 10:10:18.65ID:raJNtqbt> つまり (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/V1S2sCSub 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こう書かないと伝わらなかったか。
> 実行前に検出してくれる?
実行しないと検出はできない。
なので、コードに誤りがあるかどうかは、C0カバレッジ100%のテストが必要。
0689デフォルトの名無しさん
2015/11/05(木) 16:27:20.95ID:raJNtqbt>>687が正しい(実行しなくてもエラーを検出する)。
0690デフォルトの名無しさん
2015/11/05(木) 18:44:09.50ID:tNVJsXcL引数の型を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それだと実際に渡すまではエラー出ないの?
0692デフォルトの名無しさん
2015/11/05(木) 19:57:44.30ID:tNVJsXcL実行時エラーかコンパイルエラーかしかないだろ
実行時だってんだからそうだよ
てかこのぐらい試せよ
つかむしろ
Foo 1
がコンパイルエラーではじかれる方がびっくりしたわw
0693デフォルトの名無しさん
2015/11/05(木) 20:05:23.72ID:L/V1S2sC家帰ったら試すが、実行時エラーじゃ型を定義する意味は激減だな。
0694デフォルトの名無しさん
2015/11/05(木) 20:11:48.13ID:7jlVzvr3お前らエクセルマクロで何やらかす気やねん
0695デフォルトの名無しさん
2015/11/05(木) 21:15:17.87ID:tNVJsXcL型を定義するのにどんな意味を求めてるのか知らんが
基本VBAは型にゆるいからな
暗黙の変換と実行時バインドがある時点で、タイプセーフとか無理だし
0696デフォルトの名無しさん
2015/11/06(金) 00:39:35.16ID:sPh/1JAeAと言うユーザが作った後に、Bと言うユーザがファイルを追記で出力しようとすると書き込みエラーになります。
フォルダには両ユーザのフルコントロールの権限をつけたのに、って思ったら
作成されたCSVファイルの権限がAのフルコントロール付いてるけど、
USERSが書き込み、変更権限が付いてない!
どうすれば、Aが作ったファイルを全てのユーザが書き込み、変更できるのでしょうか?
0697デフォルトの名無しさん
2015/11/06(金) 04:24:26.81ID:hUa1dWCf0698デフォルトの名無しさん
2015/11/06(金) 13:29:13.28ID:Asg2U0oeそりゃそーだろ、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:rG1cprAF0701デフォルトの名無しさん
2015/11/07(土) 19:12:58.43ID:Lam93S6qVBAじゃないけど
B1に=IF(COUNTIF($C:$C,$A1)>0,"有り","無し")
D1に=IF(COUNTIF($A:$A,$C1)>0,"有り","無し")
これソート関係ない気が
もっとうまい方法があったら教えてくり
0702デフォルトの名無しさん
2015/11/07(土) 19:18:02.74ID:i5EknWhNifでいいんじゃない?
0703デフォルトの名無しさん
2015/11/07(土) 19:20:53.28ID:JApQLIrZ無能は黙ってろよ
>>701
即レス感謝です。
ソート関係ないですね。
0704デフォルトの名無しさん
2015/11/07(土) 19:24:07.55ID:d1VYqAJyセルに↓こんなのいれてみれば?
=IF(ISNA(VLOOKUP($A1,$C$1:$C$5,1,FALSE)),"無し","有り")
0705デフォルトの名無しさん
2015/11/07(土) 19:26:36.61ID:rG1cprAF0706デフォルトの名無しさん
2015/11/07(土) 19:38:09.84ID:ES0HeH4l意地の悪い回答ばかりだな
0707デフォルトの名無しさん
2015/11/07(土) 19:42:17.97ID:jBlHaRhLFor 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:Lam93S6qVBAで何でもできるもん派がいるのは判ってる
でもこの程度のことをVBAで数行に渡ってゴリゴリ書いてたら逆にえっ?この人…って思われちゃわない?
その辺のさじ加減が面倒臭いんだよねExcelて
0709デフォルトの名無しさん
2015/11/07(土) 19:59:42.40ID:d1VYqAJyじゃぁ、お前が書いてやればいいじゃねーか。
↓ほらよっ
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:4vxbbZbw0711デフォルトの名無しさん
2015/11/07(土) 20:15:55.24ID:d1VYqAJy随分と贅沢な奴だなお前w
身の程を知ったほうがいいのではないか?
0712デフォルトの名無しさん
2015/11/07(土) 20:20:06.00ID:KUjL8teWと思ったが>>703を見るとそうでもないのか...
0713デフォルトの名無しさん
2015/11/07(土) 20:20:13.82ID:4vxbbZbw0714デフォルトの名無しさん
2015/11/07(土) 20:27:27.40ID:CmSsAW9jヒマだから おいらも作ってみた
数式で・・・・・・・
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値を検索する際には、「ソート済み」という前提があるのとないとじゃ当然最適なアルゴリズミは違ってくるけど、
気にしないならそれはそれでいいよ。
0717デフォルトの名無しさん
2015/11/07(土) 22:54:59.05ID:KTkklJJg0718デフォルトの名無しさん
2015/11/07(土) 22:59:30.17ID:leawWRzS0719デフォルトの名無しさん
2015/11/08(日) 00:34:35.98ID:D4v6jEhQそういう人はそもそもExcelの質問スレで質問するだろ?
0720デフォルトの名無しさん
2015/11/08(日) 13:08:22.12ID:iWdr+l4lいったいどうしたらいいんですか?
(´・ω・`)
0721デフォルトの名無しさん
2015/11/08(日) 13:45:09.36ID:eycfu8TN0722デフォルトの名無しさん
2015/11/08(日) 13:46:05.72ID:eycfu8TN0723デフォルトの名無しさん
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:4syJE0gLDebug.Print AscW("↓") ・・・・・ 8595が返る
Debug.Print ChrW(8595) ・・・・・ ↓ が返る
でよくね?
文字コードは大抵16進で表されるから
Debug.Print ChrW(&H2193)
の方がいいかもね(↓は UNICODEで U+2193)
後色々な文字の文字コードを調べるなら
IME のIMEパッドの文字一覧をで調べるといいかも
0725724
2015/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スペースも矢印も普通に文字列として入力できるのに、どうしてChrW関数に置き換えるの?
Debug.Print "ERIC ↑"
でいいじゃん
文字コードを調べるにはイミディエイトウィンドウで ?ascw("↑") Enter
あと半角スペースは1バイト文字だからChrWじゃなくてChr
0727デフォルトの名無しさん
2015/11/08(日) 18:41:29.05ID:4syJE0gL前半は同意するけど
文字コードを調べる時
UNICODE文字は EXCELのセルには表示できるけど
VBEでは使えないよ
あと
半角スペースは 一般的にはChr(32) とか Chr(&H20)だけど
ChrW(32) とか ChrW(&H20)
でも出来るんだなこれがwww
0728デフォルトの名無しさん
2015/11/08(日) 21:54:59.82ID:9U70AhVJまたそれをやっている所を記録した映像などはありますか?
0729デフォルトの名無しさん
2015/11/08(日) 23:06:17.54ID:5q7P8191数字の曲芸の意味が分かりません。
ちょっとあなたがジェスチャーした記録を
映像としてUPしてもらっていいですか?
0730デフォルトの名無しさん
2015/11/08(日) 23:08:09.60ID:dtMWmvqa0731デフォルトの名無しさん
2015/11/08(日) 23:38:36.28ID:5qPDW9AB>>726
>>727
ありがとうございます。調べ方が分からなかったので助かりましたm(__)m
0732デフォルトの名無しさん
2015/11/08(日) 23:49:25.41ID:lmjHx9Sp0733デフォルトの名無しさん
2015/11/11(水) 12:08:44.79ID:e90keXjWinputboxに名前を打ち込んだ際、A列を検索して同じものがあれば隣のセルに+1
なければA列の一番下に入力
というものはどうすればできるでしょうか?
アドバイスお願いします
0734デフォルトの名無しさん
2015/11/11(水) 12:16:15.73ID:3Ok9TAga0735デフォルトの名無しさん
2015/11/11(水) 14:54:40.23ID:PdNbA/m2やりたいこと、動きそのまんまコードにすればいいよ
inputbox入力
↓
入力した値でA列 find
↓
同じのが ある→ 行番号取得、そして隣のセルに+1
ない
↓
一番下のセルを検出、そしてinputboxの値を入力
>>734
どう動いてるのか知らんけど、その都度ソースコード取得すればいいんでねーの?
0736デフォルトの名無しさん
2015/11/11(水) 16:41:59.06ID:e90keXjWありがとうございます大分まどろっこしいものになりましたができました!
0737デフォルトの名無しさん
2015/11/11(水) 21:55:44.53ID:F3jwdTUFjson解析もできるからrestでゴニョゴニョ捗る
0738デフォルトの名無しさん
2015/11/12(木) 01:38:23.90ID:5wXTJ5Xw0739デフォルトの名無しさん
2015/11/12(木) 07:25:50.18ID:uqfJS8Zf静的だとそれで取得できるのですが動的だと出来ないのです
0740デフォルトの名無しさん
2015/11/12(木) 08:46:22.76ID:LxPNMIkD動的ってどういう意味で動的?
何が変化するのだね。
0741デフォルトの名無しさん
2015/11/12(木) 10:11:39.31ID:HJaoNofA0742デフォルトの名無しさん
2015/11/12(木) 11:10:19.80ID:bUsaHM7zJavaScriptがあるやつのこと
0743デフォルトの名無しさん
2015/11/12(木) 11:51:28.03ID:LxPNMIkD?
>>737
kwsk
0744デフォルトの名無しさん
2015/11/12(木) 13:58:29.42ID:/sBFds8c小数点や0が含まれた式を計算させて、オーバーフローエラーになるとき、ON ERRORメソッドでは回避できないのでしょうか?一応条件分岐では回避できます。
また、計算部分が複数箇所あり、その度に前後に
ON ERROR RESUME NEXT
ON ERROR GOTO 0
を入れ込むのは良くないことでしょうか?
0745511
2015/11/12(木) 16:39:30.25ID:tbcgbggA計算した結果[強調]、正負関係なく桁がオーバーフロー(溢れる)時に
On ERRORでトラップ仕掛けるのは別に悪いことじゃないけど、
0やら小数点が含んでいるだけでOn ERRORでトラップ仕掛けるのは
出来るだろうけど、普通やらないよ。
入力値ならIFで分岐できるはず。
ところで、0が含まれるってなんだ?文字列なのか?
0746デフォルトの名無しさん
2015/11/12(木) 17:08:30.00ID:cjIQ5Zopサーバーとやり取り続けてるwebページだとフレーム経由でタグが更新されないから読み込みをしてもタグが見つからない
0747デフォルトの名無しさん
2015/11/12(木) 21:59:51.93ID:72+u3ZNL一つ重要な事を教えてやる
質問する人は「質問お願いします」でなく
「回答お願いします」と言え
0748デフォルトの名無しさん
2015/11/12(木) 22:03:57.33ID:jgag/eefぼくちゃん最近日本語を覚えたばかりかなー?
0749デフォルトの名無しさん
2015/11/12(木) 22:06:56.87ID:72+u3ZNL絡んでくるなウザい
0750デフォルトの名無しさん
2015/11/12(木) 22:12:42.31ID:ApRTr7Ajオススメはしないけど、ScriptControlオブジェクトでjson作って、RESTで実装されたWebサービスにPOSTしたり、同サービスからGETで取得したjsonをワークシートに展開したり。
0751デフォルトの名無しさん
2015/11/12(木) 22:19:36.54ID:jgag/eefそんなこと言わずにおべんきょしましょ、おほーほほー
0752デフォルトの名無しさん
2015/11/12(木) 22:34:51.86ID:dQRgNxQG正しすぎてワロタ
0753デフォルトの名無しさん
2015/11/13(金) 17:03:25.65ID:W62UPltEB列を特定のセルの文字列(例"Q3")で検索して一致した行のみ表示したいんですがわかりません
B列をオートフィルタするコードのCriteria1:=をRange("Q3").valueに変更してみたりしたんですがエラー出ました
よろしくお願いします
0754デフォルトの名無しさん
2015/11/13(金) 18:01:01.76ID:P+XOfJyOCriteria1:=[Q3]
でいけると思う
[]で囲むのはEvaluateとか言うメソッドの別の書き方だそうなので
詳細はEvaluateでググッてください
0755デフォルトの名無しさん
2015/11/13(金) 23:29:23.30ID:XwG+kSTVCriteria1:=Range("a1").value
Criteria1:=Range("a1")
どっちでもいける
他がまちがってるんじゃね
0756デフォルトの名無しさん
2015/11/14(土) 03:33:47.60ID:g/+4aqx+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:yb2PBsN50758デフォルトの名無しさん
2015/11/14(土) 05:45:21.60ID:Va7f2G7P> エラー出ました
相変わらずどんなエラーなのかは極秘事項なんだな
0759デフォルトの名無しさん
2015/11/14(土) 05:58:38.14ID:Hu5fAc9a配列の後ろから1つずつ、空白かどうかチェックしていく
0760デフォルトの名無しさん
2015/11/14(土) 06:28:55.30ID:ztl7HfgpA列の最終行を取得すればいいだけなのでは?
Dim LastRow as Long
LastRow=Cells(Rows.Count, "A").End(xlup).Row
0761デフォルトの名無しさん
2015/11/14(土) 09:54:29.82ID:O3XP1xgT0762デフォルトの名無しさん
2015/11/14(土) 16:35:46.84ID:3kmXR5X01プロシージャに長いコードをかいてますが。プロシージャをわけると解消できますか?
アプリを再起動しても必ず同じ所で発生しPCを再起動すると少しだけ解消されるのですが
PCを再起動しなくても解消する方法は無いのでしょうか?
0763デフォルトの名無しさん
2015/11/14(土) 18:17:24.03ID:kNDnibWgアルゴリズムを見直す
処理系を変える
0764デフォルトの名無しさん
2015/11/14(土) 19:24:10.70ID:fLmGhK2T>>761
End(xlUP)では非表示セルを越えちゃうので、先に非表示セルの行を
調べておく必要があるかもね。
その後にEnd(xlUP)してそこから下に非表示の行を走査していけば
最終行がわかるんでないかな。
で、非表示セルの扱いがどういうものなのか全然わからないけどねw
0765764
2015/11/14(土) 19:29:23.72ID:fLmGhK2TCPUがある程度速ければ、上から一行ずつ
舐めて行っても早いよ?w
0766デフォルトの名無しさん
2015/11/14(土) 19:35:25.82ID:kNDnibWgそこで最下行を調べるのが一番手数が少ない
0767デフォルトの名無しさん
2015/11/14(土) 19:45:04.54ID:5J2J2vpp0768デフォルトの名無しさん
2015/11/14(土) 19:53:23.51ID:Q4j3YvGH0769デフォルトの名無しさん
2015/11/14(土) 20:00:40.23ID:fLmGhK2Tメモリ増やせば直る時もある。
絶対に直るとは言えないけどね。
0770デフォルトの名無しさん
2015/11/14(土) 21:41:45.23ID:YdrOLc06そもそも何のリソースが不足したのかわからんのに答えようがない
同じ所で発生するのに、少しだけ解消されるとかも意味不明だし
0771デフォルトの名無しさん
2015/11/14(土) 22:16:16.74ID:ajpWryyvリソースの大きなものを開きっぱなしにしてるってことだから、Nothingで解放したりしてたらそう簡単には発生しないと思うけどね。
0772デフォルトの名無しさん
2015/11/14(土) 22:36:42.42ID:3kmXR5X0当たり前ながらそれにつきますね。
>>769
コアi7メモリー16GB積んでいるので違う問題のようです。
>>770
>>771
シートが100シートありますが60シート以上を書き換えようとし始めると発生し始めます。
50シートまではどんな無茶をしても動きます。
0773デフォルトの名無しさん
2015/11/14(土) 23:22:05.45ID:3kmXR5X0>>769
>>770
>>771
ループ構造に問題があったようで入れ子などを見直したところ100シートでも何事も無かったかのように処理し続けるようになりました。
やはり>>763が当たり前ながら最強ですね。
ありがとうございました。
0774デフォルトの名無しさん
2015/11/14(土) 23:57:17.72ID:WtyxtZW4処理を実行するようなことは出来ないでしょうか
名前を付けて保存をしようとしたときに
デフォルトのファイル名がbook1.xlsxではなくて
アクティブシート名になるようなアドインを作ってみようと思い
http://www.happy2-island.com/excelsmile/smile03/capter01006.shtml
↑まずはこちらを参考に作ろうとしたのですが、これだとアドイン自身が保存されたときしか
イベントが発生しないので、どうしたものかと
0775デフォルトの名無しさん
2015/11/15(日) 00:08:40.06ID:Qu/OYjlyOption 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+pVsh = 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+pVA1 = [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ありがとう
まさか出来るとは思いませんでした
あとはこのアドインの実用的かどうか・・・
いざ使ってみたら余計な名前がつけられて不便に感じるかも
0780デフォルトの名無しさん
2015/11/15(日) 12:41:42.46ID:DwnIBkrTこれがエラーになる原因を教えてください。
0781デフォルトの名無しさん
2015/11/15(日) 13:35:34.89ID:8F7LnjGS引数1個足りなくね?
0782デフォルトの名無しさん
2015/11/15(日) 14:03:17.85ID:U1OtMApL2.自ブックから任意のシートを新規ブックへコピーする
3.新規ブックから初期シートを削除する
4.名前を付けて保存する
というコードを書きたいです
この3で行う、「新規ブックから初期シートを削除」という処理に
汎用性を持たせるため、以下に対応する必要があると考えており
どう実現すべきか悩んでいます。よいアイディアがあったら教えてください
・初期シート枚数は設定で変えられるため、Sheet1〜3で決め打ち削除するのはNG
・コピーしたシート名が「Sheet5」等であった場合を考慮し、"Sheet" + 数字で決め打ち
削除するのはNG
0783デフォルトの名無しさん
2015/11/15(日) 14:33:00.62ID:DwnIBkrT最後の関数形式が抜けてました。
Cells(N , 1).Formula = "=binomdist(" & v & "," & N & ",P!A" & k & ",false)"
これでちゃんとできました。
0784デフォルトの名無しさん
2015/11/15(日) 14:41:29.70ID:8F7LnjGS> ・初期シート枚数は設定で変えられるため、Sheet1〜3で決め打ち削除するのはNG
VBA で一時的に変更すればいい
> ・コピーしたシート名が「Sheet5」等であった場合を考慮し、"Sheet" + 数字で決め打ち
> 削除するのはNG
CodeName で特定すればいい
0785デフォルトの名無しさん
2015/11/15(日) 14:50:35.49ID:Qu/OYjly新規ブックを作ってから コピーじゃなくて 最初からシートコピーでやる
・コピー先を指定しないと勝手にブックが作られる
・手動のシートコピーにも(新規ブック)あるよねあれをマクロの記録してみ分るから
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案-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テンプレートって知ってる?
0791デフォルトの名無しさん
2015/11/16(月) 08:44:40.22ID:DfObBX38試せばわかるんじゃない?
むしろ、何故自分で確かめないの?
0792デフォルトの名無しさん
2015/11/16(月) 08:51:06.23ID:z+/eAFMG検証のしかたに自信がないのです。
初心者じゃない人からみたら屁(へ)なのかもしれないけど。
0793デフォルトの名無しさん
2015/11/16(月) 09:14:09.40ID:DfObBX38インタープリターってキーワードで探して勉強するといいよ。
0794デフォルトの名無しさん
2015/11/16(月) 09:45:59.39ID:wa4jS3Um変数等の初期化処理はちゃんとやりましょう
0795デフォルトの名無しさん
2015/11/16(月) 10:07:55.61ID:g8+LQh40そういう残したい値はどこかのセルに格納するといいかと。
処理が終わったら保存。始まるときに読み込む。
0796デフォルトの名無しさん
2015/11/16(月) 10:25:14.27ID:UZGUWiAW0797デフォルトの名無しさん
2015/11/16(月) 10:51:28.35ID:CN0jLd+v0798デフォルトの名無しさん
2015/11/16(月) 11:23:37.90ID:8QL6McHq返事遅れて申し訳ありませんできましたありがとうございました
0799デフォルトの名無しさん
2015/11/16(月) 15:11:20.34ID:z+/eAFMGVBAを根本から理解したいだけなのです。
逆にそれをあいまいのままセルに保存して結果がOKならすべてよしの態度はそれでよく生きていけますね。
分からないことがあればそのつどクリアにして疑問を残さない。
それこそスキルの高いプログラマへの近道です。
不明なことがあれば気持ちが悪くてしかたがない。
0800デフォルトの名無しさん
2015/11/16(月) 15:18:38.31ID:nWXpmO/G0801デフォルトの名無しさん
2015/11/16(月) 15:37:56.94ID:oUXAj10Gググるという発想/テクもないのかね
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マジレスしてあげる。
「スキルの高いプログラマへの近道」とは
疑問があれば 自分が今入手できる資料から 自力で調べる癖をつける事。
(安易に人に聞くのは 「スキルの高いプログラマ」とは言わない)
そして インターネット上にある資料もまた "自分が今入手できる資料"である
http://o.8ch.net/xlv.png
0804デフォルトの名無しさん
2015/11/16(月) 16:42:31.62ID:T14TAZ6I0805デフォルトの名無しさん
2015/11/16(月) 17:07:30.17ID:tsbe4Ola0806デフォルトの名無しさん
2015/11/16(月) 17:15:38.23ID:g8+LQh40見てるのでしょうが。
0807デフォルトの名無しさん
2015/11/16(月) 17:24:11.22ID:oUXAj10G> 分からないことがあればそのつどクリアにして疑問を残さない。
> それこそスキルの高いプログラマへの近道です。
とか書かなければいいのに
プログラミングスキル磨く前に、コミュスキル磨けよ
0808デフォルトの名無しさん
2015/11/16(月) 18:23:57.38ID:dogpyWBAそもそもパブリック変数は極力使わない主義なんで知らなくても困んないな
(どんなことだって知らないより知ってるほうが良いに決まってるから、
知りたくないわけではないけれど、積極的に調べたいとは思わない)
0809デフォルトの名無しさん
2015/11/16(月) 18:35:10.51ID:CN0jLd+v0810デフォルトの名無しさん
2015/11/16(月) 19:55:02.38ID:kepj2JWF0811デフォルトの名無しさん
2015/11/16(月) 20:02:28.21ID:cus/qZQl>>799
> VBAを根本から理解したい
と言うなら、MSに入社して内部ドキュメントやソース見るしかないっしょ
0812デフォルトの名無しさん
2015/11/16(月) 20:47:56.47ID:JVdZFBYH0813デフォルトの名無しさん
2015/11/16(月) 21:06:00.95ID:DfObBX38VBAを根本から理解する必要なんてないっ!w
もともとExcelは手動で動くツールなんだから、
使えるとこだけ使えばいいだけの言語なんだよ。
>>801
お前、やさしいなw
0814デフォルトの名無しさん
2015/11/16(月) 21:11:01.89ID:nSSKBNI/コケてないかたまに見てるだけ
0815デフォルトの名無しさん
2015/11/16(月) 22:41:21.39ID:rCJBCYee標準モジュールは残ったまま。
クラスモジュールはインスタンスのスコープの通り。
フォームモジュールはNewするとクラスと同じ挙動。
暗黙のインスタンスを使うとDisposeすれば消えるかと思いきや確か残ったと思った。
俺も変数はPublicで指定しない派。極力使わないんじゃなくて絶対使わない。代わりにプロパティにして引き渡す。
カプセル化と言うこともあるけど、色んな所で外部から使われてて実際今の動きでどこで使われてるのかよく分からないとき、
ブレークポイント仕掛けることが出来るんだよね。それだけでも恩恵を受けられる。ReadOnlyにも出来るし。
0816デフォルトの名無しさん
2015/11/16(月) 23:45:32.01ID:1xD5vPnC「スキルの高いプログラムへの近道」?
無いよ。そんなもん。
分からないことがあればその都度クリアにして疑問を残さない?
当たり前だが、何故先に自分で調べない?
調べる手段が妥当なものか分からなければ、何故そこから調べない?
聞くにしても、そこからじゃないのか?
効率の為作業の手間を省くことを考えるのならまだ理解出来るが、
こんなところで端折って聞いて手間を省く人に
「スキルの高いプログラムの近道」なんてそれこそ
程遠いものなのではないのか?
0817デフォルトの名無しさん
2015/11/17(火) 02:44:16.04ID:dUScYQf80818デフォルトの名無しさん
2015/11/17(火) 03:02:23.04ID:+A3liqn5↑ ↑ ↑ ↑ ↑ ↑
0819デフォルトの名無しさん
2015/11/17(火) 07:10:39.47ID:jh7GVhAs基本ドキュメント加工のツール程度で
引数で渡すとかかったるいし
そのせいでたくさんの引数とかプロパティとか
頭悪すぎ
0820デフォルトの名無しさん
2015/11/17(火) 07:17:04.06ID:onwvO4ZW素人おつ
0821デフォルトの名無しさん
2015/11/17(火) 07:17:11.85ID:m77ny3nFもうちょっと勉強した方がいいと思うよ
0822デフォルトの名無しさん
2015/11/17(火) 07:50:59.33ID:7jPVJtKGていうか、些末なことがいちいち気になって先に進めなくなる人は
スキルの高いプログラマになれないと思う
できる人はそういうのをどんどん飛ばして進んでいく
0823デフォルトの名無しさん
2015/11/17(火) 12:26:06.50ID:2Fofbo04カウンタの i j k とか行、列の r c なんかはpublicにしてるんだけど良くないのかな?
あとシートにデータを出すプロシージャ名ってなんてつけたらいいですか
0824デフォルトの名無しさん
2015/11/17(火) 12:45:41.83ID:mHdSHoPC>あとシートにデータを出すプロシージャ名ってなんてつけたらいいですか
「シートにデータを出す」でいいやん
0825デフォルトの名無しさん
2015/11/17(火) 12:58:45.67ID:bCeQZw0e>>801 が紹介してる MSのサイト
https://support.microsoft.com/ja-jp/kb/408871
の詳細 読めば分ると思うけど
使っちゃいけないんじゃなくて
"Public変数が アプリケーション(Excel等)終了時まで有効であることを期待する"
のがいけないって事 消える場合があるから。
個人的な意見だけど
マクロ実行〜終了までの間 プロシージャ間の 値のやり取りに
引数で渡さないで Public変数を使うってのは アリだと思う。
0826デフォルトの名無しさん
2015/11/17(火) 14:11:12.19ID:bCeQZw0e>>カウンタの 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:5GItqN9R0829デフォルトの名無しさん
2015/11/17(火) 15:12:50.93ID:rqjb3MzO素人の経験しか無いけど、そんなもんじゃない?
変数重複をまとめんの、結構怖いのよ。
プロはseが変数定義までやるんでしょ?
0830デフォルトの名無しさん
2015/11/17(火) 15:39:27.79ID:5GItqN9Rもう黙っとけ。
0831デフォルトの名無しさん
2015/11/17(火) 15:43:10.70ID:rqjb3MzO文句言うだけのプロは要らないです
0832デフォルトの名無しさん
2015/11/17(火) 15:45:19.63ID:9RRwqlz10833デフォルトの名無しさん
2015/11/17(火) 15:49:36.68ID:5GItqN9Rやれやれ。
0834デフォルトの名無しさん
2015/11/17(火) 16:11:03.00ID:9V6jMaPI0835デフォルトの名無しさん
2015/11/17(火) 17:30:01.97ID:pgYKwvHCメモリ空間を数バイト節約?
0836デフォルトの名無しさん
2015/11/17(火) 17:41:46.00ID:2kaFLAzj0837デフォルトの名無しさん
2015/11/17(火) 19:39:09.29ID:zqx4r6yz0838デフォルトの名無しさん
2015/11/17(火) 20:19:37.12ID:fRH1iweoバイト数節約だろうな。
プロシージャやファンクションを呼び出す度に微量ながらメモリが解放されずに蓄積していくから、
メモリ容量がカツカツなPCで大量のデータ扱う時とか違ってきたりする。
0839デフォルトの名無しさん
2015/11/17(火) 20:28:08.93ID:fRH1iweoあと変数は大量になるならCollection型か二次元変数で運用すると楽。
0840デフォルトの名無しさん
2015/11/17(火) 21:21:46.18ID:pgYKwvHC1ギガバイトの配列を確保するプロシージャを作って実験してみたけど、ループで何回呼んでもエラーにならなかった
少なくとも変数領域は開放されてるか、足りなくなった時点でガベージコレクションなりしてるはず
0841デフォルトの名無しさん
2015/11/17(火) 21:50:16.41ID:WOkwm5aA0842デフォルトの名無しさん
2015/11/17(火) 21:56:19.42ID:bCeQZw0e>>なにが考えられますか??
色々
エラーの出たコードと
環境を晒せ O/S EXCELのバージョン(エラー出るやつ/出ないやつ両方)
上記が 極秘事項 なら ここでの回答は期待しないように
0843デフォルトの名無しさん
2015/11/17(火) 22:03:02.33ID:5Jh+kDEC0844デフォルトの名無しさん
2015/11/17(火) 23:50:13.53ID:uYtrfvr1参照設定 とか regsvr とかいつものやつだろ
0845デフォルトの名無しさん
2015/11/18(水) 00:59:15.51ID:Jz4YR4IOありがとうございます。
その場合、復旧策はどのようにされているのですか?
0846デフォルトの名無しさん
2015/11/18(水) 01:03:53.97ID:TDMaRkG60847デフォルトの名無しさん
2015/11/18(水) 01:19:47.66ID:4OAuBkhO半分正解だと思うよ。
他には例えばその変数に対して後に共通の使用制限を掛けたかったりした場合、
Publicな変数に直接値を設定している場合は全て使用箇所を洗い出して修正しなければならないけど、
プロパティならそのプロパティの中でチェックロジックを一つ書けば済んだりするからね。
>>839
それってプロパティにして引数でByRefで渡してやるのとどっちが楽なの?
0848デフォルトの名無しさん
2015/11/18(水) 01:24:48.76ID:4OAuBkhOとりあえずエラーが出てない方と出てる方の参照設定を比較して、
エラーが出てる方の参照設定にチェックボックスのチェックが外れてるのが無いか確認してみたら?
後環境が同じかどうか。
0849デフォルトの名無しさん
2015/11/18(水) 01:48:16.81ID:4OAuBkhO>>838が言ってるのは「プロシージャを呼んだとき、微量ながらメモリが解放されず蓄積される」だったんだけど、
プロシージャを抜けるか否かが書いて無かったんで、俺は勝手に、呼んだときには戻り先アドレスをスタックに保持していることを言ってて
抜けた時には解放というかスタックポインタが指すアドレスが戻り先アドレスを格納している分、
マイナスされることを言ってるのかと思ってたけど、
確かに呼んで抜けた後ではないと一言も書いてないな。
でも呼んで抜けた後のことを言ってて、メモリが解放されていないとしたらそれは普通にメモリリークだな。
ちなみにプロシージャ呼んで抜けないで、またプロシージャ呼んでメモリに何か溜まってくか確認したければ
ただ再帰するだけで抜けない処理を書けば多分それらしいエラーで落ちるんじゃないかな。
0850デフォルトの名無しさん
2015/11/18(水) 06:16:25.93ID:laMD8+R/A.method() でエラーになるのは、
Aを納めたライブラリが、環境にないとか、
参照設定していないとか
また新ライブラリでは、Aの機能が追加されていて、
旧ライブラリには、method()が存在しないとか
0851デフォルトの名無しさん
2015/11/18(水) 07:09:48.74ID:lhHws3CR0852デフォルトの名無しさん
2015/11/18(水) 08:16:54.28ID:vC96tygEプロシージャから抜ける前にローカル変数が解放されるなんてありえないから、わざわざ考える必用もない
>>383の言う「解放されずに蓄積」って、抜けた後の話をしたかったんじゃないの?
それと、再帰しまくればメモリ不足で落ちるのも当然
すべての変数をグローバルにしたところで、戻りアドレスを入れるスタックが足りなくなる
0853デフォルトの名無しさん
2015/11/18(水) 08:20:21.93ID:vC96tygESub a()
z = 1
End Sub
というプロシージャを入力したら、変数のzが勝手に大文字になったんだけど、
Zっていうメソッドかプロシージャがどこかにあるの?
0854デフォルトの名無しさん
2015/11/18(水) 09:13:28.61ID:4OAuBkhOえー?
じゃ、VBAではプロシージャ呼び出して抜けるだけで恒久的にメモリリークを起こすってこと?
流石にそれは無いと思うな
0855デフォルトの名無しさん
2015/11/18(水) 09:39:25.37ID:vC96tygEメモリリークすると主張してる(ように読み取れる)のは>>383
俺は(実用上の問題がないレベルで)メモリリークはないと信じたいけど証明する方法を思い付かない
>>840の実験では確認できなかったが、これだけでは証明したことにはならない
それと、話が前後するけど「メモリリーク」の定義はここを参考にしてる
http://kuenishi.hatenadiary.jp/entry/2013/04/23/162205
人によって微妙に解釈が違うんで、前提がブレると話がかみ合わなくなる
0856デフォルトの名無しさん
2015/11/18(水) 11:22:26.36ID:qFKoL/+T0857デフォルトの名無しさん
2015/11/18(水) 11:30:05.77ID:FZwVjyKL0858デフォルトの名無しさん
2015/11/18(水) 11:36:08.02ID:FZwVjyKL> 少なくとも変数領域は開放されてるか、足りなくなった時点でガベージコレクションなりしてるはず
VBAには参照カウンタ方式のGCしかないから、足りなくなれば即エラーでしょうね。
0859デフォルトの名無しさん
2015/11/18(水) 13:54:20.88ID:a5bQZItB画面更新をfalseにしたとき、ステータスバーも止まりますか?変数をバーに見れるようにしてるのですが、自分のは、初めは動いて途中で動かなくなります。
0860デフォルトの名無しさん
2015/11/18(水) 14:00:42.87ID:FZwVjyKLvba screenupdating statusbar
でググれ。
0861デフォルトの名無しさん
2015/11/18(水) 14:58:23.61ID:02WNUve2それ多分 VBEがお節介してるのよ
これやってみ
Dim A
と入れて 直ぐ消す a と入れる A と変換される
Dim a
と入れて 直ぐ消す A と入れる a と変換される
0862デフォルトの名無しさん
2015/11/18(水) 15:52:20.50ID:TDMaRkG6表示の前にdoeventsを入れてる?
0863デフォルトの名無しさん
2015/11/18(水) 16:00:11.39ID:vC96tygEいやそれが、Excelを再起動して、いきなり入れた変数名が大文字になるんだけど
何かの参照モジュールかなあ、よくわからん
0864デフォルトの名無しさん
2015/11/18(水) 16:06:46.67ID:FZwVjyKLVBE -> F2 -> Zで検索
0866デフォルトの名無しさん
2015/11/18(水) 20:01:10.74ID:vC96tygEそれも見たけど何も情報が得られなかった
0867デフォルトの名無しさん
2015/11/18(水) 20:01:51.29ID:vC96tygE>>383じゃなくて>>838
0868デフォルトの名無しさん
2015/11/18(水) 20:06:52.94ID:JdonKPYc何かのプロパティを見ていた時に「へぇ、Zなんだ」と思った覚えはあるんだけどなんだったか。
0869デフォルトの名無しさん
2015/11/19(木) 01:31:34.93ID:EtF1o3wQVBEのオブジェクトブラウザで ちゃんと検索した?
俺は EXCEL2013だけど
Excel.ThreeDFormatクラスに Z プロパティ あるぞ
0870デフォルトの名無しさん
2015/11/19(木) 10:22:38.65ID:hJSHK18p0871デフォルトの名無しさん
2015/11/19(木) 11:07:31.19ID:gKODW9Xiわかってないかも
上のボックスでExcelを選んで下のボックスに「Z」と入れて双眼鏡をクリックしたら、部分一致で大量に出て来て絞り込めず
「"Z"」「Zプロパティ」も試したけど検索結果がゼロ
0872869
2015/11/19(木) 12:44:57.38ID:EtF1o3wQ"上のボックスでExcelを選んで下のボックスに「Z」と入れて双眼鏡をクリック"
ここまでやっといてなぜ地道に調べようとしないの? 大量ってそんなに大量か?
ほんとに 解決したいの?
つか メンバーは 名前順に並んでるようだから Z なんて最後から見てけば一発www
0873デフォルトの名無しさん
2015/11/19(木) 14:43:04.40ID:OmqIhiXUブラウザの使い方がわかってないだけでした
ライブラリ、クラス、メンバーの順にソートされてて最後の方だけ見ればいいって今まで気付かなかった
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何がインターネットで何もヒットしませんでした、だよ。英語サイトで腐るほどサンプルあるのに
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:crZ4naS70880デフォルトの名無しさん
2015/11/20(金) 12:17:16.98ID:ncw+fVNTと書いて、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デバッガーさんは大変なんだなぁ…
0883デフォルトの名無しさん
2015/11/20(金) 15:43:30.34ID:v3U3Slwh> かぶり防止の※がドローするたびに消える(記憶しないので結局かぶる)
とか言われても、なんのことやらさっぱりわかりません。
某カードゲームなどと言葉を濁さずに、名称を明確にするか、そうしたくないのなら
目的をはっきりさせ、draw()の前提(状態)がどうなっているのかを説明してください。
0884デフォルトの名無しさん
2015/11/20(金) 15:56:55.70ID:9w4YMh2CまずE列はすべて空白
デッキ(A2~A41)からカードを1枚ランダム選んでドローする(このときドローしたカードのE列に※を入れる)
ここまでが前提
次ドローするときにE列に※のないところを探してドロー(このとき※をE列に入れる。前の※と合わせて2つ※がある)
というコードにしたいのですが1枚目のドローで付けた※が消えて2枚目のところに移る(※は1つのまま)ので
次のドローで1枚目が再び出る可能性がある(かぶる)
ということです説明下手で申し訳ありません
カードゲームは遊戯王ですね
0885デフォルトの名無しさん
2015/11/20(金) 16:15:12.98ID:v3U3Slwhなるほど、目的と手段はわかりました。
なら、こうですね。
' デッキをもとに戻すときに呼ぶ
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:EMNpTxJu0887デフォルトの名無しさん
2015/11/20(金) 16:20:05.34ID:SDujThbm0888デフォルトの名無しさん
2015/11/20(金) 16:26:37.37ID:9w4YMh2Cわかりました調べてみます
アドバイスありがとうございました
0889デフォルトの名無しさん
2015/11/20(金) 16:43:40.25ID:v3U3Slwhあ、カードのドローに関しては>>885のコードで十分なので、今「効率の良い方法」を
調べる必要はないですよ。
0890デフォルトの名無しさん
2015/11/20(金) 17:22:51.71ID:bjWlxKQH0891デフォルトの名無しさん
2015/11/20(金) 17:56:13.24ID:v3U3Slwh山札から1枚引くこと。
0892デフォルトの名無しさん
2015/11/20(金) 22:41:36.81ID:T6pTyJHcwww
スレチすまん。つぼったので
0893デフォルトの名無しさん
2015/11/21(土) 00:15:10.10ID:wd0wtgf/そういやUNOでドロー2とかあったね。
0894デフォルトの名無しさん
2015/11/22(日) 13:18:55.56ID:/KJjC5bJ1.テキストボックスは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:DI65Cz5Ffor n =1 to 29
for m = n+2 to 30
(nとmで比較の処理)
next
next
こんな感じでどうでしょう
0896デフォルトの名無しさん
2015/11/22(日) 13:47:18.97ID:DI65Cz5Ffor 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あと .Text <> "(未入力)" Then 〜 も必用かもしれない
0898デフォルトの名無しさん
2015/11/22(日) 15:15:27.32ID:2bfwfHEsDim 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:5iyagoiC0900デフォルトの名無しさん
2015/11/22(日) 16:14:04.75ID:yPUHF/WV> 簡単に扱いたい
無理です
はい、次の方どうぞ
0901デフォルトの名無しさん
2015/11/22(日) 18:06:52.35ID:mUPczM8Q0〜&hffffまでを正の整数として扱いたいってことだろか?
Long型の元格納している変数に&h8000をプラスしてDouble型に代入して&hffffでAndを取ってやれば
とりあえず&h8000〜&h7fffを&h0000〜&hffffに見立てることは出来るだろうから、
そう言う変換式を挟んでやって正の数として使ってやるんじゃダメなの?
0902デフォルトの名無しさん
2015/11/23(月) 10:20:26.98ID:hVNn8eBYdata(100,1)にデータが格納してあり、列単位でシートに貼り付けたいのですが、書き方がわかりません、、、
.Range(”A1:A101”) = data(100,0)
.Range(”D1:D101”) = data(100,1)
のように列を分けて貼り付けたいのですが、貼り付けされずにスルーされてしまいます。
原因わかりますでしょうか?
0903デフォルトの名無しさん
2015/11/23(月) 11:17:35.75ID:KcCqoYqMVBAでは配列を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この辺のしくみを竹を割ったようにサッパリと分かりやすく解説していただけないでしょうか?
0905デフォルトの名無しさん
2015/11/23(月) 12:52:14.25ID:7znI8Moxまずオブジェクトとそれ以外の区別をちゃんと理解しないとダメ
そしてデフォルトプロパティという概念を理解しないとダメ
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.Range(”A1:B101”) = data
とすれば配列全体を一度に貼り付けられるので、そのあとシート上で移動させる。
0908デフォルトの名無しさん
2015/11/23(月) 15:06:42.40ID:hVNn8eBY>>907
助かりました。配列が分割出来ないのは知りませんでした。一つ前の列の数値を利用したいので二次元と思ったのですが、一次元で作り直してみます。
0909デフォルトの名無しさん
2015/11/23(月) 17:10:55.90ID:rbzy+nqq役に立つかとうかはわからないけど、ジャグ配列というものがある。
x = Array(Array(0, 1, 2), Array(7, 8, 9))
というように、配列を要素に持つ配列だ。これだと x(0) とx(1) を個別に扱える。
0910906
2015/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
0911906
2015/11/23(月) 17:22:42.35ID:TfJpaPii"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:ubAplNXMFor文の外で切り替えたら速くならない?
1回ループする毎にTrueにしてるんだと、あんまり意味ないと思う
0914デフォルトの名無しさん
2015/11/23(月) 18:30:35.23ID:TfJpaPiiあ、早くなりました。そういうことか。
でもこれって、逆に言えば、
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:TfJpaPiiApplication.ScreenUpdating = False や
pplication.Calculation = xlCalculationManual なんかも時間がかかる処理なんでしょうか?
他に時間がかかる処理(プロパティの参照やメソッドの実行など)ってどういうものがありますか?
今後、早いコードを書くための参考にしたいのです。
0916デフォルトの名無しさん
2015/11/23(月) 18:43:27.06ID:rlgjQim1そんなダメダメ言われても困るのですが。
どういうことですか?
0917デフォルトの名無しさん
2015/11/23(月) 20:06:34.31ID:FbIB0zhM速いコードとかくだらん事考えるな
マクロになった時点でお前が手作業でシコシコシコるより数百倍以上は速いんだから
余計な事考える時間があったらその分早く動くもの完成させろ馬鹿
0918デフォルトの名無しさん
2015/11/23(月) 21:11:07.24ID:P+HbInR8http://officetanaka.net/excel/vba/speed/
0919デフォルトの名無しさん
2015/11/23(月) 21:27:15.23ID:LhpXJjp9> でもこれって、逆に言えば、
> Application.ScreenUpdating = False を実行したり、
> Application.Calculation = xlCalculationManual を実行するのに結構時間がかかるってことですよね?
なんでそんな結論になるかなあ…
> Application.ScreenUpdating = False
で画面更新したり
> Application.Calculation = xlCalculationManual
で再計算してるだけでしょ
0920デフォルトの名無しさん
2015/11/23(月) 22:25:28.69ID:TfJpaPii>なんでそんな結論になるかなあ…
画面更新停止したり
自動再計算を停止しても
画面更新停止しなくて
自動再計算を停止しないよりも遅いっていうのは、
そういうことじゃないんですかね?
0921デフォルトの名無しさん
2015/11/23(月) 22:46:54.47ID:FbIB0zhMわからんなら質問するなよ迷惑なアホだな
0922デフォルトの名無しさん
2015/11/23(月) 22:49:24.37ID:jO9cC4Sq画面更新とかイベントとかっていうのは停止中はオブジェクト単位でタスク命令が蓄積されて、有効になった途端に計算しはじめるから、
件のコードではNextの前に毎回実行されていたのが、ループ外で一回に変わって結果として処理が速くなった。
0923デフォルトの名無しさん
2015/11/23(月) 22:56:17.49ID:TfJpaPiiわからんから質問しとるんじゃ
質問に答える能力がないなら黙っとけよ
>>922
Application.ScreenUpdating = False や、
Application.Calculation = xlCalculationManual の実行自体にはそれほど時間はかからないということですか?
0924デフォルトの名無しさん
2015/11/23(月) 22:56:46.02ID:wZZgGgBT多分>>919の人は書き間違えてる。
本当は
>> Application.ScreenUpdating = True
>で画面更新したり
>> Application.Calculation = xlCalculationAutomatic
>で再計算してるだけでしょ
と書きたかったんだと思う。
つまり画面更新や再計算の停止に時間が掛かるんじゃなくて、
画面更新再開やシート再計算の時点でその処理が実行されるから
そこで時間掛かってるわけで、
それをループ内で毎回やってたら時間が掛かって当然のこと。
0925デフォルトの名無しさん
2015/11/23(月) 22:59:30.00ID:FbIB0zhM馬鹿だからって噛みつけばいいってもんじゃねーぞカス
0926デフォルトの名無しさん
2015/11/23(月) 23:20:43.71ID:adyi0o7H0927デフォルトの名無しさん
2015/11/23(月) 23:28:48.88ID:7LxGgx6+0928デフォルトの名無しさん
2015/11/23(月) 23:40:57.09ID:jO9cC4SqSub 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言語として見ると処理系の挙動が独特でそれに慣れるのが難しいとも言える
プログラム的に正しく見えても意図通り動かないこともしばしば
仕様も明確にされてないから参考書数冊程度では把握できなかったり人に聞いたほうが早かったりする
0930デフォルトの名無しさん
2015/11/24(火) 20:11:48.67ID:95n+nHLvそうですか・・
一番闇っぽい部分は何でしょうね?
0931デフォルトの名無しさん
2015/11/24(火) 20:23:49.84ID:edldGU/z0932デフォルトの名無しさん
2015/11/24(火) 21:25:08.77ID:PlNbYIXP生半可便利なVariant型
0933デフォルトの名無しさん
2015/11/24(火) 21:38:53.41ID:XArPpnwT一定回数でワークブックを開き直すみたいなアホな処理を強要される
他所様から見たらこいつメモリリークするコード書いてやがると要らぬ誤解を受けたりする
0934デフォルトの名無しさん
2015/11/24(火) 21:40:15.07ID:95n+nHLvでもVariantなくなったら困るし。だからVB.netには移行できない。
0935デフォルトの名無しさん
2015/11/24(火) 21:57:28.94ID:81SgT53K・入力値の種類
→ユーザー設定
空白を無視する→チェックオフ
ドロップダウンリストから選択する→チェックオン
元の値
すいか,ばなな,みかん,めろん,りんご
と設定したセルで
VBAから「みかん」を選択する(要はドロップダウンリストのn番目を指定する)
コードはどう書けばよろしいのでしょうか?
よろしくおねがいします。
0936デフォルトの名無しさん
2015/11/24(火) 21:59:37.42ID:0UvAxM6X0937デフォルトの名無しさん
2015/11/24(火) 22:04:51.11ID:81SgT53Kユーザー直設定です
0938デフォルトの名無しさん
2015/11/24(火) 22:45:05.46ID:XVN89A4WExcelのバージョンは?
俺2013だけど "ユーザ設定"で "元の値"つう項目ないんだけど
0939デフォルトの名無しさん
2015/11/24(火) 23:06:22.13ID:TYqNM0v/0940デフォルトの名無しさん
2015/11/24(火) 23:08:14.02ID:81SgT53Kレスどうもです
Microsoft Office Personal 2013
です
http://i.imgur.com/RQw8vnM.png
な、具合です。
あ、>>936さんもレスどうもです。
0941デフォルトの名無しさん
2015/11/24(火) 23:21:57.76ID:XVN89A4W・入力値の種類
→リスト
じゃないのよ
List = Range("a1").Validation.Formula1
Listarry = Split(List, ",")
Range("a1") = Listarry(2) 'n番目-1 を指定
0942デフォルトの名無しさん
2015/11/24(火) 23:31:10.46ID:81SgT53Kおー、すまん。
で、できた!
今年一番の感謝!!
0943デフォルトの名無しさん
2015/11/25(水) 00:42:07.43ID:k75udVUcWorksheets(Array(Worksheets.Count-1, Worksheets.Count)).Delete
0944デフォルトの名無しさん
2015/11/25(水) 11:03:02.92ID:W4Dtt94w関数maxで配列関数を使って条件付き最大値を求める方法と、
関数DMAXを使って条件付き最大値を求める方法を思い付いたのですが、両方うまくいきません。
Maxの方は配列関数のコードの書き方がさっぱりで挫折してます。
ググっても何も出てきません。
DMAX(データベース、フィールド、検索条件)の方は、
この検索条件には通常2セル以上の範囲を指定する必要がありまして、
ここに変数を入れたいのですが書き方がダメらしく動きません。
解決方法はありますでしょうか。
0945デフォルトの名無しさん
2015/11/25(水) 13:37:27.70ID:SJUIx2JEここはVBAのスレだけど
0946デフォルトの名無しさん
2015/11/25(水) 14:11:55.73ID:W4Dtt94wVBAじゃないかもしんないですね。
コードを見たことがない。
やっぱりできないのかなー。
0947デフォルトの名無しさん
2015/11/25(水) 14:32:59.09ID:Q7BYyzgj無ければ作ればいいじゃない。
https://msdn.microsoft.com/ja-jp/library/office/gg251417(v=office.15).aspx
0948デフォルトの名無しさん
2015/11/25(水) 14:36:44.96ID:6fc7ZrCM関数でやるならこっちが詳しい人いるかも。
Excel総合相談所 120 [転載禁止]©2ch.net
http://peace.2ch.net/test/read.cgi/bsoft/1445988669/
0949デフォルトの名無しさん
2015/11/25(水) 14:39:22.53ID:8iY9CP3j普通にやれば?
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:W4Dtt94whttp://www.eurus.dti.ne.jp/~yoneyama/Excel/waza/max.html
これです。
簡単で好きなんです。
0952デフォルトの名無しさん
2015/11/25(水) 15:13:01.05ID:yxQ7T38Wはるかに難しいことやってる人がけっこういるみたいなんだけど
そういうことはどこで勉強できるん?
0953デフォルトの名無しさん
2015/11/25(水) 15:36:34.17ID:Q7BYyzgjどこででもかな。多言語も全て参考になるよ。
多言語の知識がVBAに必要とは全く思わないから、
出来ないと思った時点で、頑張る必要は無い言語だとも思う。
只、考えの切り口を変えるだけで、意外とあっさり出来てしまうことがあったりするだけ。
0954デフォルトの名無しさん
2015/11/25(水) 15:41:54.87ID:8iY9CP3jそのはるかに難しいことの大部分は、書籍かMSDBかWebにある。
0955デフォルトの名無しさん
2015/11/25(水) 15:42:32.16ID:8iY9CP3j正) MSDN
0956デフォルトの名無しさん
2015/11/25(水) 16:12:46.56ID:LoKzz2Cbそんなに難しい話題あったっけ?
0957デフォルトの名無しさん
2015/11/25(水) 16:14:36.90ID:Q7BYyzgjリテラル大丈夫なんだっけ?
0958デフォルトの名無しさん
2015/11/25(水) 16:24:39.44ID:8iY9CP3j質問の意味がわからない。
0959デフォルトの名無しさん
2015/11/25(水) 19:07:12.52ID:bucl0FkBトン
できれば数は可変にしたいのですが
0960デフォルトの名無しさん
2015/11/25(水) 19:16:14.20ID:Y7LXrVImWorksheets(Worksheets.Count) で最後のシート(タブが一番右のシート)は指定できるんだから
For Nextで好きなだけループさせたら良いよ
0961デフォルトの名無しさん
2015/11/25(水) 19:35:49.61ID:bucl0FkBトン
0962デフォルトの名無しさん
2015/11/26(木) 00:37:14.71ID:lO2ICC3Cいつ開いても毎分ジャスト00秒にマクロを自動実行するコードを作りたいです
ONTIMEでやろうとしたら訳が分からなくなってしまいました
良ければコード作成お願いします
0963デフォルトの名無しさん
2015/11/26(木) 00:43:23.30ID:PaTJPcd0時間は日本標準時とパソコンの時間があってだな
0964デフォルトの名無しさん
2015/11/26(木) 02:59:35.16ID:flHxSkRK次の 00秒に実行って
Application.OnTime TimeSerial(Hour(Now()), Minute(Now()) + 1, 0), "マクロ"
で出来るぞ
毎分って指定できないから 実行されるマクロの最後で 自身を再スケジュールする
0965デフォルトの名無しさん
2015/11/26(木) 18:43:15.52ID:K+PhK5Ocが全く同じであることをチェックしたいのですが
Cells(1,1)からCells(シート名.Rows.Count, シート名.Columns.Count)まで
1セルずつForとIfでチェックしていくのは現実的でないと感じています
他のやり方があれば教えてください
0966デフォルトの名無しさん
2015/11/26(木) 19:23:57.78ID:gyWZp0Bbレスが遅くなり申し訳ありません。
時間計測までしていただきありがとうございます。
なるほど納得しました。
おまじない入れておくことにします。
0967デフォルトの名無しさん
2015/11/26(木) 19:42:18.45ID:NcY8OWJdCSVをcmdからFC
遅いけどコードは簡単
つか、Rows.Count/Columns.Countまでって、マジか?
そんな巨大データ、入力終わる前にExcelが落ちそうな気がするんだが
0968デフォルトの名無しさん
2015/11/26(木) 20:10:03.20ID:A9Opz0M4> 1セルずつForとIfでチェックしていくのは現実的でないと感じています
理由は?
普通にやるならそれが一番簡単だと思うし、配列に入れて比較すればそれほど遅くないし
0969デフォルトの名無しさん
2015/11/26(木) 20:12:12.88ID:L9oQ022USub 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レコードセット!range("a1")
といった感じで書いたんですか、とれません。
どう書けばとれるんでしょうか?
0971デフォルトの名無しさん
2015/11/26(木) 21:40:23.70ID:lO2ICC3Cありがとうございます 助かりました!
0972デフォルトの名無しさん
2015/11/26(木) 22:10:56.13ID:flHxSkRKやっぱ その書いた全文は 極秘事項で
「・・・といった感じで書いたんです」
と感じ しか教えてくれんのね
そんなんで分るかボケ
ところで ADOの使い方間違ってる
そゆう変数の使い方は出来ないよ
Range("A1") とかかないで [A1] と書くみたいな
省略した書き方は最初に覚えない方が良いとおもうぞ
0973デフォルトの名無しさん
2015/11/26(木) 22:18:45.30ID:PB3DqV4Hトン
[a1]だけで、セルのバリューでフィールドとれるんですか。
0974デフォルトの名無しさん
2015/11/26(木) 22:23:05.36ID:flHxSkRKつまり
レコードセット!フィルード
の形式を使うなって事
0975デフォルトの名無しさん
2015/11/26(木) 23:14:10.18ID:PB3DqV4Hたとえばサンプルとして以下の場合、次の部分はどう書くんですか?省略せず
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とかじゃね?
0977デフォルトの名無しさん
2015/11/27(金) 16:58:24.01ID:ueGoHWsYsheet1の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:D4cHMDIrSub 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なんぼか前の過去スレで
ビンゴゲームのプログラムというかアルゴリズムの話題が出て
そこで出てたんだけどさ
二つのセルの値を順に調べるんじゃなくて
最初に要素数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/sSh1(i)とSh2(i)が両方とも空じゃなかったら
Sh1(i)に入った行に対応したセルと
Sh2(i) に入った行に対応したセルの値がどっちも同じ(i + 1000)ってことになる
だった
0982デフォルトの名無しさん
2015/11/27(金) 20:11:45.18ID:WCZ3L9M0まこれだけでも
約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:da9bxK3g0984デフォルトの名無しさん
2015/11/27(金) 20:39:25.69ID:9HV+ag/s埋めるならまず次スレを建てよう
ということで次スレ
http://peace.2ch.net/test/read.cgi/tech/1448624205/l50
0985977
2015/11/27(金) 21:08:32.35ID:ueGoHWsY皆さんレスありがとうございました。
特に>>979さん、>>982さんのコードで以前の100分の1程度の時間で完了できるように
なり、これでやりたいことがかなり効率的にできるようになりました。
本当にありがとうございました。
0986デフォルトの名無しさん
2015/11/28(土) 04:28:56.18ID:pUzfW1Xj0987デフォルトの名無しさん
2015/11/28(土) 13:52:20.90ID:49Yj8K8D感動する。
0988デフォルトの名無しさん
2015/11/28(土) 20:36:51.89ID:7Nzrztmy0989デフォルトの名無しさん
2015/11/28(土) 22:52:24.75ID:W/xTcAqm0990デフォルトの名無しさん
2015/11/29(日) 04:07:41.64ID:go0WztlFウメモッチーノ
0991デフォルトの名無しさん
2015/11/29(日) 05:02:15.01ID:AkCGW1ae0992デフォルトの名無しさん
2015/11/29(日) 06:38:16.41ID:ofqZS0/w0993デフォルトの名無しさん
2015/11/29(日) 09:20:45.32ID:UjY32LCsいまさらながら>>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シートをソートしてから突き合わせればすぐ終わるだろ
0995デフォルトの名無しさん
2015/11/29(日) 20:34:50.04ID:/hdNGIJ10996デフォルトの名無しさん
2015/11/30(月) 04:32:25.41ID:D4iMrDsB0997デフォルトの名無しさん
2015/11/30(月) 04:33:47.91ID:TNWuC1ai0998デフォルトの名無しさん
2015/11/30(月) 07:52:45.09ID:s0H/5W+p0999デフォルトの名無しさん
2015/11/30(月) 09:02:54.56ID:BURmYQFZ1000デフォルトの名無しさん
2015/11/30(月) 09:05:39.16ID:LH7PQQfb10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
10021002
Over 1000Thread運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 2ちゃんねる専用ブラウザからの広告除去
★ 2ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
http://premium.2ch.net/
http://pink-chan-store.myshopify.com/
レス数が1000を超えています。これ以上書き込みはできません。