Excel VBA質問スレ Part9at TECH
Excel VBA質問スレ Part9 - 暇つぶし2ch369:デフォルトの名無しさん
09/01/05 13:14:41
>>368
Select Caseが105ってのは、実際にカウンタ変数のMod 10に対する
条件分岐のみのループの処理時間を計った結果
それぞれ500万回*3回の平均から算出した値

そもそもが単一条件の場合でも、Select CaseはIfより遅いからね

370:デフォルトの名無しさん
09/01/05 14:13:14
セル、グラフ、フォーム等の情報を利用してフォーム形成することはできますか?
例えば
名前 値 ラジオボタン
という行が連なるフォームを作る場合、
グラフの凡例数、セルの列数、フォームで入力した数分等、行が作成される感じにしたいのですが。
(フォームの大きさに入りきらない場合はスクロールバーを出す)

371:デフォルトの名無しさん
09/01/05 14:19:16
ユーザーフォーム上のコントロールを動的に生成したいってことなら出来るよ

372:デフォルトの名無しさん
09/01/05 14:22:53
>>371
調べ方が足りませんでした。すみません。 VBA 可変 フォームとかぐぐってました。
コントロール 動的 VBAでぐぐったらできそうな感じです。
ありがとうございました。

373:デフォルトの名無しさん
09/01/05 18:24:45
>>369
IfやELseIfのネストより遅いのは確かだが、Orより遅いわけねーって。
実測してみろよ。
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
Sub foo1()
  Dim i&, t1&, t2&
  t1 = timeGetTime
  For i = 1 To 5000000
    Select Case i Mod 10
      Case 5, 6, 9
      Case Else
    End Select
  Next
  t2 = timeGetTime
  MsgBox t2 - t1
End Sub
Sub foo2()
  Dim i&, j&, t1&, t2&
  t1 = timeGetTime
  For i = 1 To 5000000
    j = i Mod 10
    If j = 5 Or j = 6 Or j = 9 Then
    Else
    End If
  Next
  t2 = timeGetTime
  MsgBox t2 - t1
End Sub
foo1がショートサーキットだって知らなかったんじゃないの?
なんなら実証してみせるが、やり方くらい知ってるよな。

374:デフォルトの名無しさん
09/01/05 19:51:47
>>373
・timeGetTimeではなく組込のTimerを使ったこと
・Select Caseでも平等にするためにi Mod 10の結果を変数に取っていること
・結果をMsgBoxではなくDebug.Printで出力したこと
以外は同じコードだよ

ちなみに実証方法は知ってる
Select Caseがカンマ区切りがショートサーキットなのは知ってるからわざわざ
Select Caseでやったことは無いが、デバッグの一手法でもあるからな

375:373
09/01/05 21:26:44
>>374
i Mod 10の値を処理で使わないんなら>>373が平等なコード。
仮にfoo1でi Mod 10を変数にとってもfoo1が速いぞ?
おめーんとこじゃ遅いのか?

376:デフォルトの名無しさん
09/01/05 21:35:16
> i Mod 10の値を処理で使わないんなら>>373が平等なコード。
そうでもない

> おめーんとこじゃ遅いのか?
うん

377:373
09/01/05 21:40:10
OrもSelect Caseもお互いに速さでベストをつくせばそうなるじゃん。
おまえは最速のコード書けないんだろ?


378:373
09/01/05 21:41:57
後ろは読んでなかったが、おれのとこと逆になるらしいな。
俺のとこはSelect Caseが速い。

379:デフォルトの名無しさん
09/01/05 22:00:24
実際の処理に置いて必ずModで算出した値を使うというわけではない以上
条件分岐のステートメントに入る前の時点で、条件となる値が変数に代入されているという
同じ状況を作ることが平等になる

Modを使う場合に限定して、IfとSelect Caseのどちらを使った方が速いかを検証するなら、
君の言うとおりベストを尽くして最速コードを書くべきだけどね

380:デフォルトの名無しさん
09/01/05 22:12:28
なんか分かってないなぁ。
Modで算出した値を使わないなら>>373になるんだよ。
まぁどこまで行っても平行線だからもういいが、他のやつらはどっちが速いんだろ?
まぁ速さなんて俺はどっちでもいいけどな。
このような使い方なら普通の美意識を持ってたらSelect Caseだし。


381:デフォルトの名無しさん
09/01/05 22:19:50
>>380
foo1が速かった

382:デフォルトの名無しさん
09/01/05 22:24:07
>>381
トンクス
j = i Mod 10
Select Case j
としても?

おれのとこはそれでもfoo1が速いが。

383:デフォルトの名無しさん
09/01/05 22:26:51
>>382
逆転した

384:デフォルトの名無しさん
09/01/05 22:31:23
>>383
ふーん、俺のとこと違うな。
まさかjを変数宣言してないとかじゃないよな?

385:デフォルトの名無しさん
09/01/05 22:33:56
>>384
してなかった

したら差は縮まったけどまだ
foo2が速い

386:デフォルトの名無しさん
09/01/05 22:35:45
>>385
おいおい、しっかりしてくれよ。
jをLong型で宣言したらそうなるか教えてくれ。

387:デフォルトの名無しさん
09/01/05 22:36:45
すまん、また後ろ読んでなかった。

388:デフォルトの名無しさん
09/01/05 22:41:46
>>386
&で宣言したよ
30位foo2が速い

389:デフォルトの名無しさん
09/01/05 22:42:49
まぁModで算出した値を使わないなら>>373が平等な比較だが、とりあえず変数に代入したら
人によっては違うということは分かった。
ちなみに俺はWindows xp とExcel2007だ。

390:デフォルトの名無しさん
09/01/05 22:44:22
ちなみに
Excel2002です

391:デフォルトの名無しさん
09/01/05 22:47:06
>>390
トンクス。

392:361
09/01/05 23:18:31
>論理で「Aでないか、Bでないか、Cでない」ならの類なのですが、
>列5 列6 列9なら、イベント処理し、「そうでないなら」、exitする の
>「そうでないなら」はどう書いたものでしょうか?
訊き方が悪かったみたいですね。結局、次のこれで、希望する動きをしています。

If Not (Target.Column = 5) And Not (Target.Column = 6) And Not (Target.Column = 9) Then Exit Sub


393:デフォルトの名無しさん
09/01/06 00:21:36
文章だけだと伝わりづらいと思いますが、質問です。


ハイパーリンク │ 転記情報1
ハイパーリンク │ 転記情報2

EXCELシートの一覧表に上のようにハイパーリンクが張られた一列を作り、
それをWEBブラウザでプレビューできるようにしています。

WEBブラウザ上のリンクをクリックすると、
新しくEXCELシートを呼び出し、
クリックした行の情報(一番上のハイパーリンクをクリックしたなら転記情報1)を
呼び出したシートに転記する処理を作りたいと思っています。
EXCELシートならリンクをクリックすると同時にそのセルがアクティブになるので同行の情報も簡単に転記できそうですが、
WEBブラウザ上でもこれと同じような情報転記は可能でしょうか?


394:デフォルトの名無しさん
09/01/06 03:38:21
>>392
背中がムズムズする……

395:デフォルトの名無しさん
09/01/06 05:39:55
>>394
気持ちは解る
条件式にnotと=を併用するヤツってもうね…

396:デフォルトの名無しさん
09/01/06 07:33:05
<>

397:デフォルトの名無しさん
09/01/06 09:47:49
>>392
「Aでないか、Bでないか、Cでない」ではなく「Aでもなく、Bでもなく、Cでもない」だろ?
前者だと必ずTrueだからな。
それは置いといて、普通イベント処理ならIntersect使うから列番号では判定しないが、どうしても列番号で判定したいとか基本のお勉強なら
Select Case Trget.Column
  Case 5, 6, 9
    '処理1
  Case Else
    Exit Sub
End Select
’処理2

処理2がなければ、何もわざわざCase Elseで抜ける必要なし。
というか抜ける記述は普通はしない。

398:デフォルトの名無しさん
09/01/06 09:49:54
何、今更?

399:デフォルトの名無しさん
09/01/06 09:59:59
>>392
書き忘れたがTarget.Columnを三度も取得しちゃいかん。
どうしてもAndとかOrを使うんなら、いったん変数に取得してから判定するんだな。

400:デフォルトの名無しさん
09/01/06 10:02:35
>>398
昨晩のアフォの>>365か?
無視してすまんね。

401:デフォルトの名無しさん
09/01/06 10:29:05
悔しかったの?

402:デフォルトの名無しさん
09/01/06 10:30:29
シートに商品名が20,000件程度入力されている状態で
テキストボックスに商品名の一部を入力⇒キーワードが含まれるセルのデータを
リストボックスに追加 という処理を考えていたのですが
下記の方法で試してみるとかなり時間がかかってしまいます
高速に処理をさせるには根本的な方法の見直しが必要でしょうか?

 dSelectForm.ListBox1.Clear
 LastRow = Sheet1.Range("C65536").End(xlUp).Row
 For i = 2 to LastRow
  Ans = 0
  Ans = WorksheetFunction.Find(inputKey, Sheet1.Cells(i, 3))
  If Ans <> 0 Then
   dSelectForm.ListBox1.AddItem Sheet1.Cells(i, 3)
  End If
 Next

403:デフォルトの名無しさん
09/01/06 10:59:47
相変わらずの人がいるなw

404:デフォルトの名無しさん
09/01/06 11:20:39
>>402
ループのお勉強なら基本的には配列の勉強かな?
データ範囲を2次元配列に取得して回すとか、AddItemは遅いから1次元配列にため込んでListプロパティで設定するとか。
WorksheetFunction.FindじゃなくInStr使うとか。
たしかExcel2000以降ならFilter関数が簡単。
WorksheetFunction.Transpose(範囲)で1次元配列を取得して、Filter関数にかけてからListプロパティで設定。

405:デフォルトの名無しさん
09/01/06 16:29:31
イベント処理だし元の質問からも判断してわざわざExitで抜けるようなコードは必要ないと思う。
条件に「合う」場合だけ判定して処理するように書くのが普通だね。

定番はIfだけど質問者のレベルから考えてコンマ何秒の速度差を考える必要はないと思うし
見た目のわかりやすさと保守のしやすさからCaseをすすめとく。
条件が増えたときに簡単に数字が追加できるから。

406:デフォルトの名無しさん
09/01/07 01:50:36
2008年1月2日を08.01.02と表記してるセルを計算に使う方法ってありますか?
08.01.02と表記されたセルから08.01.01と表記されたセルを引くと1という答えが算出される処理を作りたいです。

407:デフォルトの名無しさん
09/01/07 03:34:54
>>406
セルの表示形式で「yy.mm.dd」

408:デフォルトの名無しさん
09/01/07 05:57:34
>>405
俺は誰かみたいに「何、今更?」なんて言わんが、そのような条件が三つ以上でIfステートメントでOr判定するくらいなら
Select Caseステートメントの方が速いし分かりやすいし定番だと思うよ。
あと知らなくていいことだが、Select CaseステートメントでCase Elseとか、If ThenステートメントでElseとかは
何もそこで処理しなくても書いた方が速くなるね。
まぁ俺は書かないけど。

409:デフォルトの名無しさん
09/01/07 06:18:38
>>406
数式でよけれべ普通に=A1-B1なんてやりゃできる。
もし表示形式が日付形式になるようなら、G/標準とか0にすりゃいい。
2007では計算元の表示形式が日付でも普通に1になるが、たしか2003では数式セルは日付にならなかったっけ?

計算元の表示形式が文字列で、VBAでやりたいのなら
MsgBox CDate(Cells(1,1).Value)-CDate(Cells(1,2).Value)
MsgBox DateValue(Cells(1,1).Value)-DateValue(Cells(1,2).Value)
などとやりゃできないか?

410:デフォルトの名無しさん
09/01/07 07:26:12
if not hoge is nothing then

って構文が気持ち悪いんですけど、何か代替えはありませんか?

