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

Excel VBA 質問スレ Part23

レス数が1000を超えています。これ以上書き込みはできません。
0001既定のプロパティさん2012/01/29(日) 00:05:13.16
01 http://pc11.2ch.net/test/read.cgi/tech/1054356121/
02 http://pc11.2ch.net/test/read.cgi/tech/1168308855/
03 http://pc11.2ch.net/test/read.cgi/tech/1180192018/
04 http://pc11.2ch.net/test/read.cgi/tech/1189814602/
05 http://pc11.2ch.net/test/read.cgi/tech/1197448064/
06 http://pc11.2ch.net/test/read.cgi/tech/1205231499/
07 http://pc11.2ch.net/test/read.cgi/tech/1212587819/
08 http://pc11.2ch.net/test/read.cgi/tech/1219673793/
09 http://pc11.2ch.net/test/read.cgi/tech/1228372971/
10 http://pc12.2ch.net/test/read.cgi/tech/1235332603/
11 http://pc12.2ch.net/test/read.cgi/tech/1241885130/
12 http://pc12.2ch.net/test/read.cgi/tech/1247566074/
13 http://pc12.2ch.net/test/read.cgi/tech/1254281104/
14 http://pc12.2ch.net/test/read.cgi/tech/1262748898/
15 http://pc12.2ch.net/test/read.cgi/tech/1271261239/
16 http://hibari.2ch.net/test/read.cgi/tech/1280045912/
17 http://hibari.2ch.net/test/read.cgi/tech/1289182437/
18 http://hibari.2ch.net/test/read.cgi/tech/1298240666/
19 http://hibari.2ch.net/test/read.cgi/tech/1305754555/
20 http://hibari.2ch.net/test/read.cgi/tech/1312435844/
21 http://hibari.2ch.net/test/read.cgi/tech/1316931607/

前スレ:
Excel VBA 質問スレ Part22
http://toro.2ch.net/test/read.cgi/tech/1322400978/
0002既定のプロパティさん2012/01/29(日) 00:06:07.26
ExcelのVBAに関する質問スレです

★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。

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

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

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

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

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

★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)
0003デフォルトの名無しさん2012/01/29(日) 11:38:40.69
>>1 乙
0004デフォルトの名無しさん2012/01/29(日) 12:22:48.13
>>1乙

それにしても前スレ最後の方ときたら次スレ案内どころか、くだらない喧嘩でスレを埋め尽くすんだから、
やっぱVBAは厨房言語と言われても仕方が無いほどの民度の低さを実感する
0005デフォルトの名無しさん2012/01/29(日) 12:44:37.54
なんで終わった話蒸し返すかなぁ。
そんなに悔しかったのか?
0006デフォルトの名無しさん2012/01/29(日) 12:48:28.90
>>1乙

>>4
何で蒸し返すかなぁ・・・
そういうのが呼び水になるんだって気付けよ
0007デフォルトの名無しさん2012/01/29(日) 14:34:17.40
>>6
お前も同罪
0008デフォルトの名無しさん2012/01/29(日) 15:20:07.91
>>7
それはむしろ>>5だろ
0009デフォルトの名無しさん2012/01/29(日) 16:12:08.40
ID付けない辺りが民度の低さだろ
0010デフォルトの名無しさん2012/01/29(日) 19:23:14.35
vba初心者です。
フォームに名前、番号、部署を入力して、登録ボタンをクリック。
A2に値が入っていない場合はその列に項目を追加。
もし入っているならば、次の行へ移動してもう一度条件分岐開始。
というプログラムをつくろうと思ったのですがうまくいきません。
どこがおかしいのでしょうか。初歩的な内容ですがヒントください。



Private Sub 登録_Click()
If TextBox1 = "" Then
MsgBox ("名前が記入されてない")
ElseIf TextBox2 = "" Then
MsgBox ("番号が記入されてない")
ElseIf TextBox3 = "" Then
MsgBox ("部署が記入されてない")
Else

Cells(2, 1).Select

Do While ActiveCell Like ""
ActiveCell.Offset(1, 0).Select
Loop

ActiveCell = TextBox1.Value
ActiveCell.Offset(0, 1) = TextBox2.Value
ActiveCell.Offset(0, 2) = TextBox3.Value

Me.Hide
End If

0011デフォルトの名無しさん2012/01/29(日) 19:54:35.81
>>8
>>5
0012デフォルトの名無しさん2012/01/29(日) 19:54:59.15
>>10

