Excel VBA 質問スレ Part15at TECH
Excel VBA 質問スレ Part15 - 暇つぶし2ch175:デフォルトの名無しさん
10/04/29 14:42:01
ここで一番多いのは警備会社勤務
2ちゃんの質問スレで困ってる人を見つけたら助けるふりして雑談始めるのが仕事

176:デフォルトの名無しさん
10/04/29 14:46:30
事務員だけどVBAできます・・・・というか、IT屋のPGとして開発経験があれば、
プロジェクト規模とかステップ数でPGとしての職歴をアピールできるのかもしれないけど、
そうでない場合はアピールしようが無いというか、何をもってできるとするのかよくわからん。

177:デフォルトの名無しさん
10/04/29 14:47:28
>>175
自宅警備会社というやつですか?

178:デフォルトの名無しさん
10/04/29 15:01:55
>>177
自室です。

179:デフォルトの名無しさん
10/04/29 16:14:27
>>173
ネットが繋がらない環境でJava使ってる。
VBAは各種ファイルの生成とか、XMLやらブックの解析とか。

180:デフォルトの名無しさん
10/04/29 17:08:26
お話に花が咲いているところ すみません。教えてください。

office2000 XP SP3 です。

PCのCOMポートから、RS232Cで文字を受信して、Excelシートに表示しています。

while(1)
  if (受信文字=あり) then
    Cells(y, 1).Value = 受信文字
    y = y + 1
  endif
wend
という感じです。
いい感じに動作するのですが、シートの一番下の行まで行って、
次の行を書くときに、スクロールしたいのですが、
画面1行スクロールをするには、どのような記述をするのでしょうか。

宜しくお願いします。

181:デフォルトの名無しさん
10/04/29 17:20:05
URLリンク(officetanaka.net)

182:デフォルトの名無しさん
10/04/29 18:08:21
Application.Calculation = xlCalculationManual
で、関数の計算を止めた場合、

WorksheetFunction.Maxなどで関数をVBA内で使用(シートへの記載は無し)したら、
その計算結果を利用する判定時に誤作動したりするのですか?

やはり直前でxlCalculationAutomaticに戻さなくてはいけないのですか?

183:デフォルトの名無しさん
10/04/29 18:24:43
お話に花が咲いているところ
嫌味言うなら質問するな


184:デフォルトの名無しさん
10/04/29 20:40:06
気の利いたこと言おうとして失敗する人っているよね。
その一言が余計、という。

「へえ。君って○○大学出てるんだ」
「いやあどうしょうもないバカ大学でお恥ずかしい(謙遜のつもり)」
「……俺の息子はその大学を第一志望にして入学したんだよ(怒)」

185:デフォルトの名無しさん
10/04/29 21:11:20
つ Ca

186:180
10/04/29 22:37:54

どうもありがとうございます。大変助かりました。
VBAの命令は、何でもあるんですね。ビックリしました。おかげさまで、なんとか作れそうな感じです。

以下のような感じで、現在の画面の最下行数を計算して
  temp_str = ActiveWindow.VisibleRange.Cells(1, 1).Address ' 現在の画面の左上セルの座標「$A$123」を文字で得る
  n = InStr(1, temp_str, "$")                ' 左の$を見つける
  n = InStr(n + 1, temp_str, "$")               ' 右の$を見つける
  y = Val(Mid$(temp_str, n + 1, Len(temp_str) - n)) + Windows(1).VisibleRange.Rows.Count ' "123"を取り出し、画面の縦の数を加算
この行数と、次回の書込予定セルのy位置と比較してスクロールしながら、書き込んでいくつもりです。

ここで、もう少し教えてください。

上記の最下行の計算ですが、VisibleRange.Cells(1, 1).Address の返値が文字で返ってくるので、めんどうな文字計算をしています。
これが、直接数字で返ってくる命令はないものでしょうか。

temp_str = ActiveWindow.VisibleRange.Cells(1, 1).Address というのは、現在のアクティブウインドウに対しての命令だと思います。
しかし別シートを開いている時でも、文字書込は決まったシートに バックグラウンドで実行したいのです。
シート指定をすればいいと思って
a = Worksheets("AAA").VisibleRange.Cells(1, 1).Address
などと やってみましたが、エラーだと言われました。
どのように書いたら、バックグラウンドで実行できるのでしょうか。

よろしくおねがいします。


187:デフォルトの名無しさん
10/04/30 00:43:47
>>184
その会話で気の利いたことを言った(つもり)のはどっち?

188:デフォルトの名無しさん
10/04/30 00:45:56
>>186
a = Worksheets("AAA").Range(hoge).Cells(1, 1).Address


189:デフォルトの名無しさん
10/04/30 11:02:24
>>186
Visibleってのは「見えている」範囲のこと。ウィンドウを「切り替えたら見えるだろう」範囲ではない。
だから裏画面では意味がない。

190:180
10/04/30 19:02:09
教えてくださいますでしょうか。
cells(1,1) と range("A1")という、2つの表現方法がありますが、
forで回すことを考えるとcells(1,1)のほうが都合が良いと思います。
しかし、range()も使いたいことが多いです。
そこで、この(1,1)という値を"A1"に変換するような関数はあるのでしょうか?

現在は、
dim array as string
dim rng_str as string
array = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

x = 1
y = 1
rng_str = mid$(arry, x, 1) & format(y)

などとやっています。
何か1発でできる関数があると便利なのですが。


191:デフォルトの名無しさん
10/04/30 19:13:14
>>190
アドレスとかじゃ本末転倒か

192:デフォルトの名無しさん
10/04/30 19:23:11
そうですね。できれば、aaa = Conv(1,1)みたいな感じの物がVBAに備わっていることを期待しているのですが、
やはりむずかしそうでしょうか。

あと、もう1つよろしいでしょうか。
セルを選択するのと反対に、解除するのにはどのように書けばよろしいでしょうか。
選択は、セルの周囲の線が太く見えて、解除は、セルの周囲の線が太くなくなるということです。

選択 cells(1,1).select

解除 cells(1,1).Deselect と書いたら、叱られてしまいました。



193:デフォルトの名無しさん
10/04/30 19:43:52
>>190
rng_str = Cells(Row, Col).Address(False, False)

とりあえずこうするといいよ。

194:デフォルトの名無しさん
10/04/30 21:17:14
>>187
>その会話で気の利いたことを言った(つもり)のはどっち?
二つ目の鍵カッコだよ。

この会話では、相手が不機嫌になった理由を教えてくれたから、
「ああ、俺余計なこと言ったな」と本人も気づくけど、
普通は腹の中で「この野郎」と思ってもわざわざそれを伝える人は少ない。

結果、本人はずっと「俺ってユニーク」などと思い込んだまま、
他人をイラつかせ続けることになる。

まあ、俺のことなんだが。

195:デフォルトの名無しさん
10/04/30 21:59:14
>>192
行列の変換は Chr(64 + y) & x
ただしZ列より右は表現できない
AA列以降もサポートしたいなら自分で関数を作ってモジュール化すればいい

セル選択の解除は不可能

196:デフォルトの名無しさん
10/04/30 22:01:57
>>192
一般機能で出来ないことはvbaでも出来ない。

シートの中で必ず1セルは選択されているものだから、vbaでもどこかのセルは選択しないとあかん

197:デフォルトの名無しさん
10/04/30 22:05:08
何でもいいけどいい加減>>182に答えてくれよ!

さもないと自分で調べるぞ!!

198:デフォルトの名無しさん
10/04/30 23:29:49
>>193
ありがとう。Row=1, Col=1 → A1 と出ました。ありがとう。
これで楽になりそうです。

>>195, >>196
>セル選択の解除は不可能
>シートの中で必ず1セルは選択されているものだから、vbaでもどこかのセルは選択しないとあかん
そうなのですね。ありがとうございました。
確かに、自分でExcel使うときは、どこす1箇所選択されています。
助かりました。ありがとうございました。


199:デフォルトの名無しさん
10/05/01 15:32:28
>>197
調べろよw
あと手動計算にしなくても再計算すればよろし
マクロの記録でF9だ

200:デフォルトの名無しさん
10/05/01 17:57:32
ていうか再計算止めたからってWorksheetFunction
の計算まで止まるわけないだろ。
むしろ発想自体新鮮w

201:デフォルトの名無しさん
10/05/01 19:46:16
         / ̄(S)~\  <                       >
       / / ∧ ∧\ \<  嫌なら見るな! 嫌なら見るな! >
       \ \( ゚Д,゚ ) / /<                       >
         \⌒  ⌒ /  ノ Y´`Y´`Y´`Y´`Y´`Y´`Y´`Y´`Y´`Yヽ
          )_人_ ノ  
          /    /
      ∧_∧ ■□ (    ))
     (   ; )■□  ̄ ̄ヽ
   γ⌒   ⌒ヽ  ̄ ̄ノ  ノ
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|

202:デフォルトの名無しさん
10/05/01 22:37:18
>>199-200
自分で調べるのが面倒だからこその質問スレだろうが!
情弱なめんな、ゆとりなめんな質問に答えてくれて本当にありがとうございました。

203:デフォルトの名無しさん
10/05/01 22:41:08

冷静な自己分析だと思うぞ

204:デフォルトの名無しさん
10/05/02 06:25:26
>>202
>自分で調べるのが面倒だからこその質問スレだろうが!
自分で調べてもどうしてもわからない時の質問スレだよ。
別に2chじゃなくとも、人に教えを請う時はそれが当たり前だと思うが。

205:デフォルトの名無しさん
10/05/02 06:59:03

2ちゃんの画一的なコメント 乙

206:デフォルトの名無しさん
10/05/02 12:09:35
てか教えてGooに行けばいいんだよな

207:デフォルトの名無しさん
10/05/02 12:47:44
       -‐''''"´ ̄``ヽ、              ____
       /     _     ヽ        //´   __,,>、
     /        ̄ ̄   {        /::/ / ̄:::::::::::::::\
      l _ィニニア二二二ニヽ、j._      /::::l/::::::::::::::::::::::::::::::::l
     | 0Lj/-‐-レノ ノ_ヽ:::`ヽ     l:::::::::::/l/lノノ/_イ:::::l
     レ:r、/ イ゚テ   ピト`|::|      l:::::::::/ rtテ、  .ィtq l::::::|
      l:lヘ  '"   ,j  '"/ノ      |::lヘ!j  ´  ,j   !;:::/
     ヽヽ、   r‐-,   /'         レリー 、    ,....,  lノ/
        lヽ、  ̄ /         `ヽ、lヽ 、  ̄ /´
     _,r┴‐-`v´-‐j-、__   , -‐-、_r┴─'ー‐チト       バルス!!
  / ̄/:.:.:.:| ̄ ̄`T ̄´|:.:.:.:l´ `ヽ /    ヽ ̄`ー-‐'´`''''⌒ヽ
/   ,':.:.:.:.:.l    l   l:.:.:.l    \  _r‐、-、-、r,    、   ',
     |:.:.:.:.:.:.!     !   !:.:.l   ,. -‐ゝ/// 〉 〉 〉 〉 〉    !   ',
    l:.:.:.:.:.:.l     |   l:.:.:l  /  人〈〈〈〈 ' ' ' /っ   l    l
    l:.:.:.:.:.:.!     !   l:.:.:.ト/   /  ```´-ァ‐'''"     /   l
、__/:.:.:.:.:.:l     |    |:.:.:ヽヘ  l    //         / _ ィノ
    /:.:.:.:.:.:.:!    l   |:.:.:.:.:l `ーヽ、_ノ´l、______/lニ二」
____l:.:.:.:.:.:.:.|      l   |:.:.:.:.:!        |_  ( ( ) )_〕|   l
   l`ー‐‐'匸二l ̄ ̄l二フーイ       /   ̄ `‐‐'´ ヽ  |

208:デフォルトの名無しさん
10/05/02 15:58:59
> 意思決定までコンピューターが出来るようになると、
> 人間自体が必要なくなる。

今でもほとんど「意思決定」に人間なんか要らないだろ。

1. 提案者「こんなアイディアがあります」
2. 決定者「費用対効果を数字で示せ」
2. 提案者「費用が○○円、利益が△△円を見込んでいます」
3. ○○ < △△か?
   true → 4.へ
   false → 5.へ
4. 決定者「そのアイディアを採用する」
   → 6.へ
5. 決定者「そのアイディアを却下する」
   → 6.へ
6. 決定者「次のアイディアはなんだ?」

