トップページ⇒tech
1001コメント397KB

Excel VBA 質問スレ Part35

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2014/10/25(土) 06:31:51.05ID:gTYzNJ95
ExcelのVBAに関する質問スレです

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

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

コードが嫌な人は別スレ建ててください。

※前スレ
Excel VBA 質問スレ Part34
http://peace.2ch.net/test/read.cgi/tech/1403911485/
0002デフォルトの名無しさん2014/11/01(土) 13:31:18.92ID:SV8kvD46
ウリナラヌン、チュェゴイム2ダ
0003デフォルトの名無しさん2014/11/01(土) 23:04:08.43ID:Sz14oDuq
 
★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。

★2 ExcelのVBA以外の部分に関する質問はNGです。
   但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。

★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。

 VBAとは、『Visual Basic for Applications』の略で
  Application
  ├Workbooks
  |└Workbook
  |  ├Worksheets
  |  |└Worksheet
 というApplication以下のオブジェクトを、VB言語で操作するものを指します。
 例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、
 セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。

★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。

★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み、
   コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
   ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。

★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)
0004デフォルトの名無しさん2014/11/01(土) 23:37:24.36ID:W9yPumEs
↑のような不備のあるテンプレを廃止しましたので、皆さん気軽に書き込んでください。
0005デフォルトの名無しさん2014/11/03(月) 19:42:52.80ID:WGAbt5+b
VBA初心者です。
エクセルで、たとえばA列の選択したある範囲をD列等にコピーして、元のA列には
ある乗数をかけて置き換えるには、どのようなマクロにすればよいのでしょうか。
乗数はメッセージボックスで指定できるようにしたいです。

利用環境は、Win7、Excel2007 です。
0006デフォルトの名無しさん2014/11/03(月) 19:59:33.35ID:lQ2a0K8Q
コピーは
  コピー先範囲.Value = コピー元範囲.Value

乗算置換は
  For Each セル In 乗算範囲.Cells
    セル.Value = セル.Value * 乗数
  Next

乗数入力は、MsgBoxだと選択肢が限られるので
InputBoxで入力するか、UserFormで選択させる
0007デフォルトの名無しさん2014/11/03(月) 20:13:31.34ID:WGAbt5+b
ありがとうございます。
頑張ってコードに挑戦してみます。
0008デフォルトの名無しさん2014/11/04(火) 00:16:45.36ID:Q2DIz3wG
同じく初心者です。目的もマクロの一部分として
データ使用範囲全体をコピーするということをさせたいのですが
矢印の部分が違うそうなのですがどうしたらいいでしょうか

Sub Macro1()
'
Dim oRange As Range
Dim lColumnL As Long
Dim lColumnR As Long
Dim lRowT As Long
Dim lRowB As Long


'UsedRangeでデータの範囲を自動的に求めます
Set oRange = ActiveSheet.UsedRange

'範囲から、上下の行番号と左右の列番号を求めます
':上下
lRowT = oRange.Row
lRowB = oRange.Row + oRange.Rows.Count - 1
':左右
lColumnL = oRange.Column
lColumnR = oRange.Column + oRange.Columns.Count - 1


Range(Cells(lColumnL, lRowT), Cells(lColumnR, lRowB)).Select ←

Selection.Copy

End Sub
0009デフォルトの名無しさん2014/11/04(火) 00:31:39.40ID:LHe+/5EU
ActiveSheet.UsedRange.Copy コピー先
じゃだめなん
0010デフォルトの名無しさん2014/11/04(火) 00:45:16.25ID:CQMAx+ej
>>8
Cellsの 行と列 指定が逆
Cells(行, 列)としないといけない

× Range(Cells(lColumnL, lRowT), Cells(lColumnR, lRowB)).Select
○ Range(Cells(lRowT, lColumnL), Cells(lRowB, lColumnR)).Select
0011デフォルトの名無しさん2014/11/04(火) 00:50:48.62ID:Q2DIz3wG
ありがとうございます

>>9
いいのはいいんですけど、
後々これに引き続くものでデータ範囲を変数として使うつもりなので後学のためにもと

>>10
ついA2等の関数表記の影響を受けてました。単純なことでしたね
0012デフォルトの名無しさん2014/11/05(水) 19:11:14.87ID:M8b30UGW
oは小文字なのにiは大文字なのが嫌です。そこが直れば付き合ってもいいかな、なんてね照
0013デフォルトの名無しさん2014/11/06(木) 09:08:20.19ID:0LeyiXie
大文字のアイじゃなくて小文字のエルだろ
たぶんLongの意味で使ってる
0014デフォルトの名無しさん2014/11/06(木) 11:16:31.34ID:XF7GoSal
普通はLong型(Long Integer型)に型プレフィックス付ける場合はi(アイ)だからね
その先入観で見ると、エルの小文字ではなく、アイの大文字と勘違しやすいのかも
0015デフォルトの名無しさん2014/11/06(木) 13:14:10.98ID:Y7ovwliu
>>14
>普通はLong型(Long Integer型)に型プレフィックス付ける場合はi(アイ)だからね

そんなの初めて聞いた。
おれはintとlngでやってる。
0016デフォルトの名無しさん2014/11/06(木) 13:35:28.15ID:eJWEZn4W
そもそもVBAでInteger型を使うことがほぼないからねぇ
0017デフォルトの名無しさん2014/11/06(木) 13:44:05.22ID:0LeyiXie
>>16
それはない
0018デフォルトの名無しさん2014/11/06(木) 14:05:08.09ID:eJWEZn4W
>>17
VBA以外のshort型がある言語で、たいていの人はshort型をめったに使わないと思うが、
俺もそれと同じ理由で整数型が必要な場合は、たいていの場合Longしか使わない。
0019デフォルトの名無しさん2014/11/06(木) 15:20:14.80ID:36Mfs1Eo
例えば For 〜 Next のカウンタでもLongにするってこと?
0020デフォルトの名無しさん2014/11/06(木) 15:38:30.64ID:eJWEZn4W
>>19
> 例えば For 〜 Next のカウンタでもLongにするってこと?
うん。

For Nextは、リテラル値 to リテラル値ってやることはほとんどなく、Len(string)までとか、
Ubound(array)までとか、Range.Countまでとかの場合が多いでしょ。
Len()もUbound()もRange.Countも戻り値はLongだから、ループカウンタもLongにしといたほうが気持ちいい。
そもそもCells(i, j)のi, jだってIntegerじゃ収まらないしね。
0021デフォルトの名無しさん2014/11/06(木) 16:34:25.57ID:VIOokZaI
扱える行数が増えてからは
俺もFor文のカウンタ変数はロングで統一してるな
0022■長くなるので興味が無い人は読み飛ばしてくれ2014/11/06(木) 16:54:20.74ID:XF7GoSal
>>15
その二つを変数名で区別する必要性が実は無いんだよ

Integer型とLong型の特性を見ると

・Integer型:-32768 〜 32767、メモリ消費2Byte、処理が遅い(処理単位の関係で変換が必要なため)
・Long型:-2147483648 〜 2147483647、メモリ消費2Byte、処理が速い

となるので、Integer型にはメモリ消費が少ないってメリットしか無く、しかもそのメモリ消費も、
i(1000000)とかの超多要素配列でやっと約2MBの差なので、昨今のPCでは、メモリ消費量を気にしなければ
ならない程の要素数の配列を使うのはレアケースであり、それを踏まえるとInteger型の出番は

・自分で弄れないライブラリとかの関数で、引数がInteger型の参照渡しでそれに合わせる必要がある場合
・超多要素配列

の2つだけとなり、それ以外はIntegerで足りる範囲でもLong型を使うのが正解となるが
前者は相手関数合わせが必須で選択の余地がないから、変数名でIntかLongかを把握できるようにしておくとか関係なく
後者の「超多要素配列」ってのも、変数名で区別できるようにするまでもなく明らかに把握できるものなので
そうなると整数型の16bitと32bitの区別を変数名で出来るようにしておいても煩雑になるだけで"百害有って一利無し"

今後、他の言語を使うことも考えたら、「int〜=16bit、lng〜=32bit」って区別できるようにしているなら、VB.NETでは
Dim intA As Short ' .NETでは16bit符号付整数はInteger型ではなくShort型
Dim lngA As Integer ' .NETでは32bit符号付整数はLong型ではなくInteger型
ってするのか?

それとも「int〜=VBA・VB6では16bit、VB.NETでは32bit、lng〜=VBA・VB6では32bit、VB.NETでは64bit」
なんて、ややこしいルールで区別するの?

VBAの中だけなら、「煩雑になるだけで"百害有って一利無し"」と言っても、利が無いから避けた方が良いだけで
害がそんなに大きい訳じゃないが、今後他の言語を使うようになると、その煩雑さは大きくなる
そもそも、VB.NETがIntegerやLongのサイズを、VBAやVB6に合わせなかったのも、これを変数名で区別する必要がないと
一般的に認識されているからなので、整数型は長か短かまで区別せずに、整数を意味するintかiで統一した方が良い
0023デフォルトの名無しさん2014/11/06(木) 17:27:14.13ID:CHag8G5G
>>22
型の使い分けと、変数名で型名を識別する必要性が区別できてないようですが

型のプレフィクス使いながらその型じゃない変数とか使うプログラムとか絶対メンテしたくないな
intA = lngBならオーバーフローする可能性があるなと思うわけですが
変数名が型を表さないのに型のプレフィクスつけると
intA = intBがオーバーフローしたりするわけですが

>今後、他の言語を使うことも考えたら、「int〜=16bit、lng〜=32bit」って
他の言語ならその言語によって型が定義されてるわけで、その言語の型に従うのが当然のわけですが
>「int〜=VBA・VB6では16bit、VB.NETでは32bit、lng〜=VBA・VB6では32bit、VB.NETでは64bit」
>なんて、ややこしいルールで区別するの?
それは自分ルールでもなんでもなくて言語仕様ですから
ややこしくても変数名にかかわらず、普通はちゃんと区別します
0024デフォルトの名無しさん2014/11/06(木) 17:30:49.71ID:eJWEZn4W
つか、そもそもそんなシステムハンガリアンは使うなって話なんですが。
0025デフォルトの名無しさん2014/11/06(木) 17:39:21.93ID:CHag8G5G
>>24
VBAやVB6の頃までは推奨されてたからなぁ
0026デフォルトの名無しさん2014/11/06(木) 17:50:03.96ID:eJWEZn4W
>>25
むかしむかしのお話ですね。
今システムハンガリアンについて話すことがあるとすれば、「それは使うな」しかない。
0027デフォルトの名無しさん2014/11/06(木) 17:56:11.68ID:CHag8G5G
>>26
「今の言語」(たとえばVB.Net)と開発環境ならな
VBAとかVB6とか、むかしむかしの言語で生き残ってるやつの話は微妙
0028デフォルトの名無しさん2014/11/06(木) 17:59:21.44ID:eJWEZn4W
>>27
いや、全然微妙じゃないし
0029デフォルトの名無しさん2014/11/06(木) 18:13:59.10ID:XF7GoSal
>>23
型の使い分けと、変数名で型名を識別する必要性は同一ではないが関連性があり
VBAでは、正しい型の使い分けが出来ていると、少なくとも整数型において
変数名で型名を識別する必要性が無くなるってことなんだけど、ちょっと難しいかな?

正しい型の使い分けが出来ていると、単一の変数における

整数型 = 整数型

において

Integer型 = Long型

が発生するのは、その代入されるInteger型変数が、
Integer型で渡す必要がある外部関数の引数の場合のみなわけだが、
もしこれでオーバーフローするなら、そもそもInteger型でしか引数を受けられない
その外部関数には渡せないので、Integer型とLong型を区別できるようにしておいて、
Long型からの代入だからInteger型ではなくLong型を使おうとしても、
結局Long型は使えないってことになり、識別出来るようにしていても効果を生まない

仮定での話なら、識別できないとこういう不都合があるって仮説を挙げられるが
実プログラムに置いては、その仮説の前提自体に問題があって、その仮説が成り立つ状況は
識別云々以前の部分に問題が無い限り発生しないのだよ



因みに俺は元システムハンガリアン派、現アプリケーションハンガリアン派です
ハンガリアン以外にも色々あることは知っているが、ハンガリアンからは離れられない...orz
0030デフォルトの名無しさん2014/11/06(木) 19:23:52.46ID:CHag8G5G
>>29
まあ、変数名で型を識別する必要があるのは、型を使い分けてるからであって
それを問題があるだのというなら話にならんわな

お前の主張は
型を使い分ける必要がないから変数名で区別できる必要が無い
以上のものが無いんだから
0031デフォルトの名無しさん2014/11/06(木) 20:05:02.68ID:XF7GoSal
俺はプラグマティスト(実用主義、実際主義)だからね

利点のない使い方における必要性とかは、検討するだけ無駄で
利点のある使い方においての効果を第一に考えた方が良いと思ってる

なので、利点のない使い方でも、それを実行することが不可能では無い以上
利点のない使い方における効果も重要だというなら、話にならんというか
話は合わんわな

変数名で型を区別できる必要は、型を使い分ける必要があってこそ必要になってくるもので
型を使い分ける必要が無いのに、変数名で型を区別できるようにしたところで
弊害しか生まないという「実際の実用上の現実」に沿って判断するのが俺の主義なので
0032デフォルトの名無しさん2014/11/06(木) 21:11:13.91ID:wcz8x94+
ワークブックやシートやセルとかを変数にするときは
型を区別できる接頭語をつけたくなるだろ。
0033デフォルトの名無しさん2014/11/06(木) 21:40:51.78ID:QIGtHRrB
また命名規約の話か。周期的に話題に挙がっては荒れるな。
俺も以前は色々言ってたけど、いいんじゃない?別に。
仕事でやっているならその仕事場で決められているだろうからそれに従えばいいだろうし、
解り易い名前を〜と言ったときにVBAのようなインテリセンスが陳腐な言語であればプリフィクスが付くのも道理だよね。
て言うか.Netが出てから何年経ったらVBAを.Netにしてくてるんだよ。
資源保持ってったって限度が有るだろうよ。
今VB6のソースを2012のに変える仕事してるけど、VB6が自由度高すぎてコードが何でも有りになってるから
前作ってた奴には死んで欲しいと思ってるけど、多分考え無しにタラタラ組むことが許されるのがVB6やVBAの
良いところと言う捉え方も出来るからね。
縛りになる話は.Net化したら考えようかなぁ。
0034デフォルトの名無しさん2014/11/06(木) 21:43:23.56ID:7MwqrfCh
>>33
荒らすな、死ね
0035デフォルトの名無しさん2014/11/06(木) 21:57:31.40ID:QIGtHRrB
>>34
人に死んで貰うにはまず自分が死ぬのが礼儀だろう。全く非常識な。
0036デフォルトの名無しさん2014/11/06(木) 22:03:10.17ID:Z8ZJpo3f
http://kokodane.com/kan24.htm
このような形式のよくあるリストがあって重複を削り一種、一表示にしたいんです
マクロに慣れてなくてなるべく簡潔なもので動作させたいと思ってます

条件としては、重複は削りつつも従来の順番にして二番目以降の列を消去したいのですが
上記の例でいうと

・A列に上から1.2,3・・と自然数を入れる
・電話番号でソート
・上下の隣り合う数値の同値判定で下行削除
・A列の自然数で再ソート、自然数削除

というコンセプトでいこうと思ってるのですがもっと簡易なアプローチって無いですか?
verは2000です
0037デフォルトの名無しさん2014/11/06(木) 22:06:31.10ID:Z8ZJpo3f
すみません 参照先のデータは違いますが、同一人物なら全項目が同じ内容の場合です
0038デフォルトの名無しさん2014/11/06(木) 22:26:31.95ID:asAtJKxw
>>32
オブジェクト型に限っては言えてるかも

そもそもオブジェクト型は型名が指し示す意味合いが、他の型とは一段階違う

例えば「【私】の【年齢】を示す【整数】」のように、「�@の�Aを示す�B」と見ると
整数とか文字列ってのは�Bに該当するが、オブジェクトの場合は�Bが"オブジェクト"なので
型名が�Bではなく�Aを指していることが多いからね

だから、整数や文字列では、型名から接頭語を決める場合と使途や意味合いから
接頭語を決める場合とで、接頭語は別になるけど、オブジェクトの場合は、
型名から決めても使途や意味合いから決めても、接頭語は同じになることが多いので
だったら積極的に型名に合わせた方が分かり易いって考え方もある


>>36-37
DictionaryでExistsがTrueなら削除とか、WorksheetFunction.CountIfで2以上なら削除とか

因みに、直接行を消していくなら、ループは下からStep -1で回した方がいい
0039デフォルトの名無しさん2014/11/06(木) 23:34:19.00ID:Y7ovwliu
>>36
前スレ終盤でも似たような話題があった
peace.2ch.net/test/read.cgi/tech/1403911485/977-

回答としては
peace.2ch.net/test/read.cgi/tech/1403911485/991-993
の辺りが特に役立つかもね
0040デフォルトの名無しさん2014/11/07(金) 01:11:39.47ID:urA5aAtf
Windows7 Excel2007
Sheet上で、日付、品名、売上額、品名分類、他が一行に用意されていて、一年分ずら〜っと書き込むようにしています
このSheetの右余白を使って ピボットテーブルで縦に日付(月別?)、ヨコに品名分類(6種類ほど)がまとめられています

この形式のSheetで担当者一人分なのですが、担当が年に30人ほど必要です(出入りがあるので総数だと50ほどありますが)
このSheetをコピーして増やしていきたいのですが、ピボットテーブルのデータソースがどうしても最初の一枚を引き継いで
しまいますので、コピーのたびに設定し直さなければなりません  マクロやVBAでやればボタンひとつで処理できますか?
0041デフォルトの名無しさん2014/11/07(金) 03:12:33.58ID:dhqtnvAi
できる
0042デフォルトの名無しさん2014/11/07(金) 07:20:22.27ID:vOQaMsuZ
>>31
同意。俺は別にナントカ主義じゃ無いけど、そもそも名前を役割にそって付けるのは他の言語では常識。役割が見えれば
当然型が見えてくるし、それが見えるような名前にしなくてはならない。

>>32
別に。使用するブックやシートの意味合いが混在するようなことの方が問題。それが無ければ必要ない。

>>38
そのオブジェクト型と言っているのはAs Objectで指定した型なのか、インスタンスを格納できる型全般を指しているのか
曖昧だけど、どっちにしても名前に統一性がないと駄目なんじゃないの?
0043デフォルトの名無しさん2014/11/07(金) 10:24:00.18ID:urA5aAtf
(ry)
PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
ActiveSheet.Name & "!R10C5:R10000C15", Version:= _
(ry) でなんとかできました ありがとうございました まぁ、他の壁が・・ ですけど
0044デフォルトの名無しさん2014/11/07(金) 13:02:39.82ID:8CIPGsDJ
コード書くときに
インテリなんとかという機能を使うために
参照設定をするとおもいますが

どんな場合にどんな参照設定をしないといけないかの対応表みたいなのはありますか?
0045デフォルトの名無しさん2014/11/07(金) 13:08:40.05ID:s/45pYbD
>>44
> どんな場合にどんな参照設定をしないといけないかの対応表みたいなのはありますか?
ありません。
0046デフォルトの名無しさん2014/11/07(金) 13:17:17.69ID:8CIPGsDJ
あれ。(感嘆詞ではなく「ある」の命令形)
0047デフォルトの名無しさん2014/11/07(金) 13:17:43.36ID:8CIPGsDJ
なければどなたかつくってくれませんか?
0048デフォルトの名無しさん2014/11/07(金) 13:21:39.79ID:iJ3Rtjo/
>>44
Googleって対応表が一番参考になるよ


そもそも、参照設定の対象になるActiveXコンポーネントって、
個人製作のものまで含めたら、おそらく十万や百万なんて単位でも全然足りない
(俺が作った物だけでも、公開したもので8つ、自分だけで使ってる非公開のものは通算100以上ある)

人によって、どのActiveXコンポーネントを良く使うかも違えば
パソコンによって、どのActiveXコンポーネントがインストールされてるかも違うので
必要なときに必要な物をググるのが一番手っ取り早い

そこから、自分が良く使う物の覚え書きを作ってもいいし、それ以前に頻繁に使えば覚えるだろうし
0049デフォルトの名無しさん2014/11/07(金) 14:17:57.66ID:bn4pK3Yy
プログラムとかさっぱりの素人ですがvba勉強しようと思っています
ある程度使えるようになるには1日1時間勉強したとしたらどのくらいかかりますか?
もちろん人によってそれぞれなのはわかりますが、
大雑把でかまわないので教えてください
0050デフォルトの名無しさん2014/11/07(金) 14:32:06.52ID:s/45pYbD
>>49
> もちろん人によってそれぞれなのはわかりますが、
いいや、全然わかってないね。これを読むべし。
『60%の人間はプログラミングの素質がない』
http://cpplover.blogspot.jp/2012/05/60.html

> 大雑把でかまわないので教えてください
人に聞くより、入門書を買ってまず10時間勉強してみれば、その本1冊終えるのにどれくらい
かかるか予想できるんじゃないの?
まず10時間勉強するのも面倒?
0051デフォルトの名無しさん2014/11/07(金) 14:45:51.84ID:bn4pK3Yy
>>50
わかりました
ありがとうございます
0052デフォルトの名無しさん2014/11/08(土) 02:25:59.11ID:/bwN1tJ/
>>49
仕事でVBAがなんとなく使えるようになるまで大体3ヶ月くらいとして、休みの日もあるからひと月25日とすると、
1日8時間費やしていると考えて
3*25*8で600日、土日は勉強しないと考えると大体2年くらいかな。
でも1時間では集中しきれないし、途中で忘れ易くなることも考えると3年くらいじゃない?本当に適当で大雑把に言えば。
0053デフォルトの名無しさん2014/11/08(土) 03:42:49.29ID:TaPEwTUq
1日8時間VBAやって、なんとなく使えるレベルまで3カ月もかかったら、それは相当才能がないぞ
EXCELがある程度使えるとしてVBAなら
基本的なプログラムの素養があれば3日ぐらいの講習受ければ使えるし
初心者でも1週間ぐらいの講習でそれなりに使えるだろ
0054デフォルトの名無しさん2014/11/08(土) 05:04:47.62ID:24TzniH2
「仕事で」となると想定外の操作や入力値に対する例外処理も必須だから、そう簡単には行かないでしょ


「自分が使って、とりあえず動くコード」

までなら3日〜1週間、素養が有れば1日で到達できるが

「他人が使って想定外の操作をしても問題なく動く(データが破損したり結果がおかしくなったりせず、何をしても
 実行エラーは出ずに、誤った値や操作は入力制限や操作制限で防いだりポップアップメッセージなどで知らせる)コード」

ってことになると、処理的には簡単なものでも、いろんな事態を想定して対処出来る経験なども必要なので
他言語の経験でも無い限り、素養があっても3日や1週間じゃ無理っしょ
0055デフォルトの名無しさん2014/11/08(土) 05:48:27.71ID:/bwN1tJ/
>>53
済まない。「何となく」の表現が曖昧で温度差が有ったようだ。
1週間ではプログラムの構成を覚えるのがやっとのところだと思う。
その辺りからやっとブックやシート、レンジ、セルの使い方が何となく分かってくる頃。
当然、仕事として使うにはまだまだのレベル。
1ヶ月あれば簡単なツールで動きゃいいんだよレベルのものが作れるようにはなるかも知れないが、
コードレビューでぶっ叩かれるレベルと言ったところかな。
で、当然仕事であればOracleやSQLServerからSQLで値を取得して表示したり、フォームを使ったり、
普通に仕様書に書かれていることは論理的に実現可能なことは実現しなければならないので、
その調査や作成、掛かる時間をなんとなく割り出せるくらいになるまで3ヶ月くらい掛かるんじゃないかと。
もう少し上のレベルになれば基底部分のクラス化や、有る程度のツールのスケルトンを作成するようになってくるけど、
そこに至るまでは半年くらい掛かるんじゃないかと思う。
だから最初に書いたように、「仕事」でなんとなく使える様になるまでがこのくらいの期間じゃないかな。