> Do While ActiveCell Like ""
ここ
「もし入っているならば」になってない
0013デフォルトの名無しさん2012/01/29(日) 19:56:31.43
>>10
いろいろ突っ込み所満載だが
とりあえずWhileをUntilにすれば問題は解決すると思う
0014デフォルトの名無しさん2012/01/29(日) 19:59:04.90
>>11
>>5
0015デフォルトの名無しさん2012/01/29(日) 20:03:30.24
相当悔しかったらしい。(w
0016デフォルトの名無しさん2012/01/29(日) 20:06:22.65
>>12
>>13
わかりました!
ありがとうです!
0017デフォルトの名無しさん2012/01/29(日) 20:09:04.16
>>4-8、>>11、>>14-15
ほんともういい加減にしてくれない?
大概うざいんですけど。
0018デフォルトの名無しさん2012/01/29(日) 20:15:05.89
俺は
Do While 〜、Do Until 〜、Loop While 〜、Loop Until 〜
は一切使わない

必ず
Do
  If 〜 Then Exit Do
Loop
を使う

While & Untilで出来ることは全て出来る
While & Untilには出来ないことも出来る
わかりやすい
修正しやすい
条件内容によっては速い

良いことずくめ
0019デフォルトの名無しさん2012/01/29(日) 20:19:48.99
いきなりなんだ
好きにしたらええがな
0020デフォルトの名無しさん2012/01/29(日) 20:22:43.73
>条件内容によっては速い

これ詳しく教えてください。
どういうときに速くできるのですか?
0021デフォルトの名無しさん2012/01/29(日) 20:22:54.82
いきなりじゃないじゃん。
つい数レス前の質問で間違いがあった部分の話題じゃん。

もしかして前スレからの下劣なケンカにご執心で
それ以外の質問回答とか目に入ってないのか?
0022デフォルトの名無しさん2012/01/29(日) 20:27:46.68
>>21
いや、質問の内容と一切関係ない話だろ
コーディングスタイルの話なんか不毛だし荒れるだけ
0023202012/01/29(日) 20:34:33.04
>>22

すいません、>>18さんのレスはVBA初心者としては関心ある話題なのですが・・・
0024デフォルトの名無しさん2012/01/29(日) 20:50:18.21
>>18
同じく初心者としては興味ある
DOとLOOPの2つと
それにwhileかuntilのどちらかの3つがセットなのかと思ったんだけど違うのか
0025デフォルトの名無しさん2012/01/29(日) 20:57:42.84
相変わらずスレチの話題で伸びてるな
0026202012/01/29(日) 21:03:22.50
>>24さん
Do Loop だけで成立しますよ。
ただ、そのままだと無限ループなので何らかの脱出条件は必要ですから
通常はおっしゃるとおりにUntilやWhileを組み合わせる訳ですよね。
で、>>18さんはIf文で脱出条件を設定することを推奨されていて、
私はその手法自体は知ってたのですが、
そのほうが速くなる状況というのが分からないのでぜひ知りたいと思いました。
0027デフォルトの名無しさん2012/01/29(日) 21:13:22.59
無理やりWhile/Untilの条件をでっち上げる位なら、
Exit Doするコードを書くほうが良い、ってことじゃね?
機械的に適用するのは頭が固すぎると思うが。
0028デフォルトの名無しさん2012/01/29(日) 21:19:41.12
>>10のコードを
DO ifで書きなおして無事動きました。
確かにこっちのほうがわかりやすい気がします!
ありがとうです!
0029デフォルトの名無しさん2012/01/29(日) 21:24:42.27
俺もDo Until の中に必ず If Then Exit Do End Ifを付けてる
For Next なら Exit For だな

明示しておけば(自分にとって)判りやすいという理由だけど
0030202012/01/29(日) 21:26:33.22
>>27
それって速度は変わらなくないですか?
自分でちょっと考えたのは脱出条件でAndを使うときに
UntilやWhileだとAndしかだめだけどIf文だとIfのネストで書けるから
(本当にほんのちょっとだけ)速く出来るかも、ということです。
0031202012/01/29(日) 21:32:26.12
        ゴガギーン
             ドッカン
         m    ドッカン
  =====) ))         ☆
      ∧_∧ | |         /          / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
     (   )| |_____    ∧_∧   <  おらっ!出てこい>>18
     「 ⌒ ̄ |   |    ||   (´Д` )    \___________
     |   /  ̄   |    |/    「    \
     |   | |    |    ||    ||   /\\
     |    | |    |    |  へ//|  |  | |
     |    | |    ロ|ロ   |/,へ \|  |  | |
     | ∧ | |    |    |/  \  / ( )
     | | | |〈    |    |     | |
     / / / / |  /  |    〈|     | |
    / /  / / |    |    ||      | |
   / / / / =-----=--------     | |
003220 ◆dMgj9t5wQ2 2012/01/29(日) 21:46:15.53
>>31
成りすましは勘弁してください
私は31じゃないです。
0033デフォルトの名無しさん2012/01/29(日) 22:09:06.08
>>29
>明示しておけば(自分にとって)判りやすいという理由だけど

意味がわからん。

Do While 〜 Loop も Do ... Loop Until 〜 も、「〜」で充分明示的だと思うが。

まあ、ループ中で読み込みとかの処理をして、EOF ならぬけて、そうでなければ
読み込んだデータの処理をして最初に戻ると言うような処理は、それなりにあるから
Do: ... : If 〜 Then Exit Do: ... : Loop も使うけど、それに限定するのは >>27 の
言うようにちょっと頭固すぎと思う。
0034デフォルトの名無しさん2012/01/29(日) 22:49:12.41
冗長に書いた方がわかりやすいと感じる人は結構いるっぽいね。
でも>>29は同じ条件判断を2箇所に書く(2回やる)ってことでしょ? それはないわー。
0035デフォルトの名無しさん2012/01/29(日) 23:20:23.79
>>10
ActiveSheet.ShowDataForm
マジオススメ
0036デフォルトの名無しさん2012/01/29(日) 23:57:52.46
>>34
>でも>>29は同じ条件判断を2箇所に書く(2回やる)ってことでしょ? それはないわー。

さすがにそれはないと思うが...、修正面倒だし、
そもそも他人が見たときヘタすると意図汲み取れないと思う。
0037デフォルトの名無しさん2012/01/30(月) 00:27:10.99
>>35
使ってみたのですが、よく意味がわかりません。
起動時にフォーム呼び出しっぽいのですが、何もおこらないのですが
どういう効果があるのですか?
0038デフォルトの名無しさん2012/01/30(月) 06:53:15.42
>>37
聞く前にググれ
0039デフォルトの名無しさん2012/01/31(火) 03:33:06.65
Test
0040デフォルトの名無しさん2012/01/31(火) 22:37:41.24
2003/2007で質問です。
.OnAction で文字列を使うときにはどうすれば良いのでしょうか?
例えば、キー "foo" を持つ "dic" というディクショナリを引数とする関数を
.OnAction に指定したい場合、

Sub Menu()
 Dim CB
 Set CB = Application.CommandBars("Cell").Controls.Add()
 With CB
  .Caption = "テスト"
  .OnAction = "'testfunc dic(""foo"")'"
 End With
End Sub

のようにしてもうまく動きません。

仕方が無いので、

  val = dic("foo")
  .OnAction = "'testfunc " & val & "'"

のように対処しています。

よろしくお願いします。
0041デフォルトの名無しさん2012/02/01(水) 07:37:32.24
OnActionの実行されるスコープでは、
dicが見えていないって事なんじゃないか?
0042デフォルトの名無しさん2012/02/01(水) 07:58:29.15
OnActionに指定するのはマクロ名
式は評価しないんだろ
0043デフォルトの名無しさん2012/02/01(水) 22:04:08.03
OnActionは罠が多いよな…
0044デフォルトの名無しさん2012/02/01(水) 22:12:34.88
>>40
>  val = dic("foo")
>  .OnAction = "'testfunc " & val & "'"
これで対処できるって事は
.OnAction = "'testfunc " & dic("foo") & "'"
で済む話のような気もするが…まさかな
0045デフォルトの名無しさん2012/02/01(水) 22:22:00.23
&を使わずに書きたい、ってことじゃない?
0046デフォルトの名無しさん2012/02/01(水) 22:22:58.83
>>42
評価されるよ
0047デフォルトの名無しさん2012/02/02(木) 03:05:03.67
式を評価した結果の文字列をOnActionに設定してるだけで、
OnActionに式が設定されて評価されてるわけではないと思うが
0048デフォルトの名無しさん2012/02/02(木) 06:49:11.59
バカ多すぎw
このレベルのことで意見割れるとかあり得ねぇw
0049デフォルトの名無しさん2012/02/02(木) 08:01:58.10
詳細な仕様を知っている>>48がいると聞いて
0050デフォルトの名無しさん2012/02/02(木) 08:18:33.01
>>49
いや所詮草ガキだから
0051デフォルトの名無しさん2012/02/02(木) 22:23:01.17
草=複数の連続する"w"

1個の場合、複数でも連続でもないから、実は草ではない
0052デフォルトの名無しさん2012/02/02(木) 22:49:35.37
>>51
さすが小学生だな
目のつけどころが違う
0053デフォルトの名無しさん2012/02/02(木) 23:18:44.34
>>51
それは単草といって草の一種なのよ
0054デフォルトの名無しさん2012/02/02(木) 23:34:57.87
マクロから別名保存のダイアログを出して、ユーザーにブックを保存してもらおうとしているのですが、
ダイアログおw表示させた時に初めての保存ならマイドキュメント、2回目以降なら前回のフォルダーを
表示されるようにするにはどうすればいいでしょうか?
よろしく御願いします。
0055デフォルトの名無しさん2012/02/03(金) 02:11:09.99
>>54
まず仕様をしっかり確定させないとプログラミングはできないぞ

初めてかどうかはどうやって判別するんだ?
前回のフォルダはどこにどうやって保存するんだ?

これが答えられない(わからない)ってなら、もうちょっと詳しく状況を書かんとなんとも言えん
0056デフォルトの名無しさん2012/02/03(金) 06:32:53.23
>>54
初めての保存→直接Excelを起動しての作成
2回目以降→既存のBookを呼出し修正保存

意味はこれで合っている?
1年1組成績表フォルダの1月成績結果というBookを呼出して新規作成を選んだ時の保存先もやはりマイドキュメント?
或いは2月成績結果にBook名に流用変更して保存する場合は?
0057デフォルトの名無しさん2012/02/04(土) 06:16:46.60
>>53
残念、ハズレ

というか、そもそも「単草」なんてないから

草=複数の連続する"w"
   数が複数と定義されているので、単数を表す接頭語を付けることは無い

芝="w"そのものであり数は関係ない
   数が定義されていないので、数を表す接頭語を付けることもある->単芝、複芝

「単草」ってのは君と同じく、単芝と草を混同した勘違い君が
思いつきで口にするだけで、定義としては存在していない
0058デフォルトの名無しさん2012/02/04(土) 07:16:08.51
>>57
どっちでもええやん
言葉とはそういう勘違いから定着するもんだよ

正しい日本語は〜と言ってる学者連中はただの馬鹿だぞ
もう広まってる用法ってのは正しいものとしていかんと
0059デフォルトの名無しさん2012/02/04(土) 07:16:34.18
>>57
そもそも「草」とか「芝」とかが定義されてるってどこで?
少なくとも非ネットの日常生活においてwを草とか芝とか言わない訳だが。
単にネット上のコミュニティーで認知されてると「君個人が認識してる」だけでしょ。
だったら「単草」だっておkじゃないの?
その辺の線引きが曖昧すぎだよ

ちなみに>>53ではありません。
草とか芝の定義とやらにも興味ないです
0060デフォルトの名無しさん2012/02/04(土) 08:03:57.05
ネタ解説に釣られ杉wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
0061デフォルトの名無しさん2012/02/04(土) 09:02:23.24
言い負かされるとネタで逃げる奴
0062デフォルトの名無しさん2012/02/04(土) 09:14:49.65
かまうなよ
これは僕はレス乞食ですって自己紹介をしてるだけなんだからwwww
0063デフォルトの名無しさん2012/02/04(土) 10:15:29.22
>>58
いい訳必死だな

あのさ、誤用と、新語や新たな言い回しを一緒くたにしてないか?
別に既存の日本語以外は使っちゃだめとは言わないけど、
間違いを内包する言葉までまとめて「定着すればそれは正しい」なんて言うのはただの馬鹿だぞ

wを芝と呼ぶのは良いが、wをエックスと呼ぶのは明らかな間違いだろ


>>59
> 「w」の文字が並ぶ様子が「雑草が生えているように見える」というところから、
            ~~~~~~
> 「w」を多数並べて笑いを表現する行為を「草を生やす」と呼ぶ場合がある。
      ~~~~~~~~~~~~~

> 草 - ネットスラングでwwwwwwwのこと。


> 草:インターネットスラングのひとつ。(笑)の略であるwを多数書き連ねることで蔑笑を表したもの。
                                                ~~~~~~~~~~~~~~~~~

どこを見ても、「並ぶ」「多数」「書き連ねる」と複数であることを説明し、例としても7連のものが上げられている
因みに上記は独断と偏見入り交じる個人サイトの記事ではなく、ウィキペやニコペなど大手の手がける辞典の記事ですよ
0064デフォルトの名無しさん2012/02/04(土) 10:42:23.74
荒らすなら他へ行け、馬鹿
0065デフォルトの名無しさん2012/02/04(土) 11:04:08.52
こういう話題しかレスできないんだろ。
スルーしとけ。
0066デフォルトの名無しさん2012/02/04(土) 11:44:22.68
wikiが定義ってアホかと
0067デフォルトの名無しさん2012/02/04(土) 13:21:17.58
広辞苑だって出版された当時のスラングを個人の独断で大量に収録してんのに
それは信頼してWikipediaをバカにする男の人って本質がわかってないってゆーか、頭悪いよね
0068デフォルトの名無しさん2012/02/04(土) 13:41:55.07
反射的に wiki を馬鹿にする奴もどうかと思うが、
広辞苑が個人の判断で作られてるって、これまた
頭悪い以前のアホが来たな。
0069デフォルトの名無しさん2012/02/04(土) 17:37:20.46
wikiをバカにしてるんじゃなくて、wikiがネットスラングの定義だって言ってるやつをバカにしてるんじゃないかな
0070デフォルトの名無しさん2012/02/04(土) 18:56:03.91
まあ結論は出たみたいだから、もう終わりにしようぜ。
0071542012/02/04(土) 19:32:32.70
>>55-56
レス、ありがとうございます。
返事が遅くなってすみません。

ユーザーフォームに保存用のボタンを貼って、保存しようとしています。
保存を行った時に保存先フォルダーの記憶用変数を用意して、その変数が
空なら初めての保存、空白以外なら保存用ダイアログを表示した時にそのフォルダーが
表示したいという事でした。
変数に取り込めれば、フォームを閉じる際にiniファイル等に保存して次回以降は
フォルダー選択の手順を省けると思いました。

よろしく御願いします。
0072542012/02/04(土) 19:55:05.76
書き忘れました。
保存先記憶用変数が空の場合は、保存先ダイアログ表示時の
フォルダーはExcel任せでも良いです。
よろしくお願いします。
0073デフォルトの名無しさん2012/02/04(土) 20:05:32.51
iniファイルへの書き込みや読み込みはAPI使うっての知ってますか?
まぁ単純にテキストファイルのオープンで読み込み書き込みでも出来なくはないだろうけど
0074デフォルトの名無しさん2012/02/04(土) 20:16:21.93
>>72
で、何がわからないの?
0075デフォルトの名無しさん2012/02/04(土) 21:11:43.87
>>71
chdir 前回保存先
名前を付けて保存ダイアログ表示
今回保存先を選択
非表示シートにcurdir(今回保存先)を書きみ保存
名前を付けて保存
0076デフォルトの名無しさん2012/02/04(土) 23:05:00.06
複数のブックの一部を読み取っていくマクロを書いているのですが
非表示・バックグラウンドでブックを開くにはどうしたら良いのでしょう?
ググったりしていろいろ試してみたのですが、どうしても一瞬表示されてしまいます。 マクロは
Application.ScreenUpdating = False
Set _ActiveSheet = ActiveSheet
Set book = Workbooks.Open(PATH)
book.Windows(1).Visible = False
Call _ActiveSheet.Activate()
Application.ScreenUpdating = True
というようにしています。

また、ブックのオープンに時間がかかっているため、非同期でブックをオープンしてそれをキューに放り込んで行きたいのですが、
こういったことはどうやってやれば良いのでしょう?
0077デフォルトの名無しさん2012/02/04(土) 23:20:48.95
>>71
ini ファイルじゃなくて、ブック自体に覚えさせることもできるよ。

Option Explicit
Const PropertyName As String = "SavedFolder"
Sub Macro1()
 Dim SavedFolderProperty As DocumentProperty
 Set SavedFolderProperty = Nothing
 Dim Index As Integer
 With ActiveWorkbook.CustomDocumentProperties
  For Index = 1 To .Count
   If .Item(Index).Name = PropertyName Then
    Set SavedFolderProperty = .Item(Index): Exit For
   End If
  Next
 End With
 With Application.FileDialog(MsoFileDialogType.msoFileDialogSaveAs)
  .FilterIndex = 2
  If SavedFolderProperty Is Nothing Then
   .InitialFileName = ""
  Else
   .InitialFileName = SavedFolderProperty.Value
  End If
  .Show
  If SavedFolderProperty Is Nothing Then
   ActiveWorkbook.CustomDocumentProperties.Add PropertyName, False, MsoDocProperties.msoPropertyTypeString, .SelectedItems.Item(1)
  Else
   SavedFolderProperty.Value = .SelectedItems.Item(1)
  End If
  .Execute
 End With
End Sub
007820002012/02/05(日) 02:30:18.27
>>76
> Application.ScreenUpdating = False
> Set _ActiveSheet = ActiveSheet
> Set book = Workbooks.Open(PATH)
> book.Windows(1).Visible = False
> Call _ActiveSheet.Activate()

ActiveWorkbook.Close

> Application.ScreenUpdating = True
0079デフォルトの名無しさん2012/02/05(日) 17:31:56.30
エクセルの関数について質問です。

B1セルに10が入っていたらA1セルに100と返し、
  〃 11か12、13のいずれかの数字が入っていたらA1セルに200と返し、
  〃 14が入っていたらB1セルに300と返し、
  〃が空欄もしくは、10.11.12.13.14以外の数字が入っていたら100と返す
数式を組みたいのですがIFとORを組み合わせてもうまくいきません。
どなたかご教授頂けますでしょうか。
0080デフォルトの名無しさん2012/02/05(日) 17:38:45.19
それをVBAでやりたいってことかな?
0081792012/02/05(日) 17:43:45.11
>80
いえ、違います。
エクセル上で上記の数式を完成させたいだけです。
0082デフォルトの名無しさん2012/02/05(日) 17:46:29.32
>>81
だったら
Excel総合相談所 100
http://toro.2ch.net/test/read.cgi/bsoft/1325935411/l50

0083792012/02/05(日) 17:50:34.95
あ、スレ違いでしたね。
ちょっとこっちで質問してみます。
0084デフォルトの名無しさん2012/02/06(月) 03:30:45.14
同一コードなのに、コードのキャッシュでもされてるのか、結果不定で「?」なときがあると思いますが、そんな時の対処方法はありますか?
0085デフォルトの名無しさん2012/02/06(月) 04:16:29.46
構文エラーを起こす
0086デフォルトの名無しさん2012/02/06(月) 05:30:54.13
>>84
プログラムとは…
自分が思った通りに動く物ではない
自分が書いたとおりに動くのである

つまり結果が自分の希望に反して不定になるのは書き方が悪い。はっきり言えば間違ってる
よく見直せ
0087デフォルトの名無しさん2012/02/06(月) 06:58:44.08
Excel2003です
セルの内容でDBに更新を行う処理です

Set crs = New ADODB.Recordset
crs.CursorType = adOpenDynamic
crs.LockType = adLockOptimistic
crs.CursorLocation = adUseClient
crs.ActiveConnection = cn
'
sSQL = ""
sSQL = sSQL & "SELECT *"
sSQL = sSQL & " FROM WSEL"
sSQL = sSQL & " ORDER BY WSEL.Chusyutu"
crs.Source = sSQL
crs.Open
'
Do Until crs.EOF
  :
  DBの項目にセット処理
  :
crs.Update     ←エラー発生
crs.MoveNext
Loop
crs.Close

1/2
0088デフォルトの名無しさん2012/02/06(月) 06:59:45.09
2/2

DBはMySQLをODBCで使用しています
Updateのところでエラーが発生します
実行時エラー '-2147217864 (80040e38)':
行が見つからなかっため、更新できません。列の値は最後に読み込まれた後で変更された可能性があります。

OpenしてからUpdateまでただ項目をセットしているだけでカーソルを移動させていません
項目のセット処理を削除するとエラーは出ません
ただの ○○=×× という処理でカーソルが移動するとは思えないのですがどんな問題があるのでしょうか?
0089デフォルトの名無しさん2012/02/06(月) 11:02:10.59
ADOのUpdateコマンドではなくSQLのupdate文を
その例で言えば
crs.Execute updateのsql文
という書き方でいつもExcelからmysqlに対してやってる
そのやり方ではどうなの?

まぁ続けるとスレ違いと騒ぎ出す野郎が多そうだから
mougのDB板で聞いてみたら?
0090デフォルトの名無しさん2012/02/06(月) 20:30:01.60
>>89
レスどうもです
>crs.Execute updateのsql文
この方法でやってみます
もし上手くいかなかったらDB板で聞くことにします
ありがとうです
0091842012/02/07(火) 02:38:18.51
>>85
なるほど。ありがとうございます。
>>86
ワロタ
0092デフォルトの名無しさん2012/02/07(火) 04:59:35.62
それ主キーがないとかで行を特定できてないだけじゃないのか
0093デフォルトの名無しさん2012/02/07(火) 12:04:22.02
質問です。
「初項(セル B3 の値)と公差(セル C3 の値)を元にして, セル範囲 B5:G5 に等差数列の値を入力する
マクロ「等差数列」を定義せよ」
という課題があるのですが、何から手を付ければいいのか分かりません。
よろしければご教授お願いします。
0094デフォルトの名無しさん2012/02/07(火) 12:13:41.21
公式にぶちこめ
0095デフォルトの名無しさん2012/02/07(火) 15:15:08.32
>>93
おっぱい見せて

Option Explicit
Private Sub マクロ等差数列()
  Dim 初項 As Double
  Let 初項 = Application.ThisWorkbook.ActiveSheet.Range("B3").Cells(1, 1).Value
  Dim 公差 As Double
  Let 公差 = Application.ThisWorkbook.ActiveSheet.Range("C3").Cells(1, 1).Value
  Dim 数列1番目 As Double
  Let 数列1番目 = 初項
  Application.ThisWorkbook.ActiveSheet.Range("B5").Cells(1, 1).Value = 数列1番目
  Dim 数列2番目 As Double
  Let 数列2番目 = 数列1番目 + 公差
  Application.ThisWorkbook.ActiveSheet.Range("C5").Cells(1, 1).Value = 数列2番目
  Dim 数列3番目 As Double
  Let 数列3番目 = 数列2番目 + 公差
  Application.ThisWorkbook.ActiveSheet.Range("D5").Cells(1, 1).Value = 数列3番目
  Dim 数列4番目 As Double
  Let 数列4番目 = 数列3番目 + 公差
  Application.ThisWorkbook.ActiveSheet.Range("E5").Cells(1, 1).Value = 数列4番目
  Dim 数列5番目 As Double
  Let 数列5番目 = 数列4番目 + 公差
  Application.ThisWorkbook.ActiveSheet.Range("F5").Cells(1, 1).Value = 数列5番目
  Dim 数列6番目 As Double
  Let 数列6番目 = 数列5番目 + 公差
  Application.ThisWorkbook.ActiveSheet.Range("G5").Cells(1, 1).Value = 数列6番目
End Sub
0096デフォルトの名無しさん2012/02/07(火) 16:41:05.20
すみません、ワードのVBAについてはどこか質問スレってありませんでしょうか?
0097デフォルトの名無しさん2012/02/07(火) 17:30:37.03
>>96
専門スレはないのでここで聞いてみる

Word(ワード)総合相談所 Part21
http://toro.2ch.net/test/read.cgi/bsoft/1319313721/
0098デフォルトの名無しさん2012/02/07(火) 17:46:04.08
ない
場違い承知・まともな回答返ってこない前提でここかパワポVBAスレッドで聞いてアレンジするか
ググって見つかる掲示板利用するしか
0099デフォルトの名無しさん2012/02/07(火) 17:48:36.97
(*ノノ)イヤン
0100デフォルトの名無しさん2012/02/07(火) 17:51:41.95
>>95
>おっぱい見せて
さろんへ行け。
0101デフォルトの名無しさん2012/02/07(火) 17:51:42.53
VBEで入力した全角文字が片っ端から自動で確定されて日本語入力できないんですが、仕様ですか?
0102デフォルトの名無しさん2012/02/07(火) 21:11:34.07
>>97-98 ありがとう、ダメ元ですがエクセル場合はこーする、でも構わないので聞いてみます。
検索対象文字列の手前に改行を入れる、というVBAをつくろうとしています。

物:いちご物:みかん物:バナナ

となってる文章を

物:いちご
物:みかん
物:バナナ

と整形したいため、「物:」を検索し、その手前で改行を入れるVBAを作りたいです。
以下は自分で作ってみたものの、物:そのものを消して改行を3発入れてしまう駄作です。
Sub 検索()
With Selection.Find
.Text = "物:"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchWildcards = True
Do While .Found = True
If .Execute(FindText:="物:", Forward:=True, Format:=True) = True Then
         Selection.TypeParagraph
         Selection.TypeParagraph
        Selection.TypeParagraph
Else
End If
Exit Do
Loop
End With
エクセルならこーする、ワードは知らん。でも構いませんのでご教示頂けると幸いです。
0103デフォルトの名無しさん2012/02/07(火) 21:24:17.08
Selection.TypeParagraphが三つあるから改行がみっつ入るんじゃないのか?
それひとつにしてそのあと"物:"追加すればいいんじゃね

つか物:を置換してマクロ記録すればすぐわかるような
0104デフォルトの名無しさん2012/02/07(火) 21:36:32.82
>>103
回答ありがとうございます。
例で出したソースは例えで、「物:」実際は数字や日付、名前のような動的なものが入ります。
なので静的に「物:」を後から足すという手法が使えません。
さらに、実際は改行は1発ではなく、間に3行欲しいので3発入れる必要があります。

例えが下手で申し訳ありません。
0105デフォルトの名無しさん2012/02/07(火) 21:48:44.82
データの整理をVBAで行うことを考えている初心者です
VBAを試しに書いて実行してから保存をしてみたところ、VBAによって行われたシート側の改変まで保存されてしまうようなのですが、
コードの部分だけを保存する方法はないでしょうか?
0106デフォルトの名無しさん2012/02/07(火) 21:51:57.10
>>93
斜め上から

Sub 等差数列()
  Range("B5") = Range("B3")
  Range("C5") = Range("B3") + Range("C3")
  Range("B5:C5").AutoFill Destination:=Range("B5:G5")
End Sub
0107デフォルトの名無しさん2012/02/07(火) 21:57:15.58
>>105
VBAを行うファイルとデータファイルとを別々にスレばいい。
今は同じブック内でやってんでしょ?
0108デフォルトの名無しさん2012/02/07(火) 21:59:38.02
>107
なるほど、それは盲点でした
どうもありがとうございます
0109デフォルトの名無しさん2012/02/07(火) 22:15:08.83
>>106
オートフィルメソッドなんか使わんでも数式は代入だけでコピーできる

Sub 等差数列()
 Range("b5") = "=b3"
 Range("c5:g5") = "=b5+$c$3"
End Sub

さらに短かく

Sub 等差数列2()
 Range("b5:g5") = "=$b$3+$c$3*(column()-2)"
End Sub
0110デフォルトの名無しさん2012/02/07(火) 23:20:14.94
>>109
それ 94 の方法でしょ
0111デフォルトの名無しさん2012/02/07(火) 23:50:08.62
>>102
>>97
または
mougでもいけばいいんじゃない

With Selection.Find
Replacement.ClearFormatting
.Text = "物"
.Replacement.Text = vbCr & "物"
.Execute Replace:=wdReplaceAll
End With
0112デフォルトの名無しさん2012/02/08(水) 00:33:54.14
>>95,>>106,>>109,>>110
の方々、ありがとうございます。とても助かります。
もうひとつ質問があるのですが、
・選択したセル範囲に対して、
   a.空白セルの場合には背景色を黄色( RGB(255,255,0) )にする
   b.空白でないセルの場合は背景色を色なし( xlColorIndexNone )にする
 マクロ「チェック」を書きたいのですが、どのようにすればいいのでしょうか。
0113デフォルトの名無しさん2012/02/08(水) 03:01:53.56
>>112
順番は逆だが気にするな
中学か高校の情報の授業なんだろうが先生が期待している回答ではないかと

Sub チェック()
With Selection
  .Interior.Pattern = xlNone
  .SpecialCells(xlCellTypeBlanks).Interior.Color = RGB(255, 255, 0)
End With
End Sub
0114デフォルトの名無しさん2012/02/08(水) 03:16:33.90
>>112
Sub チェック()
  Selection.Interior.Color = -4142
  Selection.SpecialCells(4).Interior.Color = 65535
End Sub
0115デフォルトの名無しさん2012/02/08(水) 04:11:01.60
>>111
スレチの質問にヒントありがとうございます。
しかし実際は>>104なので、"物"とすることができません。
具体的には2ちゃんのレス番、名前欄手前に3つ改行を入れたいのです。

Sub TEST()
With Selection.Find
.MatchSoundsLike = False
.MatchFuzzy = False
.MatchWildcards = True

.Text = "[0-9]{1,3} :* ??:??:??.?? ID:????????"
.Replacement.Text = vbCr & vbCr & vbCr & "ここに何か".
.Execute Replace:=wdReplaceAll
End With
End Sub

検索結果をそのまま持ってくるような関数は無いでしょうか?
上記"ここに何か"部分にそれを入れれば上手く動きそうな気がします。
0116デフォルトの名無しさん2012/02/08(水) 07:28:55.58
>>115
>>97
0117デフォルトの名無しさん2012/02/08(水) 16:02:40.64
>>113,>>114
ありがとうございます!
0118デフォルトの名無しさん2012/02/08(水) 16:14:10.84
>>116
ありがとうございます。>>111さんに教えて頂いたmougにて有用な回答を得て解決出来ましたので
エクセルでも応用が利くかもしれないので、方法を貼っておきます。

.Replacement.Text = "^p^p^p\1"

とすることで、\1が置換後の文字列をそのまま使ってくれる事を教わりました。
これで解決することが出来ました。

以上です。ご回答頂き本当にありがとうございました。
0119デフォルトの名無しさん2012/02/08(水) 23:04:47.66
お邪魔します。
OS:WinXP-SP2
Ver:Excel2002です
目的:シートAとBの特定範囲を一括して印刷プレビュー

Sheets(Array("A", "B")).Select
Range("A1:F59").Select
Selection.PrintPreview
Sheets("C").Select

と入れてシートAとBのA1:F59の印刷プレビューを開きたいのですが
この命令を実行するとシートAのA1:F59のプレビューしか開けません。
シートAとBを一括してプレビューさせるには何が足りないのでしょうか?
0120デフォルトの名無しさん2012/02/08(水) 23:58:52.00
>>119
ActiveWindow.SelectedSheets.PrintPreview
0121デフォルトの名無しさん2012/02/09(木) 00:17:23.02
>>119
Worksheet オブジェクト(普通のシート)には PrintPreview メソッドが存在する、よってシートを選択してプレビューできる
sheets オブジェクト(複数のシートを保持できる)には PrintPreview メソッドが存在する、よって複数のシートを選択してプレビューできる
range オブジェクトには PrintPreview メソッドが存在する、よって範囲を選択してプレビューできる
range オブジェクトは同一シート内なら複数の範囲を保持できる、よって同一シート内なら複数の範囲をプレビューできる

ただし、Excel には複数のシートをまたがる複数の Range を保持できるオブジェクト自体が存在しない
そのため、それに対応する PrintPreview メソッドも存在しない

たぶん
0122デフォルトの名無しさん2012/02/09(木) 00:36:45.70
>>119
PageSetupを変更して良いなら
↓はどう?

Sheets("A").PageSetup.PrintArea = "A1:F59"
Sheets("B").PageSetup.PrintArea = "A1:F59"
Sheets(Array("A", "B")).PrintPreview
01231192012/02/09(木) 11:32:11.25
>>120-122
ありがとうございました。
最終的にこうなりました。

Sub 印刷プレビュー()
'セルB55の数値からシート印刷か部分印刷かを判断
If Range("B55") <> "" Then
'B55に数値が存在するならばシート印刷
Sheets(Array("請求書", "見積書")).PrintPreview
Else
'B54に数値が存在しなければ部分印刷
Sheets("請求書").PageSetup.PrintArea = "A1:F59"
Sheets("見積書").PageSetup.PrintArea = "A1:F59"
Sheets(Array("請求書", "見積書")).PrintPreview
'印刷範囲を初期化
    Sheets("請求書").PageSetup.PrintArea = "A1:F119"
Sheets("見積書").PageSetup.PrintArea = "A1:F119"
End If
End Sub
0124デフォルトの名無しさん2012/02/09(木) 17:07:00.03
Dim 変数 as Range
このようにオブジェクト変数を使いセルを代入すると
その情報の中にそのセルの上位のシートやブックも一緒に保存されてるんですか?
0125デフォルトの名無しさん2012/02/09(木) 18:46:47.98
>>124
たしかParentプロパティとかに入ってたと思う。
01261242012/02/09(木) 19:08:28.56
Parentプロパティって何でしょうか?
つまりそのRange型変数には入ってるってこと?

その特定のセルの場所を保存するには
ブック型変数(Dim〜as Workbook)、シート型変数(Dim〜as Worksheet)、セル型変数(Dim〜as Range)の3つが必要かと思ってたけど
セル型ひとつで済むならかなり楽だけど、違うのかな?
01271252012/02/09(木) 19:41:53.50
たとえば、こんな風にやってみると
レンジ型変数からシート名とブック名も取得できる
でもこんなことするより
シートやブックもオブジェクト変数に代入しちゃう方が早くないか?

Sub test()
Dim Rng As Range
Set Rng = ThisWorkbook.Sheets(1).Cells(1, 1)
Debug.Print Rng.Parent.Name
Debug.Print Rng.Parent.Parent.Name
End Sub
01281252012/02/09(木) 19:49:11.26
>>126
ごめん、後半読んでなかった
セル範囲の指定をRange型変数ひとつでできないか、という話だったのね。
Range型変数に代入されたセル範囲はRange型変数だけで特定できるから
そういう意味ではWorkBook型やWorkSheet型の変数は不要だよ。

てっきりブックやシートの指定もレンジ型一つで全部済ませたい
ってことかと思ってたよ
(>>127で書いたとおりそれもできることはできるけど、
記述が長くなるからあんまりメリットを感じない。)
0129デフォルトの名無しさん2012/02/09(木) 22:17:32.76
バイナリファイルを読み込んでデータの中の文字列を探したいと思ってます。
バイト配列と文字列を比較するためにしなくてはいけないのですが、
型を合わせる方法がわかりません。 バイト配列から文字列、また
文字列からバイト配列に変換する方法を教えてください。

よろしくお願いします。
0130デフォルトの名無しさん2012/02/09(木) 23:42:11.88
>>129
バイナリファイルを文字列に変換して処理する例(すべてのバイトをを &H0000〜&H00FF のUnicode文字として変換)

Const adTypeBinary = 1
Sub Foo()
 bin = LoadBin("D:\misc\a.txt")
 n = GetBinSize(bin)
 Text = ""
 For i = 0 To n - 1
  Text = Text + ChrW(CodeAt(bin, i))
 Next
 index = InStr(Text, ChrW(&HFF))
 MsgBox "最初に見つけた &HFF の位置: " + CStr(index)
 index = InStr(Text, "hello")
 MsgBox "最初に見つけた hello の位置: " + CStr(index)
End Sub
Function LoadBin(path)
 Set stm = CreateObject("ADODB.Stream")
 stm.Type = adTypeBinary
 stm.Open
 stm.LoadFromFile (path)
 LoadBin = stm.Read()
 stm.Close
End Function
Function GetBinSize(bin)
 GetBinSize = LenB(bin)
End Function
Function CodeAt(bin, index)
 CodeAt = AscB(MidB(bin, index + 1, 1))
End Function
0131デフォルトの名無しさん2012/02/09(木) 23:44:26.34
>>129
>ANSI 形式のバイト型配列を文字列に変換する場合は、StrConv 関数を使用してください。
>Unicode 形式の配列を変換する場合は、代入式を使用してください。
以上 StrConv 関数のヘルプから

それ以外の文字コードだった場合はVBAだけで簡単にやる方法は多分ない
0132デフォルトの名無しさん2012/02/10(金) 00:19:32.83
文字コードによるけど、バイナリファイルだって最初っからテキストモードでオープンすりゃええがな
01331262012/02/10(金) 00:29:11.59
>>127>>128
すばらしい解説ありがとうございます。
なるほど、Rangeでもシートやブックの情報を裏で持ってたんですね。
頭スッキリしました。
こういうスッキリ感がプログラムという複雑化しやすいことを扱うにはものすごく重要ですしね。
ということはRangeのオブジェクト変数はものすごく便利ですね。
0134デフォルトの名無しさん2012/02/10(金) 00:53:51.04
間違ってた
○ChrW
×Chr
0135デフォルトの名無しさん2012/02/10(金) 00:55:28.19
>>134は>>130についてです
01361292012/02/10(金) 01:23:07.49
>>130>>134>>135
具体的なサンプルありがとうございます。
SJISの場合はChrでUTFの場合はChrW
を使えばよいのでしょうか?

>>131
たしかSJISだったと思うのでStrConvを使えば
比較できるということですね。
ヘルプを確認してみます。

>>132
テキストモードでオープンすると正しく取得できない
値があるのでバイナリモードでオープンする方法を検討しています。
01371302012/02/10(金) 01:44:11.61
>>136
>SJISの場合はChrでUTFの場合はChrW
違う
ChrWは単なる間違い

130の例で Shift_JIS の "あ" を検索したいなら、
Chr(&H82) + Chr(&HA0)
を検索する必要がある
面倒だけど、その代わりバイト並びさえ分かっていれば変換による情報落ちの心配なしにどんなコードでも処理できる、という例
0138デフォルトの名無しさん2012/02/10(金) 11:13:23.28
VBAの基本的な文法はマスターしたのですが
Error処理のしかた
プロシージャのCallの呼び方
きれいなコードの書き方
イミディエト窓の使い方
バグフィックスのしかた

など、普通の入門書にはほとんど書かれていないこともマスターしたいです
そのためのいい本はありますか?
0139デフォルトの名無しさん2012/02/10(金) 13:05:03.46
これは正しいですか↓

-------------------------------------------------
LoadするとInitializeイベントが発生して、
ShowでActivateイベントが発生する。
HideするとDeactivateイベントが発生して、
UnloadでTerminateイベントが発生する。

LoadしないでShowすると自動的にLoadされてShowするし、
HideしないでUnloadしても自動的にHideされてUnloadする。
0140デフォルトの名無しさん2012/02/10(金) 13:07:14.91
>>139
神!

こういう整理された情報こそ実用的であり非常に有用。
みんなも>>139みたいな情報を共有しあうために貼り付けようじゃないか!
0141デフォルトの名無しさん2012/02/10(金) 13:34:27.98
すくなくとも
>ShowでActivateイベントが発生する。
>HideするとDeactivateイベントが発生して、
は正しくない
Showした結果アクティブになればActivateイベントが発生するし
Hideした結果アクティブじゃなくなればDeactivateイベントが発生する
HideしたからってかならずDeactivateが発生するわけじゃない
0142デフォルトの名無しさん2012/02/10(金) 14:42:14.40
Workbooks(x)のxを
そのworkbookの名前から取り出す方法を教えてください。
0143デフォルトの名無しさん2012/02/10(金) 15:20:21.90
取り出す必要なんてない。
0144デフォルトの名無しさん2012/02/10(金) 16:14:52.80
>>142
WorkbookオブジェクトにはIndexプロパティがないので直接求めるのは無理
Workbooksコレクションをループで順番に見ていくしかない

けど>>143の言う通り、インデックス番号なんかわからなくてもプログラムは書ける
何がやりたいの?
01451422012/02/10(金) 16:31:35.11
長いコードを短くしたいの。
0146デフォルトの名無しさん2012/02/10(金) 16:33:32.37
コピペをVBAコードて書く場合、
なぜ対象オブジェクトはシートなんですか?
普通に考えてセルであるべきだ。
納得される説明・理由が聞きたいのですが。
0147デフォルトの名無しさん2012/02/10(金) 17:11:39.81
>>145
短くしたいなら、
dim book as workbook
set book = workbooks("bookname.xls")
'以降bookを使ってコードを書く

の方が良くない?
0148デフォルトの名無しさん2012/02/10(金) 17:34:20.86
>>145
それならオブジェクトを変数に入れた方がいい
短くなるだけでなく、処理も少し軽くなる
具体例は>>147

コードを短くする方法はいくつかあって、Withを使うのも効果的
0149デフォルトの名無しさん2012/02/10(金) 19:10:47.12
>>146
そんなことをここで聞かれてもな
マイクロソフトに聞け

ただ、おまえが普段どんなコードでコピペしてるかしらんが
少なくとも俺はコピーするときはRangeが対象なことがほとんどだし
Rangeに張りつけたければPasteSpecialも使えるぞ
0150デフォルトの名無しさん2012/02/10(金) 19:38:29.05
VBAでVLOOKUPのようなことをしたい場合どうしてますか?
0151デフォルトの名無しさん2012/02/10(金) 19:41:55.38
VBAで改行を文字列にするにはどうすればいいですか?
0152デフォルトの名無しさん2012/02/10(金) 19:49:24.89
>>150
あなたはどうしてますか
0153デフォルトの名無しさん2012/02/10(金) 19:50:09.64
>>151
ん?
0154デフォルトの名無しさん2012/02/10(金) 19:57:04.82
>>152
使い方をしらないからまだ使ったことない。
>>151
vbLINEかvbCRみたいなのなかったっけ?

VBAでワークシート関数を使いたいとき、Application.WorkSheetFunctionを使えばいいと書いてあるけど
どんな関数でもVBAでも使えるのですか?
さらにWorkSheetFunctionのあとは単にワークシート関数の単語を書けばいいだけ?
0155デフォルトの名無しさん2012/02/10(金) 20:04:05.38
ワークシートとVBAで混乱するもの

FindとInstr
TextとFormat
DateとToday
その他多数

これみんなどうやって記憶してるの?
0156デフォルトの名無しさん2012/02/10(金) 20:08:37.99
>>150
VBAでもVLOOKUP関数は普通に使える
0157デフォルトの名無しさん2012/02/10(金) 20:09:39.85
>>154
オブジェクトブラウザで、WorksheetFunctionオブジェクトを見れば良い。
Application.WorksheetFunctionプロパティが返してくるのがこいつだから。
別にExcel固有の記述とかそういうものじゃない。
0158デフォルトの名無しさん2012/02/10(金) 20:09:50.18
>>151
vbCr
vbLf
vbCrLf
0159デフォルトの名無しさん2012/02/10(金) 20:09:57.92
なんだか真面目に質問しているようにみえないんだが
気のせい?
0160デフォルトの名無しさん2012/02/10(金) 20:12:30.38
>>155
使ってれば自然に覚える
間違えばエラーが出るから、それを見て直す
忘れたらヘルプを見る、Googleで検索する

せっかくコンピューターが色々と助けてくれるんだから
完璧に暗記することよりも、それを活用する方法を考えた方が応用範囲が広くなる
0161デフォルトの名無しさん2012/02/10(金) 20:20:58.66
>>156
ありがとう。それはWorksheetFunctionを使って?
>>157
ありがとう。はじめオブジェクトブラウザを見てみた。たくさん入ってる関数は全部ワークシートの関数なんだね。
でも例えば単純なSum関数だとActivecell=Application.WorksheetFunction.Sum("A1:E5")と書けば
そのセルに”=Sum("A1:E5")”と入力されるってことで合ってます?
>>158
ありがとう。それだ。
>>159
今後仕事でVBA使うので復習中。
>>160
確かにそうですね。丸暗記はやめます。しかし例えば6か月くらいBAを全く使わないと基本機能すら忘れるね。
その忘れたときに思い出すための対策(例えば基本機能のメモと特殊的機能の一覧をノートにまとめるとか)は何かしといたほうがいいと感じてます。
0162デフォルトの名無しさん2012/02/10(金) 20:25:47.45
>合ってます?

聞く前に試せば済むこった
0163デフォルトの名無しさん2012/02/10(金) 20:30:50.24
あなたの回答力も試したいと思って。
0164デフォルトの名無しさん2012/02/10(金) 20:34:24.98
やはりそうでしたか
0165デフォルトの名無しさん2012/02/10(金) 20:34:45.43
>>162
試してもエラーが出るんですけど。エラいこっちゃ。
0166デフォルトの名無しさん2012/02/10(金) 20:36:28.19
>>165
WorksheetFunction.Sum(Range("a1:e5"))
0167デフォルトの名無しさん2012/02/10(金) 20:37:47.13
Activecell=Application.WorksheetFunction.Sum(Range("A1:E5"))
ならうまくいきました。
しかもセルには数式じゃなく結果の数値のみが表示されてる。

もしVBAでセルに数式そのものを入力したい場合はどうすればいいの?
0168デフォルトの名無しさん2012/02/10(金) 20:38:30.47
>>167
ActiveCell.FormulaLocal = "=Sum(A1:E5)"
0169デフォルトの名無しさん2012/02/10(金) 20:38:34.59
>>166
1分19秒先を越された・・・・・・
0170デフォルトの名無しさん2012/02/10(金) 20:39:38.10
>>168
ありが十匹。
ところで単にActiveCell= "=Sum(A1:E5)"、または、ActiveCell.Value= "=Sum(A1:E5)"、でも問題ないですか?
0171デフォルトの名無しさん2012/02/10(金) 20:41:56.18
>>170
試してみたらどうだ
0172デフォルトの名無しさん2012/02/10(金) 21:32:09.71
あなたのVBA力と回答力を試しているんですが
0173デフォルトの名無しさん2012/02/10(金) 21:47:11.33
ワークシート関数のSumと
VBaのApplication.WorksheetFunction.のあとのSumでは
そのあとに続くコードが微妙に違うの?
Vlookupの場合は?
まさか関数ごとに全部覚えないといけないの?

>>171
できた。
0174デフォルトの名無しさん2012/02/10(金) 21:52:43.03
>>173
> Vlookupの場合は?

試してみたらどうだ
0175デフォルトの名無しさん2012/02/10(金) 22:03:27.91
VBAのコードを使って、ファイルやフォルダを自由自在に操ってみたいと思ってます。

[ファイル]と[フォルダ]のそれぞれ2つについて、
[移動][コピー][削除][名前の変更]の4つはどうコードで記述すればいいか(つまり2x4=8個について)、
どなたか教えていただけませんか?
それが載ってあるサイトのURLでもいいです。

(*[フォルダ]の[削除]は、もしその中にファイルやフォルダがあったらそれも含めて全部削除するとします)
0176デフォルトの名無しさん2012/02/10(金) 22:09:50.59
>>175
VBA力と回答力を試しているんですか
0177デフォルトの名無しさん2012/02/10(金) 22:22:14.32
>>175
んなもん、それぞれぐぐっていけばいいだけの話だろうが

Office TANAKA - トップページ
http://officetanaka.net/
http://officetanaka.net/excel/vba/filesystemobject/index.htm

あたり読めば?
0178デフォルトの名無しさん2012/02/11(土) 07:56:33.53
あなたの検索力を試したんですよ
まあまあですね
0179デフォルトの名無しさん2012/02/11(土) 17:49:13.59
>>178
くやしいのうwwwwwwwwwくやしいのうwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
0180デフォルトの名無しさん2012/02/11(土) 19:00:02.04
"w" も使い過ぎると逆効果だなあ。
0181デフォルトの名無しさん2012/02/11(土) 22:54:53.04
図形を含んだシートのコピーに関して教えてください。
セル範囲を指定してコピー、別シートに貼り付けをしているのですが、
コピー自体はできるのですが図形の大きさが変わったり、印刷した時の大きさが違ったり
してしまいます。
全く同じにコピーするにはどうすればいいのでしょうか?
シート自体のコピー挿入の方がいいのでしょうか?
よろしくお願いします。
0182デフォルトの名無しさん2012/02/12(日) 00:28:06.43
>>181
図形の生成はマクロでやってる?
そうならコピペせなんでも生成時のアドレス変えてもう一つ作ればいいんじゃ?
もし、マクロで生成したものでない図形を〜って話なら
図形のプロパティでセルの移動とかにあわせて大きさを変えないようにすればいけるかと。
ペースト先セルの列の幅やら行の高さやらがコピー元と違うと大きさ修正されちゃうし。
0183デフォルトの名無しさん2012/02/12(日) 03:55:14.43
エスパー(マクロでやってないな)
0184デフォルトの名無しさん2012/02/12(日) 14:52:49.17
こんにつわ、他人から貰ったExcelファイルがどういうコードで動いてるか見るにはどうすればいいのじゃ?
0185デフォルトの名無しさん2012/02/12(日) 14:59:31.37
>>184
Alt+F11
0186デフォルトの名無しさん2012/02/12(日) 15:19:23.68
ありがとうちゃん
01871292012/02/12(日) 23:35:21.88
>>137
全角文字、たとえば”あ”を&H82 + &HA0に変換する場合は
どうすればよいのでしょうか?
以下のように記述を比較してみましたが一致しませんでした
ご教授おねがいします。

msg = Chr(Asc("あ"))
msg2 = Chr("&H82") + Chr("&HA0")
0188デフォルトの名無しさん2012/02/12(日) 23:40:08.67
>>187
MsgBox Hex(Asc("あ"))
0189デフォルトの名無しさん2012/02/12(日) 23:52:57.06
他Bookに記述してるマクロを実行(あるいはSubやFunctionを呼び出し)することって
できる?
頻繁にやるのは望ましくない?
0190デフォルトの名無しさん2012/02/13(月) 00:22:53.83
>>189
たとえばBook1.xlsmのThisWorkbookにあるsub testを呼び出すなら
Application.Run "Book1.xlsm!ThisWorkbook.test"
でできる
頻繁どころか、アドインでもない限り他ブックのマクロ実行させるのはまったく好ましくない
0191デフォルトの名無しさん2012/02/13(月) 00:23:18.72
マクロでコントロールを状況に応じて増やしたいんだけど
そういうことってできる?

たとえば5と入力したら別Window(Form)を開いて
そこに5つのラベルとテキストボックスを挿入したいの。
0192デフォルトの名無しさん2012/02/13(月) 00:26:32.22
なんでマルチポストすんの?
0193デフォルトの名無しさん2012/02/13(月) 00:57:04.90
>>189
もちろんできる
複数のブックから使用するマクロを別ブックにしたり、
複数のブックのマクロを呼び出すメニュー用のブックを作ったり、
xlsxのファイルで使用するためのマクロを別ブックにしたり、
いろいろ

ExcelVBAの考え方としては、データを置くワークシートと、
プログラムを置く標準モジュールをどう配置するか
01941872012/02/13(月) 01:11:58.07
>>188
ありがとうございます。

MsgBox Hex(Asc("あ"))  は 82A0と表示されましたが
MsgBox Hex(Asc(Chr(&H82) + Chr(&HA0))) が 8145になってしまいましたが
MsgBox Hex(Asc(Chr(&H82A0)) では 80A0と表示されたのでこちらとは一致させることができました。

全角文字の場合には &H80A0 のような書きかたが正しいのでしょうか?

しかし >>130 のコードで
”あいうえお”を検索したく
msg = Chr(&H82) + Chr(&HA0) + Chr(&H82) + Chr(&HA2) + Chr(&H82) + Chr(&HA4) + Chr(&H82) + Chr(&HA6) + Chr(&H82) + Chr(&HA8)
InStr(Text, msg)
とした場合には検索できるのですが
msg = Chr(&H82A0) + Chr(&H82A2) + Chr(&H82A4) + Chr(&H82A6) + Chr(&H82A8)
InStr(Text, msg)
のような書きかたをした場合には検索できませんでした。

”あいうえお” を検索する場合にはどういう書きかたをすればよいのでしょうか?
0195デフォルトの名無しさん2012/02/13(月) 02:04:05.27
「あいうえお」と書かれたテキストファイルを
>>130のコードに突っ込めば直ぐ解る。
01961872012/02/13(月) 02:53:20.17
>>195
きさま、舐めとんかゴルァ
0197デフォルトの名無しさん2012/02/13(月) 19:33:16.74
保存ダイアログが出たときに、特定のフォルダーが出るように下記の様に
書いたのですが、Win7 32bitでは希望通りの動きなのですが、64bitだと
マイドキュメントが選択された状態で表示されてしまいます。

xlAPP.GetSaveAsFilename(InitialFileName:=SaveDir & FileName)

64bit版でも指定したフォルダーを選択状態にさせるにはどうすればいいですか?
よろしくお願いします。
0198デフォルトの名無しさん2012/02/13(月) 19:57:03.92
すみません。
コピーし忘れがありました。
一度保存すると、その時のフォルダーを保存しておいて、2回目からは
SaveDirに記憶したフォルダーを選択するようにしています。

SaveaDir = CurDir

そのために上記の様にして記憶するようにしています。
(このスレを読んで参考にしました。)

32bit版は変数の中身が変わるのですが、64bit版ではブックを読みだしたフォルダーから
変更されない感じです。
よろしくお願いします。
0199デフォルトの名無しさん2012/02/13(月) 20:18:43.27
>>198
省略しすぎ。もう少しコードを見せられないの?
0200デフォルトの名無しさん2012/02/13(月) 21:24:43.24
>>197
ディレクトリだけ?
ファイル名は正しく表示されるの?
0201デフォルトの名無しさん2012/02/14(火) 15:30:51.13
VBAについて質問させてください! OS Windows7 2003使ってます。

下記のプログラムでYAHOO競馬からラップタイムって物だけをダウンロードしてきてるんですが、今は
1Rづつしか持って来れてないんで、これを全レース(最大で1日36R)一回の作業でダウンロードしてくる
プログラムに直せませんか?

宜しくお願いいたします!

Sub test()
Dim ie As Object
Dim elements As Object
Dim i As Integer
Cells.Clear
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
ie.Navigate "http://keiba.yahoo.co.jp/race/result/1206010512/"
Do While ie.Busy Or ie.ReadyState <> 4: DoEvents: Loop
Set elements = ie.Document.getElementsByTagName("div")
For i = 0 To elements.Length - 1
If elements(i).innertext Like "ラップタイム*" Then
Set elements = elements(i).getElementsByTagName("td")
Exit For
End If
Next
For i = 0 To elements.Length - 1
Range("B" & i + 1).Value = elements(i).innertext
Next
ie.Quit
Set ie = Nothing
End Sub

0202デフォルトの名無しさん2012/02/14(火) 17:43:32.49
>>197
& "\" &
0203デフォルトの名無しさん2012/02/14(火) 21:01:01.46
>>197
32ビット版なので確認できないが、
64ビット版だとSaveDirに関係なくいつもマイドキュメントが開くってことか

Sub test()
Const FileName = "test.xlsx"
Const SaveDir = "C:\"
Dim fname

MsgBox CurDir
fname = Application.GetSaveAsFilename(InitialFileName:=SaveDir & FileName)
MsgBox CurDir

End Sub
02041972012/02/14(火) 22:05:33.85
皆さん、レスありがとうございます。
どうも、CurDirの返り値が32bit、64bitで違うみたいです。
32bitの時は保存したり、読み出したりした時のフォルダーが返ってくるのですが、
64bitの時は読み出したフォルダーが返ってくるみたいです。

'保存
Save_NAME = xlAPP.GetSaveAsFilename(InitialFileName:=Save_Name)

'保存先フォルダー記憶
File_Name = Dir(Save_NAME)
Save_dir = Replace(Save_NAME, File_Name, "")

こんな感じでできるようになりました。
0205デフォルトの名無しさん2012/02/14(火) 22:07:08.20
× Save_NAME = xlAPP.GetSaveAsFilename(InitialFileName:=Save_Name)
○ Save_NAME = xlAPP.GetSaveAsFilename(InitialFileName:=Save_dir)
です
0206デフォルトの名無しさん2012/02/15(水) 00:10:13.68
>>201
いらん機能までゴテゴテ付けたら改行が多すぎるって怒られちったお

Sub test()
Dim ie As Object, elements As Object
Dim i%, url$, n%, y%, m%, d%, r%
Dim name As Variant
Dim flg As Boolean
Dim j As Variant
name = Array("札幌", "函館", "福島", "新潟", "東京", "中山", "中京", "京都", "阪神", "小倉")
url = "http://keiba.yahoo.co.jp/race/result/"
j = Application.InputBox("開催地、年月日をすべて2桁の数値で入力" & vbCrLf & _
"札幌=01,函館=02,福島=03,新潟=04,東京=05,中山=06,中京=07,京都=08,阪神=09,小倉=10", "下記の順にデータを入力してください", , , , , , Type:=2)
If j = False Then Exit Sub
If Len(j) <> 8 Then Exit Sub
n = Left(j, 2): y = Mid(j, 3, 2): m = Mid(j, 5, 2): d = Mid(j, 7, 2)
With ThisWorkbook.Sheets(1)
.Cells.Clear
.Cells(1, 1) = y & "年" & m & "月 " & name(n - 1) & d & "日目"
For i = 1 To 11
.Cells(1, 1).Offset(i).Value = "^" & i * 200
Next i
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
0207206の続き2012/02/15(水) 00:10:51.20
For r = 1 To 37
flg = False
ie.navigate (url & y & Format(n, "00") & Format(m, "00") & Format(d, "00") & Format(r, "00") & "/")
Do While ie.Busy Or ie.readyState <> 4: DoEvents: Loop
Set elements = ie.document.getElementsByTagName("div")
For i = 0 To elements.Length - 1
If elements(i).innerText Like "ラップタイム*" Then
flg = True
Set elements = elements(i).getElementsByTagName("td")
Exit For
End If
Next i
If Not flg Then
.UsedRange.EntireColumn.AutoFit
Exit For
End If
For i = 0 To elements.Length - 1
.Cells(1, 1).Offset(, r).Value = r & "R"
.Cells(2, 1).Offset(i, r).Value = elements(i).innerText
Next i
Next r
Set elements = Nothing
ie.Quit
Set ie = Nothing
End With
End Sub
02082062012/02/15(水) 00:15:06.33
個人的には
ie.visible=true
はFalseのほうが画面の切り替えがなくて好きだけど、
非表示にしとくとIEのアクセスでエラーが出てるときの
エラーメッセージも表示されなくなるんだっけ?
02092062012/02/15(水) 00:19:14.69
連投スマソ
入力する年月日のうち、日は日付じゃなくて開催何日目かなので
そこんとこよろしく
(たとえば、06120105は中山競馬場、2012年1月の開催5日目の意味)
0210デフォルトの名無しさん2012/02/15(水) 00:31:34.64
それだと一つの競馬場で36レースやらないと全レースのデータは拾えないんじゃね?
多分、一つの競馬場では1日に12レースしかやらないと思うよ。
同じ日に最大で3カ所開催するから3*12で36レースってことじゃないかな?
02112062012/02/15(水) 00:54:42.24
>>210さん
えーと、
ご指摘ありがとうございます・・・orz
私は競馬やったことないんで知りませんでした。

そうすると、開催地の変更もループ処理に掛けないといけないですね。

でも、ちょっと調べたところ、
http://keiba.yahoo.co.jp/schedule/list/2012/?month=1
ここを見たら同じ日でも場所によって開催何日目かがまちまちなので、
単純に場所だけを変えても上手くいかなそうです。
(データを取り込むURLが
[年][場所][月][開催何日目][何レース]の組み合わせですので、
日付から開催日を知る方法がないとすべてのデータが取り込めません。)
同じ日に開催する場所や日数に何か規則性があるなら良いのですが、
私は競馬のことをよく知らないので見当も付きません。
力不足で申し訳ないです。
0212デフォルトの名無しさん2012/02/15(水) 02:52:59.70
皆さんホントこんな初心者の為に考えてくださってありがとうございます!

何か別な方法考えてみます!
0213デフォルトの名無しさん2012/02/15(水) 03:05:01.57
>>212
丸投げじゃなく自力でがんばってみる気があるなら

http://keiba.yahoo.co.jp/schedule/list/2012/?month=1
↑のページからURL情報を取得すればできると思うぞ

開催年と開催月 は↑のURL にあるし
開催日はページ内にあるから対象日の 開催名のリンク先URLを取得して
レースNoを付加してやればいいと思う
0214デフォルトの名無しさん2012/02/15(水) 04:15:47.11
ありがとうございます!

なんとか頑張ってみます!!
0215デフォルトの名無しさん2012/02/15(水) 11:53:49.85
ユーザーフォームに複数の項目(名前、年齢、身長、体重など)を設定して、
空欄があった場合に「名前を入力して下さい」とかメッセージボックスで表示するようにしたいんです。

それでもし、複数の項目が空欄なら「名前を入力して下さい」「年齢を入力して下さい」と
1つのメッセージボックス内に表示されるようにしたいのです。

順列組み合わせをIFしていったらすごいことになるので短くプログラムする方法はないかなと思いまして。
IFのネストとかstrを使ってとか断片的には思い浮かぶんですけど……
0216デフォルトの名無しさん2012/02/15(水) 12:31:51.42
質問させてください。

シートにフォームのボタンを貼ったのですが、このボタンをVBAから押した
ことにする方法はあるでしょうか。
0217デフォルトの名無しさん2012/02/15(水) 14:01:56.17
>>215
何項目あるかしらんが、一つずつ検査して文字列にまとめるのが結局いちばんはやくて保守しやすいんじゃね?
Private Sub CommandButton1_Click()
Dim str As String

If TextBox1 = Empty Then
str = "TextBox1が空白です" & vbCrLf
End If
If TextBox2 = Empty Then
str = str & "TextBox2が空白です" & vbCrLf
End If
If TextBox3 = Empty Then
str = str & "TextBox3が空白です" & vbCrLf
End If
If TextBox4 = Empty Then
str = str & "TextBox4が空白です" & vbCrLf
End If
If TextBox5 = Empty Then
str = str & "TextBox5が空白です" & vbCrLf
End If
MsgBox str
End Sub
0218デフォルトの名無しさん2012/02/15(水) 14:20:34.57
>>217
なりました!
ありがとうございますm(_ _)m
0219デフォルトの名無しさん2012/02/15(水) 17:36:33.04
>>216
そのボタンを押した時に実行するプロシジャを実行すれば良いだけなのでは?
0220デフォルトの名無しさん2012/02/16(木) 01:25:02.28
横から失礼。
> そのボタンを押した時に実行するプロシジャを実行
でなく、そのボタンを押す事は出来ないの?
0221デフォルトの名無しさん2012/02/16(木) 01:40:57.51
命令文うんたらかんたら

CommandButton1_Click

命令文うんたらかんたら
0222デフォルトの名無しさん2012/02/16(木) 03:33:49.75
>>220
メッセージを送ればボタンは押せるけど
プロシージャ実行と結果は同じだから手間がかかるだけで意味がない

他の常駐アプリでボタンクリックのメッセージ監視目的とかだとスレ違い気味だし
そんだけ知識ある人がこんな質問するとは思えない
0223デフォルトの名無しさん2012/02/16(木) 09:20:50.66
>>220
UWSC使え w
02242162012/02/16(木) 10:15:08.10
みなさんありがとうございます。

>>222
どうやってシートのボタンオブジェクトを取得して、どんなメッセージを送ったらよいのでしょうか。
VC++とかはよく使いますが、ExcelVBAは初めてです。

ユーザーフォーム上のボタンは押したことにできるので、シート上のフォームのボタンも押す方法が
ないか探しております。

よろしくお願いいたします。
0225デフォルトの名無しさん2012/02/16(木) 12:51:14.76
>>224
Sub onButton()
Worksheets("Sheet1").CommandButton1.Value = True
End Sub

Sub onButton()
Worksheets("Sheet1").OLEObjects("CommandButton1").Object.Value = True
End Sub

どちらでもすきなように
0226デフォルトの名無しさん2012/02/16(木) 18:29:17.43
VBA初心者です
Excel2007
A1    ALL1
A600   ALL600
この範囲内に画像を取り込んでモザイク画を作っています。
画像サイズによっては空白部分も多いのですが空白部分を省いて印刷するにはどうすればいいでしょうか?
プリンターの関係上A1サイズなので後で組み合わせるのにヘッダーでページ番号もつけています
0227デフォルトの名無しさん2012/02/16(木) 19:00:52.59
>>226
印刷した時にどこで切れるかはHPageBreaks(n).Location
またはVPageBreaks(n).Locationで調べることができる

あとは、ページごとにセルの色が全部標準か白なら印刷しないっていう
ちょっと面倒なプログラムを書くしかない
0228デフォルトの名無しさん2012/02/16(木) 20:50:50.26
>>225
それってフォームのボタンでないんじゃない
0229デフォルトの名無しさん2012/02/16(木) 22:53:25.40
教えてください
VBAにアドインってのが有るそうなんですが、マクロをアドインとかいうものにするのはどういうメリットがあるんですか?
皆さん、どういう風につかっておられます?
02302162012/02/16(木) 23:29:29.26
>>225
ありがとうございます!
コントロールツールボックスのボタンの場合は、どのようにしたらよいでしょうか。
0231デフォルトの名無しさん2012/02/16(木) 23:37:49.90
>>230
>>225がコントロールツールボックスのボタンの場合じゃないのか
0232デフォルトの名無しさん2012/02/17(金) 08:00:18.97
>>229
アドインって .xla のこと?
.dll のように、色んなワークブックからCallされる自分用関数をまとめておくとか。
でも、キャッシュみたいのがかかっていて結果不定になるので、デバッグ面倒だよ。
0233デフォルトの名無しさん2012/02/17(金) 17:43:41.83
>>232
229です。

>結果不定になるので、デバッグ面倒だよ。

なんか扱いが大変そうだな・・・
教えていただきありがとうです
0234デフォルトの名無しさん2012/02/17(金) 17:52:06.19
>>232
> でも、キャッシュみたいのがかかっていて結果不定になるので、デバッグ面倒だよ。
んなこと全然無い。

アドインのメリット。
例えば、社内用の勤怠計算を行うマクロを書いたとする。
そのマクロが入った、データ入力用シート入りのBookを社員に配布する。
配布した後で、バグが見つかって修正したり、機能を追加したりしたくなったらどうする?

「マクロが入った、データ入力用シート入りのBook」だと、もうデータ入力済みの場合、
全員のBookをまるごと取り替えることはできないから、マクロ部分だけ入れ替える必要がある。

これを、「勤怠計算を行うマクロ」が入ったxlaと、データ入力用のBookに分けておくと、
xlaを更新したら全員に配布して、ファイルを入れ替えてねで済む。

もちろん、他言語のライブラリ同様、ライブラリとしてのメリットは全て持ってる。
0235デフォルトの名無しさん2012/02/17(金) 19:17:34.63
関数について質問です

1日  名前A  条件1
1日  名前B  条件2
8日  名前C  条件1
8日  名前D  条件2
8日  名前E  条件1
8日  名前F  条件2

とシート1にデータがあり、別シートのリストに8日で条件2に合致する名前だけを
上から順に(空白行無しで)抜き出す場合、どのような関数を使えば出来るでしょうか?
IFでやろうとするとどうしても不一致の行が空白になってしまいます。
お力添えをよろしくお願いします。
0236デフォルトの名無しさん2012/02/17(金) 19:53:43.47
>>235
VBAでではなく、ワークシート関数でってなら

Excel総合相談所 100
http://toro.2ch.net/test/read.cgi/bsoft/1325935411/l50
0237デフォルトの名無しさん2012/02/17(金) 20:33:56.12
なにそのタライ回し。いつもより多く回ってるんじゃないの。
0238デフォルトの名無しさん2012/02/17(金) 20:43:07.85
このスレはいつもこうだよ
0239デフォルトの名無しさん2012/02/18(土) 01:22:32.32
チェックシートを作成したく、
表の右に設置したボタンを押すと隣接するセルの背景色が変化するものを作っています。

ボタンの数が100程度あるのですが、ボタン1つ1つに以下の関数を格納するのには非常に手間がかかります。

Private Sub CommandButton1_Click()

With Range("A2").Interior
.ColorIndex = 36
.Pattern = xlSolid
End With

End Sub

Private Sub CommandButton2_Click()

With Range("A3").Interior
.ColorIndex = 36(省略)

一括で設定する方法はありませんか?
0240デフォルトの名無しさん2012/02/18(土) 01:26:54.85
修正です
誤 With Range("A2").Interior

正 With Range("A2:C2").Interior
0241デフォルトの名無しさん2012/02/18(土) 01:31:10.99
× チェックシートを作成したく、
○ チェックシートを作成したいのですが、

日本語は大切にね
0242デフォルトの名無しさん2012/02/18(土) 01:34:56.42
>>239-240
スレ違いな答えになるけど、条件付き書式を使ったほうがいいかと。
書式を「"○"」、条件付き書式として0より大きいなら背景色を設定とかやれば、
1を入力してやればチェックって感じに出来ると思う。
0243デフォルトの名無しさん2012/02/18(土) 01:42:17.46
>>239
コマンドボタンはどのセルに配置してあるの?
D列のセル?
02442392012/02/18(土) 02:02:35.32
>>241
失礼しました。
以後気をつけます。
>>242
ググってみましたが自分の希望に沿えるものではなさそうです。
あくまでワンクリックで背景色の変化ができるものを作成したいと思っております。
参考画像を用意いたしました。ttp://uploader.sakura.ne.jp/src/up84658.jpg

作成したいと思っているチェックシートについて
・隣接する行の背景色を変えることによるチェックをする。
※詳細
チェックボタンを押すと背景色を変化させる
(With Range("A2").Interior .ColorIndex = 36 以下略)
さらに隣の取り消しボタンを押すと背景色なし設定にする
・値の入力ではなく、ボタンをワンクリックすることで変化させる。(これが重要事項だと思われます)

例の画像は8行ですが実際に作成するものは100行以上になります。

以上になります。よろしくお願いいたします。
02452392012/02/18(土) 02:11:02.38
>>243
画像では見やすくするために中央のほうへ寄せましたが、
いわゆるD列にボタンが配置されているものと思われて結構です。

ボタン自信をセルに配置することが自分の知識ではわからないので、
配置はコピーで行ってます。(セルを選択してCtrl+vを押すだけなので我慢)
つまるところボタンのオブジェクト名の番号が1,2,3...と上昇します。

ボタンが数個なら>>239のコードを複数コピーして値を変化させることができますが、
100以上となると無理ではありませんが非常に面倒です。

そこで一括で設定する方法は無いものか模索していたところです。

多分一番重要なことを忘れていましたが私はExcelVBAについては初心者です。

度々すみません。よろしくお願いいたします。
0246デフォルトの名無しさん2012/02/18(土) 02:15:02.93
>>244
答えてあげたいが、時間がない

例えば
topleftcellを引数で渡すプロシージャを作って
それぞれのボタンクリックのプロシージャから
呼び出せば?

テキスト(プログラム)を出力するプログラムを書いて
それをインポートする手もある

クラスモジュールを使うか
0247デフォルトの名無しさん2012/02/18(土) 02:56:50.47
>>244
よくわからんがこんなのでいいのか?

' ボタンを D5 から 10個作成
Sub CreateButtons()
Set baseaddress = ActiveSheet.Range("D5")
For i = 1 To 10
CreateButton baseaddress.Cells(i, 1)
Next
End Sub

Sub CreateButton(cell)
x = cell.Left
y = cell.Top
w = cell.Cells(2, 2).Left - x
h = cell.Cells(2, 2).Top - y
Set btn = ActiveSheet.Buttons.Add(x, y, w, h)
btn.Text = "chk"
btn.Name = "chkbtn_" & cell.Row
btn.OnAction = "CheckButton_Click"
End Sub

Sub CheckButton_Click()
Row = Mid(Application.Caller, 8)
With Range("A1").Cells(Row, 1).Interior
.ColorIndex = 36
.Pattern = xlSolid
End With
End Sub
02482472012/02/18(土) 03:13:52.81
一応簡単に説明しておくと
ボタンクリックのイベント内からは Application.Caller でクリックしたボタン名が取得できる
ボタン名をあらかじめ chkbtn_<行番号> として作成しておき、イベント内で行番号をボタン名から切り出して現在の自分の行番号を取得している
イベント内でボタン名が取得できるので、クリックのイベントプロシジャを個別に作成する必要はなく、すべて共通でよい

この例はチェックボタンだけだけど、当然同じやり方でクリアボタンも作成できる
02492392012/02/18(土) 03:25:21.74
>>247
試してみましたがうまく動作しませんでした。
多分こちらのボタンの置き方が悪いのかもしれません。
(前述の通りExcelVBA及びコンソールの配置等は初心者です。すみません。)
また関数の大まかな意味も知っておきたいのですが、
もしお時間が許すのであればご教示のほどをお願いします。
02502392012/02/18(土) 03:26:41.00
>>247
書き込み中のすれ違いになってしまいました。
ありがとうございます!!
もう一度試してみます。 
02512392012/02/18(土) 03:45:13.45
>>247
すみません何度か試行錯誤を繰り返してみましたがどうにもうまく動作しません。
お手数ではありますが扱い方のご教示、
もしくはソースファイルのアップロードをお願いいたしたいのですが。
0252542012/02/18(土) 03:52:25.06
>>241
別に間違ってないよ。
0253デフォルトの名無しさん2012/02/18(土) 04:37:15.26
>>251
俺は247さんじゃないけど、
247さんのコードを標準モジュールにコピペするだけで動いたよ
(全部コピペして、Sub CreateButtons() を実行)
ちなみに環境はWin7 64bit、Excel2000、です

むしろ貴方がどのようにやったのかを具体的に提示したほうが早いと思う。
たとえば上記コードを標準モジュールじゃなくボタンに貼り付けたりしてないよね?
02542392012/02/18(土) 05:25:47.81
>>253
今までシート自体にコードを貼り付けていました。
標準モジュールを新たに挿入して貼り付けたら無事動作いたしました!
大変勉強にもなりました。

ご回答していただいた皆様本当にありがとうございました。
ソースコードを記述いただいた>>247さんには感謝の限りです!
本日は朝も近いのでお休みいたします。
最後に改めてありがとうございました。
0255デフォルトの名無しさん2012/02/18(土) 06:44:14.37
俺もこれ利用したいけど 単一のセルしか塗りつぶしできない
どうすれば行を(この場合だとA2からC2までの)指定出来ますかね
02562532012/02/18(土) 09:55:21.93
>>255
With Range("A1").Cells(Row, 1).Interior
を
With Range("A1").Cells(Row, 1).Resize(, 3).Interior
にするとAからCの3列が書き換わる
0257デフォルトの名無しさん2012/02/18(土) 13:19:54.76
すみません>>247のコードでボタンを二つ作りたいのですが、
標準モジュールを新たに挿入すると内容が二つとも同じになってしまいます。
対処法を調べても理解できないのでどなたか教えてください。
0258デフォルトの名無しさん2012/02/18(土) 13:37:55.77
>>257
Sub CreateButtons()
Set baseaddress = ActiveSheet.Range("D5")
For i = 1 To 10
CreateButton baseaddress.Cells(i, 1), True
CreateButton baseaddress.Cells(i, 2), False
Next
End Sub
Sub CreateButton(cell, check)
x = cell.Left + 4
y = cell.Top + 2
w = cell.Cells(2, 2).Left - x - 4
h = cell.Cells(2, 2).Top - y - 2
Set btn = ActiveSheet.Buttons.Add(x, y, w, h)
btn.Text = ""
btn.Name = "chkbtn_" & cell.Row
If check Then
btn.OnAction = "CheckButton_Click"
Else
btn.OnAction = "ClearButton_Click"
End If
End Sub
02592582012/02/18(土) 13:38:28.19
続き

Sub CheckButton_Click()
Row = Mid(Application.Caller, 8)
With Range("A1").Cells(Row, 1).Interior
.ColorIndex = 36
.Pattern = xlSolid
End With
End Sub

Sub ClearButton_Click()
Row = Mid(Application.Caller, 8)
With Range("A1").Cells(Row, 1).Interior
.Pattern = xlNone
End With
End Sub
02602532012/02/18(土) 13:46:16.46
>>257
具体的にはどう調べたの?
これって調べてどうこう言うような次元の話じゃなくて
単純にVBAのプログラムが読めるかどうかの話だよ。

一応説明すると、247氏のコードは3つのプロシージャから構成されてるけど、
Sub CreateButtons() は単に最初のセル位置(D5)を決めて、
そこから下方向に10回同じことを繰り返す、って言う処理だけを指示している。
次の Sub CreateButton(cell) で指示されたセル位置にボタンを作る作業をしている。
作るボタンの名前は"chkbtn_"に何番目のボタンかを示す数字1~10が付いたもので、
そのボタンの動作は"CheckButton_Click"で指定されたものになる

で、最後の Sub CheckButton_Click() は上で書いたとおり、
そのボタンがクリックされたときの動作を指定している。
つまり、ボタンの名前"chkbtn_"+番号 の番号部分からセルの行位置を割り出して
その行の色を塗り替えてるわけ。

だから取り消しボタンを作りたいなら2番目のプロシージャに取り消しボタンを作る処理を追加して、
3番目と同様に取り消しボタンの動作を指定する4番目のプロシージャを書き足す作業をすれば良いんだよ。

これだけ説明されて分からないなら、多分今の貴方には作れないと思うよ
02612532012/02/18(土) 13:51:56.14
って俺が長々説教かいてる間に
>>258さんがコード作ってくれちゃったね。
>>257良かったな。

でもこういうのただ丸投げするより
動作原理を理解して自分でいじれるようになった方が良いから
自分でもがんばってね
0262デフォルトの名無しさん2012/02/18(土) 14:07:08.52
>>258
一部修正必要だけど、257には無理かもね
0263デフォルトの名無しさん2012/02/18(土) 14:24:35.19
Application.Caller ってボタン名というかオブジェクト名しか取れないのが使いにくいけど、
あらかじめ Dictionary 使ってオブジェクト名をキーにして情報格納しておけば、
ボタンクリックでオブジェクト名から数字だけを切り出すまでもなく、
座標やチェック/クリアの属性なんかも関連付けできるようになるのでいろいろ応用は効く
02642532012/02/18(土) 14:34:40.85
今更だけど>>260に間違いがあったので修正
>作るボタンの名前は"chkbtn_"に何番目のボタンかを示す数字1~10が付いたもので、
は1~10じゃなくてそのボタンの行が入ってる。最初のボタンがD5だから5~14になるね

>>262
あ、ほんとだ塗りつぶしボタンと取り消しボタンに同じ名前指定してるね
とりあえず
btn.Name = "chkbtn_" & cell.Row
の部分も
If check Then
の中に入れて条件分岐で名前変えるのが早いかな
取り消しは"clrbtn"とかだね
0265デフォルトの名無しさん2012/02/18(土) 14:47:53.44
>>264
いやオブジェクト名は、どのみち影響しないけど
修正したいと言うと予想されるのはキャプションのほうね
0266デフォルトの名無しさん2012/02/18(土) 17:18:24.54
こんにつわ
alt+F11押したらVBAProjectパスワード、要求されたんだけど、へるぷみー
0267デフォルトの名無しさん2012/02/18(土) 17:29:55.96
事故解決下
0268デフォルトの名無しさん2012/02/18(土) 23:05:13.47
Excelで「平成1年」を「平成元年」と表示させるための一番簡単な方法はなんですか?
ちなみに昭和や平成の他の年もいっぱいまざっています。
0269デフォルトの名無しさん2012/02/18(土) 23:20:54.49
Replace(s, "平成1年", "平成元年")
0270デフォルトの名無しさん2012/02/19(日) 00:13:58.80
> 昭和や平成の他の年
の考慮が漏れてるではないか。
0271デフォルトの名無しさん2012/02/19(日) 00:20:14.51
[^0-9]1年
02722682012/02/19(日) 00:58:11.82
>>269
でかした!

>>270-271
どういうこと?
0273デフォルトの名無しさん2012/02/19(日) 03:27:02.71
風邪で寝込んでて暇だからやってみた。バグがあるかもしれんから取扱注意。

年だけの場合
Public Function 元年変換From年(paramValue As String) As String
Dim i As Integer, yearValue As String
元年変換From年 = paramValue
For i = 1 To Len(paramValue)
If Mid(paramValue, i, 1) Like "#" Then yearValue = Mid(paramValue, i): Exit For
Next i
If Val(yearValue) = 1 Then 元年変換From年 = Replace(元年変換From年, Val(yearValue), "元")
End Function

年月日の場合
Public Function 元年変換From年月日(paramValue As String) As String
Dim paramDateValue As Date
paramDateValue = DateValue(paramValue)
元年変換From年月日 = Format(paramDateValue, "ggg") & IIf(Format(paramDateValue, "e") = 1, "元", Format(paramDateValue, "e")) & Format(paramDateValue, "年m月d日")
End Function

※ 年月日の方であり得ない日付(平成1年1月1日など)を入れると本来の日付(昭和64年1月1日など)に変換される。
0274デフォルトの名無しさん2012/02/19(日) 06:24:27.04
>>272
>>269では誤動作するケースがある、というのは分かる?
経験があれば、真っ先に>>270-271のようなことが浮かぶもんだよ。
0275デフォルトの名無しさん2012/02/19(日) 06:39:48.49
Excel上での表示の話なんだから…
「Excel 1年 元年」でググってみ。いろいろやり方があって面白いよ。

第1位に出てる、セルの表示形式を
[<32516]ggge"年"m"月"d"日";[>32873]ggge"年"m"月"d"日";"平成元年"m"月"d"日"
にしろってヤツ、いかにもExcel臭いがCool…なのかなw
自分的には、文字列にしてから置換する方が好きだ。
0276デフォルトの名無しさん2012/02/19(日) 07:14:45.79
元号使わなきゃ無問題
0277デフォルトの名無しさん2012/02/19(日) 07:17:24.42
>>275
VBAスレでセルの表示形式の回答?
0278デフォルトの名無しさん2012/02/19(日) 11:10:34.97
今特別養護老人ホームに勤めていて、頭を使って手書きで勤務表を作っています
ExcelのVBAで自動で勤務を割り振ってくれる勤務表は作れますか?
0279デフォルトの名無しさん2012/02/19(日) 11:11:32.23
特定のファイルの追加、削除の監視をDO〜LOOPで行おうと思うのですが、
監視を任意のタイミングで終了させるにはどうしたらいいでしょうか?
0280デフォルトの名無しさん2012/02/19(日) 11:19:38.11
>>278
作れる。簡単ではないけど。
コツコツやって具体的にわかんない部分が出たらまた来ればいい。

>>279
終了フラグを用意して、DO〜LOOP前でクリアDO〜LOOP内でチェック。
終了ボタンなどで終了フラグを書き換える。

0281デフォルトの名無しさん2012/02/19(日) 11:21:42.39
>>279
Exit Do
02822792012/02/19(日) 11:30:53.47
早速のレス、ありがとうございます。
ループ中に終了ボタンって押せるんでしょうか?
UserFormにスタートボタン、終了ボタンを置いてテストしてるんですが、
ループ中は終了ボタンが押せません。
フォーカスを終了ボタンに移すこととかってできるんでしょうか?
ループ中でもボタンを押すにはどうすればいいんでしょうか?
よろしくお願いします。
0283デフォルトの名無しさん2012/02/19(日) 11:35:10.73
>>282
DO〜LOOP内、各行前後にDoEvents入れて見。
足りなそうなら増やして見。
02842792012/02/19(日) 11:38:53.91
>>283
できました。
ありがとうございました。
0285デフォルトの名無しさん2012/02/19(日) 16:29:31.34
Do〜LOOP使うならWhile使えよ
0286デフォルトの名無しさん2012/02/19(日) 18:01:02.40
そーいえばどっかで平成が何年までか求めるコードがあったな
0287デフォルトの名無しさん2012/02/19(日) 18:45:33.02
>>286
> 平成が何年までか求める

宮内庁から怒られるんじゃないのか…
0288デフォルトの名無しさん2012/02/19(日) 19:17:04.08
今年で,,,, ゲフンゲン
02892782012/02/19(日) 19:36:06.20
>>280
ありがとうございます、コツコツやってすぐ分からなくなってまた来ます
その時は教えて頂けたらありがたいです
0290デフォルトの名無しさん2012/02/19(日) 19:52:21.66
こちらでも質問させてください。
会社では2010、家では2003を使用して「終了」ボタンを押すと「終了」する
VBAを作成しています。Webページとして保存した場合、ボタンを押しても
起動しません。Webページとしてボタンを押せるようにするには
Sub ()
Dim rc As Long
rc = MsgBox("○○を終了しますか?", vbYesNo + vbQuestion)
If rc = vbYes Then
Application.Quit
Windows("ファイル名.xls").Close True
Else
MsgBox "いいえが選択されました。", vbExclamation
End If
End Sub
としてどこを変更すれば良いでしょうか?
0291デフォルトの名無しさん2012/02/19(日) 20:16:12.70
堂々とマルチ宣言

時代変わった? w
0292デフォルトの名無しさん2012/02/19(日) 22:47:40.35
こんにつわ、質問です。

With ActiveSheet.QueryTables.Add(Connection:=で、Web上のテーブルを取り込んだのですが、このテーブルの指定セルだけを取り込むにはどうすれば良いですか?
0293デフォルトの名無しさん2012/02/19(日) 23:20:17.56
>>289
勤務表作成なら興味があるので手伝ってもいいですよ
ただプロバイダが2ちゃんで書き込み禁止になることがよくあるので
書けるときだけですが

とりあえずググって見ましたか?
自分の業務で自分だけが使うのなら作りやすいのですが
自分の異動など他の人に業務を任せることも考えると
画面デザインが重要になりますね
0294デフォルトの名無しさん2012/02/19(日) 23:25:53.88
すいません、多分超簡単なんでしょうけど質問させて下さい

最近VBAを勉強し始めましたのですが、あるセルを基点(仮にA5)としてそこから左端にアクティブセルを移動した後、
仮にAA,AAAと言う文字が来たら、そのセルから右に5列の場所にaa、
BB,BBBと言う文字の場合はbbと言う文字を、それ以外の場合はメッセージボックスにccとでるようにして、
その後一行下に移動して、上記の作業を仮に10回繰り返していき、最後はA1にアクティブセルを移動させると言う問題があったのです。

それを変数を使って解くというようなことがあったのですが、

sub ()
Dim z As String , i As Integer
Range("A5").Select
For i = 1 To 10 Step 1
z = ActiveCell.Value
Select Case z
Case = "AA","AAA"
ActiveCell.Value="aa"
ActiveCell.Offset(0,5)
Case ="BB","BBB"
ActiveCell.Value="aa"
ActiveCell.Offset(0,5)
Case else
MsgBox"cc"
End Select
ActiveCell.Offset(1,0)
Next i
Range("A1").Select
End sub

としたのですが、うまくいきませんでした。どこが間違ってるのか自分ではわからなかったので教えて下さい
こんな初歩的な質問でスイマセン・・・
0295デフォルトの名無しさん2012/02/20(月) 00:11:23.16
>>294
OffsetはRangeオブジェクトを返すプロパティ…
とか言う以前に論理的に変だよ
プログラム知らない人でもこんなコードは書かない

ActiveCell.Offset(0,5).Value="aa"
とか
ActiveCell.Offset(0,5).Value="bb"
とか
ActiveCell.Offset(1,0).Select
として見れば?
02962782012/02/20(月) 00:25:03.13
>>293
ホントですか!?
ありがとうございます
色々ググって見て、とりあえずデザインから作り始めてます
自分が使うだけなので特に問題ないです
複雑だから結構難しそうですね・・・
0297デフォルトの名無しさん2012/02/20(月) 00:38:53.21
>>296
>自分が使うだけなので特に問題ないです
仕事に使うならこの考え方はないです
エンドユーザコンピューティングの典型的な悪いところ
業務にVBAを使う以上、他の人が使えることが最低条件です
02982782012/02/20(月) 00:42:20.32
>>297
そうですよね・・・
異動になったりしたとき他の人が使えないと困りますしね
気をつけて作っていきたいと思います
0299デフォルトの名無しさん2012/02/20(月) 01:13:25.65
>>298
エンドユーザーコンピューティングでやりがちなミス

・ 変数等の名づけが行き当たりばったり
・ 変数等の用途が途中で変わっても名前を放置
    →  名づけのルールを決めて、それに従う。もしずれたら補正する。
変数やSub、Functionの名前がバラバラだとソースを見る時、一々定義を確認しなきゃならない。
自前のルールで決めて、それに従ってればわりと見やすくなる。

・ 設計の時に考慮した事・あえて無視した事を書き残さない
    →  メモ書きの内容も含めてあとで読んでもわかるように資料化する
資料がないと、バグが発生した時に考え方のバグなのかプログラム化する段階でのバグなのか切り分けが大変。

・ 資料を作っても読み返さない
    →  資料化したものは月に1回ぐらいは読み返してみよう。
慣れていないと、必要な事が抜け落ちた資料になったりする。

・ 必須機能や各種条件などを決める前にプログラミングを始める
    →  少なくとも基本方針、前提条件、などはプログラミング前に資料にまとめよう。
固定で必須な条件と、人数の増減などで変更が発生する条件ぐらいは切り分けてからプログラミングした方が楽。

・ 同じことの繰り返しを何か所にもコピペ
    →  同じことはFunctionやSubにまとめてそれを呼び出す。
ミスがあった場合それもコピペで増えるので、ソース内でのコピペは可能な限り避ける。

方針メモ出来たらうpしてみ。
03002782012/02/20(月) 07:57:10.04
>>299
そんなに色々あるのですか・・・
これ教えてもらってないと大変なことになってました;
とりあえず基本方針?と前提条件をまとめてみます
03012942012/02/20(月) 08:01:46.57
>>295
ありがとうございます
やっぱり独学じゃダメなのかな・・・
もっと勉強します
03022782012/02/20(月) 09:49:16.54
とりあえず思いついたメモを羅列
・人によってできる勤務が異なる(夜勤1は出切るが夜勤2は出来ない等)
・夜勤はなるべく連続しないようにする(夜勤、明け、休み、夜勤・・・)
・早番がすぐに来ないようにする(早番、日勤、休み、早番)
・前月の夜勤の明け、明け休みも考慮する。早番も
・希望休、希望勤務を入力できるようにする
・同じ番号の勤務はなるべく続かないように
・休みも偏らないようにする
・勤務は各回数入力できるように(休みも9回の時などあるので入力)

もっとある気がしますが、この時点で凄く難しそう…
0303デフォルトの名無しさん2012/02/20(月) 10:07:26.30
>>302
ナーススケジューリング問題(ググれ)に匹敵するような要件の場合、勤務表を作成するのはすごく困難。
0304デフォルトの名無しさん2012/02/20(月) 10:36:51.36
>>302
最初から自動割振りするシステムは難しいから、
割振り入力してボタンを押すと問題がある割振りに色を付けるシステム
(夜勤連続だと赤、休み集中だと青など)
を作ってみたら?

0305デフォルトの名無しさん2012/02/20(月) 13:05:17.31
>>303
あんまりおどすなよ。
0306デフォルトの名無しさん2012/02/20(月) 13:41:17.42
>>302
落ち着け。

勤務表作成を新人に引き継ぐ感覚でまとめてみ。
それもおまいさんが急用でどうしても質問受けれない場合にどう引き継ぐか。

その感覚でまとめれば要件資料としてはそれなりになるはず。

「すごく困難」って言ってる人がいるけど、正攻法で1からやろうとすると困難かもね。
単純ロジックで乱数うまく使って種表作って、
補正が手詰まりになったら最初からやり直すプログラムにすれば、
表が完成するまでの時間はかかるけどなんとかなる。

0307デフォルトの名無しさん2012/02/20(月) 14:10:35.11
>>306
> 補正が手詰まりになったら最初からやり直すプログラムにすれば、
> 表が完成するまでの時間はかかるけどなんとかなる。

それ、いつ終わるの?
組み合わせ爆発、半端ないよ?
0308デフォルトの名無しさん2012/02/20(月) 14:52:45.60
>>306
仮に要件が固まったとしても、それを実現できるコードを書けるとは限らない。

汎用的なシフト勤務ソフトがそれほど出回ってないのは、それぞれの職場の都合が大きく異なるのということより、
やはりシフト勤務作成そのものが難しいからだと思う。

実際ナーススケジューリング問題でググればわかると思うが、正攻法では無理なのでGAによる解法がかなり
研究されてる。
03092782012/02/20(月) 16:18:27.47
ナーススケジューリングは気をつけないといけないんですよね・・・
やっぱりそこが難点ですか困難なほどに;

引継ぎ感覚でもう少し具体的にまとめてみます

コード書くのはほとんど初心者で何から手をつけたらいいのか全然分からないですが…
少しずつでも頑張っていきます
0310デフォルトの名無しさん2012/02/20(月) 16:35:41.36
勤務表に関しては入力支援を強化してアナログ入力した方が早いんだよな

ボタンひとつで終われば楽っちゃ楽なんだけど
継続的に使えるプログラムを作成する労力と、1ヶ月のうち勤務表作成にかける労力を考えると
どうしてもアナログ入力になる。

>>309
つーか、この件に関しては引継ぎなんて考えるなよw
できる人ができる形でやればいいんだよ
どうせ素人が扱えば余計な動作やエラーで詰むし
そこそこ使える人ならそれなりのモノ作るんだから
0311デフォルトの名無しさん2012/02/20(月) 19:27:43.39
つーかさ、>>278はNSPの一般解求めるのが目的じゃなくて
職場の勤務表を作るのが目的なんだから
とりあえず作成に必要な要件をもっときちんと書き出してみたらどうよ。
>>302の情報だけじゃ結局>>278にしか分からんじゃん。
たとえば勤務シフトには何種類あるのか、(明、早、日、夜1、夜2、休の6種類なのか?)
スタッフ何人いて各シフトにはそれぞれ何人割り振るのか、
そのうち何人がシフトに制約があるのか、etc.
具体的に書き出したらそこそこ何とかなるかも知れんのと違う?
まぁ現状で(手書きの状態で)どの程度満足できるシフトを作れてるのか
もわからんから、あんまり厳しい条件だと自動化は無理だろうけど。
0312デフォルトの名無しさん2012/02/20(月) 20:33:52.13
実際の勤務表に近いものをどこかにUploadしてください
他業界の人に勤務表作成を依頼するつもりで説明してください
03132782012/02/20(月) 20:49:48.30
そうですね、それでは確実なところから
・勤務は 早番、日勤、夜勤1、夜勤2、明け、休み、有給、研修
 日勤は2番、3番・・・とあり多いときで(行事などの日)10番とかも
 土曜、日曜日は4番、5番までなど少ないことが多い
 平日は大体6番、7番以上まで欲しい(希望休が重なるなどで5番までのこともあり)
 正職、パート、嘱託?や人により可能な勤務が違う
 パートには休みを全部自分で指定する人もいたり。
 一日の勤務で最低 早番、2番、夜勤1、夜勤2、明け*2、明け休み*2が正職か嘱託でいる
 夜勤ではこの人とこの人は一緒にできない、がある
 早番はやったら次の早番まで5日は間が欲しい
 夜勤は基本連続しないように(夜勤、明け、休み、夜勤…無理ならOK)
 先に勤務を希望している場合あり(早番、夜勤なども)
 前の月の夜勤の明け、明け休みも考慮する
 休み、同じ番号の勤務はなるべく連続しないように。偏りのないように
 休みは基本月10回。月により前後することあり、又多い人もいる

とりあえずシフトに関することはこれくらいかな・・・
0314デフォルトの名無しさん2012/02/20(月) 21:46:17.55
連続したセルに値を書き込むのに簡単な方法は無いでしょうか?
セルに値を書き込むと、自動的に隣のセルにフォーカスが移動するみたいな
0315デフォルトの名無しさん2012/02/20(月) 21:59:23.91
看護士の勤務表は、準夜・深夜・休みを縦横計算しとけばいいと思う。
あとは、希望勤務の登録かな・・・
0316デフォルトの名無しさん2012/02/20(月) 22:10:25.86
>>314
それをVBAでやりたいって事?
エンター押すと横移動はオプションで設定できる。
0317デフォルトの名無しさん2012/02/20(月) 22:11:21.36
>>313
だ・か・ら・他業種の人相手にその説明で理解できると思う?
何番ってのは人数なのか?だったらなんで
>早番、2番、夜勤1、夜勤2、明け*2、明け休み*2
って一番が居なくて2番が居るんだ?
これだと1日8人が必要ってことだが
>日勤は平日6番、7番以上欲しい
ってのはこの8人には含まれてないのか?
そもそもこのシフトを全部で何人で回してるんだ?
(これ一番重要かもしれない)

>>314
それ普通にエンター押せば次のセルに行くじゃん。
エンター押下で上下左右のどちらに行くかは
ツール=>オプション=>編集から
"入力後にセルを移動する" の "方向"で変えられる。
0318デフォルトの名無しさん2012/02/20(月) 22:12:20.14
>>314
VBAと関係なく、普通に移動するんじゃないの。
下方向か横方向かは設定次第だが。
03193142012/02/20(月) 22:25:10.40
自己解決しました、レス有難うございます

Private Sub Puts(s As String)
Dim r As Long, c As Long
r = ActiveCell.row
c = ActiveCell.Column
Cells(r, c) = s
Cells(r, c + 1).Select
End Sub
03202782012/02/20(月) 22:29:35.78
説明難しいですね…
早番=1番と考えていただければいいです
平日7番までというのは日勤者(2番〜7番の6人)です
今現在は正職が13人、嘱託が1人、パート2人、(関係ないけどお掃除さん1人)
ただ3月で正職と嘱託が1人ずつやめます

パスは vba です
これは勤務表
http://www.dotup.org/uploda/www.dotup.org2664409.jpg.html
勤務表の一番右になります
http://www.dotup.org/uploda/www.dotup.org2664415.jpg.html
これが当番表になります。
実際作りたいのはこっちで考えています
http://www.dotup.org/uploda/www.dotup.org2664419.jpg.html
0321デフォルトの名無しさん2012/02/20(月) 22:29:39.19
そんなもん必要になる状況がよくわからん。
0322デフォルトの名無しさん2012/02/20(月) 22:36:30.41
>>320
質問。
明けについて。夜勤明けの勤務なの?それとも明け休み?
それは夜勤と確実にペアなものなの?夜勤だけで明けがない場合もあるの?
0323デフォルトの名無しさん2012/02/20(月) 22:44:58.89
>>320
現状のままだと3月以降に条件を満たすのは無理
NSPがどうこう言う以前に延べ人数で考えたらすぐ分かる

まず一個目の画像から1日平均10人が勤務する必要があることがわかる。
つまり1ヶ月で延べ300人必要

対してスタッフは3月以降14人(16-2=14)、
この人たちが月平均10日休むってことは20日働くってことで
20*14=280人ってことで、300-280=20人 => ちょうど1人分足りない

ってことで、15人以上居ないとあなたの施設は回らない
0324デフォルトの名無しさん2012/02/20(月) 22:45:15.43
>>321
帳票付けるときに重宝する
TABキー使わずにテンキーとエンターだけで表の端まで行ったら先頭列の1行下に移動できるし
03252782012/02/20(月) 22:49:31.98
>>322
夜勤は(夜勤、明け、休み)で1セットは確実です
明けが無いとかはないです

>>323
一応来年度に新しい職員が2人入るのと異動で何とかなるとは思いますが…
それでも厳しいのには変わりないんですよね
0326デフォルトの名無しさん2012/02/20(月) 23:03:01.95
>>278
資料をまとめなおしてみたよ。読んでみて違う所の指摘と、研修について月何回とか決まってるかとか、教えてプリーズ。

278番様向け 勤務シフト表入力支援システム要件書 (ドラフト)

1.職員の種類
 正職、パート、嘱託などがあり。
 人によって可能な「勤務」に違いがある。(パートは日勤3番以降のみ。)

2.勤務の種類
 早番、日勤(2番〜10番)、夜勤1、夜勤2、明け、休み、有給、研修などがある。
 同じ種類・番号の勤務(および休み)はなるべく連続しないように。偏りのないように。
 最低限必要な1日の勤務人数は
 早番、日勤(2番〜5番)、夜勤1、夜勤2、明け、明け、休み、休み
 の11名。(休み2名は前々日の夜勤1、夜勤2。強制。)

3.早番
 別名1番。

4.日勤
 2番、3番・・・と(行事などの日)10番ぐらいまである
 平日は大体6番、7番以上まで欲しい(希望休が重なるなどで5番までのこともあり)
 土曜、日曜日は4番、5番までなど少ないことが多い

つづく・・・
0327デフォルトの名無しさん2012/02/20(月) 23:03:49.82
つづき

5.夜勤
 夜勤ではペアを組ませられない組み合わせがある。
 夜勤は基本連続しないように(夜勤、明け、休み、夜勤…可能な限りにならないよう…)
 前の月の夜勤の明け、明け休みも考慮する

6.明け
 夜勤の翌日は自動的に入る。

7.休み
 休みは基本月10回。月により前後することあり、又多い人もいる
 パートには休みを全部自分で指定する人もいたり。
 夜勤の翌々日は自動的に入る。

8.研修
 − 未稿 −

9.有給
 有給休暇。

-以上-
03282782012/02/20(月) 23:18:59.70
とても綺麗にまとめていただいてありがとうございます
>人によって可能な「勤務」に違いがある。(パートは日勤3番以降のみ。)
パートで3番ができない人もいます(一応)

休みは年間を通して計算しているので(年度始めには回数は決まっていますが)
9回だったり11回だったりします
休みが多い人というのはパートの人で、配偶者の給料から計算して入れているようです

研修は出張みたいな感じで、休みではないけど職場にはいないとなります
月に一度あるかないか(無いことのほうが多い)であっても一人だけです
0329デフォルトの名無しさん2012/02/20(月) 23:43:30.36
278番様向け 勤務シフト表入力支援システム要件書 (ドラフト2)

1.職員の種類
 正職、パート、嘱託などがあり。
 人によって可能な「勤務」に違いがある。(パートは日勤3番以降※のみ。)
 ※ 人によっては日勤4番や5番しかできない。

2.勤務の種類
 早番、日勤(2番〜10番)、夜勤1、夜勤2、明け、休み、有給、研修などがある。
 同じ種類・番号の勤務(および休み)はなるべく連続しないように。偏りのないように。
 最低限必要な1日の勤務人数は
 早番、日勤(2番〜5番)、夜勤1、夜勤2、明け、明け、休み、休み
 の11名。(休み2名は前々日の夜勤1、夜勤2。強制。)

3.早番
 別名1番。

4.日勤
 2番、3番・・・と(行事などの日)10番ぐらいまである
 平日は大体6番、7番以上まで欲しい(希望休が重なるなどで5番までのこともあり)
 土曜、日曜日は4番、5番までなど少ないことが多い

つづく

0330デフォルトの名無しさん2012/02/20(月) 23:44:17.04
つづき
5.夜勤
 夜勤ではペアを組ませられない組み合わせがある。
 夜勤は基本連続しないように(夜勤、明け、休み、夜勤…可能な限りにならないよう…)
 前の月の夜勤の明け、明け休みも考慮する

6.明け
 夜勤の翌日は自動的に入る。

7.休み
 正職、嘱託の休みは基本月10回。
 月により前後することがある。(1年間の回数は決まっており、兼ね合いで調整。)
 パートは人によって回数が違う。
 パートには休みを全部自分で指定する人もいたり。
 夜勤の翌々日は自動的に入る。

8.研修
 出張による研修。多くても月1回1名程度。

9.有給
 有給休暇。
0331デフォルトの名無しさん2012/02/21(火) 00:13:58.53
>>278
提案。

当面の目標は入力支援とし、下記の機能を実現。

1.条件に合わないモノを検出する機能
2.一意で決まるモノを自動入力する機能(夜勤→明け→休み)
3.コンボボックスによる候補での入力(条件によってソートする。)

この辺りが出来ればかなり楽になるんじゃね?
03322782012/02/21(火) 00:26:44.73
>>329
まとめなおしていただいてありがとうございます
改めてまとめると自分でも分かりやすいですね

>>331
それくらいのほうがいいのでしょうか
やっぱり自動で作成はかなり困難ですかね…
03333312012/02/21(火) 00:45:10.26
>>332
順番の問題だよ。
自動生成を作っても調整は必要になるんだろ?

まずは調整と入力を支援する機能を作る。
  ↓
休みの事前入力とかを作る。入力部分に連動させる。
  ↓
手動部分を少しづつ自動化。

こうすれば、途中段階のものでも活用できる。

最初から大風呂敷やると時間が無くなる一方で何も出来上がらないと思う。

0334デフォルトの名無しさん2012/02/21(火) 00:53:59.72
>>332
331ではないけど、
自動化は総当たりとかで頑張れば不可能ではないと思うけど融通がきかないと思う
ある人が骨折して2週間以上抜けてしまうとか
この二人組は両方新人なのでばらばらにしたいとか
都合で休みを振り返る人が結構いるとか
そういう例外までも自動化で対応するのはかなり困難
その点入力支援はそういった例外にも強い

自動化しても融通がきかないとまったく使えないシステムになりかねない
最初に入力支援を作って様子をみて、いけそうなら最初のシフト表を自動作成することを考えればいい
0335デフォルトの名無しさん2012/02/21(火) 03:00:13.24
人員マスターテーブル作って、各人可能なシフトパターンを網羅
表に希望の休みを入力して空いてるセルに人員マスターテーブルからランダムで勤務パターン取得
そしてアナログで手直しするのが一番早いんじゃね?

入力支援に関してはchangeイベントとVlookup使えばテンキーだけで行ける。
0336デフォルトの名無しさん2012/02/21(火) 04:06:23.05
そろそろ別の所でやってくれないかな
0337デフォルトの名無しさん2012/02/21(火) 07:17:54.61
>>278
当番表の構造が分からないので説明お願いします
03382782012/02/21(火) 07:22:49.41
なるほど、それなら入力支援も使えるしいいですね
とりあえずはそちらから取り掛かろうと思います

>>336
すみません;こう長くお話しちゃお邪魔でしたね…

>>337
当番表の構造・・?
0339デフォルトの名無しさん2012/02/21(火) 07:33:18.93
>>338
わかりました
当番表は勤務表の縦横を入れ替えて
番号順に並べ替えたものなのですね
0340デフォルトの名無しさん2012/02/21(火) 10:43:55.13
いつまでVBAと関係無い話してんだよ
0341デフォルトの名無しさん2012/02/21(火) 14:07:24.52
Excel2002を使っています。
あるテキストファイルの最終行から4行目(4行目だけ)の値を取りたいと考えております。

最終行取得はヤフー知恵袋にありましたのでこれを使おうと思います。
Do While Not EOF(1)
Input #1, MyString
cnt = cnt + 1 ’cnt=行数
Loop

Line Input では何行目とか言う指定はできないようで
どのように指定行を取るかが分かりません。
ググッたら「Line Input で空読み」という事までは分かりましたが
空読みの意味が分かりません・・・

ここから指定行を取得するにはどのようにすればいいのでしょうか?
0342デフォルトの名無しさん2012/02/21(火) 14:34:53.26
行番号を指定して読むことは出来ない。

処理時間をあまり気にしないなら、配列
MyString(3) as string
を作って、ファイルの先頭から行を読むたびに0->1->2->3->0->1->...と保存していけば、
最も古いデータが最終行から4行目。

dim index as long
index = 0

Do While Not EOF(1)
Input #1, MyString(index)
index = index + 1
if index = 4 then
index = 0
end if
Loop
0343デフォルトの名無しさん2012/02/21(火) 14:58:15.15
278さんではありませんが
勤務表の別スレを立てましたのでどうぞ

ExcelVBAで勤務表を作ろう
http://toro.2ch.net/test/read.cgi/tech/1329803312/
0344デフォルトの名無しさん2012/02/21(火) 15:08:17.97
>>342
ありがとうございます。
配列に入れるとは全く思いつきませんでした。
目から鱗が落ちる回答勉強になりました。
希望通りの結果が得られました。
ありがとうございました。
03452782012/02/21(火) 19:21:52.87
>>343
本当にありがとうございます
本来自分がやるべきことなのに・・・
これからはそちらに書き込むようにいたします
0346デフォルトの名無しさん2012/02/21(火) 19:34:06.17
すいません、VBAでスレタイ検索したらここに流れ着いたのですが、初心者用の質問スレってありますか?

表内で、ある列の書かれている文字ごとにその行の背景色を変えていくと言うマクロを
VBEでモジュールに書きたいのですが、イマイチイメージが浮かばなくどうしていいかわからない状況です

足の骨折で入院してて勉強が遅れてしまったので急いで追いつきたいのですが、
おそらく簡単であろうこんな問題もわからなくなってきた次第です・・・

変数を使用して、繰り返しの処理をし、RangeとCellsを使って解けと言われたのですが???と言う状況です

そこで初心者用のスレがあったら誘導願います
スレ違いでスイマセン
0347デフォルトの名無しさん2012/02/21(火) 19:45:46.58
>>346
スレはここでも良いと思うけど、Cellsを使ってループ処理をする、その方法は知ってるの?
For i = 1 to 100
If Cells(i,1)= "xxxx" Then
Cells(i,1)= 〜
End If
Next
みたいなさ
0348デフォルトの名無しさん2012/02/21(火) 19:48:13.75
>>344
もう解決してるので今更感が強いけど、
テキストファイルをエクセルで開いて下から4行目を取得する、
というやり方もできるよ
Test.txtを開くと仮定したらこんな感じ

Sub test()
Dim WB As Workbook
Dim I&
Dim Txt$
Set WB = Workbooks.Open("test.txt")
With WB.Sheets(1)
I = .Cells(.Rows.Count, 1).End(xlUp).Row
If I > 3 Then
I = I - 3
Else
I = 1
End If
Txt = .Cells(I, 1).Value
WB.Close
MsgBox Txt
End With
End Sub

0349デフォルトの名無しさん2012/02/21(火) 20:07:58.96
>>347
文字は何パターンあるのかな。
パターン数分の背景色が必要になるけど、何色でも良いの。
0350デフォルトの名無しさん2012/02/21(火) 20:09:31.70
↑間違えた。>>346宛ね。
0351デフォルトの名無しさん2012/02/21(火) 21:03:18.61
>>346
このあたりを調べて使えるようになればできるよ。
最終行取得
繰り返し(for each〜next)
colorindex
entirerow
dictionary
03523462012/02/21(火) 21:26:45.65
>>347
For〜Nextは勉強しましたので、その文はナントカわかります

>>349-350
大元が2種類あって、更にその片方が何種類か条件があるような感じです
ですので、背景色は6〜7色前後になりますが、色については指定がありましたので、
ColorIndexの後にその数字を入れていけば対応できます

>>351
残念ながらまだ基礎の方なのでColorIndex以外は習ってないですね・・・

今習ってる構文?といえば
思い出せるのは、If〜Then〜Else、For〜Next、Do〜Loop位ですね


347さんのでなんとなくなイメージは浮かびました



答えてくださった方々、ありがとうございました
とりあえずはもうちょっとネットで調べてみます
0353デフォルトの名無しさん2012/02/21(火) 22:01:14.63
OS:XP SP3
Excel:2003 SP3
---
(略)
graph_name = ActiveChart.Name
graph_index = ActiveChart.Index
(略)
ActiveSheet.ChartObjects(graph_index).Activate 'エラーが発生する
(略)
---
例えば、graph_nameがGraph 3だったら、
ActiveSheet.ChartObjects("グラフ 3").Activate
とする事で、エラーが発生しなくなります。

解決策をご存知の方はぜひご教授願います。
0354デフォルトの名無しさん2012/02/21(火) 22:25:34.74
>>353
graph_index =ActiveChart.Parent.Index
0355デフォルトの名無しさん2012/02/22(水) 10:41:53.09
>>215なんですが、>>217さんのやり方で成功したかと思ったんですが、
欄が全部埋まってる場合にも空白のメッセージボックスが出てきてしまうんですよね。。。

全て記入されている場合はメッセージボックスを出さない処理にするにはどうすれば良いのでしょうか?
0356デフォルトの名無しさん2012/02/22(水) 11:48:31.30
>>355
最後のmsgboxのところを
ifでよける。
0357デフォルトの名無しさん2012/02/22(水) 15:04:52.84
>>354
サンクス!
0358デフォルトの名無しさん2012/02/22(水) 21:09:05.40
>>355
if len(str)>0 then msgbox str
0359デフォルトの名無しさん2012/02/22(水) 21:10:42.95
then
end if
を
{
}
で書くのに慣れると、BASICはどうも読みにくくて仕方ない。。
まあ慣れの問題なんだけどさ
0360デフォルトの名無しさん2012/02/22(水) 22:51:46.44
おう、お前ら
初心者で悪いけど質問な

ユーザーフォームっての作ったんだけど
そこに入力された値ってのはどうやって得るんだ?

初心者なんだから丁寧に教えろよ
0361デフォルトの名無しさん2012/02/22(水) 23:08:36.01
つまんない
0362デフォルトの名無しさん2012/02/22(水) 23:34:39.45
ユーザーフォームの値を得たり、値を入れたりは
Applicationオブジェクトから辿ると何となく分かるけど、
Msgboxのボタンを押すとか謎。
0363デフォルトの名無しさん2012/02/22(水) 23:44:29.66
>>360
オブジェクト名.Valueでよろし。。。。。
0364デフォルトの名無しさん2012/02/23(木) 00:03:42.57
>>363
なんだ、簡単だったな
あんがとよ!
0365デフォルトの名無しさん2012/02/23(木) 01:18:57.32
便乗するわけじゃないけどユーザーフォームについての質問です。

ユーザーフォームの右上の×をクリックしたときって
どういう動作をしているのでしょうか?

×でフォームを閉じたことを標準モジュールのプロシージャ
(そのユーザーフォームをShowしたプロシージャ)から知る方法ってありますか?

現在はPublicで宣言したBoolean変数とフォーム上のコマンドボタンを用いて
コマンドボタンをクリックしたら変数をTrueにしてからHideするようにしてます。
(×で閉じたらFalseだからそれで判断してます)
パブリック変数を使わないで×で閉じたことを知る方法があったら教えてください。
0366デフォルトの名無しさん2012/02/23(木) 02:37:52.92
>>365
標準で用意されているイベントハンドラでは知ることはできない
プロセスの終了方法を区別するには、×ボタンのクリックイベントをフックするぐらいしかないんじゃない?
ただしアプリケーションの作法としては終了方法を区別するような設計にするのはあまり良くないと思うけど
0367デフォルトの名無しさん2012/02/23(木) 02:48:44.80
>>365
ユーザフォーム内だと
UserForm_QueryClose
で処理できるんだけど
いっそのこと Xで終了出来なくしたら? だめかな?やっぱ

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
 If CloseMode = 0 Then Cancel = 1
End Sub
03683652012/02/23(木) 03:32:51.89
>>366
無理なのですか、残念です。
終了方法を知りたいというか、
ユーザーフォームと標準モジュール間でパブリック変数を介さないで
情報のやり取りがしたかったのです。
標準モジュール同士ならローカル変数でも引数で受け渡し可能ですけど、
ユーザーフォームには引数渡せませんよね?
標準モジュール側からLoadだけしておいて
フォームのオブジェクトに値を入れてShow
とか、
フォーム側からHideして標準モジュールに戻ってから
オブジェクトの値を取得とかは出来ますけど、
Hideしたときにどういう風にHideしたかの情報を
パブリック変数を使わずに取得できないかな?
ということが知りたかったのです。
(ぶっちゃけていうと「実行」と「キャンセル」の判別に使いたいのです。)
パブリック変数の使用以外に
フォーム上に不可視のオブジェクト(チェックボックスなど)を作っておいて
それをフラグに使うっていう手もありますが、
なんかスマートじゃないな、という気がしまして。

>>367
上に述べたとおり、×をキャンセルボタン扱いで使いたかったわけです。
残念ながら私の思うような方向では出来ないっぽいですけど。

ともあれ、お二方にお答えをいただけてとてもうれしかったです。
どうもありがとうございました。

03693652012/02/23(木) 03:49:06.68
一応、私の知っている範囲でフォームから標準モジュールへ
何らかの値を渡す方法っていうのは以下の3種類しかないです。

1.パブリック変数の使用
2.フォーム上のオブジェクトの値をHide後に取得する
3.フォーム内のプロシージャからワークシートのセルや
外部のテキストファイルなどに書き出しておく

これ以外に何か方法をご存知の方、教えていただけたら幸いです。
0370デフォルトの名無しさん2012/02/23(木) 04:20:30.93
>>369
普通標準モジュール側に通知用の関数用意しとかない?
ボタン押したときに呼んでやるの
0371デフォルトの名無しさん2012/02/23(木) 04:41:55.92
>フォーム上に不可視のオブジェクト(チェックボックスなど)を作っておいて
>それをフラグに使うっていう手もありますが

>フォーム上のオブジェクトの値をHide後に取得する

オブジェクト=コントロールだと思ってる?
普通は、フォームにパブリックな変数定義するんじゃないかな
まあ、パブリック変数を介してるのには違いないけど
03723652012/02/23(木) 05:58:09.38
>>370

すごい!おっしゃるとおり出来ました。
今までフォームモジュールの中から標準モジュールのプロシージャをCallしたことがなかった
(引数も渡せないから、そんなことが出来ると思ってなくて試してもいなかった)ので、
やってみて目から鱗です。
これからはこの手でいきます。
ご指導どうもありがとうございました。
こんな感じで試しました。

[Module1]
Sub Test
Userform1.show
End Sub
Sub BtnClick
Stop '<=ここで止まった(つまりここにキャンセルの処理を書いておけばOK)
End Sub

[UserForm1]
Private Sub CommandButton1_Click
Call BtnClick
End Sub


>>371
どうもありがとうございます。
370さんにバッチリなお答えを教えていただいたので今後はそちらを使うことにします。

一応、オブジェクト=コントロールというか、
フォーム内のコントロールはオブジェクト(に含まれる)という程度の認識です。
コントロール以外で、フォーム内にオブジェクトがあるのかどうかは分かってないです。
0373デフォルトの名無しさん2012/02/23(木) 12:29:19.07
派遣のお姉さんが毎日6時間かけて色んなCSVファイルから必要なデータを取り出して集計してExcelに整形する処理、
私がVBAで2時間位で完全自動化した時は泣いて喜ばれたし、作業無くなったお姉さんはキャビネの掃除とかして
時間潰そうとしてたけど2ヶ月後退職迫られた、プログラママジ害悪
0374デフォルトの名無しさん2012/02/23(木) 12:44:53.20
人力でも6時間足らずで終わる仕事を2時間程度にしか短縮できないオマエさんがヘボなのか、
VBAでも2時間かかる作業を6時間で終わらせてしまう派遣のオネエさんが凄いのか、
どっちだかよくわからん話だな。
0375デフォルトの名無しさん2012/02/23(木) 13:11:20.53
どう読んだらそうなるんだ
コーディングが2時間だろ
0376デフォルトの名無しさん2012/02/23(木) 13:19:41.89
は?
仕様のヒアリング1時間、コーディング30分、テスト30分だろ
0377デフォルトの名無しさん2012/02/23(木) 13:33:33.99
どう読んだらも何も本来の文脈からいったら
おネエさんの作業時間と対比するには
VBAのほうも処理に必要な時間を書くべきだろ。
もちろん、いくらなんでも人力の3倍前後にしか短縮できないってのは
ちょっとあり得ない話だから
コーディングにかかった時間なのだろうと推測はできるが
はっきりと明記されていない以上、
日本語としては前述のような解釈も十分可能だぞ。
0378デフォルトの名無しさん2012/02/23(木) 13:42:16.29
> 私がVBAで2時間位で完全自動化した

これを、作業時間2時間で完全自動化したと読めないのは、日本人じゃ無いか、IQ70以下くらいだと思うぞ。
日本人だしIQも高いというなら、それは単なる誤読、勘違いなんだから騒ぐな。
0379デフォルトの名無しさん2012/02/23(木) 13:45:59.83
どうでもいい事ではスレのびるのな
0380デフォルトの名無しさん2012/02/23(木) 13:56:32.22
日本語っていうのは語順の入れ替えや語句の省略によるあいまい表現に寛容で
柔軟な構造の言語だから省略された部分に何を補完するかでどうにでも取れるよ。
>私がVBAで2時間ぐらいで(作業が終わるように)完全自動化した。
という読み方だって、
その前段で述べられている人力での作業時間と対比をなすことから考えたら自然な解釈なんだよ。

っていうことがわからないなら
それこそ日本語を勉強し直した方が良いと思う
0381デフォルトの名無しさん2012/02/23(木) 14:12:50.78
>>380
余分な単語をそぎ落とすと「私が二時間位で自動化した」になるが、これでもまだ六時間かかる処理を
二時間位で終わらせるような自動化をしたと読むのか?
ちょっと、日本人とは思えない解釈だわ
0382デフォルトの名無しさん2012/02/23(木) 14:28:14.55
>>377
>VBAのほうも処理に必要な時間を書くべきだろ。
はぁ?
お前のべき論なんか聞きたくもないよ。
0383デフォルトの名無しさん2012/02/23(木) 14:32:11.51
完全自動化されるなら、別に実行に二時間かかってもいいと思うが。
(と、話を変な方向に広げてみる)
0384デフォルトの名無しさん2012/02/23(木) 14:48:20.87
すでに述べている通り省略の仕方でどうにでもなる話だよ。
自説に都合の良い省略の仕方をされても困る。
作業時間云々のものからそういう省略の仕方ができないってことと、
元の文章がどういう省略の仕方をした結果なのかは別次元の話だからね。

で、俺は単なるべき論で言ってるわけじゃない。
前後の文脈を合わせるという方向で考えたらそうなると言ってるだけで
そうでない解釈が間違いだとは言ってない。
むしろその論理を否定されているからそうでない解釈もありだと言ってるだけ、
先に持論を押し付けたのはどちらか、冷静に判断してほしいし、
そういう論法なら日本語能力云々とかIQ がどうとかも一個人の見解にすぎない話で
だれも聞きたいと思ってないのは御同様。
0385デフォルトの名無しさん2012/02/23(木) 15:02:01.04
よっぽど悔しいんだろうなぁ
0386デフォルトの名無しさん2012/02/23(木) 15:07:15.34
> すでに述べている通り省略の仕方でどうにでもなる話だよ。

そもそも省略なんかしてないし。
100人読んだら、お前以外の99人は作業時間が、と取るわ。
0387デフォルトの名無しさん2012/02/23(木) 15:16:34.11
僕の解釈論はそろそろ終わりにしてもらえませんかね。
0388デフォルトの名無しさん2012/02/23(木) 15:51:44.33
>>386
あくまで個人の感想です
0389デフォルトの名無しさん2012/02/23(木) 16:25:51.95
こんな普通の文章でも、個人の解釈でどうとでもなるとか言う奴が書いた仕様書見たいわ
0390デフォルトの名無しさん2012/02/23(木) 16:30:12.44
自分の読解力のなさをわざわざ指摘してくれる人がいたというのに
逆ギレする馬鹿
0391デフォルトの名無しさん2012/02/23(木) 16:42:03.30
往生際悪すぎ
0392デフォルトの名無しさん2012/02/23(木) 18:27:11.41
>>384
オマエさん、ちょっとズレてるよ
0393デフォルトの名無しさん2012/02/23(木) 19:02:53.08
傍目で見てたら論拠に基づいて発言してる人と
言葉の勢いだけで無根拠に強気なこと言ってる人の議論なんだが、
無根拠の方はそれに気づいてないってのが哀しいな。
0394デフォルトの名無しさん2012/02/23(木) 19:15:35.72
スレが伸びてると思ってみてみたら何だこいつら
いつぞやのDB馬鹿がまた暴れてんのか?
0395デフォルトの名無しさん2012/02/23(木) 19:52:44.07
どう解釈するのが普通か、なんて、多人数の意見を集約してみないとはっきりしない

ま、俺の主観ならあの文章なら作業時間2時間だな。俺があの文章かいて
実行時間が2時間だととられたなら書き方がわるかったと反省する
0396デフォルトの名無しさん2012/02/23(木) 20:18:52.53
ここは質問スレ。
>>373も、難癖をつけようとして失敗した>>374も、どっちもスレチ。
0397デフォルトの名無しさん2012/02/23(木) 20:34:13.57
スイマセン、助けてください
職業訓練学校に通ってるんだけど、諸事情で1週間ほど休んで一昨日からまた通い始めたんです、
その間に溜まったプリントを消化してて最後の一枚で訳わかんなくなってしまったんです

For〜Nextのネストってのはなんとなく解ったんだけど、どう組み立てていけばいいのかわからなくなって先に進めなくなりました。

http://imepic.jp/20120223/735690

これなんですが、VBAに慣れた人には簡単すぎるかもしれませんがどなたか助けて下さい
0398デフォルトの名無しさん2012/02/23(木) 20:59:33.99
>>397
Sub TEST()
Dim i as 整数, j as 整数, k as 整数
For i = 1 to ワークシート数
For j = 6 To 12
For k = 2 To 8
With Cells(j, k)
If .valueが5000以上 Then
.フォント.色=青
ElseIf .valueが2000未満 Then
.フォント.色=赤
End If
End With
Next k
Next j
Next i
End sub
0399デフォルトの名無しさん2012/02/23(木) 21:07:02.90
>>398
訂正
With worksheets(i).Cells(j, k)
0400デフォルトの名無しさん2012/02/23(木) 21:12:10.07
>>398-399
ありがとうございます!
そうか・・・Nextの終了順番が間違ってたのもあったのか
これでナントカ追いつけそうです
0401デフォルトの名無しさん2012/02/23(木) 21:57:48.70
今、訓練所でvba教えでるのか。田舎だと、使う場面が少ないが
0402デフォルトの名無しさん2012/02/23(木) 23:01:09.21
XP-2002環境です。

シートAに、2行ペア組のデータで、5万行まで埋まっています。

Dim strData(15) As String  に2行のセルの値を配列に放り込んで、
シートBにパコパコ張り付けるのを全行ループしています。

だけど、必ずシートAのある行数のところで、オーバーフローとなって止まります。
別にその行のデータの型などが、特におかしいわけでは無いです。
(成功したデータをその行に貼り付けてもオーバーフロー)

もしかして、VBAで処理する行数の上限等の何か制約があるのでしょうか?
上限があるなら何か他の対策はあるのでしょうか。
それとも何か他の原因が考えられるのでしょうか?

よろしくお願いします。
0403デフォルトの名無しさん2012/02/23(木) 23:07:53.13
>>402
IntegerをLongにしてみたらどうでしょうか
0404デフォルトの名無しさん2012/02/23(木) 23:19:15.10
>>402
VBAじゃなくてExcel自体の行数の上限が65535行だけどそれは理解してるの?
Excel2007で100万行に拡張されたけど
0405デフォルトの名無しさん2012/02/23(木) 23:25:17.48
>>404
5万行ってことだから問題ないんじゃないの?
0406デフォルトの名無しさん2012/02/24(金) 00:06:59.57
>>402
5万行×8列を2万5千行×16列にしてるのかな?
0407デフォルトの名無しさん2012/02/24(金) 01:04:56.91
Range("A1:A3").Offset(0,2)
ってやったら、
Range("C1:C3")
なオブジェクトが取れると期待してたけど、
Range("C1")
の単一のセルなオブジェクトになった。

そう言うもの?何かへんなのか?
"A1:A3"は、結合してるセルなのだけど、何か関係ある?
0408デフォルトの名無しさん2012/02/24(金) 03:41:06.42
>>407
Offsetは左上の単一セルしか見ない
範囲を広げるにはResize
0409デフォルトの名無しさん2012/02/24(金) 07:09:13.61
>>403
ありがとうございました。intカウンターをLongで解決。
なんで32000行あたりの特定の数字でオーバーフローしちまうのかなぁ
0410デフォルトの名無しさん2012/02/24(金) 07:28:41.30
>>409
それぞれの型には範囲ってもんがある

基本的なことぐらい知ってれやれよ

http://www.geocities.jp/cbc_vbnet/kisuhen/hensuu.html
変数・定数(基礎編)

0411デフォルトの名無しさん2012/02/24(金) 08:28:36.17
>>407
実際にRange("C1:C3")になるぞ。
そっちのPCは呪われてるのか?
0412デフォルトの名無しさん2012/02/24(金) 19:19:10.59
>>411

>>407も

>"A1:A3"は、結合してるセルなのだけど、何か関係ある?

って書いてるけど、うちの環境で試しても
A1:A3が普通のセルならC1:C3を返すけど、
A1:A3を結合してるとC1だけしか返されなかったよ。
0413デフォルトの名無しさん2012/02/26(日) 14:46:56.38
>>412
ちょっと気になっていろいろ試してみた
ヘルプには
>指定された範囲からのオフセットの範囲を表す Range オブジェクトを返します。
とある

ここでの指定された範囲ってのは指定したRangeじゃないし、オフセットの範囲ってのもそのRangeの範囲じゃないってことらしい

問題は、結合セルに対してOffsetをとった場合
指定された範囲=結合セルという一つの範囲
オフセット基準=指定範囲の終了地点(右下)
だとみなされるようだ
A1:A3が一つの結合セルだった場合、Range("A1").OffsetもRange("A2").OffsetもRange("A3").Offsetも同じ動作をする

普通にOffset実装したらそういう動作しそうもないから、
わざわざ結合セルに対するOFFset動作は特別な動作するように実装されてるんじゃないかな

ということで、>>407そう言うものだと思われます

だれかこの動作の公式なドキュメントしってる?
0414デフォルトの名無しさん2012/02/27(月) 00:59:22.80
Excelファイルが読み取り専用の場合、入力できなくする方法

Excelファイルを読み取り専用で開いてるのを忘れて、
いざ保存しようとした時に読み取り専用だった事を思い出すって事ありませんか?
だったらセルのロックみたいに入力自体できなくすればいいじゃないかと
思ってはみたもののどうすればいいかわかりません。
読み取り専用推奨で保存したファイルを開いて
読み取り専用にするか訊いてきた時に"はい"の場合はセルのロック、
"いいえ"の場合はセルのロックを解除というマクロを組んでAuto_Openで動かしてみましたが、
どうも訊いてくるより先にAuto_Openが実行されているようでうまくいきませんでした。
読み取り専用で開くかどうかもマクロで組めれば解決するのかなと思いますが、やり方がわかりません。
どうにかならないでしょうか?
0415デフォルトの名無しさん2012/02/27(月) 01:19:29.12
Workbook_Openイベントプロシージャ
0416デフォルトの名無しさん2012/02/27(月) 07:37:36.89
マクロの記述で質問です。
B列のセルに"日本"を入力すると、
その該当するC列とD列のセルの値や文字列をクリアして斜線を入れたいのです。

例えば
B2へ"日本"を入力すると、C2〜D2のセルに入っている値・文字をクリアして
自動的に斜線を入れる、

同じく
B3へ"日本"を入力すると、C3〜D3のセルに入っている値・文字をクリアして
自動的に斜線を入れる、

といった感じです。

ここで
B2に対してはそれらの動作が上手くいくのですが
B3やB4以降の行に関しては上手くいきません。

例えばB3へ"日本"を入力するとC3〜D3のセル内容はクリアされずC2〜D2の値がクリアされてしまいます。
B4やB5以降に関しても同じくC2〜D2の値がクリアされてしまいます。
0417デフォルトの名無しさん2012/02/27(月) 07:39:07.10
上の続きです。
一応マクロの文です。
おそらく相対参照の問題だと思います。
調べて試行錯誤しましたが上手いやり方がわかりません。
Excel2003です。
どなたかご教授お願いします。

Private Sub Worksheet_Change(ByVal Target As Range)
Dim r, trg As Range
Set trg = Intersect(Target, Range("B2:B14"))
If Not trg Is Nothing Then
For Each r In trg
If r.Value = "日本" Then
r.Offset(0, 1).Resize(1, 2).Borders(xlDiagonalDown) _
.LineStyle = xlContinuous
Range("C2:D2").ClearContents
Else
r.Offset(0, 1).Resize(1, 2).Borders(xlDiagonalDown) _
.LineStyle = xlNone
End If
Next r
End If
End Sub
0418デフォルトの名無しさん2012/02/27(月) 07:47:41.48
> Range("C2:D2").ClearContents
それはそうだろ、としか。
0419デフォルトの名無しさん2012/02/27(月) 08:01:13.16
Range(Cells(i,j),Cells(i+?,j+?))
でこのi,j,?を操作すれば
0420デフォルトの名無しさん2012/02/27(月) 12:37:05.35
Range("C2:D2").ClearContents を

r.Offset(0, 1).Resize(1, 2).ClearContents
で、いけたわ

こういうのわかりにくいから、
r.offset(0.1).clearcontents
r.offset(0,2).clearcontents

ってやってるわ。
0421デフォルトの名無しさん2012/02/27(月) 16:29:03.11
>>418-420
ありがとうございます。
削除する対象のセルを結合したセルにすると
「結合された一部のセルを〜」のエラーが出てダメになりましたが
r.Offset(0, 1).Resize(1, 2) = "" にすると大丈夫でした。
お世話になりました
0422デフォルトの名無しさん2012/02/27(月) 18:00:44.53
range(“a1“).numberformat=“@“
range(“b3“).numberformat=“hh:mm“
if range(“a1“)<>range(“b3“) then
としても差異は検出されないけれど、セルの内容全てを比較したい場合は、全プロパティ分のifを書いてやらんとあきまへんのどすか。
0423デフォルトの名無しさん2012/02/27(月) 18:02:54.64
.text
0424デフォルトの名無しさん2012/02/27(月) 19:26:17.07
range("a1").numberformat="#,##0"
range("b3").numberformat="#,##0;-#,##0"
値は両方とも100

この場合も違うと判定させたい?
0425デフォルトの名無しさん2012/02/27(月) 23:40:37.48
させたいどす。
.value でも .width でも罫線でも、違いを検出したいんどすえ。
0426デフォルトの名無しさん2012/02/28(火) 10:59:13.54
rangeのプロパティカウントさせることができないっぽい
自分で関数作るか、if文書くかしかなさげ

というか、プロパティカウントできないの初めて知ったわ
これ地味に不便ね
0427デフォルトの名無しさん2012/02/28(火) 12:42:32.91
VISTA Excel2007 です
ライブラリの参照設定をコード内で実行したいのですが、
同じ文を標準モジュールに書くとエラーが出ないのに
クラスのイニシャライズに書くと「中断モードでは実行できません」と
エラーメッセージが出ます(ただ参照設定の処理がなされます)
クラスのイニシャライズでエラーが出る原因など分かる方がいましたらご教授ください
以下コード:
Const DAOFileFPath As String = "C:\Program Files\Common Files\Microsoft Shared\DAO\dao360.dll"

ActiveWorkbook.VBProject.References.AddFromFile DAOFileFPath


0428デフォルトの名無しさん2012/02/28(火) 21:31:31.36
>>427
べつに普通に実行できるが
そのエラーメッセージの通り、中断モードのままやるからエラーになってるだけだろ
04294272012/02/29(水) 01:03:02.92
すみません
もっと早く書き込みたかったのですが仕事で抜けられませんでした
イニシャライズでなくメソッドにしても同じエラーになったので
もしやと思い、クラスを新規作成して一からコードを手打ちしていったら
今度はうまく行きました
モジュールが壊れていたんだと思います
必ず通るはずのStopをスルーして、その先のMsgBoxが動いている時点で気づくべきでした
前にもこんなことがあって、別のモジュールに一から書き直したらやっぱり普通に動いた
そんな無茶な使い方してるわけじゃないのにな…
どうも失礼しました
0430デフォルトの名無しさん2012/02/29(水) 02:44:05.36
いやだから、Stopで止まったら中断モード...
まあいいか
0431デフォルトの名無しさん2012/02/29(水) 10:05:54.43
忙しすぎて日本語読む余裕がないんだろうな
0432デフォルトの名無しさん2012/03/01(木) 00:18:08.68
すみません、どうも詰まってしまったので質問させてください
商品名の入っているシートから、数学で言う所の和集合を取りたいと考えています
例えば、

A列 B列
1 CC TT

2 HH CC

3 TT E3

となっているようであれば、(CC、TT、HH、E3)を取り出して、できれば1セルに一つの名前という形で長く並べたいと考えています

Sub Test()
Range("F8").Value = Union(Range("A1:A3"), Range("B1:B3")).Value
End Sub

おそらくUnionを使うのかなと考えて、とりあえず1セルに一つの名前ということを考えずに書いてみたのが上のコードなんですが、
実行するとF8にはCCしか入力されません。これはどこが間違っているのでしょうか?
どなたかよろしくお願いいたします。
0433デフォルトの名無しさん2012/03/01(木) 02:13:02.97
すいません、色々試してみたら半分くらい自己解決できました。

Sub MultipleRange()
Dim rng1 As Range, rng2 As Range, myMultiRanges As Range

Worksheets("Sheet1").Activate
Set rng1 = Range("A1:A3")
Set rng2 = Range("B1:B3")
Set myMultiRanges = Union(rng1, rng2)

Dim i As Integer
For i = 1 To 6
Cells(10, i).Value = myMultiRanges(i).Value
Next i

End Sub

これだと重複ができるようなので、これやった後に重複チェックのコードを別にかければなんとかいけそうです。お騒がせしました
0434デフォルトの名無しさん2012/03/01(木) 10:10:50.67
Excel2010 (win7 home)

Worksheets("test")の
Private Sub Worksheet_Activate()
UserForm1.Show
End Sub
と入れて Worksheets("test")のタブをクリックして表示させた時に
Userform1が立ち上がるのは確認したんですが、

ThisWorkbookのシートモジュールの
Private Sub Workbook_Open()
Worksheets("test").Activate
End Sub
としてブックの起動時にWorksheets("test")をアクティブにしても
Userform1が出てこないんですが、これはなぜ?
明示的に
UserForm1.ShowをWorkbook_Open()に入れればもちろんフォームが
出てくるんですけど、これではあまり意味がないような気がする
んですけど。
0435デフォルトの名無しさん2012/03/01(木) 10:20:46.78
九分九厘、そのワークシートtestがブックを開く時点からアクティブなんだろうな。
ワークシートのActivateイベントは「他のシートから移動してきたとき」しかトラップされないから、
ブックを閉じるときにtestがアクティブな状態で保存されて、開くときに最初からアクティブだとトラップできてない。

試しにワークシートtest2を作って、それをアクティブにした状態で保存して開いてみ?
0436デフォルトの名無しさん2012/03/01(木) 10:38:38.23
おおっ、即レスかつその通りでした!

ありがとうございますm(__)m
0437デフォルトの名無しさん2012/03/01(木) 18:16:46.90
VBAで

あ 1
あ 1

を行を文字と数字に列を整えることは可能?
0438デフォルトの名無しさん2012/03/01(木) 18:20:24.65
ちゃんとした日本語の説明か、結果のプレビューを頼むwwwwwwwwwwwwwwww
0439デフォルトの名無しさん2012/03/01(木) 20:08:50.04
エスパーの訓練が捗るな
0440デフォルトの名無しさん2012/03/01(木) 20:50:42.49
Excel2010(vaista)ですが
家計簿を作成してまして収入と支出の差額を表の一番右下の
セルに表示させているのですがそのセルの数字が黒字(0以上)ならセルの背景を青
赤字(0未満)ならセルの背景を赤にしたいのですが上手くできません
そもそもVBAでは不可能なので素直に条件式書式設定を毎回
使用したほうが良いのでしょうか?
0441デフォルトの名無しさん2012/03/01(木) 22:14:39.94
条件式書式設定でできることを態々VBAでやろうとする意味が分からないんだが
0442デフォルトの名無しさん2012/03/02(金) 00:09:42.41
Excel 2010です。開発タブをリボンに表示させる方法を教えて下さい。
2007では、「ファイル」→「オプション」で「開発タブをリボンに表示する」が
出て来るのですが。
0443デフォルトの名無しさん2012/03/02(金) 00:15:51.44
イベントプロシージャに親プロシージャの引数をわたすことは
可能でしょうか?
0444デフォルトの名無しさん2012/03/02(金) 00:20:12.40
>>443
おや?
0445デフォルトの名無しさん2012/03/02(金) 00:23:55.72
今日は妙に>2すら読まない奴が多いな…
0446デフォルトの名無しさん2012/03/02(金) 01:38:50.37
>>442
ファイル→オプション→リボンのユーザー設定→開発にチェック
0447デフォルトの名無しさん2012/03/02(金) 12:51:59.64
ユーザーフォーム上のコマンドボタンの色を変更する目的でカラーパレットを表示させたいのですが、
どうすればいいでしょうか?
マクロに記録してから中身を見ようと思ったのですがVBAにはマクロの記録がなくて、ググっても
RGBの値を直接代入する例ばかりでよくわかりませんでした。
よろしくお願いします。
0448デフォルトの名無しさん2012/03/02(金) 13:03:47.62
カレーパレットダイアログは搭載されてない。
自分でユーザーフォームで1から作るか、WinAPIを使って自分で実装するしかない。

お好きな方で。
0449デフォルトの名無しさん2012/03/02(金) 13:16:57.63
>>448
ありがとうございます。
自作することにします。
0450デフォルトの名無しさん2012/03/02(金) 13:54:58.28
パッチあてるのどうやるの?

sed -i s/hello/こにゃにゃちわ/g *.[ch]
cc *.[ch]
相当。export、import手作業は嫌です。
0451デフォルトの名無しさん2012/03/02(金) 14:04:19.91
そんな便利なものはない。
自分でやるなら、VBComponent.CodeModule.ReplaceLine使え。
0452デフォルトの名無しさん2012/03/02(金) 14:08:57.19
アドインにしとけ
0453デフォルトの名無しさん2012/03/02(金) 18:23:02.19
witheventsを使うときに、コマンドボタンの1〜5個めはイベントを共有して、
6〜10個めはそれぞれ独自のイベントにしたい場合はwitheventのプロシージャーの
中で判断するしかないですか?
0454デフォルトの名無しさん2012/03/02(金) 18:41:09.43
>>451
ありがとう。
var=VBComponent....Lines(...)
replace(var,“hello“,“こにゃにゃちわ“)
VBComponent....Lines=var
みたいにして絶望していた。

>>452
もう一歩教えてくだsあ。
アドインにReplaceLine()なりを書けという意味? アドインにサブルーチンの置換プラグイン相当の機能があるという意味?
0455デフォルトの名無しさん2012/03/03(土) 16:16:57.97
シートがなくなるまで、2シートずつ選択してプリント。

Sub pare_print()
Dim i As Integer

For i = 2 To Sheets.Count

Worksheets(Array(i, i + 1)).PrintOut
i = i + 2
Next i

End Sub


できません・・・なんででしょう??(´Д⊂ヽ
プリントアウト始めのシートは2番目からです。。
0456デフォルトの名無しさん2012/03/03(土) 16:22:32.24
複数枚のグラフをユーザーフォーム上に重ねて表示させることはできるでしょうか?
今はシート上に重ねて表示させているのですが表示場所をずらしたい時とか、全体に
拡大縮小したい時にどうすればいいかわからず、ユーザーフォーム上ならユーザーフォームを
移動、拡大縮小することによって簡単にできるかなと思ったのですが、ググっても情報がないみたいで。
よろしくお願いします。
04574552012/03/03(土) 16:26:48.45
どうもすみません。
最初のシート名は、0だったようです。できました。
0458デフォルトの名無しさん2012/03/03(土) 17:14:23.39
    
顕正新聞 平成24年2月5日号「原発全廃特集号」

原発は日本を滅ぼす、即時全廃せよ
人のDNAを破壊、国土を居住不能にする
代替は天然ガス・コンバインドサイクルで十分
惨禍もたらすを知って推進するは犯罪

ttp://d.hatena.ne.jp/kensho01/20120208/1328718592
04594562012/03/03(土) 20:56:39.14
すみません。OSとバージョンを書き忘れました。

OS:BeOS Release4 (intel版です。PowerPC版ではありません )
バージョン:Gobe Productive 1.1

引き続きよろしくおねがいしますm(_ _)m
0460デフォルトの名無しさん2012/03/04(日) 10:36:07.81
こんにつわ、質問です。

A1-A50にランダムで指定の文字列もしくは空白が入ります。例えばリンゴ、ミカン、etcで、それぞれリンゴ...001、ミカン...050のようにあらかじめ対応する数字が割り振られています。
この文字列、つまり数字を条件に処理したいのですが、この場合A1から順に判定するよりも、A列から抽出して重複と空白を除外し、その結果を例えばB列に貼り付けて、B1からB?の空白まで処理をくり返すのが良いと思うのですが、どうでしょうか。具体的にどう書けば良いですか?
0461デフォルトの名無しさん2012/03/04(日) 10:41:38.47
>>460
B列に貼り付ける処理が無駄
FOR EACH でA列のRANGEを処理しながら回せばよろし
0462デフォルトの名無しさん2012/03/04(日) 10:57:16.47
thx.
RANGEが固定ではない場合の上手い方法ありますか?適当に下まで引っ張ればいいですか?
0463デフォルトの名無しさん2012/03/04(日) 11:12:33.48
分からねえ分からねえよぉ

A列に指定の文字列ランダムに配置
B1-B50に指定の文字列
C1-C50に指定の文字列に対応する数字
があるとして、A1から順番に対応する数字をMsgboxで表示していくコード誰か書いてくれぉ
0464デフォルトの名無しさん2012/03/04(日) 11:18:31.63
VLOOKUP使えよ
0465デフォルトの名無しさん2012/03/04(日) 11:33:29.98
thx.
A1からセル内の数字だけ取り出すにはどうすればいいですか?
漢字/12345\/
という形式から
12345
を取り出したいです

漢字は1-5文字のランダムなので、LEFTは使えないです
数字は5桁固定で必ず\の前です
0466デフォルトの名無しさん2012/03/04(日) 11:35:50.15

for i = 1 to 最終行

最終行の取得はお好きにどうぞ

0467デフォルトの名無しさん2012/03/04(日) 11:38:22.77
>>465
正規表現でもLikeでもお好きにどうぞ
0468デフォルトの名無しさん2012/03/04(日) 12:24:26.18
Dim c As Object
For Each c In Worksheets(imacat).Range("A1:A100")
If c.value Like "*##*" Then
Msg:
MsgBox "cである"
End If
Next c

ここまで出来た…
0469デフォルトの名無しさん2012/03/04(日) 12:27:05.40
Msg:要らないな
MsgBoxにマッチした数字を表示したいのですけどできません
0470デフォルトの名無しさん2012/03/04(日) 12:44:36.54
>>469
AHO
0471デフォルトの名無しさん2012/03/04(日) 12:51:45.21
MsgBox c & "である"
0472デフォルトの名無しさん2012/03/04(日) 13:00:32.31
そもそもLikeでマッチした数字返せるのけ?
0473デフォルトの名無しさん2012/03/04(日) 13:12:38.41
>>465
instrで/と\の位置を探してmid関数を使えば?
0474デフォルトの名無しさん2012/03/04(日) 13:19:10.28
>>463 コード書いたのでどうぞ使ってください。>>464のいうとおりVLOOKUPを使用して組んでみました。
Sub Test()
  Const s = vbKeyLButton: Const e = vbKey2: Dim vlookup: Set vlookup = Application
  Dim i: For i = s To e:
    Dim v: v = Evaluate(Chr(vbKeyF7) & Chr(vbKeySeparator) & Chr(vbKeyDivide) & Chr(vbKeyDivide) & _
    Chr(vbKeyAdd) & Chr(vbKeyF6) & Chr(vbKeyF1) & Chr(vbKeyDown) & Chr(vbKeyNumpad1) & i & _
    Chr(vbKeySnapshot) & Chr(vbKeyNumpad2) & s & Chr(vbKey9 + 1) & Chr(vbKeyNumpad3) & e & _
    Chr(vbKeySnapshot) & Chr(vbKey2) & Chr(vbKeySnapshot) & Chr(vbKeyNumpad6) & Chr(vbKeyNumpad1) & _
    Chr(vbKeySeparator) & Chr(vbKeyF4) & Chr(vbKeyNumpad5) & Chr(vbKeySelect))
    ' VLOOKUPで数字をMsgBoxで表示する
    vlookup.OnTime Now() + TimeValue(Chr(vbKey0) & Chr(vbKey9 + 1) & Chr(vbKey0) & Chr(vbKey9 + 1) & i), _
    Chr(vbKeyRight) & Chr(vbKeySubtract) & Chr(vbKeyNumpad2) & Chr(vbKeyDown) & IIf(IsError(v), String( _
    vbKeyRButton, Chr(vbKeyPageDown)), v) & Chr(vbKeySelect) & Chr(vbKeyRight)
  Next
End Sub
Sub MB(v): MsgBox (v): End Sub
0475デフォルトの名無しさん2012/03/04(日) 13:31:13.08
>>472
かえせるべ
正規表現のほうが楽だけど

str= "あいうえお12345"

strlen= len(str)

for i =1 to strlen

cha= mid(str,i,1)

if cha lile "[0-9]" then
c= c &cha
end if

next
0476デフォルトの名無しさん2012/03/04(日) 13:35:24.62
すげー。自力じゃ無理だったので有難く使いますthx!!!
0477デフォルトの名無しさん2012/03/04(日) 13:48:13.13
数字だけ取り出すなら
dim a
a=instrr(cells(1,1),"\")
msgbox mid(cells(1,1),a-5,5)
が簡単だと思うけど。
0478デフォルトの名無しさん2012/03/04(日) 13:54:17.43
VBAで可視セルを扱うにはどういう機能またはプロパティまたはメソッドを使いますか?
0479デフォルトの名無しさん2012/03/04(日) 13:57:27.36
>>478
可視セルをどう使いたいかによる。
0480デフォルトの名無しさん2012/03/04(日) 14:04:24.13
>>479
http://toro.2ch.net/test/read.cgi/bsoft/1329913579/161-
0481デフォルトの名無しさん2012/03/04(日) 14:23:38.72
連続じゃないセル、たとえば、range("A1:A3")とrange("C1:C3")を3*2の配列に格納するには
どうすればよいのでしょうか?
0482デフォルトの名無しさん2012/03/04(日) 14:35:08.42
>>477
これにしたthxx.
0483デフォルトの名無しさん2012/03/04(日) 14:36:48.77
>>481
For〜Nextで順番に代入
作業列を使ってもいいんなら一ヶ所に固まるようにセル範囲をコピーしてからVariant型に代入
B列を削除して配列にコピーしてからアンドゥ
0484デフォルトの名無しさん2012/03/04(日) 14:37:11.44
>>481
dictionary使うとか

set dic = createobject("scripting.dictionary")
for i = 1 to 3
dic add cells(i,1)value, cells(i,3).value
next

for i =1 to 3
cells(i,5).value=dicitem(cells(i,4).value)
next

set dic=nothing


0485デフォルトの名無しさん2012/03/04(日) 17:36:55.88
こんばんばーん、質問です。

連結されているセルにデータがあるものとして判定するにはどうすれば良い?

例えば、文字列がE1とF1をまたいでいる。セルが結合されているとき、F1にValueしても空だが、データがあるものと判定したいです。セルの結合数はランダムです。
0486デフォルトの名無しさん2012/03/04(日) 17:45:29.93
MergeCellsで事故解決です
0487デフォルトの名無しさん2012/03/04(日) 19:11:15.60
>>483
>>484
ありがとうございました
0488デフォルトの名無しさん2012/03/05(月) 13:07:02.09
こんにちあ、質問です。

A1-A100に、空白セルもしくは"abc"のセルがあるとき、その行を削除したいのですが、
Dim c As Range
For Each c In Range("A1:A100")
If c.Value ="" Or c.Value = "abc" Then c.Rows.EntireRow.Delete
Next c

とすると、1度目の処理で空白行が消えて、もう一度処理するとabc行が消えます。なぜこの記述はダメなのか?一度の処理で済ますにはどう書けば良いですか?
0489デフォルトの名無しさん2012/03/05(月) 13:28:54.49
If c.Value ="" Or c.Value = "abc" Then c.Rows.EntireRow.Delete
 ↓
If c.Value ="" Or If c.Value = "abc" Then c.Rows.EntireRow.Delete
0490デフォルトの名無しさん2012/03/05(月) 14:05:09.36
エラーでますぉ
0491デフォルトの名無しさん2012/03/05(月) 14:11:45.74
>>488
ごめんアホなこと書いた

セルを消去してるので、セルが上に繰り上がってる
A2のセルを消去したらA3のセルがA2に繰り上がるので、そのセルは評価されない。

for each じゃなくて

for i =100 to 1 step - 1


A100から 減算させて評価させればいい。
つかstepとか忘れてて ぐぐったわ・・

0492デフォルトの名無しさん2012/03/05(月) 14:29:25.31
出来たthx!

質問です、
for i 1 to 100
文字列&i
next
とするときiが一桁のとき01のようにして&したいのですが、書き方ありますか?
0493デフォルトの名無しさん2012/03/05(月) 14:32:02.47
Right関数使え
0494デフォルトの名無しさん2012/03/05(月) 14:32:35.75
>>492
For i = 1 To 100
 str = str & Format(i, "00")
Next
0495デフォルトの名無しさん2012/03/05(月) 14:38:43.95
かんぺきthx!
0496デフォルトの名無しさん2012/03/05(月) 17:41:04.96
どなたか教えてください。
Access2000からExcelファイルを生成しています。
参照設定を Excel9.0 Objectlibrary へ設定しています。
生成先のExcelは2000だったり2003だったり、を想定しています。
以下のソースは動作します。

Function EXCEL_TEST1()

'事前バインディング 必ずEXCELへの参照設定が必要
Dim appWorld As Excel.Application
Dim wbWorld As Excel.Workbook
Dim Wksheet As Excel.Worksheet
Set appWorld = CreateObject("Excel.Application")
Set wbWorld = appWorld.Workbooks.Add
Set Wksheet = wbWorld.Sheets(1)

Wksheet.Cells(5, 5) = "カキコ"

LAST_CELL = Wksheet.Cells.SpecialCells(xlLastCell).Address
MsgBox LAST_CELL

wbWorld.SaveAs "C:\hoge.xls", FileFormat:=xlWorkbookNormal
appWorld.Quit

   開放処理

End Function
04974962012/03/05(月) 17:41:43.26
これを以下のように、参照設定せずに実行時バインディングで行ないたいのですが、
LAST_CELL(最終セルアドレス)の取得と、
SaveAsの部分が動作しません。定数の記述が異なるのか、そもそも実行時バインディング
では記述できないのかも分かりません。どなたか御教授お願いします。

Function EXCEL_TEST2()

'実行時バインディング EXCELへの参照設定が不要 ----------
Dim appWorld As Object 'Excel.Application
Dim wbWorld As Object 'Excel.Workbook
Dim Wksheet As Object 'Excel.WorkSheet
Set appWorld = CreateObject("Excel.Application") '生成
Set wbWorld = appWorld.Workbooks.Add 'ブック追加
Set Wksheet = wbWorld.Worksheets(1)

Wksheet.Cells(5, 5) = "カキコ"

LAST_CELL = Wksheet.Cells.SpecialCells(xlLastCell).Address
MsgBox LAST_CELL

wbWorld.SaveAs "C:\hoge.xls", FileFormat:=xlWorkbookNormal
appWorld.Quit

   開放処理

End Function
0498デフォルトの名無しさん2012/03/05(月) 18:03:38.27
>>496
参照設定しないと
定数 xlLastCell や xlWorkbookNormal は
参照先で定義されているから使えないと思うぞ

自前で Const定義するか 定数値を指定するかどっちかしないと
04994962012/03/05(月) 19:26:17.24
>>498様
有難うございます。あまり参照設定とかは経験がないものですから、
何から手を着けてよいのか分からない状態です。

constする値を調べる方法があればよいのですが。

検索が下手なせいか、なかなか参考になるサイトが見つかりません。
05004962012/03/05(月) 19:34:55.74
496です。解決しました。

498様のヒントで、以下のサイトを見つけました。
ttp://park.geocities.jp/gdfsm000/jacob/jacob05.html

動かないところを片っ端から定数指定していきます。

有難うございました。
0501デフォルトの名無しさん2012/03/05(月) 19:44:05.05
こんにつわ、質問です。
With ActiveSheet.QueryTables.Add
使ってるときに、存在しないURL,空白のURLを打ち込んだときにExcelがフリーズしてしまいます。
どうするのがよいですか?
0502デフォルトの名無しさん2012/03/05(月) 19:44:54.64
訂正
空白のurl→空白ページのurl
0503デフォルトの名無しさん2012/03/05(月) 19:53:56.57
http://www.microsoft.com/download/en/details.aspx?id=19600
何故かVBAの言語仕様書が混じってるみたいだ。
FirstReleaseが2008年なのがなんともw
0504デフォルトの名無しさん2012/03/05(月) 19:56:19.90
win7 64bit
office2010 32bitです

画像を複数枚選択して、なおかつそれらを40%の大きさにリサイズして取り込みたいのですが、どうしても上手くいきません。どなたかご教授お願いします。
0505デフォルトの名無しさん2012/03/06(火) 00:23:45.39
>>504
0506デフォルトの名無しさん2012/03/06(火) 03:47:59.25
教えてください。

If A then

with B

Else

with C

End if

って動かないみたいなんだけど、他に方法ありますか?
0507デフォルトの名無しさん2012/03/06(火) 03:53:58.23
>>506
下にEnd With が続くとエスパーして

Dim target As Withで使う型、またはVariant
If A then
Set tartget = B
Else
Set tartget = C
End If

With target
処理
End With

0508デフォルトの名無しさん2012/03/06(火) 03:57:21.74
>>507
こんなに早く
どうもありがとうございます。
0509デフォルトの名無しさん2012/03/06(火) 10:38:36.68
スレートPCについてるWebカメラで撮った画像を直接EXCELに貼り付けたいんですが、どんな方法があるでしょうか?

望ましいのは、ボタンクリック等のイベントで撮影モードに移行し、撮影完了でEXCELに戻ってくるような操作方法です。
0510デフォルトの名無しさん2012/03/06(火) 11:02:50.25
フォームモジュールをインポートすると
コードの先頭行に空白行が1行追加されてるのは仕様ですか?
空白行を削除して保存しなおしても、また追加されてしまいます。
標準モジュールではそうなりません。
0511デフォルトの名無しさん2012/03/06(火) 11:16:15.79
>>509
shellかなんかで立ち上げてsendkeyで操作するとか

0512デフォルトの名無しさん2012/03/06(火) 11:48:06.15
イミディエイトウィンドウのバッファ容量って、もっと広げることはできないんでしょうか
途中経過を1000行ぐらい出力したら流れて消えてしまいました
0513デフォルトの名無しさん2012/03/06(火) 20:00:16.74
>>512
そんなこと考えてないで
さっさとテキストファイルに出力して
プログラムを進めてくれ
0514デフォルトの名無しさん2012/03/06(火) 21:08:23.50
イミディエイトって、どういう意味でいえいと?
0515デフォルトの名無しさん2012/03/06(火) 21:16:17.49
>>514
完成したVBAマクロを試しに動かしたら、
何故かExcel巻き添えで落ちる呪いをお前にプレゼントしよう。
0516デフォルトの名無しさん2012/03/06(火) 21:25:45.56
辞書で引いてみたら
immediate は、
広大な、恒久的な
という意味らしいな
0517デフォルトの名無しさん2012/03/06(火) 21:42:45.76
>>516
何ていう辞書?
0518デフォルトの名無しさん2012/03/06(火) 21:55:00.87
>>517
何だったかな
ロブスターとかだったかな
513に借りたんだけど
0519デフォルトの名無しさん2012/03/06(火) 22:39:09.48
フィルタ結果の件数の取得は、どうすればいいんでしょうか?
0520デフォルトの名無しさん2012/03/07(水) 00:18:02.17
イミディエイトウィンドウって
一度に100行まで表示じゃなかったけか。
ちがってたらゴメン。
0521デフォルトの名無しさん2012/03/07(水) 00:31:03.27
>>518
元ネタがきになる
0522デフォルトの名無しさん2012/03/07(水) 00:31:33.21
イミディエイトウィンドウは200行がMAXで不可変らしいね。

>>519
「オートフィルタ カウント」 でぐぐればいろいろ出てくる
0523デフォルトの名無しさん2012/03/07(水) 13:57:19.01
>>516
それimmediateの意味とはちがくね?
immenselyとかimmensityの意味じゃね?
0524デフォルトの名無しさん2012/03/07(水) 15:07:58.10
>>523
直接の〜、とか 即時の〜 という意味だね。
形容詞だね。

ホントどうでもいいけど
0525デフォルトの名無しさん2012/03/07(水) 20:33:40.70
>>516
immediateはどうかんがえたって即って意味だろ
0526デフォルトの名無しさん2012/03/07(水) 21:21:07.31
ユーザーフォームを使おうと思ったのですが、
閉じるボタンを押した時、必ずフリーズします。
何故でしょうか。
0527デフォルトの名無しさん2012/03/07(水) 21:37:14.41
>>526
ボタンを押した時に実行されるコードを何故貼らない
0528デフォルトの名無しさん2012/03/07(水) 21:37:33.25
>>526
壊れているのかもな
05295262012/03/07(水) 21:42:22.61
すみません。526です。
セルをダブルクリックで呼び出すことにしていまして、
閉じるボタン押した時、セルが編集可能状態である為エラーが出るみたいです。
(ボタンで呼び出した場合は普通に閉じれました。)

コードの中身はなく、ひとまずフォームを作った感じです。

ダブルクリックでフォーム呼び出しはやるべきではないのでしょうか。
0530デフォルトの名無しさん2012/03/07(水) 21:50:53.38
Cancel = False
0531デフォルトの名無しさん2012/03/07(水) 23:34:23.81
教えてください。
まず変数aに1を代入し
DO LOOPの中でaを5にしました。

その後aを使うと元の1に戻っているのですが、
これは仕様ですよね?

この5という数値を使う方法はありませんか?
0532デフォルトの名無しさん2012/03/07(水) 23:41:52.46
>>531
仕様がないAH0
0533デフォルトの名無しさん2012/03/08(木) 00:12:08.65
VBAの変数にループ内のスコープなんてなかったよな?
>>531
とりあえずコード貼れ

0534デフォルトの名無しさん2012/03/08(木) 00:19:44.48
>>531
a = 1
Do
  a = 5
Loop Until True
MsgBox a
0535デフォルトの名無しさん2012/03/08(木) 00:22:36.75
>>533
すみません。質問した者です。
変数に追加していくのではなく、
毎回上書きしていただけでした・・・
初心者でごめんなさい。

' Do
' If r = 1 Then
' Exit Do
' End If

' total = Cells(r, 4)
' r = r - 1
' Loop
0536デフォルトの名無しさん2012/03/08(木) 00:56:45.28
>>535
謎すぎるけど解決したなら、よかった
0537デフォルトの名無しさん2012/03/08(木) 01:01:53.11
for系でないループで
中をIfとExitで制御している形はけっこう危険なんだよね。
思わぬ条件で抜けたり
一度も通らない経路ができたりする。
0538デフォルトの名無しさん2012/03/08(木) 01:02:17.51
=LEN(A1)
=LEN(A2)
=LEN(A3)

みたいな値をB列にA列の終わりまで入れていくにはどうしたらいいですか?
For文で回すんでしょうか・・・?

データの最終位置を取得するのに、「End(xlDown).Row」と、「(Rows.Count, 1).End(xlUp).Row」
ってどう違うんでしょうか?


MsgBox "End(xlDown).Row : " & Cells(1, 1).End(xlDown).Row
MsgBox "(Rows.Count, 1).End(xlUp).Row :" & Cells(Rows.Count, 1).End(xlUp).Row

↑
を、マクロ開始前のセルの位置をズラして色々やってみても結果は同じでした・・・。
0539デフォルトの名無しさん2012/03/08(木) 01:33:09.38
>>538
Cells(1, 1).End(xlDown).Row は上から順番に見ていく
途中に空白があると、それより下のデータは無視される

Cells(Rows.Count, 1).End(xlUp).Row は下から順番に見ていく
最終行までびっちりデータが入っている場合を除いて、本当の一番下がわかる
0540デフォルトの名無しさん2012/03/08(木) 01:45:52.43
>>539
分かりやすい説明をありがとうございました。

で、
=LEN(A1)
=LEN(A2)
=LEN(A3)
みたいのを入れてくには、やはりFor文で回すのでしょうか?
0541デフォルトの名無しさん2012/03/08(木) 02:04:48.60
>>540
数十行程度ならForでもいいと思う
もっと大量にある場合はオートフィルの方がプログラムがすっきりするし処理スピードも速いはず
05425402012/03/08(木) 02:21:23.52
>>541
ありがとうございます!
ググってみたところ、

Range("B1").AutoFill Destination:=Range("B1", Range("A65536").End(xlUp).Offset(, 1))

でいけるみたいです!この方が頭よさそうだし、スッキリ見やすいし、これでいきます!

おかげさまで安眠できます。
夜分遅くにお付き合いいただき、ありがとうございました!
0543デフォルトの名無しさん2012/03/08(木) 21:37:27.17
P列に区分として1又は9を入れた時、Q列に当日の日付を入れたい
で、その行位置は範囲は
2行目からlastrow = Cells(Rows.Count, "A").End(xlUp).Row
までとしてこういう時
どういう風に Worksheet_Changeに書けばいいんでしょ?
0544デフォルトの名無しさん2012/03/08(木) 22:20:58.13
>>543
何がわからないの?
0545デフォルトの名無しさん2012/03/08(木) 22:24:19.73
>>543
何も考えずにやれば、こう
lastrow = Cells(Rows.Count, "A").End(xlUp).Row
For i = 1 To lastrow
    If Cells(i, "P").Value = 1 Or Cells(i, "P").Value = 9 Then
        Cells(i, 17).Value = Now
    End If
Next

ただし、Worksheet_Changeでこれやっちゃうとループするので
違う所でやるか、変更箇所のチェックしてQ列なら変更しないとかの工夫が必要
0546デフォルトの名無しさん2012/03/08(木) 22:26:58.87
だからP列に1又は9を入れた時、その横に当日日付を入れたい
で、どう書けば良いのか?って聞いてんですけど
0547デフォルトの名無しさん2012/03/08(木) 22:31:28.83
リロードしてなかった。。。
>>545
ありがとうございます。
それを元にまた勉強してみます
0548デフォルトの名無しさん2012/03/09(金) 00:27:00.69
結構ggったのですが解決しないのでどなたかご教授ください!!
if
以下の3セルの内容が数字(全角・半角)でないとき
処理Aを行う
Sheet1.Cells(y, x)
Sheet1.Cells(y, x+1)
Sheet1.Cells(y, x+2)

else if
Sheet1.Cells(y, x)のみが数値(全角・半角)でないとき処理Bを行う

という処理を掛けたいです。
別の言い方をすると、セルが文字・全半角スペース・空の時に処理を掛けたいです。
If not と IsNumberで出来ると思いきや上手くいってません。
お願いいたします。

0549デフォルトの名無しさん2012/03/09(金) 00:27:09.17
>>545
cells(i,16)で書くよりCells(i,"P")で書いたほう
列が非表示だったら時便利ね!とか、関係ないことをオモタ
0550デフォルトの名無しさん2012/03/09(金) 01:08:49.15
With Sheet1

a = StrConv(.Cells(y, x), vbNarrow)
b = StrConv(.Cells(1, x + 1), vbNarrow)
c = StrConv(.Cells(1, x + 2), vbNarrow)

End With

If IsNumeric(a) = "False" And IsNumeric(b) = "False" And IsNumeric(c) = "False" Then
処理A
End If

If IsNumeric(a) = "False" And IsNumeric(b) = "true" And IsNumeric(c) = "true" Then
処理B
End If

ベッタベタでよければ どうぞ。
0551デフォルトの名無しさん2012/03/09(金) 01:15:04.82
>>550
ありがとうございます試してみます!!
IsNumeric IsNumberの使い方もあまりわかっていなかったので助かりました。
0552デフォルトの名無しさん2012/03/09(金) 02:42:06.08
>>550
IsNumericはBooleanなんだが、なぜ文字列で判定する?

ちなみにIsNumericは、全角の数字でもTrueの判定するから、StrConvする必要はなかったりする
指数表記も認めたりするから、数字の定義によっては注意が必要
0553デフォルトの名無しさん2012/03/09(金) 03:03:03.65
>>552
””いらないね。あっても動くけど。

If not IsNumeric(a)  And not IsNumeric(b) And not IsNumeric(c)
で書いてたんだけど、解りにくいかと思ってやった。
今は反省している。



全角の数字判定は知らんかったわ。便利ね。
ありがとう
0554デフォルトの名無しさん2012/03/09(金) 23:40:36.42
VBAは、無くなるの?
0555デフォルトの名無しさん2012/03/09(金) 23:51:09.95
それは目出度い
0556デフォルトの名無しさん2012/03/10(土) 00:40:01.35
JSサポートするという噂話だけ
0557デフォルトの名無しさん2012/03/10(土) 01:21:54.25
VBAにJavaScript???
0558デフォルトの名無しさん2012/03/10(土) 16:17:05.72
1行につき2シートずつ追加するマクロ(簡単に言うと)があります。

これが、72行ぐらいになって、シート数が159を超えたあたりから、シート追加の
「Copyメソッドが失敗しました」とエラーになります。

実際、そのブックでそれ以上シートを追加しようとしてもできません。
ググってみたところ、シート数に上限などはないようですが、メモリに依存するようです。

1枚1枚のシートは、それほど情報量はないのですが、Vlookup関数を多用してますので、
それもメモリを食っているかもしれません。
シート名も、平均22文字ぐらいあって、とても長いです。

一連のマクロは、一度も保存せずに、メモリ内だけで行っています。

データは、60行〜80行ぐらいまである時もあり、一括管理できるようにするため、
やはり1つのファイルに収めるのが理想的ではあります。。

どうすれば、このエラーを回避できるでしょうか?
0559デフォルトの名無しさん2012/03/10(土) 17:53:10.37
それってあるデータを見栄えのいいように整形するためにシートを作ってるって解釈でいいの?
0560デフォルトの名無しさん2012/03/10(土) 18:26:11.05
試したけど、空白シートをただ追加するだけなら5000シートでも問題なかった
Excel2007 on Win7

シート毎の有効行やvlookupなど、少しずつ条件を変えて状況が変わるか試してみたら?
原因が特定できれば対処も考えやすいと思う
0561デフォルトの名無しさん2012/03/10(土) 19:17:20.06
まず数百もシート作るっていう設計を考え直した方がいいんじゃないかと
0562デフォルトの名無しさん2012/03/10(土) 21:48:45.31
ここは64bit版の出番だな。
0563デフォルトの名無しさん2012/03/10(土) 22:17:58.69
Range("A1").Characters(Start, Length).TextのLengthに256を超える数値は指定できないんでしょうか?
257以上を指定したらCharactersクラスのTextプロパティを取得できませんってエラーが出るんです…
0564デフォルトの名無しさん2012/03/10(土) 22:42:09.93
>>563
うちの2007ではちゃんと動いてる
環境かけ
0565デフォルトの名無しさん2012/03/10(土) 22:49:30.49
>>564
Windows7 64bit版、Excel2010 32bit版です。。
0566デフォルトの名無しさん2012/03/10(土) 22:52:16.01
ntの頃は、鯖と普通のやつの違いがレジストリのどっかが違うだけだったネタがあったな
0567デフォルトの名無しさん2012/03/10(土) 22:53:02.68
>>566 誤爆
0568デフォルトの名無しさん2012/03/10(土) 22:54:11.13
今試したらRange("A1").Characters(Start, 257).Font.Bold = Trueとかは動くのに
Textプロパティだとエラーが出てしまいます。。
やりたいことはTextプロパティを使わなくてもできるので別の方法考えてみます。
0569デフォルトの名無しさん2012/03/10(土) 23:03:29.53
>>568
Length=256なら本当にOKなの?
0570デフォルトの名無しさん2012/03/10(土) 23:07:39.75
>>569
MsgBox Range("A1").Characters(1, 256).Text
MsgBox Range("A1").Characters(1, 257).Text
の両方を試して256はOKでした
0571デフォルトの名無しさん2012/03/10(土) 23:11:18.10
>>570
うちは同じ環境だけど、エラーでない
0572デフォルトの名無しさん2012/03/10(土) 23:15:31.25
>>571
ですよねぇ・・・
今までもRange("A1").Characters(Start, Length).Textという書き方は何度もしてきたと思うし
こんなエラーに出会ったことがないので、たぶん私が何か見落としてるんだと思います。
もうちょっと調べてみます。ありがとうございました。
0573デフォルトの名無しさん2012/03/10(土) 23:22:58.34
質問です。

今、ウインドウ枠の固定を使って、上から3行だけを固定で表示させるようにしています。
この固定部分にボタンを配置して、マクロを登録しようと考えています。

それで、ホイールを回せば4行目から下が上下にスクロールするわけですが、ホイールを
回して下に適当にスクロールさせて、固定部分のボタンを押す。
そうすると「画面に表示されている」上から4行目のセル番地を取得する。
そういうマクロを作成したいんですが、これは可能でしょうか?

すみませんがよろしくお願いします。
0574デフォルトの名無しさん2012/03/10(土) 23:33:19.28
>>573
MsgBox ActiveWindow.ScrollRow + 3
0575デフォルトの名無しさん2012/03/10(土) 23:42:17.38
>>574
おお!できた!
多分できないかなーと思ってたんで嬉しいです。
ありがとうございました。
0576デフォルトの名無しさん2012/03/11(日) 00:33:01.82
>>572
うちの2007でも、TextやCaptionを取得しようとするとエラーになるな
でも設定してもエラーにならずに正常に動く

Dim c As Characters
Set c = Range("A1").Characters(0, 260)
MsgBox c.Text   'ここでエラー

おかしいのはRange.Charactersメソッドじゃなくて
CharactersクラスのTextメソッドだな

エラーのMsgBoxの行を変えてテストした
c.Text = String(25, "W") 'これは正常に動作
c.Text = String(250, "W") 'これはエラーは出ないが動作してない
c.Text = String(256, "W") 'これはエラー

どうも怪しげな動作してるな
0577デフォルトの名無しさん2012/03/11(日) 02:56:35.77
Excelってなんでもできるんだなー
Excelで
0578デフォルトの名無しさん2012/03/11(日) 04:55:25.47
それは無理
05795102012/03/11(日) 09:10:27.01
誰か>>510 知ってる人いませんかね。
OSはXPでエクセル2002です。
0580デフォルトの名無しさん2012/03/11(日) 09:39:05.54
フォームの場合、エクスポートしたファイルには
フォームやそこに配置したコントロールのプロパティと
プログラムコードが1つのファイルに書かれているわけだが
インポートしたときにプロパティ領域とコード領域を分ける空行部分が
コードエディタ側に読み込まれるってだけの話だろ
0581デフォルトの名無しさん2012/03/11(日) 09:45:34.73
>>580
分かりやすい回答ありがとうございました。
0582デフォルトの名無しさん2012/03/11(日) 10:09:37.71
え、formってimportできるんすか?!!
この前 outportしてそのままimportしたら、class moduleになったので、もうてっきり無理なんだと。。。
05835582012/03/11(日) 14:30:33.27
>>559
ええと、業務用です。
取引先ごとに、表紙と帳票をセットにして、FAXするのですが、今までは帳票だけを
ガーッと保存もせずに、シート追加して作成するマクロがあって、別にFAXの表紙だけを
まとめたExcelファイル(取引先300件分のシートがあって、3,3Mくらいのファイル)
の中から、該当の取引先宛の表紙を探して、総FAX枚数や、帳票内の集計数なんかをちょちょっと
直して、印刷して、帳票とマッチングしてFAXしてたんですが、データ(取引先)が
72件もあると、結構2時間ぐらいかかる作業なんです。

この仕事を引き継いだ、元ヘタレPGの私としましては、なんとしてもマクロ化
しちゃいたい衝動にかられまして、FAX表紙は、ざっと3パターンしかなかったので、
取引先を一覧にして、表紙のテンプレに、Vlookup()で引っ張ってきて、
表紙と帳票とセットでシート追加するようにマクロを組んだんです。

そうしたらこのエラーです。
まあ、限界に挑戦するマクロだとは思うんですが、、元々の量の倍になってる
訳だし、、やっぱりファイルを分けるしかないのかな・・。

メモリを食ってる部分が、VlookUPなのか、シート名なのか、それともファイルを
保存してないせいなのか、ある程度でも分かれば、そこを対処してから、ファイルを
分ける方向で行こうかと思って質問させて頂いた次第です。

ひょっとしたらスレチかもしれませんが・・・。
0584558続き2012/03/11(日) 14:31:55.26
計算式より、値が入ってた方がExcelのメモリは食わないんでしょうか・・・?
ちなみにファイルサイズは、2.3Mくらいです。

ここ↓
http://oshiete.goo.ne.jp/qa/3047947.html
で、詳しく説明して下さってる方がいるんですが、ここでいう、「配列数式」や
「揮発性(volatile)関数」ってのが何のことなのか、いまいち分かりません。。
VlookUPのことなのか?だとしたら、VlookUPをマクロでやってしまった方がいいんだろうか・・・

長々とすみません。お知恵をお貸しくださいますと幸いですm(_ _)m
0585デフォルトの名無しさん2012/03/11(日) 14:38:02.97
vlookupでもシートでも話聞く限り、そこまでメモリ食う感じがしない
顧客名全部仮の名前にして、FAX表紙も適当なものに差し替えてファイルアップすれば
もっと具体的なアドバイスもらえるんじゃないかな
05865582012/03/11(日) 14:51:48.85
>>585
ありがとうございます。

ファイルは会社にあるので、アップするとしたら明日以降になりますが・・・。

最初のシートに、全ファイルの目次を作って、目次から、各シートに飛べるように
ハイパーリンクを組んだんですが、ひょっとしたらそれがいけなかった・・・?

VBA初めてなので、ソース見ていただいた方がいいかもしれませんね。。
0587デフォルトの名無しさん2012/03/11(日) 15:01:52.27
あと、エラーがでた環境も詳しく
OS、Excel、メモリ
05885582012/03/11(日) 15:16:02.07
>>587
了解しました!(OSはXP、Excelは多分2003・・・)
0589デフォルトの名無しさん2012/03/11(日) 15:56:09.31
Vista.sp2,Excel2000
新しいExcelで,Excel2000のソートコードが動くでしょうか
使っているコードです

sh2.Range("e9").Select
Rows("11:45").Select
Selection.Sort Key1:=Range("A11"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
:=xlPinYin
sh2.Range("e9").Select
0590デフォルトの名無しさん2012/03/11(日) 16:18:23.96
>>589
動くよ
0591デフォルトの名無しさん2012/03/11(日) 16:38:44.83
>>590
ほんとにありがと
0592デフォルトの名無しさん2012/03/11(日) 16:45:48.72
VISTA Excel2007
微妙にスレチっぽくて恐縮なのですが…
ExcelからADOでAccess2010ファイルに接続したいのですが
udlファイルを作成して、ダイアログでProviderとData Sourceを指定、接続テストも通るのに、
いざ次のコードでそのudlファイルを指定するとエラーになります
([ODBC Driver Manager]データソース名および指定された既定のドライバが見つかりません)
原因分かる方いますでしょうか
ADODBCon.Open UDL01_fPath

またExcelVBAでudlファイルのProviderの値の取得方法ってあるのでしょうか?
Data Sourceの値は以下のコードで取得できたのですが、Provider値の取得方法が分かりません
以下のコードでData Sourceの部分をProviderに置き換えてもエラーに
With CreateObject("ADODB.Connection")
.ConnectionString = "FILE NAME=" & UDL01_fPath
DB_FPath = .Properties.Item("Data Source").Value
  End With

以下、udlファイルの中身です
[oledb]
; Everything after this line is an OLE DB initstring
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\test\DB\Database1.accdb;Persist Security Info=False
0593デフォルトの名無しさん2012/03/11(日) 16:57:24.25
補足
UDL01_fPath    ’udlファイルのフルパス

udlファイルにアクセスする前に、udlのData Sourceに格納されたDBファイルの
存在チェックを入れており、その部分ではエラーがないので、
Providerの指定でエラーが起きてると思うんですが分かりません

最初はudlファイルのProviderとData Sourceの値をコード内で指定していたのですが、
その時はエラーはありませんでした
その時の値とをテキスト上にコピーして文字列を比較しても差異はありませんでした
0594デフォルトの名無しさん2012/03/11(日) 19:42:42.20
>>592
なんか良くわからんが、たぶん

ADODBCon.Open "FILE NAME=" & UDL01_fPath
MsgBox ADODBCon.Provider
0595デフォルトの名無しさん2012/03/11(日) 19:59:57.96
>>594
ありがとうございます!!
うまくいきました
こんな見落としで何時間も浪費していたなんて自分が情けない
0596デフォルトの名無しさん2012/03/12(月) 16:09:38.74
以前、>>447でカラーパレットについて質問したものです。
ユーザーフォームにボタン表面の色を変えたものを複数並べる
ことによって色を選ぶようにしました。

ボタン一つ一つのクリックイベントにコードを書いたのですが、
イベントの共有やどのボタンが押されたかを識別することによって
コードを簡素化したいのですが、VBAでそういったことは可能でしょうか?

ググったのですが、ブックの共有などの情報ばかりで検索しきれなかったので、
どなたか教えてください。
よろしくお願いします。
0597デフォルトの名無しさん2012/03/12(月) 18:41:11.31
application.caller で出来たっけ?
0598デフォルトの名無しさん2012/03/12(月) 19:51:06.54
オートフィルタをかけた抽出結果のタイトル行を除いた最初の行の、二番目の列から、
データの入っている有効セル全てをコピーするにはどうすればいいでしょうか?
0599デフォルトの名無しさん2012/03/12(月) 20:13:22.36
こんばんあ!しつもんだお!

for nextの後にcallでquerytable.addすると処理固まってしまうのですが、どうすれば良いですか?メモリとかバッファとかよくわかりません
0600デフォルトの名無しさん2012/03/12(月) 20:17:12.27
すいません。
VBAで32bit符号無し演算をしたいんですが、型がlongじゃダメです。(当然)

どんな技を使えば良いですか?
0601デフォルトの名無しさん2012/03/12(月) 21:01:49.30
>>596
Part17で似た質問をして、カラーパレットをクラスモジュールを使って作成したことがあります。
できてはみたものの、クラスモジュールはよく分かりませんでした。

VBやC#なら、どのイベントにどのプロシージャを結びつけるかをプロパティウィンドウで
簡単に設定できるようになっています。

VBAではそういう使い方は向いていないのではないか、と思います。
06025962012/03/12(月) 21:49:46.96
>>597,601
ありがとう。
Application.Callerをググったら、どの例もシート上のボタン等を調べるみたいで、
ユーザーフォーム上のボタンのクリックイベントでは使えないみたいです。

ttp://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1427920774

ここを見ても、601さんが書かれているように気軽にできる感じではなかったので、
ボタンのtagプロパティにカラーコードを書いておいて、activecontrolで識別するようにしました。
0603デフォルトの名無しさん2012/03/12(月) 23:05:54.84
>599

Long型でユーザー定義変数を作成し、
LSetステートメントで強制的に2つのLong型に分割。
2つのLong型を下位32bitと上位32bitで別々に計算し、
計算後に改めてCurrent型にLsetステートメントで合体。

という方法がある。

「VBA currency型のビット演算」でググるとよろし。
0604デフォルトの名無しさん2012/03/13(火) 12:18:48.28
>>603
ちょーthx.
0605デフォルトの名無しさん2012/03/13(火) 19:30:37.29
Excel2010

bookname = "D:\data\backup\data_xxxxxxxx.xlsx"

xxxxxxxxxx は作業日付

Worksheets("data").Copy
With ActiveWorkbook
.SaveAs Filename:=bookname
.Close
End With

としてdataシートを別ブックに保存しようとすると、このシートには
Activateになった時に作業をするモジュールがついていて xlsxでは
保存出来ないとExcelに言われてしまうんですが。。。
保存する際にモジュールは要らなくデータだけで良いんですけど
どうすればモジュールを切り離して保存出来るんでしょうか?

0606デフォルトの名無しさん2012/03/13(火) 19:41:52.71
>>605
今、手元にExcel2010が無いんで自信ないけど、
.SaveAs Filename:=bookname, FileFormat:=xlOpenXMLWorkbook

とかでどうだろ?
明日会社行けば試せるんだけど・・・
06076052012/03/13(火) 19:59:10.22
すごい!
出来ました。
そのFileFormat指定は初めてです。

ありがとうございます。m(__)m
0608デフォルトの名無しさん2012/03/13(火) 20:32:15.03
はろー。ループするとき処理待ちするにはどうすればいいですか?
0609デフォルトの名無しさん2012/03/13(火) 20:36:33.61
「こんばんわ、処理町隆史です」という。
0610デフォルトの名無しさん2012/03/13(火) 20:43:21.74
おれがずっと探し求めていたのはジャーマンスープレックスもといドゥーイベントカンスーだったようだ…
0611デフォルトの名無しさん2012/03/13(火) 21:55:34.65
>>608
DeEvents
0612デフォルトの名無しさん2012/03/13(火) 22:05:09.05
OS:XP Home 32bit
Excel:2003

条件を満たした場合、ソースコード自体を書き換える事は可能でしょうか?
0613デフォルトの名無しさん2012/03/13(火) 22:24:36.95
>>605-607
Application.DisplayAlerts = False
でいいんじゃないのか
0614デフォルトの名無しさん2012/03/13(火) 22:29:45.74
>612

できるけど、OSやExcelのバージョン違いに対する対応なら
#If〜#Then〜#EndIfや#Constの条件付きコンパイルを使うほうがよい。

どうしても書き換えしたいなら、参照設定で
「Visual Basic for Applications」に参照設定をすれば
VBEのコードそのものを直接VBAで動かせるようになる。
0615デフォルトの名無しさん2012/03/13(火) 22:35:10.19
>>613
Application.DisplayAlerts = False
↑
これは単にメッセージ出すのを抑制するだけですよ?
0616デフォルトの名無しさん2012/03/13(火) 23:37:57.80
>>615
xlsxで保存したらマクロは保存されない
警告なしで保存できるんだからそれでいいだろ
0617デフォルトの名無しさん2012/03/13(火) 23:53:25.53
>>613,616

なるほど。そういう手もあったんですね
0618デフォルトの名無しさん2012/03/13(火) 23:55:37.82
>>615
↑
お前がずれてますよ
605もアホだがエスパーすると…
…
…
…
警告なしに保存したいということだろ
だからDisplayAlerts=Falseが合っている
FileFormat指定が的外れ
警告はxlsxで保存するとマクロは保存されませんよ
ってことだからな
06195862012/03/14(水) 01:29:08.85
とりあえず、「Copyメソッドが失敗しました」のエラーが起こる簡易版のファイルを
作成しました。

http://www.vivi-loda.mydns.jp/index.php?m=dp&n=file1526
DLkey:asd

test1の方で実行しても、test2で実行しても、
こちらの環境(Win7 HomePreminum SP1(32ビット版)、Excel2003 SP3、メモリ3G)
だと、44シート追加したあたりで、当該エラーが出ます。

このファイルだと、マクロではエラーが出るものの、手作業でシート
追加はできますが、とりあえずこのエラーを回避したいです。(できるものなら)

ちなみにこのマクロを実行すると、一時的にPCが重くなったりするので、お気をつけください。


よろしくお願いいたします。
0620デフォルトの名無しさん2012/03/14(水) 02:19:08.42
>>619
自分の環境ではエラーにならない
Win7 Ultimate SP1 (64bit) メモリ8GB、Excel 2007 SP2
0621デフォルトの名無しさん2012/03/14(水) 03:45:17.31
>>619
Vista Ultimate SP2 32bit Excel2007 SP3もエラーなし
ちなみにシート500まで追加させても問題なし
2003の問題か、PCの問題だな

昔ディスプレイドライバー辺りのバグでExcelでメモリ不足出たことあったが
つかWin7でExcel2003とか動作保障あるのか
0622デフォルトの名無しさん2012/03/14(水) 04:00:24.00
>>619
流れ読んでないけど、ワークシートのコピーは複数回実行するとマクロでなぜかエラーになる現象がある。
標準のワークシートをコピーする関数を使うのはやめて、「ワークシートを追加→セル全体をコピー→ペースト」
という関数を作っておくと楽。
06236222012/03/14(水) 04:19:36.65
ちなみに >>619 のファイルを実行したらうちの環境
・Win7 Ultimate XP SP3 / Excel 2003 SP3 / メモリ3G
・Win7 Ultimate SP1 x86 / Excel 2003 SP3 / メモリ3G
・Win7 Ultimate SP1 x64 / Excel 2003 SP3 / メモリ8G
でも「実行時エラー '1004':

Worksheet クラスの Copy メソッドが失敗しました。」は出ます。
(エラーが発生する回数はランダム)

念のため確認ですが、手作業で「シートの追加」はできても「シートのコピー」はできないですよね?
で、ファイルを開き直すといったん復活して、再度実行すると同じ感じでエラーになる(毎回エラーに
なる回数は違う)ってやつですよね?

というよりか、マクロを使わないでも手動で何十回もシートをコピーすると、シートがコピーできないが
シートの追加はできるという現象は発生します。標準のシートコピーは使わないのがよいと思われます。

でも、この現象ってExcel 2007だと発生しないのか。知らなかった。
06246222012/03/14(水) 04:22:25.46
Win7 Ultimate XP SP3ってなんだ?そんなOSネーヨ(^_^;)
Win XP SP3の間違いです・・・。
0625デフォルトの名無しさん2012/03/14(水) 06:50:26.27
外部音源やMIDIデバイスを使わずにbeep音をディストーションギターの16和音にするにはどうすればいいでしょうか
0626デフォルトの名無しさん2012/03/14(水) 06:59:09.15
http://oshiete.goo.ne.jp/qa/1822561.html
No1参照
0627デフォルトの名無しさん2012/03/14(水) 12:09:50.35
縦のrangeを横のrangeにコピーするにはどうすれば良いですか
0628デフォルトの名無しさん2012/03/14(水) 12:30:24.18
>>627
マクロを記録してみろ
0629デフォルトの名無しさん2012/03/14(水) 17:08:15.94
範囲指定して数値のセルのみ抽出するにはどうすれば良いですか
0630デフォルトの名無しさん2012/03/14(水) 17:24:44.23
>>629
http://www.google.co.jp
0631デフォルトの名無しさん2012/03/14(水) 17:32:20.94
>>629
IsNumeric
0632デフォルトの名無しさん2012/03/14(水) 17:42:11.29
do loop 内の処理で繰り返した回数を得るにはどうすれば良いですか
0633デフォルトの名無しさん2012/03/14(水) 17:43:03.45
googleでdo loopって打ち込んだら画面が回ったwww
0634デフォルトの名無しさん2012/03/14(水) 17:49:15.82
>>632
変数作って数えさせろよ
0635デフォルトの名無しさん2012/03/14(水) 17:54:30.78
どう書けばよいでしょかお?
0636デフォルトの名無しさん2012/03/14(水) 18:05:08.53
Dim count as Integer
Do While true
    count++
Loop
0637デフォルトの名無しさん2012/03/14(水) 18:07:40.23
++は使えなかったかも
Dim count As Integer: count = 0
Do While True
count = count + 1
Loop
0638デフォルトの名無しさん2012/03/14(水) 18:14:02.46
あ、成る程ですthx
06396122012/03/14(水) 22:30:17.63
>>614
ありがとうございます
レスを参考に調べてみます
0640デフォルトの名無しさん2012/03/14(水) 22:55:04.43
VBAだけで就職先はあるのでしょうか?
Javaなどは募集をよく見ますが…

あとVBAとJavaは皆さんどのくらいでできるようになりましたか?
専門学校で学んだのですか?
0641デフォルトの名無しさん2012/03/14(水) 22:59:58.12
>>640
すれ違いなような
0642デフォルトの名無しさん2012/03/14(水) 23:45:13.32
>>640
VBAだけで就職は無理
Excelが使えるって条件の事務職員の募集なら見たことあるけど
0643デフォルトの名無しさん2012/03/15(木) 00:14:07.98
グラフの縦軸の値の最大、最小、目盛の間隔は自由に決めることはできますが、横軸もできますか?
Excel2003、2010どちらでもいいので、できるならばやり方を教えてください。
よろしくお願いします。
0644デフォルトの名無しさん2012/03/15(木) 00:48:20.37
>>643
縦でも横でもやり方は同じ
軸を右クリックすれば設定画面が出る
0645デフォルトの名無しさん2012/03/15(木) 00:51:34.04
           __
        , ‐' ´   ``‐、             / ̄:三}
.     /,. -─‐- 、.   ヽ        /   ,.=j
 _,.:_'______ヽ、 .!       ./   _,ノ
  `‐、{ へ  '゙⌒ `!~ヽ. !     /{.  /
    `! し゚  ( ゚j `v‐冫   , '::::::::ヽ、/     そんなことよりネコ投げようぜ!
.    {.l   '⌒      ゙ 6',!   / :::::::::::::::/ __
.     〈  < ´ ̄,フ  .ノー'_ , ‐'´::::::::::::::;/ (_ノ)‐-、
.      ヽ.、 ` ‐", ‐´‐:ラ ':::::::::::::::: ;∠.   ヽ_}  ゙ヽ
        ,.r` "´  /:::::::::::::::::::ィ´  `ゝ  !、  /
     /       / :::::::::::::::: ;な   /´\ /   r'\
.     i      ! ::::::::::::::/ る | .!::::::::/ヽ、.._!ヽ. ヽ、
     {      {:::::::::::;:イ / し ‖i:::::::/:::::::::::::/  \
.      ヽ       ヽ,.ァ‐'´ /ヽ ま ,/`ヽ、::::::::: /

http://i.imgur.com/iMDi4.jpg
0646デフォルトの名無しさん2012/03/15(木) 01:14:33.54
>>644
こんな時間にレスありがとうございます。
今2010でやってるのですが、右クリックすると軸の書式設定というメニューが
出るのですが、縦軸と横軸では項目内容が違っています。
横軸では、最大、最小、値の間隔はないです。
見てるところが違うのでしょうか?
0647デフォルトの名無しさん2012/03/15(木) 01:50:23.30
>>646
グラフの種類によっては変更できない
たとえば散布図だとどっちの軸も同じように設定が変えられる
0648デフォルトの名無しさん2012/03/15(木) 01:51:43.73
>>642
そのExcelが使えるってどの程度のレベルの使えるなの?

男でもある?
0649デフォルトの名無しさん2012/03/15(木) 02:01:33.59
>>647
ありがとうございます。
散布図で何とかできました。
0650デフォルトの名無しさん2012/03/15(木) 02:05:46.33
>>648
バイト価格だね
0651デフォルトの名無しさん2012/03/15(木) 02:17:39.55
VBAが使えるといえば普通は
Oracle SQLが使えるというのも含む
0652デフォルトの名無しさん2012/03/15(木) 05:00:10.04
VBAが正しく使えれば
DelphiだろうがJavaScriptだろうがJavaだろうがCだろうが
そんなに難しくない筈
むしろVBAのほうが難しいくらいかも
ただSQLはちょっと毛色が違うからVBAが使えることとSQL
が使えるということは同じだとは思わないほうがいいかも
0653デフォルトの名無しさん2012/03/15(木) 06:51:56.55
vbaで使うデータベースはなにが良いのですか?いまはシートにデータ並べてますけれど
0654デフォルトの名無しさん2012/03/15(木) 07:03:43.75
ググってきたら
0655デフォルトの名無しさん2012/03/15(木) 08:17:32.38
>>625
波形を気合いで計算してWAVの頭の構造体を気合いでくっつけてdirectsound8
0656デフォルトの名無しさん2012/03/15(木) 08:22:26.53
>>653
一番相性がいいのはもちろんAccess
0657デフォルトの名無しさん2012/03/15(木) 16:53:47.11
こんにちあ!

コード書き終えたの
ですけど12時間以上処理してるの
でアドバイスくれし
0658デフォルトの名無しさん2012/03/15(木) 18:07:40.25
コードを載せろよ
0659デフォルトの名無しさん2012/03/15(木) 18:30:36.11
>>657
ScreenUpdatingとか、よくある高速化テクニックは使ってる?
0660デフォルトの名無しさん2012/03/15(木) 18:33:58.45
XP/Excel2000
csvファイルを出力させたいのですが、見よう見まねで固定のファイル名が出せるところまでは辿り着きました。
次にファイル名をセル参照なり変数でつけたいのですが、どうしたらいいでしょうか?

Private Sub CommandButton1_Click()
Const cnsFILENAME = "\test.CSV"
Dim FSO As New FileSystemObject
Dim TS As TextStream
Dim GYO As Long
Dim GYOMAX As Long

GYOMAX = Range("C65536").End(xlUp).Row
Set TS = FSO.CreateTextFile( _
Filename:=ThisWorkbook.Path & cnsFILENAME, _
Overwrite:=False)
GYO = 3
Do Until GYO > GYOMAX

TS.WriteLine FP_EDIT_CSVREC(GYO, 2, 3)
GYO = GYO + 1
Loop
TS.Close

MsgBox "OK"

Set TS = Nothing
Set FSO = Nothing
End Sub
0661デフォルトの名無しさん2012/03/15(木) 19:32:54.15
>>660
Dim cnsFILENAME As String
cnsFILENAME = "\test.CSV"

とか

cnsFILENAME = Range("C5").Text

とか
0662デフォルトの名無しさん2012/03/15(木) 20:05:05.30
とりあえずscreenupdating使って見たんだけど、最小化してまた大きくしたら画面真っ黒になっちゃったよ

進行状況だけ表示しとけばよかったかなあ
0663デフォルトの名無しさん2012/03/15(木) 20:13:18.21
関数をワークシートにたくさん埋め込んでいるんだったら、作業中はOffにして作業後にOnに戻す
これはかなり効く(たくさん埋め込んでいたらの話だけど)
0664デフォルトの名無しさん2012/03/15(木) 21:12:15.18
どうやってoffにするのですかお
0665デフォルトの名無しさん2012/03/15(木) 21:15:09.26
もしかしてワークシート最小化にしてたらマクロ処理しないのですかお
0666デフォルトの名無しさん2012/03/15(木) 21:19:50.44
まずモニターのスイッチを切れ
0667デフォルトの名無しさん2012/03/15(木) 21:22:44.25
>>665

マクロの記録やってみれ

Excel2010では↓のようになった

Application.Calculation = xlManual

↓もとに戻す
Application.Calculation = xlAutomatic
0668デフォルトの名無しさん2012/03/15(木) 21:23:06.41
画面更新ができないような処理してるからだと
0669デフォルトの名無しさん2012/03/15(木) 21:30:59.55
>>640

VBA初心者レベル、Excelは基本操作もおぼつかない
当然ながらブラインドタイプとかはできないし、
ほかの言語などもまったく分からない。
というレベルで
週5日*1日8時間*時給1800円の仕事してます。
作業内容は一日分ずつのCSVファイルを一か月分にまとめたり
それをグラフにしたりするだけです。
チョー楽だけど退屈です。
0670デフォルトの名無しさん2012/03/15(木) 21:42:43.01
そういうことを出来るようにしてくれた人がいたってだけでしょ
0671デフォルトの名無しさん2012/03/15(木) 21:44:29.82
どういうこと?
0672デフォルトの名無しさん2012/03/15(木) 21:45:11.50
金で時間を買われてるな
0673デフォルトの名無しさん2012/03/15(木) 21:48:16.20
初心者っていう人がVBAでそういうことを出来るようにすることが出来るのかなって感じなんだけど
0674デフォルトの名無しさん2012/03/15(木) 21:48:39.69
>>672
時間を売って金を得て
金を使って時間を買うということ?
0675デフォルトの名無しさん2012/03/15(木) 21:50:45.28
ノルマこなして、お金もらってるだけでしょ
06766692012/03/15(木) 21:56:00.37
>>673
会ったこともない誰かが作ったマクロを使ってます。
ところどころパラメータ(セルの行とか列とかの指定)を書き換えて実行するだけです。

>>675
ノルマは特に無いです
というかむしろ早く終わりすぎたらマズイらしくて
一年かけてダラダラやってます。
0677デフォルトの名無しさん2012/03/15(木) 21:59:39.96
VBA使って効率化出来るのを目の当たりに見ると怒る人がいる、世の中だからね
コンピュータで処理できるようにしたのに、
コンピュータが勝手に作ってる
とか、言われたときは...
0678デフォルトの名無しさん2012/03/15(木) 21:59:45.52
結局669はVBAを使ってはいるけれど
プログラミングの仕事ではないってこと?
0679デフォルトの名無しさん2012/03/15(木) 22:01:22.71
>>676
お役所?
0680デフォルトの名無しさん2012/03/15(木) 22:04:50.80
>>676
大阪市?
ここだけの話で
06816762012/03/15(木) 22:09:47.46
>>678
一応、仕事の名目は
エクセルでのデータ整理です

>>679
公務員じゃないけど似たようなもんです。
業務の成果は求められてなくて、
ただ単に労働時間分の拘束をされてるだけって感じです。

>>680
ちゃいまっせ、ホンマにちゃいまっせw
0682デフォルトの名無しさん2012/03/15(木) 23:12:01.77
マクロの記録てこういうときにつかえるんだなあみつを
0683デフォルトの名無しさん2012/03/16(金) 00:43:25.24
ちょこっとわからない程度なら、部分的にマクロ記録のコードコピペしてます。
スピードも全く問題ないことがほとんど、使えなかった頃より実質こなせる業務がかなり増えた。
06845862012/03/16(金) 05:51:54.44
忙殺されて、、、レス遅くなってすみません。

>>620->>624
皆さん、ありがとうございます。

会社のPC(WinXP Pro SP3/Excel 2003 SP3/メモリ2G)
でもやはり44シート目で実行時エラーでした。

手持ちのもう一つのネットブック(Win7 32bit版/Excel2010/メモリ1G)
で試したら、エラーは出ず、なんと、500シートでも動きました。

2003のバグですかね。。

ありました・・・これですね。
http://support.microsoft.com/kb/210684/ja

-------
ブックに定義済みの名前を付けて保存したり、次のサンプル コードのように、ブックを閉じることがなく複数回ワークシートをコピーするとこの問題が発生することができます。
-------

発生することができます・・って・・・・
06855862012/03/16(金) 05:52:55.59
>>623
ええと、マクロ実行して、1004が出たての未保存のブックは、シートの追加はできても、シートのコピーはできません。
(エラーも出ず、一瞬画面がブレたようになって無反応)
いったん、保存して開きなおしたファイルだと、シートのコピーはできますが、再び、マクロを実行すると、

実行時エラー'1004':
シートの名前をほかのシート、Visual Basic で参照されるオブジェクト ライブラリまたはワークシートと同じ名前に変更することはできません。

となって止まり、
ブックをみると、test1を押した場合は、「テンプレ(2)」を、test2を押した場合は、「テンプレ2 (2)」のシートを追加しようとしてるところで、また同じ名前で追加しようとして、止まってる感じ・・・
ActiveSheet.Name =
がうまくいってないような感じです。

しかもエラーの回数はなんか毎回、44です。。PCに他にどんな重い処理をさせていても44。。会社のPCもそうでした・・。

なんだコレ・・私のやり方が何かおかしいのか・・・
06865862012/03/16(金) 05:55:19.72
このKBを見る限り、2007でも、2010でも発生するみたいですね。。
http://www.microsofttranslator.com/BV.aspx?ref=CSSKB&lo=SS&from=en&to=ja&a=http://support.microsoft.com/kb/210684/en-us?fr=1

テンプレートで保存して呼び出して使えって・・・。Vlookupで引っ張ってて、複数のシートがあっても大丈夫なんかな・・・

それとも100シートごとに保存するか・・・

それともシート挿入→末尾に移動→値の貼り付け→書式の貼り付け→印刷設定の貼り付け
という関数を作っておくか・・・

印刷設定がちゃんとなってるシートの印刷を手前において、反映したいシートを複数選択し、
印刷設定を開いてそのままOKボタンを押すと、複数のファイルに印刷設定が反映されるって
書いてあって、実際その通りだったけど、ウィンドウ枠の固定と、印刷タイトルの設定が反映されてなかった・・・

これだけ一個一個やるように関数に組み込むしかないのか・・・
06875862012/03/16(金) 05:56:10.36
そろそろ眠い・・・

しかもこの仕事を引き継ぐ人がマクロとか難しくて嫌だから、手作業でやりたいと言い出して、
このマクロは使われない可能性が高くなってきた・・・

中身なんて知らなくていいから、黙ってボタン押せっつーの!くそ・・・!

でも自己満で作るけどさ。

事務の世界っていつもこうなる・・・やっぱり私に事務は向かないのか・・かと言って、バケモンだらけのPGの世界ではこれ以上やってく自信がない・・・

>>677
あるあるあるあるあるある

=Exact() で簡単に同じかどうかのチェックなんて出来るのに、「目視確認でやった方が確実だから、目視でやって」、とか ┐(´д`)┌


チラ裏すみません。眠いです・・・
0688デフォルトの名無しさん2012/03/16(金) 08:09:03.03
>>661
サンクス
0689デフォルトの名無しさん2012/03/16(金) 09:49:02.14
Valueエラーが出るけどどこが悪いか分かる方いますか?
Function sealtime(A As Range, B As Range)

'Application.Volatile '自作関数を自動再計算させます。
Dim time As Double
time = Application.WorksheetFunction.ATAN((B - A) / 1)

If time < 0.005 Then
sealtime = "OK"
Else
sealtime = ""
End If

End Function
0690デフォルトの名無しさん2012/03/16(金) 09:55:24.55
とりあえず
Application.WorksheetFunction.ATAN
より
Atn
のほうがいんじゃね
0691デフォルトの名無しさん2012/03/16(金) 10:30:21.14
>>689
ワークシート関数が全部VBAで使えるわけじゃない
0692デフォルトの名無しさん2012/03/16(金) 11:13:02.48
ダブルクリックで画像を挿入したくてネットで調べて色々コピペして作ったんですけどたまにエラーが出ます
あと画像を開こうとしてキャンセルすると『1004 指定したファイルが見つかりませんでした』って出ます
どこを直せばいいでしょうか お願いします

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim myRange As Range
Set myRange = Range("C2:G10,C312:G21,C24:G32")
If Application.Intersect(Target, myRange) Is Nothing Then
Exit Sub
End If
Dim objFileName As String
Dim objShape As Shape
objFileName = Application.GetOpenFilename _
Set objShape = ActiveSheet.Shapes.AddPicture( _
Filename:=objFileName, _
LinkToFile:=False, _
SaveWithDocument:=True, _
Left:=Selection.Left, _
Top:=Selection.Top, _
Width:=242#, _
Height:=120#)
Cancel = True
End Sub
0693デフォルトの名無しさん2012/03/16(金) 11:32:07.34
あ なんかいけたっぽい こうしたらスムーズになった

sFile = Application.GetOpenFilename(FileFilter:="gif,.gif")
If sFile = "False" Then Exit Sub
0694デフォルトの名無しさん2012/03/16(金) 12:12:14.79
エクセル2003のグラフのことで教えてください。
グラフ上のマーカーの上にマウスカーソルを乗せるとデータが表示できますが、
その表示されたデータを取得することはできないでしょうか?
もしくは、そのマーカーに対応するセルをアクティブにする方法でもいいです。
どなたか、よろしくお願いします。
0695デフォルトの名無しさん2012/03/16(金) 12:32:19.74
>>694
できません
0696デフォルトの名無しさん2012/03/16(金) 12:50:50.80
>>694
マーカーに透明なラベルを被せたら余裕で何でもできる
0697デフォルトの名無しさん2012/03/16(金) 15:24:36.03
for each でレンジ範囲の文字列数え上げるとき、数え残すことある?
0698デフォルトの名無しさん2012/03/16(金) 15:27:49.62
>>697
例えば?
0699デフォルトの名無しさん2012/03/16(金) 15:35:26.75
count = 0
for each a in range("a1:e5)
if("あほ"=a.value) then
count =count +1
end if
next a

で、

for b =1 to a
にしてるんだけど、bがバグる
0700デフォルトの名無しさん2012/03/16(金) 15:35:57.24
さいごにnext bは入れてる
0701デフォルトの名無しさん2012/03/16(金) 15:41:28.29
>>699
aって何?
0702デフォルトの名無しさん2012/03/16(金) 15:41:47.29
>>699
○ For b = 1 To count
× For b = 1 To a
0703デフォルトの名無しさん2012/03/16(金) 15:45:00.17
ああcountにしてるけどバグる
0704デフォルトの名無しさん2012/03/16(金) 15:45:45.84
>>703
バグる?
0705デフォルトの名無しさん2012/03/16(金) 15:52:53.95
>>699
699がかなりあほってことでよろしいか?
0706デフォルトの名無しさん2012/03/16(金) 15:54:53.70
bに同じ数続くことがあるのでする
0707デフォルトの名無しさん2012/03/16(金) 15:57:41.20
マクロ記録をそのまま使ってる人いますか?
やはり自分で全部書くのが普通でしょうか。
0708デフォルトの名無しさん2012/03/16(金) 16:22:56.46
>>707
状況によるけど
そのままでは使い物にならないことが多い

ていうか、記録した方が早い部分と、自分で書いた方が早い部分とがあるので
うまく組み合わせた方が結果的に早くプログラムが完成する
0709デフォルトの名無しさん2012/03/16(金) 23:26:58.50
>>696
> >>694
> マーカーに透明なラベルを被せたら余裕で何でもできる
やり方教えてクレクレ
0710デフォルトの名無しさん2012/03/16(金) 23:51:19.86
DOSのコマンドライン引数を取得できないの?

Sub Workbook_Open
For I = 0 To ARGC -1
Debug.Print ARGV(I)
とか。
0711デフォルトの名無しさん2012/03/17(土) 00:08:29.34
>>709
そんな態度で教える馬鹿がいるか
0712デフォルトの名無しさん2012/03/17(土) 00:09:20.05
うっはwwwwwwいま気づいたんだけどもしかして時間かかる作業させるときってさいごにシート保存するコードとか入れたりするの当たり前だったりするわけですよねですよねえええ
0713デフォルトの名無しさん2012/03/17(土) 00:11:35.15
あたりまえだ
0714デフォルトの名無しさん2012/03/17(土) 00:14:16.48
ああもしかして指定時刻にセーブする処理とか入れてリスク管理してみたりするのかあああ
0715デフォルトの名無しさん2012/03/17(土) 00:34:43.42
>>711
おしえれ
0716デフォルトの名無しさん2012/03/17(土) 10:26:53.14
>>710
> DOSのコマンドライン引数を取得できないの?
>

GetCommandLine関数
0717デフォルトの名無しさん2012/03/17(土) 10:58:03.30
>>711
おしえれ ksg
0718デフォルトの名無しさん2012/03/17(土) 11:47:45.96
>>716
ありがとうございます。
http://msdn.microsoft.com/ja-jp/library/cc429108.aspx
ってこれ外部ライブラリ・コールか何かせんとあかんのやね、きっと。
0719デフォルトの名無しさん2012/03/17(土) 14:02:53.16

Private Declare Function GetCommandLine Lib \\\"kernel32\\\" Alias \\\"GetCommandLineA\\\" () As Long
Private Declare Function lstrcpy Lib \\\"kernel32\\\" Alias \\\"lstrcpyA\\\" (ByVal lpString1 As String, ByVal lpString2 As Any) As Long

Sub Workbook_Open

Dim sBuf As String

strBuf = Space$(255)
Call lstrcpy(strBuf, GetCommandLine())

Debug.Print strBuf

end Sub
0720デフォルトの名無しさん2012/03/17(土) 14:05:29.66
ごめん、p2で書いたら変な「\」がついちゃった

Private Declare Function GetCommandLine Lib "kernel32 " Alias "GetCommandLineA" () As Long
Private Declare Function lstrcpy Lib "kernel32 " Alias "lstrcpyA " (ByVal lpString1 As String, ByVal lpString2 As Any) As Long

こうね
07216942012/03/17(土) 22:07:32.08
グーグル先生ってすごい!
クリックで値が取れた!
0722デフォルトの名無しさん2012/03/18(日) 15:07:11.33
>>669
派遣ですか?
正社員がいいのですが
0723デフォルトの名無しさん2012/03/18(日) 15:17:58.27
腐るからやめろよ
0724デフォルトの名無しさん2012/03/18(日) 16:42:41.53
こんにつあ質問ですお

A1-E1に1,2,3,4,5値が振ってあって
A2-E2,A3-E3,....,A100-E100まで数値がランダムに入っています。
このとき各行を、それぞれ列の昇順で並べかえたい。つまりA2-E2,A3-E3,....,A100-E100とそれぞれ昇順に並べかえたいのですが、
そのとき1-5の値の対応を残したいのです。どうすればよいでしょうか!!
07256692012/03/18(日) 17:09:54.42
>>722
私は正社員ですがパートさんも居ます。
ただ、求人かけてないので・・・

あと、あまり詳しく書くと特定されそうなので
もうこれ以上書かないことにします。
とりあえず大阪府も大阪市も一切関係ない民間企業です。
0726デフォルトの名無しさん2012/03/18(日) 18:18:26.86
>>724
説明が下手すぎて質問が意味不明
0727デフォルトの名無しさん2012/03/18(日) 18:31:41.37
次の国会で青少年ネット規制法通すことにするわ
子どもたちを守るためには必要だよな
0728デフォルトの名無しさん2012/03/18(日) 19:12:42.15
>>724
おりあえず、A2:E2 をソートしたいらしい。
0729デフォルトの名無しさん2012/03/18(日) 19:38:33.54
>>724 とりあえずこれで皆の様子見てみて。
Sub Macro1()
' Version : Excel 2002 VB6.0

Range("A2:E2").Select
Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlLeftToRight, SortMethod _
:=xlPinYin, DataOption1:=xlSortNormal
End Sub
0730デフォルトの名無しさん2012/03/18(日) 20:05:11.79
たぶん要点は
>そのとき1-5の値の対応を残したい
だと思うんだが
具体的に何をどうしたいのかがさっぱり解らんな
0731デフォルトの名無しさん2012/03/18(日) 20:42:22.24
え…わたしの説明…ヘタすぎ!?
0732デフォルトの名無しさん2012/03/18(日) 21:06:10.55
んーとですねー
数値が入ってるセルを行毎に昇順で並び変えたときの、順番を取得しまして、
次にその順番を基準に、最初にセルがあった列番号を並べ変えてですね、
さらにそれにセルに入ってた数値を対応させたいのですけど、具体的にすればいいのかはわからなくて行を2行にするくらいしか思いつかないのですのでなにかよい方方法を教えてみて下さいマシマロ
0733デフォルトの名無しさん2012/03/18(日) 21:21:45.79
何言ってんだかさっぱりワカンネ
0734デフォルトの名無しさん2012/03/18(日) 21:28:55.25
ちゃんと説明しようとしない人間の質問に答える必要なし
0735デフォルトの名無しさん2012/03/18(日) 21:40:34.77
下記の様に作成したテキストボックスのShape objectを変数shSelに代入し
て、そこに文字列や書式設定をやりたい。

Sub mkTextBTest02()
  Dim shSel As Shape

    Set shSel = ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, _
      48#, 20 + 16 * lC, 10#, 16#)

    shSel.Characters.Text = lC '←$文字列を書く
    With shSel.Font '←$フォントの設定
      .Name = "MS ゴシック"
      .Size = 9
    End With
    shSel.ShapeRange.Line.ForeColor.SchemeColor = 1 '←$フォントの設定
End Sub

←$印の所でエラーが起きる。
.Characters .Font .ShapeRange は、class Shapeのpropertyでないから。
"ActiveSheet.Shapes.AddTextbox(〜).Select"として変数shSelの代わりに、
Selectionと書くとエラーが起きない。
class Shapeのproperty Characters,Font,ShapeRangeを指定するにはどうす
ればいいでしょうか。
07367292012/03/18(日) 21:59:27.07
こんな感じ? F-J は順列番号
BEFORE:
 A1   B1   C1   D1   E1  
+-------+-------+-------+-------+-------
  1    2    3    4    5  
 21   20   19   18   17  
 31   32   33   34   35  
 45   44   43   42   41  
 56   52   53   54   55  
 61   65   63   62   60  
+-------+-------+-------+-------+-------
AFTER:
 A1   B1   C1   D1   E1   F1   G1   H1   I1   J1 
+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
  1    2    3    4    5    1    2    3    4    5  
 17   18   19   20   21    5    4    3    2    1  
 31   32   33   34   35    1    2    3    4    5  
 41   42   43   44   45    5    4    3    2    1  
 52   53   54   55   56    5    1    2    3    4  
 60   61   62   63   65    2    5    4    3    1  
+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
0737デフォルトの名無しさん2012/03/18(日) 22:05:40.66
説明が分からないから答えようがないのかそれとも説明は分かるけれども態度が気に食わないから答えないのかもし仮に後者なら貴方こそレスする必要は無いし説明が分からないならば分からない箇所を指摘してくれれば返答できるのだが!!!
0738デフォルトの名無しさん2012/03/18(日) 22:07:03.60
736まさにそれですそれを2行にするか1行に続けて書くか以外になにか案はありますかないのならば1行に続けて書いた方がスマートなんでそうしますが
0739デフォルトの名無しさん2012/03/18(日) 22:14:21.32
元データの末尾に列番号を加える
元のデータ
12 54 . 8 23 36
これを
121.542 83 234 365
にしてから並べ替えれば、下1桁をチェックすれば元の位置がわかる
0740デフォルトの名無しさん2012/03/18(日) 22:20:57.88
>>737
ちゃんと例を上げて処理をひとつずつ説明しろ
変な言葉遣い止めろ
0741デフォルトの名無しさん2012/03/18(日) 22:36:53.87
なるほどおおおお0.0001とかにすれば誤差も出ないしいい感じですなあ
0742デフォルトの名無しさん2012/03/18(日) 23:30:16.99
>>741
どんだけ低脳なんだよ
いいわけないだろ
ただ複数の値を保持したいだけなんじゃないのかよ
データ用と表示用で表を分けるとか
Idプロパティ使うとかすればいいだろ
Idなら、
A.Idを降るプロシージャ(1〜5)
B.それぞれの行を並べ替えるプロシージャ
C.IdとValueを入れ替えるプロシージャ
を作って、ABで並べ替えた後、
CBCで元の並びに戻る
0743デフォルトの名無しさん2012/03/18(日) 23:36:09.02
あっはあidプロパティねthx!
0744デフォルトの名無しさん2012/03/18(日) 23:40:58.34
真性か・・・
0745デフォルトの名無しさん2012/03/19(月) 04:38:22.65
'
↑これを
エクセルのシート上で
="'"&A1
と書くとセルA1の文字列の前に ' が
連結されるのですが

VBAで

dot = "'"
Cells(A, 5) = dot & Cells(A, 1)

と書いてもA5セルの文字列(A1の中身)の前に ' が
表示されずA5セルをクリックすると
上部のセルの中身が見れるバーには ' が文字列の前に
表示されています。
A5セルを他のセルにコピーしても
文字列だけコピーされて ' はコピーされません。

VBAを使って、文字列の前に ' を連結させたいのですが
良い方法ありませんか?
0746デフォルトの名無しさん2012/03/19(月) 05:08:10.31
>>745
まず自分で調べろ
俺も知らなかったけど
ググったら載ってたぞ

いい加減にしろ!!
0747デフォルトの名無しさん2012/03/19(月) 08:02:09.18
>>746
VBAのプログラムがおかしいかと
何時間も考えたけど
ぐぐったら1分で解決しました
ありがとう
0748デフォルトの名無しさん2012/03/19(月) 22:01:31.40
>>735
以下の様に、変更するとテキストボックスをかけるようになった。

Sub mkTextBTest02()
  Dim shSel As Shape

  Set shSel = ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, _
    48#, 20 + 16 * lC, 10#, 16#)

  shSel.TextFrame.Characters.Text = lC '←$文字列を書く
  With shSel.TextFrame.Characters.Font '←$フォントの設定
    .Name = "MS ゴシック"
    .Size = 9
  End With
  shSel.Line.ForeColor.SchemeColor = 8 '←$フォントの設定
End Sub

VB Editorのヘルプを調べてわかった。
各くオブジェクトのpropertyと、propertyのobjectを定義するclassの区別
がついていなかった。
0749デフォルトの名無しさん2012/03/19(月) 22:12:28.38
C3に 11582.43、C4に11722.98という数字が入っています
ワークシートで= =C4-C3とすれば、140.55という数字が入ります
んで、VBAで同じように引き算で
Cells(4, 5) = Cells(4, 3) - Cells(3, 3)
とすると見かけ上は同じく140.55という数字が入っていますが、
上の関数入力するとこを見ると140.54999999
という数字になっています

なぜ?

この場合小数点以下三桁のとこで四捨五入しないとだめ?
0750デフォルトの名無しさん2012/03/19(月) 22:56:52.80
>>745
"'"は、セルが文字列型であることを示す接頭辞だから消えてしまう。
Cells(5, 1) = "''" & Cells(1, 1)
と書くか。
しかし、Cells(6, 1) = Cells(5, 1) 頭に"'"あるCells(5, 1)をCells(6, 1)
にコピーすると、Cells(6,1)では頭の"'"は消えてしまう。

しかし、Cells(A,5)と言う書き方、間違っているのでは。
0751デフォルトの名無しさん2012/03/20(火) 01:00:47.78
>>749
コンピュータで小数点以下を扱う場合は誤差がでることを考慮に入れる必要があるんだよ
ちなみにその計算式のセルを小数点以下20桁とかの表示にしてみ

>>750
>しかし、Cells(A,5)と言う書き方、間違っているのでは。
文法的にはAという変数でRowIndexを指定してる。間違ってはいない
まあ、意図したものと違うだろうって意味では間違ってるがw
0752デフォルトの名無しさん2012/03/20(火) 05:22:57.78
>>751
とりあえず、数字を100倍して引き算をし、その後また100で割るようにしておきました。
0753デフォルトの名無しさん2012/03/20(火) 10:39:54.04
sheetとsheetの結合ってどうやるの
0754デフォルトの名無しさん2012/03/20(火) 16:43:04.59
しーとと
しーとの
けつごう
0755デフォルトの名無しさん2012/03/20(火) 16:52:15.11
あのぉ…大量のデータをコピーしようとすると…リソース不足とでるんですが…
0756デフォルトの名無しさん2012/03/20(火) 17:38:02.76
型が一致しません、というエラーをスルーして処理を続けさせるにはどうすればよいですか?
0757デフォルトの名無しさん2012/03/20(火) 18:03:41.58
>>756
On Error Resume Next
0758デフォルトの名無しさん2012/03/20(火) 19:43:41.75
BookB の全部をコピーして、BookA に貼り付けて BookB を保存しないで、コピーしたデータも
他に使わないで、ただ閉じたいんですが、どう書けばいいでしょうか?

マクロの記録だと、ブックを閉じてしまうため、記録が残りません。
0759デフォルトの名無しさん2012/03/20(火) 19:53:02.06
全部をコピーって具体的には?
ぶっちゃけファイルコピーで済むようにも見える。
0760デフォルトの名無しさん2012/03/20(火) 20:35:55.01
Workbooks("BookB").Close False
0761デフォルトの名無しさん2012/03/20(火) 21:34:10.11
BBとか多い列数はどうやって数えますか?
0762デフォルトの名無しさん2012/03/20(火) 21:50:35.25
column関数
0763デフォルトの名無しさん2012/03/21(水) 00:03:45.84
if small (範囲,1)とするとエラーが出ます
どう書けばよいですか
0764デフォルトの名無しさん2012/03/21(水) 00:06:51.11
Application.Small
0765デフォルトの名無しさん2012/03/21(水) 00:40:15.33
出来ねええ
0766デフォルトの名無しさん2012/03/21(水) 00:41:18.41
>>761
かぞえなくても Cells(5, "BB") みたいに書けるからあんまり困らない
0767デフォルトの名無しさん2012/03/21(水) 00:42:22.85
application.smallが上手くいかない件
0768デフォルトの名無しさん2012/03/21(水) 00:44:11.28
多分それデータが悪い
0769デフォルトの名無しさん2012/03/21(水) 00:47:07.63
オブジェクトが必要ですとでてくる
0770デフォルトの名無しさん2012/03/21(水) 00:49:05.83
範囲って変数の型がRangeじゃないんじゃない?
これで動いたぞ

Dim 範囲 As Range
Set 範囲 = Range("A1")
Debug.Print Application.Small(範囲, 1)
0771デフォルトの名無しさん2012/03/21(水) 00:57:41.83
set c = worksheets("a").range(cells(1,1),cells(1,2))
これどこちがう
0772デフォルトの名無しさん2012/03/21(水) 01:01:05.19
>>771
エスパー能力を最大限に発揮すると思いつくのはこんなとこ

・シート名が"a"ではない
・セルの範囲が実は間違っている
・変数名がcではない
0773デフォルトの名無しさん2012/03/21(水) 01:07:26.09
今日のエスパー養成所はここかっ!
0774デフォルトの名無しさん2012/03/21(水) 01:07:38.93
アプリケーションの定義またはオブジェクトの定義のエラーですがでます
0775デフォルトの名無しさん2012/03/21(水) 01:09:11.73
>>771
Set c = Worksheets("a").Range(Worksheets("a").Cells(1, 1), Worksheets("a").Cells(1, 2))
又は
Set ws = Worksheets("a")
Set c = ws.Range(ws.Cells(1, 1), ws.Cells(1, 2))
0776デフォルトの名無しさん2012/03/21(水) 01:12:44.97
できますたwwwwありがとお
0777デフォルトの名無しさん2012/03/21(水) 01:52:04.45
右クリックの動作を処理に応じて変えることはできませんかね?
例えば最初は通常の動作(ショートカットメニューを表示)、あるコマンドボタンを押してから右クリックすると条件付き書式設定のダイアログボックスを表示、また別のコマンドボタンを押すと通常のショートカットメニューに戻す
0778デフォルトの名無しさん2012/03/21(水) 05:31:19.87
できます
0779デフォルトの名無しさん2012/03/21(水) 11:58:38.03
activecell.address で"$"つきの番地が得られます。
$なしの番地はどうすれば取得できるのですか?

そもそもなぜ$サインがつくのでしょうか?
0780デフォルトの名無しさん2012/03/21(水) 12:03:18.85
>>779
replace関数で"$"を""に置き換えるといいです
0781デフォルトの名無しさん2012/03/21(水) 12:58:56.00
>>779
ActiveCell.Address(False, False)

ヘルプを読めよ
式.Address(RowAbsolute, ColumnAbsolute, ReferenceStyle, External, RelativeTo)
0782デフォルトの名無しさん2012/03/21(水) 14:58:10.99
>>780,781
Thnx
0783デフォルトの名無しさん2012/03/22(木) 18:54:20.16
ちょっと教えてほしいのだが
引数明示して書くとき、例えば下のケースだが

Range(Cells(1, 1), Cells(1, 2)).Replace what:="111", replacement:="", MatchCase:=False

これはすべて小文字で入力したんだがmatchcaseだけ修正されるのはなぜなんだ?
0784デフォルトの名無しさん2012/03/22(木) 19:23:14.78
>>783
仕様だから、としか答えようがない
0785デフォルトの名無しさん2012/03/22(木) 19:53:58.40
>>784
ありがとう
謎仕様なんだな
0786デフォルトの名無しさん2012/03/22(木) 22:16:41.56
Microsoftだもの
0787デフォルトの名無しさん2012/03/22(木) 22:20:20.58
>>783
ホントだ、気持ちわりーな
0788デフォルトの名無しさん2012/03/22(木) 23:26:12.89
MatchCaseにカーソル置いてF1押すと、Sort.MatchCase プロパティ が表示できる
whatやreplacementだとキーワードが見つかりません。になる
MatchCaseってプロパティと勘違いして補正されてると思われ
0789デフォルトの名無しさん2012/03/22(木) 23:38:35.97
>>788
あーなるほど
理解した、ありがとう

しかしこれ気になるよな
ただ、直すのも面倒なんだよな
0790デフォルトの名無しさん2012/03/23(金) 08:04:17.83
directXから音を鳴らしているのですが
音量を変えるにはどうしたらいいでしょうか

http://up1m.ko.gs/src/koups1393.zip
0791デフォルトの名無しさん2012/03/23(金) 14:09:48.74
>>790
>>2
0792デフォルトの名無しさん2012/03/23(金) 15:08:59.92
>>778
遅くなりましたが出来ました。
もう一つ質問なのですがCtrlキーを押しながら任意のセルを選択した時、そのアドレスを全て取得するにはどうすればよいのでしょうか
例えば、A1、A3、A7、B1、B2、B4、C3、C4、C5を選択した時にこの9個のアドレスを取得したいのです
0793デフォルトの名無しさん2012/03/23(金) 15:16:28.75
>>792
Application.Selection
07947922012/03/23(金) 16:17:34.92
>>793
わかりませぬ、具体的に教えて下さい。
0795デフォルトの名無しさん2012/03/23(金) 17:27:44.81
debug.print application.selection.address
0796デフォルトの名無しさん2012/03/23(金) 18:07:16.00
条件付き書式を設定したセルをアクティブにして
これ以外のシートの内容を下のマクロで消すと表示がおかしくなるんだけど
なぜなんだ??

sub test
worksheets(2).cells.delete
end sub

条件書式以外にもindirectを使ったセルでもおかしくなる
0797デフォルトの名無しさん2012/03/23(金) 18:11:20.36
worksheets(2)を参照してたからじゃないの?
07987922012/03/23(金) 18:16:57.46
Dim Sel_Addr As String
Sel_Addr = Application.Selection.Address
としたら取得できました。
0799デフォルトの名無しさん2012/03/23(金) 18:35:18.85
いちいちそんな報告いらん
0800デフォルトの名無しさん2012/03/23(金) 18:54:15.56
>>797
参照って
=Sheet2!A1みたいに使ってるかってことか?
なら使ってない

表示がおかしいって書いたが、アクティブセルの囲い線が残るような感じ
0801デフォルトの名無しさん2012/03/24(土) 07:44:03.99
>>800
単なるバグじゃないの?
ScreenUpdatingをFalseにしてからworksheets(2).cells.deleteしたらいい
0802デフォルトの名無しさん2012/03/24(土) 15:01:00.18
>>801
やっぱりバグなのかー
ありがとう
0803デフォルトの名無しさん2012/03/24(土) 16:18:46.43
formの表示中に自由にセルを選べるように
したいのですが・・・
0804デフォルトの名無しさん2012/03/24(土) 16:21:04.88
>>803
モードレスで開けばいい
0805デフォルトの名無しさん2012/03/24(土) 16:21:48.60
vbModeless
0806デフォルトの名無しさん2012/03/24(土) 16:26:46.00
>>804
Thnx

モードレスで、表示すればよいのでは?

UserForm1.Show vbModeless
とか
UserForm1.Show 0
0807デフォルトの名無しさん2012/03/24(土) 16:38:43.39
A1とかセルの座量をべた書きするんじゃねーよ
セルに名前を付けて名前経由で座標を指定しろよ

ソース解析&改造しててやりにくくてしかたない
0808デフォルトの名無しさん2012/03/24(土) 16:49:06.55
複数のCSVファイルを1つにしたくて
調べたら
以下のサイトが参考になったので
ttp://ziddy.japan.zdnet.com/qa3168255.html?order=DESC&by=datetime



Sub CSV結合()
Const CRFILE As String = "C:\My Documents\test2"
Dim obj As Object
Dim arg As String

Set obj = CreateObject("Shell.Application") _
.BrowseForFolder(0, "SelectFolder", 0)
If obj Is Nothing Then Exit Sub
arg = obj.self.Path & "\*.csv "
Set obj = Nothing
Call Shell(Environ("ComSpec") & " /c copy /b " & arg & CRFILE)

End Sub

とやっているのですがうまくいきません。
フォルダ選択の画面はでてくるのですが
C:\My Documents\test2
に結合されたCSVファイルができるはずですが、できなくて。

ソース間違ってますか?
エクセル2007です。
0809デフォルトの名無しさん2012/03/24(土) 17:01:15.46
書き出すファイル指定が間違ってるかと思い
Const CRFILE As String = "C:\test2"

Cドライブ直下にtest2フォルダ作ってみてもだめでした
0810デフォルトの名無しさん2012/03/24(土) 17:07:43.90
Shell関数に渡しているコマンドライン文字列を確認したら?
とりあえず、空白を含むパスはダブルクォートで囲まないと駄目だ。
0811デフォルトの名無しさん2012/03/24(土) 17:15:53.57
>>808
Const CRFILE As String = "C:\My Documents\test2.csv"

で出来たけど?
0812デフォルトの名無しさん2012/03/24(土) 17:20:05.20
>>808
>>2
0813デフォルトの名無しさん2012/03/24(土) 17:37:21.02
>>807
こめんなさい。心当たりが沢山ありすぎてもう…
0814デフォルトの名無しさん2012/03/24(土) 17:41:43.68
>>810
コマンドライン文字列とはなんですか?

他にCSVファイルを2個作ってみたけどだめでした。


>>811
拡張子つけたけどだめでした。


>>812
XPでエクセル2007です


ソースをステップ実行させても
全部の行を実行してるのに
なんだろうこれは・・・
0815デフォルトの名無しさん2012/03/24(土) 17:50:40.99
Const CRFILE As String = """C:\My Documents\test2.csv"""
0816デフォルトの名無しさん2012/03/24(土) 17:54:23.10
> XPでエクセル2007です

そう来るかw
0817デフォルトの名無しさん2012/03/24(土) 18:38:25.29
>>814
>>2
0818デフォルトの名無しさん2012/03/24(土) 19:20:45.41
>>775
これで指定したレンジ範囲の数値を、小さい順に並べた場合の各々の差が、x以上であるとかx以下であるといった判定をするにはどう書けばよいですか!
0819デフォルトの名無しさん2012/03/24(土) 20:30:24.96
>>818
IsNumeric関数とIfステートメントを使う
詳細はヘルプを読めばわかる
0820デフォルトの名無しさん2012/03/24(土) 22:05:47.67
isnumericじゃできなくね?
0821デフォルトの名無しさん2012/03/24(土) 22:08:14.94
数値かどうかの判定に必要だと思ったんだけど、不必要だと思ったなら使わなくても何ら問題ない
強制力なんかないからね
0822デフォルトの名無しさん2012/03/24(土) 22:55:40.15
if a1>a2+x>a3+x thenが上手く動かないのだが、なぜか?
0823デフォルトの名無しさん2012/03/24(土) 22:59:30.43
>>822
if a1>a2+x and a2+x>a3+x then
0824デフォルトの名無しさん2012/03/24(土) 23:02:42.68
これがa3までじゃなくa100まである場合、どうすればいい?
0825デフォルトの名無しさん2012/03/24(土) 23:04:33.81
誤り if a1>a2+x>a3+x then
訂正 if a1>a2+x>a3+2x then
0826デフォルトの名無しさん2012/03/24(土) 23:07:17.88
そうか全組み合わせの差の絶対値の最小値がx以上ならいいわけか

しかしx以下の場合を求めたいときはどうすればいい?
0827デフォルトの名無しさん2012/03/24(土) 23:08:16.93
何だVBA力のおっさんか
0828デフォルトの名無しさん2012/03/24(土) 23:13:47.11
>>824
VBAを使うしかないだろうな
0829デフォルトの名無しさん2012/03/24(土) 23:23:17.89
>>824
アンダースコアを使えばステートメントを複数行に分けて記述することができる
例えばこんな感じ
If 条件式1 And _
条件式2 And _
条件式3 And _
条件式4 And _

既にスレチなので>>2をよく読んでくれ
0830デフォルトの名無しさん2012/03/25(日) 02:53:38.96
例えば処理したい「実行1」というプロシージャがありあまして。

call 実行1
で普通に処理されるのですが。

Dim moji As string

moji = "実行1"

call moji

は当然ですが実行されません。ですが、何かプロシージャそのものを変数化させて
状況に応じて呼び出せるようにする方法があるでしょうか?

ユーザーフォームのリストボックスに何十種類ものプロシージャがあるのですが、それらを
効率的に場合わけして処理するのに、それが出来ると便利なのですが。
方法はないのでしょうか?
0831デフォルトの名無しさん2012/03/25(日) 03:35:34.73
>>830
Application.Run ThisWorkbook.Name & "!" & moji

普通は Call ほにゃらら(moji) ってやって、ほにゃららの中でmojiによって分岐するようなプログラムを書くもんだけど
0832デフォルトの名無しさん2012/03/25(日) 03:37:32.62
ifとかselectでそれらを場分けしてcallする処理を1個用意すりゃ良いじゃん
つか普通そうする
プログラミングの手法とかそういう話だから後はそういうスレで聞いてくれ
0833デフォルトの名無しさん2012/03/25(日) 03:38:56.85
あ、リロードしないのが自分の悪いクセだな…
0834デフォルトの名無しさん2012/03/25(日) 06:28:18.30
>>831
ありがとうございます。

>>832
実はそのように、select で、分岐していたんですが、数が多くなりすぎて。
ただ、selectの分岐がいくら多くなっても、速度とかに影響するという
わけでもないので、良いといえば、良いのですが、スマートにできないかと
気になってしまいまして。
0835デフォルトの名無しさん2012/03/25(日) 12:59:29.22
for i=1 to n
if a(i-1) - a(i) <= x then y= false
next I
0836デフォルトの名無しさん2012/03/25(日) 15:22:52.17
a列とb列の相関を調べたい
0837デフォルトの名無しさん2012/03/25(日) 15:31:17.78
VBA使う必要ないけど
0838デフォルトの名無しさん2012/03/25(日) 17:04:00.73
複数のCSVファイルをひとつのXLSファイルへまとめるにはどのようにしたら効率がよいですか?
20120201.csv
20120202.csv
・・・
20120228.csv
というファイルを201202.xlsファイルにまとめたいと考えています。
(シート名を01,02,・・・,28にして、1bookに28シートが出来上がるイメージ)
0839デフォルトの名無しさん2012/03/25(日) 18:13:25.03
>>838
ご自身のコーディング速度と手作業での速度を比較してみればどちらが効率がよいか一目瞭然です
1回限りの作業であれば手作業でやるのが一番効率がよいでしょう
ExcelVBAに関係がない話題なのでこのへんで終了
0840デフォルトの名無しさん2012/03/25(日) 19:06:52.20
配布物にExcelを利用したいのですが
配布物の中の別のファイルの情報を取得する場合
ttp://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_140.html
で相対パスだと危険があるとあったのですが
ThisWorkbook.Path & "\..\date\ファイル名"
のようなやり方だと階層をまたいでも中をいじられない限り
どんな環境の人が使っても問題ないと思っていいのでしょうか

それと、相対パスで一つ上の階層に行くやり方で
Dim mPath As String
mPath = ThisWorkbook.Path
i = Len(mPath) - Len(Replace(mPath, "\", ""))
If i > 1 Then
mPath = Mid(mPath, 1, InStrRev(mPath, "\") - 1)
End If

というやり方が紹介されていたのですが
これは..に対して上に階層があるのか調べる機能が付いただけ
という認識でいいのでしょうか
0841デフォルトの名無しさん2012/03/25(日) 19:18:37.85
>>840
お前の認識間違えてるぞ
アホ
ちゃんと読め
0842デフォルトの名無しさん2012/03/25(日) 19:18:46.91
>>840
すべてにおいて見当違い
手始めに「相対パス」がなんなのか理解してきた方がいい
0843デフォルトの名無しさん2012/03/25(日) 20:40:54.08
>>839
一回限りの作業ではなく、毎月発生する作業です。

現在は

新しいブックに開く→シートの移動

を繰り返すコードにしてるのですが、
見るからに効率が悪くなっています。
0844デフォルトの名無しさん2012/03/25(日) 20:51:07.07
>>842
相対パスって基準から見た位置ですよね
URLのは基準を指定しないとカレントフォルダからになるから危なくて
ThisWorkbook.Pathで基準をブックのある位置を指定すれば問題ないのかなと思ったんですが
0845デフォルトの名無しさん2012/03/25(日) 20:57:55.20
>>843
検索すれば、参考になるコードいくらでも出てくるだろ。
Dir 関数使えばいいんじゃない。
0846デフォルトの名無しさん2012/03/25(日) 21:37:10.43
>>843
見るからに効率が悪いことに気づいてるんだったら改善すればいい
0847デフォルトの名無しさん2012/03/25(日) 21:37:33.36
>>844
「危ない」とか「問題」ってのは具体的にどういうことなの?
具体的に説明してくれないと誰もわからないよ
0848デフォルトの名無しさん2012/03/25(日) 21:55:49.31
>>843
QueryTables.Add使え
0849デフォルトの名無しさん2012/03/25(日) 22:44:15.07
>>847
「絶対的基準に基づいてないから危ない」とか言い出すぞw
0850デフォルトの名無しさん2012/03/25(日) 22:54:44.01
>>844
もう一回お前のリンク先読み直してから来いよ
音読な
0851デフォルトの名無しさん2012/03/26(月) 01:01:30.47
>>838,840
Excelどうこうよりも、まず日本語の読み書きを勉強した方がいいと思う
社会人になってから苦労するよ?
0852デフォルトの名無しさん2012/03/27(火) 16:27:18.20
EXCEL VBAは基本的にはオブジェクト指向言語。
だからJAVA, C++と同様にクラス間の継承もあるが、EXCELで予め定義された
既存のクラスのみでその関係があり、↓ここを見るとプログラマが定義する
マクロのクラスで、継承関係にあるものを作ることはできないみたい。
http://members3.jcom.home.ne.jp/daruma_kyo/aboutooa/vba_limit.html

既存のクラスの継承関係。例えば、collection WorkSheets,Chartsは、
collection Sheetsを継承している。

ActiveWorksheetでその時にカーソル(focus)を当てているものを示す、
property Selection。

その時にカーソルを何に当てているかによって、Selectionのクラスが、
Range, Shape, ChartAreaなどに変化しているみたい。

このproperty Selectionを定義しているクラスは、多分、あらゆるクラス
の継承元になっているclass "Object"でないかと思っていますが、
どうなんでしょうか。
0853デフォルトの名無しさん2012/03/27(火) 16:48:39.95
>>852
オブジェクトブラウザというものがある
0854デフォルトの名無しさん2012/03/27(火) 17:19:20.10
複数の行の挿入が面倒くさかったのでVBAを学んでみようと思ったのですが試しに作ったマクロが
Sub 行の挿入()
Dim i As Integer
i = 1
Rows("i:2").Insert Shift:=xlDown
End Sub

型が違うと出てきます
iの定義が間違ってるのかと思うのですが
LongやVariantなども試したもののだめで、整数値で型が違うといわれるのもなぜかわかりません
初歩的で申し訳ないですが教えてください
0855デフォルトの名無しさん2012/03/27(火) 17:40:07.26
>>854
“Rows”の上にカーソルを置いて[F1]キーでヘルプを開いて読め
0856デフォルトの名無しさん2012/03/27(火) 17:58:53.56
>>855
できました
ありがとうございます
0857デフォルトの名無しさん2012/03/27(火) 21:51:31.61
>>852
>EXCEL VBAは基本的にはオブジェクト指向言語。
VBAはもともとオブジェクト指向ではない言語をオブジェクト指向に拡張した言語(の派生)
オブジェクト指向言語だと言いきるには不備が多い

>既存のクラスの継承関係
基本的に継承関係は保障されているわけではない(と思う。保障されてるならソース教えてくれ)
つまり(Setによる代入で)キャスト出来るかどうかは実行してみないと解らない

>ActiveWorksheetでその時にカーソル(focus)を当てているものを示す、property Selection。
ActiveWorksheetなんてクラス(型)はない。WorksheetにはSelectionなんてプロパティはない

>Selectionのクラスが、(略)変化しているみたい。
Selectionなんていうクラスも無いのは理解できてるのか?
(Windowクラスの)Selectionの戻り値の型について、Object型で実際はいろんな型が戻されるんだぞ

>このproperty Selectionを定義しているクラスは、
Selectionなんてクラスはないし、Selectionプロパティを実装(定義)してるクラスはどんな型だろうと関係ない
問題はSelectionプロパティ(の戻り値)の型

>あらゆるクラスの継承元になっているclass "Object"でないかと思っています
VBAにはObjectという型はあるが、Objectクラスというクラスはない(はず)
Object型にはあらゆるクラスが格納できるが、それは全てのクラスがObjectから派生してることを意味しない
なぜならVBAは純粋なオブジェクト指向言語ではないから
0858デフォルトの名無しさん2012/03/28(水) 11:52:43.27
>>857
> 基本的に継承関係は保障されているわけではない(と思う。保障されてるならソース教えてくれ)
> つまり(Setによる代入で)キャスト出来るかどうかは実行してみないと解らない

できない例は?
0859デフォルトの名無しさん2012/03/28(水) 14:59:45.96
>>>857
class, object, collection, propertyの概念の区別がきっちりできていな
いです。

>>Selectionなんてクラスはないし、Selectionプロパティを実装(定義)してるクラスはどんな型だろうと関係ない
object browserで見ると、Selectionはobject Applicationとobject Windows
のmember(property)になっているみたいです。

これのヘルプを見る。
>>Property Selection As Object 読み取り専用
>>Selection プロパティ
>>Application オブジェクトでは、アクティブウィンドウで現在選択されて
>>いるオブジェクトを返します。
>>Windows オブジェクトでは、指定されたウィンドウで現在選択されている
>>オブジェクトを返します。

>>オブジェクト指向言語だと言いきるには不備が多い
↓参考
http://sites.google.com/site/compositiosystemae/home/vbaworld/upper/exp3/polymorphi

VBAのclass moduleでクラスを定義するとき
クラスの構築子(constructor)に当たるもの Class_Initialize()
クラスの消滅子(destructor)に当たるもの Class_Terminate()

構築子の引数はサポートされていない。
0860デフォルトの名無しさん2012/03/28(水) 16:13:38.21
>>859
> class, object, collection, propertyの概念の区別がきっちりできていな
> いです。

できてないのはお前だけじゃないの?
0861デフォルトの名無しさん2012/03/28(水) 16:32:30.71
なんかVBAがオブジェクト指向的に駄目だ駄目だって言う奴多いけど、
適切なところでclassモジュールを使って、VBAで使える範囲の機能を
使えばいいのにっていつも思う。

とか言うと、VBAじゃ適切なところなんてない的な話になりがちな気がするが。
0862デフォルトの名無しさん2012/03/28(水) 16:36:41.16
この手の話を質問スレでしないで欲しい
自分の中で答え持っててそれを主張するだけなんだから
0863デフォルトの名無しさん2012/03/28(水) 16:57:49.74
VBAスレはここだけしかないんだから、ここでいいだろ
08648622012/03/28(水) 17:07:48.32
あ、これ質問だったのか
ごめんよく読んでなかったは
0865デフォルトの名無しさん2012/03/28(水) 17:23:26.77
ガキはすっこんでろ。
0866デフォルトの名無しさん2012/03/28(水) 23:12:36.94
>861

はげどう。
継承だって工夫すればできるし、
コンストラクタの引数がないのも特別不便ではない。

0867デフォルトの名無しさん2012/03/28(水) 23:31:02.19
オブジェクト指向厨は市ね。
VBAごときの小規模アプリに
オブジェクト指向など無用だ。
0868デフォルトの名無しさん2012/03/28(水) 23:33:47.05
工夫した継承はコード量が多く、結局オブジェクト不志向(データ志向っての?)に落ちついてしまう
って事があったなーと、ふと思い出したっす。
0869デフォルトの名無しさん2012/03/28(水) 23:45:10.16
ツールバー追加のマクロを組んだのですが、ブックを閉じるときに
ツールバーを削除しようとするとエラーが出ます。
原因をご教示下さい。
コードは長くなるので分けて書き込みます。
0870デフォルトの名無しさん2012/03/28(水) 23:48:22.21
Private Sub Auto_Open()
Dim xlAPP As Application
Dim objBar As CommandBar
Dim objCont As CommandBarControl
Dim objBtn As CommandBarButton
Dim vntCaption As Variant , vntTipText As Variant , vntOnAction As Variant
Dim IX As Integer
Dim blnTRUE As Boolean
Set xlAPP = Application
vntCaption = Array("登録(&A)", "更新(&U)", "削除(&X)")
vntTipText = Array("登録を行ないます", "更新を行ないます", "削除を行ないます")
vntOnAction = Array("BTN_TOUROKU", "BTN_KOUSHIN", "BTN_SAKUJO")
Set objBar = xlAPP.CommandBars.Add(Name:=g_cnsTITLE, Position:=msoBarTop)
blnTRUE = False
For IX = 0 To 2
Set objCont = objBar.Controls.Add(Type:=msoControlButton)
objCont.BeginGroup = blnTRUE
' CommandBarButtonオブジェクトの参照を取得
Set objBtn = objCont
objBtn.Style = msoButtonCaption
objBtn.Caption = vntCaption(IX)
objBtn.TooltipText = vntTipText(IX)
objBtn.OnAction = vntOnAction(IX)
blnTRUE = True
Next IX
objBar.Visible = True
objBar.Protection = msoBarNoChangeVisible
ActiveWindow.ScrollRow = 1
Set objBtn = Nothing
Set objCont = Nothing
Set objBar = Nothing
End Sub
0871デフォルトの名無しさん2012/03/28(水) 23:50:44.42

' 閉じる時の自動実行処理
Private Sub Auto_Close()
Dim xlAPP As Application
Dim objBar As CommandBar

Set xlAPP = Application
★Set objBar = xlAPP.CommandBars(g_cnsTITLE)
objBar.Delete
Set objBar = Nothing
End Sub

★の部分で
実行時エラー'5':
プロシージャの呼び出し、または引数が不正です。

となります。原因と対策をご教示下さい。
0872デフォルトの名無しさん2012/03/29(木) 00:07:11.46
>>871
g_cnsTITLEに該当するツールバーがないんじゃない?
0873営利利用に関するLR審議中@詳細は自治スレへ2012/03/29(木) 00:17:48.05
>872
直接ツールバー名を指定したら無事動きました。
ありがとうございました。
0874営利利用に関するLR審議中@詳細は自治スレへ2012/03/29(木) 10:35:16.91
>>868
Strategy Patternとか超便利なんですけど。
0875営利利用に関するLR審議中@詳細は自治スレへ2012/04/02(月) 20:03:26.77
動的に作成したCommandButtonにクリックイベントを
登録するにはどうすればいいの?
0876営利利用に関するLR審議中@詳細は自治スレへ2012/04/02(月) 20:29:50.48
Outlookで仕事で毎日送ってるメールがあるんだけど
本文で日付以外は全部一緒。

Templateで、日付もその日のが自動入力、って設定する方法はどうやりますか?
マクロでもokです。
0877営利利用に関するLR審議中@詳細は自治スレへ2012/04/02(月) 20:45:11.26
date | Mail -s 今日のメール [email protected]

Unix使えよオマエら
0878営利利用に関するLR審議中@詳細は自治スレへ2012/04/02(月) 20:51:58.76
>>876
OutlookのバージョンとExeclのバージョンを教えて
0879営利利用に関するLR審議中@詳細は自治スレへ2012/04/02(月) 21:14:12.72
ともに2007です >>878
0880営利利用に関するLR審議中@詳細は自治スレへ2012/04/03(火) 01:39:29.67
>>876
EXCELまったく関係ないのはスレ違いなんだが
outlook テンプレート 日付 でググって最初のページでも見てろ
0881営利利用に関するLR審議中@詳細は自治スレへ2012/04/03(火) 11:47:57.65
どう考えてもこのスレに辿り着くより解法が載ってるサイトに辿り着く方が早いと思うんだけど
検索サイトを一体どんな風に利用しているんだろう?
0882営利利用に関するLR審議中@詳細は自治スレへ2012/04/03(火) 19:39:23.25
>>875
WithEventsで宣言した変数に参照代入する
0883営利利用に関するLR審議中@詳細は自治スレへ2012/04/04(水) 17:49:54.34
A3の範囲に入っている数字が読めるように
列幅を大きくするとOKで
列幅を小さくして数字が##のようにすると
Set C がNothing になってしまう、いい方法ありますか

A2 = "gg50": A3 = "gg11:gg45"
n = sh4.Range(A2)
Set C = sh4.Range(A3).Find(Val(n), LookIn:=xlValues)
0884営利利用に関するLR審議中@詳細は自治スレへ2012/04/04(水) 18:07:52.43
>>883
検索するときに列幅を広げて
検索が終わったら列幅を元に戻す
0885営利利用に関するLR審議中@詳細は自治スレへ2012/04/04(水) 18:14:12.91
わかりました、そーします
ありがとう
0886営利利用に関するLR審議中@詳細は自治スレへ2012/04/05(木) 08:36:11.39
だれかSQLでdecodeに当たるような関数をVBAで教えてくれ
調べてもreplaceしか出てこないんだ
内部処理で文字列を違う文字列として扱ったりしたいんだ
0887営利利用に関するLR審議中@詳細は自治スレへ2012/04/05(木) 10:29:49.84
>>886
IIf関数かIf...Then...Else ステートメント
ちなみに標準SQLにはDECODE関数なんて無い
0888営利利用に関するLR審議中@詳細は自治スレへ2012/04/05(木) 11:11:06.09
>>886
Choose
http://officetanaka.net/excel/vba/function/Choose.htm
08898862012/04/05(木) 23:16:08.15
>>887
>>888
さんくす!iPhoneからだと規制されてて書き込めなかった
今日、現場の作業で活用させて頂きました
0890営利利用に関するLR審議中@詳細は自治スレへ2012/04/06(金) 04:53:41.84
オフィス田中はNGにしてほしい
0891営利利用に関するLR審議中@詳細は自治スレへ2012/04/06(金) 07:29:19.45
>>890
なんで?
0892営利利用に関するLR審議中@詳細は自治スレへ2012/04/06(金) 07:32:09.99
>>891
そんな有名なところだれでも知ってるから
すでに読んでる
0893営利利用に関するLR審議中@詳細は自治スレへ2012/04/06(金) 08:20:34.61
↑
自分が知ってることは他人も全部知ってるべきだと思ってる池沼
0894営利利用に関するLR審議中@詳細は自治スレへ2012/04/06(金) 10:04:50.92
まぁ>>888みたいにリファレンスとして貼るならMSのサイトを貼れよとは思う
0895営利利用に関するLR審議中@詳細は自治スレへ2012/04/06(金) 19:27:40.21
>>892
何が「誰でも知っている」だ。
俺はそんなサイト知らねえぞ。
お前のためにあるスレじゃねえから
自己厨レスはやめとけ。
0896営利利用に関するLR審議中@詳細は自治スレへ2012/04/06(金) 19:30:55.02
>>894
マイクロソフトみたいな有名なところだれでも知ってるから
すでに読んでる
0897営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 00:22:42.19
セル範囲を飛び越えて選択したいのですが
Range("A1,B3")をRange(cells(1,1),cells(2,3))でやることってできますか?
試しにコンマ入れてみたけどできませんでした
0898営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 00:36:09.97
>>897
Application.Union(Cells(1, 1), Cells(2, 3))
08998972012/04/07(土) 00:47:26.65
できました
ありがとうございます
0900営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 03:29:15.39
オフィス田中は何ググッても出てくるよな
0901営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 05:29:02.44
オフィス田中は数年前に行き着いたが間違い記事があり
それを2,3年経っても放置している上に、自分と大差ないレベルらしく
読んでても新たな発見とか嬉しい驚きとか全然無いんで全く行かなくなった
0902営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 07:16:36.62
MSDN一日中眺めてればいいよ
0903営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 07:39:34.18
20年くらい前はそれでも全体見廻せたが
いまそれやると一生無駄にすると思う
0904営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 08:32:51.50
>>892
>>>891
>そんな有名なところだれでも知ってるから
google検索なんか利用できないじゃん。有名なところしかヒットしない仕組みなんだもの。
0905営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 17:05:07.95
シート2のA1:A30のデータをシート1の
B2:B12,D2:D12、F2:F12
の用に3行に分けて張り付けたいときは
FOR ....next で繰り返しするしかないのでしょうか?

何か一発で行けるようなスマートなやり方はないでしょうか?
0906営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 17:31:13.82
>>905
B2:B12、D2:D12、F2:F12は3行じゃなくて11行だと思うけど?

一発じゃないけどループ使いたくないならこんなのとか
With Range("A1:A30")
Dim v As Variant
v = .Offset(0)
Range("B2:B12") = v
v = .Offset(10)
Range("D2:D12") = v
v = .Offset(20)
Range("F2:F12") = v
End With
0907営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 17:49:21.59
>>906
>>B2:B12、D2:D12、F2:F12は3行じゃなくて11行だと思うけど?
確かに・・・
B2:K2、B4:K4、B6:K6の間違いでした。

シート2のA1:A30には不連続のデータが入っていて、
それのA1:A10をB2:K2に
A11:A20をB4:K4に
A21:A30をB6:K6にコピーしたいのです。

>906を試してみると一行に全ておなじデータが入ってしまいました。
0908営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 18:01:47.39
>>907
コピペしたら?

Range("A1:A10").Copy
Range("B2").PasteSpecial Transpose:=True
Range("A11:A20").Copy
Range("B4").PasteSpecial Transpose:=True
Range("A21:A30").Copy
Range("B6").PasteSpecial Transpose:=True
0909営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 19:47:57.72
>>908
やはりそうするのが無難ですよね。

別件なのですが、Findで検索してヒットしたせるから
10行目までの範囲を指定したい場合はどうしたら
いいですかね?
Offsetを使って色々しているのですが上手くいきません。
0910営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 19:52:21.42
>>909
Resizeプロパティ
0911営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 22:45:34.62
>>910
サンクス
0912営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 13:54:16.86
教えてください。

OS:XP EXCEL:2007
ユーザーフォームを起動させると、言語バーの輝度が落ちてしまい日本語入力ができなくなります。
F8ポチポチでは再現せず…適当なポイントで止めても再現せず…
一旦エクセル落として開き直せば復帰します。
ユーザーフォームはクラスを使ったカレンダーフォームです

0913営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 18:30:01.65
Excel VBAは基本的なところ(セル・シート・ブック)は完ぺきにマスターしたのですが
苦手なのがサブルーチンをいっぱい作ってそれらを効果的に使う方法や、どうやって全体像を把握するのかや、
フォームを駆使して、それをどうやって標準モジュールと連携させるかとか、
変数についてローカル変数やグローバル変数をどう概念的に理解して使いこなすとか
そのへんでつまづいています。

基本的なところ(セル・シート・ブック)は、入門書やすこしレベルが上のものでも、本やサイトでいいのがいっぱいありますが、
「サブルーチン」「フォーム」「変数」とかについてに特化した入門向けから上級者向けの本やサイトがあれば教えてもらえますか?
0914営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 18:48:40.75
個人用マクロ(PERSONAL.XLSB)を作っているのですが
[X]で閉じるときもう一回押さないと閉じないんです。
これを回避する方法ありますか?
0915営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 19:02:50.68
>>913
>>2
0916営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 19:03:25.69
>>914
>>2
0917営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 19:13:04.47
>>913
難しく考えすぎ。
「使いこなそう」などと考えるのがおかしい。
VBAはシートと関数で実現が難しい機能が
ある場合の補助手段。
フォームとか面倒くさい機能は使うな。
シートという立派なGUIがあるんだから。
あとルーチンも変数も全部Publicでいいから。
0918営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 20:58:39.07
「完ぺきにマスターした」なんて書いてる時点で釣りなんだからスルーしとけ
0919営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 22:57:28.08
>913
えっと、そういうのはVB(VB6まで)の入門書を卒業するレベルならいいんだろうけど、
いまさらVB6の本はないからねぇ

>914
アドインにすれば?
0920営利利用に関するLR審議中@詳細は自治スレへ2012/04/08(日) 23:00:30.69
>>913

VBAの基本的な文法からきちんと勉強してみれば?

日経BP社の
Microsoft Excel VBA セミナーテキスト [2010/2007/2003対応]
なんてなかなか良い内容だと思ったけど。
0921営利利用に関するLR審議中@詳細は自治スレへ2012/04/09(月) 00:32:51.14
>>912
自己解決したので報告
原因はfalseのままでメソッド終了させてたからだったみたい。最後にtrueで戻したら解決した。
お騒がせしました。
0922営利利用に関するLR審議中@詳細は自治スレへ2012/04/09(月) 01:09:31.32
Excel/VBAプログラミング入門
ttp://www.cqpub.co.jp/hanbai/books/MIF/MIFZ201204.htm

う〜ん、「第10章 USB接続によるデータ計測」にひかれて買ってみたんだけど、
「サイエンスキューブ」ってデータロガーをつかうとこんなことができますよ、って説明だけで
期待したもの(WinUSB.dllをエクセルVBAから使うには)とはちょっと違ったなぁ、残念

シリアルポート(MSComm32.ocx)の代わりに使えるかなぁと思ったんだけど
0923営利利用に関するLR審議中@詳細は自治スレへ2012/04/09(月) 03:58:36.15
質問があるのですが。
複数のエクセルファイルを開いている状態で。

ショートカットキーを使ってマクロを実行しているのですが。
アクティブじゃないエクセルファイルのマクロと競合すると言いますか、
他のも実行してしまう状況にあります。

ショートカットキーのキーを変えると作業の円滑さがなくなってしまうので
出来れば同じショートカットキーを使いながら、アクティブなエクセルに
入っているマクロのみを実行したいのですが。何か方法はあるのでしょうか?
0924営利利用に関するLR審議中@詳細は自治スレへ2012/04/09(月) 04:18:55.01
誰かわかる人いましたらよろしくお願いします。

エクセル2003なんですが、条件書式の色つきが3つまでしかできません。
10色ほどしたくて、ぐぐったらここに辿り着いて元となるVBAを見つけました。
ただ、これはシート1のA列が指定になっています。
これを指定の範囲ないにするにはどこをいじればいいのでしょうか。
例えばシート1のC1〜C10を範囲にするにはどうすればいいでしょうか・
http://qanda.rakuten.ne.jp/qa7116283.html
0925営利利用に関するLR審議中@詳細は自治スレへ2012/04/09(月) 07:58:24.87
>>924
あんまり綺麗なコードじゃないけど、めんどくさいから最小限の修正で

Sub W()
  Dim j As Long
  Dim ws2 As Worksheet
  Dim r As Range
  Dim c As Object
  Set ws2 = Worksheets("Sheet2")
  Set r = Range("A1:A10")  'ここに色を付けたいセル範囲を書く
  If Intersect(r, Columns(1)) Is Nothing Then Exit Sub
  Application.ScreenUpdating = False
  r.Interior.ColorIndex = xlNone
  For Each c In r
    If WorksheetFunction.CountIf(ws2.Columns(1), c) Then
      j = WorksheetFunction.Match(c, ws2.Columns(1), False)
      c.Interior.ColorIndex = ws2.Cells(j, 2).Interior.ColorIndex
    End If
  Next
  Application.ScreenUpdating = True
End Sub
0926営利利用に関するLR審議中@詳細は自治スレへ2012/04/09(月) 08:01:03.42
ちょっと訂正
1つ目のIfは削除しないと、A列にしか色が付かない
2つ目のIfもよく見たら不要だな

Sub W()
  Dim j As Long
  Dim ws2 As Worksheet
  Dim r As Range
  Dim c As Object
  Set ws2 = Worksheets("Sheet2")
  Set r = Range("A1:A10")  'ここに色を付けたいセル範囲を書く
  Application.ScreenUpdating = False
  r.Interior.ColorIndex = xlNone
  For Each c In r
    j = WorksheetFunction.Match(c, ws2.Columns(1), False)
    c.Interior.ColorIndex = ws2.Cells(j, 2).Interior.ColorIndex
  Next
  Application.ScreenUpdating = True
End Sub
0927営利利用に関するLR審議中@詳細は自治スレへ2012/04/09(月) 08:09:08.94
まだVBAを扱って日が浅く、すみませんが教えて下さい。

390行目を超えると、

実行時エラー1004
WorkseetFunctionクラスのmmultプロパティを取得出来ません。

とエラーが出てしまいますが、最終行まで計算させる方法をご教示下さい。
Dim myA As Range
Dim myB As Range
Dim myC As Range
Dim l As Long
Dim m As Long
Dim n As Long
Dim lLoopTimes
Dim i As Long
Set myA = Range("Sheet1!D3")
Set myB = Range("Sheet2!C2")
Set myC = Range("Sheet1!DN3")
l = 1
m = 111
n = 14
lLoopTimes = 1194
For i = 1 To lLoopTimes
myGetMatrix(myC, l, n).FormulaArray _
= WorksheetFunction.MMult( _
myGetMatrix(myA, l, m), _
myGetMatrix(myB, m, n))
l = l + 1
Next
End Sub
0928営利利用に関するLR審議中@詳細は自治スレへ2012/04/09(月) 08:22:37.45
>>927
Sheet1かSheet2のどこかに数値の入ってないセルがあるんじゃない?
0929営利利用に関するLR審議中@詳細は自治スレへ2012/04/09(月) 08:29:51.78
>>927
そのプログラムだと、Sheet1!D3:DJ1196とSheet2!C2:P112が計算に使われる
この範囲内に数値の入っていないセルとか結合されたセルがあるとエラーになる
0930営利利用に関するLR審議中@詳細は自治スレへ2012/04/09(月) 08:54:42.65
>928
>929

チェックしてみましたが空白は無い様です。
また試しに、ループを外し、
l = 300、l = 600とマクロを300行分ずつ書き換え、順次実行していくと問題無く最終行まで行きました。

出来れば1つのマクロで終わりにしたいのですが、
何か良い方法はありませんでしょうか・・・。
0931営利利用に関するLR審議中@詳細は自治スレへ2012/04/09(月) 09:50:47.36
フォームモジュールのところにちゃんしグローバル変数を
Public inTest As Integer
と宣言してるのに
標準モジュールではその変数を使えないのはどういうこと?

別の標準モジュールにならPublic inTest As Integerと宣言してたら使えるのに。
0932営利利用に関するLR審議中@詳細は自治スレへ2012/04/09(月) 09:56:43.94
逆に標準モジュールでPublic inTest As Integerと宣言してれば
フォームモジュールではinTestの変数は使えるんですよ。
おかしくね?
0933営利利用に関するLR審議中@詳細は自治スレへ2012/04/09(月) 09:57:37.34
さらにThisworkbookモジュールでも上記と同様のことが。
ということは標準モジュールが一番えらいの?
0934営利利用に関するLR審議中@詳細は自治スレへ2012/04/09(月) 10:17:37.12
カンマ区切りのCSVファイルの読み込みで、セルG2を先頭にして読み込むとか
する方法ってありますでしょうか?
普通に読み込んで行列を挿入しているのですが、スマートな方法があれば教えて下さい。
環境はwinxp+Excel2003です。
宜しく御願いします。
0935営利利用に関するLR審議中@詳細は自治スレへ2012/04/09(月) 10:20:15.49
個人用マクロにFunctionを書いても
普通のWorksheet関数として使おうとしても使えないんですけど。
どうやれば使えるようになりますの?

(普通にシートにFunctionを書けばそのシートではWorksheet関数として使えるけど)

ヤバくない?
0936営利利用に関するLR審議中@詳細は自治スレへ2012/04/09(月) 10:28:09.14
>>934
行列を挿入するよりカトペの方が手間は少ないのでは
「テキストファイルの読み込み」を使えば好きな場所に読み込めるけど、位置を決めるまでに何度も「次へ」ボタンを
押さなきゃいけないからあんまりスマートとは言えないような気がする
一発で処理したいならマクロ
0937営利利用に関するLR審議中@詳細は自治スレへ2012/04/09(月) 11:16:08.23
>>935
無理
そういうときはアドインにする
0938営利利用に関するLR審議中@詳細は自治スレへ2012/04/09(月) 11:35:10.56
>>973
さっきから出ている「アドイン」とは何でござるっすの?
0939営利利用に関するLR審議中@詳細は自治スレへ2012/04/09(月) 11:45:29.76
>>938
Excelのヘルプで「アドイン」で検索するか、各種検索エンジンで「Excel アドイン」で検索したらいいと思うよ
0940営利利用に関するLR審議中@詳細は自治スレへ2012/04/09(月) 11:46:30.60
>>936
あっ!ありがとうございます。
0941営利利用に関するLR審議中@詳細は自治スレへ2012/04/09(月) 11:54:37.72
>>924
ここで条件によってExit Subしてるから、C1〜C10の範囲じゃなければExit Subするようにすればいい
If Intersect(Target, Columns(1)) Is Nothing Then Exit Sub
0942営利利用に関するLR審議中@詳細は自治スレへ2012/04/09(月) 11:56:34.73
グラフとかのオブジェクトを削除した時に、マクロを走らせたいのですが
どのイベントを使えばいいのでしょうか?
どなたか教えて下さい。
0943営利利用に関するLR審議中@詳細は自治スレへ2012/04/09(月) 12:32:54.00
>>942
残念ながらありません
監視する仕組みを自作するしかありません
0944営利利用に関するLR審議中@詳細は自治スレへ2012/04/09(月) 15:04:28.95
>>931
フォームでPublic宣言したものは
フォーム.変数名
で使える。

標準モジュールのは
標準モジュール.変数名でアクセスできるが
省略できるだけ
0945営利利用に関するLR審議中@詳細は自治スレへ2012/04/09(月) 21:46:22.98
ユーザー定義変数って、入れ子にできるんだね。
かなり便利だ。
0946営利利用に関するLR審議中@詳細は自治スレへ2012/04/09(月) 23:07:19.96
>>945
詳しくお願います
0947営利利用に関するLR審議中@詳細は自治スレへ2012/04/09(月) 23:11:11.65
エンターキーが押されたらマクロが走るようにしたいのですが、
ブック全体?でキーを受け付ける方法はないでしょうか?
マクロ実行後、オペレーターが画面を確認して、エンターを押したら、
再度マクロが走るようにしたいのです。

ググってもTextboxに対してだったり、セルへの入力時の例ばかりで
目的の物とは違うので教えて下さい。

宜しく御願いします。
0948営利利用に関するLR審議中@詳細は自治スレへ2012/04/09(月) 23:11:16.53
VBAで作ったExcelのファイルを、
Outlookのメールに添付して
しかもそのメールの差出人・件名・本文(数行以上に渡る文章)もVBAで書いて
送信ボタンを押す直前の状態までExcelのVBAで作ることは可能ですか?
Yなら、どうやりますか?
09499482012/04/09(月) 23:12:45.90
VBAで作ったExcelのファイル = あるマクロでいろんな処理をした結果作ったExcelのブックのこと
0950営利利用に関するLR審議中@詳細は自治スレへ2012/04/09(月) 23:22:12.11
>>947
Application.OnKeyメソッド
0951営利利用に関するLR審議中@詳細は自治スレへ2012/04/09(月) 23:24:55.96
>>948
>送信ボタンを押す直前の状態までExcelのVBAで作ることは可能ですか?
可能

>Yなら、どうやりますか?
>>2
09529452012/04/09(月) 23:51:26.07
>>946

たとえば、宣言部で
Private Type AAA
BBB As String
CCC As String
End Type
Private Type ZZZ
DDD As AAA
EEE As String
End Type

としてやる。
で、プロシージャ内でユーザー定義変数を宣言。
すると、あまり意識せずに多次元配列状態を作り出せる。
Dim A As ZZZ

A.EEE= "文字列"
A.DDD.BBB="入れ子になってる"
A.DDD.CCC="これも"

With A
Debug.Print .EEE
With .DDD
Debug.Print .BBB
Debug.Pring .CCC
End With
End With

この例だとしょぼいけど、似たような内容の変数が
10個も20個も出てくるときにものすごく整理しやすい。
0953営利利用に関するLR審議中@詳細は自治スレへ2012/04/09(月) 23:52:18.64
>>950
出来ました。
ありがとうございました。
0954営利利用に関するLR審議中@詳細は自治スレへ2012/04/10(火) 10:47:52.39
End(xlUp)は、プロパティですかメソッドですか?
トマトは、野菜ですか果物ですか?
バナナはおやつに入りますか?
0955営利利用に関するLR審議中@詳細は自治スレへ2012/04/10(火) 10:50:11.61
>>954
バナナは果物です
0956営利利用に関するLR審議中@詳細は自治スレへ2012/04/10(火) 12:40:48.54
>>954
おやつやデザートとして食べるのが果物。
おかずとして食べるのが野菜。
0957営利利用に関するLR審議中@詳細は自治スレへ2012/04/10(火) 12:43:10.21
酢豚にパイナップルを入れるのは最近聞いたが
実際に見たことは無い
0958営利利用に関するLR審議中@詳細は自治スレへ2012/04/10(火) 19:29:34.77
>>954はウ菜、かつ、バ果者 である
0959営利利用に関するLR審議中@詳細は自治スレへ2012/04/11(水) 00:10:58.62
End()はメソッドxlUpは定数
0960営利利用に関するLR審議中@詳細は自治スレへ2012/04/11(水) 16:53:30.86
ある特定のフォルダ(例えば、デスクトップ\Test\A01\)にあるExcelファイルだけを開くにはどうすればいいですか?
また、そのフォルダにあるExcelファイルを開かずにその中のセルにある値をいくつか取り出すことは可能ですか?
0961営利利用に関するLR審議中@詳細は自治スレへ2012/04/11(水) 17:07:23.19
>>960
> ある特定のフォルダ(例えば、デスクトップ\Test\A01\)にあるExcelファイルだけを開くにはどうすればいいですか?
Workbooks.Open filename:="c:\foo\bar.xls"
で特定のフォルダの特定のブックが開ける

> また、そのフォルダにあるExcelファイルを開かずにその中のセルにある値をいくつか取り出すことは可能ですか?
不可能
0962営利利用に関するLR審議中@詳細は自治スレへ2012/04/11(水) 18:00:41.70
>>960
「Excelファイルを開かずに」の「開く」の定義をもうちょっと明確にしないと答えられないよ
0963営利利用に関するLR審議中@詳細は自治スレへ2012/04/11(水) 18:21:46.56
>>961
いや、そのフォルダにあるExcelファイルを全部開くという意味です。
そのときによってファイル名は毎回違う、みたいな。
0964営利利用に関するLR審議中@詳細は自治スレへ2012/04/11(水) 18:25:47.31
>>963
Dir関数使えばいいよ
0965営利利用に関するLR審議中@詳細は自治スレへ2012/04/11(水) 18:45:17.49
>>964
そのDir関数はなんのための関数?どうやって使うの?
09669602012/04/11(水) 18:45:46.25
そんな関数、本に載ってないからわからん
0967営利利用に関するLR審議中@詳細は自治スレへ2012/04/11(水) 18:55:55.94
>>965
お前のExcelにはヘルプが無いのか?ネットに接続できるのにgoogleにはアクセス出来んのか?
0968営利利用に関するLR審議中@詳細は自治スレへ2012/04/11(水) 19:03:23.94
使ったことすらない。グーグルは邪道だ。
0969営利利用に関するLR審議中@詳細は自治スレへ2012/04/11(水) 19:16:03.91
こんなとこで見も知らぬ他人にきくほうがよっぽど邪道だろ
0970営利利用に関するLR審議中@詳細は自治スレへ2012/04/11(水) 19:24:04.95
なんだと、このやろう
0971営利利用に関するLR審議中@詳細は自治スレへ2012/04/11(水) 19:52:41.87
Exceは確定申告のために税額を計算するソフト
それ以外の使い方は全部邪道
0972デフォルトの名無しさん2012/04/11(水) 20:40:11.41
いきなり別のソフトの説明されても
0973デフォルトの名無しさん2012/04/11(水) 21:18:22.13
確定申告はそれ用のソフトがあるだろ
エクセでやってる奴ってその程度のお金も出せない貧乏人なの?
0974デフォルトの名無しさん2012/04/11(水) 22:11:36.36
エクセルのほうが高いだろ
0975デフォルトの名無しさん2012/04/11(水) 22:12:54.75
エクセルはそれ以外の用途で買ってて入れてる奴が多い
0976デフォルトの名無しさん2012/04/11(水) 22:24:07.49
ExcelVBAのスキルの前に、スルースキルを身につけろ
0977デフォルトの名無しさん2012/04/12(木) 01:04:05.31
もともと表計算ソフトが税金の計算のために発明されたってのは本当の話
0978デフォルトの名無しさん2012/04/12(木) 10:01:49.86
MS12-027を入れてコモンコントロールを使ったVBAマクロが動かなくなったら
exdファイルを削除してね!
ttp://support.microsoft.com/kb/2664258/
To resolve this issue, you must delete the cached versions of the control type libraries (extender files) on the client computer.
To do this, you must search your hard disk for files that have the ".exd" file name extension and delete all the .exd files that you find.
These .exd files will be re-created automatically when you use the new controls the next time that you use VBA.
These extender files will be under the user's profile and may also be in other locations, such as the following:
C:\documents and settings\username\Application Data\Microsoft\Forms
C:\documents and settings\username\AppData\Local\Temp\VBE
0979デフォルトの名無しさん2012/04/12(木) 10:33:50.90
別々のブックでマクロを共有することって出来ますか?
別々のブックで同じマクロ処理をしたいので、現在はコピーしながら
使っているのですが、マクロの内容が変更になりそうなので
今のうちに共有出来るなら作っておこうと思いまして。

宜しく御願いします。
0980デフォルトの名無しさん2012/04/12(木) 10:59:29.01
>>979
違う様な気がするけどこういうこと?
http://www.moug.net/tech/exvba/0010018.html
0981デフォルトの名無しさん2012/04/12(木) 11:32:55.50
>>980
ありがとうございます。
ググったら
http://d.hatena.ne.jp/language_and_engineering/20090731/p1
こんなのがあって、中身が理解出来ていないのですが、
こちらの方が希望に合ってると思いました。
0982デフォルトの名無しさん2012/04/12(木) 11:36:16.32
いやいや、アドインにしろよ
0983デフォルトの名無しさん2012/04/12(木) 11:53:32.18
写真帳を作成してます。(XP,Excel2003)
選択写真の縮小と圧縮をワンボタンで実行したいのですが、圧縮の方が機能しないのでヒントください。
マクロの記録(図の書式設定から圧縮)でできたコードで、
図のトリミング部分を削除するのチェックを外してマクロ記録したけど、それが実行されてない。

手動でするとデータサイズが900KB→150KBになるが、マクロ実行では900KBのまま。

Sub 写真圧縮()
On Error GoTo ErrorCheck
Selection.ShapeRange.PictureFormat.Brightness = 0.5
Selection.ShapeRange.PictureFormat.Contrast = 0.5
Selection.ShapeRange.PictureFormat.ColorType = msoPictureAutomatic
Selection.ShapeRange.PictureFormat.CropLeft = 0#
Selection.ShapeRange.PictureFormat.CropRight = 0#
Selection.ShapeRange.PictureFormat.CropTop = 0#
Selection.ShapeRange.PictureFormat.CropBottom = 0#
ErrorCheck:
MsgBox "写真を選択"
End Sub

トリミング部分削除のチェックを外した方がサイズが小さくなるのも疑問だけど、よろしくお願いします。
0984デフォルトの名無しさん2012/04/12(木) 12:06:58.32
>>983
excel vba 図 圧縮
でググる
09859832012/04/12(木) 13:18:54.90
>>984
レスありがとうございます。
書く前に一応検索して、いろいろ試してみたのですが、自分の思うようにいかず(理解できず)、
結局シンプルな組み合わせが理想だったので>>983の方法を選びました。
縮小の方↓はうまくいき、最終的にこれら二つを組み合わせようと考えてます。

Sub 写真縮小()
On Error GoTo ErrorCheck
Selection.ShapeRange.LockAspectRatio = msoTrue
Selection.ShapeRange.Height = 232.5
Selection.ShapeRange.Width = 309.75
Exit Sub
ErrorCheck:
MsgBox "先に写真の選択"
End Sub


0986デフォルトの名無しさん2012/04/12(木) 19:22:48.64
ある特定のフォルダ(例えば、デスクトップ\Test\A01\)にあるExcelファイル(ファイル名は不定)だけをすべて開くにはどうすればいいですか?
また、そのフォルダにあるExcelファイルを開かずにその中のセルにある値をいくつか取り出すことは可能ですか?
0987デフォルトの名無しさん2012/04/12(木) 19:31:39.02
我々はスルースキルを身につけたのでもう釣られません
0988デフォルトの名無しさん2012/04/12(木) 19:41:29.78
つまらない大人になっちゃったんだね
09899862012/04/12(木) 19:43:58.23
アホが一匹釣れた(ワラ
0990デフォルトの名無しさん2012/04/12(木) 19:53:25.65
Win7Ultimate Excel2010

連想配列使いたくて
Set dic = CreateObject("Scripting.Dictionary")
こうしても「変数が定義されていません」とエラーが出るんだけど、何がいけないの?
0991デフォルトの名無しさん2012/04/12(木) 20:33:28.01
変数dicの宣言し忘れか?
0992デフォルトの名無しさん2012/04/12(木) 20:57:14.54
あ
0993デフォルトの名無しさん2012/04/12(木) 22:25:54.70
デザイン あ
09949902012/04/13(金) 10:12:00.33
自己解決しました
原因はOption Explicit宣言してた為に結果>>991さんの言うとおりになっていました
0995デフォルトの名無しさん2012/04/13(金) 16:31:49.57
標準モジュールにAuto_Openを作って、マクロの自動実行をする時にセキュリティ警告が出るのが嫌で、
下記のようなvbスクリプトをネットで拾って使ったのですが、Auto_Openが実行されません。(ブックは表示されます。)

Option Explicit
Dim objExcelApp, strPath
Const BookName = "hoge.xls"’実行するファイル
Set objExcelApp = CreateObject("Excel.Application")
With WScript
strPath = Replace(.ScriptFullName, .ScriptName, "")
End With
objExcelApp.Workbooks.Open strPath & BookName, False, False
objExcelApp.Visible = True
Set objExcelApp = Nothing

ファイルをクリック等で開くと実行されるのでマクロ自体は間違いないと思うのですが、
このスクリプトがおかしいのか、何かエクセル側で設定する項目があるのか
教えて下さい。

環境はExcel2003+XP SP3です。
宜しく御願いします。
09969952012/04/13(金) 17:00:21.61
自己解決しました。
Auto_Openを実行するには RunAutoMacros  の記述が必要でした。
スレ汚し、済みません。
0997デフォルトの名無しさん2012/04/13(金) 17:01:26.67
>>995
http://www.excel.studio-kazu.jp/mag2/backnumber/mm20040817.html
0998デフォルトの名無しさん2012/04/13(金) 17:18:38.00
質問したいけど新スレ立たないのかな

*やりたいこと*
シート内のセル設定情報をテキストで保存して、読み出し
→帳票のテキストデータ化

*必要なこと*
セルに設定された各種プロパティの保存

*知りたいこと*
プロパティがデフォルト以外に変更されたセルを発見する方法


構造体だかクラスだか設定して該当範囲の一括調査・設定するしかないのだろうか
0999デフォルトの名無しさん2012/04/13(金) 17:19:44.16
次スレ
http://toro.2ch.net/test/read.cgi/tech/1334305148/
1000デフォルトの名無しさん2012/04/13(金) 17:23:45.82
>>998
もっと具体的に書かないと第三者には伝わらないよ
とりあえず>>2を読み返して質問し直した方がいい
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。