411:デフォルトの名無しさん
09/01/07 07:53:25
そんなこといったらVBAなんて気持ち悪い構文だらけですが何か?

412:デフォルトの名無しさん
09/01/07 08:23:23
「代替え」なんて変な言葉を使う人に言われたくありません。
もしかして、「代替」を「だいがえ」って読んじゃう頭の弱い人やそれらに無意識に迎合しちゃう人ですか?

413:デフォルトの名無しさん
09/01/07 08:34:53
>>410
If ObjPtr(hoge) <> 0 thenでよくね?
俺はこんなことしないけどね。

414:デフォルトの名無しさん
09/01/07 10:38:45
それならもっとシンプルにできる
If ObjPtr(hoge) Then
こういう書き方を知らないと意味がわからなくなるけど

415:デフォルトの名無しさん
09/01/07 12:12:25
>>412
URLリンク(dictionary.goo.ne.jp)


416:デフォルトの名無しさん
09/01/07 12:25:38
not ~ nothingは俺も気持ち悪いと思う
直訳すると「ないアルよ」みたいな回りくどい二重否定の表現って
英語だと普通に出てくるから設計者は何の疑問も持たなかったんだろうなあ

俺もまだVBAを勉強中だから知らないだけかもしれないけど、
インスタンス化されてることを、いちいち論理を反転しなくても直接判定できるような
構文か関数ってないの?自分で作るしかない?

417:デフォルトの名無しさん
09/01/07 16:19:22
別にこの仕様でおかしくもないと思うけどねぇ
そもそもがNothingのときに何かをするってことの方が多いんだからさ
有ることと無いこと、両方とも否定文を使わずに判定出来るのが一番かもしれないが
どちらかのみと言うなら、無いことを判定する方法を用意すべきだろ

418:デフォルトの名無しさん
09/01/07 17:08:30
if hoge is not nothingと書けるのが一番良い

419:デフォルトの名無しさん
09/01/07 17:21:50
余計変だw

420:デフォルトの名無しさん
09/01/07 18:39:23
>>415
変な言葉が定着しつつあることはその引用で判るが、それで何が言いたいの?
# 頭使うことを知らない人は、自分で考えることを放棄するから困る。

421:デフォルトの名無しさん
09/01/07 18:42:58
いっそのこと
If hoge = Nothing
If hoge <> Nothing
でいいじゃん。
なんだよ突然Isって。わざわざ演算子を使い分ける妙なこだわりが理解できん。桂正和マニアかよ。

422:デフォルトの名無しさん
09/01/07 19:10:25
代替~(ダイタイ~)
の同音異義語が有る場合などに
代替え~(ダイガエ~)
と重箱読み使うのは昔からあること

変な言葉でもなければ、最近になって定着しつつあるのではなく以前からあったもの
件の場合は重箱読み使うのが適切と言える状況ではないが、誤用や間違いではない
"代替"の意味で"代変え"を使っているなら完全な誤用だけどね

そもそも、言葉というのは変化していくもの
最近になって定着しつつあるのだとしても、それを頭ごなしに否定するのは愚かしい
頭使うことを知らない人は、誤用と変化の違いを見極めることなく
自分の中の古い知識だけで物事を断定しがちだが、もっと柔軟な頭と広い視野を持たないと困るよ

423:デフォルトの名無しさん
09/01/07 19:32:33
AndAlsoやOrElseってVBAには無いんだったっけ?

424:デフォルトの名無しさん
09/01/07 19:50:59
>>412
いや、”だいがえ”が正しいんじゃないかな。
もしかして”だいがい”って呼んでるの?

425:デフォルトの名無しさん
09/01/07 19:54:09
CやJavaが長年培ってきた洗練された構文をかなぐり捨ててVBはいったいなにがしたかったのだろう。
なぜ}のかわりにEndと入力しないといけないのか理解に苦しむ。
見やすくない上に3文字も打たないといけない。ばっかじゃないか?

426:デフォルトの名無しさん
09/01/07 19:55:49
馬鹿発見。「だいたい」と読むのだよ。つーか、>422に書いてあるだろ。

427:デフォルトの名無しさん
09/01/07 19:56:12
いやいや、オリジナルのBASICはCより古いぞ。
その古臭い構文をVBも引きずっているというだけ。
だからこそBasicを名乗っているわけだが。

428:デフォルトの名無しさん
09/01/07 19:56:28
>>425
CやJavaとbasicはどっちが古いと思っているのかね。

429:デフォルトの名無しさん
09/01/07 20:00:04
オリジナルのベーシックと今のVBはかなり違うじゃん。
古いベーシックから新しいVBになるにあたって
CやJavaで解決されている構文を見習えばよかったのだ。


430:デフォルトの名無しさん
09/01/07 20:00:56
C#でも使ってろ。

431:デフォルトの名無しさん
09/01/07 20:05:32
>>430
エクセルのマクロでC#って使えるの?

432:デフォルトの名無しさん
09/01/07 20:06:30
それよりなんでキーワードの先頭は大文字なんだろう
目がチカチカする
小文字ならまだメリハリが出て読みやすいと思う

433:デフォルトの名無しさん
09/01/07 20:12:55
エクセルのセルに入っている文字列の特定の文字の上にオートシェイプを置きたいって質問した人です。

質問させてください。

エクセルの現在のフォントでの文字列の幅を取得するには、

1.HWNDをNULLでデバイスコンテキストを取得する。
2.コンパチブルなDCをつくり、フォントをエクセルのフォントと同じものをセレクト。
3.GetTextExtentPoint32を呼び出して論理単位で文字列幅を得る。
4.(モードがMM_TEXTだと仮定して)ピクセルなので、ポイントに変換する。
  (DPIはGetDeviceCapで取得)
5.エクセルのシートのズームが80%なら0.8をかける

であっていますか?

434:デフォルトの名無しさん
09/01/07 20:22:18
>>429
VBが登場した頃は、まだパソコン用の高級言語の人気が
CとPascal(これはBegin~Endって書く言語)で2分していて、
C系の構文が良いという評価が固まっていなかったのだと思う。

>>432
VB登場の少し時代は全部大文字だったから、そこからは進歩したと言えると思う。

435:デフォルトの名無しさん
09/01/07 20:27:07
変わったと言うより大幅に拡張されてるね。
根っこの部分はN-BASICの時代から変わってないから
昔覚えた変なテクニックが意外とそのまま使えたりするんだよな。
このあたりN-BASICやN88-BASICの記憶がないとなかなか同意してもらえないと思う。

例えばこんなNextの書き方、VBから始めた人は知らないんじゃないかな。

For i = 1 To 10
For j = 1 To 10
  (処理)
Next j, i

436:デフォルトの名無しさん
09/01/07 20:31:28
>>435
あったなぁ・・

そうだ、For文みて思い出したけど、VBは1からカウントするのが好きくね?
配列とか。あれキモイ。

まともな人間なら数字は0からカウントするものだ。
という言葉を思い出した。


437:デフォルトの名無しさん
09/01/07 20:36:44
fortranなんかは1からだろ
数学も1から
C系で0ベースなのはメモリの配置とか低レベルな理由

438:デフォルトの名無しさん
09/01/07 20:38:03
>>436
配列はN-BASICもVBも0からだろ。

439:433
09/01/07 20:39:17
あのー。少しは私のことも思い出してあげてください。。(^^;)

440:デフォルトの名無しさん
09/01/07 20:40:30
>>439
修飾(ボールドとかイタリックとか)も考慮しないとずれるよ

441:デフォルトの名無しさん
09/01/07 20:43:21
>>440
嗚呼~。ほんとだ。そうですよね。。

あ、433のやり方で大筋はOKで、かつ、ボールドも考慮みたいな感じでしょうか?

442:デフォルトの名無しさん
09/01/07 21:25:06
>>407>>409
表示形式色々変えたんですけど、
Msgboxで表示しても0だし、EXCELのセル上に表記しても#VALUEになります。
なんでなのでしょう。
EXCELのバージョンは2000です。

443:デフォルトの名無しさん
09/01/07 21:27:33
>>441
細かいことを言えば、Excelは同じセル内でも1文字ごとにフォントを変更できる。
すべてに対応するのはけっこうめんどくさそう。

444:デフォルトの名無しさん
09/01/07 21:28:40
>>442
元の日付けデータがシリアル値になってないんでねーの?

445:デフォルトの名無しさん
09/01/07 21:31:48
>>443
そういやそうですね。ちょっとそこらへんも含めて作ってみます。


446:デフォルトの名無しさん
09/01/07 21:50:11
VBAっていつ無くなるんだっけ?次のバージョンから?

447:デフォルトの名無しさん
09/01/07 21:55:32
>>444
そもそも08.02.01のような表記をシリアル値にする方法がわからないのですが。
=DATEVALUE("08.02.01")
みたいに表記してもVALUEになるだけですし。

448:デフォルトの名無しさん
09/01/07 22:01:53
>>447
VBA関係ないよな
=DATEVALUE(SUBSTITUTE("08.02.01",".","/"))
次に何かわからないことがあったら総合相談所行ったら?

449:デフォルトの名無しさん
09/01/07 22:03:37
>>446
Mac版の2008ではなくなったけど、その次でまた復活する予定。
Win版はなくならない。

450:デフォルトの名無しさん
09/01/07 22:18:53
>>449
サンクス
本職はC++だけどVBA使えると経理の女の子から結構重宝されるので助かる

451:デフォルトの名無しさん
09/01/07 23:29:12
てか、事務職でVBAって何に使うんだよw

452:デフォルトの名無しさん
09/01/07 23:49:34
1行目が項目名で、2行目から201行目までデータが入っています。
オートフィルター後のA列のデータを取得したい。
どんなマクロになりますか?



453:デフォルトの名無しさん
09/01/08 00:20:50
うぇー Workbook.Save False すると Wrokbook_Before_Close動かん

454:デフォルトの名無しさん
09/01/08 00:29:40
>>452
オートフィルタの実行はAutoFilterメソッド
結果を配列として取り出すのはCurrentRegion.SpecialCellsメソッド

>>451
単純作業をVBAで自動化してやるとけっこう喜ばれるよ
毎日在庫を確認して発注伝票を印刷してFaxで送信するとか
中小だとアバウトな部分が多くて完全な自動化は難しいから
できるところだけやる

455:デフォルトの名無しさん
09/01/08 00:35:23
>>451
どんだけ想像力ねぇの?

456:デフォルトの名無しさん
09/01/08 00:35:29
下記のような感じで、セルに他のセルを参照した値を入力したいのですが、
下記の入力方法だと、絶対参照になってしまいます。
相対参照にする指定方法をご存じないでしょうか?

Cells(i + 1, 9).Value = "=" & Cells(i, 9).Address & "+" & Cells(i + 1, 6).Address

457:デフォルトの名無しさん
09/01/08 00:43:52
>>451
Officeって言うくらいだから・・・

458:デフォルトの名無しさん
09/01/08 00:53:51
>>456
Cells(i, 9).Address(False, False)

459:デフォルトの名無しさん
09/01/08 01:14:30
OS:WinXP
Ver:Office2000

以下のマクロが意図したとおりに動きません。
aの値によってaddstに入力した値に異なる係数をかけた値を作りたいのですが、
係数をかけたはずのaddをセルに入力してみるとゼロになっています。
参考文献にはCaseの後はコンマで区切って複数条件を入れれるとありますが、
それはできないのでしょうか。。
なおプログラム自体は上記係数を無視する他は問題なく動いています。

Dim a As Integer
(中略:aはFor構文で1から18まで増える)
Dim addstd As Double
Dim add As Double

addstd = 0.3
Select Case a
Case 3, 4, 8, 11, 13, 18
add = addstd
Range("A5").Value = add
Case 2, 6, 7, 10, 15, 17
add = addstd / 2
Range("A5").Value = add
Case 1, 5, 9, 12, 14, 16
add = addstd / 3
Range("A5").Value = add
End Select