まぁ、「俺はそんなの1週間で出来るようになったし、周りの連中もそうだぞ(ドヤァ」と言うのであれば、
俺や俺の周りの連中がプログラマーとしての素養が無いんだろうよ。
0056デフォルトの名無しさん2014/11/08(土) 08:24:52.54ID:I+ma7ZL8
毎日1時間の勉強で

簡単な練習問題が解ける → 1〜2週間
自分で使うだけのマクロ → 1〜2ヶ月
入力フォームなどがあって他人も使う → 数年
0057デフォルトの名無しさん2014/11/08(土) 13:10:36.61ID:19yT2fPY
全くのゼロから始める人と何かしら他の言語を齧った事のある人とでは
スタートラインが違うからなぁ。
そこがはっきりしないと議論にならないというか、少なくとも俺には判断出来ないよ。
0058デフォルトの名無しさん2014/11/08(土) 17:26:29.18ID:0hkqiyvl
>>49は
>プログラムとかさっぱりの素人
って書いてるやん
0059デフォルトの名無しさん2014/11/08(土) 19:07:28.68ID:TaPEwTUq
お前らの「仕事」に対するとらえ方って、プログラム作る「仕事」なのかよ
システム開発と言える程度の規模で、
コードレビューで叩かれないレベルのプログラム半年でかけたら期待の新人あらわる、ってなるわw
0060デフォルトの名無しさん2014/11/08(土) 19:58:21.71ID:/bwN1tJ/
>>59
まぁExcelでVBAだから。
その範囲で何をもってシステム開発と言える規模になるのか、
ツール開発程度となるのか、明示して貰わないことには何とも言えない。
0061デフォルトの名無しさん2014/11/08(土) 21:02:13.73ID:TaPEwTUq
>>60
>まぁExcelでVBAだから。
だから、何?
だから、せいぜい自分で使うツール開発程度の話でしょ、ってなるなら解るが
どうも>>55の主張はそうじゃなさそうだしな

システム開発規模って言い方が悪かったなら
プロのプログラマーとしてちゃんとしたものが出来るようになるまでは半年はかかるんじゃね
って言いなおしても良いよ
お前の主張とそう大差ないと思うけど
0062デフォルトの名無しさん2014/11/08(土) 21:55:45.59ID:/bwN1tJ/
>>61
言い方がいいか悪いかじゃなくて、
システムの開発規模がどうと言う話とプロのプログラマーの話って全くカテゴリの違う話が同列に並べられているのか理解に苦しむな。
3ヶ月掛かるなら素養がないと言って来たのもそっちだし、システム開発規模なら半年で期待の新人現ると言ったのもそっち。
だったら最初は何を指してそう言ったのか、システムの開発規模って、システムと呼ばれるもの以外との
境界線を明示してくれって言ってるだけでしょ?
プロのプログラマーがちゃんとしたものと言うけど、
それは何を組む上でのプログラマーなのさ?システム?ツール?で、その規模の境界線は?
それによって全然話が違ってくると言っているんだよ。
そこまで言うならそちらの言うシステムの規模ってどこからなのかと、
それをシステムって呼ぶ根拠を明示して欲しいな。そちらが持ってきた話なんだから。
0063デフォルトの名無しさん2014/11/08(土) 22:03:57.70ID:I+ma7ZL8
CPUが遅くてメモリも少なかった時代はアルゴリズムを駆使して知恵で乗り切ったけど、
今は素人が適当に作ったプログラムでも実用上問題ない程度の結果が出せちゃうからなあ
0064デフォルトの名無しさん2014/11/08(土) 22:27:08.48ID:TaPEwTUq
>>62
>だったら最初は何を指してそう言ったのか
事務員が自分の「仕事」で使うちょっとしたツールを、なんとなく動くレベルで作るのに、だよ
0065デフォルトの名無しさん2014/11/08(土) 22:28:11.67ID:/bwN1tJ/
>>64
後の方は?
0066デフォルトの名無しさん2014/11/08(土) 22:35:00.69ID:TaPEwTUq
>>65
プロのプログラマが「仕事」で作るプログラム

もうこれでこの話題終了でいいだろ
0067デフォルトの名無しさん2014/11/08(土) 22:36:11.75ID:/bwN1tJ/
>>66
なんで?
それと回答になってない。
0068デフォルトの名無しさん2014/11/08(土) 22:42:59.60ID:TaPEwTUq
なんでこんなに絡まれてるかわからんが

プログラムだけに1日8時間没頭できるとして

事務員が自分の「仕事」で使うちょっとしたツールを、なんとなく動くレベルで作るのに
3カ月かかるようなら、プログラミングの才能が無い

プロのプログラマとして一人前の仕事ができるようになるまで
6か月しかかからなかったら優秀

俺の主張は以上
もうこれ以上この件ではレスしない
0069デフォルトの名無しさん2014/11/08(土) 22:48:45.18ID:I+ma7ZL8
素人が自分で使うマクロなら目の前にある限定されたデータだけ処理できればいい

プロなら想定外のデータが入力された時のことも考える
どれぐらい多様なエラーに対応できるかで能力の差が出る

OSなんかのセキュリティホールって、ようするに想定外の部分を突いてくることが多いんで
そういうのをいかに潰していくか、かつ処理が重くならないようにするかが腕の見せ所でもある
0070デフォルトの名無しさん2014/11/08(土) 22:53:30.62ID:/bwN1tJ/
>>68
最初に絡んできたのはそっち。
ついでを言うと学生さん?
仕事をしていれば仕様や会話に不明瞭な部分があったり、矛盾点があれば突っ込まれるのは当たり前のこと。
そうなれば説明責任が出てくるからキチンと説明しなければいけなくなる。
良かったね、2ちゃんでw
>>68みたいなこと、普通職場やお客さんのところで言えば誰からも相手にされなくなるよ。
0071デフォルトの名無しさん2014/11/08(土) 23:02:02.42ID:qbv6PHnD
何の事務員か知らんけど業務中に8時間もコード書いて遊んでるという想定が無理
現実感がまるで無い
0072デフォルトの名無しさん2014/11/08(土) 23:16:09.28ID:TaPEwTUq
どうも俺の説明能力が足りないために理解いただけない人がいるようで
お詫び申し上げておきますわ
よかったわ。2ちゃんで

>>71
1日1時間の人と1日8時間の人で、同じ日数で比べろと?

ほんとに最後のレスにする気なんだが、煽り耐性低いな俺w
0073デフォルトの名無しさん2014/11/08(土) 23:18:17.28ID:/bwN1tJ/
>>72
うん。黙ってた方がいいと思うよ。
説明能力じゃなくて考えが足りな過ぎ。
0074デフォルトの名無しさん2014/11/08(土) 23:25:52.93ID:TaPEwTUq
>>73
後学のためため>>68の主張の、どこが考えが足りないかお教え願えますが
0075デフォルトの名無しさん2014/11/08(土) 23:28:16.60ID:/bwN1tJ/
結局>>62の回答が出来ていないあたり。
0076デフォルトの名無しさん2014/11/08(土) 23:29:32.56ID:TaPEwTUq
>>74
では、>>68の主張に対する意見は無いという事でよろしいので?
0077デフォルトの名無しさん2014/11/08(土) 23:31:41.15ID:TaPEwTUq
レス番間違ったわ
>>75
では、>>68の主張に対する意見は無いという事でよろしいので?
0078デフォルトの名無しさん2014/11/08(土) 23:32:48.61ID:/bwN1tJ/
>>76
何で?
全部繋がってる話だよ。
何を主張するのも勝手だけど、根拠に欠けているって自分で思わない?
0079デフォルトの名無しさん2014/11/08(土) 23:38:28.98ID:TaPEwTUq
>>78
>>68は、技能習得にかかる時間にたいする私の主観です
根拠を求められても提示できません
>>52の3カ月も主観であり根拠は無いと思われます
今回の論点は主観の相違であり、その点で>>68と意見の相違があるならお聞かせ下さい
0080デフォルトの名無しさん2014/11/08(土) 23:49:52.29ID:cSCqZz6k
せんせー 
じぶんで >>良かったね、2ちゃんでw  て書いてるくせに、世間を例えにするのはあたまがおかしいひとだと思います
書いてることと考えてることが乖離しているひとだと思います けいすけくんはばかだと思います ひまわり学ky(ry
0081デフォルトの名無しさん2014/11/08(土) 23:51:24.07ID:/bwN1tJ/
>>79
3ヶ月?うん。今まで人に教えてきた俺の経験からの主観。だけど経験から言ってるから別に思いつきって訳ではないよ。
それと言ったでしょ、全部繋がっているって。
結局そっちが提示したシステムの規模の話ってその境界線の線引きと根拠って、
考えが有って話しているなら何で答えられないのさ?
否定するなら、今度は否定するなりの根拠を挙げてみなよ。
0082デフォルトの名無しさん2014/11/09(日) 00:21:14.32ID:n1bZkGQ9
>>81
システム開発うんぬんにかんしては、>>61で撤回したものとご理解いただければ幸いです
したがってその境界とは
事務員が自分の「仕事」で使うちょっとしたツールを、なんとなく動くレベルで作るの
と
プロのプログラマとして一人前の仕事ができるようになるまで
の間と言う事になるかと思います
すみませんが私の説明能力ではこの差を簡潔に説明する事は不可能のようです

私の主観ではこれらには大きな差があると思うのですが
これらに差がないので>>68の主張は理解できないと言う事でしょうか?

つか連続投稿ってなんだよ書き込めねー
疲れたホントにこれで最後にするわ
0083デフォルトの名無しさん2014/11/09(日) 00:40:17.44ID:99/SwKWp
>>82
撤回の意味が分からない。何を撤回したのかな?
プロのプログラマーとして一人前の仕事ができるようになるまでと言う話はそんなに何回も言わなくても理解している。
で、結局>>62で言ってることは理解してくれているのかな?
理解していればこちらがそれを理解した上で話していることも理解できるよね。
その上での回答を求めているんだけど、何で話を堂々巡りにさせようとしているのかな?
0084デフォルトの名無しさん2014/11/09(日) 01:05:23.28ID:A9KOM1Yd
こういう流れは、何気なく書いたであろう49の人がかわいそう。
0085デフォルトの名無しさん2014/11/09(日) 01:23:13.97ID:XD0yYqPY
よくあること
0086デフォルトの名無しさん2014/11/09(日) 07:21:04.45ID:lclUDDtt
連投してるうぜえ二人はよそでやれ。ここには二度と来るな。
0087デフォルトの名無しさん2014/11/09(日) 14:26:55.05ID:qMMOH0c1
どっちも自分のちんけな経験とか想像で言い争ってるだけ
0088デフォルトの名無しさん2014/11/09(日) 18:53:10.40ID:1dzCgWwj
そういうのは基地外どもが暴れまわってる時に言ってくれないと
0089デフォルトの名無しさん2014/11/10(月) 00:02:39.48ID:7hilT9ku
VBA初心者ですが
VBAの稼働中にControlオルトブレイクで停止させられますが、その場合処理は完全停止してしまいますが。
1時停止させ完全な計算途中の続きから再開させる事はできないのでしょうか?
0090デフォルトの名無しさん2014/11/10(月) 00:06:59.19ID:aSG9FVaj
>>89
Ctrl+Break
0091デフォルトの名無しさん2014/11/10(月) 00:14:39.77ID:7hilT9ku
>>90
そもそもオルトは不用で ボタンの継続を押せば良かったのですね。ありがとうございます。無意識にEnterを押していました。
0092デフォルトの名無しさん2014/11/10(月) 00:34:22.95ID:aSG9FVaj
>>91
Ctrl+Breakのあと、デバッグボタンを押すと中断した時点での変数の内容とか確認できる
再開はF5
0093デフォルトの名無しさん2014/11/10(月) 00:45:39.81ID:7hilT9ku
>>92
ありがとうございます。画面が超高速でちらちら点滅して焦ってしまいましたが冷静にボタンに書かれてある文字を読めば何てことは無い話でした。
0094882014/11/10(月) 01:00:43.51ID:7hilT9ku
8000セルぐらいある表データのブック間のコピペを含むまとめ集計作業なのですがi3のノートで動かすと一向に終わる気配が無かったので
i7の高速なマシンで動かしてみましたが、見たところ速さはほとんど変わらないようですが。これはもっと高速に動かすことはできないのでしょうか?
Excelは2007ですがバージョンが高いと変わりますでしょうか?
0095デフォルトの名無しさん2014/11/10(月) 01:10:36.53ID:aSG9FVaj
>>94
たった8000個の処理で時間がかかるのは、やり方が悪いとしか
まずは
Application.ScreenUpdating = False
Application.Calculation = xlManual
あたりを試す

あと、お前は88じゃなくて89だろ
0096892014/11/10(月) 01:16:13.31ID:7hilT9ku
>>95
>たった8000個の処理で時間がかかるのは、やり方が悪いとしか
まずは
Application.ScreenUpdating = False
Application.Calc
なるほど試して見ます。

>お前は88じゃなくて89だろ
その通りです。失礼しました。。
0097デフォルトの名無しさん2014/11/10(月) 01:31:50.06ID:3AABUWOY
i7使おうと1コアしか使えないからそう変わらないよ
0098デフォルトの名無しさん2014/11/10(月) 01:40:00.66ID:E0mAzh+R
vb.netで書けば処理速いんじゃないのか?
0099デフォルトの名無しさん2014/11/10(月) 01:50:09.23ID:z7aClQLS
>>94
>VBA初心者ですが
との事なので

まずこれかな?
・セルへアクセスする毎に "Select","Activate"してるなら
 使わないようにする


あと
・一括で配列へ入れて 配列内で処理して結果のみをシートに書き込む
0100デフォルトの名無しさん2014/11/10(月) 20:48:48.83ID:TYJYPyhC
>>98
VB.Netではマルチスレッドが使えるから、並列処理で作りようによっては早くなるけど、Excelでも頑張れば出来るかも。
別のExcelアプリを立ち上げて、そっちにもやらせるとか。アドインファイルとかにして。
0101デフォルトの名無しさん2014/11/11(火) 05:25:41.03ID:Ti7qRGC+
Excelに限らず別のアプリを使う方法は、同期を取れないので弊害が大きい
同期を取ろうとすると、呼び出し元側は呼び出し先が終るのを待ってることになるから
スレッドというかプロセスがマルチになっても、実質稼働するのは1つだけか、同期不要な処理にしか使えないかになる

そしてアドインは同じスレッドで実行されるので、これもまた意味がない

VBAで処理の一部をマルチスレッド化したければ
外部に渡した上で、その外部が自身だけでマルチスレッドを実現できる必要がある
0102デフォルトの名無しさん2014/11/11(火) 07:29:05.04ID:mGY8vM+z
>>101
ありゃあ、マルチスレッドの存在意義を全否定しちゃってるね。
そりゃ、別スレッドなんだから非同期は当たり前だよね。
だから同期しなくてもいい所で使うんじゃない。別のシートにそれぞれ全く関係ない表を作るときとか。
それに同期を取るとしたって、それぞれが別のスレッドで処理されている訳だからその分速くなると思うけど。
アドインに関しては確かにそうだけど、アドインにしといて外から処理するExcelのアプリを非表示にしておけば
シートを持たない表示されない状態を作れるから全く使い道がない訳じゃ無いよね。
.Netだって同じフォームを別スレッドで操作するときは
色々有ってデリゲート用意したりするようなお作法が必要になるけど、でもみんな使うよ。
弊害って言うけど、どうしたらどのような弊害が起こるか知っていれば弊害が起きないように作っておけばいいんじゃないの?
0103デフォルトの名無しさん2014/11/11(火) 10:22:25.51ID:+yypG039
ありゃあって癇に障る言い方だな
0104デフォルトの名無しさん2014/11/11(火) 10:32:05.15ID:+FZC/J3X
>>102
その通りだと思うわ。
0105デフォルトの名無しさん2014/11/11(火) 10:53:33.84ID:A6oJ5TwJ
>>101
> VBAで処理の一部をマルチスレッド化したければ
> 外部に渡した上で、その外部が自身だけでマルチスレッドを実現できる必要がある
Excelで普通に使える手段としては、アウトプロセスCOMを使えば、簡単に非同期化できて同期も取れる。
もちろん、COM動作中もExcelも動作できる。
0106デフォルトの名無しさん2014/11/11(火) 11:09:38.02ID:85Ngfvs9
かんにさわるw
0107デフォルトの名無しさん2014/11/11(火) 14:26:41.75ID:VkoiWuJy
>>100-102
それを、ここに聞きに来るVBA初心者が実装できるとでも思ってるの?
0108デフォルトの名無しさん2014/11/11(火) 14:52:58.59ID:mGY8vM+z
>>107
俺、初心者だけど頑張るよ。
0109デフォルトの名無しさん2014/11/11(火) 14:56:58.94ID:A6oJ5TwJ
>>107
なるほど、始まりは>>94か。
sheet.activateとかrange.select -> selection.copyとかが大量に入ってて遅いのかな。
0110デフォルトの名無しさん2014/11/11(火) 20:26:09.76ID:NFiDAzsl
ユーザフォームをさわったとき(Activateしたとき)に実行させたいコードがあるのですが
このユーザフォームというやつはさわってもActivateと認定してくれないことがよくあって困ります。

よくある症状だと思うのですが、みなさんどうやって対応していますか?
ふつうに下記のイベントプロシージャを使っているのですが

Private Sub UserForm_Activate()
(コード)
End Sub
0111デフォルトの名無しさん2014/11/11(火) 20:45:17.95ID:VkoiWuJy
>>110
たしかに実行されるべきActivateが実行されない事も無いわけではないが
普通ちょくちょく起こるようなもんじゃないと思うけど

おそらくActivateの発生条件を勘違いしてるだけだと思う

Activateを発生させる要因となるコードの直前にDoEventsいれると直るかもね
0112デフォルトの名無しさん2014/11/11(火) 21:43:21.94ID:NFiDAzsl
>>111
どういうことでしょうか?
Activateを発生させたいのはユーザがフォームをマウスクリックでさわって画面の前面にきたときのみなのですが。
要因はそれ以外は考えていません
0113デフォルトの名無しさん2014/11/11(火) 22:20:56.23ID:mGY8vM+z
これはどう言うことなのか俺も知りたい。
Do EventsはWindows側に一度処理を明け渡すことによって、
それまでの画面更新を表示させるようにしたりするけど、
一連の処理が行われている最中でない場合、何かもたらされる効果があるのだろうか。
0114デフォルトの名無しさん2014/11/11(火) 22:28:13.88ID:NFiDAzsl
>>111
黙ってしまってるけど、どうでしょう?
やっぱりフォームをさわってActivateしてもAvtivateのイベントプロシージャが動かないでしょ?
0115デフォルトの名無しさん2014/11/11(火) 22:42:01.18ID:NFiDAzsl
ついでに
(1) Do Events
(2) Sleep関数 (WinAPIのやつ?)
(3) その他なんかあったっけ?
の違いが分かるオトコになりたいのですが、違いはなんですか?
0116デフォルトの名無しさん2014/11/11(火) 23:17:44.63ID:85Ngfvs9
>>110
イベントで呼んだコードがうまく動かなくてマクロを途中で止めた場合、
enableeventsがfalseになってることがあるけど、違う?
0117デフォルトの名無しさん2014/11/11(火) 23:25:24.67ID:NFiDAzsl
>>116
違う。
イミディエイトウインドウで
? Application.Enableevents
と試したらTrueだった
0118デフォルトの名無しさん2014/11/11(火) 23:46:46.57ID:85Ngfvs9
これは?
http://msdn.microsoft.com/en-us/library/office/gg264186(v=office.15).aspx
The Activate and Deactivate events occur only when you move the?focus within an application. Moving the focus to or from an object in another application doesn't trigger either event.
0119デフォルトの名無しさん2014/11/12(水) 01:07:39.74ID:pRoCUi6H
これもか
Form.Activate イベント (Access):
http://msdn.microsoft.com/ja-jp/library/office/ff845446(v=office.15).aspx
0120デフォルトの名無しさん2014/11/12(水) 01:08:34.88ID:pRoCUi6H
ていうか>>114の言いぐさなんなん
0121デフォルトの名無しさん2014/11/12(水) 04:07:20.88ID:44wGY+45
>>112,114
どっから画面の前面になったのかによるけど
フォームをクリックしたからって必ずしもActivateされるわけじゃないぞ
0122デフォルトの名無しさん2014/11/12(水) 04:15:09.34ID:44wGY+45
>>113
UserForm1
Private Sub UserForm_Activate()
MsgBox "1"
End Sub

UserForm2
Private Sub UserForm_Activate()
MsgBox "2"
End Sub

ThisWorkbook
ub test()
UserForm1.Show vbModeless
DoEvents
UserForm2.Show vbModeless
End Sub

これでDoEventsの有りなしで俺の環境では動作が変わる
全ての環境でそうなるわけではないかもしれんが
DoEventsなしでは"2"のMsgBoxは表示されない
"1"のMsgBoxの前にForm2の表示が割り込むからだと思うが
0123デフォルトの名無しさん2014/11/12(水) 04:23:58.14ID:44wGY+45
ああ、なんかSub test()のSが抜け落ちてる

>>115
前もどっかで同じ質問みたことあるけど
どういう考え方をしたらDoEventsとSleepが同じ所があるように思うんだろ
むしろ同じと思うところを言ってみてくれ
そしたら違いを説明できるかもしれん
0124デフォルトの名無しさん2014/11/12(水) 05:28:22.03ID:RC0oVKa+
>>122
一連の処理が行われている最中やん。
>>112でマウスでクリックして全面に来たときって言ってるんだからそれとは状況が違うよ。
0125デフォルトの名無しさん2014/11/12(水) 17:02:39.01ID:yIWk1BZL
フォームとワークシートを切り替えしたときに
イベントプロシージャを実行させることって
できないんでしょうか?
0126デフォルトの名無しさん2014/11/12(水) 18:28:07.29ID:44wGY+45
>>124
>>122は、Activate実行されない状況と、それがDoEventsで直る例を示しただけ
マウスクリックで前面にってのは、それがActivateを発生させると勘違いしてると思ってる
0127デフォルトの名無しさん2014/11/12(水) 18:43:26.08ID:44wGY+45
>>125
フォームとワークシートの切り替えをVBAだけで検知するのは無理じゃないかな
切り替えただけでは何も起こってないと考えて
その次の操作をとらえる方向で考えるしかないんじゃない
0128デフォルトの名無しさん2014/11/12(水) 18:47:17.73ID:yIWk1BZL
>>127
ではどうすれば解決するでしょうか?
0129デフォルトの名無しさん2014/11/13(木) 00:04:38.73ID:MT+2Jvvy
もう少し具体的に内容を言わないと解決策を提案できないよ
0130デフォルトの名無しさん2014/11/13(木) 05:16:02.87ID:IgNFF7zY
>>128
>>127の下2行は無視か?
0131デフォルトの名無しさん2014/11/13(木) 08:08:11.50ID:9b2ERrU2
>>130
「その次の操作をとらえる方向」とはどういう意味でしょうか?
言葉の意味がさっぱり分からないのですが。
0132デフォルトの名無しさん2014/11/13(木) 16:22:16.67ID:HT9JpLL8
フォームとワークシートを切り替えしたあとの操作の
イベントプロシージャで
0133デフォルトの名無しさん2014/11/13(木) 18:55:35.02ID:9b2ERrU2
>>132
ではどうしますか?
0134デフォルトの名無しさん2014/11/13(木) 22:24:06.17ID:UcTK4OI+
>>133
そのイベントプロシージャで
0135デフォルトの名無しさん2014/11/13(木) 23:28:42.48ID:Zqa4UpvX
VBAについて、俺より詳しい人が居るスレって無いのかな?
0136デフォルトの名無しさん2014/11/14(金) 00:13:05.74ID:Idg0Wndh
ユーザーフォームやVBAで作り込んだファイルの正式名称はなんと呼びますか? Excelアプリ?
渡した相手先ではセキュリティのメッセージに「コンテンツの有効化」のような呼称が付きますから、Excelコンテンツ?
0137デフォルトの名無しさん2014/11/14(金) 00:30:39.59ID:2IEK62nJ
ウイルス…かな
0138デフォルトの名無しさん2014/11/14(金) 00:33:49.21ID:M8CPNhFZ
>>136
おそらく区別して呼びたいであろう>>136には不満かも知れないが、
正式には「Excelブック」あるいは「Excelワークブック」だよ
(一部で勝手に呼び名を付けている場合もあるが)

マクロを組み込もうと、ユーザーフォームを作り込もうと、
それは作り手から見て「アプリ的な開発が出来る」だけであって、
元々ブックに備わった機能を使うか使わないかの差でしか無い

故にブック本来の機能を何処まで駆使しても、ブック以外のなにものでもない

数式すら使わず、単なる住所録を作っても、ExcelブックはExcelブック
配列数式やピボットテーブルなどの機能を駆使しても、ExcelブックはExcelブック
VBAやユーザーフォームを駆使しても、ExcelブックはExcelブック

因みに、Excelアプリって言うとExcelの本体、EXCEL.exeや
VBAでのExcel.Applicationのことになるし、Excelコンテンツって言うと、
数式などもコンテンツのうちに入る


とマジレスしてみる
0139デフォルトの名無しさん2014/11/14(金) 00:45:21.87ID:dNg3ZgCn
>>136
マクロとかフォームはエクスポート出来るんじゃなかったっけ。
その拡張子の名称がソレなんじゃね。
0140デフォルトの名無しさん2014/11/14(金) 01:27:53.90ID:IOJc8l9f
最近のExcelならマクロ有効ブックとか言う区分もあるが
0141デフォルトの名無しさん2014/11/14(金) 02:00:14.78ID:FMoQUF/X
マクロ付きブック?
0142デフォルトの名無しさん2014/11/14(金) 05:13:04.48ID:PebWXCKg
プロパティ見るとファイルの種類に「マクロ有効ワークシート」って書いてあるけど
0143デフォルトの名無しさん2014/11/14(金) 05:28:45.41ID:enGQPIOe
>>136
正式名称と言えば皆が言ってる通りになる。
そしてそれを何か定義付けて呼ぶ場合は仕事場の環境によってまちまち。
アプリと呼ぶところもあればシステムと呼ぶところもあるし、ツールと呼ぶところもある。
ただ、上で言ってる人もいるけど、Excel自体がアプリと呼ばれるから
自分が作ったものもそう呼ぶと意味が混同しそうになる。
けして間違いでは無いんだけどね。
0144デフォルトの名無しさん2014/11/15(土) 00:49:46.26ID:rCnTZWHP
ウチは「(作業名)のマクロ」って呼んでる
0145デフォルトの名無しさん2014/11/15(土) 08:08:34.96ID:V1p3lLBN
これまた厳密に言うならマクロと呼べるか微妙。
一般的にもmsdnでもマクロと呼んでいるものの、マクロと言えばExcel4.0までのものなんじゃないかと。
つまりVBAは言語であって厳密にはマクロとは言えないかも知れない。

詳しくはこの辺で。
http://officetanaka.net/excel/vba/beginner/01.htm
0146デフォルトの名無しさん2014/11/15(土) 13:05:58.46ID:+moW/MyH
>>144
だねー
ブック名(=ツール名)が周知されるまではそう
01471362014/11/15(土) 13:26:11.27ID:fgZJ2TH/
みなさんありがとうございます  ま、この世界、定義とか名称とかコロコロ変遷するのは承知してるんですけど、
「正式名称」って、つい、夜中でボーっとしてたんで違和感ありつつ書き込んじゃったんで、誤解の元にしちゃったのは反省してます

いちばんかっこいい呼び名 って書けば良かったですかね  >>135 さんに名付けてもらいたかったんだけど
それとかいちばんクール いちばんインテリジェンスを感じさせる いちばん最先端な・・ みたいな
>>137 が個人的には爆笑でしたけど、さすがに相手先に「○△□ウィルス」です って渡せませんのでサブタイトルぐらいでw

仕事場の環境で ってのには納得ですね どちらもそうなんですかね
0148デフォルトの名無しさん2014/11/15(土) 15:16:28.76ID:8Ioaetpv
かっこいいとかクールとか、そんな主観を求められてもなあ
0149デフォルトの名無しさん2014/11/15(土) 18:18:08.57ID:V1p3lLBN
某昔のゲームみたいに、ツール名の頭に「超スーパーウルトラ」とか付けとけばいいよ
0150デフォルトの名無しさん2014/11/17(月) 15:29:54.73ID:CaX8N17h
実用性のあるマクロを組めるようになる為に向いてる書籍って何かある?
プログラム自体は初心者じゃないから「Hello World」から始めるんじゃなくて
実務に使える知識が得られるいい本があれば助かる。

今やってる仕事をマクロで処理すること考えろってのはなしね。

仕事干されて何もやらせて貰えない&触らせてもらえないんだわさ。
その時間を活用したいからってのが手を出す理由だから。

はぁ、死にたい。
0151デフォルトの名無しさん2014/11/17(月) 15:42:55.43ID:zW5xq0Zu
まずは干された理由を考えて反省した方が将来につながると思うな
0152デフォルトの名無しさん2014/11/17(月) 16:08:04.06ID:CaX8N17h
>>151
経営者への宗教的崇拝を求められる社風についていけないのが理由だからそこの改善は無理。
0153デフォルトの名無しさん2014/11/17(月) 17:41:27.97ID:BfgB+UiD
>>152
前の会社そんなんだったわ
0154デフォルトの名無しさん2014/11/17(月) 17:45:12.23ID:SNTsTnh3
>>150
>プログラム自体は初心者じゃないから
プログラミング中級以上ならVBAのヘルプで十分
ヘルプ見ても判らないなら初心者
0155デフォルトの名無しさん2014/11/17(月) 19:27:23.53ID:0+iPWAnC
というか、そんな話はマ板でやれ
0156デフォルトの名無しさん2014/11/17(月) 19:29:24.64ID:YZQ9lAGL
最初はhelp見てたけど、いつの間にかぐぐるようになったな
event、クラス、typeとか使い出すとhelpじゃものたりない。
0157デフォルトの名無しさん2014/11/17(月) 21:55:03.32ID:7QCa7u92
んなアホなw
0158デフォルトの名無しさん2014/11/17(月) 22:59:29.51ID:Ob56mXwO
Javaの初心者で、ExcelのVBAも初めてみたのですが
標準モジュール、フォームのモジュール、各シートのモジュールは
それぞれJavaでいうクラスのインスタンス化したものに相当すると考えて間違っていないですか?

そのへん、JavaとExcelのVBAの関係についてくわしく教えていただけると助かるのですが・・・
0159デフォルトの名無しさん2014/11/18(火) 00:37:34.64ID:SoogDxuR
>>158
Javaはそんなに知らないけど、シートはあってて、フォームは微妙で、モジュールは違うと思う。
シートは作った時点でシートクラスのインスタンスとして存在する。
モジュールはJavaで言う所のシングルトンなクラスに近いけど、クラスのインスタンスとして
ヒープエリアに展開されることはない。スタティックエリアで直接やりとりを行う。
フォームはどうなんだろ?生成してもしなくても使えたような気がするから、よく分からない。
0160デフォルトの名無しさん2014/11/18(火) 01:07:09.19ID:GOsptD/5
クラスモジュールを100個くらいあるテキストボックスに適用させたいのですが、FOR文を使用したみたいにまとめて定義することはできないんでしょうか?

Private MTEx As TextKeyEvent
Set TKEx = New TextKeyEvent: Call TKEx.Init(Me.kx)
0161デフォルトの名無しさん2014/11/18(火) 10:58:59.78ID:xTCwm9fo
>>158
> Javaの初心者で、ExcelのVBAも初めてみたのですが
> 標準モジュール、フォームのモジュール、各シートのモジュールは
> それぞれJavaでいうクラスのインスタンス化したものに相当すると考えて間違っていないですか?

質問の意図がよくわからないけど、VBEで見るコードは全てCodeModuleクラス(のインスタンス)だよ。
Javaはよく知らないけど、SheetやWorkbookなどのオブジェクトと対になった、自動生成されたstaticな
インスタンスってイメージ。
例外はクラスモジュールで、これは普通にNewしてインスタンス化する。
0162デフォルトの名無しさん2014/11/18(火) 11:07:16.50ID:xTCwm9fo
・・・と思ったけど、CodeModuleはコードへのI/Fを提供するクラスだと考えると、「CodeModuleクラス(のインスタンス)」
というのは間違いか。
いずれにしても、
> SheetやWorkbookなどのオブジェクトと対になった、自動生成されたstaticなインスタンスってイメージ
というのは間違いないんだけど、何でそんなこと知りたいの?
0163デフォルトの名無しさん2014/11/18(火) 11:13:43.49ID:WVbEeNks
以前このスレかどこかで話題になった
いまアクティブになっていないブックやシートを
もしアクティブにしたらアクティブになる予定のセルアドレスって
どうやって取得しますか?
0164デフォルトの名無しさん2014/11/18(火) 11:20:02.27ID:WVbEeNks
もうひとつ、
いまアクティブになっていないブックを
もしアクティブにしたらアクティブになる予定のシート番号って
どうやって取得しますか?
0165デフォルトの名無しさん2014/11/18(火) 12:51:57.54ID:HMO3R2TX
>>163-164
その質問の付近に答え書いたはずだけど
0166デフォルトの名無しさん2014/11/18(火) 16:00:49.30ID:+Ns0XI27
Excel の設定、マクロを他のPCにコピーする場合

・カスタマイズしたツールバー(マクロボタン)のコピー
C:\Documents and Settings\(ユーザー アカウント)\Application Data\Microsoft\Excel
にある「Excel11.xlb」を該当するフォルダにコピー
これでOK

・マクロのコピー
VB編集ウィンドウを開いて
VBAProjekt(PERSONAL.XLS)>標準モジュール
にある各ファイルをエクスポートし、別のPCの同編集ウィンドウでインポートする

これでマクロのファイルはコピーされるんだけど
マクロボタンに登録したパス(ユーザー アカウント部分)が違うために
個別に全てのマクロを再登録し直さなければいけない
C:\Documents and Settings\(ユーザー アカウント)\Application Data\Microsoft\Excel\XLSTART
\PERSONAL.XLS

このパスを指定してまとめて登録する方法って無いですか?
0167デフォルトの名無しさん2014/11/18(火) 17:08:33.85ID:77z8520q
>>166
>このパスを指定してまとめて登録する方法
チョットこの意味が 理解できてないけど

こうゆことしたいの かな?

Set WshNetwork = CreateObject("WScript.Network")
FilePass = "C:\Documents and Settings\" & WshNetwork.UserName & _
      "\Application Data\Microsoft\Excel\XLSTART\PERSONAL.XLS"
0168デフォルトの名無しさん2014/11/18(火) 18:41:11.21ID:+Ns0XI27
他のPCで作ったマクロはファイルのインポートで吸い込むことは出来るんだけど
PCのユーザーアカウント名が前のPCと違っていると

ユーザー設定>マクロボタン右クリ>マクロの登録
で、全てのマクロを再登録しなければならない

元のPC
C:\Documents and Settings\UserORG\Application Data\Microsoft\Excel\XLSTART\PERSONAL.XLS

コピーしたいPC
C:\Documents and Settings\UserCOPY\Application Data\Microsoft\Excel\XLSTART\PERSONAL.XLS

とすると、パスのUserORGとUserCOPYの違いによって、そのままではマクロボタンを押しても該当無しとなるので
ユーザー設定で再登録が必要となるが、マクロの数が50超あるので非常にめんどくさい
テキストファイルか何かでパスをUserORG→UserCOPYと書き換えて、再登録の手間無しでざっくりコピーしたい
0169デフォルトの名無しさん2014/11/18(火) 21:11:45.86ID:psSLzE7H
フォームの「ボタン」を使ったのが敗因だな
0170デフォルトの名無しさん2014/11/18(火) 21:25:32.61ID:TpYwnXIk
高度過ぎて判らん  普通にブックコピーで この例なら UserCOPY 側で開けばいいんじゃないのか?
上でExcel11.xlbって書いてるからもしかすると2003とかか知らんが、昔っからコピーでいけてるぞ? 相手側のセキュリティなら
これはこうしてくれ って伝えればいいだけじゃないのか? アカウント名の違いでマクロが動かなかったなんて一度も無いんだが?
だれかおれの間違いを指摘してくれ
0171デフォルトの名無しさん2014/11/18(火) 22:15:29.69ID:lKmKVG14
>>168
コピー先のマシンにUserORGフォルダを作ってファイルコピーするのが一番簡単で早い
0172デフォルトの名無しさん2014/11/18(火) 23:28:04.32ID:WVbEeNks
>>165
そのスレはもう落ちて見れないのですが。
0173デフォルトの名無しさん2014/11/18(火) 23:33:04.99ID:YNTCOw/i
>>172
みられるよ
ただし、書かれているのは正解ではないけど
0174デフォルトの名無しさん2014/11/19(水) 00:26:35.25ID:IL3ynjUE
本格的で長いコードのとき
そこで使われているたくさんの変数名やサブ名や関数名を一括で変更したいときは
なにかいい方法はありますか?
0175デフォルトの名無しさん2014/11/19(水) 00:32:40.22ID:Opskicxo
>>174
VB.Netかテキストエディタにコピペして編集
0176デフォルトの名無しさん2014/11/19(水) 02:15:14.43ID:kucPuHEJ
>>174
置換じゃダメなの?

一括での意味が判らんがシートにコピペし
変更する語句を配列に入れループさせるコード書けば?
0177デフォルトの名無しさん2014/11/19(水) 05:05:08.99ID:oXOCRAV5
>>173
見方とどう間違っているのか教えて
0178デフォルトの名無しさん2014/11/19(水) 06:06:03.20ID:rIIQXVOI
>>177
たぶんここじゃね?(専ブラじゃみられん IE等で見るベし)
Excel VBA 質問スレ Part34
http://peace.2ch.net/test/read.cgi/tech/1403911485/594-633
0179デフォルトの名無しさん2014/11/19(水) 07:12:08.51ID:oXOCRAV5
>>178
で、この答えを書いたのは俺だが、どこが間違ってるって?

600 デフォルトの名無しさん sage 2014/09/17(水) 14:28:16.96 ID:c1ogrgKw
>>594
多分ファイルのどこかに書いてあるから、ファイル解析して頑張れ、応援してるぞ
http://msdn.microsoft.com/en-us/library/office/cc313105(v=office.12).aspx
0180デフォルトの名無しさん2014/11/19(水) 07:18:41.22ID:cj3WZnB6
アスペってこんな感じ
01811782014/11/19(水) 07:23:08.26ID:rIIQXVOI
えっと俺は >>173 じゃないぞ
0182デフォルトの名無しさん2014/11/19(水) 07:31:49.95ID:I9gi/U1m
>>181
ああ、すまん。
確かにあんたに言うこっちゃなかったな。
01831632014/11/19(水) 10:03:15.97ID:IL3ynjUE
>>178
ありがとうございます!
それですね。

ところでふと思ったのですが
その方法だとアクティブになる予定のシートやセルを取得できますが
アクティブになる予定ではない複数のシートのそれぞれのシートをもしアクティブにしたときのその各シートのなるであろうアクティブセルたちは
どうやって取得しますか? (意味が複雑ですが分かる人には意味は分かると思いますが)
0184デフォルトの名無しさん2014/11/19(水) 10:06:05.83ID:IL3ynjUE
>>175-176
それだと例えば変数が
・Age
・AgeMax
の2つあった場合
AgeだけAge→HowOldと変数名を変えたいばあいに
変えたくないAgeMaxまでHowOldMaxと誤って変えてしまう問題がある。

さらにこの例以外にも問題はたくさん生じると思う。
0185デフォルトの名無しさん2014/11/19(水) 10:14:32.19ID:ehhdouR6
>>184
つ「完全に一致する単語だけを〜」

同じ名前の変数が広範囲に出てくるなら、
基本的にはもっと構造化した方がいいと思うが。
0186デフォルトの名無しさん2014/11/19(水) 10:18:01.31ID:IL3ynjUE
>>185
>「完全に一致する単語だけを〜」

それでもダメじゃ?
0187デフォルトの名無しさん2014/11/19(水) 10:40:47.10ID:kucPuHEJ
>>184
AgeMaxを先にすれば良いだけじゃん?
01881782014/11/19(水) 10:41:57.63ID:rIIQXVOI
>>183
紹介した過去すれでも何人かが書いてるけど
君もに問いたい

どうしてセレクトやアクティベートをして取得しないの?
一番 単純で簡単な方法じゃね?

単に 知的 好奇心?
0189デフォルトの名無しさん2014/11/19(水) 10:46:57.19ID:IL3ynjUE
>>187
上の>>184で書いた具体例は複雑怪奇な入り組んだコードを
わかりやすく説明するために最高度に洗練して最高潮にシンプル化したもの。

そりゃAgeとAgeMaxだけだったらAgeMaxをまず"TempVariable"にでも置換しといてAgeを置換したあとまた戻せばいい。
しかし実際はこの100万倍も複雑なんだよ。
01901782014/11/19(水) 10:49:36.93ID:rIIQXVOI
>>188 訂正
× 君もに問いたい
○ 君にも問いたい

うーむ徹夜あけで頭がまわっとらん もう帰って寝る
0191デフォルトの名無しさん2014/11/19(水) 10:49:38.14ID:IL3ynjUE
>>188
はい、まず好奇心というのが一番大きいものを占めると思いますよ。
以前はわざわざセレクト/アクティベートにして対象のシート/アドレスを取得してたけど
もっと単純なコードでできる/できそうなことがわかって、
一般にもし複雑なことを簡単に済ますことができるなら今後のコードの可読性/シンプル化のためどんなことでも徹底的にやる、
それがオレのブログラミング哲学ですから。
0192デフォルトの名無しさん2014/11/19(水) 10:56:10.36ID:IL3ynjUE
VBAのエディタにそういうリファクタリングの機能がついていればいいんだけど。
そういやVBAのエディタってその使い方を解説したサイトや本って全くないね。
01931782014/11/19(水) 10:57:34.56ID:rIIQXVOI
哲学君ですかwww
ならこれ以上相手をする気にはなれない。
じゃーーーねwww
0194デフォルトの名無しさん2014/11/19(水) 10:57:44.78ID:kucPuHEJ
>>189
礼はいらんが逆切れは勘弁してね

変更する語句は幾つ有るの?
何百あろうと置換するコード作れば済むじゃん
0195デフォルトの名無しさん2014/11/19(水) 10:58:30.77ID:2H4InUlp
>>186
> それでもダメじゃ?
なんで駄目なんだ?
「単語」の意味わかってる?
0196デフォルトの名無しさん2014/11/19(水) 11:00:07.13ID:2H4InUlp
>>191
> 一般にもし複雑なことを簡単に済ますことができるなら今後のコードの可読性/シンプル化のためどんなことでも徹底的にやる、
アクティブなセルの位置が知りたいシートをSelectするのが複雑なことなんですか?
01971732014/11/19(水) 12:20:59.37ID:efOXW83R
>>183
前スレの628ですでにその点は指摘済み、
それが出来ないから正解じゃないと言ってる
0198デフォルトの名無しさん2014/11/19(水) 13:06:18.66ID:efOXW83R
>>184
変数名とかプロシージャ名だけに限っていえば
名前の前後の半角スペースまで込みで検索、置換すれば
それなりに対応出来ると思う。
ただ、コメント中とか""で括った文字列なんかも含めて考えると
その限りではないから何らかの配慮が必要になるのは間違いない。
0199デフォルトの名無しさん2014/11/19(水) 13:32:39.89ID:2H4InUlp
おいおい、マジでそんなこと議論したいのか
0200デフォルトの名無しさん2014/11/19(水) 13:40:59.38ID:J0idNhiA
>>189
百万倍複雑で置換も出来ないような本格的()クソコード書いてんのに、
なんでそんなに上から目線なの。
0201デフォルトの名無しさん2014/11/19(水) 15:09:20.35ID:4iVxD8np
>>170
マクロボタンはユーザーアカウントを含んだパスで指定されるから
ユーザーアカウントの違うマシンにインポートしただけでは
マクロボタンをクリックしてもオリジナルのパスを呼び出すことになり
該当するマクロがないと言われる

マシンが変わってもマクロ自体は問題なく働くけど
カスタマイズしたツールバーのマクロボタンを使うには
マクロボタンのパスを再登録して
新しいマシンのユーザーアカウントにあるパスで再登録しなければいけない

その一手間がマクロの数が多いと煩雑になりすぎるので
テキストベースで一括処理できないのかと
0202デフォルトの名無しさん2014/11/19(水) 15:17:12.40ID:2H4InUlp
>>201
> その一手間がマクロの数が多いと煩雑になりすぎるので
だったら、配布予定のものは、アドインにしとけよ。
いつまでやってんだ。
0203デフォルトの名無しさん2014/11/19(水) 16:02:26.94ID:kucPuHEJ
もしかして「個人用マクロブック」?
0204デフォルトの名無しさん2014/11/19(水) 16:47:25.67ID:2H4InUlp
>>203
そう。
アドインを知らなかったか、アドインを簡単に作れることを知らなかったんじゃないかと思うよ。
0205デフォルトの名無しさん2014/11/19(水) 17:17:00.60ID:kucPuHEJ
>>204
「個人用マクロブック」と「フォームのボタン」の最悪組合せか

何を騒いでるのかやっと判った
0206デフォルトの名無しさん2014/11/19(水) 17:23:50.18ID:4iVxD8np
>>202-204
サンキューです

アドインなんて使ったこと無かったけど、こんな簡単な機能があったわけですね
スコーンと解決しましたw
余りにも不自由なので、何かそう言う機能があるのではとは思っていたのですが
まさに知りたかったことズバリです

VBAもマクロも全て独学、周りにマクロを使っている人も居らず
不便に思うたびに何か手はないかと思って知識を追加してきたもので
ほんと感謝です
0207デフォルトの名無しさん2014/11/19(水) 21:37:21.37ID:Opskicxo
>>192
まともなエディタなら「単語の置換」という機能がある
部分一致では別の単語と見なされるから問題なく置換できる
置換リストを用意して複数の単語を一気に置換できるエディタもある
0208デフォルトの名無しさん2014/11/19(水) 22:02:26.33ID:F+S/dSwh
>>207
だから、文字列中に変数名が紛れ込んでたりとかどうすんの?って話じゃないの?
0209デフォルトの名無しさん2014/11/19(水) 22:44:48.20ID:Opskicxo
>>208
正規表現でダブルクォートの数と位置をチェックすればリテラルの中と外を区別できる
sedでも可
100万倍複雑なコードを書くようなやつなら、それぐらい普通にできるだろ
0210デフォルトの名無しさん2014/11/19(水) 23:06:51.43ID:oXOCRAV5
>>209
当然ダブルクォート内のダブルクォートにも対応するんだよね
0211デフォルトの名無しさん2014/11/19(水) 23:26:30.89ID:F+S/dSwh
>>209
結局、正規表現頼みかよ
単語の置換はどうしたw
0212デフォルトの名無しさん2014/11/20(木) 00:07:40.09ID:dmOrDYsb
え?なんで俺が叩かれてんの?
VBEの機能も把握してないようなやつの無茶な要求に応えられる現実的なアイデアってそんなにないだろ
そもそも文字列中に変数名が含まれるなんて条件も質問者じゃない他人の勝手な後付けだし
0213デフォルトの名無しさん2014/11/20(木) 01:04:49.89ID:YcqpqC9x
流れ見る限り1つずつ確認して置換するしかねーよな
本格的なコードが何行あるのか知らんけど(鼻ほじ
0214デフォルトの名無しさん2014/11/20(木) 01:43:49.93ID:I9gdCKy5
>>213
コメントだろうとダブルクォート内のダブルクォートでも何の問題も無くVBAで出来る
既出じゃん
0215デフォルトの名無しさん2014/11/20(木) 23:15:50.11ID:cPSqvK00
病院の電子カルテでエクセル以外で作られたアプリケーションから
患者情報を打ち込むと自動的にエクセルが起動し
血液検査やレントゲンなどその日に回るべき部署が明記された
ワークシートを自動作成したのちに印刷して
印刷が終わるとそのシートを自動で閉じるということをやってて
高度なことしてんなーと感動したんですが、このスレだと
もっと凄いことができる人がいるんでしょうか?
0216デフォルトの名無しさん2014/11/20(木) 23:37:48.98ID:kSKt8q0f
>>215
もちろんです。
もし患者が医療事故で死亡してしまった場合
それまでのデータを改ざんしてその事故を隠ぺいしてしまう機能も作っています。
0217デフォルトの名無しさん2014/11/21(金) 07:16:13.04ID:aKgy5iW0
>>215
多分ね。
ただ、他のアプリからってところで、Excel操作のために使ったブックやシート、レンジとかの
解放をしておかないと掴みっ放しになるので、それだけ注意するくらいかな。
後は仕様が実現可能な範囲ならどうにでもなる。
0218デフォルトの名無しさん2014/11/21(金) 09:04:39.80ID:+vQ/ho/7
いちいちExcel を起動するのはそんなに高度な感じはしないな
スマートにやるならアプリを経由せずにオブジェクトを直接操作する
0219デフォルトの名無しさん2014/11/21(金) 23:03:47.29ID:q0/pK+mw
>>218
言ってる意味がまったく分からないけど頑張ってね
0220デフォルトの名無しさん2014/11/21(金) 23:31:36.94ID:8nypL9of
要するにExcelを非表示で起動すんだな(白目)
0221デフォルトの名無しさん2014/11/22(土) 09:15:33.42ID:kgS6Bnd+
VBAから完全に外れてしまうが、表示しなかろうがオブジェクトを直接操作しようが
元からExcelブック上にあるわけではないデータを一覧表示や印刷する程度で
Excel(インスタンス、オブジェクトも含めて)に頼ってる時点で技術的には下の下だよ

コスパで言ったら、Excelに限らず既に導入されてる既製ソフトに頼れる部分は頼った方が
製作コストを抑えることは出来るから方法論としてはアリだし、俺も自分で使うアプリや
会社の部署内だけで扱うアプリは、暇なときにササッと作って、それによって多少でも
仕事の効率が改善されれば良しって感じなので、手抜きでExcelと連携する方式にすることは多いけど、
高度というか技術的に上を見るなら、電子カルテ側に一覧表示や印刷機能を組み込むのが望ましい
0222デフォルトの名無しさん2014/11/22(土) 09:45:53.98ID:omhlNf/q
>>221
もしそうするならプログラミング言語はなにになるの?
電子カルテを作ってるプログラミング言語のソースが見れないときはどうする?
0223デフォルトの名無しさん2014/11/22(土) 10:16:31.34ID:tLc6zRT6
こんなことできるぼくスゴいでしょってガキでしょ w
0224デフォルトの名無しさん2014/11/22(土) 10:34:23.66ID:mDanNJyP
>>221
そうか。では完全にスレチだからそれ用のスレ立てるか見つけるかしてそっちでやってくれな
0225デフォルトの名無しさん2014/11/22(土) 10:45:05.53ID:kgS6Bnd+
>>222
今回は電子カルテの動作が高度なのかとか、もっと良い方法あるかって話で
電子カルテを作る上での話、つまりはソースを弄れる次元での話だったから>>221のように書いただけ

電子カルテ側を弄れない場合は、SendMessageとか、フックして横取りとか、
電子カルテ側の保存データを解析とか、いろいろアプローチはあるが、
方法論としてVBA以外の手段を提示するところまではスレ違いじゃないけど
VBA以外の手段の具体策を語りすぎるとスレ違いになるので、詳しくは控える


>>223
VBAだけではなくアプリ開発やってる奴から見たら、当たり前のことしか書いてないのに
それが自慢みたいに見えてしまうのは、君のレベルが低いからだよ

「30代で年収400万です」だって、一般社会的には「ぼちぼちか」程度で自慢にもならないが
派遣や底辺業からしたら自慢に見えちゃうのと同じ事

普通は自慢に見えないものが、自慢かのように見えてしまうのは、自分の目線が低いからだと気付こう
0226デフォルトの名無しさん2014/11/22(土) 10:54:55.62ID:omhlNf/q
配列を動的にするReDimって頻繁に使っても動作が遅くなる等の問題は発生しないですか?
それとも要素数を気にしないで使えるもっと高級な技を使ったほうがいいですか?(その場合なにを使うのが一般的でしょうか?)
0227デフォルトの名無しさん2014/11/22(土) 11:12:09.12ID:tLc6zRT6
>>225
プリンタは機種やドライバによって挙動が異なることが多い
システム納入でプリンタを決め打ちできるならいいけど、既存のシステムに組み入れられてどんなプリンタ繋がるかわからないなら、印刷を Excel に任せてしまうのは普通にある
まあ、実務やったことないガキにはわからんだろうけどな w
0228デフォルトの名無しさん2014/11/22(土) 12:10:49.37ID:JtamyZlr
>>226
>要素数を気にしないで使えるもっと高級な技

なんですか、それ。

動作が遅くなるとかなんて考えたこともない。それが必要だから使っているだけであって。
要素数固定で不必要なメモリ確保(あるいは必要な分確保できず)なんかよりはるかに良いでしょ
0229デフォルトの名無しさん2014/11/22(土) 12:11:20.25ID:mDanNJyP
>>225
はいはい、早く消えてね。


にしても年収安っ
0230デフォルトの名無しさん2014/11/22(土) 12:33:28.06ID:tMRajCg5
>>226
例えばCSVを行単位で配列に読み込む場合、ReDimで拡張しながら読み込むのと、行数判定ループ=>ReDim=>読み込みって方法がある。
後者の方が速いんじゃないかなぁ
0231デフォルトの名無しさん2014/11/22(土) 12:40:03.26ID:omhlNf/q
>>228
CollectionとかDeictionaryとかいろいろあるみたいですよ。
あまり使い方は知らんが。
0232デフォルトの名無しさん2014/11/22(土) 13:52:45.20ID:kgS6Bnd+
>>227
印刷設定への柔軟性の持たせ方も知らないの?

>>229
400万は俺の年収ではなく、単に平均年収当たりを例として挙げただけだが?


まったく、この子ら、どんだけコンプレックス抱えてるんだよw
0233デフォルトの名無しさん2014/11/22(土) 13:53:26.32ID:Bqi+3jhp
>>230
そうとも限らない。
CSVが大量にあり、最初に全ての行数判定ループ=>ReDim=>読み込みと
ReDimで拡張しながらと。
0234デフォルトの名無しさん2014/11/22(土) 14:15:26.52ID:UMO5H3JK
>>230
ケースバイケース
CSV がネットワークの先にあるとかもあるから
そもそも VBA レベルならそんなことを気にせずに組みやすい方法で組めばいいと思う
気になるほどでかいデータなら SQL-Server に読み込んで処理するとかすることもできるし

>>232
> 印刷設定への柔軟性の持たせ方も知らないの?

そういうレベルの話じゃないよ w
普通に印刷すると極細の罫線が印刷されないとか、まあ経験ないだろうし、バッドノウハウの類いだから知らなくていいよ
0235デフォルトの名無しさん2014/11/22(土) 14:26:54.91ID:Ka6CKXnZ
>>232
なるほど、もっと安いのか。
偉そうに言ってるわりにチンケな人生送ってそうだな。
0236デフォルトの名無しさん2014/11/22(土) 15:15:26.86ID:tMRajCg5
>>233
メモリに余裕があれば1度目でキャッシュに入る可能性高くね?
>>234
ケースバイケースだからこそケースを絞って紹介したんだぞ
それにDBとか飛躍しすぎ
0237デフォルトの名無しさん2014/11/22(土) 15:35:10.24ID:Ka6CKXnZ
いや、CSVなら直接SQL投げた方が早くね?単純なデータならさ。
0238デフォルトの名無しさん2014/11/22(土) 16:11:47.54ID:tLc6zRT6
>>236
> ケースバイケースだからこそケースを絞って紹介したんだぞ

絞れてないだろ?
どこが絞れてないかも書いてあるのに何を言ってるんだよ w
0239デフォルトの名無しさん2014/11/22(土) 16:19:47.03ID:O6lQ0Rak
結論:とりあえずCollectionに突っ込んどけ
0240デフォルトの名無しさん2014/11/22(土) 18:45:35.55ID:vg7E1raR
>>226
普通のReDimだけならそれほど気にすることはない
大概はPreserve付きで使うだろうけど、この場合は遅いからなるべくやるなと言われてる
たとえばループで毎回1づつ大きくするんじゃなくて、ある程度まとめて大きくする方法を考える

VBA単体だとコレクション系は弱いから、配列の代用はケースバイケースだな


とはいえ、最近のPCの性能ならあんまり気にすることも無いかもしれんのが実情
0241デフォルトの名無しさん2014/11/22(土) 19:39:47.06ID:9VkaRl4y
初心者ですがちょっと教えて下さい

Workbooks("1.xls").Sheets("Sheet1").Range("a1").Value = Workbooks("2.xls").Sheets("Sheet1").Range("a2").Value

はブック1からブック2へセルa1の値をコピペするコードですが 
セルa1の値に100を掛けた数値をブック2へペーストするにはどう書き足せばいいのでしょうか?
0242デフォルトの名無しさん2014/11/22(土) 19:50:03.97ID:vg7E1raR
>>241
コピーの向きが逆じゃないか?

セルが数字じゃなかったりしたらとか考慮点はあるけど
とりあえず後ろに * 100とか付けたしとけば
0243デフォルトの名無しさん2014/11/22(土) 20:28:06.59ID:9VkaRl4y
>>242
逆でした。 そして式の最後に書き足すとすんなりとうまくいきました。
ありがとうございました。 
0244デフォルトの名無しさん2014/11/23(日) 00:35:46.18ID:HclhhaC8
速さを気にするなら何回もredimしなくていいように関数なり処理の前に総数を取得するのがいいんじゃないかな
0245デフォルトの名無しさん2014/11/23(日) 10:03:37.04ID:pl8PYAOz
>>244
お前は >>230 から読み直せよ
0246デフォルトの名無しさん2014/11/23(日) 10:20:47.40ID:Q4U7BP0W
最初から100万でも1000万でも十分なサイズを確保しとけよ
あまり細かいこと気にしてるとバカになるぞ
0247デフォルトの名無しさん2014/11/23(日) 19:09:25.87ID:Rton4PFq
都度redim preserveでよくね?
最初にある程度の領域を確保する場合、
領域が足りてるかの確認、足りなかったら結局redim preserveするんでしょ?
あと、余った領域はどうすんの?
最後にredimして削るの?
0248デフォルトの名無しさん2014/11/23(日) 19:17:06.72ID:pqCOOKCL
そこまでメモリがカツカツになるような処理にはVBAは向いてない
0249デフォルトの名無しさん2014/11/23(日) 19:59:33.33ID:Rton4PFq
メモリカツカツとかじゃなくて、確保した領域そのままにしといたら、
ubound(array)するときにめんどくさくね?
0250デフォルトの名無しさん2014/11/23(日) 20:04:51.10ID:HclhhaC8
総行数を取得する関数なかったっけ
ないならregexpで改行の数を取るとかしてさ
0251デフォルトの名無しさん2014/11/24(月) 04:10:26.16ID:JDFV6yz/
>>247
昔はPreserveすると結構遅かったからな
足りないかチェックして、100とかずつ増やして、最後に余った分削るとかやってた事もある
まあ、毎回ReDimして速度が気にならないならそれでいいんじゃね
0252デフォルトの名無しさん2014/11/24(月) 06:58:09.08ID:owm7UG/9
Excelでデータベースのようなシステム組まされた。
もう、accessとか使えってレベル。
逃げてー。
0253デフォルトの名無しさん2014/11/24(月) 07:38:48.19ID:F5zqJ0Hg
エクセルは何でも出来ると思ってる上司か

わざと遅くて使い物にならないヤツ組んでやれば?
0254デフォルトの名無しさん2014/11/24(月) 09:04:58.20ID:/Xnwup+Z
Access だと Professional が必要で値段が高いからじゃね?
0255デフォルトの名無しさん2014/11/24(月) 09:34:16.29ID:jTeVjYzr
構造体みたいなTypeを定義するとき

Type Person
Name As String
Age As Integer
Birthday As Date
Sex As String
Prefecture As String
・
・
End Type

は長いんですがどうにかして1-2行にするためのしくみはありませんかね?こんな感じで↓
Type Person {Name As String, Age As Integer, Birthday As Date, Sex As String, Prefecture As String}
End Type
0256デフォルトの名無しさん2014/11/24(月) 09:41:25.16ID:jTeVjYzr
コードであとから見る(1年後もありえる)ことを考えての可読性のため
「ここは何もしないよ」ということを示すのによう方法はあります?
単に空欄にするのは「本当になにもしない」なのか「あとでなにか記入しようとして忘れてるだけ」なのか区別がつかないから却下。
このくらい気をつかうのがオレのプログラム哲学なんでね。

こんなところで使いたい。
Select Case Name
Case "A"
i=i+1
Case "B"
i=i+2
Case "C"
★このときはなにもしないよ★
Case Else
i=i+3
End Select
0257デフォルトの名無しさん2014/11/24(月) 10:20:55.45ID:XbvFM8cR
>>255
標準ではない、オレオレプリプロセッサでも作れ

>>256
コメント入れとけよ
0258デフォルトの名無しさん2014/11/24(月) 10:42:57.02ID:jTeVjYzr
>>257
オレオレプリプロセッサとは?

>>257
オレはコードへのコメントは否定派なのです。
コードを改変したときコメントも改変しないといけないばかりでなく
重要なのは「改変したとき修正すべきコメントを探してコメントを修正しないといけないから」です。
もう一回言うよ重要だから。
「改変したとき修正すべきコメントを探してコメントを修正しないといけない」んです。
これはものすごい労力ですよ。
UFOがいないことを証明するのと同じくらい。
UFOが存在することを証明するのはもし存在するとしたらそれがあることを実物を出して証明すればいい。
しかし存在しないことの証明は事実上できない。
もしコメントをつけるプログラミングをしていたばあい
本当に修正すべきコメントがもう残ってないか調べないといけない。
これはUFOの非存在の証明と似ていて、もしやるならいままでに書いたコードをすべての行をチェックしないといけない。
0259デフォルトの名無しさん2014/11/24(月) 10:53:57.57ID:VYWQA4UT
>>258みたいなウスラバカの投稿を禁止しやがれ、2ch
0260デフォルトの名無しさん2014/11/24(月) 10:57:11.01ID:fcfNiHLg
>>255
コロンでできなかったかな
関数もコロンで一行にできたはずだしタイプでもたぶん

>>256
Do Nothingを使うかな
0261デフォルトの名無しさん2014/11/24(月) 11:07:15.88ID:D8KRBFf0
>>256
人に質問してる時点で哲学とか偉そうなこと言うな
本当に哲学を持ってれば質問なんかしない
0262デフォルトの名無しさん2014/11/24(月) 11:11:14.98ID:/Xnwup+Z
>>258
> オレオレプリプロセッサとは?

プリプロセッサでぐぐれ

> オレはコードへのコメントは否定派なのです。

> これはUFOの非存在の証明と似ていて、もしやるならいままでに書いたコードをすべての行をチェックしないといけない。

やれよ、お前の苦労なんて知ったこっちゃないわ
0263デフォルトの名無しさん2014/11/24(月) 11:23:30.83ID:owm7UG/9
>>253
線形検索でアルゴリズム組んである。
さすがに件数増えると遅い。
エクセルだから仕方ないってことにしてもらおう。
0264デフォルトの名無しさん2014/11/24(月) 11:54:28.26ID:jTeVjYzr
>>260
ありがとうございます。
コロンで解決しました。

>>260
Do Nothingなんてステートメントないじゃないか。
しかしその貴重な意見を参考に
 Private Sub DoNothing()
 ★
 End Sub
をつくりました。
しかし★の部分にはなんと書けばいいの?
0265デフォルトの名無しさん2014/11/24(月) 11:56:36.45ID:jTeVjYzr
★の部分にもDoNothnigと書いたら
循環になってるらしくエラーが出てExcelが強制終了された。
0266デフォルトの名無しさん2014/11/24(月) 12:10:33.21ID:D8KRBFf0
>>264
何もしないのなら何も書かない
Sub 〜 End Subだけで終了
0267デフォルトの名無しさん2014/11/24(月) 12:21:31.49ID:jTeVjYzr
>>266
コードを例えば1年ぶりに見たとき
もしなにも書いてないと
(1)本当になにも書いていない
(2)当時あとで何か書こうと思ったけどいまだ追加をしていない
(3)誰かがあとで消した
の区別がつかなくないか?
0268デフォルトの名無しさん2014/11/24(月) 12:24:33.50ID:Eb83DtMA
>>256
本当に何もしないことを意識して記述するなら、DoNothingとでも
名前を付けた何もしないメソッドを呼び出すようにすればいい。
なぁに、.Netでもデリゲートやインターフェースを使うときにはよくあること。
0269デフォルトの名無しさん2014/11/24(月) 12:25:16.67ID:jTeVjYzr
サイフをバッグにしまうとき
ジッパーを閉めておくべきなのは
あとでサイフをとりだしてなにも入っていなかったとき
本当になにもないことが確信できることだ。

もしジッパーを開けておいたら
コインがサイフから飛び出してバッグの中に入ってる可能性がある。
0270デフォルトの名無しさん2014/11/24(月) 12:26:47.45ID:jTeVjYzr
>>268
そのメソッドにはなにを書くの?
0271デフォルトの名無しさん2014/11/24(月) 12:32:12.86ID:Eb83DtMA
>>270
基本的になにも書かない。
デリゲートやインターフェースで使うつもりならそのシグネチャと、返値がある場合は正常であることとか、
何もさせていないことを意味することとか。
0272デフォルトの名無しさん2014/11/24(月) 12:45:35.35ID:2wgV6TLT
>>270
そもそもそこまで意図させるなら、返値を列挙体でもたせてどういうつもりで
その状態にしていたかを返却するようにしたほうがいいんじゃないの?
そこまで重要視するんならさ。
0273デフォルトの名無しさん2014/11/24(月) 12:47:32.56ID:D8KRBFf0
>>267
だーかーらー、忘れないためにコメントを書くんだろうがボケ
コメントを書くのは哲学に反するとか、寝言言ってんじゃないぞコラ
0274デフォルトの名無しさん2014/11/24(月) 12:52:57.67ID:0v6xJTH4
>>267
その3つの種類に分けた、何もしない関数を作ればいいじゃん。
関数名ももろそれでw
0275デフォルトの名無しさん2014/11/24(月) 12:55:29.06ID:fcfNiHLg
>>264
なにもしなかった事を明示するためにデバッグプリントかな
0276デフォルトの名無しさん2014/11/24(月) 12:58:44.12ID:Eb83DtMA
結局何が言いのかよく分からなかったし、
何がどう哲学なのかもよく分からない人だったなぁ。
0277デフォルトの名無しさん2014/11/24(月) 13:07:00.89ID:q3t5mPg6
>>265
惜しいな。'DoNothing v(--)v
0278デフォルトの名無しさん2014/11/24(月) 13:10:39.78ID:D8KRBFf0
覚えたての「哲学」って単語を使ってみたいだけの厨二病にしか見えん
0279デフォルトの名無しさん2014/11/24(月) 15:29:46.02ID:sEjXsBJz
>>256
仮に「何もしないこと」を判別するための手段を用意したとして、
それが書かれていなかったときに
「『何もしないこと』を判別する必要が無かった」からなのか
「『何もしないこと』を判別するのを忘れている」からなのか
が判別出来ない。
0280デフォルトの名無しさん2014/11/24(月) 17:02:18.09ID:SfsiYp3u
VBAからIEのウェブサイトのテキストボックスやテキストエリアに入力しようとするときに一度入力した文章の後に追加でさらに入力する方法ってないですか?
テキストボックスに入力しようとすると常に全部上書きするようにしか入力出来なくて困ってます
0281デフォルトの名無しさん2014/11/24(月) 17:10:55.42ID:5R7rrTlS
>>280
取得 → 取得文 & 追加文

で良いのでは?
0282デフォルトの名無しさん2014/11/24(月) 17:19:34.37ID:SfsiYp3u
>>281
サイト側の仕様のせいか一度に長い文を入力しようとするとエラーが出るんです
だから分割して入力したいんです
0283デフォルトの名無しさん2014/11/24(月) 18:13:00.38ID:D8KRBFf0
>>282
文字数チェックとかJavascriptでやってんのかな
cgiを起動するサイトなら、入力フォームを使わずに直接パラメータとして送るとか、あとはSendKeysとか
0284デフォルトの名無しさん2014/11/24(月) 18:13:15.00ID:ERW6xaby
今、VBAからC, C++で作成したDLLを呼び出して処理をさせようとしているのですが、
「DLLの中でさらに別のライブラリ(自作)関数」をコールするようにしていると
VBAで実行時「ファイルが見つかりません」というエラーが出ます。

DLL内で別のライブラリ(自作)関数をコールしないようにしてVBAを実行すると問題なく動きます。
(C, C++のコード上でも問題なく動く)

VBAで自作DLLの中でさらに別のDLLを使う場合、何かしらの設定が必要なのでしょうか?
(もしくはDLLを配置する位置の問題?)
0285デフォルトの名無しさん2014/11/24(月) 18:49:23.70ID:KXz7w2LU
>>284
LoadLibraryの仕様に従って読み込まれるだけのような。
パスが通っていても駄目なの?
0286デフォルトの名無しさん2014/11/24(月) 18:49:59.30ID:ERW6xaby
>>284ですが自己解決しました。
officeのrootディレクトリ(C:\Program Files\Microsoft Office 15\root\office15)に置いたら動くようになりました。

しかし分からないのはsystem32フォルダに置いて駄目なのは何故だろう?と。
systemフォルダは間違いなく見に行くと思うのですが…
0287デフォルトの名無しさん2014/11/24(月) 18:52:03.44ID:ERW6xaby
>>285
一番上位のDLLのパスを通していても駄目だったんですよ。
そのDLL内部で使っている別DLLのAPIが見えないって感じでした。
0288デフォルトの名無しさん2014/11/24(月) 18:56:59.50ID:EiENBVLi
64bitだからとか
0289デフォルトの名無しさん2014/11/24(月) 18:59:44.81ID:ERW6xaby
>>288
確かに64bitOSのPCなんですけど、systemフォルダにDLLを置いて見えないというのは解せないです。
(ちなみにofficeは32bit版)

excelでDLLを見に行くパスを設定(もしくは現在のパス設定の確認)する方法ってありますかねー
0290デフォルトの名無しさん2014/11/24(月) 20:00:08.46ID:EiENBVLi
64bitだとSysWOW64フォルダになるよ
0291デフォルトの名無しさん2014/11/24(月) 20:50:20.43ID:KXz7w2LU
Win8.1(x64)/Office2013(x86)で実際にDLLを作って試してみたけど、
パスさえきちんと通っていれば、Excel-DLL1-DLL2ってパターンも正しく呼び出せた。

……DLLを作るのってもう何年ぶりだろう(遠い目
0292デフォルトの名無しさん2014/11/24(月) 23:18:44.86ID:JDFV6yz/
>>255
複数の文はコロンでつないで1行に書ける(例外あり)
Type Person: Name As String: Age As Integer: Birthday As Date: Sex As String: Prefecture As String: End Type
これでいけるだろ
こんなコード書メンテしたくないが
0293デフォルトの名無しさん2014/11/25(火) 00:14:32.40ID:3Xoyl8Hl
>>255
1行にまとめるのとはちょっと違うけど、型宣言を短縮する方法ならあるよ
「As String」は「$」に、「As Integer」は「%」と書くことができる。ただし「Date」など省略できない型もある
例を書き換えてみると

Type Person
Name$
Age%
Birthday As Date
Sex$
Prefecture$
・
・
End Type

MS-BASICの時代はこう書くのが常識だったんだけど、なぜかVBの時代になってから使われなくなった
やっぱり可読性が落ちるからかな
0294デフォルトの名無しさん2014/11/25(火) 00:23:16.41ID:iQo6P3SX
>>293
むかしの純粋なインタプリタなら、ソースのサイズが実行速度に影響したりしたからな
コンパイルするならメリットほとんどない
あと型が増えたら記号が足りないって問題もあるw
0295デフォルトの名無しさん2014/11/25(火) 07:33:07.76ID:oMA0ONCn
一般的な書き方でなく特別な方法(それがあったとして)で、「1-2行にする」ことのメリットなんか無いだろ。
有るっつんだったら >>255にききたいけど、可読性を下げてまでするそのメリットは何?
0296デフォルトの名無しさん2014/11/25(火) 07:56:13.41ID:LghttLz3
>>295
それが彼のプログラミング哲学www
0297デフォルトの名無しさん2014/11/25(火) 12:44:38.13ID:8YQh1Q5I
遅レスだが、現在国内で流通してる殆どの電子カルテはVBです
なのでエクセル、ワードと親和性は高いと言えるけど、、、
0298デフォルトの名無しさん2014/11/25(火) 13:27:45.81ID:JE+Nf7H+
Module1の上端部で定義した
Public a as Integer
Private b as Integer
と

UserForm1の上端部で定義した
Public c as Integer
Private d as Integer
の

それぞれ4つの変数a, b, c, dは
その値がクリアされるタイミングはいつですか?

一旦プロシージャの処理が終わって時間待ちになったときにクリアされたりするのでしょうか?
0299デフォルトの名無しさん2014/11/25(火) 14:25:31.41ID:S6K9qD6w
>>298
"vba 変数 クリア タイミング"
上位3件

値が消えない静的変数
http://officetanaka.net/excel/vba/variable/10.htm

モジュールレベル変数の値が消えるとき
http://www.moug.net/tech/exvba/0150116.html

[VBA] Public 宣言された変数の有効期間
http://support.microsoft.com/kb/408871/ja
0300デフォルトの名無しさん2014/11/25(火) 17:36:06.71ID:LghttLz3
>>293
"$" とか "&" などの型宣言文字はTypeの中では使えないみたい。

ためしにやってみたら

>コンパイルエラー
>Type ブロック内では無効なステートメントです。

っていうエラーが出て使えない。
0301デフォルトの名無しさん2014/11/25(火) 21:54:27.11ID:l0p/hEoX
宣言とかDimじゃなくてPublicで宣言して
標準モジュールとかにまとめて記述すりゃすっきりするじゃん?(鼻ほじ
0302デフォルトの名無しさん2014/11/25(火) 23:09:51.93ID:hi3TB2zi
staticしたい時がまれによくある
0303デフォルトの名無しさん2014/11/25(火) 23:59:43.09ID:Vo39ovgA
ああ、そうだな。
まれによくあるな。
0304デフォルトの名無しさん2014/11/26(水) 04:48:58.72ID:P66XyNZE
>>297
エクセル、ワードはActiveXアプリケーションだから、
VBじゃなくてもActiveX対応言語とは全てと親和性は高いよ

だからその親和性は、電子カルテがVBだからではなく、エクセル、ワードが
外部からの操作性、つまりプログラミング言語との親和性が高いように設計されてるからだ

VBとExcelの親和性は、VB言語とExcelのVBA言語の共通性から来てるかのように
錯覚しがちだが、Excel自体はVB系言語で作られてるわけじゃないからねw

まぁ親和性ではなくコードの移植性ってことで言うと、それが高いのは旧VBに限られ
次点のVB.NETでさえ、その点では大きく劣るが、
件のような場合におけるコードの移植性は、一度VBAでコードを書いてからじゃないと、
その処理を外部に持って行けない初心者以外にはあまり関係のない話
0305デフォルトの名無しさん2014/11/26(水) 09:34:28.90ID:ZQ9DyrUo
アプリケーションを部品に分解して組み替えや再利用を可能にするというレゴブロックのような仕組みそのものが
MacOSやWindowsの基本構造なんだよね
Officeはその基本に忠実に作られてるってだけのこと
個人が作ったフリーウェアなんかでも、この基本をちゃんと押さえた構造になってるアプリなら、簡単に外部から
操作したりデータの再利用ができてしまう
0306デフォルトの名無しさん2014/11/26(水) 12:29:02.28ID:l6+k0cvM
でもVBA.Netは早く出して欲しい。
て言うか出せ。
0307デフォルトの名無しさん2014/11/27(木) 07:09:02.52ID:X3D24wAF
MS_Officeのマクロは旧VB系のままでいいよ

これがVB.NETになったら、かろうじて今VBAを使えてる奴の多くは
VB.NETは解らないってなって、社内で使ってるExcelやAccessのマクロ入りファイルを
作ったりメンテしたり出来る奴が極端に減って、俺の負担は増えるばかり

個人的にはVB.NETでやりたい部分もあるけど、そういうのは先にも出た連携性の良さを活かし
個人の自宅PCでは入れ放題な外部アプリやCOMを使って、VB.NETなりC#なり、あるいは他言語で作った外部アプリから
Excelをオブジェクトとして操作したり、Excelから同じく上位言語で作った自作COMを参照したりで事足りてる
0308デフォルトの名無しさん2014/11/27(木) 08:28:21.08ID:tn51YXgS
>>307
VBAはVBAでひとつ、事務の現場として完成された言語だからね。
ここにオタクの思想であれやこれや入れる理由なんてどこにもない。
0309デフォルトの名無しさん2014/11/27(木) 11:26:25.74ID:5OfvJX0B
book1のsheet1には数万行くらいの大量の
データが有るのだが、それをbook2のsheet1に素早くコピーしたいのだが、
どんなふうにやれば最も速くコピー出来るでしょうか?
0310デフォルトの名無しさん2014/11/27(木) 11:50:35.83ID:omIZS9ZA
>>309
単なるシートコピーじゃなくてセル毎に処理走るの前提なら、
一旦CSVに吐き出して読み込むのが早かった気がする
CSV読み込むルーチンは自前で
0311デフォルトの名無しさん2014/11/27(木) 12:33:10.24ID:HmdQywrO
FileCopy "book1.xls", "book2.xls"
0312デフォルトの名無しさん2014/11/27(木) 12:54:53.73ID:cuJ5rv8l
>>307
VBA.NET とか C# for Application がサポートされてもすぐに VBA はなくならんだろ
0313デフォルトの名無しさん2014/11/27(木) 13:14:29.79ID:yVYX1THh
VBAもVB.NETもほとんど同じだろ
なにが違うんだ?
VBAがある程度できればすぐにVB.NETも使いこなせるようになるだろ
そのVB.NETがどういうものか知らんが
0314デフォルトの名無しさん2014/11/27(木) 13:26:26.61ID:Sitwz6k+
>>309
基本的なことはoffice tanakaに聞くといいよ
0315デフォルトの名無しさん2014/11/27(木) 14:27:50.82ID:yVYX1THh
質問です。
ファイルやシートを選択するとき
あらかじめその文字列は取得してたけど
あとで削除したり閉じたりして存在していないときエラー回避のため存在するかどうかを確認するための関数やメソッドはありますか?
0316デフォルトの名無しさん2014/11/27(木) 14:32:35.47ID:ihRsmIdQ
>>309
データ形式にも依る
どんなデータで現状はどうやってコピーしてる?
0317デフォルトの名無しさん2014/11/27(木) 14:45:59.91ID:ihRsmIdQ
>>315
存在の確認なんてムダだと思うんだが?

エラー起きても良いじゃん
On Error ステートメントじゃダメなの?
0318デフォルトの名無しさん2014/11/27(木) 15:18:53.28ID:5OfvJX0B
>>316
主に定数が多い名簿のようなデータです。
現状、マウスでコピペです。
0319デフォルトの名無しさん2014/11/27(木) 15:37:55.39ID:yVYX1THh
>>317
On Errorはなにが原因でエラーになったか不安になるだろ。
コード的にも美しくないし。
アルツハイマーでもこれくらい分かる。
0320デフォルトの名無しさん2014/11/27(木) 15:42:04.54ID:r+bsdp9/
>>315程度のことがわからないのに、コードの美醜がわかると思ってる傲慢さ
0321デフォルトの名無しさん2014/11/27(木) 16:08:31.06ID:tn51YXgS
>>319
エラーコード変数に格納しておけばいいんじゃね?
で、error.logってテキストで吐き出すようにしておくと。
0322デフォルトの名無しさん2014/11/27(木) 16:15:26.53ID:ihRsmIdQ
>>318
コードが書けないなら現状のマウスでコピペの手順をマクロ記録してみたら?

マウスで範囲選択する代わりに最大行を調べるコードにすれば便利になるよ

>>319
原因は判るでしょ逆に何で判らない?
必要なら「ファイルがありません」等の状況に応じたメッセージ出せるし

オレはエラー処理なしでマトモな動作するコードは書けないと思ってる
必要悪なのは承知してるけど
0323デフォルトの名無しさん2014/11/27(木) 16:49:02.48ID:mieEo3n5
>>319
エラー内容はErrオブジェクトの値で判断できるんだから
何が原因でというよりも、
どんな処理を実行しているときにってことが知りたいんだろ?

プロシージャの先頭辺りでただ漠然と
On Error ……
ってやってたらわからないけど、
必要な部分の直前で
On Error ……
を書いて、その部分が終わった直後に
On Error Goto 0
でエラートラップを解除すればエラーを拾う場所は特定できる。
(少なくとも関係ない場所でエラーが出てもトラップされない。)
それでもなお困るとは思えん。
03243182014/11/27(木) 18:05:13.50ID:5OfvJX0B
>>322
数万行のデータを範囲選択して 別ブックにコピペしようと
するとリソース不足って出て失敗する事があります。
VBAなら上手く行きますか?
0325デフォルトの名無しさん2014/11/27(木) 19:52:27.10ID:HmdQywrO
>>324
数百行ずつ100回に分けてコピーすりゃうまくいくんでない?
VBAはそういうめんどくさい仕事を自動でやらせるためにある
0326デフォルトの名無しさん2014/11/27(木) 19:59:47.43ID:omIZS9ZA
単純コピペならBook1内で、

Sheets("Sheet1").Copy After:=Workbooks("Book2").Sheets(1)

でダメなの?

範囲選択してリソース不足になるんなら、
同じ処理VBAでやっても同じでしょ
0327デフォルトの名無しさん2014/11/27(木) 20:01:49.56ID:AF5mtHqX
>>315
VBAに限定すると

ファイルが存在しているかどうかならDir関数
ただし、Dirで存在を確認したからっといって、そのファイルが必ず開ける保障はないので
どっちにしろエラー処理は必要だが

シートが存在するか調べる関数はたぶんないから、自作するしかない
全部のシートをチェックして一致するかどうか見ればいい
こっちはチェックしたシートが操作できない可能性は低い
0328デフォルトの名無しさん2014/11/27(木) 20:29:08.49ID:xl4clNpl
>>313
とりあえずまともな継承が使える。
RecordSetの代わりになるDataTableには抽出機能やSort機能がある。
て言うかIenumerableを実装したクラスならLinqを使ってSQLまがいなことが出来る。
マルチスレッドで処理を行ったり、元々API使わなければ出来ないようなことも出来たり、
相当夢が広がりんぐになるよ。
俺は頭悪いから使えるようになるまでかなり時間が掛かってるし、まだ全然理解してないけど、
すぐに使いこなせる自信があるならVBA.Netになった方が絶対恩恵受けられるよ。
0329デフォルトの名無しさん2014/11/27(木) 20:33:01.66ID:ihRsmIdQ
>>324
工夫すれば負担をかけない方法は色々ありますよ
>>325氏のように分けるのも効果的だし
ループさせ1行ずつコピーしたり
0330デフォルトの名無しさん2014/11/28(金) 06:52:52.99ID:62Au/G56
頭ごなしにVBA.NETを否定してる奴は、単にVB.NET言語を理解できないバカ
頭ごなしにVBA.NETに肯定的なこと言ってる奴も、個人レベルのことしか考えてない視野の狭いバカ

ここまで浸透している業務アプリのマクロ言語となると、切り替えはもちろんだが
追加して選択的に両言語が使えるようにするだけでも大きな混乱を招く
0331デフォルトの名無しさん2014/11/28(金) 07:02:16.25ID:x9xMvfJn
否定も肯定もできない意志の弱いバカ
0332デフォルトの名無しさん2014/11/28(金) 07:37:08.54ID:0L0QhUWo
根拠もなく混乱を招くというふつうのバカ
0333デフォルトの名無しさん2014/11/28(金) 07:37:50.17ID:/lIybkv/
上から目線したかっただけでしょ w
その器量があるようには見えないけど
0334デフォルトの名無しさん2014/11/28(金) 08:16:36.93ID:HA42UZYd
>>328
そういう恩恵はVBAでは必要とされていない。
0335デフォルトの名無しさん2014/11/28(金) 08:41:37.51ID:GUHvCaBA
マルチスレッドだけ欲しいかも
0336デフォルトの名無しさん2014/11/28(金) 12:10:16.25ID:/lIybkv/
>>335
マルチスレッドは一番難しいかも
複数のセルを同時に変更したらどうするのかとか、計算式の結果の格納とセルの変更が競合したらどうするとか考えないといけない
まあ、実装はなんとかなると思うけど、VBA オンリーの人だと色々トラブルだろうな
0337デフォルトの名無しさん2014/11/28(金) 12:31:21.63ID:olxTTeEH
>>336
> 複数のセルを同時に変更したらどうするのかとか、計算式の結果の格納とセルの変更が競合したらどうするとか考えないといけない
普通は、UIスレッドからのみUIを操作できるってパターンだけど、その縛りがあるとVBAで
スレッド使う意味がかなり限定されるな。
0338デフォルトの名無しさん2014/11/28(金) 18:28:17.67ID:GUHvCaBA
2010あたりから組み込み関数はマルチスレッドだよね
せめてユーザー定義関数だけでも・・・
0339デフォルトの名無しさん2014/11/28(金) 18:43:28.76ID:C1hXI+5q
>>338
その場合は
マルチスレッドでの競合意識したユーザ定義関数にする必要があるんだが
けっこう敷居高いぞ、それ
0340デフォルトの名無しさん2014/11/28(金) 19:17:15.24ID:GUHvCaBA
ユーザー定義関数だから引数のみから答えを導出するんだよ
競合は無いね
0341デフォルトの名無しさん2014/11/28(金) 20:00:19.00ID:6eiFFNy/
1シートあたり数百数千項目を数十シートに書き込むマクロなんかでパラレル処理したら早いけど早いだけか
何に使うの
0342デフォルトの名無しさん2014/11/28(金) 20:42:10.06ID:GUHvCaBA
"ユーザー定義関数"が何を指すのか調べて下さい
0343デフォルトの名無しさん2014/11/28(金) 21:55:30.18ID:/lIybkv/
>>340
いいか悪いかはべつにして、普通にグローバル変数使えるし
03443182014/11/28(金) 22:01:59.06ID:CY3skMeN
vbaの開発でexcelでもvisual studioの開発環境やデバッガが使えればなあと
思う事は有るなあ。
0345デフォルトの名無しさん2014/11/28(金) 22:44:55.00ID:MA7LQcix
>>344
マウスでコピペしてるのに?
笑わせるなw
0346デフォルトの名無しさん2014/11/29(土) 08:10:36.79ID:MLVwofmR
MSがVBA廃止してVBA.NETってのになったら、
多分多くの企業は有料のMS Officeやめて無料のLibreOfficeとかに移ると思うけど
今まで有料でもMS Office使ってたのはVBA資産があったからだし
0347デフォルトの名無しさん2014/11/29(土) 09:02:36.27ID:IDbtpam7
資産どうのと言うのであれば、VB6からVB.Netに変わったときみたいにコンバージョン付ければいいんだよ。
あの時はコンバートがバカだの使いものにならないだのボロクソに言われてたから、もう少し頭のいいやつにして。
無料の奴はサポート付くか分からないし、セキュリティの問題もある。
0348デフォルトの名無しさん2014/11/29(土) 11:56:16.85ID:dW+5zpcN
>>346
多分こいつは Excel 2007 でグラフ回りが結構変更されたことも知らないんだろうな
0349デフォルトの名無しさん2014/11/29(土) 16:46:46.97ID:yS7vjpnd
>>347
おまえが「もう少し頭のいいやつ」になるのが先じゃね?w

自分(VB.NETが使える奴)だけの狭い視野で考えると、そういう結論に至りやすいが
問題は旧VB系の言語しか使えない奴等への救済措置

旧VB系からVB.NET系への変換は、変換機能がマシになれば問題ないが
VB.NET系から旧VB系への変換は、変換不可能な部分(機能、命令)があるので
そうなると、「VB.NET系から旧VB系へ変換して編集、またVB.NET系に変換して実行や保存」
ってことは出来ないことになるので、旧VB系の状態でないと編集できない奴等は手を出せなくなる

引きこもって、自分のパソコンも自分の作ったファイルも自分しか使わないって環境にいると
そういう配慮まで気が回るような頭が育たないのかも知れないが、実社会では
バカへの救済措置を用意して上手くバカを働かせないと、自分がというか出来る奴ばかりが苦労することになるからね
0350デフォルトの名無しさん2014/11/29(土) 17:33:49.44ID:qtB00H10
>>349
お前より頭が悪いやつはそうそう居ないから安心しろw
0351デフォルトの名無しさん2014/11/29(土) 17:46:17.64ID:A9a31mA5
>>349
上から目線のバカ w
0352デフォルトの名無しさん2014/11/29(土) 18:04:17.37ID:8i/Dd6Cf
>>348
業務システムでVBAを使ってグラフを操作してる企業の割合
その変更に伴うシステム改修の労力

これらがVBA→VB.NETへの移行問題と同列視して語るべき内容とはとても思えないけど
0353デフォルトの名無しさん2014/11/29(土) 18:54:51.52ID:A9a31mA5
>>352
だから、知らないなら黙ってろって
0354デフォルトの名無しさん2014/11/29(土) 20:33:44.77ID:IDbtpam7
>>349
平たく言うと勉強したくないと言うことね。
そちらが言う通り、もっとグローバルな目で見ると企業なら.Netへの移行は新しい仕事を生み出すから、
それだけお金が廻るようになるし、お金がない企業は元のVBAを使い続けるだけのことになる。
そちらこそ、自分個人のパソコンとか随分視野が狭いんじゃない?
VB.Net→VBに戻すとか言ってるけど、VBのは元々あるんだから変換の必要なんかないよね。
手が出せなくなるなら、手が出せるように勉強すればいいじゃない。
ここにはN-Basic系から構造化言語のVBに来た人だっているでしょ?同じことだよ。
何だかんだといちゃもん付けてるけど、
要は自分が勉強したくないから救済して欲しいと言ってるようにしか見えないよ。
0355デフォルトの名無しさん2014/11/29(土) 22:06:50.01ID:FQc4stZT
>>349
>VB.NET系から旧VB系への変換は、変換不可能な部分(機能、命令)があるので
>そうなると、「VB.NET系から旧VB系へ変換して編集、またVB.NET系に変換して実行や保存」
>ってことは出来ないことになるので、旧VB系の状態でないと編集できない奴等は手を出せなくなる

よく知らないなら喋らない方がいいよ。
0356デフォルトの名無しさん2014/11/30(日) 00:29:31.03ID:KCUjo1S/
>>353
的外れな指摘で恥かいたからって逃げてんじゃねーよ池沼w
0357デフォルトの名無しさん2014/11/30(日) 04:40:09.06ID:e750u2fd
>>354
×平たく言うと勉強したくないと言うことね。
○自分は既にVB.NET使ってるから問題ないが、周りが勉強してくれないから困る
0358デフォルトの名無しさん2014/11/30(日) 07:02:20.05ID:OJevsDrZ
>>357
周りって何?.Net知らない人が.Net対応するの?
対応メンバー選抜する時に最初から.Netやる気のない人外せば済む話なんじゃないの?
何でそれがExcelが.Net化して欲しくない話に繋がるのか分からない。
.Netやる気のない人は旧VBAのまま使い続ければいいだけじゃない。
周りの人のせいにしちゃダメだよ。
0359デフォルトの名無しさん2014/11/30(日) 07:14:15.76ID:B2VgLsUL
あ、互換性がなくなってホクホク?
0360デフォルトの名無しさん2014/11/30(日) 07:40:06.09ID:OJevsDrZ
クラス単位ならVBからVB.Netへの移行でも互換性は有ったよ。VB6名前空間にいる。
個人的には余り使うのは好きじゃないけどね。
理由はVBがN-Basicの互換性のためにアポストロフィの代わりREMでコメントが書けちゃったり、
GOSUBが使えて増長なコードでも許されちゃったりするのと同じ。
.NetでもまだGoto分が使えるけど、まず使わないし使ったこともない。
0361デフォルトの名無しさん2014/11/30(日) 08:03:37.04ID:t4/3aPOf
>>356
はあ、使ってないから知らないんだろ?
その時結構書き直しが発生してるのに、Libre に移るとかアホすぎだろ w
0362デフォルトの名無しさん2014/11/30(日) 14:39:34.47ID:NJ4/BTsa
>>361
>>352を100回読めよ池沼w
2003→2007への移行対応なら何度もやったわw
0363デフォルトの名無しさん2014/11/30(日) 14:59:49.29ID:v5kZpHtK
>>362
何回やってもアホはアホのまま w
>>352 に Libre 関係ないしな
0364デフォルトの名無しさん2014/11/30(日) 16:16:44.13ID:NJ4/BTsa
>>363
>>>352 に Libre 関係ないしな
いくらなんでも読解力無さすぎだろお前
0365デフォルトの名無しさん2014/11/30(日) 16:45:50.41ID:2Rbrido6
>>364
ごめんね、アホの言うことまで理解する気はない
なので、いちいち説明しなくていいからね、どうせ言い訳かこじつけだろうしな w
0366デフォルトの名無しさん2014/11/30(日) 17:21:01.00ID:Z3WHdujO
また逃げたw
2003→2007の変更と今回の論点は全然次元が違うという単純なことすら理解できないアスペは大変だなw
もしくは途中で気付いて恥ずかしくなったからごまかしてるのかw
0367デフォルトの名無しさん2014/11/30(日) 17:53:35.79ID:+efjZbrT
いつまで自演www
0368デフォルトの名無しさん2014/11/30(日) 19:17:03.33ID:CJTIqzdj
>>366
で、Libre はどうしたんだよ w
0369デフォルトの名無しさん2014/12/01(月) 20:17:26.06ID:ykcKtApb
(^o^)ノ< 殺しあえー
0370デフォルトの名無しさん2014/12/03(水) 23:57:30.22ID:ySBhQlBv
「VBAエキスパート」という資格は取る価値がありますか?
http://vbae.odyssey-com.co.jp/index.html
0371デフォルトの名無しさん2014/12/04(木) 02:07:30.44ID:OvWei3Mc
自己満足のためには良いかも知れないが
就職で有利になるとか期待するな
0372デフォルトの名無しさん2014/12/04(木) 08:15:12.88ID:wTkc/yZH
>>370
ないよ。

むしろ、下手に取ると君が困ることになると思うよw
プログラミングの世界なんて実力オンリーの世界だから。こんなもの取っても
実力ある事の裏付けにはならんからね。他の糞みたいなPC関連資格全般に
言えるがね。
0373デフォルトの名無しさん2014/12/04(木) 08:56:02.35ID:WjQOLJdF
就職なんかで「VBAが使える」という条件の募集があればいいけど、そんなの見たことないし、
あったとしても「使えます」って言うだけでOKだろうから、まあ実用性はゼロだな
0374デフォルトの名無しさん2014/12/04(木) 10:04:06.15ID:mUaAsPlW
VBA初心者です
『シート「条件指定」のD11〜19に書かれている番号にあてはまる顧客情報を、シート「住所録」から抽出する』
ということをさせたいのですが、矢印の部分が違うらしく、動作しません ここからどうすればよいのでしょうか

Sub ラベル印刷()
Dim 業種 As String
Dim 職種 As String
Dim 都道府県 As String
Dim 番号 As String
(略)

業種 = Worksheets("条件指定").Range("D5").Value
職種 = Worksheets("条件指定").Range("D7").Value
都道府県 = Worksheets("条件指定").Range("D9").Value
番号 = Worksheets("条件指定").Range("D11:D19").Value ←
With Worksheets("住所録").Range("A1").CurrentRegion
項目セル数 = .Columns.Count
If 業種 <> "" Then
.AutoFilter Field:=11, Criteria1:=業種
End If
If 職種 <> "" Then
.AutoFilter Field:=12, Criteria1:=職種
End If
If 都道府県 <> "" Then
.AutoFilter Field:=3, Criteria1:=都道府県 & "*"
End If
If 番号 <> "" Then
.AutoFilter Field:=1, Criteria1:=番号
End If
Set 抽出データ = .SpecialCells(xlVisible)
End With
(文字数制限のため以下略)
0375デフォルトの名無しさん2014/12/04(木) 10:21:37.97ID:WZ0IBH7+
>>374

Dim 番号 As String
   ↓
Dim 番号 As Variant

で動くかもしんない、だめかもしんない
0376デフォルトの名無しさん2014/12/04(木) 10:33:57.98ID:mUaAsPlW
>>375
出来ませんでした…
If 番号 <> "" Then 
の所で引っかかります
0377デフォルトの名無しさん2014/12/04(木) 11:00:10.97ID:WZ0IBH7+
>>376

If 番号 <> "" Then
  ↓
If 番号(1) <> "" Then

とかかなぁ、
それかいっそのこと、このIfなくしちゃうとか。(もちろん対応するEnd Ifも消す)

あと、使ってるExcelのバージョン教えてくれ
このコードもしかすると2007以降でしか動かないかもしんない。
0378デフォルトの名無しさん2014/12/04(木) 11:06:12.62ID:WjQOLJdF
>>374
とりあえずエラーが出ないように直してみたが、これで正解かどうかは保証しない

番号 = Join([TRANSPOSE(条件指定!D11:D19)], "")  ←
0379デフォルトの名無しさん2014/12/04(木) 11:14:24.13ID:mUaAsPlW
>>377
番号(1)にしても駄目でした
番号関連のIfは依頼主が「いちいち他人の住所や職種なんて覚えてられないから付けてくれ」といって付けたものなので外せないものなんです
住所録に同じ苗字の人もいるので…

Excelのバージョンは2013です
0380デフォルトの名無しさん2014/12/04(木) 11:23:25.27ID:mUaAsPlW
>>378
動きましたが、1と3を入力したら顧客番号13の人が出てきたり、
同じように1と3と5を入力したら出てこない といったようになってしまいます
0381デフォルトの名無しさん2014/12/04(木) 11:28:44.58ID:WZ0IBH7+
>>379
いや、ためしにIf抜いてみて、それで動けばそこから次に進めるかなと、
まずは動くようにしてから修正するのもひとつの手だよね。

あと、どうだめなのかエラーメッセージそのまま書いてくれない?
0382デフォルトの名無しさん2014/12/04(木) 11:40:34.32ID:WjQOLJdF
>>380
オートフィルターは条件を2つしか指定できないけど、3人以上入力した時はどうするつもり?
0383デフォルトの名無しさん2014/12/04(木) 11:41:58.28ID:mUaAsPlW
>>381
おっしゃる通りです 申し訳ありません
エラーメッセージですね
最初>>374の時には「実行時エラー '13': 型が一致しません。」
>>375も「実行時エラー '13': 型が一致しません。」
>>377の時は「実行時エラー '9': インデックスが有効範囲にありません。」
と出ました
0384デフォルトの名無しさん2014/12/04(木) 11:42:27.73ID:WjQOLJdF
>>380
じゃあ、これは?
番号 = Join([TRANSPOSE(条件指定!D11:D19)], ",")  '←

最終的に何がやりたいのか、(略)のところで何やってるかわからないと、正解はなかなか出てこない気がする
0385デフォルトの名無しさん2014/12/04(木) 11:44:25.60ID:WjQOLJdF
>>381
文字列型変数に配列(セル範囲)を代入してるんだからエラーになるのは当然だろ
いちいちエラーメッセージ見なくてもそれぐらいわかれよ
0386デフォルトの名無しさん2014/12/04(木) 11:47:40.74ID:mUaAsPlW
>>382
オートフィルターは条件を2つしか指定できないということを忘れていました…
それ以外の方法がいいんですね
0387デフォルトの名無しさん2014/12/04(木) 11:50:43.25ID:IvoRpalY
>374
Excel2007以上なら これでいい気がする
(確かめてないので動かんかったらゴメン)

If Join(番号) <> "" Then
.AutoFilter Field:=1, Criteria1:=番号 , Operator:=xlFilterValues
End If

参考
オートフィルタを使い倒す
http://officetanaka.net/excel/vba/tips/tips155.htm
Join関数
http://officetanaka.net/excel/vba/function/Join.htm
0388デフォルトの名無しさん2014/12/04(木) 11:54:42.41ID:mUaAsPlW
>>384
「顧客名簿」のシートから条件を満たす情報を抽出し、「印刷名簿」のシートにコピー
その後「ラベル」のシートを新たに作成し、その「ラベル」のシートに「印刷名簿」にある情報を住所など必要なものだけ取り出して貼り付ける
…というマクロを組みたいのです
0389デフォルトの名無しさん2014/12/04(木) 11:57:24.50ID:mUaAsPlW
>>381
書き忘れていました
番号関連のIfを外せば動きます
0390デフォルトの名無しさん2014/12/04(木) 12:02:31.63ID:mUaAsPlW
>>384
番号 = Join([TRANSPOSE(条件指定!D11:D19)], ",")
と書き換えてみたところ、条件に合致する情報がないと出てしまいました
(抽出できる情報が0のときこう出るようにしてあります)
0391デフォルトの名無しさん2014/12/04(木) 12:05:47.30ID:udPHhaEX
Access使えば?
0392デフォルトの名無しさん2014/12/04(木) 12:43:17.07ID:mUaAsPlW
>>387
「構文エラー」と出てしまいました
番号 = Worksheets("条件指定").Range.("D11:D19").Value
のところが赤くなってしまいます
0393デフォルトの名無しさん2014/12/04(木) 12:48:51.47ID:/ICVjWXd
AdvancedFilter
でよくね?
0394デフォルトの名無しさん2014/12/04(木) 12:56:38.08ID:mUaAsPlW
>>387
申し訳ありません Range の後に. 入れてました
修正して試してみましたが型が一致しないと出てしまいました
0395デフォルトの名無しさん2014/12/04(木) 13:00:14.72ID:hhBXBLyI
>>382
Excel 買い直せよ
0396デフォルトの名無しさん2014/12/04(木) 13:07:22.45ID:IvoRpalY
>>39
Dim 番号 As Variant

かな?
03973962014/12/04(木) 13:08:50.86ID:IvoRpalY
アンカ 間違えた
>>394
です
0398デフォルトの名無しさん2014/12/04(木) 13:13:40.53ID:mUaAsPlW
>>396
試してみましたが
If 番号 <> "" Then
のところで引っかかってしまいます
0399デフォルトの名無しさん2014/12/04(木) 13:24:57.25ID:WZ0IBH7+
>>398
え?
もしかして

Dim 番号 As Stringでやってたの?

>>375でも書いたじゃんか

Dim 番号 as Variant はこのコードの書き方だと絶対に外せない大前提だよ。

Variant型なら配列で宣言しなくてもOKだけど
String型で宣言するなら配列変数として宣言しなきゃダメ

そうじゃないとRange.("D11:D19")の範囲の値を格納出来ないよ。
0400デフォルトの名無しさん2014/12/04(木) 13:27:24.81ID:mUaAsPlW
>>397
あ、なるほど
修正して試してみましたが、「プロシージャの呼び出し、または引数が不正です」
と出てしまいました
If Join(番号) <> "" Then
の所で引っかかってしまいます
0401デフォルトの名無しさん2014/12/04(木) 13:31:12.79ID:Xbcc7r/A
>>374,396
オートフィルターの部分、自動記録で試してみたけど数値ではダメみたいですね。
ActiveSheet.Range("$A$1:$D$16").AutoFilter Field:=1, Criteria1:=Array("1", "3", "5"), Operator:=xlFilterValues
のように記録されました。ためしにVariant変数aryに ary = Array("1", "3", "5") とセットし、
〜 Criteria1:=ary 〜
とすれば同じようにフィルターがかかるものの、 ary = Array(1, 3, 5) で〜 Criteria1:=ary 〜
とやっても、該当なしの状態になってしまいました。
条件を記録したセル範囲D11:D19の9個の値をひとつずつ調べ、数値ならば配列に「文字として」
加えるというややこしいことをする必要があると思います。
0402デフォルトの名無しさん2014/12/04(木) 13:31:29.36ID:WjQOLJdF
>>395
うちは2010だけど、2013だと増えてるの?
0403デフォルトの名無しさん2014/12/04(木) 14:18:36.65ID:wTkc/yZH
>>402
2010から色々と変更入ってるから、それ以前と比べるとメジャーアップデートに
なるからねぇ。アクセスなんかも同じく。
04044012014/12/04(木) 14:32:20.29ID:Xbcc7r/A
>>374,396 これでどうですか?
Dim wk As String, i As Integer, ary As Variant
Set c = Worksheets("条件指定").Range("D11") '←条件のある基準位置
wk = ""
For i = 0 To 8 '←9回繰り返し
 If IsNumeric(c.Offset(i, 0).Value) Then '←縦方向に見ていって数値なら
  wk = wk & c.Offset(i, 0).Value & "," '←条件(の文字列)に加え
 End If
Next i
ary = Array(Split(wk, ",")) '←splitでバラして配列へ
で、.AutoFilter Field:=1, Criteria1:=番号の代わりに
.AutoFilter Field:=1, Criteria1:=ary, Operator:=xlFilterValues
としてみてください。null値も配列に入ってしまいますが検索には影響ないみたいです。
0405デフォルトの名無しさん2014/12/04(木) 14:55:57.82ID:mUaAsPlW
>>404
すみません、冒頭のものは Dim 番号 As Variant のところに代わりに入れ、
.AutoFilter Field:=1, Criteria1:=番号 は 
.AutoFilter Field:=1, Criteria1:=ary, Operator:=xlFilterValues に書き換えればいいのですか?
上のように書き換えてみたら「型が一致しない」と出てしまいました
If 番号 <> "" Then のところで引っかかります
04064042014/12/04(木) 15:12:18.32ID:Xbcc7r/A
>>405
If IsNumeric(c.Offset(i, 0).Value) Then を
If c.Offset(i, 0).Value > 0 Then に変更 と
If 番号 <> "" Then を
If Len(wk) > 1 Then に変更してやってみてください。
番号 は配列なので、ひとまとめに何かと判断はできないと思います。
Len(wk) とすることで、条件となる番号の値を , で連結した文字列の長さを調べ
(何かひとつでもあれば , も付加しているから)2文字以上あるので、
番号でもフィルターをかけることになります。
IsNumeric(c.Offset(i, 0).Value) のままだと、Null値もwkに組み込まれてしまうので
c.Offset(i, 0).Value > 0 に変更しました。
0407デフォルトの名無しさん2014/12/04(木) 15:27:00.77ID:mUaAsPlW
>>406
丁寧にありがとうございます…!
が、今度は「Range クラスの CurrentRegion プロパティを所得できません」と出てしまいました
With Worksheets("住所録").Range("A1").CurrentRegion
の所で引っかかります
0408デフォルトの名無しさん2014/12/04(木) 15:32:36.52ID:DGTsH29e
泥縄
04094062014/12/04(木) 15:34:05.23ID:Xbcc7r/A
>>407 それは>>404,406の変更とは関係ない部分だけど
補足ですが、Dim 番号 の部分と
番号 = Worksheets("条件指定").Range("D11:D19").Value は不要です。
セル範囲から直接 番号 というVariant変数に入れる代わりの
ary = Array(Split(wk, ",")) なので。
0410デフォルトの名無しさん2014/12/04(木) 15:40:05.37ID:mUaAsPlW
>>408
確かに行き当たりばったりの頼りっきりです
自分のできる範囲での修正は>>374まででした
スレ汚し申し訳ございません

>>409
関係ない範囲でしたか
丁寧にありがとうございました
0411デフォルトの名無しさん2014/12/05(金) 13:22:23.97ID:idtToX3B
会社で便利なマクロをいっぱい作っているのですが
朝9時から夕方6時までずっとExcelは起動しっぱなしです。

やっぱりマクロのコードのオブジェクト変数は
使ったら必ず「Set obTest=Nothing」と書いたほうがよいのでしょうか?

このへん上級のプログラマなら
VBAでガベージコレクションがどう機能してるかについて詳しいはずだから
答はでているのでは?とも思いますが。

ちなみにいまは会社ではExcelは一日中立ち上げてるので
動作がかなり遅くなることはよくあります。
オブジェクト変数を解放していないのが原因かは不明ですが。
0412デフォルトの名無しさん2014/12/05(金) 13:44:40.83ID:y8yZ0uzg
毎度恒例荒らしのネタ乙
0413デフォルトの名無しさん2014/12/05(金) 14:04:38.97ID:qokOqO79
>>411
VBAにガベージコレクションは無いし、メモリ使いすぎかどうかは自分でタスクマネージャで確認できる。
0414デフォルトの名無しさん2014/12/05(金) 14:40:33.85ID:idtToX3B
>>413
ありがとうございますわ。
じゃあオブジェクト変数は必ず解放する、ということですね。
特にExcelを常時立ち上げて使っている場合には。
0415デフォルトの名無しさん2014/12/05(金) 14:46:39.79ID:idtToX3B
標準モジュールの最上部で定義した変数は、時間がたっても全然クリアされないけど
フォームモジュールの最上部で定義した変数は、そのフォームを閉じるとすぐクリアされるようです。

これは最近発見しました。

このようなことを解説しているVBAの本はないですか?
0416デフォルトの名無しさん2014/12/05(金) 17:33:32.53ID:qokOqO79
>>414
> じゃあオブジェクト変数は必ず解放する、ということですね。
そんなこと誰も言ってない。

> このようなことを解説しているVBAの本はないですか?
"VBA 変数 寿命"でググれ馬鹿。
0417デフォルトの名無しさん2014/12/06(土) 02:05:18.80ID:meclvZqO
vbaのガベージコレクションは参照カウンタとどこかで見たことある
0418デフォルトの名無しさん2014/12/06(土) 03:17:22.00ID:KAAv60LG
>>415
それなー。
フォームってよく分からないよね。
シートは記述した値はいつまでもシート上に残っているけど、
フォームは1度閉じて再表示するとそこに張り付いているラベルやテキストボックスにコードで記述した内容は消えてしまう。
そもそも型なのかObjectなのかもよく分からない。
生成しなくて使えるってことは多分もう既にObjectなのか、Sheardっぽい型なんだろうけどさー、
閉じたら解放されちゃうんだよねー。
Sheardっぽい型なら閉じて解放ってことはないはずだし、
Objectなら解放されればVE上から消えちゃうはずだし、一体何なんだろうね。
0419デフォルトの名無しさん2014/12/06(土) 03:32:12.46ID:KAAv60LG
ごめん。自己解決した。Asで指定できるんだからやっぱり型だよね。で、多分Static領域にいるんだろうけど、
フォームを閉じるとクリアされるのはスコープから外れるためだね。
だとしたらモジュール単位で設定したPublicな変数なら解放されないはず。試してないけど。
0420デフォルトの名無しさん2014/12/06(土) 10:23:22.72ID:6wz6oznt
>>418
フォームはオブジェクトだろ。
フォームだってHideで閉じる(非表示にする)だけなら値保持してるでしょ。
Unloadするとインスタンスごと無くなるから値も保持されなくて当然。
シートだってブックだってオブジェクトだから削除したら値は保持されない。
0421デフォルトの名無しさん2014/12/06(土) 10:36:04.16ID:d81glEJQ
>>418-420
なんかすごいことを語ってますね。
プログラミングの「肝(キモ)」と呼ばれるみたいな感じの重要なことを。
そんな概念を体系的にできるだけ短期間で学ぶにはどうしたらよいでしょうか?
0422デフォルトの名無しさん2014/12/06(土) 12:46:58.75ID:1n3ui4f5
基本情報レベルの知識から、どうやったらVBAを作れるかを考えたら
自ずと分かってくるような気がする。
0423デフォルトの名無しさん2014/12/06(土) 13:18:03.33ID:IILEH88a
>>420
>Unloadするとインスタンスごと無くなるから値も保持されなくて当然。

・・・オブジェクトとインスタンスの違いって何だと思ってる?
0424デフォルトの名無しさん2014/12/06(土) 14:31:33.70ID:QyME+XO/
異論反論とカップヌードル
0425デフォルトの名無しさん2014/12/06(土) 14:43:50.08ID:KAAv60LG
>>423
同じものだよね。俺も>>420見たとき「それってまんま型のことじゃん」って突っ込みそうになったわw
0426デフォルトの名無しさん2014/12/06(土) 15:03:44.67ID:5q9uOkJS
インスタンスとオブジェクトの意味は違う。
0427デフォルトの名無しさん2014/12/06(土) 15:57:34.76ID:GWwYeJcu
おれも一緒かと思ってたわ
0428デフォルトの名無しさん2014/12/06(土) 16:17:23.21ID:QyME+XO/
オブジェクト型言語でプログラミングする場合のオブジェクトと
VBAでよく使うファイルオブジェクトとか正規表現オブジェクトなんかのオブジェクトは微妙に違う
0429デフォルトの名無しさん2014/12/06(土) 16:20:50.34ID:QyME+XO/
そもそもCreateObjectがややこしい
CreateするのはInstanceじゃないのかって
0430デフォルトの名無しさん2014/12/06(土) 16:30:13.79ID:KAAv60LG
クラスとインスタンスの両方を含めて広域の意味でObjectと言うことはあっても、
>>418からの流れで>>420が広域の意味で言ってるようには見えないけどね。
0431デフォルトの名無しさん2014/12/06(土) 21:20:45.60ID:KAAv60LG
>>421
出来るだけ短期間で覚えようなどと考えないこと。
早くポイントだけで覚えようとすると、必ず穴が発生する。
苦労して覚えたものでないと身につかないこともあるし、
稀に苦労なく覚える奴もいるが、苦労して覚えていない分だけ
苦労して覚えた奴の痛みが分からないから、相当嫌らしいねちっこい性格になることが多い。
0432デフォルトの名無しさん2014/12/06(土) 21:38:26.97ID:d81glEJQ
>>431
近くにいる誰かにねちっこくいじめられているのですか?
0433デフォルトの名無しさん2014/12/06(土) 21:53:05.78ID:KAAv60LG
>>432
いや、どっちかって言うとそう言う奴の鼻っ柱をへし折る方が好き。
虐めることもそう言うこともあまりしないけど。
0434デフォルトの名無しさん2014/12/06(土) 21:57:41.23ID:QyME+XO/
あんまりしないのか
たまにでも人を虐める奴ってどうなんだろうね
0435デフォルトの名無しさん2014/12/06(土) 22:02:16.38ID:KAAv60LG
あまりしないと言うとたまにしていることになるのか。日本語って難しいね。
0436デフォルトの名無しさん2014/12/06(土) 22:25:18.73ID:d81glEJQ
>>435
そういう勘違いは
まれによくあるよ
0437デフォルトの名無しさん2014/12/07(日) 00:14:35.42ID:XZYuQeDa
次の文のうち、文として誤りのあるものはどれか(配点:2点)

1、インスタンスをunloadする
2、インスタンスが無くなる
3、オブジェクトをインスタンスする
4、インクジェットが無くなる
5、インスタンスのオブジェクト
6、オブジェクトのインスタンス
0438デフォルトの名無しさん2014/12/07(日) 00:37:24.48ID:Nmnb+TJR
>>437
4は正確には「インクジェットのインクが無くなる」だろうけど、
ふつうに「あのハゲが今日は休みだって」って使うから問題ないな。(「ハゲの人が」の意味)

5も正確には「インスタンスの元となるオブジェクト」という意味で
昔、歴史ものの「映像の世紀」というビデオシリーズがあったから問題ない。(「映像が記録として残るこの20世紀」みたいな意味)

よって誤りのあるものはない。
0439デフォルトの名無しさん2014/12/07(日) 04:41:17.12ID:j5OxQRAU
3?

意味は通じるけどインスタンスは名詞だから、
オブジェクトをインスタンス化する、か、
オブジェクトからインスタンスを生成する、と言わないと駄目っぽい。
0440デフォルトの名無しさん2014/12/07(日) 05:37:49.34ID:j5OxQRAU
>>418
>Sheardっぽい型なら閉じて解放ってことはないはずだし、

Sheardという言葉を使うということは.Netもやってるね。
なら違和感を感じて当り前だろうね。
フォームは生成しても使えるし、しなくても使える特殊なクラスなんだよ。
.Netのときは最初、明示的にクラスのインスタンスとして生成しなければならなかったけど、
VB6を使ってたユーザーがその概念についてこれなかったため、VB2005で復活したらしい。
実際スタティックエリアに展開され、生成すればヒープエリアにも展開される。
これも.Netからして見れば、旧VBで言うところのRemやGoto、Gosubと同じように負の遺産の一つだろうね。
0441デフォルトの名無しさん2014/12/07(日) 08:39:10.28ID:bjrsFApG
>>437
文法と意味合いを厳密に見れば全部間違ってるし
文法としてではなく文として現場で通じるかを見るなら
どれも間違ってるとまでは言えない

全ての選択肢が、誤りとも問題ないとも解釈できるような設問をしているようでは
君にはまだこういう設問は早すぎるってことなので、もうすこし(かなり?)精進してからにしなさい
0442デフォルトの名無しさん2014/12/07(日) 08:41:45.40ID:Nmnb+TJR
DoEventsを使ってるコードを見たのですがこれの存在意義はなんですか?なにもしていないようなのですが・・・
0443デフォルトの名無しさん2014/12/07(日) 08:48:11.76ID:Nmnb+TJR
Sleepの関数を似たようなところに使ってることもあるのですがこれの存在意義もなんですか?
0444デフォルトの名無しさん2014/12/07(日) 08:53:29.29ID:/ebnx2XJ
DoEventsとSleepの質問を定期的に書き込むお仕事ご苦労様です
0445デフォルトの名無しさん2014/12/07(日) 09:43:19.17ID:Nmnb+TJR
?
0446デフォルトの名無しさん2014/12/07(日) 10:19:23.59ID:5ewwReDb
Windowsの仕組みとして、マウスとかによる画面操作とか、画面描画だとかって、
メッセージを受信する仕組みが有って、そこでメッセージ受けることで処理し、
「それが終われば」次のメッセージ受信に戻るという仕組み。

だから、非常に長時間掛かる処理をやってしまうと、
そのメッセージを受信するという処理に戻れないんで、
アプリが固まったようになってしまう。

DoEventsって、実はメッセージを受信する処理になっていて。
非常に時間が掛かる処理の所々に入れておけば、アプリが固まらなくなるんだ。

まあ、本来の、「処理が終わって元に戻ってから行われる処理」を強引にさせる方法なんで、
推奨出来ないけどなw
0447デフォルトの名無しさん2014/12/07(日) 10:22:56.05ID:5ewwReDb
Sleepはアプリの動作を一定時間完全に止めてしまう仕組み

何か待ちが発生する処理で、ぐるぐるループを回しているとアプリが重いんで、
一定間隔毎に処理させて軽くすることに使われる
0448デフォルトの名無しさん2014/12/07(日) 10:49:08.22ID:Nmnb+TJR
>>446-447
なるほど。
DoEventsだけだと現代高速CPUは1秒間ですら莫大な数のループをするので例えばSleep100で1秒に10回にしてCUPを休ませるということですね。
そうしますと、Sleepだけではメッセージ受信に戻れないのでSleep入れるならDoEventsも必ず入れるべきということですね?
あとSleep5000とかしてしまうと5秒間は固まってしまうからSleep使うなら短時間にすべきということですよね?
0449デフォルトの名無しさん2014/12/07(日) 11:26:39.64ID:5ewwReDb
まあ、そういうことだな
0450デフォルトの名無しさん2014/12/07(日) 17:01:05.25ID:+uraxybP
寒くてVBAを書く気にならないのですが一体どうすれば良いのでしょうか?
0451デフォルトの名無しさん2014/12/07(日) 17:57:49.02ID:ZkM66KCO
知るか
0452デフォルトの名無しさん2014/12/07(日) 19:28:15.37ID:uEfZnt+R
暖房も無いとこでコード書いてるのか。ブラックどころじゃねーな
0453デフォルトの名無しさん2014/12/07(日) 21:28:46.75ID:lg2HGHJt
B3〜B8に書かれている文字をE列に書かれている文字でフィルターするようにしたいので
下記のソースを書いたのですが2つ目からフィルターが上手くかかりません。
どこが悪いのかヒントを頂けないでしょうか

Sub Macro1()
Dim place As String
Dim add_place As String
Dim num As String

nom = 3
place = "*" & Sheet1.Range("E" & nom) & "*"


Do
Sheet1.Range("$B$2:$B$8").AutoFilter Field:=1, Criteria1:=Array( _
place), Operator:=xlFilterValues
nom = nom + 1
If Sheet1.Range("E" & nom) = "" Then
Exit Do
Else
add_place = "*" & Sheet1.Range("E" & nom) & "*"
place = place & """,""" & add_place
End If
Loop

End Sub
0454デフォルトの名無しさん2014/12/07(日) 23:10:14.18ID:tdyePqfX
>>453
自分は古いVersionのExcelだからテスト出来ないけれど
Do
Debug.Print place
・
・
といれてみると分かると思うけど

placeの値が
*a*
*a*","*b*

みたいに2回目から変な所に " が入ってるけど これいいの?
0455デフォルトの名無しさん2014/12/07(日) 23:58:33.27ID:lg2HGHJt
>>454
マクロを記録したソースだと
"a","b"
となっていたのでこう書きました
0456デフォルトの名無しさん2014/12/07(日) 23:59:05.45ID:lg2HGHJt
>>454
お礼を書き忘れました
ありがとうございます
0457デフォルトの名無しさん2014/12/08(月) 01:17:17.48ID:zferDdK7
>>453
間違いが多すぎてヒントを書くのが面倒なので、元のプログラムに比較的近い形でとりあえず動く状態のコードを書いとく
何がやりたいのか不明なので、これが正解とは限らない
とりあえず変数名numを全部nomとタイプミスしてるので、これぐらいは自分で見直した時に気付こう

Sub Macro1()
  Dim place() As Variant  ' フィルター条件が3個以上の場合はVariant型の動的配列を使う *2007以降
  Dim num As Integer  ' Stringでも動くけど数値型の方がいいと思う
  ReDim place(1)

  place(0) = Sheet1.Range("E3")
  num = 4  ' 3は(おそらく)決定なので4から始める
  Do While Sheet1.Range("E" & num) <> ""  ' ループの条件はここに書く。Exit Doは使わない
    ReDim Preserve place(num - 2)
    place(num - 3) = Sheet1.Range("E" & num)  ' 条件に配列を使う場合はワイルドカードは使えない
    num = num + 1
  Loop
  Sheet1.Range("$B$2:$B$8").AutoFilter Field:=1, Criteria1:=place, Operator:=xlFilterValues  ' フィルターの設定は最後、ループの外にした方がいい

End Sub
0458デフォルトの名無しさん2014/12/08(月) 01:38:55.44ID:zferDdK7
改良案、E3もLoopに入れた方が短くなる
Sheet1を削ってもいいかどうかは状況による

Sub Macro1()
  Dim place()
  Dim num
  
  num = 3
  Do While Range("E" & num) <> ""
    ReDim Preserve place(num - 2)
    place(num - 3) = Range("E" & num)
    num = num + 1
  Loop
  Range("$B$2:$B$8").AutoFilter Field:=1, Criteria1:=place, Operator:=xlFilterValues
End Sub
0459デフォルトの名無しさん2014/12/08(月) 01:50:59.63ID:vn62uG8D
IfRange(a1) > 100 Then

  MsgBox "命令2"

Else

  MsgBox "命令1"

End If

とし
A1の数値を1を入力して実行した場合と110を入力して実行した場合では表示スピードに差はありますでしょうか?
厳密に考えますとElse以下に書いた場合1処理ぶん遅延が生じるかと思うのですが実際の所どうなのでしょうか?
0460デフォルトの名無しさん2014/12/08(月) 02:52:41.18ID:zferDdK7
>>459
差はあるけど、どっちが速いか遅いかは不明
前にたまたま別の言語で内部を調べた時は、処理の順番の関係でElse以下の方が速くなるようなコードになっていたので、
条件を逆に書いて、速くしたい方をElseに書くようにしていたこともある

そもそもMsgBoxは人間が認識する物だから、ディスプレイのリフレッシュレート未満の差は物理現象として現れない可能性が高いからまず知覚できないし
MsgBoxを別の計算式か何かに置き換えて、1000万回ぐらいループすれば違いを調べられるかも
0461デフォルトの名無しさん2014/12/08(月) 04:23:39.43ID:1cPOmeTv
理論的にはどちらかの方が早い可能性はある
だがそもそも、そのPCで動いてるのはそのVBAだけではないので
その程度の違いを1000万回やろうと有意な差が観測できるとは思えん
0462デフォルトの名無しさん2014/12/08(月) 08:49:04.27ID:rsIczcHG
>>459
多分逆。110の方が早いかな。
理由はILとして考えたとき、最初に条件分岐命令が走った後、1の場合はElseの所で条件なし条件分岐命令かジャンプ命令がもう一度走る。
1オペランド分1で実行した方が実行命令が多くなるので、その分だけ遅くなるはず。
0463デフォルトの名無しさん2014/12/08(月) 09:38:46.88ID:rsIczcHG
ごめん、先の方が110が入るのか。じゃ1の方が早いな。それとElseのところでと言うと語弊があるな。Elseの直前で、だ。
分岐命令は自分の直下処理を実行しようが飛び先を実行しようが相対的に見た実行アドレスが変更されるだけのはずなので、
処理コストは変わらない。ただし、あまりにアドレスが離れている場合はジャンプ命令に置き換わるのでそうなると
一見110の方が早くなる可能性が考えられるが、結局Elseの直前でまた飛ぶ際に同じ処理コストが掛かることになる。
つまり、110の実行は1の実行より早くなることはないと言うことになる。
0464デフォルトの名無しさん2014/12/08(月) 11:17:58.45ID:zferDdK7
>>462
今のCPUは分岐予測してるから、どっちが速いかなんて機械語を見ただけじゃ単純には判断できない
0465デフォルトの名無しさん2014/12/08(月) 11:35:29.15ID:28cVONtB
へ、分岐予測ww
0466デフォルトの名無しさん2014/12/08(月) 11:54:54.12ID:zferDdK7
簡単なテストをしてみた
Excel2010、Win7、Core i5の環境で、他のアプリの影響も考慮して1千万回テスト
ワークシートのA列にThen側の実行時間、B列はElse側、C列に時間差を並べてみた
C列がプラスならThenの方が速い、マイナスならElseの方が速い

結果、Then側のが優勢だった

ちょっと長くなったんで、コードはここに
https://friendpaste.com/B8C0vX1H4Qm4dtoCunusE
0467デフォルトの名無しさん2014/12/08(月) 18:21:21.79ID:LnH9IdQj
1000万回でも一瞬で終わるような処理の微少な差異を突き詰める意味あるのかな
0468デフォルトの名無しさん2014/12/08(月) 19:31:03.63ID:KOL07Oaj
Booleanの値を反転するときに一番シンプルにするにはどうするのっけ?
Dim x as Booleanのとき、x = -xじゃうまくいかん。
0469デフォルトの名無しさん2014/12/08(月) 19:34:10.11ID:eaq2ekGP
Dim s As Boolean
MsgBox s
s = Not s
MsgBox s

は?
0470デフォルトの名無しさん2014/12/08(月) 19:34:16.12ID:0dyzdpGy
x = not x
0471デフォルトの名無しさん2014/12/08(月) 20:06:46.98ID:KOL07Oaj
>>469 ありが
>>470 とうね
0472デフォルトの名無しさん2014/12/08(月) 21:11:49.52ID:KOL07Oaj
配列のオブジェクト変数を解放する呪文はどうするんですっけ?
Dim St() as Worksheetで
Set St = Nothingとするとエラーが出て困ります。
0473デフォルトの名無しさん2014/12/08(月) 21:13:19.06ID:0GVFzRa4
Office2010からAccess由来のカレンダーコントロールがつかえなくなったみたいだけど、
代替手段として何かオススメはありますか?
ざっと数えても100以上のツールでカレンダーコントロールを利用してるもので困ってます
0474デフォルトの名無しさん2014/12/08(月) 21:27:21.47ID:UQyYYQHa
>>472
Erase St
0475デフォルトの名無しさん2014/12/08(月) 21:37:34.13ID:KOL07Oaj
>>474
ありがとう
0476デフォルトの名無しさん2014/12/08(月) 21:39:44.99ID:KOL07Oaj
印刷するときどんなにシートを広く使ってても1ページにする方法は知ってますが
もし縦長なら縦長印刷に、横長なら横長印刷にするにはどうすればいいですか?
つまりシートのUsedRangeで縦と横の長さの値を知りたいのですが。
0477デフォルトの名無しさん2014/12/08(月) 21:44:32.43ID:KOL07Oaj
単純に
Activesheet.Usedrange.Width
Activesheet.Usedrange.Height
でいいんかな
0478デフォルトの名無しさん2014/12/09(火) 09:12:31.77ID:FKA2NevI
フォームのボタンを
長方形ではなく丸(○)くしたいのですが方法はありますか?
0479デフォルトの名無しさん2014/12/09(火) 09:19:55.31ID:FKA2NevI
Do〜Loop文で
WhileとUntilの違いって
「While (条件文)」はそのまま使うとして、「Until (条件文)」は「While Not (条件文)」と同じじゃないですか?
0480デフォルトの名無しさん2014/12/09(火) 09:22:10.59ID:FKA2NevI
つまりUntilは混乱のもとだから
Do〜Loop文使うならUntilは廃止して「While Not (条件文)」に統一したほうがプログラミング哲学的に好ましくないか?
0481デフォルトの名無しさん2014/12/09(火) 09:49:50.35ID:UPvUDhoa
>>480
哲学とか言い出すのは大学生ぐらいの若者特有の思考だな
大人の世界には「過去のしがらみ」ってのがあって、簡単には効率化できないんだよ
そういうのを嫌って「ぼくの考えた新しい言語」を作ってるやつが世界中にいっぱいいるから、まあ、がんばれ
0482デフォルトの名無しさん2014/12/09(火) 09:51:32.88ID:UPvUDhoa
>>478
画像クリックをボタンの代わりにする
0483デフォルトの名無しさん2014/12/09(火) 10:06:11.42ID:FKA2NevI
>>482
もし丸い画像を作ってそれを配置してもクリックは四隅の丸のエリア外もクリックできてしまうのでは?
0484デフォルトの名無しさん2014/12/09(火) 10:08:52.95ID:FKA2NevI
色の定数(vbYellowとかrgbGrayとか)がありますが、
こういう関数は作れませんかね?難解かもしれませんが。

[引数]=色のRGB値 as Long
[出力]=色の定数の文字列 (存在しなければ空白値) as String
0485デフォルトの名無しさん2014/12/09(火) 10:16:14.29ID:FKA2NevI
列挙型XlRgbColorのメンバの文字列の一覧が取得できればいいのですが
0486デフォルトの名無しさん2014/12/09(火) 11:04:46.50ID:1BV7kvVs
>>485
いちいち上げんな

XlRgbColor Enumeration (Excel)
http://msdn.microsoft.com/en-us/library/office/ff197459.aspx
0487デフォルトの名無しさん2014/12/09(火) 13:39:15.67ID:UPvUDhoa
俺の予想
「定数の一覧をコピペするんじゃなくて、コードで取得したいんですよね」
0488デフォルトの名無しさん2014/12/09(火) 14:01:14.31ID:FKA2NevI
↑そのとおりおみごと。
その一覧をもとに変換するとしたら
元データであるこの定数を常にどこかに保存しておいてそれを毎回参照しないといけないじゃないか。

そうではなくこのenumであるXlRgbColorのメンバをコードから取得できない?
そうすれば元データを用意する必要がないだけでなく誰かが誤って元データを改ざんしたりする心配もなくなる。
0489デフォルトの名無しさん2014/12/09(火) 14:06:21.32ID:FKA2NevI
ついでに下の2つの画面から選択できる色って
すべて色定数があるかどうか調べるにはどうしたらいいと思う?

http://pds.exblog.jp/pds/1/200810/31/99/a0074899_1723918.gif
http://pds.exblog.jp/pds/1/200810/31/99/a0074899_1745063.gif
0490デフォルトの名無しさん2014/12/09(火) 14:47:07.16ID:XhkuuQ4F
負の範囲の指定の仕方をおしえて
0491デフォルトの名無しさん2014/12/09(火) 15:13:10.80ID:L9Kvawn8
>>484
どうにかしてXlRgbColorに定義されているもの一覧を取得できるかもしれないけど、
文字列には変換できないだろうね。

どうしてもやりたければ
if (myColor = XlRgbColor.rgbAliceBlue) {
  colorName = "Alice Blue"
} else if (myColor = XlRgbColor.rgbAntiqueWhite) {
...
} else if ...
ってずらずら書けばいいんじゃないの?
0492デフォルトの名無しさん2014/12/09(火) 15:15:06.13ID:L9Kvawn8
>>489
> すべて色定数があるかどうか調べるにはどうしたらいいと思う?
マクロを記録しながら一個一個全部選択して、そのコードを参考にしてXlRgbColorに存在するかどうか調べるしかないんじゃない?
0493デフォルトの名無しさん2014/12/09(火) 15:39:52.16ID:yvdA+Yxe
Excel2013なのですが、ワークブックA.xlsxにUserForm1を作成しています。
そしてA.xlsxの標準モジュールに

sub test()
workbooks.open B.xlsx
workbooks.open C.xlsx

userform1.show vbModeless

end sub

とあったとすると、実行した場合にB.xlsxがUserForm1より前面に表示されてしまいます。
(読込み終わりを待たないでフォームを表示するんですね…)
Userform1を最前面に表示することは出来ないでしょうか?
0494デフォルトの名無しさん2014/12/09(火) 16:14:17.44ID:wx8M0Aqf
APIで最前面にする方法はある
ってか、「ユーザーフォーム 最前面 」でぐぐりゃでてくる
0495デフォルトの名無しさん2014/12/09(火) 16:23:05.15ID:UPvUDhoa
定数の文字列がないとソースを解釈してコンパイルできないんだから、どこかには一覧が記録してあるはず

Excel 2010でちょっと探してみたら定数はexcel.exeの中に直接全部書いてあったんで、
exeファイルをバイナリモードで開いてrgbという文字列を頼りに取り出すしかないと思うよ
0496デフォルトの名無しさん2014/12/09(火) 16:27:31.02ID:UPvUDhoa
>>483
Excelのユーザーフォームにはボタンの形状を変える機能がないので(APIにはあるけど)
小さい画像をたくさん並べるぐらいしかないと思う
極端な話、1ドットの画像をずらっと並べれば、当たり判定をどんな形にもできる
あとは作成の手間と「角クリックを排除する」必要性とのトレードオフ
0497デフォルトの名無しさん2014/12/09(火) 16:45:45.20ID:L9Kvawn8
>>495
> 定数の文字列がないとソースを解釈してコンパイルできないんだから、どこかには一覧が記録してあるはず
タイプライブラリから直接情報を取れんこともない。ちょっと古いが以下を参照。
http://support.microsoft.com/kb/239930/ja
でも、>>491の方が簡単だと思うんだけど・・・。
0498デフォルトの名無しさん2014/12/09(火) 19:05:26.20ID:yvdA+Yxe
>>494
APIしかないですかね。
ありがとうございます。
0499デフォルトの名無しさん2014/12/09(火) 19:38:29.50ID:UhKI3ccj
>>488
プログラム(コーディング)で使うためなら、元データはすでにExcelの中に用意されてるので普通に使える
実行時にプログラムで値から列挙名を取得したとして、今度はそれを使う方法がないぞ

>>492,495
自分でずらずら書くなら、列挙の中身はヘルプに全部書いてある

>>497
COM公開されてるんだからタイプライブラリから取れるだろうなとは思ったが
簡単にやる方法は無いと思ってたんだが

やってみようと思ったが、tlbinf32が無いわw
VBに付属のモジュールなんだな
0500デフォルトの名無しさん2014/12/09(火) 19:39:38.11ID:UhKI3ccj
>>493
再現しないな。うちではB.xlsxの読込まつぞ
ホントにそれだけのコードで再現するか?
試しにユーザーフォーム表示させてから別のブックOpenしても、ユーザーフォームが上に表示されたままだったけど
0501デフォルトの名無しさん2014/12/10(水) 00:43:52.35ID:SulW7Jeq
そもそも2013では拡張子がxlsxでもマクロ有効なのか?
2007と2010でマクロ使うならxlsmとかxlsだったけど。
0502デフォルトの名無しさん2014/12/10(水) 01:06:20.73ID:mcnoKCOa
Ribbonに tab1 と tab2 を追加する tab1.xlam と tab2.xlam があり
GetEnabledMacro関数をそれぞれに実装しています。
単体でxlamを動かせば問題ないのですが、
両方をExcel2010に読み込むと、後から読み込んだほうの xlam内のGetEnabledMacro
がどちらのtabからも呼ばれます。
その結果、最初に読み込んだxlamが正しく動きません。何がおかしいのでしょうか?
0503デフォルトの名無しさん2014/12/10(水) 01:32:31.36ID:gB1mLCDs
>>501
BとCはマクロで開かれるだけだからマクロ無効の普通の形式で問題ない
openの引数は文字列だから""で囲めとか細かい間違いはあるけど

Aは開いてマクロ追加してから保存するまではそのままで行けるんじゃね、わからんけど
0504デフォルトの名無しさん2014/12/10(水) 01:40:50.40ID:gB1mLCDs
>>502
GetEnabledMacroってなんの関数だ?ググったけど
GetEnabledMacro関数 に一致する情報は見つかりませんでした。
だってよ
日本語でググって全くヒットしない関数の話なんか知らんわ
その関数を作ったやつに聞け
0505デフォルトの名無しさん2014/12/10(水) 07:05:27.06ID:H03252qo
>>504
名前と実装しているという文言から普通に考えて自作関数だろ。
悪いがそれは流石に読解力が無さ過ぎると言わざるをえない。
0506デフォルトの名無しさん2014/12/10(水) 07:34:55.31ID:KOm0EyPs
だから、作った奴に聞けってことだろ
読解力ないのはお前だよ w
0507デフォルトの名無しさん2014/12/10(水) 13:14:55.89ID:gB1mLCDs
>>502
もしかして関数名とか関係なくて
複数のブックのリボンで中身違うのにonActionに同じコールバック名称付けたって話か?
だったらonAction="tab1.xlam!なんちゃら"とかやれば区別できるだろ

中身同じなら引数でどっちから呼ばれたか区別して処理する方法もあるけど
0508デフォルトの名無しさん2014/12/10(水) 16:21:39.15ID:Q/okYjD3
VBAが良く判ってないのですが
エクセルで式を使ってプログラムを作りたい場合はここで相談していいんでしょうか?
0509デフォルトの名無しさん2014/12/10(水) 16:31:13.43ID:DQcC3z6C
>>508
式って?
セルに、=A1+A2 とか設定するヤツならスレチだよ
0510デフォルトの名無しさん2014/12/10(水) 16:35:20.40ID:SulW7Jeq
>>508
質問の内容次第だけど、
VBAを全く使わないならこっちの方がより適切かもしれない。

Excel総合相談所 115
http://peace.2ch.net/test/read.cgi/bsoft/1411803873/l50

ただ、どっちのスレも回答してる人達はきっと被ってると思う。
0511デフォルトの名無しさん2014/12/10(水) 16:36:09.76ID:Q/okYjD3
>>509
う、スレチかもしれません。
そういう内容ってどこで聞けばいいんでしょう?
エクセルで検索したらここしか出てこなかったもので・・・
0512デフォルトの名無しさん2014/12/10(水) 16:38:01.80ID:Q/okYjD3
>>510
入れ違った・・・
ありがとうございます!こっちで聞いてみます!!
0513デフォルトの名無しさん2014/12/10(水) 19:57:48.83ID:mcnoKCOa
>>507
そういう事でした。ありがとうございました。
0514デフォルトの名無しさん2014/12/10(水) 23:53:53.52ID:NXPpi5N5
1台目PC Windows8.1 Excel2010
2台目PC Windows7 Excel2010

昨夜のWindowsアップデートを行いましたら、2台のPCの全てのExcelファイルで
ActiveXコントロールが全て無効な状態(ボタンを押しても反応しない、新しく挿入しようとしても
"オブジェクトを挿入できません"とエラーメッセージが出る)になってしまいました
セキュリティセンターの設定でActiveXの設定を有効にしていても効果ありません
ググっても似たような報告は見つけられなかったのですが、こんなことってあるんでしょうかorz
0515デフォルトの名無しさん2014/12/11(木) 02:16:33.92ID:yUzIzryH
それUpdateのバグだからアンインストールか復元とかやって戻せ
0516デフォルトの名無しさん2014/12/11(木) 03:19:55.61ID:+VVdzRKk
ありがとうございます。
KB2553154をアンインストールしたら元にもどりました。
0517デフォルトの名無しさん2014/12/11(木) 14:34:08.50ID:xek0Kyo1
写真を貼り付けるときに
ActiveSheet.Pictures.Insert "C:\unko.jpg"
とすると出来ますが、
なぜこのPicturesというプロパティやInsertというメソッドは[F2]キーで表示できるオブジェクトブラウザには出ていないのですか?
0518デフォルトの名無しさん2014/12/11(木) 14:35:59.73ID:MEHNlY4y
>>517
うんこ って書くのをやめたまえ
0519デフォルトの名無しさん2014/12/11(木) 16:19:38.59ID:xek0Kyo1
フォーム表示時にシートをいじれるかどうかを設定するのに
vbModalとvbModelessがありますが
なぜvbModalとvbModalessじゃないんですか?
そもそも英語はどうなってる?
0520デフォルトの名無しさん2014/12/11(木) 16:26:02.97ID:FGgppI6Q
MSの人が書き間違えたんだよ。
0521デフォルトの名無しさん2014/12/11(木) 16:29:29.51ID:xek0Kyo1
そうだったのか。
0522デフォルトの名無しさん2014/12/11(木) 16:51:13.03ID:xek0Kyo1
次のお題です。
ActiveworkbookとActivewindowの違いはなんですか?

Activeworkbook.NameでもActivewindow.Captionでも、同じファイル名を返すようですが。
0523デフォルトの名無しさん2014/12/11(木) 21:00:19.99ID:6omyhiW1
>>522
Activeworkbook.Name
MDI
Activewindow.Caption
SDI用だな
使い道は知らん
0524デフォルトの名無しさん2014/12/11(木) 22:40:09.61ID:xek0Kyo1
>>523
なるほどさっぱり分かりませんね。難解です。
0525デフォルトの名無しさん2014/12/11(木) 22:48:56.24ID:xek0Kyo1
フォームのことについてだけど、下のようにコードからボンボンとボタンなどを好きなだけ増やせそうです。
でもこれらのコードから作ったControlのイベントプロシージャはどこに書いておけばいいんでしょうか?

Sub unko()
UserForm1.Show vbModeless
UserForm1.Controls.Add "Forms.CommandButton.1"
UserForm1.Controls(0).Top = 0
UserForm1.Controls.Add "Forms.CommandButton.1"
UserForm1.Controls(1).Top = 30
UserForm1.Controls.Add "Forms.CommandButton.1"
UserForm1.Controls(2).Top = 60
UserForm1.Controls.Add "Forms.CommandButton.1"
UserForm1.Controls(3).Top = 90
UserForm1.Controls.Add "Forms.CommandButton.1"
UserForm1.Controls(4).Top = 120
End Sub
0526デフォルトの名無しさん2014/12/11(木) 22:57:24.22ID:JyGms1TH
VBAのコードでVBEを操作してコードを書き込む。
通常は初期状態ではVBAからVBEを触れないはず

参照設定だかセキュリテイ設定かな。参照設定ってVBAから参照はできた気がするけど、参照設定の追加とかってできたっけ?出来るきはする。検索してみて。
0527デフォルトの名無しさん2014/12/11(木) 23:07:00.23ID:JyGms1TH
質問。
cmdの結果を取りたいときって、shell() してcmdの出力ファイルを待ってから開くか、wscript.shell(だっけ?)のstdoutを取るか、どっちがいいかな
0528デフォルトの名無しさん2014/12/11(木) 23:22:31.36ID:JyGms1TH
完全に後者でしたほんとうにありがとうございました
何年もさわってないと忘れますね
0529デフォルトの名無しさん2014/12/11(木) 23:26:22.30ID:JyGms1TH
dim hoge =
まで書いてカーソルを別の行に移動したときにコンパイルエラーが出るんだけど消せないの?順次コンパイルのチェック外したんだけど…
0530デフォルトの名無しさん2014/12/11(木) 23:27:17.21ID:eHyMAcvc
>>525
WithEventsで変数宣言してそれのプロシジャに書く
0531デフォルトの名無しさん2014/12/11(木) 23:29:40.13ID:JyGms1TH
自動構文チェックだった
0532デフォルトの名無しさん2014/12/11(木) 23:36:06.69ID:xek0Kyo1
DoEventsがOSに制御を戻すためということなら
もしそれを書かなければOSに制御はうつらない、つまりExcelしか操作は反応しないということですよね?
でも実際はマクロ実行中でもWindowsのいろんな操作ができるのはなぜですか?
0533デフォルトの名無しさん2014/12/11(木) 23:43:17.76ID:5nkJCwun
>>532
doeventsはexcelのプロセスがosからメッセージを受け取る為のもの。
0534デフォルトの名無しさん2014/12/11(木) 23:47:00.86ID:401ndRx0
>>532
DoEventsは長時間処理中に溜まってるメッセージを消化して応答無しを回避する為だよ
OSに制御を返すのもあるけど元々時分割でマルチプロセスを実現していてそれを明示的に指示出来るってだけの話
0535デフォルトの名無しさん2014/12/12(金) 00:16:16.79ID:6bzSKgAd
with a
with .b
ここでaを使うにはどうしたらいいですか?
0536デフォルトの名無しさん2014/12/12(金) 00:20:11.40ID:gSBC8bLc
>>532
今のWindowsはアプリから強制的に処理を移すからだよ
昔のWindowsだとOSの操作もできなくなってた
0537デフォルトの名無しさん2014/12/12(金) 00:22:33.09ID:gSBC8bLc
>>535
普通にa= とか a. とかって書くだけだが
0538デフォルトの名無しさん2014/12/12(金) 01:26:00.85ID:6bzSKgAd
>>537
間違えました
#構成例ココカラ
a
 + .b()
  + .x
  + .y
  + .z
#構成例ココマデ
with a.b()
with .x
ここから b() にです
.parent.y とか、../.y 的な記述はありませんか
0539デフォルトの名無しさん2014/12/12(金) 01:34:03.31ID:gSBC8bLc
>>538
普通にa.b(). って書くだけだが
>.parent.y とか、../.y 的な記述はありませんか
ない
その段階で.parentって書くとx.parentに評価されるんだから
xがparentってプロパティを実装して正しく親を返せば.parent.yは行けるだろうけど
0540デフォルトの名無しさん2014/12/12(金) 01:51:24.60ID:6bzSKgAd
>>539
ないんですか。
with a.b() 内でa.b().xとa.b().yの両方を利用したい場合は、どちらかをsetするか、
with .xとwith .yをブロックを分けて書かないといけないんですね。
どうもです。
0541デフォルトの名無しさん2014/12/12(金) 07:22:29.80ID:Znidw3Lc
>>532
Windows3.1時代は、アプリが固まったらOSも他のアプリも全部固まっていたけど、
Windows95以降は強制切り替えなので、固まるのはそのアプリだけ。

DoEventsがOSに制御を戻す、というのは理解がちょっと違っていて。
まず、アプリ毎にメッセージの受付箱というかメッセージキューというものが有って、
マウスでアプリをクリックした、アプリ画面を再描画しろ、というのがOSからどんどん放り込まれてくる。
OSは放り込むだけなので、アプリがどう固まろうが関係無い。

で、アプリは一つ一つの処理が終わり次第そこを見に行って、次の処理を行うという仕組みなので、
一つの処理に時間がかかり過ぎたら、マウスにも反応しない、描画も更新出来ない、ということになる。
DoEventsは、こっそりとそのキューを見に行って、次に溜まっているメッセージを読み出して、
そのメッセージが来たときの処理を呼び出してくれる仕組み。
0542デフォルトの名無しさん2014/12/12(金) 08:28:33.02ID:zyd3uKh1
先日のWin updateのActiveXが動かないという不具合のせいで、
その部分の作り直しをさせられた。

おお神よ、なぜあなたは請負で業務アプリをExcelで作るなどという
意味不明な試練をお与えになったのでしょうか。
0543デフォルトの名無しさん2014/12/12(金) 08:53:01.30ID:IqSVvB5z
>>541
は?

Windows9xは、全てのOS巻き込んで落ちますが?何寝言言ってんの?
0544デフォルトの名無しさん2014/12/12(金) 08:56:22.91ID:Znidw3Lc
>>543
今は固まる仕組みの話をしている。

巻き込んで落ちるというのはプロセス空間が完全に分離されていないことから起こる
別問題。
0545デフォルトの名無しさん2014/12/12(金) 09:45:19.56ID:FHJtCtiF
Cells.SpecialCells(xlCellTypeLastCell)
これでシートの「最後のセル」を取得したいときがまれによくありますが1つ問題が。

「最後のセル」を含む領域を消して「最後のセル」が変わったはずなのにExcelはまだその変更を認識しないんです。
(ちなみに一回ブックを保存すると新しい「最後のセル」を認識します。)
これをちゃんと正しく「最後のセル」を認識させるにはどうしたらいいですか?
0546デフォルトの名無しさん2014/12/12(金) 10:34:39.26ID:bFFFhLfR
ブックを保存すればいいんじゃないかな
0547デフォルトの名無しさん2014/12/12(金) 10:48:24.27ID:FHJtCtiF
>>546
だからそれ以外の方法を探しているのです
0548デフォルトの名無しさん2014/12/12(金) 10:53:32.97ID:FHJtCtiF
次のお題いかせていただきます。

セルに入ってる文字列で使われている色を調べたいときはまれにあると思います。
もし1色しか使われていなければCells(r,c).Font.Colorで簡単に取得できます。
しかし複数色のとき、例えば文字列が「B:oo S:o O:oo」でBが青、Sが黄、Oが赤、他の部分が黒だと(野球のカウントの例)、青黄赤黒の4色使われています。
このような複数色は上記の方法だとNull値が返されます。

そうではなく、使われているすべての色を配列で返す関数を作ってくださいとお願いすれば、どのような回答がもらえますか?
0549デフォルトの名無しさん2014/12/12(金) 11:56:51.78ID:Ct1lJnrJ
>>548
氏ねクサレキチガイ野郎
0550デフォルトの名無しさん2014/12/12(金) 11:57:26.01ID:tqk13lua
いやどす
0551デフォルトの名無しさん2014/12/12(金) 12:07:10.53ID:79VqDJKC
>>548
自分で作れカス
0552デフォルトの名無しさん2014/12/12(金) 12:12:07.60ID:FHJtCtiF
ここはひどいインターネッツです
0553デフォルトの名無しさん2014/12/12(金) 16:49:00.89ID:7VXeA7iS
エクセル使うな。
0554デフォルトの名無しさん2014/12/12(金) 16:57:09.54ID:IqSVvB5z
>>552
なんで複数形なんですか?
0555デフォルトの名無しさん2014/12/12(金) 19:08:04.28ID:uSyJhMlk
>>548
一つのセルに複数の情報が入っている糞みたいなファイルだから削除しろ
0556デフォルトの名無しさん2014/12/12(金) 21:17:27.12ID:TVjAGH2X
面白おじさんと愉快な仲間達ですか。
楽しそうで裏山です。
0557デフォルトの名無しさん2014/12/13(土) 06:37:20.06ID:15a7//d2
>>548
そういうのは、マクロの記録で作成する手順を録ると
マクロでの作成の仕方だけではなく、取得の仕方も分かるよ

記録されたコードの

何を = どうする

の左右を逆にして左辺を変数にすれば、大抵は状態が取得できるからね
あとはループやカウンタを使ったりの基本ワザで、取得した情報を
配列なりコレクションなりに整えて返すようにすればいっちょ上がり


と、いくら要求が図々しすぎとはいえフルボッコは可哀想だし、ネタっぽい気もするが
自己解決のヒントくらいはあげてみる
0558デフォルトの名無しさん2014/12/13(土) 06:57:40.28ID:Gbz//F/W
答えがないというかVBAの仕様上困難な物ばかりだし、お前ホントは無理なのわかっててからかってるだろ、的に
オレ様の被害妄想には単なる嫌がらせにしか見えないんで叩きたくもなるわ

別パターンで今までに何回かあったやつで、なんだったかの取得が「昔できたけどやり方を忘れたんで教えて」ってやつ
これも勘違いじゃなかったのかってイライラする
一つはシートをアクティブにせずにセル位置を調べる、だっけ
0559デフォルトの名無しさん2014/12/13(土) 07:18:13.44ID:54ajxy39
スルーしとけよ...
0560デフォルトの名無しさん2014/12/13(土) 07:28:01.11ID:6Mt5Z73m
ココはネタと釣りだらけだし
マトモな質問する雰囲気じゃないからw
0561デフォルトの名無しさん2014/12/13(土) 09:00:45.14ID:lSx4ToEV
>>548
Private Sub GetStringColors()
Dim color As Long
Dim colors As Object
Dim stringLength As Integer
Dim stringIndex As Integer
Dim targetRange As Range
Set targetRange = Range("A1")
stringLength = Len(targetRange.Value)
If stringLength = 0 Then
Exit Sub
End If
Set colors = CreateObject("Scripting.Dictionary")
For stringIndex = 1 To stringLength
color = targetRange.Characters(stringIndex, 1).Font.color
If Not colors.Exists(color) Then
colors.Add color, color
End If
Next
End Sub
配列に突っ込むのは自分でやってくれ
0562名無しさん@そうだ選挙に行こう2014/12/13(土) 23:28:38.03ID:MQy+8oYk
マイクロソフトもやってくれるのう。
仕事用の新ツールを土日で作ろうと思ってもボタンもチェックボックスも
「オブジェクトを挿入できません。」になってしまう。
何がOKだ、クソ。
0563名無しさん@そうだ選挙に行こう2014/12/13(土) 23:33:12.09ID:lSx4ToEV
VBAなんて触るのは数年ぶりだけど、組み辛い。ほんっと、組み辛い。
インテリセンスここまで効かないんだっけ。まるでテキストファイルにコード直書きしているような感覚だね。
HashSetどころかDictionaryっぽいものですら参照設定しないと使えないんだよね。
次のOfficeで.Net化してくれないかなぁ。
今のコードが使えてもいいからさ。
0564名無しさん@そうだ選挙に行こう2014/12/13(土) 23:52:24.31ID:8BYd93oO
>>563
ctagsとviでどうでしょうか?
0565デフォルトの名無しさん2014/12/14(日) 00:39:43.30ID:MUB4Xi4q
ボタンなどのオブジェクトはずっとactiveX派でしたが今更ながらフォームに乗り換えることにしました。
・activexに比べフォームはイベントがほとんど無い。changeやclickぐらい(十分といえば十分だけど)。
・コードの記述場所は標準モジュールのみ。
注意する点などはありますか?
0566名無しさん@そうだ選挙に行こう2014/12/14(日) 08:08:53.84ID:gRzcQuQc
>>565
年末にそんな改修して、クリスマスに彼女とデートも出来ないくらい忙しくならないように、かな?
0567名無しさん@そうだ選挙に行こう2014/12/14(日) 09:14:47.89ID:9YzKDTgy
ばっかでー
彼女とサンタとトナカイを信じていいのは小学生までだぞ
0568名無しさん@そうだ選挙に行こう2014/12/14(日) 10:25:16.54ID:GdCQCrA7
彼女の存在を信じないのは彼女を作ったことのないチェリーボーイだけ
0569名無しさん@そうだ選挙に行こう2014/12/14(日) 10:33:52.93ID:9Dg61XIE
If (条件式) Then
  x=a
Else
  x=b
End If

↑こんなコードの塊で5行も使うのが見にくいのでなんとかしてx=○○○のように単純に1行ですましたいのですが、いい方法はありませんか?
特にこういう塊が複数たくさんあると実に読みにくくなる。
ワークシート関数なら「=If(条件式, x, b)」とものすごくシンプルなのになあ。
0570名無しさん@そうだ選挙に行こう2014/12/14(日) 10:34:44.53ID:9Dg61XIE
=If(条件式, a, b)
0571名無しさん@そうだ選挙に行こう2014/12/14(日) 10:53:12.76ID:GdCQCrA7
>>569
IIFが使えるけど、重たいからIFが入った関数を外出しにして、引数と戻り値でやりくりすればいいよ。
0572名無しさん@そうだ選挙に行こう2014/12/14(日) 11:25:53.28ID:9YzKDTgy
>>569
昔の文法で1行にまとめた書き方もある
互換性のために今のバージョンでも使えるけど推奨はされない

If 式 Then x = a Else x = b

この書式では End If がなくなるのがポイント
IIfと違って遅くなることもない。5行に分けるのと処理速度は同じ

あとは、代入する値が一定なら配列にするとか

Dim n (-1 To 0)
n(-1) = a
n(0) = b
x = n(式)
0573名無しさん@そうだ選挙に行こう2014/12/14(日) 11:27:32.20ID:cLCOvUkJ
>>570

x=b
If (条件式) Then x=a

2行で書ける
あと、あげんなボケ  
0574名無しさん@そうだ選挙に行こう2014/12/14(日) 11:32:57.06ID:IU+P2Rml
(`ェ´)ピャー
0575名無しさん@そうだ選挙に行こう2014/12/14(日) 11:34:29.51ID:9Dg61XIE
>>571
IFFはどうやって使いますか?こちらのパソコンでは使えないようなのですが。
それとIFが入った関数を外に出すとはどういうことですか?
0576名無しさん@そうだ選挙に行こう2014/12/14(日) 11:36:54.44ID:9Dg61XIE
>>572
ありがとう。でも奨励されないなら使わないほうが無難ですね。
あと配列の件は返り値は可変なのでそれはダメみたいです。
0577名無しさん@そうだ選挙に行こう2014/12/14(日) 12:03:47.41ID:9YzKDTgy
>>575
IFFじゃなくてIIf
0578名無しさん@そうだ選挙に行こう2014/12/14(日) 12:12:59.09ID:9Dg61XIE
なぜIIFは重いんですか?うちのパソコンでは軽いですが。
0579名無しさん@そうだ選挙に行こう2014/12/14(日) 12:20:14.55ID:9YzKDTgy
>>578
Ifはステートメント、IIfは関数なので、厳密に比較すれば大きな差が出る
複雑な処理で少しでもスピードが欲しい時はできるだけ軽い方を使う

簡単な計算なら違いがわからない
好きな方を選べばいい
0580名無しさん@そうだ選挙に行こう2014/12/14(日) 13:24:38.60ID:NL1GFC6E
>>573
むかし先輩に教わった サイズを減らすのに
0581名無しさん@そうだ選挙に行こう2014/12/14(日) 15:24:33.27ID:cDZUwrOs
>>573
>>572の上のように、Elseまで含めて1行に書いた方が軽いけどね

Elseまで含めて1行に書くと
条件判定1回、最少代入回数1回、最多代入回数1回

>>573だと
条件判定1回、最少代入回数1回、最多代入回数2回

この最多代入回数の差が、処理速度に影響する
もっとも、昨今のパソコンなら、余程回数の多いループ内で使うのでもなければ、
体感での有意差は無いだろうが
0582名無しさん@そうだ選挙に行こう2014/12/14(日) 19:10:52.20ID:GdCQCrA7
>>572
前者のやり方は言ってる通り推奨されてないのと、
後者のやり方はスピードはともかく、可読性が・・・それに暗黙の変換を利用しているので、
.Netに移行するときは苦労することになるし、移行出来たとしてBox化解除が発生するから結局重くなってしまう。
.Netの話はともかく、やっぱり可読性は大事だと思うよ。
0583デフォルトの名無しさん2014/12/14(日) 20:21:33.46ID:9Dg61XIE
>>582
ヒラメいたのですがワークシート関数みたいなのを自作すればいいのでは?
こんな感じで。

Function TorF(b As Boolean, t As String, f As String) As String
If b Then
TorF = t
Else
TorF = f
End If
End Function
0584デフォルトの名無しさん2014/12/14(日) 20:27:21.12ID:gRzcQuQc
うん
0585デフォルトの名無しさん2014/12/14(日) 20:35:36.61ID:9YzKDTgy
>>583
車輪の再発明にすらなってない
標準で入ってるIIf関数そのもの
0586デフォルトの名無しさん2014/12/14(日) 20:43:19.69ID:9Dg61XIE
>>585
わたしの大発見とそのIIF関数ではどっちが速度が速いですか?
0587デフォルトの名無しさん2014/12/14(日) 20:56:27.19ID:gRzcQuQc
>>583
考え方として、その形式ならコードが複雑化しても同じ手法で色々使い回しが効く。
コーディングの基本、「同じコードは2度書かない」に則っているからいいと思う。
そこは速度云々の話ではなくて、「後にいかに修正箇所を特定し易くし、いかに修正を減らし、テスト項目を減らすか」に
繋がる部分で評価できると思うよ。ただし、どうしても速度重視の場合は別の話になるかもしれないけど。
0588デフォルトの名無しさん2014/12/14(日) 21:04:46.27ID:gRzcQuQc
本当は>>571で全く同じことを書いたつもりだったんだけど、ちょっと解り辛かったね。済まんね。
0589デフォルトの名無しさん2014/12/14(日) 23:06:15.62ID:hqFU0UeA
「オブジェクトを挿入できません。」は
コントロールパネル > プログラムのアンインストール > 
インストールされた更新プログラムを表示
> KB2726958 をアンインストール 、再起動 で回復しました。
0590デフォルトの名無しさん2014/12/15(月) 06:34:51.90ID:zp/a3var
http://jp.fujitsu.com/platform/server/primergy/pccluster/excel-hpc/
これって、どういうこと?
どんなVBAでも並列処理できるということでは無いですよね?
Book1.xlsx
Book2.xlsx
Book3.xlsx
に対して同じ処理をする場合に、3つのBookを同時に処理出来るって
言う感じですよね?
0591デフォルトの名無しさん2014/12/15(月) 07:36:57.41ID:Q8QPN9Wb
>>590
同じ処理っていうのがどこに書いてあるのか分からないけど、
それぞれのブックを別プロセスで処理してるか、
計算部をマルチスレッドが使える言語のDLLにでもやらせているんじゃないのかなぁ。
でも、Excelで他のExcelのProjectを統括管理するなんて発想からして糞だから
あまり気にしない方がいいと思うよ。
0592デフォルトの名無しさん2014/12/15(月) 08:01:38.21ID:U2HtOL9B
>>590
適用例として、乱数アルゴリズムによる計算処理、モンテカルロシミュレーション、パターンマッチング、など
決まった計算式を、大量の件数行う必要がある業務って書かれてるだろ。
クラスタシステムのジョブスケジューラにExcelマクロを喰わせて処理してると思う。
複数のマクロを同時に処理するのとは意味合いが違う。
0593デフォルトの名無しさん2014/12/15(月) 08:31:37.74ID:r6OkqYy+
>>591
発想の優劣と、商売になるか、売れるかどうかは別問題だし
0594デフォルトの名無しさん2014/12/15(月) 09:14:54.59ID:4rSnIgMy
>>563
.net化とか、君以外の大多数にとって迷惑なだけなんで、
君がこの世界から消えるといいよ。
0595デフォルトの名無しさん2014/12/15(月) 09:55:48.03ID:U2HtOL9B
井の中の蛙大海を知らず
0596デフォルトの名無しさん2014/12/15(月) 10:12:44.63ID:9vXZmS15
>>590
HPC Services for Excel
http://technet.microsoft.com/ja-jp/library/ff877820(v=ws.10).aspx

基本は、一つのブック中に大量に計算式があれば速くなるって事
どんなVBAでも並列にってわけではないみたいだが
本気でクラスター上でエクセル動かす見たいだな


もはやエクセルは何のソフトかわからん
0597デフォルトの名無しさん2014/12/15(月) 17:50:55.33ID:AZvgNtk+
以前、シート上に挿入したActiveXコントロールを、
VBAから、Thisworkbook.Worksheets("xxx").Oleobjects("yyy").Objectで参照できて、イベントもフック出来てたんだけど、
14/12/09付けのMS Security Update後に、「OleobjectsクラスのObjectプロパティを取得できない」とか言われてしまう。
過去のコード資産を修正するのが大変なので、MS更新を適用したままで、簡単に復旧する方法は無いかな?
0598デフォルトの名無しさん2014/12/15(月) 18:02:07.76ID:ZnoQfTu4
>>597
こことか
http://www.ka-net.org/blog/?p=5099
こことか
http://support2.microsoft.com/kb/3025036/en-us
に当該アップデートをアンインストールしない解決策が書いてあるらしい
05995982014/12/15(月) 18:07:16.61ID:ZnoQfTu4
リンク貼り間違えた
2個目のは英文だったので日本語の奴
(とはいえ機械翻訳だから英文のほうが良いかもしれない)
http://support2.microsoft.com/kb/3025036/ja

あとこっちも
http://yamanxworld.blogspot.jp/2014/12/2014-12-office-vba.html
0600デフォルトの名無しさん2014/12/15(月) 18:18:44.29ID:AZvgNtk+
>>598
レスありがとう
さっき試したけど、そもそもActiveXコントロールを新規挿入できなくなっててワロタ

さっそく教えてもらった
http://support2.microsoft.com/kb/3025036/en-us
のResolution 1を試した(Cドライブ中の「MSForms.exd」を検索して、見つかったのを全て削除した)所、正常に動くようになった!
素晴らしい!憎いぜ!大将!
0601デフォルトの名無しさん2014/12/15(月) 19:30:07.72ID:AZvgNtk+
>>599
本当に助かった、ありがとう、感謝です

ネット記事が出ていることから察するに、本件で多くのVBAerが大慌てだったみたいね(笑)
0602デフォルトの名無しさん2014/12/15(月) 19:37:37.79ID:EgbXsADn
毎度毎度の事ながらMSももう少し慎重にセキュリティアップデート出来んもんか。
個人がフリーソフトをバージョンアップするんじゃないんだからさ。┐(´д`)┌ヤレヤレ
0603デフォルトの名無しさん2014/12/15(月) 20:56:37.35ID:+gNep1xB
EXDファイルの書式バージョン情報の扱いに誤りがあって、
古い書式を新しい書式として扱おうとしてエラーとかそこら辺かなあ。
0604デフォルトの名無しさん2014/12/15(月) 21:32:22.85ID:Q8QPN9Wb
>>594
残念ながら普通に考えて俺がこの世界から消えるより先に淘汰されるのは
新しいことについて行こうとする気もなく、ただ何となく毎日行き当たりバッタリなPGを組んでいる君のように
愚劣なコーダーだと思うけどね。
VBAだって出来る人は整然とした設計を書くし、クラスやインターフェースもより効率的に使っている。
そしてそういうコードは.Netに移行するときもさして苦労しない。
大概そういうことを言い出す人が、ながーいコードをドヤ顔で書いて、
引継ぐ人に多大な迷惑を掛けたり、仕事場から使えない奴として追放されたりするからね。
遅かれ早かれ、VBAは今の形態から変わるときが来るだろうけど、淘汰されるまで楽しい余生を過ごせばいいじゃない。
0605デフォルトの名無しさん2014/12/15(月) 21:54:45.96ID:r6OkqYy+
長文は無能の証明
0606デフォルトの名無しさん2014/12/15(月) 22:36:15.12ID:YzD2lZh5
まだ若いんだろう
今はそれでいいと思うよ
0607デフォルトの名無しさん2014/12/16(火) 00:56:35.86ID:SIeALJ8p
若い?
何をもって若いとするのか分からないけど、始めたのはN-BasicやApple�Uのアセンブラ辺りから。
それで若いと言うことなら若いんだろうね。
ただ、歳をとったことを理由に仕事が出来ないことが正当化されるとか考えちゃってる人は
淘汰されて然るべきとは思うよ。
0608デフォルトの名無しさん2014/12/16(火) 01:03:25.46ID:JFP/SDwk
大したことじゃないんだし名無し相手にムキになるなよ
そんなことよりVBAオブジェクトブラウザ(リファレンス)が
Googleの「もしかして」やブログなんかの「関連記事」、
「関連項目」的な親切さに欠けるんだけど
なんか画期的な解決方法ってあるの?

>HashSetどころかDictionaryっぽいものですら参照設定しないと使えないんだよね
これについて具体的にご指南きぼんぬ
0609デフォルトの名無しさん2014/12/16(火) 01:08:45.93ID:j1n3Al+v
N-BASICをN-Basicなんて書いちゃうあたり・・・
ベテランのふりしたニセモノか、すでにボケた老人か
0610デフォルトの名無しさん2014/12/16(火) 01:46:38.26ID:SIeALJ8p
>>608
?
VBAでVBScriptのDictionary使う以外でキーとして検索するのにもっと有効な手段があるって言ってるの?
>>561で書いたコードは見ての通り、キーしか必要ないからValuePairである必要が全く無いんだけど。
HashSetって言うのはそう言う意味で書いてるんだけど、何をどう指南しろと言ってるのか全く分からない。
0611デフォルトの名無しさん2014/12/16(火) 01:55:47.22ID:JFP/SDwk
>>610
>>Dictionaryっぽいものですら参照設定しないと使えないんだよね
参照設定ってのはCreateObject("Scripting.Dictionary")の事?
VBAコードエディタ>ツール>参照設定 で何か有効にすると、
Dictionary っ ぽ い も の を始めとした様々な
便利な部品が簡単に使えるようになるのかなって読み取ったんだけど、違うの?
違うなら特に用はないや。ごめんね。

エディタの入力候補表示や補完機能がイマイチでコーディング速度が上がらないのよね。
覚えてたらサラサラ書けるんだろうけどさ。
0612デフォルトの名無しさん2014/12/16(火) 02:33:12.41ID:SIeALJ8p
>>611
悪いけど流石に参照設定有効にすると何が使えるようになるかは自分でググってくれ。
Dictionaryっぽいものと書いたのはジェネリックの概念さえない型が担保されないようなものを使うしかないのか、
と言う意味で書いてる。
CreateObjectを使えばどっちにしてもインテリセンスは効かないものの、
そちらが言ってる通りVBAのインテリセンスはちょっと酷い。
そこが改善されるだけでも.Net化の恩恵はあると思うよ。
0613デフォルトの名無しさん2014/12/16(火) 02:58:09.81ID:JFP/SDwk
>>612
参照設定は必要に迫られたら調べますですはい。

のようなもの、ね、理解した。MSDN漁ったりしなきゃいけないのダルいよね、入力補完はね、頑張ってほしいですね。

本音は入力保管が効かなくてもいいからリファレンスで他の項目へのリレーションを強化してほしいですわ。
メンバが対象とするそのエクセル要素に幾らか関連してる別のオブジェクトやメンバを教えてくれよっていう、怠慢なんだけどもw
0614デフォルトの名無しさん2014/12/16(火) 02:59:39.18ID:fVzope2j
IDEの機能と言語仕様をごっちゃにしないでくれ
0615デフォルトの名無しさん2014/12/16(火) 08:04:06.53ID:oqKi7sFg
>>602
Accessでも、昔は読み書きができてたのに、いきなりアプデでリードオンリーに
されて、多くの個人開発者を地獄にたたき落とした過去があるからな。

正直VBAでこの手のオブジェクトが利用できないとなると、相当に価値が落ちる。
VBA殺そうとしてるんじゃないのか?
0616デフォルトの名無しさん2014/12/16(火) 13:59:41.06ID:TLF10F5F
クラスの継承だけでも、.Netみたいになってくれたら、非常にうれしいな−>VBA
もっとも多重継承ができない.Netの仕様は不満
0617デフォルトの名無しさん2014/12/16(火) 19:20:25.85ID:SIeALJ8p
>>616
多重継承は使ったことないな。
C++だっけ。C#で無くなっちゃったからなぁ。
相当めんどくさいと聞いてるけど、選択肢が増えるのはいいことだよね。
ちなみにC#の#って、+が4つってことらしいね。
0618デフォルトの名無しさん2014/12/16(火) 20:37:34.66ID:j1n3Al+v
C++ → Cキ† → C#
0619デフォルトの名無しさん2014/12/16(火) 21:41:23.96ID:rJ4g6hQd
>>617
別に面倒じゃないよ
ダイヤモンド継承の扱いがちょっとややこしいだけ
0620デフォルトの名無しさん2014/12/16(火) 22:33:40.29ID:JqlD4ksE
>>647
>ちなみにC#の#って、+が4つってことらしいね
へー、初耳
だとすると、C#は、インクリメント(++)を2回ということになるのか・・・
C++という名称は、C言語への尊敬の念がこめられているって聞いたけど、
C#は、何のどの辺を尊敬してるんだろう・・・
C++の劣化版という印象しかない・・・
0621デフォルトの名無しさん2014/12/16(火) 22:40:06.69ID:JqlD4ksE
>>618
>キ†
無いでしょ、そんなのw
0622デフォルトの名無しさん2014/12/16(火) 22:42:27.26ID:JqlD4ksE
>>620の>>647は>>617の間違い///
0623デフォルトの名無しさん2014/12/16(火) 22:49:13.18ID:ALAb2Kt/
・win8
・excel2013

stringsを定義付けしたとたん、
「このオートメーションタイプはvisualbasicではサポートされていません」
と表示されました。

以前同じようなマクロを組んだことがあるのですが、そのときはそんな表示は出ませんでした。

ggってみたのですが、正直よくわかりませんでした。
そもそもどういう意味なのですか?それも含めて解決方法を教えて欲しいです。お願いします
0624デフォルトの名無しさん2014/12/16(火) 23:43:05.01ID:8M2kREEd
むしろC++の、オブジェクト指向とは継承だ、的な言語仕様はもう古いかと。
俺もポリモフィズムかインターフェース継承しか使わなくなったし。

継承は結局親子間の結びつきが強固になってしまって、
オブジェクト指向のメリットが消えてしまうからね。
今時のオブジェクト指向は、親子でも他人だという考え方で
別クラスとして処理を移譲する方向。

ちなみに、最近はC++がC#の言語仕様を後追いで取り込んで行ってるらしいな。
LINQとかasync/awaitまで取り込めるか分からんが。
0625デフォルトの名無しさん2014/12/16(火) 23:53:37.08ID:pj6rFb3h
VBAを使用してIEのフォームからファイルをアップロードするのは出来ないってことで確定でしょうか?
0626デフォルトの名無しさん2014/12/16(火) 23:58:54.62ID:1d+izeUl
>>623
> stringsを定義付け
> そもそもどういう意味なのですか?
0627デフォルトの名無しさん2014/12/17(水) 00:01:01.43ID:G/Owp9Dw
文頭に「>>625 には」をつけるなら、確定でいい
0628デフォルトの名無しさん2014/12/17(水) 01:05:53.76ID:AEi19noc
>>624
ちなみにそういったとき、子に当たるクラスを生成させたくないときはどうしてるの?
ほら、継承だと、コンストラクタを隠蔽してしまえば済むじゃない。
0629デフォルトの名無しさん2014/12/17(水) 07:04:00.56ID:JEgKB6R9
>>628
ごめんイメージ出来なかった
生成させたくないというのは例えばどういう状況?
継承に限らず、直接生成されたくないクラスはコンストラクタを隠蔽するだけだが??
0630デフォルトの名無しさん2014/12/17(水) 07:17:49.53ID:AEi19noc
>>629
ごめん逆だ。親に当たるクラスを生成されたくないとき。
0631デフォルトの名無しさん2014/12/17(水) 07:37:32.87ID:AEi19noc
親クラスを継承した子クラスは生成して欲しいけど、親は直接生成して欲しくない場合。
継承関係にあれば親のコンストラクタを隠蔽してしまえばそれが可能になるけど、
委譲となった場合、それをどう制御すればいいのかな?と、思った次第。
0632デフォルトの名無しさん2014/12/17(水) 07:46:57.49ID:JEgKB6R9
期待している回答じゃないかもしれんが

それはポリモフィズムのケース、だよねたぶん。
であれば、現代的にも継承を使って問題無い。

言葉が足りなかったが。
現代的には、ポリモフィズム継承はおkだが、実装の継承は避ける方向。
実装の継承とは、それ自体が生成出来るクラスを継承するパターンね。
0633デフォルトの名無しさん2014/12/17(水) 07:49:02.80ID:JEgKB6R9
ちなみに、ある(子)クラスで、実際の機能は別クラスで作りたいという場合。
自分の場合は、子クラスの内部クラスで作ってしまうかな。
そうすれば他から勝手に使われることが無いし。
06346322014/12/17(水) 08:02:17.36ID:Oe89WU0p
一応。
生成されたく無いクラスには abstract を付けるだけ
0635デフォルトの名無しさん2014/12/17(水) 13:51:26.94ID:GsciMpzG
Sub test()
Dim obj As Object
Dim strAddress As String
Dim strAddress02 As String

Worksheets("sheet1").Activate
Set obj = Worksheets("sheet1").Cells.Find("筋肉", LookAt:=xlPart)
If Not obj Is Nothing Then
strAddress = obj.Address
Do While Not obj Is Nothing
If obj.Value Like "*マン*" Then
strAddress02 = obj.Address
MsgBox strAddress02
End If
Set obj = Cells.FindNext(obj)
If strAddress = obj.Address Then  ←ここでエラー
Exit Do
End If
Loop
Else
MsgBox "見つからない"
End If
End Sub

筋肉 と マン の文字が含まれるセルのアドレスを取得したいと思っています
他にも方法はあるのかもしれませんが、とりあえず上のように組んでみました
が、エラーが出ます。なぜでしょうか
実行時エラー 91 です
06366352014/12/17(水) 14:24:15.18ID:GsciMpzG
カタカナだけの検索だとエラーでないな・・・
例えば
筋肉 と マン じゃなくて
キンニク と マン だとエラーでない
なんでですか?
0637デフォルトの名無しさん2014/12/17(水) 14:31:32.94ID:ESqTV4xV
objがnothingだから
06386352014/12/17(水) 14:37:19.46ID:GsciMpzG
>>637
う・・わからねぇ!
それが片仮名か平仮名漢字かに影響するんですか?
うぅぅわからなぇ!
ちょっと調べてきます
06396352014/12/17(水) 14:45:51.36ID:GsciMpzG
うわ、ますますわけ分からなくなってきた
成功するときとしないときがある事がわかった
Findの方を片仮名にした場合は100%成功
でもFindの方を筋肉にしたときも成功することあり
なんなんだこれは
0640デフォルトの名無しさん2014/12/17(水) 17:19:20.39ID:KbcmbCrB
>>635

ステップ実行しながら変数objの内容を確認してみなよ。
多分、エラー行の直前のFindnextでNothingになるんだと思うよ。
0641デフォルトの名無しさん2014/12/17(水) 18:29:38.03ID:kDCnFlP7
Findnextは曲者だからあまり使わないな。
rangeをそれまでの範囲を除外して再検索する。
0642デフォルトの名無しさん2014/12/17(水) 19:37:36.79ID:0fjBzdT7
>>635
ローカルウォッチウィンドウとかで変数をターゲットしてラインステップ実行すると、いつ、なぜが見つかりやすいよ
他にもデバッグ用のウィンドウでオブジェクト毎にプロパティーまで見れるとかあっ
0643デフォルトの名無しさん2014/12/17(水) 20:15:55.98ID:m1a4KKnZ
ああっ
0644デフォルトの名無しさん2014/12/18(木) 11:15:31.04ID:67KEFWoA
>>640
>>642
ありがとう
いろいろやってみたんだけどやっぱりよく分からなかったですよ
構文自体はあっていると考えていいんですよね?
とりあえずもう少し原始的な方法でいこうと思ってます
C言語はかじった事があるので
for (i = 1;i < 40;i++) {
 for (j = 1;j < 40;j++) {
  ここで行数i 列数j で文字列とマッチしないか判断
 }
}
みたいな感じができないか模索してきますよ
なんとなく出来そうな雰囲気なので
0645デフォルトの名無しさん2014/12/18(木) 11:16:22.40ID:67KEFWoA
vbaでそういう感じのプログラムを組むってことですけどね
0646デフォルトの名無しさん2014/12/18(木) 12:30:48.57ID:nEYT4I/r
VBAでClassモジュールは
オブジェクト指向の機能はどの程度使えるんですか?
継承とかインターフェイスとかオーバーライドとかポリモーフィズムとか。
0647デフォルトの名無しさん2014/12/18(木) 12:45:44.23ID:a38PRbZq
>>646
http://members3.jcom.home.ne.jp/daruma_kyo/aboutooa/vba_limit.html
0648デフォルトの名無しさん2014/12/18(木) 13:10:05.92ID:nEYT4I/r
>>647
ノ ありがとう。勉強します。
0649デフォルトの名無しさん2014/12/18(木) 13:10:55.31ID:nEYT4I/r
シートに貼り付けるコントロールですが
「フォームコントロール」と「ActiveXコントロール」はどっちがどう違うのですか?
どっちを使ったほうが有利かというのはありますか?
0650デフォルトの名無しさん2014/12/18(木) 18:12:20.12ID:PpZ3cpAI
>>648
> 勉強します。

何を勉強するつもりなの?
Excel を使って業務を効率化したいならいいけど、あまり VBA のクラスを使う機会ないよ。
オブジェクト指向の勉強なら VBA を捨てて、C# でもやった方がいい。
個人なら、Visual Studio の Professional 相当もただで使えるし。
0651デフォルトの名無しさん2014/12/18(木) 18:19:53.17ID:nEYT4I/r
>>650
おぉっ、そうですか。
ところでただとはその言語は無料でダウンロードできるってことですか?

C#はいまいちC++と区別がつかないのですが
どっちが何の分野に有利な言語なのですか?
0652デフォルトの名無しさん2014/12/18(木) 18:24:21.09ID:a38PRbZq
>>650
> あまり VBA のクラスを使う機会ないよ。
インターフェースの継承とイベントにはかなりお世話になった気がする。
0653デフォルトの名無しさん2014/12/18(木) 18:26:10.70ID:a38PRbZq
というか、カプセル化してオブジェクトのコレクションは良くやるな。
0654デフォルトの名無しさん2014/12/18(木) 18:31:11.72ID:PpZ3cpAI
>>651
> ところでただとはその言語は無料でダウンロードできるってことですか?

そう、機能制限もなし
MS は開発者には結構優しい
詳しくはこちらで

オプソ開発にお勧め フル機能のVisualStudoが無料に [転載禁止]©2ch.net
http://hayabusa6.2ch.net/test/read.cgi/linux/1415886940/

> C#はいまいちC++と区別がつかないのですが
> どっちが何の分野に有利な言語なのですか?

普通の Windows アプリケーションなら C# の方が楽に作れる
凝ったこととか、将来組み込み分野に行くんだとか思ってる人は C++ で
VB.NET って言う VBA の進化した(と MS は思ってる)奴も使えるし
0655デフォルトの名無しさん2014/12/18(木) 19:06:14.71ID:9/sbCrmX
>>651
3DSが好きならC++
VITAが好きならC#




本気にするなよ。
0656デフォルトの名無しさん2014/12/18(木) 21:15:14.15ID:pd28KeHM
エクセルVBAを使ってスクリーンショットを撮ろうと思っています.
sendkeyが使えないのでwinAPIを使うのですがコードの意味がイマイチ分かりません.
キーを上げる動作の時にどうして押す命令と上げる命令をorで結ぶのでしょうか?
詳しく教えて頂けると幸いです.
以下がコードです.

keybd_event &H2C, 0, &H1, 0
keybd_event &H2C, 0, &H1 Or &H2, 0

OS:windows7 ver:2010
0657デフォルトの名無しさん2014/12/18(木) 21:47:33.06ID:Vf3a9zzk
>>656
Orしてるのは「押す」と「離す」じゃないよ

bit0は昔のキーボードには装備されてなかった追加キーであることを示す
PrintScreenは追加キーだからだからbit0はどちらも1にする

bit1が押すか離すかの区別で0が押す、1が離す
だから押す時は何もしない、離す時は&H2とOrする
0658デフォルトの名無しさん2014/12/18(木) 22:27:26.13ID:vAbYcMfr
それ以前に、orがビット演算だってわかってない気がするが
0659デフォルトの名無しさん2014/12/18(木) 23:06:15.32ID:9/sbCrmX
そう言えばVBAにはシフト演算無いんだね。まぁ別に計算で求まるからいいんだけどさ。
.Netにはシフト演算はあっても、ローテートシフトが無いよね。
有ったとして何に使うんだと言うになるかも知れないけどね。
0660デフォルトの名無しさん2014/12/18(木) 23:14:00.49ID:pd28KeHM
>>657-658
分かりました.
ありがとうございます.
0661デフォルトの名無しさん2014/12/19(金) 01:43:52.48ID:2a1Lzww2
選択したグラフに対して処理をするマクロをWorksheetMenubarに登録して実行しているのですが、右クリックのコンテキストメニューに追加する方法はありますか?
普通のマクロなら追加できるのですが、オブジェクトを選択した状態だとメニューが変わってしまって。
0662デフォルトの名無しさん2014/12/19(金) 06:29:54.77ID:n3rXKEt5
Private Sub Worksheet_BeforeRightClick(ByVal _
Target As Range, Cancel As Boolean)

If Not Intersect(Target, Columns("A")) Is Nothing Then
Cancel = True
MSGBOX "Done"
End If

End Sub

こんな感じで、カラムがAの場合のみ
右クリックで動くマクロを作りたい
↑でも動いたのだが、なぜか1度実行したら2回目が実行されないというおかしな挙動をする…

エクセルを再起動したら、また同じく1度だけ実行されて、再度右クリックしても動かない。。。。
色々調べたんだが全くわからないのでここで質問しました

環境はWin7 64bit Office2007です
よろしくお願いします
0663デフォルトの名無しさん2014/12/19(金) 07:15:09.06ID:MmnpThQW
>>654
> MS は開発者には結構優しい
業務として開発する人にはメッチャ厳しいけどねw

作った物を売る場合だけではなく、自社内の業務で使う場合に置いても
0664デフォルトの名無しさん2014/12/19(金) 07:29:37.15ID:LnqskZcG
>>663
そうか?
どの辺が厳しいか詳しく教えてくれ。
0665デフォルトの名無しさん2014/12/19(金) 08:19:39.45ID:QS7tlhkx
>>654
なんで、ム板にスレあるのに、Linuxのスレなんか紹介してんの?
Visual Studio 2013 SP6(c)2ch.net
http://peace.2ch.net/test/read.cgi/tech/1417828763/
0666デフォルトの名無しさん2014/12/19(金) 08:35:16.34ID:LnqskZcG
>>665
そっちのスレでは Community の前に Express にいっちゃいそうだから
0667デフォルトの名無しさん2014/12/19(金) 18:55:35.13ID:UechEcEq
VBAのクラスは、PublicNotCreatable設定にして、
ライブラリ用ブックに蓄積して、そのブックを参照設定して再利用してるな。
参照設定する側からそのクラスを生成する時には、ライブラリ用ブックに生成用関数を別途作っておくようにする。
0668デフォルトの名無しさん2014/12/19(金) 23:26:08.50ID:6yiRzMRA
>>666
ただの思い込み
その前スレの時にCommunityが公開されて、スレの半分ぐらいがCommunityの話で埋まってたぞ。
俺も住人だが、Communityが公開された現状で今更Expressに話はいかないだろ
0669デフォルトの名無しさん2014/12/19(金) 23:47:47.03ID:wb+cst2b
>>668
思い込みって >>665 のリンク先に Express のダウンロードページへのリンクあるし、前スレ読めとか何を言っちゃってるんだか
0670デフォルトの名無しさん2014/12/19(金) 23:58:09.63ID:VluHuWag
int hoge(const int a)
みたいに引数を変えないことを明示するためにconstを付けるのと同じ方法ありますか?
0671デフォルトの名無しさん2014/12/20(土) 00:06:25.14ID:MvUnc9qy
>>669
ただのテンプレ。たまたまスレ立てを担当した人が書き換えないといけないことに気がつかなかっただけだろ
あと、前スレ読めとは一言も言ってないが?
0672デフォルトの名無しさん2014/12/20(土) 00:55:02.24ID:cUhMXe+F
>>671
> ただのテンプレ。たまたまスレ立てを担当した人が書き換えないといけないことに気がつかなかっただけだろ

で、それがどうかしたのか?
原因はどうあれ、Express のダウンロードページへのリンクがあることで間違える可能性があることは事実だろ。

> あと、前スレ読めとは一言も言ってないが?

はいはい、前スレ云々は書いてあるけど、読めとは書いてないわな。
小学生かよ w
0673デフォルトの名無しさん2014/12/20(土) 08:33:17.25ID:B06Quxx2
Excelで開発されたアプリがあると聞きます。フォームで操作、アウトプットが表、の様に作ってあるものでしょうか。
リボンがカスタマイズされたExcelの様なものでしょうか。
0674デフォルトの名無しさん2014/12/20(土) 09:01:56.84ID:4ivMxLc2
>>670
無いと思います。
そもそも定数でいいのであれば引数にする必要があるのでしょうか?
0675デフォルトの名無しさん2014/12/20(土) 09:15:37.55ID:DDEfsbrE
>>673
Excelがインストールされていない環境でも使えるアプリなのかな。
0676デフォルトの名無しさん2014/12/20(土) 09:47:46.11ID:cUhMXe+F
>>673
VBA で印刷、ファイル入出力やネットワーク経由のやり取りも可能だから、ちょっとしたアプリケーションなら普通に作れるでしょ
まあ、今時なら VB.NET とか C# でいいと思うけど
0677デフォルトの名無しさん2014/12/20(土) 10:03:39.86ID:B06Quxx2
>>675
いや、Excelを実行プラットホームに動くと思います。何しろ実物知らないので想像なんですが。
ユーザーフォーム主体で、まるでExcelとは思えない、なのか、スペシャルなカスタマイズリボンが追加される方向なのか。
買ったことあるよとか、作って納品した事あるよ、という方がいたら教えて下さい。
0678デフォルトの名無しさん2014/12/20(土) 10:22:15.77ID:Sd/BNZUu
>>677
起動時にExcelを非表示にしてフォームのみにすれば普通のアプリっぽくなるよ
昔作ってた
0679デフォルトの名無しさん2014/12/20(土) 11:10:07.43ID:4ivMxLc2
>>677
ExcelやAccessのコードから仕様書を作成するツールなら見たことある。
普通にExcelから作られてた。たまにエラーで落ちるんでプロテクト掛かっていなかったから自分で勝手に改修して
使ってた。もう随分昔の話。
0680デフォルトの名無しさん2014/12/20(土) 12:14:29.48ID:b4Y8NjXL
ベクターとかに有った気がするな
エクセルVBAのヤツ
0681デフォルトの名無しさん2014/12/20(土) 13:32:51.80ID:z+m4k6Na
うちの会社で使ってる
入力用シートの決まった場所に数字を入れてボタンを押すと
出力用シートが生成されて、それを印刷して提出する

マクロ入りブックをダブルクリックして起動すると、Excelの画面が一瞬表示された後メニューやリボンが非表示になって
ワークシートだけのウィンドウになる。見た目は洗練されてないけど、業務用だからこれで十分
パートさんの9割はVBAどころか、ワークシートに数式すら入れたことないレベルの人だし
0682デフォルトの名無しさん2014/12/21(日) 01:01:10.90ID:1GU9Ia4Y
>>674
定数というか呼び出し元の変数を引数にして
それを関数内で間違えて代入してしまうのを防ぐためという意味です
0683デフォルトの名無しさん2014/12/21(日) 01:02:17.09ID:1GU9Ia4Y
>>674
訂正
定数というか呼び出し元の変数を引数にして
その引数に関数内で間違えて代入してしまうのを防ぐためという意味です
0684デフォルトの名無しさん2014/12/21(日) 01:07:13.23ID:dQbD9EbE
>>683
ByVal
0685デフォルトの名無しさん2014/12/21(日) 01:14:46.67ID:1GU9Ia4Y
>>684
そういうことじゃないっす
0686デフォルトの名無しさん2014/12/21(日) 02:03:48.04ID:dQbD9EbE
>>685
何がしたいのか知らんが
VBAに、関数の引数として宣言してる変数に代入を禁止する方法などない
0687デフォルトの名無しさん2014/12/21(日) 02:08:57.25ID:J6j4yHTr
>>685

定数ならグローバルに宣言しとけばいいんじゃないの
0688デフォルトの名無しさん2014/12/21(日) 02:48:02.90ID:1GU9Ia4Y
>>686
C言語では出来るけど無理ですか

>>687
関数内で引数を勝手に書き換えて使わないでねって意味なのでグローバルだとダメですね
0689デフォルトの名無しさん2014/12/21(日) 03:42:04.05ID:7sWWn7Eb
 
 if Range(A1) が 1〜20の間なら 

IF文の条件定義で↑これって(1〜20の間)どう書きますか? 
つなげる符号はイコールで良いのでしょうか?
0690デフォルトの名無しさん2014/12/21(日) 03:45:25.08ID:1GU9Ia4Y
If(1 <= Range(A1)) And (Range(A1) <= 20)Then

または

Select Case Range(A1)
 Case 1 to 20
0691デフォルトの名無しさん2014/12/21(日) 03:49:10.05ID:7sWWn7Eb
>>690
うひょ想像以上に複雑な式ですね 
初心者の私がいくら考えてもできないわけでした、ありがとうございます。
0692デフォルトの名無しさん2014/12/21(日) 04:17:43.33ID:+/Hp2t14
>>688
引数にリテラル値を指定するか、
引数で指定する定数の宣言を前持って行なっていれば何ら問題はない。
0693デフォルトの名無しさん2014/12/21(日) 04:28:27.49ID:1GU9Ia4Y
>>692
自分が関数内で変更を加えちゃいけない引数に
間違えて代入文を書いちゃったときにエラーになるようにしたかったということなので
それじゃダメだと思いますけど
0694デフォルトの名無しさん2014/12/21(日) 04:30:31.00ID:dQbD9EbE
>>688
目的は引数の破壊を防ぐことだろ

ByValで宣言された引数は、代入されようが呼び出し元の変数を変更することはない
呼び出し元を変更しないとこを保証するんだから、関数内で代入を禁止する必要はない
だからVBAならByVal使えって話で、Cがどうこうって言うならC使えよ
0695デフォルトの名無しさん2014/12/21(日) 04:37:01.39ID:1GU9Ia4Y
>>694
ある引数が関数内で一度も変更されずに
関数内の最初から最後まで途中も含めて同じであることを保証する方法ないかなって意味なのでByvalだとダメなんです
同じ質問繰り返してしまっているので、もう止めておきます
ありがとうございました
0696デフォルトの名無しさん2014/12/21(日) 06:24:18.70ID:B4pht3s2
自分で目的を満たした型(クラス)を作れば済む話なんだけどね
簡単に思いつく方法を3つ挙げると

�@
 Property Get Valueをデフォルトプロパティにする
 Sub SetValue(Value As Long)で値の設定を行い、Let Valueは作らない

�A
 Property Get Value、Property Let Valueをデフォルトプロパティにする
 Property Let Valueにおいて、Staticで宣言したLock As BooleanをTrueにする
 Property Let Valueが呼ばれても、LockがTrueなら値を書き換えずに終了

�A
 Property Get Value、Property Let Valueをデフォルトプロパティにする
 モジュールレベルでPublic Lock As Booleanを作る
 Property Let Valueが呼ばれても、LockがTrueなら値を書き換えずに終了

�@は、「a.SetValue 100」を使えば何度でも値の書き換えは出来るが
「a = 50」のような値の書き換えは弾かれる

�Aは一度だけ「a = 50」で値を設定出来るが、2度目以降の変更は一切受け付けない

�Bは、任意で「Lock = True」を実行するまでは、「a = 50」で何度でも書き換えできるが
「Lock = True」を実行して以降は書き換えは出来ない
(LockもProperty Let Lockで作れば、一度ロックしたらロック解除不可にも出来る)

そしてどれも値の取り出しは「a.Value」ではなく「a」だけで行えるので、普通の変数と同じように使える

それぞれメリットデメリットはあるが、書き換えは1回だけって条件が問題なければ、
�Aが一番シームレスに変数と同じような扱いが出来るかな

まぁ、そこまで手間掛けるくらいなら諦めるってのも一つの選択ではあるがな
0697デフォルトの名無しさん2014/12/21(日) 06:42:38.28ID:dQbD9EbE
>>695
それは引数かどうかとか関係ない変数のアクセス制御の話

VBAには読み取り専用変数はない
以上
0698デフォルトの名無しさん2014/12/21(日) 06:49:16.44ID:X7sC2bD2
>>691
これを複雑と感じてしまうか。
てかむしろVBAで対応する必要すらあるか?エクセル関数だけでも同じ判定できるぞ
0699デフォルトの名無しさん2014/12/21(日) 07:08:48.27ID:dQbD9EbE
>>696
クラスはインスタンス化の問題がある上に
VBAだけだとデフォルトプロパティの設定に難がある
そして読み取り専用プロパティに代入しようとしても、コンパイル時にはエラーならない

ないものねだりしてもしょうがないんだけど
まあ読み取り専用変数の代わりにするにはちょっと厳しいかと
0700デフォルトの名無しさん2014/12/21(日) 09:18:52.39ID:+/Hp2t14
>>699
>クラスはインスタンス化の問題がある上に
>VBAだけだとデフォルトプロパティの設定に難がある

確かに面倒臭いけど、これらはモジュールで作ることと、初期化関数を作って最初に呼び出してやることで何とかなりそう。

>>699
>そして読み取り専用プロパティに代入しようとしても、コンパイル時にはエラーならない

これは無理。諦めて下さい。
0701デフォルトの名無しさん2014/12/21(日) 10:43:43.12ID:Xm8mD2hx
VBAからIEを操作する方法をインターネットや本で学んだけど
会社の仕事でインターナルで使ってるサイトはその方法ではできないんです。
なぜか別のページに飛ばされたりURLが複雑で毎回変わるみたいな感じで。
どうなっているのですか?
0702デフォルトの名無しさん2014/12/21(日) 11:33:14.14ID:ikKWfd9P
>>701
サイト作った奴に聞け。
こっそりやりたいなら、Wireshark とかでパケット解析してがんばれ。
0703デフォルトの名無しさん2014/12/21(日) 21:38:38.58ID:WvuhO5KU
いつも思うんだけどIE操作するならもっと適切なツールがあるのに
なんでわざわざ糞使いづらいExcelのVBAでやろうとするの?
マゾなの?
0704デフォルトの名無しさん2014/12/21(日) 23:16:06.33ID:LWBfewud
>>703
君も社会に出てみればわかると思うけど、
会社ってのは色々と融通がきかないんだよ
0705デフォルトの名無しさん2014/12/21(日) 23:28:15.73ID:E3CmSkNx
>>703
IEを適切に操作したいです。そのツールはなんと言うのですか?
0706デフォルトの名無しさん2014/12/21(日) 23:57:31.74ID:UsovulQF
その質問はスレ違いだ
0707デフォルトの名無しさん2014/12/22(月) 01:48:46.51ID:2gZjwJgU
>>705
ttp://m.forest.watch.impress.co.jp/docs/special/20130516_599332.html
0708デフォルトの名無しさん2014/12/22(月) 02:41:00.70ID:bG/o9/7L
シェルからwget叩くのじゃダメなんか
0709デフォルトの名無しさん2014/12/22(月) 09:20:07.39ID:qLGa3oae
わざわざExcel起動しなくてもVBScriptあるし
VBの文法が嫌いならJScriptでもいいし
モダンなPowerSellとかあるし

自動操作に特化するならAutoItとかAutoHotkeyとかSikuliとかあるし

IE操作するのにExcelを通す意味がわからん
0710デフォルトの名無しさん2014/12/22(月) 09:20:28.67ID:O5kTxGCI
Debug.Print i
i=i+1
を、1行で、
Debug.Print i; i=i+1
みたいに書けますか?やったら出来なかったのですが。
0711デフォルトの名無しさん2014/12/22(月) 09:58:55.49ID:rx3aeEoJ
vbaからjqueryを使うことは出来ますか?
javascriptを使う例文は見つかりましたが、この先が厳しいです。

Sub a()

Dim objIE As Object 'IEオブジェクト参照用
'インターネットエクスプローラーのオブジェクトを作る
Set objIE = CreateObject("InternetExplorer.application")

objIE.Visible = True '見えるようにする(お約束)
'文字列で指定したURLに飛ぶ
objIE.Navigate "http://leanmodal.finelysliced.com.au/";

With objIE.document.getElementsByTagName("input")
.Item(0).Value = "ログインID。"
.Item(2).Value = "パスワード。"
End With

'ログインボタンの処理を実行する
objIE.document.Script.setTimeout "javascript:send();return false;", 200
End Sub
0712デフォルトの名無しさん2014/12/22(月) 10:30:55.65ID:xGC6tvzs
>>710
正解は
Debug.Print i;: i = i + 1
だけど、VBAやVBでは2行に分けるのが推奨されてる
0713デフォルトの名無しさん2014/12/22(月) 10:37:35.41ID:xGC6tvzs
>>711
関数名を調べて、それを直接叩けば動きそうに思えるけど
LINKタグ経由とかで外部リンクだと無理なのかな?(面倒なので未確認
0714デフォルトの名無しさん2014/12/22(月) 11:26:23.33ID:O5kTxGCI
>>712
ありがとうございました。教えていただいた方法で出来ました。
:が必要なのですね。
0715デフォルトの名無しさん2014/12/22(月) 17:50:53.20ID:EKhrmcFD
わざわざ読みにくくする努力乙
0716デフォルトの名無しさん2014/12/22(月) 22:14:59.39ID:uo67jWxD
オートシェイプの「オート」ってどこからきてる意味ですか?
なにが自動なのでしょうね?
0717デフォルトの名無しさん2014/12/22(月) 22:57:28.27ID:rx3aeEoJ
>>716
さぁ?マイクロソフトに聞いたら?
まぁテキトーに調べると
Shapeは格好の意味、オートは自動
テキトーに程よい図形にしてやんよって意味じゃないのかね
理由は分からんが図形って名前に変わってるらしいからそんな死語を木にしても仕方ないと思う。
0718デフォルトの名無しさん2014/12/22(月) 23:25:33.21ID:C0XtR0uV
>>716
shapeは形状でしょ
種類選択するだけで自動で描画してくれるんだからそこがオートなんじゃない?
0719デフォルトの名無しさん2014/12/23(火) 03:49:31.39ID:mcXBHbFz
確かBASIC時代は矢印描写するのに1点ずつ座標指定して線で囲むか
△と□を組み合わせて描写してたよーな
0720デフォルトの名無しさん2014/12/23(火) 05:58:49.24ID:S8DxFIEz
BASIC時代ってどの時代のどのBASICを指すのか分からんけど、
大概のBASICにはLINE命令が有ったから矢印で1点ずつはない。
画面上に何かしら絵でも書く時でさえ、LINE命令で点〜点間の線を指定する場合が多い。
点を指定するPSETはブラシ効果や微調整に使われる程度。
0721デフォルトの名無しさん2014/12/23(火) 06:48:57.14ID:zn+tl5Qa
ActiveWindow.ScrollRow でアクティブなシートを特定の位置にスクロール
できますが、アクティブではない裏のシートをスクロールする方法は
ありますか?
0722デフォルトの名無しさん2014/12/23(火) 09:59:59.68ID:rflZsfOY
そのシートをアクティブにしてActiveWindow.ScrollRowすりゃ良いやん
画面が変わるのが嫌ってんならそん時にScreenUpdatingをFalseにしときゃいいだろ
0723デフォルトの名無しさん2014/12/23(火) 10:44:03.33ID:zn+tl5Qa
>>722
なるほど。ありがとうございました。早速やってみます。
0724デフォルトの名無しさん2014/12/23(火) 13:54:41.25ID:OxQBAuus
セル範囲にのっかってるオートシェイプが
そのセル範囲をコピペしたときちゃんとペーストされないときがあります。

これを確実にペーストさせる方法はどうすればいいですか?

逆にオートシェープは必ずペーストさせないオプションにするときのコードもあわせてお願いもうしあげますですぅ。
0725デフォルトの名無しさん2014/12/23(火) 16:11:35.48ID:mqCWbeBr
>>709
PowerShell、うちの場合仕事場のセキュリティが厳しくて、.psファイルが実行できないわ
Windowsのセキュリティポリシー設定変更が必要なんだよね・・

VBSは、同じくセキュリティの都合で別ソフトのIDEとか導入できないから、まだ標準でIDEあるVBAの方が
0726デフォルトの名無しさん2014/12/23(火) 21:08:01.31ID:HCvDCDCt
>>724
図形の左上がセルに載ってるか乗ってないかが基準になる
○の形は□に直してから考える

どういうふうに移動させるかを考えないといけないし
とんでもなくめんどくさそう
0727デフォルトの名無しさん2014/12/23(火) 21:44:23.08ID:OxQBAuus
>>726
それは困りましたな
0728デフォルトの名無しさん2014/12/24(水) 01:08:10.31ID:tVM9CYMM
>>727
オートシェイプはね、Altキーを押しながらマウス操作するといいですよ。
オートシェイプをコピペしない方法はパッと思いつきませんが、
Shapeオブジェクトがあったはずなので自由自在だった気がいます。
0729デフォルトの名無しさん2014/12/24(水) 01:59:26.37ID:uqoBPgKJ
>>728
オートシェイプのaltキー押しながらの移動知らんかった
こういうちょっと便利な操作を知ってると作業が楽になるからありがたい
0730デフォルトの名無しさん2014/12/24(水) 13:25:58.57ID:K6iCECt5
例えば丸いオートシェイプがあったとして
その重なってるセルをコピペすると
オートシェイプまでコピペされる場合とされない場合があるのですが
その法則はありますか?

どうも中心の真下にあるセルが含まれてるとコピペされるのかと思ったらされない場合もありびっくりしてる。
0731デフォルトの名無しさん2014/12/24(水) 13:28:06.61ID:B/XYesfL
基準は左上だったと思う
0732デフォルトの名無しさん2014/12/24(水) 13:44:40.39ID:K6iCECt5
>>731
いや、それが左上ではないことだけははっきりと実験でわかったんだよ。
0733デフォルトの名無しさん2014/12/24(水) 14:11:10.71ID:IVnhWToQ
ざっと試してみたところでは、中心が含まれる & 面積が2/3以上、みたいな感じ?
http://i.imgur.com/jAlH4Lp.png
0734デフォルトの名無しさん2014/12/24(水) 14:19:32.82ID:K6iCECt5
>>733
すばらしい!
みんなも実験をかさねてSTAP細胞、いやオートシェイプの法則を見つけようではないか!

ところでその図だと5x5のマスの右側の横2縦5の2x5をコピペすると
オートシェイプも一緒にコピペされるという不思議。
0735デフォルトの名無しさん2014/12/24(水) 14:21:27.17ID:K6iCECt5
ありゃ、いまやったら再現はできなかった
0736デフォルトの名無しさん2014/12/24(水) 15:08:16.94ID:B/XYesfL
>>734
いや、めんどくさいから俺はいいや。あと得るものが少なすぎる

範囲内のオートシェイプを処理
http://www.asahi-net.or.jp/~zn3y-ngi/YNxv9e05.html
単純だけどこの辺でやる方が良いと思うぞ
0737デフォルトの名無しさん2014/12/25(木) 00:10:23.76ID:v7B1QlDH
WinXP、Excel2000

メインのブックから他のブックを開いて自動で印刷したいのですが、
開いたブックにメインと同じ印刷設定(用紙や給紙トレイ等)を引き継ぐ方法はないでしょうか
0738デフォルトの名無しさん2014/12/25(木) 00:29:46.60ID:yImkVTgy
>>737
完全に引き継ぐのは無理
印刷設定の項目には引き継げるやつと引き継げないやつがある

例えば用紙サイズはPaperSizeプロパティで取得できるので、それをそのまま設定してやればいい
0739デフォルトの名無しさん2014/12/25(木) 00:46:28.08ID:V5trOw/Q
>>737
普通にメインのブックの設定をプリンタAPIから取得して、それをそのまま代入すれば良いだけでは?

因みにプリンタ個々の設定はプリンタの機種依存なので
具体的な取得や設定方法は、Excel分野ではなくプリンタ分野の話になるからスレ違い

まあ「ページ設定」で設定できる縦横や拡大率、用紙、余白なんかなら、Excel分野の話だけどね


プリンタAPIの仕様を調べて取得や設定出来るだけのスキルが無いなら、妥協策としては

印刷設定を採用したいシートそのものをコピーする(Worksheetのコピー)
印刷したいシートの内容だけをそのシートにコピーする(Rangeのコピー)

を行えば、印刷設定はWorksheetでコピーしたシートのものが採用される


あとは、細かい設定を引き継ぐのではなく、大まかに数種類の設定があって、例えば
�@用紙はカセット1
�A用紙はカセット1、両面印刷
�B用紙はカセット2
�C用紙はカセット2、白黒印刷
の使い分けで事足りるなら、Win側(XPだと「プリンタとFAX」かな?)でそれらの状態を標準とするプリンタ設定を複数用意して、
PrintOutメソッドのActivePrinter引数にそれを指定するって方法もある
0740デフォルトの名無しさん2014/12/25(木) 00:56:37.13ID:v7B1QlDH
>>738
ありがとうございます
0741デフォルトの名無しさん2014/12/25(木) 01:02:51.47ID:v7B1QlDH
>>739
APIは自分には時間がかかるので捨ててました…
一つのシートでやります
ありがとうございました
0742デフォルトの名無しさん2014/12/25(木) 01:23:38.27ID:CoTznJwN
>>696 >>697 >>700
もう質問止めておきますと言っておきながら再度聞いてしまってすいません。

Sub hoge(Byval data As Long)
 data = 5   ← 代入文を間違えて記述。ここでエラーにしたい。
End Sub

Sub hoge(Byref arr As Variant)
 arr(6, 4) = 5 ← 代入文を間違えて記述。ここでエラーにしたい。
End Sub

引数に間違えて代入するのを防ぐ方法は、C言語なら引数にConstを付ければ実現出来るが
VBAには手軽に実現できる代替手段がないという理解でOKですか?
0743デフォルトの名無しさん2014/12/25(木) 02:45:42.56ID:KtfXMYJ7
ok
0744デフォルトの名無しさん2014/12/25(木) 03:53:12.99ID:1h250aOU
関数つくれば良いじゃん
0745デフォルトの名無しさん2014/12/25(木) 07:27:40.54ID:MnMReXOz
>>742
ReadOnlyプロパティをもつクラスを作って引数にクラスのインスタンスごと渡して
使うときはそのプロパティから値を取得するようにすれば出来るよ。
プロパティに値を設定するときは別メソッド作ってそこでやればいいしね。
0746デフォルトの名無しさん2014/12/25(木) 11:08:30.76ID:g3diUBPe
>>742
関数内でうっかり
data=5
と代入するミス何て、自分で注意してれば
防げるだろ。仮に見落としても
期待した結果にならないからすぐ気づく。
0747デフォルトの名無しさん2014/12/25(木) 11:20:08.92ID:yImkVTgy
>>746
そういう話じゃないだろ
例えばこういうケースでのタイプミスを防ぎたい、できれば機械的に自動的に発見したい
みたいなことじゃないのか?

Sub Macro1(data1)
  Dim data2
  data2 = 5
(いかりや く)
0748デフォルトの名無しさん2014/12/25(木) 11:22:14.55ID:3/a4iui6
無いから諦めろ

これでいいだろ。いい加減ウゼェ
0749デフォルトの名無しさん2014/12/25(木) 12:58:33.74ID:08EStQsX
A列に日付(シリアル値)
B列に予定の文字列があります。

これをOutlookのカレンダーにそのまま件名として追加したい(本文は空欄でよい)んですが
ExcelのVBAからではどういうコードを書けばよいでしょうか?
0750デフォルトの名無しさん2014/12/25(木) 16:41:13.27ID:c/bUBZQc
>>749
ExcelからVBAでOutlook操作するより、OutlookからVBAでExcel読むほうが良い気がするが
OutlookのVBAスレってないんだっけ
とりあえず2007だけど軽く書いてみたコード(参照設定してある前提)

Dim ol As Outlook.Application
Dim apitem As AppointmentItem
Set ol = New Outlook.Application
Set apitem = ol.CreateItem(olAppointmentItem)
apitem.Start = CDate(Sheet1.Range("A2").Value)
apitem.Subject = Sheet1.Range("B2").Value
apitem.Save
ol.Quit
0751デフォルトの名無しさん2014/12/25(木) 19:40:24.37ID:v7B1QlDH
WinXP、Excel2000

xlDialogPrinterSetupでプリンタ設定のダイアログを使うと、プリンタ変更か印刷設定どちらかしかできません。
xlDialogPrintだとプリンタ変更と印刷設定をいちどにできますが、OKを押した時点で印刷が始まってしまいます。

xlDialogPrinterSetupで一度に設定するか、xlDialogPrintで即印刷開始しないようにすることはできますか?
また他に1回の設定画面でプリンタ変更と印刷設定のみを行い、印刷は任意のタイミングでできる方法があれば教えて欲しいです。
0752デフォルトの名無しさん2014/12/25(木) 20:35:58.59ID:08EStQsX
>>750
嗚呼すばらしい哉。
ありがとうでゴンザレス。
いまから試してみます。
0753デフォルトの名無しさん2014/12/26(金) 06:45:27.11ID:Ut09yrdM
>>751
VBAでやるのであれば、どちらにしろ普通にやれば良いだけじゃん

というか、またこの間の印刷設定引き継ぎの子か?
なんか今回も見当違いなこと考えてそうだな
0754デフォルトの名無しさん2014/12/26(金) 09:46:03.68ID:nS4v0Az9
VBAで自作のFunction MyFunc()を作ったとして、その関数が、
セルの関数として
=MyFunc()
みたいに呼び出された場合と、他のSubなどから呼び出された場合を
見分ける方法ありますか?
0755デフォルトの名無しさん2014/12/26(金) 10:41:55.09ID:iezbsgxB
Interger型の変数aに
あるセルに入ってる値を代入したのですが
それが文字列だったためエラーがでます。

文字列なら自動で0(ゼロ)になってくれないのかよ?

もし文字列はゼロにしたい場合、最もシンプルなコードではどうなりますか?
0756デフォルトの名無しさん2014/12/26(金) 10:49:29.26ID:iwJ0Dkg7
>>754
TypeName(Application.Caller)
0757デフォルトの名無しさん2014/12/26(金) 10:51:01.91ID:iwJ0Dkg7
>>755
a = Val(Range("A1"))
0758デフォルトの名無しさん2014/12/26(金) 11:12:02.66ID:iezbsgxB
>>757
(^ ^)v
0759デフォルトの名無しさん2014/12/26(金) 11:15:56.12ID:iezbsgxB
WorksheetFunction.Vlookupを使うとき
1列じゃなく2列の組み合わせで値をひっぱってきたいのですが
最もシンプルなコードではどうなりますか?

例えばA列「巨人」B列「55」C列「松井」のデータがあったとして
「巨人」と「55」の組み合わせから「松井」というデータをひっぱってきたいのです。
0760デフォルトの名無しさん2014/12/26(金) 11:24:16.29ID:hrUYNjao
俺の場合、
巨人_55
というカラムを作ってそれをキーにしてる
0761デフォルトの名無しさん2014/12/26(金) 11:32:13.16ID:X/mYv0g9
>>759
if
0762あ2014/12/26(金) 12:27:11.07ID:B31hRDon
    /:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::://ヽ:::::::::::::::|
    l:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::// ヽ::::::::::::::l
    l:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::/:::「'ヽ::::::::::://   ヽ:::::::::::|
    |::::::::::::::::::::::::::::::::::::::::::::::::::::::::::ノl:::ノ l:::::::/      ヽ::::::::|
   ノ:::::::::::::::::::::::::::::::::::::::::::::::::::::/ ゙゙  ノ:::/ ,,;;;;;;,,    ,,,,ヽ:::::l
   ):::::::::::::::::::::::::::::::::::::::::::::::/    ノ/ __,'''i: ('''__):::l  
  )::::::::::::::::::::::::::::::::::::::::::::::::::/         ̄ ̄ン:. :「 ̄`ヾ   
 1:::::::::::::::::::::::「 `┤l:::::::::::::::::l          ̄   ,  ヽ ̄ l   
  `l:::::::::::::::::::::ヽ  :l li:::::::::::::/        ヽ  /´   `l  |
  ヽ::::::::::::::::::::::\_」 lヽ::::/         .l  !:-●,__ ノ  /      
  ノ:::::::::::::::::::::::::::ノ | l `゙゙           i ,,;;;;;;;;;;;;;;;;;;;;,  /ヽ       
,/ ヽ::::::::::::::::::::::(  l l::::::::..         /.:''/´ ̄_ソ  /  `ヽ
     ヽ:::::::::::::::ヽ | l:::::::::::...      /::// ̄ ̄_ソ  /    \   ヴッ!!
        ヽ:::::::\| l::::::::::::::::...    / :::.ゝ` ̄ ̄/ /       ヽ
           ヽ:::l l:::::::::::::::::::..      ̄ ̄;;'' /         ヽ
              l l;;;;;;:::::::::::::::.....;;;;............;;;;;;''ノ            l
              l l '''''''''''''''''''''''''''''''''''''' ̄l |             |

http://www.youtube.com/watch?v=z2qK2lhk9O0
0763デフォルトの名無しさん2014/12/26(金) 13:29:56.54ID:nS4v0Az9
>>756
ありがとうございました。
0764デフォルトの名無しさん2014/12/26(金) 17:15:29.18ID:dkpsRF9G
>>759
WorksheetFunction.Vlookupを使うから複雑になる
Offset使えば?
0765デフォルトの名無しさん2014/12/26(金) 20:03:56.64ID:/ULns1N3
>>753
印刷関連を触るのは初めてで、普通にというのがよくわかりません
xldialog〜が使えるということまではわかったのですが…
自分でも見当違いな事考えてるかもしれないと思ったので、他のやり方があればと思い質問しました
0766デフォルトの名無しさん2014/12/26(金) 20:15:14.75ID:YEg0/K9h
>>760
元の表はいじれないのでコードでそう書いてまたコードで消さないといけないからめんどい

>>761
詳しくお願いします

>>764
想像もつきませんが
どうOffsetを使うのでしょうか?
0767デフォルトの名無しさん2014/12/26(金) 22:14:32.22ID:dkpsRF9G
>>766
764だが説明めんどいから↓見てくれ
http://www.happy2-island.com/excelsmile/smile03/capter00521.shtml
0768デフォルトの名無しさん2014/12/27(土) 02:17:37.71ID:5GaZ54S2
以下のVBAコードはなぜ、fu一致となるのでしょうか?
17:35:00を作って条件比較しようと思っています。
一致させるには、どう変更すればよいでしょうか?


Public Sub test()
Dim dTime1 As Date
Dim dTime2 As Date
dTime1 = TimeValue("17:37:00")
dTime1 = dTime1 + TimeSerial(0, -Minute(dTime1) + Application.RoundDown(Minute(dTime1) / 5, 0) * 5, 0)

dTime2 = TimeValue("17:39:00")
dTime2 = dTime2 + TimeSerial(0, -Minute(dTime2) + Application.RoundDown(Minute(dTime2) / 5, 0) * 5, 0)

If dTime1 = dTime2 Then
Debug.Print "一致"
Else
Debug.Print "fu一致"
End If

End Sub
07697682014/12/27(土) 02:38:27.59ID:5GaZ54S2
なお、
Application.RoundDownの代わりに、
Intを使っても、一致しません。
なぜだろう?

たぶん、少数誤差が絡んでいると思うのだが。
どうすればいい?
0770デフォルトの名無しさん2014/12/27(土) 03:56:10.36ID:AHLJK9CU
>>768
これでどう?
dTime1 = TimeValue("17:37:00")
dTime1 = TimeSerial(Hour(dTime1), Int(Minute(dTime1) / 5) * 5, 0)
dTime2 = TimeValue("17:39:00")
dTime2 = TimeSerial(Hour(dTime2), Int(Minute(dTime2) / 5) * 5, 0)
0771デフォルトの名無しさん2014/12/27(土) 04:10:23.58ID:xcx8bYiC
>>769
VBAで日時を数値として扱うと、時刻は小数点以下として扱われるからなぁ
TimeSerialでの誤差か、それをプラスするときの演算誤差か

とりあえず時刻を5分単位で丸めたいだけなら
dTime1 = TimeSerial(Hour(dTime1), Int(Minute(dTime1) / 5) * 5, 0) とか
dTime2 = TimeSerial(Hour(dTime2), Application.RoundDown(Minute(dTime2) / 5, 0) * 5, 0) とか
同じと判定されるときはTimeSerialで引数が同じになるようにすれば同じ値になるけど

他にも演算しそうな時には、同じかの判定を
if DateDiff("s", dTime1, dTime2) = 0 とか
念を入れるなら
Abs(DateDiff("s", dTime1, dTime2)) < 許容誤差
とかやるしかないんじゃないかと

秒以下の値が変わっても良いなら、判定前に
dTime1 = TimeSerial(Hour(dTime1), Minute(dTime1), Second(dTime1))
とかやっても良いかもしれんけど、これだとパッと見で何がやりたいか解らんかもしれんと言う罠
0772デフォルトの名無しさん2014/12/27(土) 04:28:34.97ID:LIHGZKHX
>>770
最後を
, 0)
ではなく
, Second(dTime1))
にしないと、仕様が変わっちゃうよ

今回は秒は0だし、加算するTimeSerialの秒は0固定の用だけど
加算されるdTime1およびdTime2の秒数は、必ず0であるとは明言されてないのだから
0773デフォルトの名無しさん2014/12/27(土) 10:43:43.48ID:APJ+2823
>>767
それ関係なくない?2列の組み合わせのvlookupを実現させたいんだから
0774デフォルトの名無しさん2014/12/27(土) 14:23:56.96ID:rfg6HV92
>>773
二列の検索はvlookupじゃ無意味だからoffsetと言ってるんだが?
767は単にoffsetを検索に使う一例にすぎない

offsetなら何列の条件だろうとifとloopで検索できる
0775デフォルトの名無しさん2014/12/27(土) 16:40:38.80ID:rfg6HV92
>>766
Sub 松井検索()
Dim i As Long
Dim 最終行 As Long

最終行 = Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To 最終行
With Cells(i, 1)
If .Value = "巨人" Then
If .Offset(0, 1).Value = 55 Then
MsgBox (.Value & "の" & .Offset(0, 1).Value & "番は" & .Offset(0, 2).Value)
Exit Sub
End If
End If
End With
Next
MsgBox ("見つかりません")
End Sub
0776デフォルトの名無しさん2014/12/27(土) 18:34:25.94ID:zakcobGB
Excel VBAの入門書を読んでExcel VBAの概要を理解した初心者なのですが、
次は網羅的で厳密な学習をしたいと考えています。
おすすめの本はありますでしょうか?
0777デフォルトの名無しさん2014/12/27(土) 18:35:02.06ID:PS8qPAgg
別に Offset なんて使わずに列番号指定すればいいだけだと思うが
0778デフォルトの名無しさん2014/12/27(土) 19:03:26.38ID:9qQU0LAx
>>776
大きな本屋に行って自分でいろいろ探してみろよ。
後、「網羅的で厳密な学習」って、、何のために勉強するの?
勉強のための勉強?
0779デフォルトの名無しさん2014/12/27(土) 19:54:20.15ID:zakcobGB
>>778
立ち読みではどの本がいいのかわかりづらくて・・・
仕事でVBAを使う機会があったのですが、
(この時はコマンドラインツールのフロントエンドのような物を見よう見まねで作りました。)
もっとVBAについて知っていれば、いろいろ作れて便利そうだなと思いまして。
曖昧な理解や誤解は嫌いな性格なので、不正確な説明のある本は避けたいんです。
作りたい物が具体的に決まっていないので、おっしゃる通り勉強のための勉強だと思います。
0780デフォルトの名無しさん2014/12/27(土) 20:06:07.18ID:eow/ZtAj
その用途と性格なら、クックブックや逆引き系の本とオンラインマニュアルがいいんじゃね
入門書系は役に立たんと思う。

ただし言っとくがVBAはそんなに便利じゃないぞ、プログラミングが苦痛になる道具だ。
それしかないから仕方なく使う物なんだ
0781デフォルトの名無しさん2014/12/27(土) 20:38:33.98ID:69txf99V
>>779
VBAに限らないけど、プログラミングは解説読んで覚えようとするより実践しながら理解していく方がいいよ
頭の中で考えたことを書いてみると想定外の思わぬ動きするから
不正確な説明で惑わされたくないならリファレンス買って動かしてみるのが一番いい気がする
0782デフォルトの名無しさん2014/12/28(日) 09:08:19.24ID:RZDgW+sy
>>780
>>781
アドバイスありがとうございます

実践という意味では練習問題のあるテキストがいいのかなと思っていたのですが、
網羅的なのは逆引きやリファレンスになるんですかね

連休中に本屋で探してみようと思います

確かにExcelでほかの言語が使えたら、わざわざ選ぶ言語ではないですね・・・
0783デフォルトの名無しさん2014/12/28(日) 10:33:35.36ID:JpE7r06Q
>>775Offset厨さんへ
どうしてこうシンプルにしないんですか?

Sub 松井検索()
Dim i As Long
Dim 最終行 As Long

最終行 = Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To 最終行
If Cells(i, 1).Value = "巨人" Then
If Cells(i, 2).Value = 55 Then
MsgBox (Cells(i, 1).Value & "の" & .Cells(i, 2).Value & "番は" & Cells(i, 3).Value)
Exit Sub
End If
End If
Next
MsgBox ("見つかりません")
End Sub
0784デフォルトの名無しさん2014/12/28(日) 10:49:06.98ID:HS4v0XFn
Offset使うならこんな感じ?ビューを移動していくようなイメージで。

Sub 松井検索()
 Dim rgRow As Range

 Set rgRow = Range("A1:C1")
 Do While rgRow(1).Value <> ""
  If rgRow(1).Value = "巨人" Then
   If rgRow(2).Value = 55 Then
    MsgBox (rgRow(1).Value & "の" & rgRow(2).Value & "番は" & rgRow(3).Value)
    Exit Sub
   End If
  End If
  Set rgRow = rgRow.Offset(1)
 Loop
 MsgBox ("見つかりません")
End Sub
0785デフォルトの名無しさん2014/12/28(日) 11:00:18.57ID:A3tszYNV
>>783
シンプル厨さんに質問。
どうしてこう汎用的にしないんですか?
Function VLookup2(ByVal Fst As Range, ByVal Snd As Range, ByVal Rng As Range, ByVal Idx As Long) As Variant
  Dim Row As Range
  For Each Row In Rng.Rows
    If Row.Columns(1).Value = Fst.Value Then
      If Row.Columns(2).Value = Snd.Value Then
        VLookup2 = Row.Columns(Idx).Value
        Exit Function
      End If
    End If
  Next
  VLookup2 = ""
End Function
0786デフォルトの名無しさん2014/12/28(日) 12:05:40.58ID:N1PNqEDr
>>785
ワロタw
07877682014/12/28(日) 13:37:39.89ID:Bz93Eklg
>>770>>771>>772
ありがとう。おかげで、条件分岐して目的達成できました。
07887682014/12/28(日) 13:45:45.64ID:Bz93Eklg
連投すまそ。

EXCELの株価4本値データを
EXCEL VBAでEXCEL上にローソク足チャートにできるけど、
EXCELフォーム上にローソク足チャートを表示したいんだけど、
できるかな?

ChartSpaceコントロールでローソク足チャートを表示できるかな?
07897682014/12/28(日) 13:50:26.62ID:Bz93Eklg
EXCELの株価4本値データを
フォームにローソク足チャートを表示するなら、
スレチだが、
VisualBasicのほうが、簡単かな?
0790デフォルトの名無しさん2014/12/28(日) 22:05:55.80ID:jsp0UJL1
ローソクソクチャート?
0791デフォルトの名無しさん2014/12/28(日) 23:07:20.11ID:xJ0vmCJE
ロウソクアシチャートか、わからん
07927682014/12/28(日) 23:54:47.60ID:FaygVLXo
VisualBasicで
フォームにローソク足チャート表示も、
かなり難しそうだな。

どうすればいい?
0793デフォルトの名無しさん2014/12/29(月) 03:01:18.23ID:U0KZGbK1
なにがやりたいかわからん
Excelのグラフに株価チャートってのがあるけど、それじゃだめなん?
0794デフォルトの名無しさん2014/12/29(月) 03:08:38.02ID:r6WyZZaR
セルの値とか色とか書式とか、一切合財を変数として持っておくことはできないんですか?
a = cell(1,1)
cell(2,2) = a
とやっても値しか入りません…
0795デフォルトの名無しさん2014/12/29(月) 04:52:13.66ID:/ysTeZx0
>>794
valueつけなさい
0796デフォルトの名無しさん2014/12/29(月) 05:00:25.54ID:7TbjclpJ
>>794
そもそも全て別途プロパティによって設定するものだから、一発で設定すると言う意味では無理。
但し、一つの変数でそれらを持ち回ると言うことは可能。ぱっと思い付くだけでも2つの方法がある。
一つはユーザー定義型の変数に設定してしまう方法。
もう一つは専用のクラスを作って各設定値をプロパティで持ってしまう方法。
どちらの方法も大基の部分を変数で持ち回ることによって一つの変数で扱うことができる。
設定を一発で行いたいのであれば、別メソッドを作ってその中で色々設定するようにしておけば、
そのメソッドの外からはあたかも1つの命令で設定したかのように記述することは可能。
そんなプロパティやメソッドを持っているクラスを作っておけばいいんじゃないかな。
0797デフォルトの名無しさん2014/12/29(月) 07:01:25.99ID:7TbjclpJ
>>794
あ、ごめん。考えてみたらRangeのオブジェクトで全部拾えるかもしれない。
0798デフォルトの名無しさん2014/12/29(月) 08:13:42.41ID:R9uwHG6j
>>797
無理じゃね?
Range オブジェクトは参照しかもってないと思うけど
0799デフォルトの名無しさん2014/12/29(月) 08:21:32.42ID:KsjOOFfJ
変数代わりのセルにコピーして保持するのが現実解かなあ。
0800デフォルトの名無しさん2014/12/29(月) 08:23:36.50ID:DTx8bzRa
>>598-599
とても助かりました。やっぱり検索するのは2chからだと痛感した。

会社の月末処理でExcelマクロが動かなくて、ActiveXコントロールが認識できないとしか判らず。
WinUpdateは8月から実施してないし、現象の検索もHITせず。xsd削除であっさり治りました。

Updateはしていない、別の事務所のPCも含めて3台で同じ症状。ExcelのサイレントUPDとしか思えない。
MS最悪
0801デフォルトの名無しさん2014/12/29(月) 09:29:54.94ID:5Q7C+5Nb
よくコードは役割ごとに小さなプロシージャに分割しろと言われますが
そうすると大元のプロシージャ内のスコープの変数が使えなくなるじゃありませんか。
こういう問題はみんなどうやって解決してる?
0802デフォルトの名無しさん2014/12/29(月) 09:41:46.24ID:7TbjclpJ
>>801
引数で渡すようにするか、モジュール変数に昇格するか。
0803デフォルトの名無しさん2014/12/29(月) 09:44:31.24ID:lsuC17vA
>>801
良い悪い関係なく

グローバル変数で渡すなり、引数で渡すなり色々あるじゃない。
0804デフォルトの名無しさん2014/12/29(月) 09:48:15.75ID:5Q7C+5Nb
>>802>>803 どっちがいいの?利点と欠点は?
0805デフォルトの名無しさん2014/12/29(月) 10:04:43.42ID:R9uwHG6j
>>804
やってみればわかる
0806デフォルトの名無しさん2014/12/29(月) 10:05:42.48ID:5Q7C+5Nb
やってもわからなければ?
0807デフォルトの名無しさん2014/12/29(月) 10:11:39.70ID:5Q7C+5Nb
もし
引数で渡すように決心していろいろ変更してたけど
やっぱり面倒なのでモジュール変数に昇格しよーっとと再決心した場合
コードに引数で渡してる部分とモジュール変数にしてる部分が混在して
めちゃくちゃ分かりにくいコードになったらどうしますか?
0808デフォルトの名無しさん2014/12/29(月) 10:24:38.17ID:330p/8W6
>>806,807
PCを窓から投げ捨ててついでに豆腐の角に頭ぶつけて氏ね
0809デフォルトの名無しさん2014/12/29(月) 10:28:01.55ID:5Q7C+5Nb
豆腐はどこで買うの?
0810ピラフ2014/12/29(月) 10:30:50.44ID:+Q2pLJ2I
>>809
お豆腐屋さんに行ってお豆腐くださいなーと言えば買えるよ!!
0811デフォルトの名無しさん2014/12/29(月) 10:39:11.63ID:DTx8bzRa
ブロック化推進時代のプログラム
Public Function aaa(ByRef val1 As String, ByRef val2 As String, 〜(略)〜 ByRef val68 As String) As Long

>>807 昇格する時にプレフィクス変えるから間違わない。
0812デフォルトの名無しさん2014/12/29(月) 10:47:39.57ID:7TbjclpJ
>>804
例えば、そのメソッド単体で使用する変数であれば、モジュール変数にすると他の何処かで使っているんじゃないかと
後で分かり辛くなってしまうし、逆に引数で渡した場合は、そのメソッド以外で使おうとすると結局モジュール変数を
作って格納しなければならなくなるから、分かり辛くなる。(受け渡しを行う専用であるプロパティは別)
他にも判断基準は有るけど、メソッドの役割で決めればいいと思うよ。
0813デフォルトの名無しさん2014/12/29(月) 10:59:17.20ID:7TbjclpJ
>>807
分かり辛い所があれば更にメソッドの切り出しやリファクタリングを行って分かり易くする。
役割が明確になっていればそれに沿って細分化してきちんとした名前を付ける。
その辺、その時の気分で行き当たりばったりで決めていいもんじゃなくて、
最初からきちんと把握して作成、変更しておかないと、また手が入る時に分からなくなって
コードが肥大化したり、バグの温床になったりするよ。
0814デフォルトの名無しさん2014/12/29(月) 11:43:13.72ID:R9uwHG6j
>>806
ならどっちでもいいということだろ

>>807
全部書き直せ
0815デフォルトの名無しさん2014/12/29(月) 13:23:03.84ID:7TbjclpJ
>>798
参照先で情報抱えてたら拾えるんじゃないの?
0816デフォルトの名無しさん2014/12/29(月) 13:36:34.24ID:R9uwHG6j
>>815
参照しかしてないから、書き換えられたら終わりでしょ
0817デフォルトの名無しさん2014/12/29(月) 14:32:39.01ID:7TbjclpJ
>>816
なにを言ってるのか分からない。
変数を書き換えてしまえば使えなくなるのは、参照型だろうと値型だろうと同じだし、
そんなことを言ったら変数使うなってことになるんだけど、他に方法あるの?
0818デフォルトの名無しさん2014/12/29(月) 15:02:22.08ID:OWEfB3av
変数使わないでセル使えばイイョw
0819デフォルトの名無しさん2014/12/29(月) 16:54:44.30ID:R9uwHG6j
>>817
変数はセルのコピーだし、必要に応じてさらにコピーできるでしょ
セルもコピーできるけど、それって >>799 だしね
0820デフォルトの名無しさん2014/12/29(月) 17:38:14.07ID:a8RCFqTR
>>819
やっと言ってることが分かった。
変更前状態を保持しておく前提で話てるんだね。
なら、>>796の方法でいいんじゃないの?
別のセルを使う必要もないし、位置情報も保持しておくことが出来る。
範囲制御クラスを作って、その中でセル制御クラスを生成するようにしておけば
かなり汎用性の高い基底部品とすることが出来そう。
0821デフォルトの名無しさん2014/12/29(月) 18:15:15.75ID:R9uwHG6j
>>820
簡単に言うけどセルの情報ってかなりあるから、結構面倒だよ
0822デフォルトの名無しさん2014/12/29(月) 20:12:02.12ID:a8RCFqTR
>>821
まあそうだね。面倒だよ。
だけど上で言ってた役割をきちんと決めて基底部品化しておけば、
後で機能の変更や、言語仕様の変更が有った時でさえそこで吸収出来ることに期待出来る。
全体に変更された命令が散りばめられている場合の修正は仕様変更やテストを考えると、もっと大変なことになるよ。
実際、VBAどうしのバージョン変更でも.Netへの移行でも、そこで随分基本設計から単体テストに至るまで
工数に差が出るのは移行対応したことがある人ならよく分かるはず。
今回の話についてはまず、いきなり全部のセル情報に対応する必要が有るのかと言うことと、
無いのであれば次回必要なときに追加すればいいじゃんと言う考え方もあるよ。
0823デフォルトの名無しさん2014/12/30(火) 08:52:32.19ID:SQ979eKN
Windows7, Excel2010です。
sheet1上にボタンを設置しています。
ボタンのクリック時、A列の何行目に特定の
文字列が含まれているかを
確認するマクロを書きましたが、エラーがでて困っています。

sheet1モジュール上に記述
sub button1_click()
Dim wb as workbook
Dim ws as worksheet
Dim targetrange as range

set wb = thisworkbook
set ws = wb.sheets(”sheet1”)
set targetrange = searchword(”文字列”, ws)
msgbox(targetrange.row)
end sub

標準モジュールに記述
public function searchword(byval value as string, byval ws as worksheet) as range
dim returnrange as range
dim lastrow = ws.cells.specialcells.(xlLastCell)
set returnrange = ws.range(ws.cells(1, 1), ws.cells(lastrow, 1)).find(What:=value, LookIn:=xlvalues, LookAt:=xlwhole)

searchword = returnrange
end sub


set returnrange = ws.range(ws.cells(1, 1), ws.cells(lastrow, 1)).find(What:=value, LookIn:=xlvalues, LookAt:=xlwhole)の部分で
オブジェクト変数またはwithブロックが設定されていませんとなります。
検索文字列は必ずあるので、エラー理由がわかりません。
0824デフォルトの名無しさん2014/12/30(火) 09:00:19.48ID:cs0HXrLx
>>823
ぱっと見しかしてないんで参考になるか分かんないけどさー

>dim lastrow = ws.cells.specialcells.(xlLastCell)

これっていきなり行のオフセットが取れる命令なの?
0825デフォルトの名無しさん2014/12/30(火) 09:43:39.30ID:cs0HXrLx
>>822
このスレ見てるとよく思うけどさ、知識がかたよってる人多いよね。
何かを実現するための命令とか方法とかすっごく詳しいのに、
構造化プログラミングの意味理解してなかったり
根本のところですっぽり抜け落ちてる感じ。
なんかスーパーサイヤ人にはなれるけど空は飛べないドラゴンボールの悟天みたい
0826デフォルトの名無しさん2014/12/30(火) 10:02:48.75ID:uJmo3HlO
>>823
使ってるコードをそのまま晒せ

VBEからコピペすればsetとか型名とか先頭大文字になるはずなので
そのまま晒すのが恥ずかしいから、必要であるだろう一部を抜粋して2chに書いてるんだろうが
初心者にはどこが必要なのかなんて判断できないんだし、一部を隠す過程で新たなバグを埋め込むハメになるんだから

例えば、そのコードをそのまま実行すれば、君が言うようなエラーは出ない
いや、問題なく動くって意味ではなく、実行エラーの前にコンパイルエラー(構文エラー)が出るからね
VBAはVB.NETと違って
Dim 変数 = 値
の書き方は出来ないし、functionに対してend functionではなくend subになっているのだからなw

ws.cells.specialcells.(xlLastCell)も、命令の意味的には大体合ってるが
括弧の前のカンマはやはり構文エラーだし、最後に.Rowを付けないと
返ってくるのはLastRowではなくLastCellValueになっちゃう

それ以外で気になるところは

searchword = returnrange → オブジェクトの代入は自作関数の戻り値として代入する場合もSet必須

あたりかな
Setを付けないとオブジェクトそのものではなくデフォルトプロパティの.Valueを代入しようとするが
Range型のsearchwordに文字列や数値の.Valueを代入しようとしればエラーになる
0827デフォルトの名無しさん2014/12/30(火) 13:55:05.97ID:oHYpnAi/
>>826
なげーんだよ、バカ
3行以内に収めろよ、チンカス
0828ピラフ2014/12/30(火) 13:58:29.13ID:KtQfQ9/w
>>827
丁寧できれいな文章だと思うよ。
    ___
   ,;f     ヽ
  i:         i   ありがたやありがたや
  |        |  ///;ト,
  |    ^  ^ ) ////゙l゙l;
  (.  >ノ(、_, )ヽ、} l   .i .! |
  ,,∧ヽ !-=ニ=- | │   | .|
/\..\\`ニニ´ !, {   .ノ.ノ
/  \ \ ̄ ̄ ̄../   / .|
0829デフォルトの名無しさん2014/12/30(火) 18:24:39.42ID:NlEdkobf
>>823
さすがにそのコードがそのまま実際に動いてるわけはないと思うが
sheet1とか、どっか他にもsearchwordって関数ないか?

>>826
ちょっと気になったんで言っとくけど
>Range型のsearchwordに文字列や数値の.Valueを代入しようとしればエラーになる
searchwordが有効な単一Rangeなら、エラーにはならないぞ
Rangeのデフォルトプロパティへの代入、つまりsearchword.Valueへの代入だとみなされる
エラーでないけど思ったように動かないパターンの一つ

あとカンマじゃなくてピリオド(ドット)だとかいうホントにどうでもいいツッコミも
08301/22014/12/30(火) 19:54:46.31ID:mybMGrin
お助け下さい…。
やりたいこと:
エクセルファイルと同じフォルダにtest.emlというEメールファイルがあり、その添付ファイルを保存したい。
(本当はいくつもファイルがありますが、今回は一つだけでいいです)

参照設定は以下の画像です。
http://www.dotup.org/uploda/www.dotup.org80947.png

eml_file.SaveAsFileの時点で、
実行時エラー438
オブジェクトは、このプロパティまたはメソッドをサポートしていません。
が発生します。

Attachment.SaveAsFileはそもそもexcelvbaでは使えないのでしょうか?
http://msdn.microsoft.com/ja-jp/library/microsoft.office.interop.outlook.attachment.saveasfile(v=office.12).aspx

コードは次のレスに貼ります
08312/22014/12/30(火) 19:55:14.75ID:mybMGrin
Sub test()
'emlをmsgオブジェクトに読み込む
emlpath = ThisWorkbook.Path & "\test.eml"
Set stm = CreateObject("ADODB.Stream")
Set msg = CreateObject("CDO.Message")
stm.Open
stm.LoadFromFile emlpath
msg.DataSource.OpenObject stm, "_Stream"
stm.Close

'attachmentsで一個目のファイルを取得
Set eml_file = msg.Attachments(1)
'ファイル名の確認
Debug.Print (eml_file.Filename)
'保存。しかしが動かない
eml_file.SaveAsFile (ThisWorkbook.Path & "\ああああ")

msg.Close
End Sub
0832デフォルトの名無しさん2014/12/30(火) 20:04:34.47ID:PmyDHL5v
大規模なプログラムを作るとき
メインとなるものから作りプロシージャや関数はあとで作るトップダウン方式と
さきにプロシージャや関数を作りあとでメインとなるものを作るボトムアップ方式では
どちらが好ましいですか?
0833デフォルトの名無しさん2014/12/30(火) 20:10:51.32ID:fO5AEx8O
好ましいというのは、どういう知見から述べたものを期待しているのかが
不明確なので答えが複数になってしまう。
因みに「好ましい」というのは、あくまでも感情的表現なのでやめるべきだ。
0834デフォルトの名無しさん2014/12/30(火) 20:41:11.44ID:PmyDHL5v
じゃあプログラマの視点からの好ましさ。
作りやすさやバグが発生しにくさや今後のメンテナンス性など。
0835デフォルトの名無しさん2014/12/30(火) 20:48:29.79ID:fO5AEx8O
プログラマの視点だと個人の好みで別れるだけで、それぞれの個人の
スキルによって「不得手な方」を使うと作りやすさが落ちるし、バグが
発生しやすくなる。

事後的なメンテナンス性は、「出来上がっているもの」に対する評価に
なるので、どのような経過で作成されたかは本来的には影響しない。
0836デフォルトの名無しさん2014/12/30(火) 21:06:29.87ID:3rL5qUGa
>>830

Sub test()
'emlをmsgオブジェクトに読み込む
emlPath = ThisWorkbook.Path & "\test.eml"
Set stm = CreateObject("ADODB.Stream")
Set msg = CreateObject("CDO.Message")
stm.Open
stm.LoadFromFile emlPath
msg.DataSource.OpenObject stm, "_Stream"
stm.Close

'attachmentsで一個目のファイルを取得
Set eml_file = msg.Attachments(1)
'ファイル名の確認
Debug.Print (eml_file.Filename)
'保存。しかしが動かない
eml_file.SaveToFile (ThisWorkbook.Path & "\" & eml_file.Filename)

End Sub

Attachments(1)で戻ってくるオブジェクトはIBodyPart
Attachmentではないから、使うべきメソッドはIBodyPart.SaveToFile
ついでに、保存時にああああっていう拡張子がないファイルになるのを修正しといた
添付ファイルがない時は考えなくていいよね
後、変数宣言がなくて糞見づらいのと、参照設定してるのにCreateObject使ってるのは意味がないから、しかも参照設定するんだったら下のが足りないよー
Microsoft ActiveX Data Objects x.x Library
Microsoft CDO for Windows 2000 Library
0837ピラフ2014/12/30(火) 21:37:03.12ID:KtQfQ9/w
>>834
ピラフはきちんと設計してこれで動くってわかっているときは
ボトムアップかな。末端のもの作ってテストして、うん、動くねってこと
確認してそれを使用するところを作ってく。プロトタイピングとか
手探りでどう実装したがいいか考えるときはトップダウン。
0838デフォルトの名無しさん2014/12/30(火) 21:58:28.23ID:cs0HXrLx
>>832
そう言った視点で作り上げようと言ってること自体が既におかしいことに気づかないといけない。
なぜならコーディングするときは既に仕様書が出来上がっていて、それに沿って作成されるべきだから。
では仕様書を作成するときはどうかと言うと、どんな機能が有ってどんな部品が必要で、
逆にその部品はどんな役割でどうすれば効率よく使えるかを両面から考えなければいけない。
だからクラス図やシーケンス図などのUMLを取り入れながら作ってるところも少なくない。
前にも話したけれど、その辺は行き当たりバッタリで決めていいもんじゃないと思うよ。
0839デフォルトの名無しさん2014/12/30(火) 22:04:59.13ID:PmyDHL5v
ピラフで気になったけど
チャーハンとはどう違うんだ?

味があっさりしたものがピラフというイメージがあるけど。
それで自分の好みはピラフだけどね。
0840デフォルトの名無しさん2014/12/30(火) 22:06:29.14ID:PmyDHL5v
トップダウンだと
作っている過程の途中でそのサブとなるプロシージャや関数がまだ出来上がってないから
テストできないから非効率じゃないのか?
0841デフォルトの名無しさん2014/12/30(火) 22:12:25.60ID:fO5AEx8O
ユニットテストに、そのユニット以外のモジュールが必要だとしたら
そのユニットの設計に問題がある。
0842デフォルトの名無しさん2014/12/30(火) 22:14:04.66ID:cs0HXrLx
>>840
現実問題としてそう言ったことはよく起こる。
そのときはスタブを作ってテストを行う。
0843デフォルトの名無しさん2014/12/30(火) 22:14:35.19ID:dsZ32jxl
ピラフは洋食
チャーハンは中華

つまり出てくる店が違う
0844デフォルトの名無しさん2014/12/30(火) 22:21:51.11ID:4OrPIxQI
コマンドパターンで、コマンドオブジェクトのユニットテストは
どうすればいい?
0845デフォルトの名無しさん2014/12/30(火) 22:30:14.57ID:fO5AEx8O
どうすればいいかと聞く方が間違ってる。
コマンドオブジェクトのユニットテストにコマンドパターン自体は
突き詰めて言えば無関係。
0846デフォルトの名無しさん2014/12/30(火) 22:35:36.51ID:PmyDHL5v
>>843
じゃあこんな感じか?

Function GetPirafu() As String
GetPirafu = FriedRice()
End Function

Function GetCharhan() As String
GetCharhan = FriedRice()
End Function

Function FriedRice() As String
FriedRice = "Test"
End Function
0847デフォルトの名無しさん2014/12/30(火) 22:38:58.36ID:PmyDHL5v
>>842
そのよくいうスタブってどうやって作るんだ?

例えばFunction GetPirafu()がまだ完成していないときに
仮に"Test"という文字列だけ返させて全体の実行をとりあえず実施したい場合
つくりかけの「GetPirafu」という名前のFunctionを仮の名前にかえないといけなくないか?
0848デフォルトの名無しさん2014/12/30(火) 22:43:17.62ID:fO5AEx8O
GetPirafu()の中身を変える必要はあるが、なぜ名前を変える必要があると思った?
0849デフォルトの名無しさん2014/12/30(火) 22:53:18.14ID:PmyDHL5v
>>848
本物と仮のプロシージャを上下となりに置いておけば分かりやすいから
そのためには仮で実行してるときはそれを呼び出す側でコードを変えないようにするために
本物は一時的に呼ばれないようにするために他の名前にしないといけない。
0850デフォルトの名無しさん2014/12/30(火) 22:58:17.11ID:fO5AEx8O
>>849
その条件だと>>847 で
> 例えばFunction GetPirafu()がまだ完成していないときに
という条件が成立しない。

つまり、テスト条件が「頭で考えてる事と口に出した事が矛盾している」状態
要するに、もっとちゃんと考えないと、とてもじゃないがまともなプログラムは
できあがらない。
0851デフォルトの名無しさん2014/12/30(火) 23:06:53.87ID:cs0HXrLx
>>847
なんで名前変える必要があるのか。
そもそも役割によってクラス分けされていればそのクラスファイルをスタブのものに置き換えてしまえばいい。
よしんば名前を変える必要があったとして、それがどれほどの手間だと言うのか。
質問の意図が分からない。
0852デフォルトの名無しさん2014/12/30(火) 23:15:53.95ID:PmyDHL5v
いやここではクラスファイルを使う開発の話じゃなくて
ExcelのVBAの話なんだ
0853デフォルトの名無しさん2014/12/30(火) 23:32:41.45ID:cs0HXrLx
>>852
理解していないようだけど、VBAにクラスファイルはあるし、モジュールもクラスの一種。
モジュールは生成しなくても使用出来る暗黙のインスタンスを持ったシングルトンのクラスだよ。
08548302014/12/30(火) 23:53:00.60ID:mybMGrin
>>836
うおおおおおおおおありがとうございます!!!
おかげさまでうまく動きました。感激です。
良いお年を!
0855デフォルトの名無しさん2014/12/31(水) 01:30:06.75ID:IC4dC0tF
超初心者で、ここで質問していいかすら分からないんですが、昔、2003で使ってたエクセルのマクロを、今のエクセルで使えるようにするには、何を見て勉強すれば良いのでしょうか?

もしくは、新たに勉強するとして、アクティブ領域を選択して、データの入っているかいないか判断して、罫線を引くマクロが作りたいのですが、何を参考にすれば良いでしょうか?
何か参考になりそうな本とかHPとか教えて頂けると有り難いです
0856デフォルトの名無しさん2014/12/31(水) 01:37:43.01ID:WeSzlRta
>>855
その程度の内容のマクロなら、昔作ったやつがそのまま新しいExcelでも動くよ
08578302014/12/31(水) 01:41:43.36ID:yE66laPz
>>855
vba 入門
とかでぐぐって、操作方法を読み流す

後はマクロの記録
でぐぐって、マクロの記録をいじれるようにする

後はどうにかなるだろう
0858デフォルトの名無しさん2014/12/31(水) 10:14:09.57ID:AAeB/eMk
>>825
職業プログラマじゃない事務職の人とかが前任者のコードと戦いながら我流で身に付けたってケースが多いだろうから仕方ないかと
まあ俺もその一人なんだが、逆にそういう基本的な部分を学べる書籍とかあれば教えて欲しい
0859デフォルトの名無しさん2014/12/31(水) 11:06:36.43ID:YwQfrYSW
たかだかエクセルマクロ作るのに基本とかいらんわ
それでちょっと仕事が楽になるだけで十分
0860デフォルトの名無しさん2014/12/31(水) 11:13:18.95ID:siWjBdTq
>>858
変な癖が付いたら、どんな再訓練をしてもほぼ直らない事が大昔から分かってる。
0861デフォルトの名無しさん2014/12/31(水) 11:18:52.27ID:oWiDVyxP
VBA以外の言語に触れる機会があれば治るよ
多分
0862デフォルトの名無しさん2014/12/31(水) 13:49:49.97ID:A5Iursra
VBAの書籍自体ができるだけ最短でプログラム組めるように作ってある事が多いから
基本は相当抜けてる感じがする
つぎはぎの知識でなんとかやりくりしてるようなイヤな気分
0863デフォルトの名無しさん2014/12/31(水) 14:45:03.05ID:IC4dC0tF
>>856
>>857
ありがとうございます

マクロ一つで20種類くらいの機能があり、罫線の機能だけ使っているので、該当するプログラムがどれか分からないと諦めていましたが、ちょっと勉強して見ます
0864デフォルトの名無しさん2015/01/01(木) 00:55:07.81ID:60M1TNUZ
明けましておめでとうございます。
質問です。
この時期、名前欄でおみくじみたいなことができたと思うんですが、
どうやるんでしたっけ?
0865 【小吉】 【1037円】 2015/01/01(木) 01:01:20.38ID:w0NuItq7
なにそれ
0866 【だん吉】 【1835円】 2015/01/01(木) 07:43:49.64ID:g7S+XSL4
へー
0867デフォルトの名無しさん2015/01/01(木) 10:45:45.70ID:2MLrq9sU
excelのイースターエッグにそんなのあったっけ
ってか全然vbaに関係ないだろ
0868デフォルトの名無しさん2015/01/01(木) 15:21:00.08ID:ni6wEQmb
すみません、初歩的なことかもしれませんが・・・
いくつかの結合セルが横に並んでいて、それぞれに値が入っている状態で
この数値を配列に一気にとりこみたいんですけど、どのような方法があるでしょうか?
cellsやoffsetでひとつひとつずらしていっても、結合された中で移動してしまって・・・
offsetは一発目はうまくいけるんですけど、その次になるとセル単位になってしまうようで
0869デフォルトの名無しさん2015/01/01(木) 16:15:47.29ID:O1Wppn1v
>>868
Dim rg As Range
Set rg = Range("A1").MargeArea
Set rg = rg(1).Offset(0, rg.Columns.Count).MergeArea
結合セル単位で見ていくならこんな感じ?
もし範囲が分かっていて結合単位が固定なら、まとめて読み込んだ上で、
結合単位で飛ばし飛ばし読む方が早いかも。
0870デフォルトの名無しさん2015/01/01(木) 16:40:43.18ID:ni6wEQmb
>>869
ありがとうございます
セルの結合単位はバラバラで、たまに結合されてないセルも混ざっていたり
方眼紙みたいに細かいセルを好き勝手に結合しまくって作った表の各値をDBに取り込もうとしてまして

結局、最初のセルをアクティブ→offset(0,1)でデータ取得してそのセルをアクティブ→offset・・・
と繰り返して取得してみました
0871デフォルトの名無しさん2015/01/01(木) 17:27:52.61ID:yP9EWtKr
位置とか結合状況に意味が無いなら
全部読みこんでから、Emptyならはじけば良い気がする
0872デフォルトの名無しさん2015/01/01(木) 18:09:13.22ID:ni6wEQmb
>>871
中には空白のデータがあるので・・・
数は決まってるので、データ取得→となりへ移動→・・・ってのをその数だけ繰り返してってやってます
ただ、たまに表のフォーマット変更してる人とかもいるのでやっかいで
もう少しスマートな方法がないものかと模索中です
0873デフォルトの名無しさん2015/01/01(木) 18:27:06.39ID:g7S+XSL4
一行追加して、どれがデータカラムかのフラグを立てておくとか?
0874デフォルトの名無しさん2015/01/01(木) 19:40:21.80ID:ni6wEQmb
>>873
あー、そうですね
てか、全て項目名はあるんで、それをフラグにセルの結合状態を把握できそう
それか、そこから横ではなく縦にデータを拾っていくのも悪くないかも・・・
なんかすごいヒントを貰った気がしました
ありがとうございます
0875デフォルトの名無しさん2015/01/01(木) 20:24:08.08ID:3WRveYWM
経験上、作りの汚いデータシート的な物から値を拾うのは
無理にセルの操作をするより全部テキストとして吐き出して正規表現でゴリゴリやったほうが早かったりする
0876デフォルトの名無しさん2015/01/01(木) 21:21:17.54ID:ni6wEQmb
>>875
なるほど、そうかもしれませんね
データシート自体は偉い人が作った激細方眼紙から作った表で、作り直す事とかできなくて
それを数十人で使ってるんですが、今回それらの値を全て集めてDBみたいなものを作ろうということになって

とりあえず休みの間にコードくらい作っておこうと格闘中です
どうもありがとうございました
0877デフォルトの名無しさん2015/01/01(木) 21:27:36.24ID:BK9p898t
>>875
ないわ〜
凝ったレイアウト使う奴はデータの内容も凝ってるだろうから、改行、カンマ、ダブルクォーテーションとかで破綻するのがオチだろ
0878デフォルトの名無しさん2015/01/01(木) 23:03:57.80ID:RalYKa+x
お前破綻て言いたいだけちゃうんか?
0879デフォルトの名無しさん2015/01/02(金) 02:29:07.41ID:ysnbwkKU
>>870
for c=1 to 100
if cells(1,c).mergearea(1).column = c then
なんか処理
end if
next
または
c=1
do
なんか処理
c=c+cells(1,c).mergearea.columns.count
loop while c<100
0880デフォルトの名無しさん2015/01/02(金) 07:13:30.35ID:ibIo6Doo
>>878
正規表現でカンマとかダブルクォーテーション含む CSV 処理できたら尊敬するわ
0881デフォルトの名無しさん2015/01/02(金) 15:03:57.52ID:0gJtgWhB
>>880
正規表現にこだわりすぎて無駄な労力消費してるやつな
むしろ筋金入りのアホだわw
0882デフォルトの名無しさん2015/01/02(金) 16:15:40.68ID:ysnbwkKU
http://www.din.or.jp/~ohzaki/perl.htm#CSVwithCRLF
これとかvbaで書き直したらいいんでないの?
0883デフォルトの名無しさん2015/01/02(金) 17:01:31.00ID:Uo4jfJGT
性器表現ってなんなの?
覚えたらVBA以外の言語や環境で使える?
0884デフォルトの名無しさん2015/01/02(金) 17:22:01.43ID:ibIo6Doo
>>883
テキスト処理をする機会が多いなら、覚えておいて損はない
スクリプト言語なら大抵標準的に使えるし、コンパイル言語でもライブラリーに入ってることが多い
ただ、ものによって微妙に仕様が異なるので注意が必要だけど
0885デフォルトの名無しさん2015/01/02(金) 18:31:07.95ID:Uo4jfJGT
ではこんな性器表現はどうですか?
http://yusa007.exblog.jp/22983174/
0886デフォルトの名無しさん2015/01/02(金) 18:50:07.51ID:0gJtgWhB
テコキスト処理をする機会が多いなら、覚えておいて損はないな
0887デフォルトの名無しさん2015/01/02(金) 18:52:56.97ID:DxCfO5+j
2chビューワーのNGで使える。
0888デフォルトの名無しさん2015/01/02(金) 19:52:00.48ID:Uo4jfJGT
Withって使えば見にくくなるから使わないようにしてるけど
PCの前のみなさんはどうしてます?
With使ったほうが処理速度が速くなったりします?
0889デフォルトの名無しさん2015/01/02(金) 20:47:41.40ID:ibIo6Doo
>>888
> With使ったほうが処理速度が速くなったりします?
(まともに使えば)Yes.
0890デフォルトの名無しさん2015/01/02(金) 20:48:31.05ID:buhXaHro
>>888
眼科いけw
0891デフォルトの名無しさん2015/01/02(金) 21:12:29.74ID:RfOBtX6r
With使ったほうが早いってさ

http://officetanaka.net/excel/vba/speed/s4.htm
0892デフォルトの名無しさん2015/01/02(金) 21:50:35.59ID:Uo4jfJGT
Function Respond(Number as Integer) as String
Select Case Number

 Case 889
 MsgBox "ありがとう"

 Case 890
 MsgBox "あほ"

 Case 891
 MsgBox "ありがとう"

End Select
End Function
0893デフォルトの名無しさん2015/01/02(金) 21:51:32.60ID:ibIo6Doo
>>892
戻り値設定しろよ
0894デフォルトの名無しさん2015/01/02(金) 21:51:59.98ID:Uo4jfJGT
自作のFunctionを作る場合に
引数に名前を付けるにはどうしますか?

もともと組み込まれている
Range("A:A").Find What:="test", ........
の「what」みたいなやつのことです。
0895デフォルトの名無しさん2015/01/02(金) 22:07:13.70ID:befzNVO8
>>894
むしろ名前の無い引数なんて定義できないんだが
0896デフォルトの名無しさん2015/01/02(金) 22:14:42.67ID:Uo4jfJGT
>>895
× むしろ名前の無い引数なんて定義できないんだが
○ Functionの引数で定義した変数名がそのまま引数の名前になりますよ
0897デフォルトの名無しさん2015/01/02(金) 22:16:25.86ID:Uo4jfJGT
ExcelからOutlookを操作してメールを作成させているのですが
その本文(プロパティbody)にフォントを設定させたいんです。
どうすればいいですか?

とりあえずbodyのすべての領域で
「Arial」
「10ポイント」
を設定したい。
0898デフォルトの名無しさん2015/01/02(金) 22:26:22.90ID:DH7mYziM
また、無意味なhtmlダイレクトEメールが送られる人が増えるのか…
ご愁傷さま…
0899デフォルトの名無しさん2015/01/02(金) 22:50:02.03ID:Uo4jfJGT
オブジェクト変数のコピーをつくるにはどうすれば一番簡単ですか?
Set objB = objA
のようにするとご存じのとおり同一のものを指してるだけになるからもしあとでobjBの中身を変更したらobjAも変更されちゃう。
そうじゃなくクーロンみたいに別物のコピーを作成したい。
0900デフォルトの名無しさん2015/01/02(金) 23:00:06.56ID:befzNVO8
>>896
名前の無い引数が「定義」できるなら、そのやり方教えてくれんかね
0901デフォルトの名無しさん2015/01/02(金) 23:04:38.76ID:jTfiwI/a
ParamArray Args()
とかすればいいんじゃね
0902デフォルトの名無しさん2015/01/02(金) 23:07:18.22ID:ibIo6Doo
>>899
基本、そのオブジェクトに頼むしかない
中身はそいつしかわからんし
あと、オブジェクト 深いコピー あたりでググっておくことをおすすめする
0903デフォルトの名無しさん2015/01/02(金) 23:25:24.62ID:befzNVO8
>>901
なるほど

そもそも名前の無い引数定義したって、その関数本体で使えないからな
厳密にはそれArgsって名前ついてるけど

ParamArrayで定義すると名前付き引数形式で呼び出せない
配列の各要素には名前はない

ってことで、名前の無い引数を定義してるわけではないけど
まあ、ほぼ名前の無い引数だと思って良いかもしれんな
0904デフォルトの名無しさん2015/01/02(金) 23:37:22.86ID:I0RnD+zi
>>899
あなたはオブジェクトと言うものについて、ひょっとしたらよく分かっていないかもしれません。
そう言うことが出来るかどうかは、扱うオブジェクト側で決まることで、
操作側が決められることではありません。
0905デフォルトの名無しさん2015/01/02(金) 23:52:43.23ID:UnzVlE4j
>>899
浅いコピー・深いコピーの違いを知っている?
A{B}、B{C}

ABCをオブジェクトとして、Aの中の全メンバを、
単純にコピーすると、Bの参照がコピーされる(浅いコピー)

Bの中のCまでコピーしたいのなら、さらに再帰的にたどって、
コピーしていく(深いコピー)
何階層まで深くコピーしていくか、考えるべき
0906デフォルトの名無しさん2015/01/03(土) 01:26:06.94ID:U8YCHJk1
参照型と値型ってVBAにもあるのかよ
0907デフォルトの名無しさん2015/01/03(土) 01:26:48.48ID:V7Epa3Fo
>>903
横からだけど
>〜〜中略〜〜かもしれんな
ありがとうって言おうよ
0908デフォルトの名無しさん2015/01/03(土) 01:47:09.05ID:HjhZoqCE
>>907
俺には>>903が譲歩しているように見えるがな
0909デフォルトの名無しさん2015/01/03(土) 02:02:22.90ID:V7Epa3Fo
>>908
あらやだ、確かに
>>903
すみませんでした
0910デフォルトの名無しさん2015/01/04(日) 14:26:40.19ID:/gxPgUa3
VBAの参考書を買ってくると決まって変数に日本語を使ってるの
なんとかしてくれませんか
イライラします
0911デフォルトの名無しさん2015/01/04(日) 14:43:58.85ID:WUO2qk/H
>>910
VBAの参考書なんて買うような人には日本語じゃないと通じないでしょ
0912デフォルトの名無しさん2015/01/04(日) 15:05:47.69ID:YkD/L/+Q
変数名を人物名や実在の某にするのは楽しいよ
0913デフォルトの名無しさん2015/01/04(日) 15:18:07.98ID:lFfpcuGH
ExcelからWordを操るとき、
まだWordが開いてなければCreateObject("WordApplication")
すでにWordが開かれていたらGetObject(, "Word.Application")
の呪文を唱えますが、
この条件分岐はどう書きますか?
0914デフォルトの名無しさん2015/01/04(日) 15:19:27.19ID:lFfpcuGH
>>912
Unko=, Manko=, Shikko=, Chinnko=, Seshiumu-san=、みたいな感じか?(ワラ
0915デフォルトの名無しさん2015/01/04(日) 15:44:49.78ID:ARF0W7q8
For Each 男 in 彼女.元彼
If 男.ち○こ.size > 20 Then

ここまで書いたがつまらん
0916デフォルトの名無しさん2015/01/04(日) 15:55:40.40ID:lFfpcuGH
For Each 男 in 彼女.元彼
If 男.ち○こ.size > 20 Then
 If 男.年収 > 8000000 Then
  If 男.イケメン=True Then
   彼女.結婚 場所:="ハワイ", 離婚慰謝料:=100000000
   Exit For
  End If
 End If
End If
Next 男
0917デフォルトの名無しさん2015/01/04(日) 17:53:02.59ID:/rCACZxc
>>910
ヘルプ理解できない素人しか買わない入門書だろ?
0918デフォルトの名無しさん2015/01/04(日) 18:04:03.70ID:lFfpcuGH
New ○○○
CreateObject("○○○")

この2つの違い、使い分け、etc.、はどうなっていますか?
0919デフォルトの名無しさん2015/01/04(日) 18:11:24.12ID:lFfpcuGH
Sub test()
Dim a As Range
Dim b As Range
Set a = Cells(1, 1)
Set b = Cells(2, 1)
b = a
End Sub

こうやったら下のセルの値から上のセルの値にかわるだけで
書式類は一切受け継がれないのですが
それはどう実現しますか?

例えば上のセルにフォントが「メイリオ」、サイズが48、赤字に太字で、
下のセルはなにも書式を設定していないとき
下のセルも上のセルのように派手な書式にしたいけど値は「変えない」ようにしたいんです。
0920デフォルトの名無しさん2015/01/04(日) 19:12:28.43ID:rmXjkuoF
>>918
事前バインドか実行時バインドか
参照設定してるかしてないか

>>919
a.Copy
b.PasteSpecial Paste:=xlPasteFormats
0921デフォルトの名無しさん2015/01/07(水) 04:38:20.73ID:P3oLcr3v
配列変数の中の値をランダムに入れ替える
もしくは、重複無しでランダムに全ての値を参照するにはどうするのが綺麗にできますか?
0922デフォルトの名無しさん2015/01/07(水) 05:56:52.51ID:rfiFGjwL
綺麗とか綺麗じゃないとかは個々の主観の問題なので
君が綺麗だと思う方法は、君にしか解らないよ

因みに大まかな傾向としては、俺はコード量は多くても、処理的に無駄がないものが綺麗だと思うが
初心者は本質的に無駄が多くても、コード量さえ少なければ綺麗だと感じることが多いようだ
0923デフォルトの名無しさん2015/01/07(水) 13:01:57.89ID:HGDshGmE
>>921
「配列の添え字」と「乱数」の配列を作り、それを乱数でソートしちゃう。 のが単純明快と思ってる。

で、1〜Nをランダムで並べた配列を返す。関数なり作っておくのも良いのではないだるおか
1〜Nのランダム配列を作り、NextValで次の値を返しEOFで終わるクラスなんかを作っちゃうのをお勧めする
0924デフォルトの名無しさん2015/01/07(水) 13:16:02.90ID:HGDshGmE
暇だから外部設計したよ
class:
MyCls1KaraNMadeRandomDeKaesuyo()
public:
Sub Init(ByRef count As Long, Optional ByVal autoReload As Boolean = False)
Sub Reload()
Function CurrentVal() As Long
Function NextVal() As Long
Function EOF() As Boolean
0925デフォルトの名無しさん2015/01/07(水) 14:17:24.53ID:dbIslmeP
綺麗かどうかはともかく、配列の順番を入れ換える有名な方法
Option Base 0で配列をaとする

Randomize
For i = UBound(a) To 1 Step -1
  x = Int(Rnd() * i)
  tmp = a(x): a(x) = a(i): a(i) = tmp
Next i
0926デフォルトの名無しさん2015/01/07(水) 14:32:10.72ID:HGDshGmE
tmp出し入れしてナカをグチョグチョにかき回すのか、
実データの代入が重いデカい構造体とかでなけりゃあっさりだな。
(知らなかったなんて言えない・・・)
0927デフォルトの名無しさん2015/01/07(水) 14:53:17.53ID:RijYyMWz
セルに書き出してソート
0928デフォルトの名無しさん2015/01/07(水) 15:26:33.82ID:i0B3psCp
次スレ改変されてね?
0929デフォルトの名無しさん2015/01/07(水) 15:28:58.39ID:aspvvccd
>>928
あれ、前の次スレ作った時に、板がおっこって残った残骸だよ
0930デフォルトの名無しさん2015/01/07(水) 16:29:21.52ID:eMy/P6IA
>>923
ソートは良くてもO(n log n)になるから
>>925 のがいいよ。
実装合ってるかはよく見てないけど。
C++ならstd::shuffle。
0931デフォルトの名無しさん2015/01/07(水) 16:59:07.36ID:mBi1+ULC
>>928
このスレ自体荒しが勝手にテンプレとった
もとのテンプレはこれ↓

Excel VBA 質問スレ Part32
http://toro.2ch.net/test/read.cgi/tech/1381151995/1
0932デフォルトの名無しさん2015/01/07(水) 17:33:18.73ID:7MvMVdqp
>>923-924
For Eachか、せめてForで値取れるようにしろよ
0933デフォルトの名無しさん2015/01/07(水) 17:37:58.65ID:FUg+sBMh
じゃ、元のテンプレで立てますか。
0934デフォルトの名無しさん2015/01/07(水) 22:09:32.79ID:59kVhZXe
さんせーい^^
0935デフォルトの名無しさん2015/01/07(水) 22:22:43.19ID:z7fkvQD+
なんだ、去年の時点で既に立ってるじゃん

Excel VBA 質問スレ Part36 [転載禁止]©2ch.net・
http://peace.2ch.net/test/read.cgi/tech/1419718732/
0936デフォルトの名無しさん2015/01/07(水) 22:28:43.39ID:0eah282z
去年の12月末に誰かが立てておいてくれたみたいだね
0937デフォルトの名無しさん2015/01/08(木) 05:31:18.01ID:S33vpzXA
立てておいてくれたっていうか、>>1に自分の思い通りの事書きたい早漏が
早すぎるスレ立てしてたってだけの話だろw

コードOKはいいんだけど、最後の一文みたいにあそこまでやると流石にキモい
0938デフォルトの名無しさん2015/01/08(木) 07:56:56.27ID:hoNDXFcB
またテンプレ厨が悔しくて騒いでるのか。
あれだけがんじがらめのテンプレで問題になってたのに全然懲りてないんだなw
0939デフォルトの名無しさん2015/01/08(木) 09:39:57.44ID:oIh+D3uI
>>925
これ凄いなー
教えてくれてありがとう
0940デフォルトの名無しさん2015/01/08(木) 18:19:42.18ID:C49kCY9s
なんだまたテンプレ悔しいからはずす厨(荒らし)が騒いでるのか
0941デフォルトの名無しさん2015/01/08(木) 18:54:44.50ID:hoNDXFcB
↑
「テンプレ悔しいからはずす厨(荒らし)」

長すぎ。もっと短く名前を纏める力量無いの?
0942デフォルトの名無しさん2015/01/08(木) 19:21:15.27ID:1Sly3QMm
はずらし
0943デフォルトの名無しさん2015/01/09(金) 02:42:58.78ID:LHT/Hpmh
複数シートをシート毎にPDFファイル化したい
保存先、ファイル名、用紙サイズ、を指定したい

可能ですか?何行ぐらいですか?
0944デフォルトの名無しさん2015/01/09(金) 04:16:09.99ID:nDcq+xLw
保存先:
ファイル名:
用紙サイズ:

↑これやっといて

4行だな。
0945デフォルトの名無しさん2015/01/09(金) 08:13:46.92ID:kEHgW7lK
なんか今朝からエクセルvbaのボタンが押せなくなった
なんだろうこれは
0946デフォルトの名無しさん2015/01/09(金) 10:48:54.69ID:BcP6vX0h
>>945
昨年12月のActiveX絡みの不具合を含んだWindowsUpdateが
今頃になって適用されたんじゃないの?

http://peace.2ch.net/test/read.cgi/bsoft/1418946875/142-162
この辺読んでみ
0947デフォルトの名無しさん2015/01/09(金) 11:03:57.31ID:rJhs2R4+
MSはVBA、ひいてはAccessまで含めて、殺したいのかもしれないね。
0948デフォルトの名無しさん2015/01/09(金) 11:06:44.46ID:qnMsrJh9
うちはWindowsUpdateかけてないのに発生したからな。>ActiveXコントロールが使えない
0949デフォルトの名無しさん2015/01/09(金) 12:15:23.36ID:kEHgW7lK
>>946
んあー!
そういうことか

週明けにプログラム改修せんとなあ
0950デフォルトの名無しさん2015/01/09(金) 16:50:15.65ID:GzFHQ3J4
test
0951デフォルトの名無しさん2015/01/09(金) 16:54:14.73ID:qnMsrJh9
'test' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
0952デフォルトの名無しさん2015/01/09(金) 16:57:52.42ID:GzFHQ3J4
次スレ立てます
0953デフォルトの名無しさん2015/01/09(金) 17:02:07.91ID:GzFHQ3J4
立てました


Excel VBA 質問スレ Part36
http://peace.2ch.net/test/read.cgi/tech/1420790342/l50
0954デフォルトの名無しさん2015/01/09(金) 17:30:12.57ID:BcP6vX0h
>>953
重複&テンプレ改悪

こっちが次スレ
http://peace.2ch.net/test/read.cgi/tech/1419718732/l50
0955デフォルトの名無しさん2015/01/10(土) 07:09:07.25ID:2VZ4g5kC
そう目くじら立てんなや。
順番に使って行けばいいやん。
みんな仲良くな。
0956デフォルトの名無しさん2015/01/10(土) 07:40:23.57ID:6bumLq2N
プログラミング始めてから数ヶ月しか経ってないんでいまいち感覚がつかめないんですけど
Variant型の3次元配列で
10*30*3
全部で要素数900のものを宣言して使いたいんですけど
この程度の大きさの配列は今のパソコンなら余裕で扱えるますか?
作ってから試せばいいんですけど
作り直すの大変なんで・・・w
0957デフォルトの名無しさん2015/01/10(土) 08:02:15.62ID:+L1WIJZB
>>956
それじゃ抽象的過ぎて分からないよ。
せめてメモリどのくらい積んでる想定で、どの範囲のスコープで、
どんなシチュエーションで、どんなことをするのに使うのかくらい書かないと誰も分からないと思うよ。
ま、俺は書かれても分からないけどw
0958デフォルトの名無しさん2015/01/10(土) 08:32:25.31ID:6bumLq2N
>>957
じゃメモリが4GB・・・もしかしたらXPで2GBしかないかもしれない
一応7で4GBとするかな
会社のノーパソなんでちょっとわからない、というか複数あるから全部は把握出来てない
プロシージャレベルの変数で
格納する値は1文字か2文字ぐらいの文字か数値で
配列内で部分的に値を交換したりまたは値を変えてから
別のブックのシートにある規則でその値を並べていくみたいな・・・
配列内での操作はそれほど複雑な事はしないですね
0959デフォルトの名無しさん2015/01/10(土) 08:42:56.85ID:0yQpyAUx
検討するだけ時間の無駄。
900*1Kでも1MBすら超えないし。
せめて100MBくらいは超えてもらわないと。
0960デフォルトの名無しさん2015/01/10(土) 08:47:56.82ID:6bumLq2N
>>959
さんくす
その程度なら安心して使えるわ
さてと・・・コーヒー入れてから組むかな
0961デフォルトの名無しさん2015/01/10(土) 09:06:05.24ID:cL18jX+c
>>955
こっちが仲良くしたくても
制約の多いテンプレ書く奴がそれを盾にして
スレ違いだなんだと和を乱すんだよ
0962デフォルトの名無しさん2015/01/10(土) 09:25:56.48ID:rLgznmkm
>>959
> 検討するだけ時間の無駄。

恐ろしいことに 32KB 制限とか残ってるから、安心しちゃダメ
http://app.m-cocolog.jp/t/typecast/703306/587175/78029000
0963デフォルトの名無しさん2015/01/10(土) 09:42:35.45ID:OkgbdJUd
へー、これは知らんかった
ちょうど昨日ユーザ定義型に1万行くらいのテキスト読み込むマクロ書いたが
配列だったからセーフだったのか
0964デフォルトの名無しさん2015/01/10(土) 09:43:38.48ID:7eyavD7c
>>955
ちょ、おまW
そういうことかW
やり過ぎじゃないか?いいんだけどさW
0965デフォルトの名無しさん2015/01/10(土) 10:03:18.76ID:rLgznmkm
>>963
配列が固定長でないと実体は別に取るみたいで大丈夫だったと思う
0966デフォルトの名無しさん2015/01/10(土) 10:37:02.56ID:EQ6T3P4r
配列を3次元まで使った経験ねえな。
0967デフォルトの名無しさん2015/01/11(日) 20:27:34.18ID:Xvd9oSuA
>>944
その命令文、うちのとこにはないんでコンパイルエラーです。個人事務所なので。orz
0968デフォルトの名無しさん2015/01/11(日) 20:28:13.28ID:Xvd9oSuA
PDFファイル化の際に、保存先、ファイル名、用紙サイズに加え、目次タイトルも設定したいです
0969デフォルトの名無しさん2015/01/11(日) 21:32:31.18ID:3ahz/Tk9
>>967
依頼先を自分にしとけばいいだけ
0970デフォルトの名無しさん2015/01/11(日) 21:47:30.72ID:NXCI7i7k
pdfの制御をマクロの記録って出来るのかな?
手元にExcel無いので試せないが。
0971デフォルトの名無しさん2015/01/11(日) 22:35:50.62ID:3ahz/Tk9
>>970
pdf の制御ってなんだ?
できるのは、pdf として保存することだけだよ
0972デフォルトの名無しさん2015/01/11(日) 23:33:39.95ID:0AZSz2T3
ttp://needtec.exblog.jp/21561307/
のサンプルを
Excel-DNA 0.32
R.net 1.5.13
R 3.1.2
で動かしてみたんだけど、Excel側で配列数式の取得でエラーになる。
CreateInstance→GetInstanceの変更はやったんだけど、
他になにか要修正箇所の見落としがあるかな?
0973デフォルトの名無しさん2015/01/11(日) 23:43:29.45ID:42fc/CwK
exceldnaって気持ち悪いadin名だな。ちょっと使う気にならない
0974デフォルトの名無しさん2015/01/12(月) 00:00:51.49ID:ZfT7U18/
うち64bitなんで検証できねえ
0975デフォルトの名無しさん2015/01/12(月) 00:15:23.00ID:1B7gFgUM
おうちのパソコンにアクロバットないから参照設定すらできねえ
職場のパソコンでインターネット見ながらやってみよ
0976デフォルトの名無しさん2015/01/12(月) 00:16:14.31ID:M4h8f6U2
>>971
pdf保存のオプションを指定するのをマクロ記録出来るかなって意味だった。
用紙のサイズ、向き、画像の圧縮程度なんかを指定するのを記録すると、指定内容をvbeで見られるんじゃないかと。
0977デフォルトの名無しさん2015/01/12(月) 00:51:55.34ID:ZfT7U18/
>>976
それはマクロに記録されない
0978デフォルトの名無しさん2015/01/12(月) 01:01:46.45ID:ZfT7U18/
PDF保存でマクロに記録されるパラメータは4つだけだった
1つ目が品質だけど2段階しか選択できない
用紙サイズはページ設定の方で変更できるんじゃないかな(面倒なので未確認

Quality:=xlQualityStandard
IncludeDocProperties:=True
IgnorePrintAreas:=False
OpenAfterPublish:=True
0979デフォルトの名無しさん2015/01/13(火) 19:03:18.51ID:tLThP+VF
罫線で囲まれた部分に色を塗るにはどうしますか?
もちろん複数セル対応です。
つまり例えば10セルx10セルの四角のエリアの外周に罫線がひかれてあれば
このエリアは色で塗りつぶします。
もし一か所でも罫線がとぎれていれば色は塗りません。
0980デフォルトの名無しさん2015/01/13(火) 19:37:05.77ID:cjipnmCJ
>>979
罫線が途切れているかどうか調べて
閉じていたら色塗ればいいんじゃないか?
0981デフォルトの名無しさん2015/01/13(火) 19:40:58.81ID:jCKL88FP
PAINTのアルゴリズムはかなり面倒
長方形限定にでもしない限り死ぬ
0982デフォルトの名無しさん2015/01/13(火) 20:02:50.58ID:J1+7YGd1
うめ
0983デフォルトの名無しさん2015/01/13(火) 20:04:46.16ID:cjipnmCJ
>>981
単純に罫線を順番に追っかけて行けば
いいんじゃないか?
0984デフォルトの名無しさん2015/01/13(火) 20:34:55.53ID:qLgVOx4G
セルを1つ1つ見ていって、線が閉じてた場合に色を塗ることにしよう
としてシート内の全てのセルを彷徨うことになりそう…
0985デフォルトの名無しさん2015/01/13(火) 20:57:00.43ID:SDwxRg+V
とりあえず有名どころのアルゴリズム。
http://fussy.web.fc2.com/algo/algo3-1.htm
開始位置より左上にある罫線が、開始位置を含んで閉じていなければ
塗りつぶさなくて良いと判断できそう。
0986デフォルトの名無しさん2015/01/13(火) 22:05:50.48ID:hfw/WUnW
その目的が罫線の不足を確認することならば、PDFにても印刷して確認した方が早い
0987デフォルトの名無しさん2015/01/13(火) 23:15:06.03ID:jCKL88FP
まじめにどんな形状にも対応できるようにするのは大変
▼がスタート地点として、塗りたい部分がこんな風に入り組んだり枝分かれしてると判定が地獄になる

□▼□□□□□□□
□■□■■■■■□
□■□■□■□■□
□■□■■■□■□
□■□□□□□■□
□■■■■■■■□
□□□□□□□□□
0988デフォルトの名無しさん2015/01/14(水) 06:13:29.07ID:TcHIrr8h
うめ
0989デフォルトの名無しさん2015/01/14(水) 06:27:58.00ID:1MKny6om
面倒ではあるが処理的には単純なわけで
あとはコードを書く面倒さと、毎回手動で確認して塗りつぶす面倒さの
どちらを避けたいか自分で判断すればいいだけじゃね?

まぁ此処には、製作依頼NGにしようとすると発狂するくらいコード書きたくて
ウズウズしてる奴が居るから、方法論の質問ではなく製作依頼ですって言えば
誰かが書いてくれるはずなので、誰かに書かせちゃうのも一つの手だけど
0990デフォルトの名無しさん2015/01/14(水) 06:51:35.15ID:IFDWIC1X
質問です。
任意のセル範囲に同じ文字列を設定したい場合、どうすれば良いですか?
0991デフォルトの名無しさん2015/01/14(水) 09:37:41.65ID:H5VD+o7q
WinXP Pro 32, Excel2010Pro なんですが、
今日、久しぶりに自作のVBAを実行したら、
「プログラミングによる Visual Basic プロジェクトへのアクセスは信頼性に欠けます」
って出ました。オプション設定でこのメッセージを出さないようには
出来たのですが、自作プログラムは以前に作ったやつだし、最近特に何も
変更していないし、WindowsUpdateもしていないにも関わらず何故急にエラーメッセージが
出始めたのか分りません。何故でしょうか?
0992デフォルトの名無しさん2015/01/14(水) 18:18:46.50ID:/eGDVYKF
>>990
コピペは複数セルに有効
例えばA1だけをコピー、B1:E10を選択してペーストすれば、すべて同じA1の内容が選択した全セルに貼り付けられる
0993デフォルトの名無しさん2015/01/14(水) 19:02:14.34ID:Xuc5GVH9
塗りつぶしとか再帰で余裕
0994デフォルトの名無しさん2015/01/14(水) 20:04:54.99ID:O3zd6KXi
うめ
0995デフォルトの名無しさん2015/01/14(水) 20:05:05.89ID:tAU6sHPw
>>991
時代の流れ
0996デフォルトの名無しさん2015/01/14(水) 22:36:14.78ID:dKSp9BAL
vbaって勝手に型変換してくれるの?
エラー処理ルーチンの勉強してるんだけど
エラー起こそうとinteger型にString型代入しても大丈夫なんで困るわ
別の関数を呼んでそこで型不一致の代入させるとエラー起きるって気づくのに時間かかった
0997デフォルトの名無しさん2015/01/14(水) 22:57:41.02ID:NzDEuWG2
最初は型とか細かいことあまり考えずにロジックの組み方に慣れる練習をする方がいいよ
0998デフォルトの名無しさん2015/01/15(木) 05:46:06.19ID:su00TD7y
うめ
0999デフォルトの名無しさん2015/01/15(木) 09:35:47.65ID:9RvUPi7W
次スレ

Excel VBA 質問スレ Part36
http://peace.2ch.net/test/read.cgi/tech/1419718732/l50
1000デフォルトの名無しさん2015/01/15(木) 09:36:31.66ID:9RvUPi7W
次スレ

Excel VBA 質問スレ Part36
http://peace.2ch.net/test/read.cgi/tech/1419718732/l50
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。