結局のところ、「意思決定」(笑)とやらをやる人間はこんなロジックで動いているんだから、
人間なんかおく必要ない。Excelどころか、20年前のPCでBASICで組んでもいいレベル。

「費用対効果を出せ」「数字で示せ」「説明責任を果たせ」、って言うと非常に説得力が
あるように見えるけど、実は判断基準のなすりつけなんだよね。

209:デフォルトの名無しさん
10/05/02 17:06:47
>>208
んじゃそのプロセスをマクロで表現しなよ

210:デフォルトの名無しさん
10/05/02 21:18:22
質問させてください。

A列にx軸の値、B~H列に7系列分のy軸の値が書いてある表で、
A,B列の値を選択してグラフを書かせるとA列をx軸、B列をy軸(系列1)としてくれるのですが、
A~H列の値を選択してグラフを書かせるとx軸はblankで、A~H列全てがy軸(系列1~8)になってしまいます。
A列をx軸にして7系列分のグラフを書くにはどのように工夫したらよいでしょうか。

211:デフォルトの名無しさん
10/05/02 21:54:14
あなたは知らないのですか?

212:デフォルトの名無しさん
10/05/03 13:25:00
>>210
グラフの種類を散布図にして
元データの設定ウィンドウでY軸からA列を消して、X軸にA列を追加

213:デフォルトの名無しさん
10/05/04 21:21:37
エクセルのサイズが500MBに届きそうなんだがこんなもんか?

214:デフォルトの名無しさん
10/05/04 22:22:06
こんなもんかと聞かれても困るな w
まぁ常識的に考えて肥大しすぎだとは思うが w

215:デフォルトの名無しさん
10/05/04 22:53:39
URLリンク(peiyorin.cocolog-nifty.com)

これ以外にもシートをコピー→新しいブックの新しいシートに貼付け も効果があるらしい
(シートタブからのシートのコピー はダメ)

216:デフォルトの名無しさん
10/05/04 23:40:10
>>215
それやると、セルの幅はコピーされない(初期状態のまま?って言うの)んと違うかったっけ?

217:デフォルトの名無しさん
10/05/04 23:50:05
>>216
? 普通に書式も一緒にコピーできるけど?

218:デフォルトの名無しさん
10/05/05 00:33:09
ページ設定がコピーされないんでそのまま印刷するとおかしくなるだけ

219:デフォルトの名無しさん
10/05/05 12:47:49
>>210
Excelは、変なお節介があり、ユーザーは動作の予想ができないので、
覚えにくいし、使いにくいですよね。

さて、具体的な方法は自分で考えてもらうとして、イメージを説明します。
グラフを作るとき、多くの場合は、希望するデータ範囲を囲って、
グラフボタンで進んで行って「グラフできたぁ」となるワケですが、
これは、EXcelのお節介な自動機能でグラフを作っているだけなので、
覚え始めのころは「このやり方が全てだ」と思い込んでしまいます。
僕もそうでした。しかし、この方法では、いつかは行き詰まります。

本来あるべき論としては、「この列のデータを、あの列のデータに対してグラフ化したい」だと思います。
このやり方が、本当のグラフ作成なのですが、
Excelのお節介で、私たちは、それが想像しにくいようになっています。

範囲を選択して、グラフボタンで、グラフウィザードを進んで行きますが、
そのウィザードの途中に、次のような画面が出てきます。
URLリンク(mcnc.hp.infoseek.co.jp)
この画面では、すでにEXcelが勝手に選んだ「系列1,系列2」というY軸の値が選ばれています。
まずこれを削除します。そして、その右側の「Xの値」「Yの値」の所の文字も消して、
その枠の右側の三角?っぽいボタンを押します。
すると、ウィザードを開いているのに、なぜかシートに触れてしまいますので
自分の好きなY軸の範囲を選択します。同様にして、Xの値も範囲を指定します。
これで、EXcelのお節介なく、自分の好きな軸に、自分の好きな範囲を指定してグラフが作れます。

この方法は、既に出来上がっているグラフに対しても可能でなので、
自分で調べて見てください。

僕の思うグラフの作成は、「これをXに、これをYに」という指定をするのが正しい方法、
というかユーザーがイメージできる作成方法だと思っています。
Excelやワードのお節介が減ることを期待したいです。

220:デフォルトの名無しさん
10/05/05 13:32:18
VBAの話をしろボケ

221:デフォルトの名無しさん
10/05/06 00:23:24
>>219
なかなか面白い話しやけど、確かにスレ違い。

222:デフォルトの名無しさん
10/05/08 17:44:55
配列に数が入っている状態で,
平均値などを計算したい場合,
一度,シートに書き出してエクセルのaverage関数を使うしかないのでしょうか?

223:デフォルトの名無しさん
10/05/08 17:47:19
いいえ

224:222
10/05/08 17:55:03
>>223
すいません

自分で関数を定義したくはないのですが
そのようなサブルーチンがvbaにも実装されているのでしょうか?

225:デフォルトの名無しさん
10/05/08 18:11:12
WorksheetFunction.Averageって配列を受け付けられなかったっけ?

226:デフォルトの名無しさん
10/05/08 18:49:16
配列できるね。

227:デフォルトの名無しさん
10/05/08 19:13:10
セルにAddCommentで複数行のコメントを入れようとしてます。
vbNewLineで改行していれようとすると5行までしか入りません。
無限にいれれるようにするにはどうしたらいいでしょうか?

228:222
10/05/08 19:13:18
例えば,
配列 a[100]
を定義したとして,a[10]からa[i]までの平均値をだしたいのですが
excelの関数で大丈夫ですか・

229:デフォルトの名無しさん
10/05/08 19:24:00
>>228
じゃあ、10~iまで回せばいいじゃん

230:222
10/05/08 19:49:42
>>229
可変長の部分をa_temp というdouble型の配列を作成,そこに格納し
ave = WorksheetFunction.Average(a_temp)
としても 0 しか返ってきません.
何か間違っていますでしょうか?

231:デフォルトの名無しさん
10/05/08 19:50:24
平均ぐらい自分で出せよカス

232:222
10/05/08 20:13:58
>>231
枯れたサブルーチンがあるなら自分で書くよりミスは圧倒的に減るはずですよね.
なんとかなりませんか

233:デフォルトの名無しさん
10/05/08 20:15:05
この程度でミスしてる時点で他のあらゆるコードが信用出来ない。おまえさんはもう諦めろ

234:222
10/05/08 20:19:47
>>233
vbaは何分初めてなもんで
よろしくお願いいたします

235:デフォルトの名無しさん
10/05/08 20:23:10
何事もほどほどにな

236:デフォルトの名無しさん
10/05/08 20:45:32
>>227
気のせいでした

237:デフォルトの名無しさん
10/05/09 01:21:50
>>234
とりあえず、作ったプログラムを丸ごと貼り付けて

238:222
10/05/09 09:59:16
お騒がせしました.
求めた平均値を入れる変数の型をlong型にしていたため,
常に0となっておりました.
double型に変えると無事動作しました

ありがとうございました

239:デフォルトの名無しさん
10/05/09 15:56:22
あるブックでマクロ実行中、他のブックを操作する方法ないですか?

240:デフォルトの名無しさん
10/05/09 17:08:43
>>239
もう少し詳しく書かなきゃわからんよ
他のブックを操作するとは例えばどんな事?

また、あるブックでマクロ実行中て書いてるけど
どんな処理をしている時を想定しているの


241:デフォルトの名無しさん
10/05/09 19:07:08
>>240
イメージとしてはExcelの二重起動でしょうか
マクロの実行中ってほかのエクセルの編集作業が全くできないと思うんですが、それをできるようにしたいです。

242:デフォルトの名無しさん
10/05/09 19:16:36
そのまんま、Excelを2重起動すればいい。

243:デフォルトの名無しさん
10/05/09 19:25:38
>>239
取りあえずDoEventsでも入れてみれば

244:デフォルトの名無しさん
10/05/09 19:48:48
>>242-243
質問が悪かったです。ちょっと出直してきます

245:デフォルトの名無しさん
10/05/09 20:11:42
自己解決

246:デフォルトの名無しさん
10/05/10 08:04:51
phpのmysql_connect()関数が使えません。
環境は、
windows7
Apache2.2
PHP5.1
mysql server 5.1
です。
普通のphpファイルは開けるのですが、
mysql_connect()を使うとブラウザでページを表示できなくなります。
なぜでしょうか?

247:デフォルトの名無しさん
10/05/10 08:07:15
すいません。誤爆しました

248:デフォルトの名無しさん
10/05/10 23:22:47
図がないシートなのに、保存しようとすると
「図が大きすぎます」エラーが出るのは
どんな理由が考えられますか?

VBAがたくさん使ってあるシートです。
でも、図の類は何もありません。

249:デフォルトの名無しさん
10/05/12 04:09:28
スタックが小さくて、まともな業務ソフトつくれないよ。
マイクロソフトは、あいかわらず、いつまでもユーザー泣かせのことやってる。



250:デフォルトの名無しさん
10/05/12 04:12:14
これだけメモリー搭載が増えてる時代なのになんでスタックを大きくしないのか
不思議でしようがないいよ。
故意にユーザーを苦労させ、エラー出るように設計してるとしか思えない。


251:デフォルトの名無しさん
10/05/12 04:14:37
なんか、日本語版だけ故意にスタック小さくしてるような感じする。


252:デフォルトの名無しさん
10/05/12 07:36:24
スタックが増えても、落ちるまでの時間が多少伸びるだけじゃねえのw

253:デフォルトの名無しさん
10/05/12 12:40:58
VCのスタックサイズのデフォルトは1MBなんだが、VBAではどのくらいなんだ?

254:デフォルトの名無しさん
10/05/12 13:04:22
条件式について質問です。

処理対象データ ↓

A B C D
1 あ い う
1 あ い う
2 あ い う
3 あ い う
3 あ い う
4 あ い う
4 あ い う
4 あ い う

というデータがあるとします。

A列の値が同じである間、同じSheetにデータを出力できるようにし
A列の値が異なる場合になったならば、別シートに出力変換したいんだけども
何かアドバイスを貰えませんか。

255:デフォルトの名無しさん
10/05/12 13:11:08
>>254
Aを上から見ていって、
前の値と比較すればいいでしょ。

Set procRange = [A1]
Set outputSheet =
While procRange <> ""
 If procRange.Offset(-1) <> procRange Then


 Set procRange = procRange.Offset(1)
Wend

256:デフォルトの名無しさん
10/05/12 13:13:32
途中で投稿されちゃった
動かせる環境ないから適当に直せ

Dim procRange As Range
Dim outputSheet As Worksheet

Set procRange = [A1]
While procRange <> ""
 If procRange.Row = 1 Then
  Set outputSheet = Worksheets.Add
 ElseIf procRange.Offset(-1) <> procRange Then
  Set outputSheet = Worksheets.Add
 End If

 ' なんか適当な処理

 Set procRange = procRange.Offset(1)
Wend


257:デフォルトの名無しさん
10/05/12 13:21:31
>>256
返答ありがとうございます。
高度な文面なので検索してちょっと理解深めます。
Offset~~に解決の糸口を見つけられそうなので
イジイジしてきます。ありがとおおおおおおおお

258:デフォルトの名無しさん
10/05/12 18:19:08
教えてください。

質問の概要
ワークシートの変更を禁止したいです。

説明
・シート内にあるボタンを押すと計算が始まります。
・その計算は、そのシート内のセル内容を読込んで計算するので、シートを変更されると、困ります。
・そこで、計算している間は、シート変更を禁止させたいです。

計算中にシートタブがクリックされたら、このような動きにしたいです。
 メッセージボックスを表示して「今はダメよ」と表示する
 もしメッセージボックスを表示することで、計算が狂ってしまうなどの問題があるのなら、
 最低でも、シート変更を無視、無反応にし、計算を安全にしたいです。

どのようにすれば良いでしょうか?

宜しくお願いします。


259:デフォルトの名無しさん
10/05/12 18:21:51
Application.ScreenUpdateing = Falseじゃだめなの?

260:デフォルトの名無しさん
10/05/12 20:54:35
>>259
ありがとうございました。Application.ScreenUpdating = Falseにより、期待通りの動きが出来ました。
すばらしいです。

ただ、不思議なことがあります。教えていただけませんでしょうか。

以下のように、計算前にボタンの色を変えて、
計算後にボタンの色を戻すようにしているのですが、その色の変化が、うまく動きません。

従来、ScreenUpdatingを入れない時は、ボタン色が正しく変化します。
   Button1.BackColor = QBColor(赤)   ' 色を変える
   Call KEISAN
   Button1.BackColor = QBColor(白)   ' 色を戻す