460:デフォルトの名無しさん
09/01/08 01:22:28
>>458
ありがとう

461:デフォルトの名無しさん
09/01/08 01:49:40
>>459
表示形式

462:デフォルトの名無しさん
09/01/08 02:57:09
ウォッチやDebug.Printで値を見るくらいは自分でやれよ

ほんと、VBA使いって問題起こるとそこで思考停止してしまい
試行錯誤することが出来ない奴が多いよな

エラー出たらそこで終わりってなら機械と同じだぜ
処理速度では機械に敵わないんだから機械以下とも言える


463:デフォルトの名無しさん
09/01/08 06:24:19
多いって何人だよ

464:459
09/01/08 08:48:02
ありがとうございます。ググってみました。
もしかすると、これに近い問題でしょうか。
URLリンク(questionbox.jp.msn.com)

また、デバッグ方法もありがとうございました。
VBAというか、プログラミング的なものを初めて2日目なもので、まだよく使い方がわかっていませんでした。
今から会社に行っていろいろ試してみようと思います!

465:デフォルトの名無しさん
09/01/08 09:05:06
>>459
計算自体はできてるようなので
書式設定の少数点以下の桁数が0になってるんじゃ?

466:デフォルトの名無しさん
09/01/08 09:52:07
非アクティブシートの選択セルを操作する事は可能ですか?

467:デフォルトの名無しさん
09/01/08 10:48:21
無理

468:デフォルトの名無しさん
09/01/08 15:28:00
VBAを作成してもらいたいのですが
もし作成していただけるようでしたらメールをお願いします。

1つの縦列から文字や数字を抽出し、横行書き出す作業を繰り返すマクロの作成をお願いしたいです。

469:468
09/01/08 15:30:04
メール入力し忘れてました(´A`)

470:デフォルトの名無しさん
09/01/08 19:05:09
幾ら出すの?

471:デフォルトの名無しさん
09/01/08 19:42:27
カラダで良かったら...

472:デフォルトの名無しさん
09/01/08 20:41:14
>>468
形式を選択して貼り付け→行列を入れ換える

473:デフォルトの名無しさん
09/01/08 23:45:40
EXCELのWebブラウザでプレビューの機能を使って作ったブラウザをVBAで閉じるにはどうしたらいいんですか?

474:デフォルトの名無しさん
09/01/09 00:43:19
Webbrowser.Fuck

475:デフォルトの名無しさん
09/01/09 00:44:26
OS:XP
Version:2003

取得したデータをセルに表示させる処理を作ったのですが
少し処理速度が遅いので、配列を使って処理しようと思っています。
その際、特定データに対してセルの色付けを行っているのですが
配列を使って最後にRangeオブジェクトで貼り付ける場合、どのタイミングで
セルに色付けするのがいいんでしょうか?

配列に入れる処理中に色付けをするぐらいしか思い浮かばないのですが
どなたか知恵を貸して下さい


476:デフォルトの名無しさん
09/01/09 00:50:04
> 配列に入れる処理中に色付けをする
それでいいじゃん、何か問題有るの?

477:デフォルトの名無しさん
09/01/09 03:10:36
>>473
穴だらけのコードだけど、とりあえず…
環境依存かもしれない

Option Explicit

Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Const GW_HWNDLAST = 1
Public Const GW_HWNDNEXT = 2
Public Const WM_CLOSE = &H10
Public Const ml = 255
Dim wh1 As Long

' コールバック関数
Public Function EnumWindowsProc(ByVal Handle As Long, ByVal lParam As Object) As Long
  Dim strClassName As String * ml
  Dim strCaption As String * ml
  GetClassName Handle, strClassName, ml  ' クラス名取得
  GetWindowText Handle, strCaption, ml    ' キャプション取得
  If Left(strClassName, 7) = "IEFrame" And Mid(strCaption, 4, 22) = "Documents and Settings" Then wh1 = Handle
  EnumWindowsProc = True
End Function

Private Sub test1() '「ブラウザでプレビュー」を閉じる
  wh1 = 0
  Dim Ret As Long
  Ret = EnumWindows(AddressOf EnumWindowsProc, ByVal 0&)
  If wh1 <> 0 Then Call PostMessage(wh1, WM_CLOSE, 0, 0)
End Sub

478:デフォルトの名無しさん
09/01/09 09:28:53
>>475
とりあえず大雑把なアドバイスをしておく

できる限りセルへのアクセスを減らす

決まった色の取得にRGBを何度も呼ばない
定数を使うか初期化の段階でLong型の変数に入れておいてそれを使う

的外れなアドバイスだったらスマソ
具体的にどんな処理をしてるのか分かればもう少し細かく何か言えるかも知れん

479:デフォルトの名無しさん
09/01/09 16:28:17
名前の定義のリストをシートに作成し、それを変更して一気に登録しています。
そこで困った事が発生しました。

シート名がS1とかだと名前の前後にシングルコーテーションが付きますね。
セルから取り出した値は先頭の1文字が外されます。
仕様だとは思いますが、シングルコーテーションも一緒に取り出す方法等が
あるのでしょうか?



480:デフォルトの名無しさん
09/01/09 16:45:36
>>479
リストを作る時に先頭にシングルコーテーションをもう1つ入れておく
もしくはシート名と名前で列を分ける(使う時に編集する)

この程度しか思いつかないな・・・

481:452
09/01/09 23:15:14
452 :デフォルトの名無しさん:2009/01/07(水) 23:49:34
1行目が項目名で、2行目から201行目までデータが入っています。
オートフィルター後のA列のデータを取得したい。
どんなマクロになりますか?

>454 :デフォルトの名無しさん:2009/01/08(木) 00:29:40
> >>452
> オートフィルタの実行はAutoFilterメソッド
> 結果を配列として取り出すのはCurrentRegion.SpecialCellsメソッド
との答えをいただき、
いろいろとやってみるのですが、全くのお手上げ状態です。

フィルター後の上2件分の例示マクロをお願いします。


482:デフォルトの名無しさん
09/01/09 23:25:47
>>481
もうちょっと質問を具体的に。
(1)フィルターの条件は?
(2)フィルターかけたあとどうしたい?

483:452
09/01/10 00:31:08
(1) フィルターの条件はデータが1又は0となっているので、1を該当データとしてかけています。
(2) フィルターをかけた後は可視セルを対象に、「A列の各コード(3桁)を取得したい。」
おおよそ、20~50件程が該当データになります。
取得した後の配列から、その各要素を取り出すことは自分でできると思います。
随分以前ですがやったことはありますので。



484:デフォルトの名無しさん
09/01/10 01:11:17
>>483
1か0か判定するだけなら、わざわざオートフィルタ使わなくてもForループで順に見てけばいいんでない?
要素数も大して多くないんだし。とりあえず…

B列が1の物だけをオートフィルタで抽出
Range("A1").AutoFilter Field:=2, Criteria1:="=1"

A列の可視セルの内容をすべて書き出す
For Each c In Range("A1").CurrentRegion.Columns(1).SpecialCells(xlCellTypeVisible).Cells
  Debug.Print c.Value
Next

485:デフォルトの名無しさん
09/01/10 08:15:13
VBAを用いてプリンタに印刷させようと考えています。
それ自体はPrintOutメソッドを使えばできると思っているのですが、その際、プリンタのトレイまで指定することは可能でしょうか。
例えば、このシートを印刷する時はA4のトレイ、このシートを印刷する時は手差しのトレイから、という感じで。

486:デフォルトの名無しさん
09/01/10 09:20:27
>>485
出来るよ
手動でトレイの選択などが出来る状態なら
その辺の制御をするドライバやAPIは入ってるわけだから
それをプログラムから叩けば良いだけ

でもそれはVBAではなくVBの分野(>>1参照)
印刷対象がExcelのシートだろうと、プリンタのハード的制御はExcel関係ないのでスレ違い

487:452
09/01/10 10:10:00
>>484
おかげで、所期目的が達成できました。サンクス。


488:デフォルトの名無しさん
09/01/10 11:09:59
>>485
>それ自体はPrintOutメソッドを使えばできると思っているのですが、・・・

484氏の回答を得て、機嫌がいいので (~_~);
そうゆう設定は、PrintOutメソッドでは出来ない。
それで、vbaとしての回答は、印刷ダイアログボックスを呼び出して、選択することになる。
Application.Dialogs(xlDialogPrint).Show

但し、excel4マクロ(vbaではない扱いをされている)の世界だとどうだか知らない。
(xpでは見ていないが、97(たぶん?)と)2007ではマクロの記録で、また、
excel4マクロが記述されている。が、これは、触らない方が無難。


489:デフォルトの名無しさん
09/01/10 11:17:02
xp は2003 の誤記です。

490:デフォルトの名無しさん
09/01/11 16:30:56
↓のようなWindowオブジェクトの用途がよくわかりません。

Dim window1 As Window

workbookでもなくworksheetでもないんですよね??
どなたかご教授お願いします。

491:デフォルトの名無しさん
09/01/11 16:53:34
用途が判らなければ、使わなければいいのでは?

492:デフォルトの名無しさん
09/01/11 17:04:46
>>490
大雑把に説明すると、Windowsというのは画面上に表示された状態の物。
ブックやシートは画面に表示されてなくても、例えばHDDに保存されたファイルの中にも存在する。
ブックを開いたらWindowが作られる、みたいに考えておけばいい。

493:デフォルトの名無しさん
09/01/11 17:44:48
>>492
ありがとう。
自分が作るプログラムには特に必要はなさそうです。
自分のPCでは
Set window1 = Workbooks(1) 
でwindow1には”PERSONAL.XLS”が入ります。
勉強になりました。

494:デフォルトの名無しさん
09/01/11 20:05:41
A(伝票番号)B(日付)C(店名)D(金額)
となっていて、C列の店名ごとに並べ替えてあります。
C列の店名が変わるごとに列A~Dに太線を入れたいので以下のようにしました。

Sub test()
With Range("C1", Range("B65536").End(xlUp)).Offset(, 250)
.Formula = "=IF(C2="""","""",IF(C1<>C2,1,""""))"
.Value = .Value
On Error Resume Next
With Intersect(.SpecialCells(xlCellTypeConstants) _
.EntireRow, Range("A:D")).Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlThick
End With
On Error GoTo 0
.ClearContents
End With
End Sub

これだとデータが1件(1行分)しかない場合線が引けません。
データが1件でも区切り線が引かれるようにするには
どのようにすれば良いですか?


495:デフォルトの名無しさん
09/01/11 20:24:15
>>494
努力だけは認めるが、無駄が多すぎる。
店名が同じかどうか判定するのに、わざわざワークシート関数なんか使わなくてもVBAだけでやればいいだろうに。
Sub test()
  r = 2
  While Cells(r, 3) <> ""
    If Cells(r, 3) <> Cells(r - 1, 3) Then
      With Range(Cells(r, 1), Cells(r, 4)).Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .Weight = xlThick
      End With
    End If
    r = r + 1
  Wend
End Sub

496:デフォルトの名無しさん
09/01/11 20:37:40
>>495
考えすぎたみたいです。解決しました。
ありがとうございましたm(_ _)m

497:デフォルトの名無しさん
09/01/11 20:43:27
>>494
オレの知らないテクニック満載で何やってんのか理解できねえ

498:デフォルトの名無しさん
09/01/11 20:46:09
すみませんw

499:デフォルトの名無しさん
09/01/12 07:19:54
2007の質問ですー
図形の操作がらみが「マクロの記録」に残らないんですが
以前のバージョンのように記録させる方法ないでしょうか?

500:デフォルトの名無しさん
09/01/12 08:23:04
>>499
ない

501:デフォルトの名無しさん
09/01/12 17:55:50
初歩的な質問で申し訳ありません。教えていただけますでしょうか。

下図①のように、クラスと番号と氏名が入力されているファイルがあります。
下図②のように、クラスと番号のみが入力されているファイルがあります。
クラスと番号の2つをキーに、図①から②に氏名をとってきたいのですが、
どのようにしたら良いでしょうか。
キーが1つであれば、VLOOKUPで出来るのですが、2つになって困っています。
宜しくお願いします。

図①            図②
クラス 番号 氏名     クラス 番号
1   1  相沢      1   1
1   2  加藤      1   2
1   3  佐藤      2   1
1   4  館山      2   2
2   1  安西      2   3
2   2  木村      
2   3  工藤


502:デフォルトの名無しさん
09/01/12 17:57:54
Excel総合相談所 76
スレリンク(bsoft板:942番)

942 名前:名無しさん@そうだ選挙にいこう[] 投稿日:2009/01/12(月) 17:51:11
【1 OSの種類         .】 WindowsXP
【2 Excelのバージョン   】 Excel2007
【3 VBAが使えるか    .】 いいえ
【4 VBAでの回答の可否】 可
【5 検索キーワード     】 VLOOKUP 値の取り出し

下図①のように、クラスと番号と氏名が入力されているファイルがあります。
下図②のように、クラスと番号のみが入力されているファイルがあります。
クラスと番号の2つをキーに、図①から②に氏名をとってきたいのですが、
どのようにしたら良いでしょうか。
キーが1つであれば、VLOOKUPで出来るのですが、2つになって困っています。
宜しくお願いします。

図①            図②
クラス 番号 氏名     クラス 番号
1   1  相沢     1   1
1   2  加藤     1   2
1   3  佐藤     2   1
1   4  館山     2   2
2   1  安西     2   3
2   2  木村      
2   3  工藤



503:デフォルトの名無しさん
09/01/12 21:11:53
こんなスレにホイホイ質問して良かったのか?
俺はマルチポストでも構わず答えちまう男なんだぜ。

俺なら、どっかのセルにクラスと番号を結合させた物を作る。
cells(i,1).value & "-" & cells(i,2).value をforでまわしてどっかに作る。
図1と図2に同じ処理。
後はfindでsetするなり、好きに料理しろ。

504:デフォルトの名無しさん
09/01/12 21:50:33
実行中のマクロより呼び出すことで、実行を中断しデバッグ可能な状態にする
コマンドはありますか?

マクロの自動記録で試しましたが記録されませんでした。


505:デフォルトの名無しさん
09/01/12 21:58:38
>>504
勘違いかも知れんが、Stopとかブレークポイントの事か?

506:デフォルトの名無しさん
09/01/12 22:28:43
>>505
そうです。
ブックを開いてマクロ実行する運用の中で、
一定の条件が成立した時に止めたいのですが、
ブックを開く度にブレークポイントを手動で設定するのは
現実的ではないのでブレークポイントはちょっとNGと思ってます。
イメージとしては以下のような感じです。

if xxxxx then
application.stop ← ここで止めたい
end if

ブレークポイントをマクロより動的に設定できるか、
ブックに保存できる方法でも助かります。


507:デフォルトの名無しさん
09/01/12 22:30:16
>>506
errとerr.number使えばいいんじゃねーの?

508:デフォルトの名無しさん
09/01/12 22:34:30
MsgBoxやInputBox出せばそこで止まるぞ
止まったらEsc押すといい

509:デフォルトの名無しさん
09/01/12 22:37:15
>>508はダメだった、すまね

510:デフォルトの名無しさん
09/01/12 22:53:25
じゃあSTOPでいいんじゃね?
止まったところでイミディエイトウィンドウで変数の内容を見たり書き換えたり自由にできる。

実行再開はCONT (嘘)

511:デフォルトの名無しさん
09/01/12 22:58:17
SendKeys "{Break}"

ごめん嘘

512:デフォルトの名無しさん
09/01/13 01:58:50
debug.assert false じゃダメなん?


513:505
09/01/13 17:18:25
>>506
そのままでいいじゃん
for i=1 to 5


514:505
09/01/13 17:20:27
>>506
途中で送信してしまった

for i=1 to 5
  if i=3 then
    stop
  endif
next i

みたいに。

515:デフォルトの名無しさん
09/01/13 20:24:40
単に止めるだけなら
for i=1 to 5
  if i=3 then stop
next i
って書く。

516:デフォルトの名無しさん
09/01/13 21:12:47
俺は処理が1行でもThenの後ろには書かない
もちろん、If ... Then ... else ...もやらない

517:デフォルトの名無しさん
09/01/13 21:36:38
>>514
>>515
ありがとうございました。
stopで止まりました。


518:デフォルトの名無しさん
09/01/13 21:51:33
>>516
すいません
そのわけを教えてください

519:デフォルトの名無しさん
09/01/13 22:15:21
クラスモジュールについてドップリ勉強できる書籍はないだろうか?

520:デフォルトの名無しさん
09/01/13 22:39:31
勉強するほどのものじゃないんじゃ

521:デフォルトの名無しさん
09/01/13 22:54:17
IPアドレスを
123.456.789.10
からx番目のIPアドレスを求めるような
EXCEL関数かVB関数を探してるのですが、
そんな便利なものありませんか?


522:デフォルトの名無しさん
09/01/13 23:17:28
x番目って何よ?

523:デフォルトの名無しさん
09/01/13 23:23:36
Split("123.456.789.10", ".")(x)でいいんじゃねーの

524:デフォルトの名無しさん
09/01/13 23:25:33
>>522
すみません。
123.254.90.10から
1番目は、123.254.90.11
2番目は、123.254.90.12、

という意味です。
上のIPアドレスの範囲も間違えて、あぁぁぁ、出直してきます。
失礼しました。。。。


525:デフォルトの名無しさん
09/01/13 23:28:29
単なる足し算じゃね

526:デフォルトの名無しさん
09/01/14 00:02:10
うーん
Sub test()
  For x = 1 To 10
    A = Split("169.254.100.10", ".")
    A(3) = A(3) + x
    Debug.Print Join(A, ".")
  Next
End Sub

527:デフォルトの名無しさん
09/01/14 01:48:01
123.254.90.256とかやりそうな奴だな

528:デフォルトの名無しさん
09/01/14 20:38:53
123.54.90.999 とかやってくれたら笑えるんだけど

529:デフォルトの名無しさん
09/01/15 00:29:42
OSはXP
EXCELは2003です。

1.EXCEL上に別のEXCELシートを開くハイパーリンクを貼る
2.リンク先のシートが開くと同時に

Private Sub Workbook_Open()
Workbooks("Book1").Close
End Sub

みたいな感じで処理を走らせ、リンクで開いたシート自体を閉じる

のような処理を入れるとシートが閉じられた後、EXCELがおかしくなります。
アクティブになっているEXCELシート以外のシートがアクティブにできないし、
新たに別のシートも開けなくなります。

ハイパーリンクとリンク先のシートを閉じる処理って同時には行えないんですかね?

530:デフォルトの名無しさん
09/01/15 01:01:19
>>529
イベント処理中でブックを閉じると実行中のインスタンスが開放されて暴走するんだっけ、
なんかそんなのがあったような気がする。

531:デフォルトの名無しさん
09/01/15 03:44:25
開く方に
Book1閉じるって書くしかないんじゃね

532:デフォルトの名無しさん
09/01/15 04:02:02
マクロ専用のブックを1つ用意して、それは閉じないようにするとか

533:デフォルトの名無しさん
09/01/15 18:17:44
すみません。質問させて下さい。

Excel2002のシートにラベルコントロールを貼付けました。
それをクリックすると、マウスカーソルがコントロールから離れるまで
コントロール全体のサイズが若干大きくなってしまいます。
これは仕様でしょうか?
もし対処方がありましたら、御教示下さい。

534:デフォルトの名無しさん
09/01/15 18:20:29
>>533
フォーカス位置を示す点線で囲まれた状態のことを言ってんなら、それは仕様

535:デフォルトの名無しさん
09/01/15 18:37:33
>>534
回答ありがとうございます。

ラベルのキャプションのテキストのサイズも変化するので、
フォーカスの点線ではないと思われます。

キャプションのテキストは通常状態ですと文字が滲んでおり、
クリックしてラベル全体が大きくなると文字がハッキリすることから、
ラベルをクリックしたときのサイズが正しいような気がします。

536:デフォルトの名無しさん
09/01/15 19:37:27
質問です。

book1をアクティブにした状態のまま、book2の特定のセルに書き込みをしたいのです。
で、

Windows("book2.xls").Cells(1, 2) = 1

とやったのですが、エラーが出ます。
正しくはどうやればいいのでしょうか?

537:デフォルトの名無しさん
09/01/15 22:06:50
× ブック.セル = 値
○ ブック.シート.セル = 値


538:デフォルトの名無しさん
09/01/16 18:33:12
すいません質問です。
VBAを使い年賀状を作成しなければならないのですが まず何からどうしたらよいかさえわかりませんm(_ _)m
お願いします。汗

539:デフォルトの名無しさん
09/01/16 18:40:34
まずは作成しなければならない状況に陥らせた人に聞くべきだろう

540:デフォルトの名無しさん
09/01/16 18:48:41
マクロ記録しながらシートで作ればいいよ

541:デフォルトの名無しさん
09/01/16 19:00:27
この時期だと年賀状じゃなくて寒中見舞いだぞ

542:536
09/01/16 19:27:50
>>537
レスありがとうございます。

さっそくやってみました。

Windows("book1.xls").Sheets("Sheet1").Cells(1, 2) = 1

とやったのですが、やはりエラーが出ます。
なぜなのか、さっぱりわかりません。
しつこいようですが、教えて下さい<(_ _)>

543:デフォルトの名無しさん
09/01/16 20:03:41
ちょっとはぐぐれよ。オブジェクト名やメソッド名がおかしいだろ。

Sub test()
  Workbooks("book1.xls").Activate
  Workbooks("book2.xls").Worksheets("Sheet1").Cells(2, 1) = 1
End Sub

544:デフォルトの名無しさん
09/01/16 23:03:00
Excel 2000ですがマクロのステップ数が大きくなると、
ブックのファイルサイズがMB単位で肥大化して困ってますが、
皆さんどうしてますか?

545:デフォルトの名無しさん
09/01/16 23:17:27
そんな現象おきないのでどうもしてないが

546:デフォルトの名無しさん
09/01/16 23:24:57
どんだけ巨大なマクロを作ってるんだか。
ワークシートを操作するマクロを何度も走らせるとファイルが太る可能性はあるが、
それならシートの再構築でダイエットできるかもしれない。

547:デフォルトの名無しさん
09/01/16 23:27:09
以下の構成で、hogeよりfugaにあるクラスを生成(new)しようとすると、
「ユーザ定義型は定義さていません」エラーとなります。
クラスでないモジュールの場合はそのまま呼び出せてます。
名前空間の問題と思われますが解決方法はありますでしょうか?

hoge.xls → fuga.xla(参照設定)


548:デフォルトの名無しさん
09/01/16 23:31:21
>>546
マクロは相当な量です。
再構築は以前試した時は多少は改善しました。
でも、まっさらなブックにマクロのみ貼り付けても、
それ以上は小さくならなかったのでコレが限界かと。

549:デフォルトの名無しさん
09/01/16 23:32:49
>>543
おおおおお、ありがとうございました!!

550:デフォルトの名無しさん
09/01/16 23:34:08
Variant型をできるだけ使わないようにするとか

551:デフォルトの名無しさん
09/01/17 00:30:00
>>547
URLリンク(support.microsoft.com)

552:デフォルトの名無しさん
09/01/17 10:08:15
シートをそれぞれ別ブックに保存する方法教えて。
保存名はシートの名前で。

553:デフォルトの名無しさん
09/01/17 11:38:51
それを手動でやる方法すら思いつかないの?
思いつくならそれをマクロの記録で録ることすら
思いつかないの?馬鹿なの?死ぬの?

554:デフォルトの名無しさん
09/01/17 11:44:17
>>552
ワークシートコレクションに対するループの中で
(1) シートが1枚のブックを新規作成
(2) そこへシートをコピペ
(3) 名前を付けて保存
(4) 新規ブックを閉じる
を繰り返す

とりあえず>>1の★5の理由によりまずは自分で作ってみれ。方法は★6で。

555:デフォルトの名無しさん
09/01/17 13:44:33
>>551
ありがとうござました。
しかし各クラスごとに生成用のメソッドが必要とは...
これがなければ理想的なんですが。

556:デフォルトの名無しさん
09/01/17 17:44:47
>>555
オブジェクト指向ではコンストラクタとデストラクタもクラスライブラリで用意することになってる。
というか勝手にインスタンス化するのは不可能だろ。どんだけメモリが必要かもわからんのに。

557:デフォルトの名無しさん
09/01/17 17:49:40
>>556
おまい判ってない。
↓ではコンストラクタでなはく生成用のグローバルなメソッドを
クラスの外に定義しろっていってんだよ。
オブジェクト指向以前の問題。

URLリンク(support.microsoft.com)


558:デフォルトの名無しさん
09/01/17 18:00:01
シートの表示倍率の値は取得できます?

559:デフォルトの名無しさん
09/01/17 18:44:18
>>556
Excelのclassのインスタンス化プロパティがPrivateかPublicNotCreatebleしか選べないから
外部から直接インスタンス化できないという仕様なのが問題で、コンストラクタは関係ない。

560:デフォルトの名無しさん
09/01/17 19:30:45
Withっていいな。Withでネストしまくったコード見ると癒される。

561:デフォルトの名無しさん
09/01/17 20:43:17
>>558
出来ますよ

562:デフォルトの名無しさん
09/01/18 11:40:34
すみません、質問です。
エクセル2003のVBAについてです。

フォーム内に、セル(もしくは、エクセルのセルと同様の働きをするもの)
の貼りつけることってできるのでしょうか?

563:デフォルトの名無しさん
09/01/18 12:15:21
>>562
ググれカス
URLリンク(q.hatena.ne.jp)

これで良い?

564:デフォルトの名無しさん
09/01/18 13:52:10
withを使った方が処理の速度は速くなりますか?

565:デフォルトの名無しさん
09/01/18 13:54:43
はい

566:デフォルトの名無しさん
09/01/18 13:59:02
EXCEL2003です。
VBAの処理の中でハイパーリンクをセルの書式設定にてロックを解除したセルに貼り、
その後シート全体をセルの選択が出来ない形で保護する
つまりハイパーリンクのあるセル以外は押しても反応が無いよう保護する処理を作ったのですが、
ハイパーリンク以外のセルを押すとリンク先の画面が立ち上がってしまいます。

ハイパーリンクのあるセル以外は選択することも出来ないような画面を作りたいのですが、
何故上のような画面が出来てしまうのでしょうか?

567:デフォルトの名無しさん
09/01/18 14:34:48
> 何故上のような画面が出来てしまうのでしょうか?
保護により選択出来ないセル上で行ったクリック動作は
現在選択状態にあるセル上で行ったものとして扱われる
故に選択できるセルが1セルなら、どこをクリックしようとそのセルをpクリックした扱いになる

君の要望を実現するには、セル上のハイパーリンクではなく、
ボタンコントロールなどを使ってリンク先に飛ぶのが適切だろうな
まあガンバレ

568:デフォルトの名無しさん
09/01/18 15:07:11
うん!僕がんばるよぉぉぉおおお!!

569:デフォルトの名無しさん
09/01/18 16:35:58
WindowsXP上でEXCEL2003を使用してます。

フォームに入力した内容を編集してシートに反映させるマクロを作成しているのですが、
マクロ実行中はシートをアクティブに出来ないのでマクロを終了させないと
シートの変更内容の確認が出来ません。(テスト作業+デバッグの効率が悪い…)

マクロ実行中(フォーム表示中)でも、シートのウィンドウをアクティブにしてシート選択が
可能になる方法はあるのでしょうか?

よろしくおねがいします

570:デフォルトの名無しさん
09/01/18 17:58:08
>>569
VBEのウィンドウを最大化しなければいい

571:デフォルトの名無しさん
09/01/18 18:31:58
>>569
普通に見れるだろ

572:デフォルトの名無しさん
09/01/18 19:46:29
マクロを手動で実行ではなく、
(例)表列A1、A2に数値を入力したらリアルタイムに(マクロ側に計算式記述。例えば A1*A2)A3に結果を表示させようとする場合どうすればいいでしょう?

解説サイト見てもブック起動時実行ってのばかりしか見つからない…

573:569
09/01/18 19:48:39
もう少し作成しているマクロを説明すると、

・マクロはsheet1上に置いたコマンドボックスから開始する(フォームが表示される)
・フォームに入力した内容が反映されるのはsheet2・sheet3

で、
・フォームが表示されている状態ではExcelのウインドゥをアクティブにすることが出来ない
・なので、マクロで変更されている筈のsheet2・sheet3を開くことが出来ない

という状態です。

>>570
VBEのウインドゥについては開いている状態でも閉じている状態でも上記の現象に変わりありません。

>>571
マクロがsheet1を編集しているなら普通に見れるとは思いますが、
編集しているのは背面にある他のシートなので…


574:デフォルトの名無しさん
09/01/18 19:48:44
>>572
ワークシート関数と同じ感覚?
それならSelectionChangeで出来る。
シートごとに設定しないといかんけどね。


575:デフォルトの名無しさん
09/01/18 20:11:43
>>569,573
Modelessで呼べば良いだけでは?

>>574
SelectionChangeではなくChangeだろ
SelectionChangeは選択セルが変更されたとき
Changeはセルの値が変更(入力、削除など)されたとき

それと対象セルと処理内容が同じならシート毎に設定する必要も無い
ブック単位、あるいは全ブックを対象に一括処理する方法もある

576:デフォルトの名無しさん
09/01/18 20:20:07
>>575
vbModelessを付けてフォームを開いたところ上手くいきました、
ありがとうございます。

577:デフォルトの名無しさん
09/01/18 21:34:00
>>574
多分functionとrangeを使ってどうにかこうにか書くのだと思うのですが上手くいかない

578:デフォルトの名無しさん
09/01/18 21:36:51
>>577
ヒント
Workbook_SheetChange
Application.EnableEvents = False

579:教えてください
09/01/20 00:51:55
質問です。初心者です。
複数のブックに散らばっている同じ名前のシートを、1ブックの1シートにまとめたいのですがうまくいきません。
msgbox "5"までは表示されるので、次の行がおかしいのだと思います。
「motosheet.」の記述を消すとマクロ自体は動作するのですが、コピー元のブックではなくてコピー先のブックを参照してしまいます。
なぜか、rangeの親オブジェクトを記述すると「実行時エラー 1004 アプリケーション定義またはオブジェクト定義エラー」となります。
1行前はrangeの親オブジェクトを記述しても問題ないのに・・・
本当に困っています。よろしくお願いします。



580:教えてください
09/01/20 00:52:34

Private Sub CommandButton2_Click()
Application.ScreenUpdating = False

Dim motobookspath As Variant
Dim motobookpath As Variant
Dim 先ブック入力済み最終行番号 As Long
Dim データ貼り付け開始行番号 As Long
Dim sakirange As Range
Dim motorange As Range
Dim motobook As Workbook
Dim motosheet As Worksheet
Dim 入力済み最終行番号 As Long

motobookspath = Application.GetOpenFilename(filefilter:="Exclブック,*.xls", MultiSelect:=True)
MsgBox "1"



581:教えてください
09/01/20 00:53:00

For Each motobookpath In motobookspath
先ブック入力済み最終行番号 = ThisWorkbook.Worksheets("データ").Range("i1").End(xlDown).Row
データ貼り付け開始行番号 = 先ブック入力済み最終行番号 + 1
MsgBox "2"

Set sakirange = ThisWorkbook.Worksheets("データ").Cells(データ貼り付け開始行番号, 1)
MsgBox "3"

Set motobook = Workbooks.Open(Filename:=motobookpath)
Set motosheet = motobook.Worksheets("データ")
MsgBox "4"

入力済み最終行番号 = motosheet.Range("i1").End(xlDown).Row
MsgBox "5"
Set motorange = motosheet.Range("a2", Cells(入力済み最終行番号, 19))

motorange.Copy Destination:=sakirange
motobook.Close savechanges:=True
Next

Application.ScreenUpdating = ture

End Sub

582:デフォルトの名無しさん
09/01/20 01:06:50
Set motorange = motosheet.Range("a2", Cells(入力済み最終行番号, 19))

Set motorange = motosheet.Range("a2", motosheet.Cells(入力済み最終行番号, 19))

583:デフォルトの名無しさん
09/01/20 06:51:42
巷ではこういうコードが普通にあんのかね。

584:デフォルトの名無しさん
09/01/20 11:38:28
誰もがプログラミングの専門家じゃないからね。
入門書を斜め読みして断片的な知識で「動けばいい」程度のコードを書いてる人のが圧倒的に多いよ。

585:デフォルトの名無しさん
09/01/20 19:28:45
超初心者で申し訳ありませんが・・・
エクセルのシートにある数字と文字列をCSVファイルに下記のように出力したいです。

(エクセル) 
      123,鈴木
      1013,田中
(出力) 番号,名前
     0123,鈴木
     1013,田中

自分で作ってみたところ、下記のように文字列になってしまいます。
(出力) ”番号”,”名前”
     ”0123”,”鈴木”
     ”1013”,”田中”

となってしまいます。
どのようにすれば良いのでしょうか。
よろしくお願い致します。

586:579
09/01/20 21:14:18
>>582
うぉー!! ありがとうございます!!!!
2日悩み続けてました。CellsオブジェクトもThisworkbookの子オブジェクトとして認識されて
しまっていたのですね。
でも悩みに悩んでいるといろんなことを考えるから、勉強にはなりますよね。

>>583
もっと違った記述方法があるんですかね?教えてください。

587:デフォルトの名無しさん
09/01/20 21:48:51
>>585
どんなプログラムを作ったの?

588:デフォルトの名無しさん
09/01/20 22:07:54
>>579
まず変数名に日本語を使うところからダメだわ。

589:デフォルトの名無しさん
09/01/20 22:14:47
>>588
それは場合によりけりだな

590:デフォルトの名無しさん
09/01/20 22:21:17
場合というか,使われ方とか規模とか書く人とかによるな
どちらかに決めて使い分けはしない

591:デフォルトの名無しさん
09/01/21 00:29:10
俺も変数名に日本語使うの抵抗あるけど
日本語使うとコードが分りやすくなるような気もするから
使おうかなとも思うけど…
でも抵抗あるんだよなー

592:デフォルトの名無しさん
09/01/21 00:39:52
英語だと既存の関数名、メソッド、プロパティ、その他予約後などと被る時、
ローマ字で書くのは嫌いだから日本語で書いちゃう

593:デフォルトの名無しさん
09/01/21 01:02:53
>>592
確かに!
日本語で書けば被らないな
てことは日本語で書いたほうが合理的だな

594:デフォルトの名無しさん
09/01/21 05:44:10
ActiveXコントロールのテキストボックスをワークシート上で使う場合、
Heightを文字の大きさの2倍以上にしないと、文字が崩れますが
解決法はありますか?

595:デフォルトの名無しさん
09/01/21 07:15:08
日本語は入力が面倒臭いのが難点。

596:デフォルトの名無しさん
09/01/21 20:02:04
Excel2003にて、インターネット上からXMLを取得して利用するツールをつくって
いるところなのですが、文字化けを起こします。

Dim get_xml As Object
Set get_xml = CreateObject("MSXML2.DOMDocument.3.0")
get_xml.async = False
get_xml.Load (src_url)

抜粋するとこのようなコードです。
このときに、 ‖ この文字だけが、半角?に変換されてしまいます。get_xml.Load
した直後で既に?に変わってしまっているのですが、どうすれば解消するでしょうか?
取得するxmlはUTF-8で、IE等のブラウザから見ると正常に‖と見えます。
よろしくおねがいします。

597:デフォルトの名無しさん
09/01/21 20:23:54
>>596
>>1★3,★4

598:デフォルトの名無しさん
09/01/21 22:56:21
>>597

失礼しました。。。

599:デフォルトの名無しさん
09/01/22 17:46:03
日本語の変数名に関しては、漢字のみの送り仮名無し。って条件ならOKにする事が多いなぁ。
送り仮名が入ると面倒だよね。
あとは、変数名一覧表を作っておく事が絶対条件かも・・・。

600:デフォルトの名無しさん
09/01/22 18:10:08
>>599
Option Explicitは必須だね。
なまじわかりやすすぎて、同じ意味の別の熟語に無意識に脳内変換しちゃうことがある。

601:デフォルトの名無しさん
09/01/22 19:03:30
質問です。宜しくお願いします

セルA1には、「8:00」がはいっているとして、

Option Explicit

Sub test1()
UserForm1.TextBox1 = Range("a1").Value
UserForm1.Show
End Sub

これで、テキストボックスに「0.33333333」じゃなく、
きちんと時刻を表示させるにはどうすればよいですか。

602:デフォルトの名無しさん
09/01/22 19:27:06
右辺をRange("A1").TextとかFormat$(range("A1").Value,"h:mm") など。
TextはA列のセル幅が狭いと##とかなるけど。

603:質問です
09/01/22 20:03:19

Sub test()

Cells(1, 1).Activate
Do Until ActiveCell = ""
入力値 = ActiveCell
If 入力値 Like "*[C,CX*,O,OX*,O2,O2X*,Fe]" = True Then
If 入力値 Like "*[O,OX*]" = True Then
If 入力値 Like "*O" = True Then
処理 = 1
ElseIf 入力値 Like "*X2" = True Then
処理 = 2
End If
ElseIf 入力値 Like "*[Fe,Fe*]" = True Then
If 入力値 Like "*Fe" = True Then
処理 = 3
ElseIf 入力値 Like "*X2" = True Then
処理 = 4
End If
Else
If 入力値 Like "*[O2,C]" = True Then
処理 = 5
ElseIf 入力値 Like "*X2" = True Then
処理 = 6
End If
End If

604:質問です
09/01/22 20:04:18
ElseIf 入力値 = "*[Au,AuX*,Ag,AgX*,Pt,PtX*,Au1,Au1X*,Ag1,Ag1X*,Pt1,Pt1X*]" = True Then
If 入力値 Like "*[Au,AuX*,Ag,AgX*,Pt,PtX*]" = True Then
If 入力値 Like "*[Au,Ag,Pt,]" = True Then
処理 = 7
ElseIf 入力値 Like "*X2" = True Then
処理 = 8
End If
ElseIf 入力値 Like "*[Au1,Au1X*,Ag1,Ag1X*,Pt1,Pt1X*]" = True Then
If 入力値 Like "*[Au1,Ag1,Pt1]" = True Then
処理 = 9
ElseIf 入力値 Like "*X2" = True Then
処理 = 10
End If
Else
処理 = 11
End If
Else
処理 = 12
End If
ActiveCell.Offset(0, 1).Activate
ActiveCell = 処理
ActiveCell.Offset(1, -1).Activate
Loop
End Sub

どうも分岐がうまくいかないのですが。

605:質問です
09/01/22 20:05:07
以下、その処理文字列です。
対象に[*]があることで違う分岐を選んでいそうですが、
ほかのものも予想外の分岐をするのですがなぜでしょうか。
(説明が下手ですいません)
J0015-1*2
J0015-2*2
J0235-2PtAuX10
H0053-1PtX2
H0036-2C
H0037-1CX2
J0004-1*2-O
J0004-1*3-O1X2
J0004-1*3-OX2
H0053-1Pt1X2


606:デフォルトの名無しさん
09/01/22 21:16:29
NAMAE = Cells(1, 1)
KUMI = Cells(2, 1)
If NAMAE = "" Then
NAMAE = "*"
End If
If KUMI = "" Then
KUMI = "*"
End If

row1 = 3

Do While Cells(row1, 1).Value = ""
Set aaa = Cells(row1, 2).Find(What:=NAMAE, LookAt:=xlPart)

Set bbb = Cells(row1, 3).Find(What:=KUMI, LookAt:=xlPart)

If Not aaa Is Nothing And Not bbb Is Nothing Then
'条件が合ったときの処理
End If
row1 = row1 + 1
Loop

変数のNAMAEとKUMIを検索項目にして目当ての行を見付けるプログラムを作ってます。
例えばNAMAEに入力があればKUMIがスペースでもNAMAEが一致する行をすべて検索できるようにしたいのですが、
上のようにすると検索対象の一覧の中で名前(row1, 2)が一致しているのに、組(row1, 3)がスペースの行が検索に引っかかりません。
一覧の中で検索対象セルの入力有無に関わらず、検索に引っ掛けるようにするにはどうしたらいいでしょう?
質問がわかりにくいとは思いますがお願いします。

607:606
09/01/22 21:23:56
すいませんまちがえました。

上の
Do While Cells(row1, 1).Value = ""   



Do While Cells(row1, 1).Value <> ""
の間違えでした。

608:デフォルトの名無しさん
09/01/22 22:23:09
読む気になれない・・・。

609:606
09/01/22 23:37:24
すいません。
最善の処置かはわかりませんが、自己解決しました。
スレ汚し失礼しました。

610:デフォルトの名無しさん
09/01/23 00:05:26
特定のEXCELシートが開いている時にはそのシートを閉じ、
開いていなければ何もしないという処理って可能ですか?

611:デフォルトの名無しさん
09/01/23 00:08:50
>>610
ブックじゃなくてシート?

612:デフォルトの名無しさん
09/01/23 00:28:23
>>610
ブックなら可能
やりかたは自分で調べろ

613:610
09/01/23 00:29:16
>>611
間違えました。
シートではなくブックです。
失礼しました。

614:デフォルトの名無しさん
09/01/23 01:04:27
>>613
Workbooks( ).Close

615:610
09/01/23 01:16:51
>>614
それって全部閉じませんか?
ブックAでマクロを起動するとブックAはそのままでブックBを閉じる機能なんですが。
そしてブックBが閉じている状態で起動してもエラーがおきないようにしたいです。

616:603
09/01/23 01:22:49
長かったので問題の箇所まとめました。

If 入力値 Like "*[C,O,O2,Fe]" = True Or 入力値 Like "*[CX,OX,O2X]*" = True Then

この分岐で(入力値)
J0235-2PtAuX10
H0053-1PtX2
を拾ってしまうんですが、何が原因でしょうか。

617:デフォルトの名無しさん
09/01/23 01:25:39
>>615
Workbooks( ブックB ).Close
エラー処理、またはエラー処理をしなくても済むような方法は自力で調べて考えろ
調べても考えてもわからなかったら、そこで始めて人に聞け

618:デフォルトの名無しさん
09/01/23 01:37:15
XP SP3 Excel 2002 SP3

ユーザフォームのShowModalをFalseに設定しています。

ユーザーフォームには、複数のテキストボックス、チェックボックス
コマンドボタンを配置しています。

ユーザフォームとワークシート間を移動した時の
イベントを教えて下さい。

Activate,Deactivateを試しましたが、該当しないようです。

宜しくお願いします。

619:デフォルトの名無しさん
09/01/23 01:47:47
>>616
色々な文字列のうち、どれがLikeの条件にヒットするか試してみたけど、法則が見えない
URLリンク(momoiro.s4.x-beat.com)

620:デフォルトの名無しさん
09/01/23 01:54:13
>>618
該当するイベントは存在しないので、何か別の方法を考えるしかない。
例えばタイマーで一定時間ごとにアクティブなウィンドウを調べるとか、
はっきり言ってかなり面倒な方法しかなかったと思う。

621:618
09/01/23 02:06:26
>>620

有難う御座います。

やはりそうですか。ほかに力技でも考えてみます。

長いこと調べていたんで、これですっきりしました。

622:デフォルトの名無しさん
09/01/23 02:11:43
>>619
そうですね。いろいろ試しているんですが、きびしいです。
Likeにクセあるんだろうと思いながら使えない気がしてます。
入力値をもっと制限する方法も検討しながらもう少し探ってみます。


623:デフォルトの名無しさん
09/01/23 02:17:18
あのさ、偶に勘違いしてる人が居るけど、Like演算子の文字クラスで
[AB,CD,EF]とした場合、AB CD EF のどれかに一致するものではなく
A B , C D E F のどれかに一致するものという意味になる
つまり「 , 」は区切り文字ではなく検索文字のひとつに過ぎない

>>619の記述だと、B1のは「末尾が C , O S F e のどれかで終わるもの」という意味で
C1の記述だと「C X , O 2 のどれかが含まれるもの」という意味になる
その正しい仕様を理解していれば、○の付いてるものは正しく仕様法則に従っていることが解る

AB CD EFのどれかで終わる場合にマッチさせたければ、"*AB"、"*CD"、"*EF"の3条件をOrで重ねるか
Like演算子ではなく正規表現で"(AB|CD|EF)$"とするべきだ

624:デフォルトの名無しさん
09/01/23 02:19:54
>>622
こうなったらRightとInstrで1個ずつ調べるしかないと思う

625:デフォルトの名無しさん
09/01/23 02:25:34
>>619
たとえば、"*[CX,OX,O2X]*"は、
CかXか,かOか2を最低一つ含むという意味では?

626:デフォルトの名無しさん
09/01/23 02:26:37
>>623
なるほど、つまり
"*[C,O,O2,Fe]" → "*[,2CeFO]"
"*[CX,OX,O2X]*" → "*[,2COX]*"
ということか。納得いった。
VBAの解説してる某有名サイトは間違ってんだな

627:デフォルトの名無しさん
09/01/23 02:28:49
>>617
ありがとうございます。
その.closeでエラー回避する方法あるんですね。
調べてみます。

628:デフォルトの名無しさん
09/01/23 02:33:57
>>625
>>626
そうなのですか。
確かにそれなら納得がいきます。
参考にしたサイトを間違えたかも。
ありがとうございます。

長いコードを書くことが確定した。

629:623
09/01/23 02:40:06
>>626,>>628
OfficeTANAKAかな?

まあ解説サイト作ってるからといって全てを熟知してるわけじゃないし
レベルも様々だから仕方ないさ
まあ、あの人レベルはそんなに低くもなく高くもなくだが
もっとレベルの低い人がデタラメばかり書いてる解説サイトもあるから過信は禁物

630:デフォルトの名無しさん
09/01/23 02:51:41
>>615
プログラムってのはひとつの発想に固執せず、
いろんな角度から発想を転換してみるのが上達のコツ
こういう時はエラーが起きないよう注意するより、
エラーを無視すればいいんだよ

on error resume next
workbooks("B.xls").close
on error goto 0

631:デフォルトの名無しさん
09/01/23 04:24:46
出来るなら
一度保存して閉じるけど


632:デフォルトの名無しさん
09/01/23 04:26:53
そういうことじゃなくて、そもそも目的のブックが開いてない可能性があるのよ。

633:デフォルトの名無しさん
09/01/23 04:46:04
もし
開いていたら
閉じる


634:デフォルトの名無しさん
09/01/23 09:08:26
>>602
ありがとうございます

635:デフォルトの名無しさん
09/01/24 21:32:21
A1とA2セルの書式設定の表示形式をyy.mm.ddにして
A1セルに文字列で「09.08.07」と入力して

a = Cells(1, 1)
Cells(2, 1) = Mid(a, 1, 2) & "/" & Mid(a, 4, 2) & "/" & Mid(a, 7, 2)

上のような処理を実行すると何故かA2セルに「07.09.08」と順番が入れ替わって表記されてしまいます。
何故なんでしょう?
EXCELは2000です。

636:デフォルトの名無しさん
09/01/24 21:32:44
>>610
開いている全てのワークブックの名前をDoで回し取得、
該当ブックが有れば.close

637:デフォルトの名無しさん
09/01/24 21:39:01
>>635
年/月/日が月/日/年になってしまう時は、コントロールパネルかツール/オプションで地域の設定を見直す

638:デフォルトの名無しさん
09/01/24 21:43:34
>>636
全ブック回すならFor Eachの方がコードがシンプルになるけど負荷が大きくなる。
エラーを無視するのは行儀は悪いが一番処理は速い。
エラー処理をきちんと書く、例えばエラーメッセージを出すとか実行結果をエラーコードとして返すのが王道だけど
片手間で作る小規模なコードでは大げさすぎる。

どの方法を使うかはケースバイケースだ。

639:デフォルトの名無しさん
09/01/24 21:58:53
>>637
地域と言語のオプションやEXCELのツール→オプションを見ましたが不自然な場所は内容に見えるのですが。
もう少し詳しくお願いします。


640:デフォルトの名無しさん
09/01/24 22:06:36
>>639
ExcelじゃなくてWindowsのコントロールパネルの地域と言語のオプションだよ。
どこかのセルに「9/8/7」ってキーボードから入れたらどうなる?
「2009/8/7」になるか「9/8/2007」になるか。


641:630
09/01/24 22:09:05
>>638
>エラーを無視するのは行儀は悪い
エラー処理って大そうに考えてる人多いみたいだけど、
俺はエラー処理ってのはプログラムの効率化を図る手段だと思ってる

実際にErrorステートメントなんか存在しなくても、
厳密なプログラムを書けば99.9%(経験上100%)同じことはできる

Errorステートメントってのは、あらゆる場面を想定した厳密なプログラムを
書かなくてもいいように効率化(手抜き)をするためのモンじゃないの?

642:635
09/01/24 22:15:04
>>640
639の地域と言語のオプションというのはもちろんコントロールパネル内のやつの一項目です。
変なところは無いみたいですし、そもそも購入してからいじった覚えもありません。

現状どのEXCELシートでも9/8/7と入力すると2009/8/7に置き換わって問題ないようにみえます。


643:デフォルトの名無しさん
09/01/24 22:19:03
>>642
A1セルに09.08.07じゃなくて、9/8/7っていれてみ

644:デフォルトの名無しさん
09/01/24 22:22:37
確認するんならA2セルに9/8/7と入れてみるべきじゃないかな
書式の問題かもしれないし

645:デフォルトの名無しさん
09/01/24 23:11:33
>>643>>644
A1A2セル共に9/8/7と入れれば09.08.07に自動で置き換わりますので書式には問題は無い様に思えます。
ちなみにA1セルに9/8/7と入力して635の処理を走らせると2009/8/7が20/9//8/に置き換わるだけでした。

それとMid関数を利用してピリオドをスラッシュに置き換えても結果は同じ07.09.08でした。

この処理の目的としては日付欄なのに入力の際にピリオドを直接入力している間違った記述を一括で直したいというのがあるのですが
どうしてこんな順番入れ替わりがおこるのかが本気で謎です。


646:デフォルトの名無しさん
09/01/24 23:48:18
>>645
DateSerialをかますんだ!

Dim s As String
If TypeName(Range("A1").Value) = "String" Then
  s = Range("A1").Value
  Range("A1").Value = DateSerial(Left(s, 2), Mid(s, 4, 2), Right(s, 2))
End If

647:635
09/01/25 07:49:29
>>646
確認しましたが、それで大丈夫みたいですね。
ありがとうございました。

648:デフォルトの名無しさん
09/01/25 17:56:18
Open ファイル名 For 開き方 As #ファイル番号

というコマンドの「#」の意味を調べてみたんですが
言及されてなくてわかりません。
この#にはどんな意味があるのでしょうか?

649:デフォルトの名無しさん
09/01/25 18:08:33
あるブックをアクティブにすると同時にマクロを走らせることって可能ですか?

650:デフォルトの名無しさん
09/01/25 18:25:52
>>648
「#」は「ナンバーサイン」とも言う。そして、例えば「2番目のvoid」を「void#2」とも書く。
その意味を込めてMS-BASICで採用された仕様だ。

651:デフォルトの名無しさん
09/01/25 18:55:24
>>649
Workbook_WindowActivate

652:デフォルトの名無しさん
09/01/25 19:04:08
>>650
ほえー!ずぅっとシャープだとばかり思ってました。
番号を表す「ナンバーサイン」という記号だったんですね。
勉強になりました。ありがとうございます。

>>649
そのブックに、Auto_Open()のモジュール名で記述されたプログラムは
ブックを開くと同時に実行されます。

653:デフォルトの名無しさん
09/01/25 19:08:00
開くときではなくアクティブにしたときでしょ?

654:652
09/01/25 19:12:30
確かに。読み間違えました。
どうもすみません。

655:デフォルトの名無しさん
09/01/25 19:40:49
>>651
ありがとうございます。

もう一つ質問です。

非アクティブ状態のシートのアクティブセルの参照はどうすればいいでしょうか?
現在ブックBがアクティブ状態で

Cells(1, 1) = Workbooks("A.xls").Worksheets(1).ActiveCell.Offset(0, 1)

のような処理はオブジェクトはプロパティ・メソッドをサポートしてないと言われました。
ブックAをアクティブにしたくないのですけど、やはりブックAをアクティブにしてからでないと無理ですかね?

656:デフォルトの名無しさん
09/01/25 20:29:26
そもそも、ちょっと考えてみれば当然のことだが
アクティブじゃないシートにはアクティブなセルなど存在しない

それにActiveCellはWorksheetオブジェクトのメンバではなくExcelオブジェクトのメンバなので
上位オブジェクトを指定するならExcel.ActiveCellのようになり、Excel以外は指定できない

つまり、「(A):非アクティブなシートのアクティブセル」って概念自体が間違いであり
君がやりたいことは「(B):非アクティブなシートが最後にアクティブだったときにアクティブだったセルの取得」
と表現するのが正しい

というわけで、存在しないもの(A)は取得できないので、(B)を取得するには
任意のシートにアクティブセルが存在するようにしてやる(任意のシートをアクティブにする)か、
アクティブセルの移動を監視記録するのどちらかだな
表示を止めてアクティブにしたのが見えないようにも出来るが、それでも前者が嫌なら後者しかない

657:デフォルトの名無しさん
09/01/25 21:02:48
うぜーよ

658:デフォルトの名無しさん
09/01/25 22:30:01
べつにうざくはないが、よくそこまで親切にレスできるのかと関心する
職場で部下に教えるならまだしも、2ちゃんで赤の他人に教えるだけで

659:デフォルトの名無しさん
09/01/25 23:23:32
EXCEL97です
ActiveSheet.PageSetup.LeftHeader = "&18 1月12日 &A"
このなかの1月12日の部分をnow()+2かstring型の変数を使いたいのですが方法はありますか

660:デフォルトの名無しさん
09/01/25 23:36:15
ActiveSheet.PageSetup.LeftHeader = "&18 " & Format(Now() + 2, "m月dd日") & " &A"

661:デフォルトの名無しさん
09/01/25 23:51:02
>>656
丁寧にありがとうございます。

>アクティブじゃないシートにはアクティブなセルなど存在しない
これが確認できれば出来れば十分です。


662:デフォルトの名無しさん
09/01/26 16:18:41
ActiveとSelectを混同してると見た
俺がちょっと前までそうだったから

663:デフォルトの名無しさん
09/01/26 19:12:35
質問です。
データをシステムから取り込んだエクセルファイルなんですが、
セル内の数値の先頭に半角スペースがついてしまいます。
たぶんこれが原因で、数値の大小がおかしくなります。

例えば

変数=20.222
if 変数>10.333 then

これで =falseとなるんですが何か対処法はないでしょうか。
セルをダブルクリックしてEnterで先頭のスペースは消えて数字扱いとなります。
セルの書式は未選択状態です。
ファイルがで手元にないので詳しいことはすいません。


664:デフォルトの名無しさん
09/01/26 19:51:29
>>663
変数="20.222 "
if value(trim(変数)) > 10.333 then

665:664
09/01/26 19:58:01
すまん、ワークシート関数と勘違いしました。
val(trim(変数))

666:デフォルトの名無しさん
09/01/26 20:58:54
>>663
元のデータは変えちゃいけなくて、VBAでなんとかするなら上のレスのとおり。
修正してもいいんならシート全体を選択してコピー→そのまま貼り付けして、
黄色いびっくりマークをクリックして「数値に変換」

667:デフォルトの名無しさん
09/01/26 20:58:56
質問よろしいでしょうか。
乱数を生成させて、結果によって単純な算術演算を行うプログラムで統計を取っています。
会社のPCで結果が出るまでに2時間はざらなのですが、

会社のCPUがpen4 3Ghz
自宅のCPUがcore i7 940 2.93Ghz

単純なプログラムなので、劇的にはかわらないまでもすこしは早くなるかと思ったんですが、
逆に遅くなりました。
8コア中 1コアしか使用率があがらなかったので、単純にクロック数の問題だと思うのですが、
VBAで8コアフルに稼動させるようなソースは書けるんでしょうか?

しかし、前の乱数値の結果が次に影響するような演算なので、
追い越してなにかを処理しておくというのは意味なさそうです。

668:デフォルトの名無しさん
09/01/26 21:00:29
>>663
csvでも取り込んでいるのかな? csvファイルの仕様がおかしいんで内科医?

669:デフォルトの名無しさん
09/01/26 21:04:13
>>667
そりゃ無理だ。VBAが今後マルチスレッド化されたとしても、単純なプログラムでは1コアしか使いようがない。
まさかとは思うが、シートの更新を止めてないとか言わないよな。

670:667
09/01/26 21:10:32
>>669
ですよね;-;
シートの更新は止めています。
シートへのアクセスも極力抑えて、演算に必要な数値はすべて配列で確保しています。
実行時間は単純に量の問題です、10億試行とかそういう回数なので…

671:デフォルトの名無しさん
09/01/26 21:11:18
URLリンク(www.nicovideo.jp)

672:デフォルトの名無しさん
09/01/26 21:14:15
>>668
単純なcsvの読み込みなら、たとえ "  123   " みたいにダブルクォートで囲ってあっても
強制的に数値化されてしまうので逆に困るくらい。

673:デフォルトの名無しさん
09/01/26 21:17:18
>>670
そんなに回数が多いならVBAじゃなくてもっと演算向きの言語にしなよ。
必要ならそいつをVBAで起動すればいいんだし。

674:デフォルトの名無しさん
09/01/26 21:18:21
664-666
ありがとうございます。
明日試してみます。


675:デフォルトの名無しさん
09/01/26 21:23:52
>>670
10億回程度のループならそんなに多いとは思わんけどな。

無駄に時間のかかるプログラムって、アルゴリズムやコーディングに問題があることが多いけど、
誰か詳しい人には相談した?
それから基本的なこととしては、Variant型の変数は使ってないよな?

あとは乱数の発生を別のプロセスにやらせてファイルにどんどん書き出していくとか、
そもそも数値計算にVBAを使うこと自体が疑問なので、全体をコンパイラで書き直すとか。

676:デフォルトの名無しさん
09/01/26 21:26:21
675の言うことには耳を貸さないのが吉

677:667
09/01/26 21:43:17
いろいろアドバイスありがとうございます。
すいません統計などと洒落たことを言ってしまいましたが、
プログラム自体はパチスロ機のシミュレータです。
自分ひとりでつかうならいいんですが、
プログラム知識0の人へのインターフェイスや出力、視覚化も兼ねているので…。
そして残念なことに、このシミュレータの作成は片手間でやらないといけないので、
うまいこと作り直す時間も知識もありません…。
同じ課でたまたまプログラムの知識があった私が任されています…
ので同じ課にはわかる人はいません…。
もちろん実機担当に質問はできますが、手一杯だとは思います…。

アルゴリズムはやりようがあると思いますがなるべく実機に近くなるようにしています。
実機はもちろん人の操作によって一連の流れになるので、
アルゴリズムも単純な上から下です。

実行時間は現状でそれなりに満足しています。
10億試行は最終的段階なので、普段は5分とかそういうレベルです。

ただ、環境(CPU)による違いがなかったので質問した次第です。
気遣いありがとうございました。

678:デフォルトの名無しさん
09/01/26 22:31:23
会社のCPUがpen4 3Ghz
自宅のCPUがcore i7 940 2.93Ghz
で逆に遅くなるってのは悲しいな
結局クロックが全てか
てか
実機担当って職業プログラマーが居る、その会社は何だろう
気になる


679:デフォルトの名無しさん
09/01/26 22:41:48
パチンコ機屋じゃないの?

680:デフォルトの名無しさん
09/01/26 23:30:39
>>678
うちは北森コアのPen4 3.4CGHzとi7 965(3.2GHz)を使ってるが
1スレッド処理でもi7の方が速いぞ

そもそもCPIもバス帯域もメモリコントロールも拡張命令も勝っているi7が
0.07GHz程度の実周波数の差程度でPen4に負けるのはおかしい
会社のPCがベースクロック3GHzの石を使ってOCしてるとかじゃなければ
君が自宅で使ってるi7のPCは、構成に問題有りで何処かに極端なボトルネックが
発生していると思われる

681:デフォルトの名無しさん
09/01/26 23:32:56
質問です。

EXCELシートにハイパーリンク貼って、そのシートをブラウザでプレビューすると
ブラウザにもハイパーリンクが表示されるけど
そのブラウザ上のリンクをクリックした時に
Private Sub Workbook_SheetFollowHyperlink
を起動することってやっぱ無理かな?

682:デフォルトの名無しさん
09/01/26 23:38:43
>>680
自宅PCは省電力でクロックダウンしているんじゃないか?

683:デフォルトの名無しさん
09/01/26 23:59:12
>>681
自分でHTMLとVBScript or JavaScriptでそういうコードを書けばできなくもないだろう。
つまり、VBAでは無理だ。

684:デフォルトの名無しさん
09/01/27 00:37:43
何かにCPUパワーを喰われてるとか
「遅くなった」のが実は0.01秒程度の差だったとか
もし自作ならドライバがちゃんと入ってないとか

685:デフォルトの名無しさん
09/01/27 04:47:10
CommandButtonでClickイベントが呼ばれたときに、そのボタンのキャプションを取得したいのですが、
よい方法はありませんでしょうか?

ネットのフォーラムなどの情報では、
 ActiveSheet.Buttons(Application.Caller)

 ActiveSheet.DrawingObjects(Application.Caller)
などでオブジェクトを取得できるとあるのですが、
プロパティがない、などと言われます。
代替手段はないものでしょうか?

環境:Excel2007



686:685
09/01/27 04:54:33
すいません。そもそも _ClickイベントやMouseDownなどではApplication.Callerは使えないですね。
どうしたらよいのだろうか

687:デフォルトの名無しさん
09/01/27 05:11:01
>>686
押したボタンのクリックイベントに適当に書くのが普通じゃない?




688:デフォルトの名無しさん
09/01/27 05:23:04
>>685
コマンドボタンには2種類あるでしょ。
挿入を選ぶとコントロール(部品)の一覧が出てきて
上段が「フォーム コントロール」、下段が「ActiveX コントロール」ってなってるやつ。
下段の方のボタン使ってる?

689:デフォルトの名無しさん
09/01/27 05:38:13
>>685
「マクロの登録」で登録されたマクロはコマンドボタンのクリックで呼び出される
Sub test()
  MsgBox ActiveSheet.Buttons(Application.Caller).Caption
End Sub

690:デフォルトの名無しさん
09/01/27 05:43:14
>>688
マクロが登録できるのはフォームコントロールの方だぞ

691:デフォルトの名無しさん
09/01/27 06:11:34
>>686
そもそもCommandbutton1のClickイベントで呼ばれるのはCommandbutton1_clickなんだから、
Private sub commandbutton1_click
  Msgbox commadbutton1.caption
End sub
で、いいんじゃねーの?
クラスモジュール使って擬似コントロール配列にしてるとしても、どうにでもなんじゃん
アホなの?

692:デフォルトの名無しさん
09/01/27 07:45:56
>>690
両方出来るぞ

693:685
09/01/27 10:53:06
教えて! Watch Excel VBA Application.caller エラー2023について
URLリンク(oshiete1.watch.impress.co.jp)

ここの方法でいけましたが、もう少しスマートな方法がないかな?と。

>>687 >>691
10個あったら、10個分イベントと名前の組をかかないといけないですよね。
冗長性があります。

>>689
ActiveXの方では無理っぽいです・・・

>>688
ActiveXの方を使っています。
やりたいことはボタンのキャプションを取得することなので、
できるのであればフォームコントロールの方でもよいのですが・・・

694:685
09/01/27 10:57:08
URL間違えました。こちらでした。

moug|即効テクニック | コマンドボタンのクリックイベント内でボタン名を取得するには
URLリンク(www.moug.net)


695:デフォルトの名無しさん
09/01/27 16:07:22
シート保護はprotectで非保護はunprotectでいいですか?出先なので簡単な質問ですが。

696:デフォルトの名無しさん
09/01/27 16:13:46
>>695
いんじゃね

697:デフォルトの名無しさん
09/01/27 16:19:40
ありが十匹!!

698:デフォルトの名無しさん
09/01/27 20:14:57
>>693
一つのプロシージャに1行ずつ書き足すのが冗長性があると言ってるってことは、
擬似コントロール配列を使ってクラスモジュールで処理してるとしか考えられない訳だから、
取りあえず今使ってるソース出せ
そしたら改良してやるから

699:デフォルトの名無しさん
09/01/29 09:07:22
すみません初心者ですが質問です。
Msgboxに「月度を入力してください」と表示
→インプットboxに月(1~12までの数字)を入力する画面を出して尚且つ、
1~12以外の数字または文字を入力したら、「1~12の数字を入力してください」
というエラーメッセージが出る→最後にまたMsgboxが出てきて「○月度ですね」と
表示するにはどう組めばいいでしょうか。
○には入力した月数を出したいのですがよろしくお願い致します。

700:デフォルトの名無しさん
09/01/29 09:08:34
>>699
VB初心者スレへどうぞ。

701:デフォルトの名無しさん
09/01/29 11:00:04
>700
すみません、VBAの初心者スレは探しましたが無いみたいです。
どなたかお願い致します。

702:デフォルトの名無しさん
09/01/29 12:15:27
>>699
流れは大体できてるように見えるのだが・・・
「インプットboxに入れられたものを数値にして1~12だったら抜ける」ってことを
Do~Loopを使って組めばいいだけ

703:デフォルトの名無しさん
09/01/29 14:29:53
超初心者です。

何個か開いたファイルの中から、特定のファイルを探す。
という単純な事がしたいのですが
ファイル名が例えば「経理ファイル200812.xls」のように、
月によってYYYYMMの部分が変わってしまいます。
開いたファイルの中から、ファイル名に「経理ファイル」が付いているファイルをアクティブにしたい場合
どのようにすればよいでしょうか。
ワイルドカードが使えないかと思ってやってみているのですが
よろしくお願いします。


704:デフォルトの名無しさん
09/01/29 15:01:32
dim b as workbook
for each b in workbooks
if b.name like "経理ファイル*" then
b.activate
end if
next

705:デフォルトの名無しさん
09/01/29 15:53:30
>>704

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

706:デフォルトの名無しさん
09/01/29 18:39:44
質問です
h = 1
Do Until Cells(h, 6).Value = ""
If Cells(h, 3).Value = Cells(h + 1, 3) Then
Cells(h, 6).Value = Cells(h, 6).Value + Cells(h + 1, 6).Value
Rows(h + 1).Delete
End If
h = h + 1
Loop
2行のときは1行にできるのですが、3行以上のときも1行にしたい場合どのようにすればよいでしょうか

707:デフォルトの名無しさん
09/01/29 18:57:21
>>706
最初に見つけた位置のhを保存しといてそこに入れていく

708:707
09/01/29 19:00:08
違ったな
「Deleteしたときはhをインクリメントしない」かな?

709:デフォルトの名無しさん
09/01/29 19:45:32
End Ifの前にh = h - 1で解決しました
ありがとうございます

710:デフォルトの名無しさん
09/01/29 23:41:33
>>701
頭だけでなく眼が悪いんでしょうか。
VBA ( V B A ) のスレではなく、VB ( V B ) のスレへどうぞ。

711:デフォルトの名無しさん
09/01/29 23:59:42
OS XP
EXCEL2003

dteProductDay=format(date,゙yyyy/m/d゙)
cells(1,1)=dteProductDay
というように、システムの日付を整形してセルに表示させたいのですが、
フォーマット通りに表示されず1/29/2009となります。何が悪いのでしょうか。

712:デフォルトの名無しさん
09/01/30 00:09:19
>>711
書式を変えるか、または文字列で

713:デフォルトの名無しさん
09/01/30 02:12:09
>>711
的外れかも知れないが
表示するセル自体の書式を適切に設定しないとそうなる。
そのフォーマットだと、変数に代入された値は2009/1/29となるので
エクセルはこれを日付と認識し内部的に日付のシリアル値として値を保持するのでは。

たとえばdteProductDay=format(date,゙yyyy m d゙)
とするとセルには「2009 1 29」と表示される。


714:デフォルトの名無しさん
09/01/30 12:23:35
OS-XP
Office2003

Shiftキーを押しながらドラッグでセルの移動ができますが、
Shiftキーを押さなくても常にセルを移動することはできますか。

もしくはExcel上でのみ、Windowsの固定キー機能のように
Shiftキーを押しっぱなしにすることはできないでしょうか。

キーボードでなら、たとえば上に移動したい場合
ActiveCellを取得して、真上のセルと置換していけばできそうなんですが。

715:711
09/01/30 20:50:12
>>712-713
ありがとん

cells(1,1)= "'" & dteProductDayでうまくいきました。


716:7777
09/01/30 22:31:30
エクセルでシート1で例えばF団体をA列の1で書いてそれを
シート3のD列の3に自動記入させるマクロは分かるんだけど

シート1でF団体がA列の1以外になっても自動記入できるマクロある?
あるなら教えて

717:デフォルトの名無しさん
09/01/30 23:07:32
日本語で質問できない人お断り

718:デフォルトの名無しさん
09/01/30 23:08:56
>>716
Private Sub Worksheet_Change(ByVal Target As Range)
                        ~~~~~~~
どこに書き込まれたかはTargetという変数に入ってる

719:7777
09/01/30 23:13:26
718さん
意味がわかりません


720:デフォルトの名無しさん
09/01/30 23:18:17
日本語読めない人お断り

721:デフォルトの名無しさん
09/01/30 23:31:13
Worksheets("シート3").Range("D3") = Worksheets("シート1").Range("A1")
みたいにセル名が固定ならわかるけど、コピー元のセルが不定の場合はどうするかって質問でしょ?

722:デフォルトの名無しさん
09/01/30 23:53:13
F団体ってなんだろ…新しい宗教か?

723:7777
09/01/31 08:51:59
>>721
うん!!そのとおりです

724:デフォルトの名無しさん
09/01/31 09:19:07
>>723
A1とA2の両方に値がある場合はどちらを採用するの?

725:7777
09/01/31 09:52:09
>>724
1月23日 団体名  内容
       F団体
       

このときF団体がAの2列に書いてるけど
Aの2列にD団体を記入して
Aが3列になってもシート3のまとめシートには自動記入できるかなぁって

726:デフォルトの名無しさん
09/01/31 10:06:03
>>725
1対1対応ならなんの問題もないでしょう?

それから行と列を区別して書いてたほうが他人に伝わりやすいですよ。
ABCは列
123は行


727:7777
09/01/31 10:42:31
A列からD列の10行までの範囲がコピー範囲のときは
どうマクロ組むの?


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