次のように、ScreenUpdatingを入れると、
   Button1.BackColor = QBColor(赤)
   Application.ScreenUpdating = False
   Call KEISAN
   Application.ScreenUpdating = true
   Button1.BackColor = QBColor(白)
白のまま計算を開始して、計算が終わると白→赤→白と、まとめて変化します。

ScreenUpdatingを、' にすると、正しく色が変化します。(再現性があります)
どうしてこんなことが起こるのでしょうか?

宜しくお願い致します。


261:デフォルトの名無しさん
10/05/12 21:24:18
>>260
ボタンの背景色の変更と、その色で画面が更新されるタイミングには実際にはブランクがある為。
VBAマクロ実行中も一定の間隔で画面の更新処理は走るが、
ScreenUpdatingがFalseの時はその処理が妨げられる。
ScreenUpdatingをTrueに戻すと、とりあえず画面全体を更新しなおすので、
後述の処理だとまとめて変化したように見える。

262:デフォルトの名無しさん
10/05/12 23:44:46
できました

263:デフォルトの名無しさん
10/05/13 01:00:39
Button1.BackColor = QBColor(赤)
Call DoEvent
Application.ScreenUpdating = False
Call KEISAN
Application.ScreenUpdating = true
Button1.BackColor = QBColor(白)

だったかな

264:デフォルトの名無しさん
10/05/13 01:03:13
全然違った
スマソ orz

Button1.BackColor = QBColor(赤)
DoEvents
Application.ScreenUpdating = False
Call KEISAN
Application.ScreenUpdating = true
Button1.BackColor = QBColor(白)

265:デフォルトの名無しさん
10/05/13 01:07:09
自作関数をセル上に入力すると、ポップアップで引数の説明文を表示させるようにするにはどうしたらいいのでしょうか。
例えばセル上に "=IF(" まで入力すると
IF(論理式,[真の場合],[偽の場合])   と、表示されますが、
このポップアップ表示されるやつを自作関数でも表示させたいのです。

ご教示よろしくお願いします

266:デフォルトの名無しさん
10/05/13 02:50:22
自己解決

267:デフォルトの名無しさん
10/05/13 17:21:52
>>264
ありがとうございました。なんとか出来ました。
僕のExcel (office2000)だけなのかわかりませんが、教えてもらった方法だと、症状が改善しませんでした。
Button1.BackColor = QBColor(赤)
DoEvents
Application.ScreenUpdating = False
Call KEISAN
Application.ScreenUpdating = true
Button1.BackColor = QBColor(白)      動作結果 ボタンon→KEISAN→赤→白のままなんです。

Button1.BackColor = QBColor(赤)
Call KEISAN
Button1.BackColor = QBColor(白)

Sub KEISAN(){
  DoEvents
  Application.ScreenUpdating = False
   :
   :
  Application.ScreenUpdating = true
End Sub
     のようにKEISANの中に置くと 動作は、 ボタンon→赤→KEISAN→白となります。

でも、解決できて良かったです。どうもありがとう。感謝します。
// ------------------------------------------------------------- //
別件ですが、VBAのエディタについて教えてください。
行頭でTABキーを打つと、カーソルは4文字毎に飛んでいきます。しかし、BackSpaceキーを1回押しても、1文字分しか戻りません。
というか、TABが4スペースになってるみたいです。これを、TABのままにして、BSキー押したときに、1TAB分戻るようには出来ないでしょうか?
ところが、何かの都合?でBSキーで1TAB分戻ることもあります。もう、わけがわかりません。半分怒っています。
これは、どのような時に起こるのでしょうか?
通常のエディタのように動かないので、使いにくくて困っています。すみません。ご存じでしたら、どなたか教えてください。


268:デフォルトの名無しさん
10/05/13 17:31:47
つメモ帳

269:デフォルトの名無しさん
10/05/13 17:38:07
>>267
一般的には、TABで送ったものはSHIFT+TABで戻すんじゃね?


270:デフォルトの名無しさん
10/05/13 17:50:10
>>269
ありがとうございます。Shift+TABを、Excelでやってみました。

VBAエディタでは、確かに出来ました。左に1TABずつ戻ります。初めて知りました。
ところが、秀丸では、Shift+TABは、エラー。
メモ帳では、Shift無視で右にTABしていきました。

text editorは、space4個はspace4個、tabはtab、として置いて欲しいと思っています。
space4個打ったところでは、BS1回で、1spaceが消えればいいし、
tabを打った所では、BS1回でtab1個が消えればいい、というかそのほうが自然だと思うのです。
僕の価値観だけでしょうか。

でも、>>269に Shift+TABを教えてもらったので、今度からはストレスがぐっと減りそうです。
どうもありがとうございました。


271:265
10/05/13 18:11:23
>>266は私のレスではありません。

引き続きお願いします。

272:265
10/05/13 19:04:04
>>271は私のレスではありません。

引き続きお願いします。

273:デフォルトの名無しさん
10/05/13 20:59:53
>>270
Visual StudioやEclipseといった開発環境は大抵Shift+Tabで戻るよ
秀丸の場合、1文字以上選択状態にしてShift+Tabで戻る(サクラエディタも同様)

Tabキーでスペース2個とか4個とかが入力されるようにするのは
スペース派(ソースコード中にタブ文字を一切使わない)には普通のこと。
タブ文字は見る方の環境によって幅が変わってしまうので、それを嫌っている。

ただVBAは専用エディタでしか見ないだろうし、
そもそも設定変更できないのがひどいのは事実

274:デフォルトの名無しさん
10/05/13 21:05:50
あのエディタでリドゥのつもりでCtrl+Yを押すと悲惨な目に遭う

275:デフォルトの名無しさん
10/05/13 21:58:59
いやならバインディングかえればいいのに
馬鹿なの?死ねの?

276:デフォルトの名無しさん
10/05/13 22:06:50
死ねの?

277:デフォルトの名無しさん
10/05/13 22:46:05
死ぬの?─┬―死ぬよ(死ぬ派)
.       │
.       └―死なないよ(死なない派)

278:デフォルトの名無しさん
10/05/14 07:41:41
時刻の条件式について質問です。

00:15
00:30
00:45
~~略~~
03:00


みたいな時間がず~~~~と続くと想定して
これを開始の00:15から03:00までの間ループさせたいんだけど
時間と分を別々に分けて15分ずつ足して行く方法しかないですかね?

279:デフォルトの名無しさん
10/05/14 08:22:28
>>278
そうじゃないの
つまり0時1時2時3時のステップと15分30分45分00分のステップを入れ子でループするんでしょ



280:デフォルトの名無しさん
10/05/14 08:25:59
>>278ですけども
分けて計算すると変数多くなってしまうと思っての質問だったのですが
分けて計算するとしたら、どういう感じのループ条件式になりますでしょうか。
重ね重ねすいません。

281:デフォルトの名無しさん
10/05/14 08:27:43
>>279
おおお!!納得です。
ちょっと考えてきます、ありがとございました!

282:デフォルトの名無しさん
10/05/14 12:11:45
エンバグの元なのに

283:デフォルトの名無しさん
10/05/14 12:40:02
配列のデータで一意のデータを出力させたいのですが、
以下の配列データが複数あるとします。

A(0) = 1
A(0) = 2
A(0) = 3
A(0) = 4
A(0) = 3
A(0) = 3
A(0) = 10
A(0) = 2

出力結果は

A(0) = 1
A(0) = 2
A(0) = 3
A(0) = 4
A(0) = 10

こんな感じにしたいのですが、どんな感じにすればいいでしょうか


284:デフォルトの名無しさん
10/05/14 12:42:08
>>283
配列の全要素は0ではないです、すいません。

A(1) = 1
A(2) = 2
A(3) = 3
A(4) = 4
A(5) = 3


285:デフォルトの名無しさん
10/05/14 13:00:10
>>283
配列をソートして前と違うものを取り出せばよい。
あるいは最小値と最大値が極端に離れてなければBoolean型の配列を
Redim FLG(最小値 To 最大値) As Boolean
のように用意して、ループを回しながらフラッグをたて、フラッグが
立っているものを取り出してもよい。
数値にDictionaryを使うやつはアホ。

286:デフォルトの名無しさん
10/05/14 13:05:51
すまん、上はフラッグが立ってないときだけ取り出すの間違いね。

287:デフォルトの名無しさん
10/05/14 13:11:59
Dictionaryを使えばいい

288:デフォルトの名無しさん
10/05/14 13:13:21
>>285
配列のソートって出来るのですね。
フラッグはちょっと難しそうでしたので配列ソートの方を参考にさせて頂きます。
調べてる時Dictionaryというのも頻繁に出てきたのでこれも調べてみます。
レスありがとございました!

289:デフォルトの名無しさん
10/05/14 13:18:27
馬鹿の一つ覚えのDictionaryがやっぱり出てきたかw

290:デフォルトの名無しさん
10/05/14 13:25:01
Dictionaryの何がいけないか2行で説明してくれ

291:デフォルトの名無しさん
10/05/14 13:25:29
え?Dictionaryダメなの?

292:デフォルトの名無しさん
10/05/14 13:31:43
Dictionaryダメっていうやつはカルト宗教にはまりやすいタイプ

293:デフォルトの名無しさん
10/05/14 13:32:51
ダメって書くなら根拠書いて欲しい。
言いっぱなしは迷惑。

294:デフォルトの名無しさん
10/05/14 13:35:29
うるせーDictionaryっていっぱい連レスするんじゃねーよ

295:デフォルトの名無しさん
10/05/14 13:37:59
>>290
二行も必要ないなw
アホだからだよ。

無理やり二行で書くと
何で単純な整数にハッシュが必要なんだってことだな。
ハッシュなんて文字列に使うものだぞ。

296:デフォルトの名無しさん
10/05/14 13:48:13
そもそもDictionaryがどういう実装しているか知らないが、
(少なくともCollectionよりは効率がいいはずだが)
整数値は整数値をそのままハッシュ値にすればいいでしょ。

ていうか、そんなんでDictionary否定してたの?

297:デフォルトの名無しさん
10/05/14 13:56:03
ダミだこりゃ。
お手上げだね。

298:デフォルトの名無しさん
10/05/14 14:05:17
なるばくDictionaryを多く使ったほうがいいよ

299:デフォルトの名無しさん
10/05/14 14:08:51
何にでもDictionaryの人って大和の吊るし柿みたいに味のあるコードを書く人多いよね。

300:デフォルトの名無しさん
10/05/14 14:19:11
正直Dictionary回避してまで手に入れたいものって何?

301:デフォルトの名無しさん
10/05/14 14:26:17
インタプリタでソートしたりなんかしたりして遅くなるより
ネイティブなDictionaryでやったほうがいいね

302:デフォルトの名無しさん
10/05/14 14:35:57
ほんとアホばっかだなw
>>299
そういう皮肉は今の人には通じないって。

303:デフォルトの名無しさん
10/05/14 14:48:09
場合によって使い分けるのが一番

304:デフォルトの名無しさん
10/05/14 14:58:02
VBA関係ないし

305:デフォルトの名無しさん
10/05/14 16:11:00
Rangeオブジェクトについてなんですけども、
複数モジュールがある中で共有して扱わないとエラー出てしまったので
subとかが書かれてるよりも一番上(グローバル宣言?)にしたらエラーが出ませんでした。

これって外道ですかね?

306:デフォルトの名無しさん
10/05/14 16:16:12
何の話ざんしょ。もっとわかりやすくしてね。

307:デフォルトの名無しさん
10/05/14 16:35:00
Rangeオブジェクトの変数についてですけども、Moduleが1~3あったとします。

Module1
Module2
 dim aaRange as Range
 call ユーザ定義関数(aaRange)
Module3
 ユーザ定義関数(aaRange)記載


上記のようにModule2でRangeオブジェクトを宣言し、ユーザ定義の引数で貰ってるとします。
頻繁にユーザ定義関数を実行するのですが、aaRangeの値を常に保持していたくてグローバル宣言(呼び方あってるのかな)
してしまったと言う訳ですが!!!

糞設計でしょうか!!

308:デフォルトの名無しさん
10/05/14 16:37:23
うんkです

309:デフォルトの名無しさん
10/05/14 16:45:36
デナオシテキマス

310:デフォルトの名無しさん
10/05/15 14:27:47
16進数苦手。

イミディエイトウィンドウで
?hex(50000)
だと
C350
と出ます。

でも
?&hC350
だと
-15536
と出ます。

何で??
50000に戻したいのに・・・。

因みに
?-15536=50000
False
?hex(-15536)=hex(50000)
True
と出ます・・・。

311:デフォルトの名無しさん
10/05/15 15:50:46
>>310
50000はIntegerの範囲に収まってないのにIntegerに変換しようとしてそうなる
?&hc350& でLongに変換すればちゃんと50000になる
最後の&はLongを表す文字な


312:デフォルトの名無しさん
10/05/17 08:04:24
エクセルVBA開発のコーディングルール作ってるんだけど、意見聞かせて欲しい
ちなみに、会社で後任に引き継ぐのを想定してるだけなんで、ガチガチにする必要なし

みなさん設計する時どんなことに気をつけてます?

313:デフォルトの名無しさん
10/05/17 09:18:42
元々緩やかな下降線にはあったけど、人が減った事によって
それまでは人混みに隠れていた工作員の存在が目立つようになったのが致命傷だったな
工作員の誘導を嫌って参加者が減り、他所からの工作員を排除しようとして規制をするから
参加機会が奪われて更に参加者が減るという負のスパイラルにおちいってる

314:デフォルトの名無しさん
10/05/17 09:32:43
>>312
関数の引数は基本的にByValにするとかかな。
速度的にはByRefが望ましいんだけど。(特に文字列)

Option Explicit強制とか、
空文字の代わりにvbNull使うとか、
$バージョン関数があるなら$バージョン関数使うとか、
改行文字の種類も揃えたほうがいいかも。

変数名のつけ方をシステムハンガリアンにするなら
統一したほうがいいね。

315:デフォルトの名無しさん
10/05/17 12:41:57
Option Explicit以外、何一つ共感できない

316:デフォルトの名無しさん
10/05/17 12:45:34
>>315
俺もそう思った

317:デフォルトの名無しさん
10/05/17 12:47:19
なるほど
空白よりvbNullで統一したほうがいいな
そういやOption Explibt忘れてたわ……入れとこう

命名規則はアプリケーションハンガリアンにする予定
触る人のレベルなんかわからないし、プロジェクトごとの理解をまず深めて貰わないといけない
頭文字のみ大文字、単語ごとにアンダースコア、2バイト禁止
変数・プロジェクト名が長くなるから、頭文字大文字が必須になる

自分で慣れてないから書き換える手間が半端ないっていう

318:デフォルトの名無しさん
10/05/17 13:32:40
・VBA禁止


319:314
10/05/17 13:35:57
>>315-316
共感するしないじゃなくて、具体的な案とか意見書いてくれ。
問題点があるならそれもよろしく。

320:デフォルトの名無しさん
10/05/17 13:36:32
なぜそこまでしないといけないんだ

321:デフォルトの名無しさん
10/05/17 13:37:57
共感できないというなら理由ぐらい示せってだけだよ。

322:デフォルトの名無しさん
10/05/17 13:43:49
めんどくさい

323:デフォルトの名無しさん
10/05/17 13:46:18
役に立たないなあ…

324:デフォルトの名無しさん
10/05/17 13:51:31
別に役に立ちたくないし

325:デフォルトの名無しさん
10/05/17 14:00:39
>>315
俺もそう思った

326:デフォルトの名無しさん
10/05/17 15:47:24
>>315
私もそう思うわ

327:デフォルトの名無しさん
10/05/17 18:47:47
共感とか意見とか議論とか以前にルールに作るのになんかない? って質問に答えてるのが>>314だけじゃねえか
人のレスにいちゃもんつけるくらいしか出来ねえのか三流プログラマども




俺も>>315には共感するけどそれはそれとして

328:デフォルトの名無しさん
10/05/17 20:03:33
関数の前には必ず説明のコメントを書く。書式も統一して、検索しやすいようにする
何より

手段と目的が逆転しないように気をつける

329:デフォルトの名無しさん
10/05/17 20:18:20
変数名は大文字で始める?小文字で始める?
システムハンガリアンとかいうのは小文字だよね?

330:デフォルトの名無しさん
10/05/17 21:42:31
Dim hoge$ と書くか Dim hoge As Stringと書くか

331:デフォルトの名無しさん
10/05/17 22:47:17
普通は小文字で

332:デフォルトの名無しさん
10/05/17 23:08:56
大文字にしておくと、小文字で打ったときに自動訂正してくれる
だから大文字含めた変数名にしておくと、タイプミスが少なくなる

333:デフォルトの名無しさん
10/05/17 23:43:45
小文字の変数名にすると、ある型の名前を変数名にしてしまったときに
型が勝手に小文字になって困ってしまう
例えば、rangeとかdateとかを変数名にすると、全体的に型のRangeが
勝手にrangeに変わってしまう
なんとかならないんだろうか

334:デフォルトの名無しさん
10/05/18 00:04:23
VBAはシンボルを大文字小文字で区別しないんだから気にしなけりゃいいんじゃね
あとはかぶらない名前にするか

335:デフォルトの名無しさん
10/05/18 05:45:44
>>332
Option Explicitとか宣言の強制使え

>>333
システムで宣言済みの名前を使うな

336:デフォルトの名無しさん
10/05/18 07:56:22
予約後を変数で使おうとする気持ちがよくわからない。

337:デフォルトの名無しさん
10/05/18 08:04:48
特定の型の名前を予約語とは言わない。

338:デフォルトの名無しさん
10/05/18 08:26:09
特定の型の名前を(ry

339:デフォルトの名無しさん
10/05/18 08:41:53
Javaの場合なんだが、Eclipseとかの代表的なIDEは、変数の名前補完のデフォルトが
クラスの小文字名だよ

340:デフォルトの名無しさん
10/05/18 12:23:32
その人の行動は「プライバシー問題に関して無頓着」で一貫しているように
見えるので理解してもらうのは難しいと思う。新しい概念を習得してもらうには
少々歳を取りすぎている。掲示板にもらった手紙の全文を掲載した時点で
気が付くべきだったのかも。
「プライバシー問題に関して無頓着」な人は親しくない相手にも平気で年齢や
職業を尋ねる傾向があるようなので注意したほうがいいです。

341:デフォルトの名無しさん
10/05/18 12:24:23
>>335
デバッグするまでスペルミスのリスク抱えてろってのか?
タイプミスじゃなくて思い違いだったりすると、毎回変数名間違うことになる
一ヵ所ならまだしもデバッグ時に複数箇所とか煩わしすぎ

頻度の少ないコードとか気付かなかったり、確実にデバッグ出来るってわけでもないし……

342:デフォルトの名無しさん
10/05/18 13:47:54
日本語最強。

Dim 氏名 As String

343:デフォルトの名無しさん
10/05/18 15:21:21
2バイト表記はエラー起こす処理がMS公式であったはず
なんだか忘れたが、2バイト名関数を呼び出した時いらない参照呼び出して不具合引き起こしてたような
対応する気ない見たいだから、でっかいシステム組むのにはエラーでる覚悟はしとくべき

344:315
10/05/18 16:38:12
・関数の引数をByValにするのかByRefにするのかは、関数の仕様による。どちらかに決めうち
 するような性質のものではない。
・空文字列とvbNullは同じものではない。VarType()してみればわかる。
・いちいち$バージョンの関数があるかどうか調べるのはめんどくさいので使わない。
 そもそもmid()とmid$()とかは別物なのか?とかいうのも調べるのがめんどい。
・改行文字の種類も揃えたほうがいいかも <= 意味不明。vbCrLfを使いましょうってことだとしても、
 別にそろえる必要性を感じない。
・システムハンガリアンは使わない。

345:315
10/05/18 16:40:05
ちなみに、俺が昔作ったVBA用コーディング規約で、

「変数の定義はできるだけ遅くやる(使用する行/ブロックの直前でやる」

と決めたら、誰一人共感してくれなくて、驚くほどの反発があったことを思い出したよw

346:デフォルトの名無しさん
10/05/18 16:49:53
コーディング規約というかコーディングガイド的なものとして、こんなの提示したことあった。
・アーリーバインドをなるべく使う
・イベントプロシージャの中に処理を直接書かない
・変数は一行一個で宣言しろ
・Publicな関数はPascalCaseで
・Const使え

こんな感じだったか。

347:デフォルトの名無しさん
10/05/18 16:51:59
あ、そうそう、俺はシステムハンガリアンも使って良い派で、使うならfrmとかを決めてた気がする。

348:デフォルトの名無しさん
10/05/18 19:47:42
文字列をByValで渡した時って、先頭のポインタが値渡しされるの?
それとも、文字列全体がまるまるコピーされるの?

349:デフォルトの名無しさん
10/05/18 20:40:23
参照渡し プロシジャに値を渡す時、値そのものではなく、値が格納されている
変数のアドレスを渡す
呼び出し先のプロシジャで引数として宣言している変数の値を変更する
と、その引数に指定している呼び出し元の変数の値も変更される

値渡し プロシジャに値を渡す時、値そのものをコピーして渡す。
呼び出し先のプロシジャは、渡された値のコピーを受け取るだけなので
呼び出し先のプロシジャで引数として宣言している変数の値を変更して
も、呼び出し元の変数は一切影響を受けない。

だったかと

350:デフォルトの名無しさん
10/05/18 21:15:22
>>349
で、ポインタの値渡しなの?中身の値渡しなの?

351:デフォルトの名無しさん
10/05/18 21:18:55
>>350
コピーされる。
ちなみにVBの文字列の型はBSTR。
先頭に文字列長、末尾にヌル文字のUTF16文字列だったかな。

352:デフォルトの名無しさん
10/05/18 21:27:09
手元の本によると
プロシージャの引数の文字列がコピーされるのは以下のタイミング。

・ByRefだと文字列定数を渡した時
・ByValだと常時

もちろんポインタのコピーじゃなくて文字列をフルコピー。
VBの文字列はImmutableじゃない。

353:デフォルトの名無しさん
10/05/18 21:52:10
>>351-352
ありがとうございます。
VBAについてそこまで深く書いてある本もあるんですね

354:デフォルトの名無しさん
10/05/18 22:27:49
>>344
・引数にByRef|ByValを指定しなければByRefになる。
 アホが引数を書き換えるとわかりづらいバグに発展する。
 普通の関数であれば値渡しでいいはず。参照渡しを積極的に使う場面は少ない。
・ごめん。vbNullじゃなくてvbNullString。
・$・非$関数は別物。$じゃなければVariantが帰ってきている。
 普通はVariantには用がないはず。作者も$の方使えって言ってる。
・それならばvbCrLfとvbNewLineどちらを使うのか。
・システムハンガリアンはどうでもいいや。


355:デフォルトの名無しさん
10/05/18 22:35:57
作者って誰だよ
VBの作者か?

356:デフォルトの名無しさん
10/05/18 22:44:19
厳密にいうとVBにIntelliSenceつけたチームの中の人だな。

357:デフォルトの名無しさん
10/05/18 23:13:14
VBEの自動構文チェックって邪魔にしか思えないんだが、あれが便利で使ってるって人いる?
なんであんなものがあるのか不思議でしょうがない

358:デフォルトの名無しさん
10/05/18 23:21:43
どっかのペインにちょこっとアクティブに表示してくれるだけなら
便利な機能だけどダイアログで出るのが最高にウザいよなw

359:デフォルトの名無しさん
10/05/19 11:30:50
>>354
普通の関数であれば参照渡しでいいはず。
値渡しが必要な場合にのみByValを使え。

360:デフォルトの名無しさん
10/05/19 11:35:47
midとmid$のパフォーマンス気にする奴が、常にByVal使えとか笑えるわ

361:デフォルトの名無しさん
10/05/19 11:59:22
まあそれもそうだね。
ただ、両バージョン混在してるなら$にしろって言うけどね。
参照渡しは本当に理解してないのが多い(特にCとかJavaとかの人)

362:デフォルトの名無しさん
10/05/19 12:00:52
俺はかっこ悪いから$とかつけない
ByValもつけない

363:デフォルトの名無しさん
10/05/19 12:04:27
変数宣言とか関数宣言だと使うよ。
いちいちAsなんて書いてられない。

364:デフォルトの名無しさん
10/05/19 12:11:17
兎に角、統一してあればそれでいいや

365:デフォルトの名無しさん
10/05/19 12:23:27
Typename(Mid("a",1,1))ってやるとStringって言われるんだけど、
実際はVariantだってのはどこ見ればわかるのか知りたい。

366:デフォルトの名無しさん
10/05/19 12:25:02
第一引数を数値にしてみたけどやっぱり戻り値はStringだなあ
?Typename(Mid(123,1))
String

367:デフォルトの名無しさん
10/05/19 12:34:42
そもそもTypeNameってVariant自体は表示しないでしょ

368:デフォルトの名無しさん
10/05/19 12:41:11
>>364
なんかネット上に書いてありそうだけど、この本見てね。

Welcome to PowerVB
URLリンク(www.powervb.com)

369:デフォルトの名無しさん
10/05/19 13:11:03
midとmid$の差なんて、100万回実行して0.1~0.2秒位の差しかないよ。
その程度の差が利いてくるほどの計算量が必要な処理なら、そもそもVBAで
やるのがどうかという話もある。
まぁ一般プログラマは気にしなくて良いレベル。

370:デフォルトの名無しさん
10/05/19 13:20:40
Mid$()って、MS BASICあたり位からの互換性のためが主な目的な気がする。
そんな細かいことより、文字列の連結方法を教えといた方がいいよね。

371:デフォルトの名無しさん
10/05/19 13:21:29
連結方法ってカッコ付ける奴かな。

372:デフォルトの名無しさん
10/05/19 13:34:17
>>368
何書いてあんの?
何を読ませたいの?
英語の勉強からするのも面倒だし
ネットに書いてあるとか言うの教えてよ

373:デフォルトの名無しさん
10/05/19 13:38:34
>>371
多分このこと。
URLリンク(support.microsoft.com)

374:デフォルトの名無しさん
10/05/19 13:44:53
別にvbCrLfとvbNewLineが混在してても気にならない。
けど、普通はどっちか一つしか使わんだろ。気分でvbCrLf/vbNewLineをごちゃまぜに使うような奴なら、プログラマ
としての素質を疑うよな。
プロジェクト全体として(というほどの大きなプロジェクトがVBAで構築されることがあるのかどうかは知らないが)、
統一されてなくてもかまわんよ。

例えば、CでいちいちNULを'\0'と書けとか言われたら切れるな。0で済むところは0で書くし。
0と'\0'が混在してても気にならないし、0とNULLが混在してても気にならない。

375:デフォルトの名無しさん
10/05/19 14:01:05
上で出てた参照渡しについて
引数として用意した変数に格納してから渡したほうがいい?

call 処理(変数)



引数 = 変数
Call 処理(引数)
変数 = 引数

376:デフォルトの名無しさん
10/05/19 14:14:00
>>375
こんなレベルの奴がいるなら、基本ByValで渡せというのもうなずけるな。

377:デフォルトの名無しさん
10/05/19 15:17:35
なに一人で戦ってるんだ?
手を貸してやろうか?

378:デフォルトの名無しさん
10/05/19 16:07:10
いつもながら、誰がどの発言なのか良くわからずぐだぐだ

379:デフォルトの名無しさん
10/05/19 16:25:10
俺も>>314を支持する派に転向するわw

380:デフォルトの名無しさん
10/05/19 16:54:16
constさえあれば良かった。

381:デフォルトの名無しさん
10/05/19 17:15:06
じゃあ俺も314で

382:デフォルトの名無しさん
10/05/19 17:31:06
>>375エスパーすると

Q:
hoge1,hoge2,・・・hogeN
それぞれ何度も演算したり入れ換えたりした後に関数を呼び出し
関数の中でも同じ変数名でスパゲッティ大盛り
引数のhogeA,hogeBを間違えて渡した時の修正コストが半端ない
だから呼び出し前にそれぞれ変数に値を入れておけば、その部分だけ修正すればいい
よって>>375ですか?

A1: つ 参照
A2: つ 規約
A3: そんな時は大抵他の場所でも入れ違いがあるんじゃね

383:デフォルトの名無しさん
10/05/19 17:52:06
VBAコーディング規約は、こんな項目を含めるといいかも。

・Option Explicit必須
・デフォルトコントロール名(Text1など)の使用禁止
・伝統的なループ変数(i, j, k, ...)以外の一文字の変数名禁止
・ByVal/ByRefの省略禁止
・変数宣言/定義時は、Variantであっても必ず型名を付ける
・一行の「If ... Then」禁止
・Goto/Gosub禁止
・IIf禁止
・Call禁止(書くな)
・While ... Wend禁止(代わりにDo ... Loopを使え)
・$付き関数がある場合はそれを使え
・「=""」「<>""」の代わりにLenBを使え

384:デフォルトの名無しさん
10/05/19 18:50:33
>>383
>Goto/Gosub禁止
On Error は除いてくれ

Call禁止 反対 サブプロシジャ呼び出しであることを明確にしたい

385:デフォルトの名無しさん
10/05/19 19:16:01
>「=""」「<>""」の代わりにLenBを使え

俺普段=””使ってるわ。。。

386:デフォルトの名無しさん
10/05/19 19:59:17
Integerを使わずLongを使え、というのを足しても良いかもな。

387:デフォルトの名無しさん
10/05/19 21:25:40
足してもいい。Integerが32bitだと思ってる厨房が多い。

388:デフォルトの名無しさん
10/05/20 13:53:14
VBAでオセロでも作ってみようと思うんだけど、まったく分かりません
要点としては
①ゲーム開始ボタンを押した後、盤目をクリックしたら駒を描写する所
②一度置いたところにもう置けない判定
③駒を挟んでひっくり返す判定

どうかご教授ください

389:デフォルトの名無しさん
10/05/20 14:03:49
>>388
1. Cells(2, 2).Value = "●"
2. If Len(Cells(2, 2).Value) > 0 Then Debug.Print "おけない" End If
3. Cells(2, 2).Value = "○"

つか、VBAじゃなくて他の言語でオセロ書けるのかよ?

390:デフォルトの名無しさん
10/05/20 21:16:48
セルの数字を文字列に変換するマクロを考えていますが、この場合は元の数字に「’」をつける
形で良いのでしょうか?それともCstr を使用した方が適当なのでしょうか? 

391:デフォルトの名無しさん
10/05/20 22:00:31
>>385
> >「=""」「<>""」の代わりにLenBを使え
>
> 俺普段=””使ってるわ。。。

おいらも。こっちのがタイプ量少ないし。
LenBだといいことあるの?

392:デフォルトの名無しさん
10/05/20 22:01:28
>>390
セルの書式を文字列にすれば?

393:デフォルトの名無しさん
10/05/20 23:07:16
>>391
Len 6命令 <=> LenB 5命令
ちょっとだけお得。
これよりもうちょっとコストが付くのが空文字列の比較。
速度で言えば、LenBが最速。

394:デフォルトの名無しさん
10/05/20 23:20:39
>>390
Cells(2, 2).Value = Cells(2, 2).Value + ""

395:デフォルトの名無しさん
10/05/20 23:42:12
>>394
Cells(2, 2).Text & ""

396:391
10/05/21 00:02:51
>>393
なるほど。性能か。シビアな場合もあるのかもね。
文字列連結も+使うんじゃなくて領域確保した上でMid()使えとか。

おいらはとりあえず性能関係シビアな用途に使っていないし「= ""」 で良いや。

397:デフォルトの名無しさん
10/05/21 00:26:48
>>396
普段使うVBAなんて最速で書けた方が偉いからね。

398:デフォルトの名無しさん
10/05/21 00:46:22
差が出るほど大規模なプログラムをVBAなんかで書くのか…

399:デフォルトの名無しさん
10/05/21 00:56:18
If文書いてて条件の否定を付けるために
カーソル移動するのがめんどいから
Xor Trueなんて行末に書き足すのは俺だけでいい

400:デフォルトの名無しさん
10/05/21 01:06:42
>>398
プログラムの規模じゃなくてデータの規模が問題なんだよ。

401:デフォルトの名無しさん
10/05/21 10:49:32
>>383
DoUntill...Loopもだめ?

402:デフォルトの名無しさん
10/05/21 14:42:26
>>398
ループ内で、普通に文字列連結とかしてたら死ぬときがあるよ

403:デフォルトの名無しさん
10/05/22 11:52:57
文字連結で何故死ぬの?

404:デフォルトの名無しさん
10/05/22 12:05:08
>>402
これ書いたのだれ?もしかしておれ?

405:デフォルトの名無しさん
10/05/22 13:04:22
多分このこと。
URLリンク(support.microsoft.com)

文字列連結は、需要が多い上に意外と時間がかかる。
何も考えずに作ると処理が死ぬほど遅くなる。

406:デフォルトの名無しさん
10/05/22 16:35:49
すいません、しょうもないことと承知で質問します。
xlnoneとは何をするのでしょうか?

407:デフォルトの名無しさん
10/05/22 17:17:17
何もしない
ただの書式設定のプロパティ値

罫線描画を線無しにする時とかにプロパティをこれに設定する

408:デフォルトの名無しさん
10/05/22 21:00:46
Listviewのリストは、縦には出せないのでしょうか?

409:デフォルトの名無しさん
10/05/22 21:13:44
わかりづらかったですね。
Listviewは、縦スクロールにならないのでしょうか?

410:デフォルトの名無しさん
10/05/22 22:22:26
変数の規約について
例えば出勤日リストの行を定義する変数名

Shukkin_row_count_
ってするより、

S_r_c_ ' Shukkin_row_count_
としたほうが、タイプミスや誤読が減って設計コスト下がるよね
むしろアンダーラインなくして頭文字を大文字で対応すべきかなあ

コードが長くなると変数の意味が散逸しかねないけど……

411:デフォルトの名無しさん
10/05/22 22:45:34
そんな意味ならコメントは日本語でよくね?


412:デフォルトの名無しさん
10/05/22 22:55:31
>>410
ワケ判らん変数名は付けるな
下手に短い名前なら意味が判る長い変数名の方がよぉ~っぽど良いわ、ヴォケ



413:デフォルトの名無しさん
10/05/22 23:09:26
問題は長い短いじゃなくて俺の命名センスにあるのかな
300行くらいの短いコード書いてみたが、変数名省略しなくても慣れたらすらすら書けた
コメント部分が200行くらいになったが


>>411
うん、コード書く時は日本語コメントは当然付ける
それに追加で、省略前の変数名明示ってことで

414:デフォルトの名無しさん
10/05/22 23:09:28
他の項目にS_r_o_とかあったら死ねるな。
COBOLに侵され気味な俺だと、
SHUKKINrowCountかSHUKKIN_rowCountって感じかなあ。
ベタローマ字は全て大文字というのが俺的基本法則。

415:デフォルトの名無しさん
10/05/22 23:22:55
俺ならVBAとC#では気にせず変数名や関数名に日本語使う
それで可読性や開発効率が上がるなら別にいいじゃんてスタンス

416:デフォルトの名無しさん
10/05/22 23:30:18
>>413
その省略前の変数名という考え方がわからん
s_r_c_'出金の行数
とかでいいと思ってしまう

417:デフォルトの名無しさん
10/05/23 00:26:49
S_r_c_と言う記号で見るのと
Shukkinn_row_count_と言う意味で見るのを比べれば、
保守する時の可読性、認識レベルが異なる

だから逆に、接続を長くして意味を持たせるか、後で読み返した時の読みやすさを高めるために省略するかで迷ってる

日本語変数を使うってのが両方満たして楽なんだが……予期しないエラー引き起こすリスクもある

418:デフォルトの名無しさん
10/05/23 00:30:35
母音省略でいいよ。
sknRowCnt


419:デフォルトの名無しさん
10/05/23 00:32:35
あれ、回答レスになってないな?
省略前って言うのは、今Shukkinn_row_count_って変数があるけど、これをS_r_c_に省略した場合
ってことで使ったんだが、↑のように保守作業時に変数の意味を理解させるって側面もある

420:デフォルトの名無しさん
10/05/23 01:23:02
ソースは他人が見てわかるように書くべし
そして「明日の自分は他人」

結論。好きにしろ

421:sage
10/05/23 23:37:36
すみませんが、どなたか教えていただきたいことがあるのです。
エクセル2003でADOを用いてアクセス2003のデータを抽出したいのですが、
抽出条件で「・・・を含む」としたいのですが、上手くいきません。具体的には

.Source = "SELECT * FROM テーブル1" & _
" WHERE 日時>=" & 開始日 & " AND 日時<=" & 終了日 & _
IIf(Range("B10") <> "", " AND 依頼者='" & Range("B10").Value & "'", "") & _
IIf(Range("B12") <> "", " AND 項目='" & Range("B12").Value & "'", "")

となっておりまして、テーブル1というアクセスのテーブルから、日時と依頼者と項目を完全一致で抽出することはできました。
この中から依頼者と項目に関して、「・・・を含む」条件にしたいのですがLIKE演算子等入れても上手くいきません。
どなたか教えていただけますでしょうか。

422:デフォルトの名無しさん
10/05/23 23:40:15
>>421
SQLの問題というなら

SQL質疑応答スレ 9問目
スレリンク(db板)l50

若しくは同じデータベース板のAccessスレ(あるのかどうかは知らん)へGo !

423:デフォルトの名無しさん
10/05/23 23:46:23
>>421
上手くいかないとき、Sourceにどんな文字列が入っているのか出力して見てはいかが?

424:421
10/05/23 23:53:16
>>422
問題はSQL何ですかね?だとすると手がつけられません。

>>423
デバックしたときに見た文字列は上手くいっていました。
ということは外部データの取り込みではLIKE演算子は無理なのでしょうか・・・


425:デフォルトの名無しさん
10/05/23 23:54:57
むり

426:デフォルトの名無しさん
10/05/24 00:00:03
あれ?できなかったっけ?

427:421
10/05/24 00:05:18
たとえば
IIf(Range("B10") <> "", " AND 依頼者='" & Range("B10").Value & "'", "") & _
のところを、
IIf(Range("B10") <> "", " AND 依頼者 Like'%" & Range("B10").Value & "%", "") & _
へ変えてみても上手くいきませんでした。
もしかして書き方が間違ってますか?

428:デフォルトの名無しさん
10/05/24 00:14:13
>>424
デバッグで見ただけでは分かりにくいエラーは有るよ
俺はSQL文をテキストファイルに出力するプロシジャを作って
別途確認する様にしてる w



429:デフォルトの名無しさん
10/05/24 00:18:14
>>427
Value & "%" の%の後ろのシングルクォートは?
あと一応Like演算子と文字列の間にスペースを入れようか。
それとセルの内容エスケープしてないのはわざとだよね?

430:デフォルトの名無しさん
10/05/24 00:25:43
マンドクセだから確認してないけど
先に抜き出す条件を文字列でSQLにぶちこんでみ
それで出来ないなら構文かデータベースチェック

431:421
10/05/24 00:28:19
できました!。皆さんありがとうございます。
特に>>427さん
大変ありがとうございます。
恥ずかしながら、後ろ側のシングルクォーテーションが必要とは知りませんでした。
また、Likeの後にスペースを入れていないことも原因のひとつでした。(本当に情けない。。)

>>427さん
後学のため教えていただけますか?
>それとセルの内容エスケープしてないのはわざとだよね?
具体的にはどういったことでしょうか?


432:421
10/05/24 00:30:22
興奮してレスを間違えました。
429のレスは427ではなく>>429さんへのレスでした。

433:デフォルトの名無しさん
10/05/24 00:32:44
>>431
エスケープっていうのはたとえば、Range("B10")の内容に
シングルクォートが含まれていたりしたらSQL文として
文法エラーになるよ、っていうだけの話。
Like '%'%' みたいになったらシングルクォートの閉じ位置が
変わるので文法エラーになる。

まあ、自分で使うツールってだけならあんまり気にしなくていいよ。

434:421
10/05/24 00:40:20
>>433
なるほど・・・
たしかにそうですね。勉強になります。
今回は時間の都合上、運用面で対処したいと思いますが、
今後はそういったことを含めて構築していきたいと思います。
とにかくありがとうございました。

435:デフォルトの名無しさん
10/05/24 08:17:43
D-SUB9ピンのRS-232Cで接続するバーコードリーダーから文字列を入力する方法を教えてください
TELNETで認識するところまでは出来たのですがそこまでしか出来ませんでした

436:デフォルトの名無しさん
10/05/24 09:00:54
だれかイミディエイトウィンドウを画面右側にぴったりフィットさせる方法を教えてくれ。
前はいろいろいじくってたらなんとかできたんだけど、今どうやっても上手くいかない。

437:デフォルトの名無しさん
10/05/24 09:22:38
しばらくここ読んでなくて乗り遅れたが、空文字の代わりにvbNullStringって書いたやつ誰だよ。
どういう場面を想定したか知らんがrange("a1").value=vbnullstringなんてのは間違いだよなぁ。

438:デフォルトの名無しさん
10/05/24 09:25:46
2ch もう終わってるね

439:デフォルトの名無しさん
10/05/24 09:30:59
そんなことを言う人は破門です

440:デフォルトの名無しさん
10/05/24 09:48:26
LenBがLenより速いとか書いたやつもしっかりString型の時と書かなきゃいかん。
Excelでよく使うVariant型では逆になるぜ。


441:デフォルトの名無しさん
10/05/24 09:53:23
>>435
VBみたくAPI使えばいいんでね


442:デフォルトの名無しさん
10/05/24 10:05:25
436
ぐっとしてきゅって右下にばっする

443:デフォルトの名無しさん
10/05/24 10:18:36
>>440
くどくなるので必ずこうしろと言うわけではないが、Variant型の2次元配列の
各要素の型が何型か判定する場合が多いと思うが、判定して文字列だったら
String型の一時変数に格納して処理した方がベター。
そうすればLenBが確かに速い。
数値などの他の型でも一時変数に移した方がいいのは同じ。



444:436
10/05/24 10:26:51
>>442

でけたぜ!
右下にってのがコツなんだな。


445:デフォルトの名無しさん
10/05/24 11:04:44
正直、=""とかLenBとかにこだわってるのはほとんど無意味だぜ
そんなの、長い文字列を連結したり、RangeのCopyメソッドを使った瞬間に
無意味になる

446:デフォルトの名無しさん
10/05/24 14:06:07
Public Type A
ID As Integer
Name As String
End Type

Public Type B
ID As Integer
Name As String
ByRef A As String <-ここでエラーが出る
End Type

Sub main()
Dim TableA() As A
Dim TableB() As B
・・・・
End Sub

TableBでTableAのメンバーの一つを参照させたいのですが、上記のような記述だとエラーが出ます。

構造体のメンバーに参照(ポインタ)を使いたいのですが方法はないものでしょうか?


447:436
10/05/24 16:53:58
>>447
文字列の連結に単純連結がいけないのはほとんどの人が知ってるだろ?
あとはいかにスマートにMidステートメント使うかが腕の見せ所。
まぁ今はバカでも使えるJoinがあるので楽になったけどな。

448:デフォルトの名無しさん
10/05/24 19:01:08
単純な文字列連結にこだわりすぎるやつも馬鹿だな
文字列連結なんて大抵は短い文字列同士の連結にしか使わず
さらに回数もたいしたことないのが普通なんだから
その辺をわかってて使うなら普通の簡潔な記述の方が優れてる

449:デフォルトの名無しさん
10/05/24 20:19:31
>>448
んなこたー当たり前。
回数の多い例が出てたんでね。
こんなのほとんどの言語で共通だと思うが、未だに知らない人もいるみたいなんでね。

450:デフォルトの名無しさん
10/05/24 20:34:22
長さ0の文字列かどうかならLenとかLenBの方が""と比較するよりいいかも知らんが、セルが空白かどうかを調べるだけならIsEmptyが一番軽いだろうねぇ。
俺は大体""と比較するけどな。

451:デフォルトの名無しさん
10/05/24 22:12:41
そういうチマチマした高速化の技術はどうでもいい
高速化で本当に困るのはそんなところじゃない
上で出てた文字列連結の知識や、valueを配列に一気に出し入れする技、
WorksheetFunctionを使う技などをまず覚えるべき


452:デフォルトの名無しさん
10/05/24 22:38:03
>WorksheetFunctionを使う技

意識したことないけど、これどんなん?

453:デフォルトの名無しさん
10/05/24 23:43:02
>>451
そんな低レベルな話してもしょうがねぇなぁ。
お前の文字列連結を手直ししてやるからここで書いてみ?
A1:A60000の値をカンマで連結するコードを書け。
ただし

454:デフォルトの名無しさん
10/05/24 23:44:24
おっと途中で送信したぜ。
ただしJoinはなしな。
これは猿でもできるから。

455:デフォルトの名無しさん
10/05/25 02:44:49
高速化言うんならCとかでDLL作って呼び出したらいいんじゃね
VBAですることじゃない

456:デフォルトの名無しさん
10/05/25 06:08:39
何で書こうと回数の多い連結を単純に連結しては駄目だわな。
以前VBAを馬鹿にした酔っ払いSQL厨がいたが、アルゴリズムも知らない馬鹿だったぜ。

457:デフォルトの名無しさん
10/05/25 08:09:07
>>453の素晴らしい回答にご期待ください。

俺は猿でもできるJoin使うけど。

458:デフォルトの名無しさん
10/05/25 08:54:57
適当に

A6000までコピー
クリップボードから変数に抜き出し
Replaceでvblfを,に変換
書き出し

そこそこ早いかな?

459:デフォルトの名無しさん
10/05/25 08:59:05
>>456
回数だけではない
どちらかというとむしろ、文字列が長いかどうかが重要だな
回数というのもどちらかというと、「ペース」と置き換えるべきだし

460:デフォルトの名無しさん
10/05/25 09:15:49
連結してねえw

461:デフォルトの名無しさん
10/05/25 10:02:35
A60000だった
列Aでもいいな

462:デフォルトの名無しさん
10/05/25 10:46:29
お前と連結したいよ

463:デフォルトの名無しさん
10/05/25 11:47:36
ウホッ

464:デフォルトの名無しさん
10/05/25 12:24:32
プログラムとしては面白いが、解答としてはどうなの
実際に文字列連結する場合、配列でもなんでもいいけど書き出してからその処理するのは流石に時間かからないかな
見てないけど

465:デフォルトの名無しさん
10/05/25 12:48:58
もう連結ネタ飽きたのでそろそろ別のネタ始めてクレクレ

466:デフォルトの名無しさん
10/05/25 13:07:40
ネタも何も質問スレなんだから質問ありきだろ

467:デフォルトの名無しさん
10/05/25 13:10:42
素直にJoin使えばいいのに、禁止する意味がわからない
何がしたいの

468:デフォルトの名無しさん
10/05/25 13:16:14
任意の型の空の配列を作成する方法ってありますか?
String型ならSplit()で行けるし、Variant型ならArray()でいけますが、
他の型はどうやって作成すればよいでしょうか?

469:デフォルトの名無しさん
10/05/25 13:26:26
>>458
DataObject使うのか?
でもReplaceが遅いからなぁ。
試しに
A1
A2
.
.
A599999
A600000
と2文字~7文字の60万セルでやってみたら2.8秒だったぜ。
DataObjectとSplitとJoinの併用でもほぼ同じ。
一方Midステートメントは0.6秒。
ループ回して一次元配列に移してJoinは微差でMidステートメントに負けるようだが俺ならJoin使うな。
なんたって楽だからな。


470:デフォルトの名無しさん
10/05/25 13:34:18
上は連結文字列の作成だけで書き出しは入ってないからね。

471:デフォルトの名無しさん
10/05/25 21:15:37
60万行じゃなく6万行でやってみたら>>458のDataObjectが一番速いな。
Dictionaryと似たような特性だな。
数万データならそこそこ速いが数十万になるとウンコってやつ。

472:デフォルトの名無しさん
10/05/25 21:32:17
で、結局どんな答えを想定してたんだ?

473:デフォルトの名無しさん
10/05/25 21:38:05
クリップボード経由で数百万語を一変数に押し込む処理ってCPUとメモリに依存しそうだが

474:デフォルトの名無しさん
10/05/25 22:51:12
まだまだCPUやメモリは速くないなと思ってしまった。

475:デフォルトの名無しさん
10/05/25 23:27:54
思いつきで書いただけだが、「エクセルVBAテクニック」としてなら有りな感じ?
限定条件下になりそうだけど

476:デフォルトの名無しさん
10/05/26 00:40:46
>>458はvbLfじゃなくvbCrLfだな。

477:デフォルトの名無しさん
10/05/26 17:00:12
Mid$とclsConcatenate使って、
vbCrLfは10と13だから、SelectCaseでそれぞれ処理し、
2文字ずつカウントする

……と、多分こういう解答を求めてたんだろうか

478:デフォルトの名無しさん
10/05/26 20:43:51
Mid$以外使う必要がないでしょ
clsConcatenateってなんだろうと思って検索したら
独自に作ったStringBuilderもどきがひっかかった
もし、そういうのを使うならclsConcatenateだけでいいし
vbCrLfでSelect Case云々言ってるのは、なんでそんなことをしてるのか
ちょっとわからない

479:デフォルトの名無しさん
10/05/26 21:03:22
初歩的なことなのだが教えて欲しい。
Public変数は、プロシージャの処理終えると値消えてしまうのか?

480:デフォルトの名無しさん
10/05/26 21:12:04
基本的に残るけど、一定のタイミングや、
Endステートメントを実行すると初期化されなかったっけ。

481:デフォルトの名無しさん
10/05/26 22:26:59
>>479
VBAの処理が終わったあとで変数の内容を見るには、イミディエイトウィンドウで?
たとえば変数aの値を確認したければ?a[Enter]と入力すればいい
URLリンク(f12.aaa.livedoor.jp)

変数がクリアされる条件は、Endを実行した時(End SubやEnd Functionではなく単独のEnd文)
エディタやマクロの記録などでVBAを書き換えたとき

482:デフォルトの名無しさん
10/05/26 23:35:58
VBAの本でいい本ってある?
なんか、サンプル載せましたよ
みたいな本ばっかりで、このスレに書いてあるようなことが載ってる本
見たこと無いんだけど

例えば、>>481に書いてあるようなこととか、つい最近話題になった
文字列連結のことだとか、そういうことすら、書いてある本を
ほとんど見たことがない

483:デフォルトの名無しさん
10/05/26 23:41:14
フェイタンと師団長だったら、別に師団長が強烈な発を持っていなくても
勝負はわからんよなw

484:デフォルトの名無しさん
10/05/27 00:11:27
最近かってためになったのは
ExcelVBAスキルアップテクニック
Excelプロフェッショナルエンジニアテクニック
かな

485:デフォルトの名無しさん
10/05/27 00:26:31
>>482
VBAはVB6と言語としては全く等価だから
VB6で探したほうがいいね。

486:デフォルトの名無しさん
10/05/27 05:20:36
>>480-481
なるほど。Endで消えてしまうとは、知らなかった。
ありがとう。


487:デフォルトの名無しさん
10/05/29 20:28:43
これ出来ないのかな、と前から何度も思ってた事なのですが、

テキストボックスとテキストボックスなら、図形の矢印で結ぶことができて、
片方のテキストボックスを動かしたら、矢印の線も一緒に動くじゃないですか。

これを、
セルとテキストボックスでやることは出来ないのでしょうか?

つまり、テキストボックスから、矢印を延ばして、あるセルにくっつけます。
そして、どっちを動かしても、矢印で繋がったままにしたいのです。

488:デフォルトの名無しさん
10/05/30 10:02:24
URLリンク(www.youtube.com)

489:デフォルトの名無しさん
10/05/30 12:41:07
質問です。。
ユーザーフォームのラベルでバック半透明で文字だけをくっきり表示させたいです。
どうすればよろしいでしょうか?

490:デフォルトの名無しさん
10/05/30 22:55:02
VBAでマウスカーソルをピクセルで指定してクリックさせるにはどうするのが良いのですか?
今はShellを使って別プログラムから呼び出してますが、処理が遅くなるので
もっとスマートなやり方があれば教えて下さい。

491:デフォルトの名無しさん
10/05/31 05:10:33
うんこ

492:デフォルトの名無しさん
10/05/31 08:39:22
>>488
VBAで作るとすると
1.矢印の起点・終点(高さ)を取得
セルなら(i-1)までの.RowHeightの合計プラス(iの.RowHeight)/2
テキストなら位置プラス(高さ)/2
2.横位置を取得
同様に

3.左右のオブジェクト判定
セル、テキストボックスの右端位置を比較

4.1と2を元に矢印の位置設定


>>499
ラベルのプロパティ→項目別→表示
で好きなの選ぶ

493:デフォルトの名無しさん
10/06/01 01:02:31
>>489の質問は492で解決になっているのか??
表示の中に半透明の設定なくない?

494:デフォルトの名無しさん
10/06/01 07:19:17
EXCEL2003、XPsp2です。

EXCELのVBAだけを使って、インターネット(TCP/IP)通信をする
プログラムは作れるのでしょうか?
難易度は問いません。

よろしくお願いします。

495:デフォルトの名無しさん
10/06/01 08:21:24
ぐぐったらフォームの半透明化が見つかった
窓側のコントロールのカスタム描画を使うAPIだな

半透明ってのがイメージ湧かないが

496:487
10/06/01 12:52:30
ありがとうございました

497:デフォルトの名無しさん
10/06/01 17:06:19
Docmd.RunSQLってマルチプルINSERT対応していますか?
DBはMySQLです。

498:497
10/06/01 17:19:55
あ、ここAccessじゃなくてExcelでした。
すみません。


499:デフォルトの名無しさん
10/06/01 22:20:26
Formulaで数式埋め込もうとすると短い式なら問題ないんだが、
複雑な(長い)式になるとTRUEを返される。
何だこれ?

500:デフォルトの名無しさん
10/06/01 22:24:10
もっと色んなパターン試せばどうだろう
別の長い式作って


501:デフォルトの名無しさん
10/06/01 22:46:14
EasyCommっていうフリーウェアをインポートして
装置からデータをRS-232C経由で取り込むプログラムを書いたんですが、
プログラム動作中はストップキーも聞かず、入力を受け付けてくれない
ようです。これってそういう仕様とあきらめるしかないのでしょうか。


502:デフォルトの名無しさん
10/06/01 22:51:58
DoEventsじゃなくて?

503:デフォルトの名無しさん
10/06/02 07:37:52
真偽返すのはどっか引数が抜けてるんじゃね

504:デフォルトの名無しさん
10/06/02 11:32:10
>501

んなこたぁない。

505:デフォルトの名無しさん
10/06/02 20:39:09
エクセル2000では動く、エクセル2007では
動かないマクロがあるんだけど。
考えられる原因ってどんなのがあるの?

506:デフォルトの名無しさん
10/06/02 21:40:52
大抵は、変更とか削除された機能を使っていたとかじゃないか?
2007で旧時代の機能は大分整理されたみたいだからな。

507:499
10/06/02 21:57:24
解決した。

結局TRUEが返される理由はわからんが、
思い通りの結果が出たのでまぁ良しとする。

508:デフォルトの名無しさん
10/06/02 22:08:20
>>506
そうなん?ってことは2007で動くように
作りなおさなきゃってこと?
そのまま使える方法ってないのかなぁ?

509:デフォルトの名無しさん
10/06/03 11:30:03
ない
2003と2007はまったく別のソフトだと思った方がいい

何も全部作り直さなくても、たいていのマクロは少し修正するだけで使えるようになるはず

510:デフォルトの名無しさん
10/06/03 19:45:17
両方で動くようにはできないってこと?

511:デフォルトの名無しさん
10/06/03 20:22:43
それは内容による
速度やExcelそのものの制限に関係なく、
両方で結果が同じになる関数ばかり使ってればいい

512:デフォルトの名無しさん
10/06/04 06:30:29
両方で結果が違う関数なんてあるんだぁ
たとえばどんな関数?

513:デフォルトの名無しさん
10/06/04 08:14:47
version

514:デフォルトの名無しさん
10/06/04 11:34:28
おおっと

515:デフォルトの名無しさん
10/06/04 12:06:55
Versionはプロパティ

516:デフォルトの名無しさん
10/06/04 23:56:59
WorksheetFunction

517:デフォルトの名無しさん
10/06/05 00:07:43
エクセルver2002を使っています。
印刷設定について教えていただきたいのですが、

一枚77行で縦に任意の枚数(2枚なら77*2行)にあわせて行を77行ごと追加する
マクロがあるのですが、この作成された任意の枚数の表の印刷範囲についてなのですが、、、

表作成後に表全体を選択して印刷範囲設定しているのですが

With ActiveSheet
.PageSetup.PrintArea = Range(."表全体").Address
End With
※縮尺73%、A3、品質300dpi
プリンターの種類、印刷品質、余白の設定で印刷行数が77からずれることがあります。

【質問】
1.マクロで、縮尺はきにしないで常に77行目に印刷境界線をもってくることはできますでしょうか?
2.また、縮尺50%にしても77行ごとに印刷境界線をもってくることはできますでしょうか?

よろしくお願いいたします。

518:デフォルトの名無しさん
10/06/05 03:54:52
ipadでExcelVBA動くようにならんかね

519:デフォルトの名無しさん
10/06/05 04:01:07
>>517
77行毎に一旦別のシートにコピーして
印刷
その後そのシートは削除するとか

520:デフォルトの名無しさん
10/06/05 07:11:07
>>518
つ Citrix Receiver for iPad

521:デフォルトの名無しさん
10/06/05 20:49:36
>>517
印刷境界線ってのは何をさしてるんだ?

印刷範囲を77行までにするなら
ActiveSheet.PageSetup.PrintArea = "$1:$77"

78行の前に改ページ入れたいなら
Rows("78:78").Select
ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=ActiveCell

とりあえずマクロの記録でこうなった


522:517
10/06/06 14:03:42
>>517です。
分かりにくい説明ですみません。

縦に1~77と数字を入れたとして、次ページでまた1~77といれる。

【縮尺100%】
1
2
3


76
77
--------改ページのライン
1
2
3


76
77
-------改ページのライン

523:517
10/06/06 14:05:33
【縮尺90%】
1
2
3


76
77
1
2
--------改ページのライン
3


76
77
1
2
3
4
--------改ページのライン

縮尺が100→90%になったときに改ページラインがずれてしまいます。(列側のラインも同様にずれます)
また印刷の余白を変更したり、解像度を変更したりしてもずれます。
複数シートに同じような表があり、マクロで一括で体裁を整えたいのですが、

上記のようなとき、手動で改ページラインを77と1の間にもっていけば
自動的に100%になり綺麗に印刷することができます。
この時手動であれば90%のままで77行ごとにもできます。
これをマクロで印刷範囲を77行ごとにしたいのです。
※縮尺は問いません。(縮尺指定できるのであればやり方だけでも教えていただけたらと思いますが・・・)

524:デフォルトの名無しさん
10/06/06 14:52:35
だから、77行目ごとに改ページ入れたいんだろ
>>521の後半でわからない?まったくの初心者か?
その77行ごとにデータ入れるマクロで、改ページも入れるようにすればいいだけなんだが

わからんようなら、A列から1を探してその手前に改ページ入れるマクロ書いといてやる
    Dim row
    ActiveSheet.ResetAllPageBreaks
    row = 1
    Do
        row = row + 1
        If Cells(row, 1).Value = 1 Then
            ActiveWindow.SelectedSheets.HPageBreaks.Add (Cells(row, 1))
        End If
    Loop Until Cells(row, 1).Value = ""

2007で作ってるけど、たぶん2002でも動くと思う

暗黙の型変換気持ち悪いとかいう突っ込み禁止

525:517
10/06/06 17:26:45
>>524さん
ご指摘ありがとうございます。
マクロはネットで調べながら覚えたもので、勉強不足ですみません。

そして、謎が解けました!
ActiveSheet.ResetAllPageBreaks
の時点で自動で縮尺が100%になるんですね。
この後に縮尺を90%にしてから
HPageBreaks.Add
で改ページをいれてあげたらうまくいきました。

ありがとうございました。

526:デフォルトの名無しさん
10/06/06 20:12:11
下記のデータが仮にあったとします。
ユーザーフォーマットを使用してコンボボックスにユーザーID(A列)を
配置し、指定されたA列のB列、C列データを呼び出し変更を加えれるようにしたいのですが、
コンボボックスとテキストボックスをどのように紐つければよいのでしょうか?

A B C 
1 犬 雄 
2 猫 雄 
3 鳥 雌   



527:デフォルトの名無しさん
10/06/06 20:35:57
更新後処理

528:デフォルトの名無しさん
10/06/06 21:23:42
アドインを2つ作りました。

中のプログラムはモジュール名から何まで全く同じで、
途中で参照するファイル(テキスト)だけが異なります。

別の業務をしている人向けに、それぞれに作ったのですが、
兼業する人が両方のアドインを追加すると、うまく動きません。

具体的には、最初に動かした方のテキストをずっと読んでしまうようです。

どこを変えれば動くようになるでしょうか。

529:デフォルトの名無しさん
10/06/06 21:58:41
空が青いなぁ。

530:デフォルトの名無しさん
10/06/06 22:01:43
全部同じなら中の人も見分けつかないだろうな
処理なり使ってるシステムから切り替え出来ないの?

531:デフォルトの名無しさん
10/06/07 21:22:06
既にシート中にある、表の中身(文字列)を二次元配列として変数に代入して
他のシートのセルに場合わけして入れる場合、どのように書いたらよいのでしょうか?


532:デフォルトの名無しさん
10/06/07 21:46:32
Hairetu = range( , )

ループ処理
Hairetu(i,n)の条件分岐でHairetuBにでも格納

sheets( ).rante(,) = HairetuB

533:デフォルトの名無しさん
10/06/07 22:08:28
>>532さん、ありがとうございます。
最初の変数の代入は、どのように記述すればよいのですか?
二次元配列を宣言してx(i,n)でstring型で宣言したのですが、
データ数が多いのでfor文で回して代入したいのです。、
range("A1")を代入するとしたら、for文はどうなるのですかね??

For i = 1 To 18000
For j = 1 To 18
x(i,j) = Range(i, j)
Next j
Next i
こうじゃないですよね。。

534:デフォルトの名無しさん
10/06/07 22:14:31
Hairetu = range("A1:Z99")

535:デフォルトの名無しさん
10/06/07 22:47:54
ありがとうございます。
すみません、最後の別シートの格納の仕方についてなのですが…
例えば、x(2,3)の内容をRange("C2")に入れるなど、所定の場所に格納
する際に、for文で回して入れる方法はあるのでしょうか?

536:デフォルトの名無しさん
10/06/07 23:12:48
>>533
ワークシートの内容を配列に入れるには、配列を二次元のVariant型にしておけば、セルがいくつあっても一気に代入できる。
Forを使うより何倍も速いしプログラムも簡単。
String型にしてしまうとFor~Nextを使うような遅い方法しか使えなくなる。

537:デフォルトの名無しさん
10/06/07 23:14:50
>>535
そりゃ
Range("C2") = x(2, 3)
だろう。
ほかのデータはどこに入れるの?規則的に並んでなければForを使うのは面倒だよ。

538:デフォルトの名無しさん
10/06/08 18:05:08
別の配列に入れ替えればいいだろに

539:デフォルトの名無しさん
10/06/08 23:49:19
質問なのですが、
セル範囲を一括で配列に格納した場合の添え字を
0からスタートさせることは出来ますか?

普通に格納するとx(1,1)から数値が入ってしまうところを
x(0,0)から数値が入るようにしたいのです。
今は別の配列に入れ替えてるのですが、ちょっと不便で・・・

よろしくお願いします。



540:デフォルトの名無しさん
10/06/08 23:59:25
Excel2007

テキストボックスのScroolBarsプロパティをfmScrollBarBothに設定しているんですけど、
ホイールマウスの真ん中のホイール部分を回転させても有効になりません。

有効にする方法ってありますか?



541:デフォルトの名無しさん
10/06/09 02:26:41
>>539
無理。
VBAでは、0オリジンに拘るよりも、1オリジンを素直に受け入れた方が何かと楽だよ。

542:デフォルトの名無しさん
10/06/09 04:03:16
まだ勉強しだして一週間なんですが教えてください

AとBにそれぞれ1~50の数字を代入し
AとBを掛け合わせた数を縦方向にペペペと貼り付けを繰り返したいんですが
1×2と2×1は答え同じなんで重複を無くすために
代入する数値を【A>B】と定義するのってどうしたらいいんですか
↓こんな感じでやってます
Dim A
Dim B
for A 1 to 50
for B 1 to 50
(右クリックコピーでペペペと貼り付けるマクロ省略)
Next B
Nezt A


543:デフォルトの名無しさん
10/06/09 04:56:01
やりたいこと(出来上がりイメージ)がよくわからん上に
大事なとこが省略されてる気がする

とりあえずA>Bのときだけなんかの処理をしたいのなら

Dim A
Dim B
for A=1 to 50
for B=1 to 50
If A>B Then
(右クリックコピーでペペペと貼り付けるマクロ省略)
End If
Next B
Next A

こんな回答しかできません
出来上がりのイメージとかあればもうちょいマシな回答できるかも

544:デフォルトの名無しさん
10/06/09 05:03:23
>>542
とりあえず質問そのままの解答だと
If A > B Then ぺぺぺ
だけど、条件がA>Bだけだと6*1と3*2が同じ答えで重複するし
50*50は1回しか出てこないのに条件から外れちゃうよ?

いちいち調べなくても必ずA>Bになってるプログラム
For B = 1 To 49
For A = B + 1 To 50
ぺぺぺ
Next A
Next B

それから右クリックコピーってなんだ?
セルに数値を入れるだけなら右クリックも貼り付けも必要ないんだが。

545:デフォルトの名無しさん
10/06/09 09:39:29
Dim A&, B&, rowCnt&, colCnt&
rowCnt = WorksheetFunction.Max(A,B)
colCnt = WorksheetFunction.Min(A,B)

もしくは
If A < B Then
 Dim swap&
 swap = A
 A = B
 B = A
End If

ってやりたいだけか?

546:デフォルトの名無しさん
10/06/09 16:12:47
Sub Hoge(inRange as Range, outRange as Range)
上記のようなインターフェースのサブルーチンがあるとします
inRangeのデータに何らかの演算をしてoutRangeにコピーします
このサブルーチンをワークシートの上のほうにある関数入力部分に
=Hoge(A1:B2, C1:D2)
のように入力したのですがうまく動いてくれません
引数付きのサブルーチンをワークシート上で手動呼び出しするにはどうすればいいんでしょうか?

547:デフォルトの名無しさん
10/06/09 17:02:14
インターフェースのサブルーチン だぜ

548:デフォルトの名無しさん
10/06/09 18:59:39
シート1からシート7までのb242:u242のセルをコピーして
シート11のb2からb8まで順番に貼り付けるにはどうすればよろしいのでしょうか?

549:デフォルトの名無しさん
10/06/09 19:00:27
シート上に CommandButton を 2 つ配置し、
それぞれ CommandButton1, CommandButton2 とします。

CommandButton1 をダブルクリックして、次のコードを書きました。

 Private Sub CommandButton1_Click()

  CommandButton1.Enabled = False
  CommandButton2.Enabled = False

  MsgBox "now processing..."

  CommandButton1.Enabled = True
  CommandButton2.Enabled = True
 
 End Sub

ここで CommandButton1 をクリックしてダイアログボックスが出ているとき、
CommandButton2 の文字が黒のままで False になっていないように見える
のは、なぜですか?

MsgBox の行にブレークポイントを仕掛けて CommandButton1 をクリック
したときは、きちんと CommandButton2 の文字も灰色になります。

(WinXPSP3/Excel 2003)

550:デフォルトの名無しさん
10/06/09 20:25:57
>>546
SubをPublic Functionにしろ。
あとワークシートにVBA記述すんな。モジュールに書け。
関数の入力のダイアログでユーザ定義関数の一覧部分に
自分の定義したFunctionが出てるか確認しろ。

以上。

551:デフォルトの名無しさん
10/06/10 07:04:06
RS485を入出力したいのですが、RS232Cとかでよく使われるMScommを利用しようと思っています。
ところが、「ActiveXはオブジェクトを作成できません。」とエラーが出てしまいます。
RS232Cの入出力でも同様に出てしまいました。
VB6.0ランタイムはインストール済です。参照設定もしています。

どうしてでしょうか?解決策は?

552:デフォルトの名無しさん
10/06/10 07:26:00
>>551
URLリンク(oshiete.goo.ne.jp)

553:デフォルトの名無しさん
10/06/10 14:36:54
ワークブックXには、2つのワークシート(以下WS)があります。
・ワークシートA(以下WSA)は日次報告の原紙が作成済み
・ワークシートB(以下WSB)の列Cには日次報告の対象となる日付(MMDD形式)が入力済み

上記の2つのシートを使い、
1.「WSA」を「WSB:C列に入っている日付の個数分作成」し、
2.1.で作成されたWSのシート名を「WSBの日次報告の対象となる日付」に変更
するというマクロはどのように組めばよいのでしょうか?

554:デフォルトの名無しさん
10/06/10 15:14:06
>>553
実際に操作してマクロの記録しろよ

555:デフォルトの名無しさん
10/06/10 17:21:40
>>553
    Dim r
    r = 1
    Do Until Sheets(2).Cells(r, 3) = ""
        Sheets(1).Copy After:=Sheets(2)
        Sheets(3).Name = Sheets(2).Cells(r, 3).Text
        r = r + 1
    Loop

シートの1枚目が原紙、2枚目が日付の入ったシートって前提な

556:デフォルトの名無しさん
10/06/10 20:11:03
C++とかでDLLを作ってそのDLLの関数からRangeを操作したりって出来ますか?

557:デフォルトの名無しさん
10/06/10 20:54:18
IDispatch::Invokeとか直接呼ぶ羽目になりそうな気もするけど、
一応可能じゃないかと。

558:553
10/06/10 23:26:31
>>552
すみません…
駆け出しなもので、余計なコードが入ってしまうと理解に時間がかかるため
エディターで編集しています



>>555
ありがとうございます!
少し参照するシートや列を変更してみたら、自分の環境でも動くようになりました
ちなみに、こんな感じです↓

Sub ワークシートコピー()
Dim r
r = 1
Do Until Worksheets("日付データ").Cells(r, 9) = ""
Worksheets("原紙").Copy After:=Worksheets(Worksheets.Count)
ActiveSheet.Name = Worksheets("日付データ").Cells(r, 9).Text
r = r + 1
Loop
Application.DisplayAlerts = False
Worksheets("原紙").Delete
Dim p As String
p = Worksheets("日付データ").Range("A6").Text
Dim n As String
n = Worksheets("日付データ").Range("A7").Text
ActiveWorkbook.SaveAs Filename:=p & "\" & n & ".xls"
Application.Quit
End Sub

559:デフォルトの名無しさん
10/06/11 01:40:47
>>542
書いてみた

Sub main()

Dim C As Range
Dim strC(2500, 0) As String

For Each C In Range("A1:AX50")
strC(C.Row * C.Column, 0) = C.Row * C.Column
Next C

With Range("A1:A2501")
.Value = strC
.RemoveDuplicates Columns:=1
End With

Rows(1).Delete

End Sub


560:デフォルトの名無しさん
10/06/11 07:44:47
書き直した

Sub main()
Dim C As Range
For Each C In Range("A1:AX50")
Cells(C.Row * C.Column, 1) = C.Row * C.Column
Next C
Range("A1:A2500").RemoveDuplicates Columns:=1
End Sub


561:デフォルトの名無しさん
10/06/11 07:57:31
バグがあった・・・Orz

Sub main()
Dim C As Range
For Each C In Range("A1:AX50")
Cells(C.Row * C.Column, 1) = C.Row * C.Column
Next C
Range("A1:A2500").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End Sub


562:デフォルトの名無しさん
10/06/11 09:57:55
Excelで勤怠表を作成する時、必ず問題になるのが、
深夜割増、早朝割増、深夜休憩、早朝休憩の計算方法だと思うんだけど、
これってVBA使わずに完全に解決してる例がみつからない。

ここまできっちりやるならVBAもしくはシステム化が普通なのかな?

タイムカードは基本的には休憩時間を考慮しないし、そのへんなかなか難しいね。

563:デフォルトの名無しさん
10/06/11 11:31:45
>VBA使わずに完全に解決してる例がみつからない。

君の能力の問題じゃね?

564:デフォルトの名無しさん
10/06/11 12:14:02
> 君の能力の問題じゃね?

俺のググる能力が足りなかったのか!!

565:デフォルトの名無しさん
10/06/11 13:07:52
>>562
そういうの作った人が、やめちゃってわかんないから、バグとってくれって頼まれたことがある
まあ、ものすごく長い式が詰め込まれとったわ
VBA使わずにできなくは無いのは確かだけど
VBA使えるならそのほうが圧倒的に楽


566:デフォルトの名無しさん
10/06/11 13:25:52
>>565
読む方からしても、関数よりVBAの方がわかりやすいってことあるよね。
うちにもExcel2003の列数の制限いっぱいまで式が詰め込んであるワークシートが
複数枚、さらに記録機能で作っただけのマクロも大量の悲惨なやつがあるんだが、
とてもじゃないが解析する気にならない。当然作った人は辞めてる。
しかも経理用のだからよくわからん。

ただ、VBAとかマクロを使わずにワークシート関数のみを駆使したシートを
作ると自己満足度が高いので、気持ち的にはわかることはわかる。

567:デフォルトの名無しさん
10/06/11 15:24:34
どんな就業規則なのかしらんけど、区切り時間とか計算式が変わる境界値を設定して、
一列に一個**時間を計算して、そのsum()なんかを設定値と比較して条件式なんかを
設定した方が、VBAでごちゃごちゃやるよりシンプルだと思うのは俺だけか。

568:デフォルトの名無しさん
10/06/11 15:29:44
おまえだけ(´ω`)


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch