Excel VBA 質問スレ Part23

このエントリーをはてなブックマークに追加
1既定のプロパティさん
2既定のプロパティさん: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)
3デフォルトの名無しさん:2012/01/29(日) 11:38:40.69
>>1
4デフォルトの名無しさん:2012/01/29(日) 12:22:48.13
>>1

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

>>4
何で蒸し返すかなぁ・・・
そういうのが呼び水になるんだって気付けよ
7デフォルトの名無しさん:2012/01/29(日) 14:34:17.40
>>6
お前も同罪
8デフォルトの名無しさん:2012/01/29(日) 15:20:07.91
>>7
それはむしろ>>5だろ
9デフォルトの名無しさん:2012/01/29(日) 16:12:08.40
ID付けない辺りが民度の低さだろ
10デフォルトの名無しさん: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

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

> Do While ActiveCell Like ""
ここ
「もし入っているならば」になってない
13デフォルトの名無しさん:2012/01/29(日) 19:56:31.43
>>10
いろいろ突っ込み所満載だが
とりあえずWhileをUntilにすれば問題は解決すると思う
14デフォルトの名無しさん:2012/01/29(日) 19:59:04.90
15デフォルトの名無しさん:2012/01/29(日) 20:03:30.24
相当悔しかったらしい。(w
16デフォルトの名無しさん:2012/01/29(日) 20:06:22.65
>>12
>>13
わかりました!
ありがとうです!
17デフォルトの名無しさん:2012/01/29(日) 20:09:04.16
>>4-8>>11>>14-15
ほんともういい加減にしてくれない?
大概うざいんですけど。
18デフォルトの名無しさん: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には出来ないことも出来る
わかりやすい
修正しやすい
条件内容によっては速い

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

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

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

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

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

意味がわからん。

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

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

さすがにそれはないと思うが...、修正面倒だし、
そもそも他人が見たときヘタすると意図汲み取れないと思う。
37デフォルトの名無しさん:2012/01/30(月) 00:27:10.99
>>35
使ってみたのですが、よく意味がわかりません。
起動時にフォーム呼び出しっぽいのですが、何もおこらないのですが
どういう効果があるのですか?
38デフォルトの名無しさん:2012/01/30(月) 06:53:15.42
>>37
聞く前にググれ
39デフォルトの名無しさん:2012/01/31(火) 03:33:06.65
Test
40デフォルトの名無しさん: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 & "'"

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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

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

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

よろしく御願いします。
7254:2012/02/04(土) 19:55:05.76
書き忘れました。
保存先記憶用変数が空の場合は、保存先ダイアログ表示時の
フォルダーはExcel任せでも良いです。
よろしくお願いします。
73デフォルトの名無しさん:2012/02/04(土) 20:05:32.51
iniファイルへの書き込みや読み込みはAPI使うっての知ってますか?
まぁ単純にテキストファイルのオープンで読み込み書き込みでも出来なくはないだろうけど
74デフォルトの名無しさん:2012/02/04(土) 20:16:21.93
>>72
で、何がわからないの?
75デフォルトの名無しさん:2012/02/04(土) 21:11:43.87
>>71
chdir 前回保存先
名前を付けて保存ダイアログ表示
今回保存先を選択
非表示シートにcurdir(今回保存先)を書きみ保存
名前を付けて保存
76デフォルトの名無しさん: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
というようにしています。

また、ブックのオープンに時間がかかっているため、非同期でブックをオープンしてそれをキューに放り込んで行きたいのですが、
こういったことはどうやってやれば良いのでしょう?
77デフォルトの名無しさん: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
782000:2012/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
79デフォルトの名無しさん: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を組み合わせてもうまくいきません。
どなたかご教授頂けますでしょうか。
80デフォルトの名無しさん:2012/02/05(日) 17:38:45.19
それをVBAでやりたいってことかな?
8179:2012/02/05(日) 17:43:45.11
>80
いえ、違います。
エクセル上で上記の数式を完成させたいだけです。
82デフォルトの名無しさん:2012/02/05(日) 17:46:29.32
>>81
だったら
Excel総合相談所 100
http://toro.2ch.net/test/read.cgi/bsoft/1325935411/l50

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

つまり結果が自分の希望に反して不定になるのは書き方が悪い。はっきり言えば間違ってる
よく見直せ
87デフォルトの名無しさん: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
88デフォルトの名無しさん:2012/02/06(月) 06:59:45.09
2/2

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

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

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

Word(ワード)総合相談所 Part21
http://toro.2ch.net/test/read.cgi/bsoft/1319313721/
98デフォルトの名無しさん:2012/02/07(火) 17:46:04.08
ない
場違い承知・まともな回答返ってこない前提でここかパワポVBAスレッドで聞いてアレンジするか
ググって見つかる掲示板利用するしか
99デフォルトの名無しさん:2012/02/07(火) 17:48:36.97
(*ノノ)イヤン
100デフォルトの名無しさん:2012/02/07(火) 17:51:41.95
>>95
>おっぱい見せて
さろんへ行け。
101デフォルトの名無しさん:2012/02/07(火) 17:51:42.53
VBEで入力した全角文字が片っ端から自動で確定されて日本語入力できないんですが、仕様ですか?
102デフォルトの名無しさん: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
エクセルならこーする、ワードは知らん。でも構いませんのでご教示頂けると幸いです。
103デフォルトの名無しさん:2012/02/07(火) 21:24:17.08
Selection.TypeParagraphが三つあるから改行がみっつ入るんじゃないのか?
それひとつにしてそのあと"物:"追加すればいいんじゃね

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

例えが下手で申し訳ありません。
105デフォルトの名無しさん:2012/02/07(火) 21:48:44.82
データの整理をVBAで行うことを考えている初心者です
VBAを試しに書いて実行してから保存をしてみたところ、VBAによって行われたシート側の改変まで保存されてしまうようなのですが、
コードの部分だけを保存する方法はないでしょうか?
106デフォルトの名無しさん: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
107デフォルトの名無しさん:2012/02/07(火) 21:57:15.58
>>105
VBAを行うファイルとデータファイルとを別々にスレばいい。
今は同じブック内でやってんでしょ?
108デフォルトの名無しさん:2012/02/07(火) 21:59:38.02
>107
なるほど、それは盲点でした
どうもありがとうございます
109デフォルトの名無しさん: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
110デフォルトの名無しさん:2012/02/07(火) 23:20:14.94
>>109
それ 94 の方法でしょ
111デフォルトの名無しさん:2012/02/07(火) 23:50:08.62
>>102
>>97
または
mougでもいけばいいんじゃない

With Selection.Find
Replacement.ClearFormatting
.Text = "物"
.Replacement.Text = vbCr & "物"
.Execute Replace:=wdReplaceAll
End With
112デフォルトの名無しさん:2012/02/08(水) 00:33:54.14
>>95,>>106,>>109,>>110
の方々、ありがとうございます。とても助かります。
もうひとつ質問があるのですが、
・選択したセル範囲に対して、
   a.空白セルの場合には背景色を黄色( RGB(255,255,0) )にする
   b.空白でないセルの場合は背景色を色なし( xlColorIndexNone )にする
 マクロ「チェック」を書きたいのですが、どのようにすればいいのでしょうか。
113デフォルトの名無しさん: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
114デフォルトの名無しさん:2012/02/08(水) 03:16:33.90
>>112
Sub チェック()
  Selection.Interior.Color = -4142
  Selection.SpecialCells(4).Interior.Color = 65535
End Sub
115デフォルトの名無しさん: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

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

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

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

以上です。ご回答頂き本当にありがとうございました。
119デフォルトの名無しさん: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を一括してプレビューさせるには何が足りないのでしょうか?
120デフォルトの名無しさん:2012/02/08(水) 23:58:52.00
>>119
ActiveWindow.SelectedSheets.PrintPreview
121デフォルトの名無しさん:2012/02/09(木) 00:17:23.02
>>119
Worksheet オブジェクト(普通のシート)には PrintPreview メソッドが存在する、よってシートを選択してプレビューできる
sheets オブジェクト(複数のシートを保持できる)には PrintPreview メソッドが存在する、よって複数のシートを選択してプレビューできる
range オブジェクトには PrintPreview メソッドが存在する、よって範囲を選択してプレビューできる
range オブジェクトは同一シート内なら複数の範囲を保持できる、よって同一シート内なら複数の範囲をプレビューできる

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

たぶん
122デフォルトの名無しさん: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
123119:2012/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
124デフォルトの名無しさん:2012/02/09(木) 17:07:00.03
Dim 変数 as Range
このようにオブジェクト変数を使いセルを代入すると
その情報の中にそのセルの上位のシートやブックも一緒に保存されてるんですか?
125デフォルトの名無しさん:2012/02/09(木) 18:46:47.98
>>124
たしかParentプロパティとかに入ってたと思う。
126124:2012/02/09(木) 19:08:28.56
Parentプロパティって何でしょうか?
つまりそのRange型変数には入ってるってこと?

その特定のセルの場所を保存するには
ブック型変数(Dim〜as Workbook)、シート型変数(Dim〜as Worksheet)、セル型変数(Dim〜as Range)の3つが必要かと思ってたけど
セル型ひとつで済むならかなり楽だけど、違うのかな?
127125:2012/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
128125:2012/02/09(木) 19:49:11.26
>>126
ごめん、後半読んでなかった
セル範囲の指定をRange型変数ひとつでできないか、という話だったのね。
Range型変数に代入されたセル範囲はRange型変数だけで特定できるから
そういう意味ではWorkBook型やWorkSheet型の変数は不要だよ。

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

よろしくお願いします。
130デフォルトの名無しさん: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
131デフォルトの名無しさん:2012/02/09(木) 23:44:26.34
>>129
>ANSI 形式のバイト型配列を文字列に変換する場合は、StrConv 関数を使用してください。
>Unicode 形式の配列を変換する場合は、代入式を使用してください。
以上 StrConv 関数のヘルプから

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

せっかくコンピューターが色々と助けてくれるんだから
完璧に暗記することよりも、それを活用する方法を考えた方が応用範囲が広くなる
161デフォルトの名無しさん: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を全く使わないと基本機能すら忘れるね。
その忘れたときに思い出すための対策(例えば基本機能のメモと特殊的機能の一覧をノートにまとめるとか)は何かしといたほうがいいと感じてます。
162デフォルトの名無しさん:2012/02/10(金) 20:25:47.45
>合ってます?

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

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

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

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

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

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

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

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

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

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

ExcelVBAの考え方としては、データを置くワークシートと、
プログラムを置く標準モジュールをどう配置するか
194187:2012/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)
のような書きかたをした場合には検索できませんでした。

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

xlAPP.GetSaveAsFilename(InitialFileName:=SaveDir & FileName)

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

SaveaDir = CurDir

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

32bit版は変数の中身が変わるのですが、64bit版ではブックを読みだしたフォルダーから
変更されない感じです。
よろしくお願いします。
199デフォルトの名無しさん:2012/02/13(月) 20:18:43.27
>>198
省略しすぎ。もう少しコードを見せられないの?
200デフォルトの名無しさん:2012/02/13(月) 21:24:43.24
>>197
ディレクトリだけ?
ファイル名は正しく表示されるの?
201デフォルトの名無しさん: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

202デフォルトの名無しさん:2012/02/14(火) 17:43:32.49
>>197
& "\" &
203デフォルトの名無しさん: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
204197:2012/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, "")

こんな感じでできるようになりました。
205デフォルトの名無しさん:2012/02/14(火) 22:07:08.20
× Save_NAME = xlAPP.GetSaveAsFilename(InitialFileName:=Save_Name)
○ Save_NAME = xlAPP.GetSaveAsFilename(InitialFileName:=Save_dir)
です
206デフォルトの名無しさん: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
207206の続き: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
208206:2012/02/15(水) 00:15:06.33
個人的には
ie.visible=true
はFalseのほうが画面の切り替えがなくて好きだけど、
非表示にしとくとIEのアクセスでエラーが出てるときの
エラーメッセージも表示されなくなるんだっけ?
209206:2012/02/15(水) 00:19:14.69
連投スマソ
入力する年月日のうち、日は日付じゃなくて開催何日目かなので
そこんとこよろしく
(たとえば、06120105は中山競馬場、2012年1月の開催5日目の意味)
210デフォルトの名無しさん:2012/02/15(水) 00:31:34.64
それだと一つの競馬場で36レースやらないと全レースのデータは拾えないんじゃね?
多分、一つの競馬場では1日に12レースしかやらないと思うよ。
同じ日に最大で3カ所開催するから3*12で36レースってことじゃないかな?
211206:2012/02/15(水) 00:54:42.24
>>210さん
えーと、
ご指摘ありがとうございます・・・orz
私は競馬やったことないんで知りませんでした。

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

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

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

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

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

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

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

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

シートにフォームのボタンを貼ったのですが、このボタンをVBAから押した
ことにする方法はあるでしょうか。
217デフォルトの名無しさん: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
218デフォルトの名無しさん:2012/02/15(水) 14:20:34.57
>>217
なりました!
ありがとうございますm(_ _)m
219デフォルトの名無しさん:2012/02/15(水) 17:36:33.04
>>216
そのボタンを押した時に実行するプロシジャを実行すれば良いだけなのでは?
220デフォルトの名無しさん:2012/02/16(木) 01:25:02.28
横から失礼。
> そのボタンを押した時に実行するプロシジャを実行
でなく、そのボタンを押す事は出来ないの?
221デフォルトの名無しさん:2012/02/16(木) 01:40:57.51
命令文うんたらかんたら

CommandButton1_Click

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

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

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

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

よろしくお願いいたします。
225デフォルトの名無しさん: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

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

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

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

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

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

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

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

もちろん、他言語のライブラリ同様、ライブラリとしてのメリットは全て持ってる。
235デフォルトの名無しさん: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でやろうとするとどうしても不一致の行が空白になってしまいます。
お力添えをよろしくお願いします。
236デフォルトの名無しさん:2012/02/17(金) 19:53:43.47
>>235
VBAでではなく、ワークシート関数でってなら

Excel総合相談所 100
http://toro.2ch.net/test/read.cgi/bsoft/1325935411/l50
237デフォルトの名無しさん:2012/02/17(金) 20:33:56.12
なにそのタライ回し。いつもより多く回ってるんじゃないの。
238デフォルトの名無しさん:2012/02/17(金) 20:43:07.85
このスレはいつもこうだよ
239デフォルトの名無しさん: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(省略)

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

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

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

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

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

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

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

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

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

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

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

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

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

クラスモジュールを使うか
247デフォルトの名無しさん: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
248247:2012/02/18(土) 03:13:52.81
一応簡単に説明しておくと
ボタンクリックのイベント内からは Application.Caller でクリックしたボタン名が取得できる
ボタン名をあらかじめ chkbtn_<行番号> として作成しておき、イベント内で行番号をボタン名から切り出して現在の自分の行番号を取得している
イベント内でボタン名が取得できるので、クリックのイベントプロシジャを個別に作成する必要はなく、すべて共通でよい

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

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

ご回答していただいた皆様本当にありがとうございました。
ソースコードを記述いただいた>>247さんには感謝の限りです!
本日は朝も近いのでお休みいたします。
最後に改めてありがとうございました。
255デフォルトの名無しさん:2012/02/18(土) 06:44:14.37
俺もこれ利用したいけど 単一のセルしか塗りつぶしできない
どうすれば行を(この場合だとA2からC2までの)指定出来ますかね
256253:2012/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列が書き換わる
257デフォルトの名無しさん:2012/02/18(土) 13:19:54.76
すみません>>247のコードでボタンを二つ作りたいのですが、
標準モジュールを新たに挿入すると内容が二つとも同じになってしまいます。
対処法を調べても理解できないのでどなたか教えてください。
258デフォルトの名無しさん: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
259258:2012/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
260253:2012/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番目のプロシージャを書き足す作業をすれば良いんだよ。

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

でもこういうのただ丸投げするより
動作原理を理解して自分でいじれるようになった方が良いから
自分でもがんばってね
262デフォルトの名無しさん:2012/02/18(土) 14:07:08.52
>>258
一部修正必要だけど、257には無理かもね
263デフォルトの名無しさん:2012/02/18(土) 14:24:35.19
Application.Caller ってボタン名というかオブジェクト名しか取れないのが使いにくいけど、
あらかじめ Dictionary 使ってオブジェクト名をキーにして情報格納しておけば、
ボタンクリックでオブジェクト名から数字だけを切り出すまでもなく、
座標やチェック/クリアの属性なんかも関連付けできるようになるのでいろいろ応用は効く
264253:2012/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"とかだね
265デフォルトの名無しさん:2012/02/18(土) 14:47:53.44
>>264
いやオブジェクト名は、どのみち影響しないけど
修正したいと言うと予想されるのはキャプションのほうね
266デフォルトの名無しさん:2012/02/18(土) 17:18:24.54
こんにつわ
alt+F11押したらVBAProjectパスワード、要求されたんだけど、へるぷみー
267デフォルトの名無しさん:2012/02/18(土) 17:29:55.96
事故解決下
268デフォルトの名無しさん:2012/02/18(土) 23:05:13.47
Excelで「平成1年」を「平成元年」と表示させるための一番簡単な方法はなんですか?
ちなみに昭和や平成の他の年もいっぱいまざっています。
269デフォルトの名無しさん:2012/02/18(土) 23:20:54.49
Replace(s, "平成1年", "平成元年")
270デフォルトの名無しさん:2012/02/19(日) 00:13:58.80
> 昭和や平成の他の年
の考慮が漏れてるではないか。
271デフォルトの名無しさん:2012/02/19(日) 00:20:14.51
[^0-9]1年
272268:2012/02/19(日) 00:58:11.82
>>269
でかした!

>>270-271
どういうこと?
273デフォルトの名無しさん: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日など)に変換される。
274デフォルトの名無しさん:2012/02/19(日) 06:24:27.04
>>272
>>269では誤動作するケースがある、というのは分かる?
経験があれば、真っ先に>>270-271のようなことが浮かぶもんだよ。
275デフォルトの名無しさん:2012/02/19(日) 06:39:48.49
Excel上での表示の話なんだから…
「Excel 1年 元年」でググってみ。いろいろやり方があって面白いよ。

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

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

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

宮内庁から怒られるんじゃないのか…
288デフォルトの名無しさん:2012/02/19(日) 19:17:04.08
今年で,,,, ゲフンゲン
289278:2012/02/19(日) 19:36:06.20
>>280
ありがとうございます、コツコツやってすぐ分からなくなってまた来ます
その時は教えて頂けたらありがたいです
290デフォルトの名無しさん: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
としてどこを変更すれば良いでしょうか?
291デフォルトの名無しさん:2012/02/19(日) 20:16:12.70
堂々とマルチ宣言

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

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

とりあえずググって見ましたか?
自分の業務で自分だけが使うのなら作りやすいのですが
自分の異動など他の人に業務を任せることも考えると
画面デザインが重要になりますね
294デフォルトの名無しさん: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

としたのですが、うまくいきませんでした。どこが間違ってるのか自分ではわからなかったので教えて下さい
こんな初歩的な質問でスイマセン・・・
295デフォルトの名無しさん: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
として見れば?
296278:2012/02/20(月) 00:25:03.13
>>293
ホントですか!?
ありがとうございます
色々ググって見て、とりあえずデザインから作り始めてます
自分が使うだけなので特に問題ないです
複雑だから結構難しそうですね・・・
297デフォルトの名無しさん:2012/02/20(月) 00:38:53.21
>>296
>自分が使うだけなので特に問題ないです
仕事に使うならこの考え方はないです
エンドユーザコンピューティングの典型的な悪いところ
業務にVBAを使う以上、他の人が使えることが最低条件です
298278:2012/02/20(月) 00:42:20.32
>>297
そうですよね・・・
異動になったりしたとき他の人が使えないと困りますしね
気をつけて作っていきたいと思います
299デフォルトの名無しさん:2012/02/20(月) 01:13:25.65
>>298
エンドユーザーコンピューティングでやりがちなミス

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

>>314
それ普通にエンター押せば次のセルに行くじゃん。
エンター押下で上下左右のどちらに行くかは
ツール=>オプション=>編集から
"入力後にセルを移動する" の "方向"で変えられる。
318デフォルトの名無しさん:2012/02/20(月) 22:12:20.14
>>314
VBAと関係なく、普通に移動するんじゃないの。
下方向か横方向かは設定次第だが。
319314:2012/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
320278:2012/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
321デフォルトの名無しさん:2012/02/20(月) 22:29:39.19
そんなもん必要になる状況がよくわからん。
322デフォルトの名無しさん:2012/02/20(月) 22:36:30.41
>>320
質問。
明けについて。夜勤明けの勤務なの?それとも明け休み?
それは夜勤と確実にペアなものなの?夜勤だけで明けがない場合もあるの?
323デフォルトの名無しさん: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人以上居ないとあなたの施設は回らない
324デフォルトの名無しさん:2012/02/20(月) 22:45:15.43
>>321
帳票付けるときに重宝する
TABキー使わずにテンキーとエンターだけで表の端まで行ったら先頭列の1行下に移動できるし
325278:2012/02/20(月) 22:49:31.98
>>322
夜勤は(夜勤、明け、休み)で1セットは確実です
明けが無いとかはないです

>>323
一応来年度に新しい職員が2人入るのと異動で何とかなるとは思いますが…
それでも厳しいのには変わりないんですよね
326デフォルトの名無しさん: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番までなど少ないことが多い

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

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

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

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

8.研修
 − 未稿 −

9.有給
 有給休暇。

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

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

研修は出張みたいな感じで、休みではないけど職場にはいないとなります
月に一度あるかないか(無いことのほうが多い)であっても一人だけです
329デフォルトの名無しさん: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番までなど少ないことが多い

つづく

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

>>337
当番表の構造・・?
339デフォルトの名無しさん:2012/02/21(火) 07:33:18.93
>>338
わかりました
当番表は勤務表の縦横を入れ替えて
番号順に並べ替えたものなのですね
340デフォルトの名無しさん:2012/02/21(火) 10:43:55.13
いつまでVBAと関係無い話してんだよ
341デフォルトの名無しさん: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 で空読み」という事までは分かりましたが
空読みの意味が分かりません・・・

ここから指定行を取得するにはどのようにすればいいのでしょうか?
342デフォルトの名無しさん: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
343デフォルトの名無しさん:2012/02/21(火) 14:58:15.15
278さんではありませんが
勤務表の別スレを立てましたのでどうぞ

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

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

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

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

そこで初心者用のスレがあったら誘導願います
スレ違いでスイマセン
347デフォルトの名無しさん: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
みたいなさ
348デフォルトの名無しさん: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

349デフォルトの名無しさん:2012/02/21(火) 20:07:58.96
>>347
文字は何パターンあるのかな。
パターン数分の背景色が必要になるけど、何色でも良いの。
350デフォルトの名無しさん:2012/02/21(火) 20:09:31.70
↑間違えた。>>346宛ね。
351デフォルトの名無しさん:2012/02/21(火) 21:03:18.61
>>346
このあたりを調べて使えるようになればできるよ。
最終行取得
繰り返し(for each〜next)
colorindex
entirerow
dictionary
352346:2012/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さんのでなんとなくなイメージは浮かびました



答えてくださった方々、ありがとうございました
とりあえずはもうちょっとネットで調べてみます
353デフォルトの名無しさん: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
とする事で、エラーが発生しなくなります。

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

全て記入されている場合はメッセージボックスを出さない処理にするにはどうすれば良いのでしょうか?
356デフォルトの名無しさん:2012/02/22(水) 11:48:31.30
>>355
最後のmsgboxのところを
ifでよける。
357デフォルトの名無しさん:2012/02/22(水) 15:04:52.84
>>354
サンクス!
358デフォルトの名無しさん:2012/02/22(水) 21:09:05.40
>>355
if len(str)>0 then msgbox str
359デフォルトの名無しさん:2012/02/22(水) 21:10:42.95
then
end if

{
}
で書くのに慣れると、BASICはどうも読みにくくて仕方ない。。
まあ慣れの問題なんだけどさ
360デフォルトの名無しさん:2012/02/22(水) 22:51:46.44
おう、お前ら
初心者で悪いけど質問な

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

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

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

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

現在はPublicで宣言したBoolean変数とフォーム上のコマンドボタンを用いて
コマンドボタンをクリックしたら変数をTrueにしてからHideするようにしてます。
(×で閉じたらFalseだからそれで判断してます)
パブリック変数を使わないで×で閉じたことを知る方法があったら教えてください。
366デフォルトの名無しさん:2012/02/23(木) 02:37:52.92
>>365
標準で用意されているイベントハンドラでは知ることはできない
プロセスの終了方法を区別するには、×ボタンのクリックイベントをフックするぐらいしかないんじゃない?
ただしアプリケーションの作法としては終了方法を区別するような設計にするのはあまり良くないと思うけど
367デフォルトの名無しさん: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
368365:2012/02/23(木) 03:32:51.89
>>366
無理なのですか、残念です。
終了方法を知りたいというか、
ユーザーフォームと標準モジュール間でパブリック変数を介さないで
情報のやり取りがしたかったのです。
標準モジュール同士ならローカル変数でも引数で受け渡し可能ですけど、
ユーザーフォームには引数渡せませんよね?
標準モジュール側からLoadだけしておいて
フォームのオブジェクトに値を入れてShow
とか、
フォーム側からHideして標準モジュールに戻ってから
オブジェクトの値を取得とかは出来ますけど、
Hideしたときにどういう風にHideしたかの情報を
パブリック変数を使わずに取得できないかな?
ということが知りたかったのです。
(ぶっちゃけていうと「実行」と「キャンセル」の判別に使いたいのです。)
パブリック変数の使用以外に
フォーム上に不可視のオブジェクト(チェックボックスなど)を作っておいて
それをフラグに使うっていう手もありますが、
なんかスマートじゃないな、という気がしまして。

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

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

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

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

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

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

オブジェクト=コントロールだと思ってる?
普通は、フォームにパブリックな変数定義するんじゃないかな
まあ、パブリック変数を介してるのには違いないけど
372365:2012/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さんにバッチリなお答えを教えていただいたので今後はそちらを使うことにします。

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

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

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

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

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

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

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

http://imepic.jp/20120223/735690

これなんですが、VBAに慣れた人には簡単すぎるかもしれませんがどなたか助けて下さい
398デフォルトの名無しさん: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
399デフォルトの名無しさん:2012/02/23(木) 21:07:02.90
>>398
訂正
With worksheets(i).Cells(j, k)
400デフォルトの名無しさん:2012/02/23(木) 21:12:10.07
>>398-399
ありがとうございます!
そうか・・・Nextの終了順番が間違ってたのもあったのか
これでナントカ追いつけそうです
401デフォルトの名無しさん:2012/02/23(木) 21:57:48.70
今、訓練所でvba教えでるのか。田舎だと、使う場面が少ないが
402デフォルトの名無しさん:2012/02/23(木) 23:01:09.21
XP-2002環境です。

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

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

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

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

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

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

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

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

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

>>407

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

って書いてるけど、うちの環境で試しても
A1:A3が普通のセルならC1:C3を返すけど、
A1:A3を結合してるとC1だけしか返されなかったよ。
413デフォルトの名無しさん: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そう言うものだと思われます

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

Excelファイルを読み取り専用で開いてるのを忘れて、
いざ保存しようとした時に読み取り専用だった事を思い出すって事ありませんか?
だったらセルのロックみたいに入力自体できなくすればいいじゃないかと
思ってはみたもののどうすればいいかわかりません。
読み取り専用推奨で保存したファイルを開いて
読み取り専用にするか訊いてきた時に"はい"の場合はセルのロック、
"いいえ"の場合はセルのロックを解除というマクロを組んでAuto_Openで動かしてみましたが、
どうも訊いてくるより先にAuto_Openが実行されているようでうまくいきませんでした。
読み取り専用で開くかどうかもマクロで組めれば解決するのかなと思いますが、やり方がわかりません。
どうにかならないでしょうか?
415デフォルトの名無しさん:2012/02/27(月) 01:19:29.12
Workbook_Openイベントプロシージャ
416デフォルトの名無しさん: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の値がクリアされてしまいます。
417デフォルトの名無しさん: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
418デフォルトの名無しさん:2012/02/27(月) 07:47:41.48
> Range("C2:D2").ClearContents
それはそうだろ、としか。
419デフォルトの名無しさん:2012/02/27(月) 08:01:13.16
Range(Cells(i,j),Cells(i+?,j+?))
でこのi,j,?を操作すれば
420デフォルトの名無しさん: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

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

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

というか、プロパティカウントできないの初めて知ったわ
これ地味に不便ね
427デフォルトの名無しさん: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


428デフォルトの名無しさん:2012/02/28(火) 21:31:31.36
>>427
べつに普通に実行できるが
そのエラーメッセージの通り、中断モードのままやるからエラーになってるだけだろ
429427:2012/02/29(水) 01:03:02.92
すみません
もっと早く書き込みたかったのですが仕事で抜けられませんでした
イニシャライズでなくメソッドにしても同じエラーになったので
もしやと思い、クラスを新規作成して一からコードを手打ちしていったら
今度はうまく行きました
モジュールが壊れていたんだと思います
必ず通るはずのStopをスルーして、その先のMsgBoxが動いている時点で気づくべきでした
前にもこんなことがあって、別のモジュールに一から書き直したらやっぱり普通に動いた
そんな無茶な使い方してるわけじゃないのにな…
どうも失礼しました
430デフォルトの名無しさん:2012/02/29(水) 02:44:05.36
いやだから、Stopで止まったら中断モード...
まあいいか
431デフォルトの名無しさん:2012/02/29(水) 10:05:54.43
忙しすぎて日本語読む余裕がないんだろうな
432デフォルトの名無しさん: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しか入力されません。これはどこが間違っているのでしょうか?
どなたかよろしくお願いいたします。
433デフォルトの名無しさん: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

これだと重複ができるようなので、これやった後に重複チェックのコードを別にかければなんとかいけそうです。お騒がせしました
434デフォルトの名無しさん: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()に入れればもちろんフォームが
出てくるんですけど、これではあまり意味がないような気がする
んですけど。
435デフォルトの名無しさん:2012/03/01(木) 10:20:46.78
九分九厘、そのワークシートtestがブックを開く時点からアクティブなんだろうな。
ワークシートのActivateイベントは「他のシートから移動してきたとき」しかトラップされないから、
ブックを閉じるときにtestがアクティブな状態で保存されて、開くときに最初からアクティブだとトラップできてない。

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

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

あ 1
あ 1

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

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

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

>>452
もう一歩教えてくだsあ。
アドインにReplaceLine()なりを書けという意味? アドインにサブルーチンの置換プラグイン相当の機能があるという意味?
455デフォルトの名無しさん: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番目からです。。
456デフォルトの名無しさん:2012/03/03(土) 16:22:32.24
複数枚のグラフをユーザーフォーム上に重ねて表示させることはできるでしょうか?
今はシート上に重ねて表示させているのですが表示場所をずらしたい時とか、全体に
拡大縮小したい時にどうすればいいかわからず、ユーザーフォーム上ならユーザーフォームを
移動、拡大縮小することによって簡単にできるかなと思ったのですが、ググっても情報がないみたいで。
よろしくお願いします。
457455:2012/03/03(土) 16:26:48.45
どうもすみません。
最初のシート名は、0だったようです。できました。
458デフォルトの名無しさん:2012/03/03(土) 17:14:23.39
    
顕正新聞 平成24年2月5日号「原発全廃特集号」

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

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

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

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

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

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

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

for i = 1 to 最終行

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

467デフォルトの名無しさん:2012/03/04(日) 11:38:22.77
>>465
正規表現でもLikeでもお好きにどうぞ
468デフォルトの名無しさん: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

ここまで出来た…
469デフォルトの名無しさん:2012/03/04(日) 12:27:05.40
Msg:要らないな
MsgBoxにマッチした数字を表示したいのですけどできません
470デフォルトの名無しさん:2012/03/04(日) 12:44:36.54
>>469
AHO
471デフォルトの名無しさん:2012/03/04(日) 12:51:45.21
MsgBox c & "である"
472デフォルトの名無しさん:2012/03/04(日) 13:00:32.31
そもそもLikeでマッチした数字返せるのけ?
473デフォルトの名無しさん:2012/03/04(日) 13:12:38.41
>>465
instrで/と\の位置を探してmid関数を使えば?
474デフォルトの名無しさん: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
475デフォルトの名無しさん: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
476デフォルトの名無しさん:2012/03/04(日) 13:35:24.62
すげー。自力じゃ無理だったので有難く使いますthx!!!
477デフォルトの名無しさん:2012/03/04(日) 13:48:13.13
数字だけ取り出すなら
dim a
a=instrr(cells(1,1),"\")
msgbox mid(cells(1,1),a-5,5)
が簡単だと思うけど。
478デフォルトの名無しさん:2012/03/04(日) 13:54:17.43
VBAで可視セルを扱うにはどういう機能またはプロパティまたはメソッドを使いますか?
479デフォルトの名無しさん:2012/03/04(日) 13:57:27.36
>>478
可視セルをどう使いたいかによる。
480デフォルトの名無しさん:2012/03/04(日) 14:04:24.13
481デフォルトの名無しさん:2012/03/04(日) 14:23:38.72
連続じゃないセル、たとえば、range("A1:A3")とrange("C1:C3")を3*2の配列に格納するには
どうすればよいのでしょうか?
482デフォルトの名無しさん:2012/03/04(日) 14:35:08.42
>>477
これにしたthxx.
483デフォルトの名無しさん:2012/03/04(日) 14:36:48.77
>>481
For〜Nextで順番に代入
作業列を使ってもいいんなら一ヶ所に固まるようにセル範囲をコピーしてからVariant型に代入
B列を削除して配列にコピーしてからアンドゥ
484デフォルトの名無しさん: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


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

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

例えば、文字列がE1とF1をまたいでいる。セルが結合されているとき、F1にValueしても空だが、データがあるものと判定したいです。セルの結合数はランダムです。
486デフォルトの名無しさん:2012/03/04(日) 17:45:29.93
MergeCellsで事故解決です
487デフォルトの名無しさん:2012/03/04(日) 19:11:15.60
>>483
>>484
ありがとうございました
488デフォルトの名無しさん: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行が消えます。なぜこの記述はダメなのか?一度の処理で済ますにはどう書けば良いですか?
489デフォルトの名無しさん: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
490デフォルトの名無しさん:2012/03/05(月) 14:05:09.36
エラーでますぉ
491デフォルトの名無しさん:2012/03/05(月) 14:11:45.74
>>488
ごめんアホなこと書いた

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

for each じゃなくて

for i =100 to 1 step - 1


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

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

質問です、
for i 1 to 100
文字列&i
next
とするときiが一桁のとき01のようにして&したいのですが、書き方ありますか?
493デフォルトの名無しさん:2012/03/05(月) 14:32:02.47
Right関数使え
494デフォルトの名無しさん:2012/03/05(月) 14:32:35.75
>>492
For i = 1 To 100
 str = str & Format(i, "00")
Next
495デフォルトの名無しさん:2012/03/05(月) 14:38:43.95
かんぺきthx!
496デフォルトの名無しさん: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
497496:2012/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
498デフォルトの名無しさん:2012/03/05(月) 18:03:38.27
>>496
参照設定しないと
定数 xlLastCell や xlWorkbookNormal は
参照先で定義されているから使えないと思うぞ

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

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

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

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

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

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

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

If A then

with B

Else

with C

End if

って動かないみたいなんだけど、他に方法ありますか?
507デフォルトの名無しさん: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

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

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

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

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

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

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

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

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

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

534デフォルトの名無しさん:2012/03/08(木) 00:19:44.48
>>531
a = 1
Do
  a = 5
Loop Until True
MsgBox a
535デフォルトの名無しさん: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
536デフォルトの名無しさん:2012/03/08(木) 00:56:45.28
>>535
謎すぎるけど解決したなら、よかった
537デフォルトの名無しさん:2012/03/08(木) 01:01:53.11
for系でないループで
中をIfとExitで制御している形はけっこう危険なんだよね。
思わぬ条件で抜けたり
一度も通らない経路ができたりする。
538デフォルトの名無しさん: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


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

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

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

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

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

おかげさまで安眠できます。
夜分遅くにお付き合いいただき、ありがとうございました!
543デフォルトの名無しさん:2012/03/08(木) 21:37:27.17
P列に区分として1又は9を入れた時、Q列に当日の日付を入れたい
で、その行位置は範囲は
2行目からlastrow = Cells(Rows.Count, "A").End(xlUp).Row
までとしてこういう時
どういう風に Worksheet_Changeに書けばいいんでしょ?
544デフォルトの名無しさん:2012/03/08(木) 22:20:58.13
>>543
何がわからないの?
545デフォルトの名無しさん: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列なら変更しないとかの工夫が必要
546デフォルトの名無しさん:2012/03/08(木) 22:26:58.87
だからP列に1又は9を入れた時、その横に当日日付を入れたい
で、どう書けば良いのか?って聞いてんですけど
547デフォルトの名無しさん:2012/03/08(木) 22:31:28.83
リロードしてなかった。。。
>>545
ありがとうございます。
それを元にまた勉強してみます
548デフォルトの名無しさん: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で出来ると思いきや上手くいってません。
お願いいたします。

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

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

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

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



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

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

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

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

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

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

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

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

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

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

すみませんがよろしくお願いします。
574デフォルトの名無しさん:2012/03/10(土) 23:33:19.28
>>573
MsgBox ActiveWindow.ScrollRow + 3
575デフォルトの名無しさん:2012/03/10(土) 23:42:17.38
>>574
おお!できた!
多分できないかなーと思ってたんで嬉しいです。
ありがとうございました。
576デフォルトの名無しさん: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") 'これはエラー

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

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

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

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

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

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

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

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

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

VBA初めてなので、ソース見ていただいた方がいいかもしれませんね。。
587デフォルトの名無しさん:2012/03/11(日) 15:01:52.27
あと、エラーがでた環境も詳しく
OS、Excel、メモリ
588558:2012/03/11(日) 15:16:02.07
>>587
了解しました!(OSはXP、Excelは多分2003・・・)
589デフォルトの名無しさん: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
590デフォルトの名無しさん:2012/03/11(日) 16:18:23.96
>>589
動くよ
591デフォルトの名無しさん:2012/03/11(日) 16:38:44.83
>>590
ほんとにありがと
592デフォルトの名無しさん: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
593デフォルトの名無しさん:2012/03/11(日) 16:57:24.25
補足
UDL01_fPath    ’udlファイルのフルパス

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

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

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

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

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

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

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

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

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

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

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

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

という方法がある。

「VBA currency型のビット演算」でググるとよろし。
604デフォルトの名無しさん:2012/03/13(火) 12:18:48.28
>>603
ちょーthx.
605デフォルトの名無しさん: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に言われてしまうんですが。。。
保存する際にモジュールは要らなくデータだけで良いんですけど
どうすればモジュールを切り離して保存出来るんでしょうか?

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

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

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

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

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

どうしても書き換えしたいなら、参照設定で
「Visual Basic for Applications」に参照設定をすれば
VBEのコードそのものを直接VBAで動かせるようになる。
615デフォルトの名無しさん:2012/03/13(火) 22:35:10.19
>>613
Application.DisplayAlerts = False

これは単にメッセージ出すのを抑制するだけですよ?
616デフォルトの名無しさん:2012/03/13(火) 23:37:57.80
>>615
xlsxで保存したらマクロは保存されない
警告なしで保存できるんだからそれでいいだろ
617デフォルトの名無しさん:2012/03/13(火) 23:53:25.53
>>613,616

なるほど。そういう手もあったんですね
618デフォルトの名無しさん:2012/03/13(火) 23:55:37.82
>>615

お前がずれてますよ
605もアホだがエスパーすると…



警告なしに保存したいということだろ
だからDisplayAlerts=Falseが合っている
FileFormat指定が的外れ
警告はxlsxで保存するとマクロは保存されませんよ
ってことだからな
619586:2012/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が重くなったりするので、お気をつけください。


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

昔ディスプレイドライバー辺りのバグでExcelでメモリ不足出たことあったが
つかWin7でExcel2003とか動作保障あるのか
622デフォルトの名無しさん:2012/03/14(水) 04:00:24.00
>>619
流れ読んでないけど、ワークシートのコピーは複数回実行するとマクロでなぜかエラーになる現象がある。
標準のワークシートをコピーする関数を使うのはやめて、「ワークシートを追加→セル全体をコピー→ペースト」
という関数を作っておくと楽。
623622:2012/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だと発生しないのか。知らなかった。
624622:2012/03/14(水) 04:22:25.46
Win7 Ultimate XP SP3ってなんだ?そんなOSネーヨ(^_^;)
Win XP SP3の間違いです・・・。
625デフォルトの名無しさん:2012/03/14(水) 06:50:26.27
外部音源やMIDIデバイスを使わずにbeep音をディストーションギターの16和音にするにはどうすればいいでしょうか
626デフォルトの名無しさん:2012/03/14(水) 06:59:09.15
627デフォルトの名無しさん:2012/03/14(水) 12:09:50.35
縦のrangeを横のrangeにコピーするにはどうすれば良いですか
628デフォルトの名無しさん:2012/03/14(水) 12:30:24.18
>>627
マクロを記録してみろ
629デフォルトの名無しさん:2012/03/14(水) 17:08:15.94
範囲指定して数値のセルのみ抽出するにはどうすれば良いですか
630デフォルトの名無しさん:2012/03/14(水) 17:24:44.23
631デフォルトの名無しさん:2012/03/14(水) 17:32:20.94
>>629
IsNumeric
632デフォルトの名無しさん:2012/03/14(水) 17:42:11.29
do loop 内の処理で繰り返した回数を得るにはどうすれば良いですか
633デフォルトの名無しさん:2012/03/14(水) 17:43:03.45
googleでdo loopって打ち込んだら画面が回ったwww
634デフォルトの名無しさん:2012/03/14(水) 17:49:15.82
>>632
変数作って数えさせろよ
635デフォルトの名無しさん:2012/03/14(水) 17:54:30.78
どう書けばよいでしょかお?
636デフォルトの名無しさん:2012/03/14(水) 18:05:08.53
Dim count as Integer
Do While true
    count++
Loop
637デフォルトの名無しさん:2012/03/14(水) 18:07:40.23
++は使えなかったかも
Dim count As Integer: count = 0
Do While True
count = count + 1
Loop
638デフォルトの名無しさん:2012/03/14(水) 18:14:02.46
あ、成る程ですthx
639612:2012/03/14(水) 22:30:17.63
>>614
ありがとうございます
レスを参考に調べてみます
640デフォルトの名無しさん:2012/03/14(水) 22:55:04.43
VBAだけで就職先はあるのでしょうか?
Javaなどは募集をよく見ますが…

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

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

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

コード書き終えたの
ですけど12時間以上処理してるの
でアドバイスくれし
658デフォルトの名無しさん:2012/03/15(木) 18:07:40.25
コードを載せろよ
659デフォルトの名無しさん:2012/03/15(木) 18:30:36.11
>>657
ScreenUpdatingとか、よくある高速化テクニックは使ってる?
660デフォルトの名無しさん: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
661デフォルトの名無しさん:2012/03/15(木) 19:32:54.15
>>660
Dim cnsFILENAME As String
cnsFILENAME = "\test.CSV"

とか

cnsFILENAME = Range("C5").Text

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

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

マクロの記録やってみれ

Excel2010では↓のようになった

Application.Calculation = xlManual

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

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

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

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

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

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

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

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

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

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

なんだコレ・・私のやり方が何かおかしいのか・・・
686586:2012/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ボタンを押すと、複数のファイルに印刷設定が反映されるって
書いてあって、実際その通りだったけど、ウィンドウ枠の固定と、印刷タイトルの設定が反映されてなかった・・・

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

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

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

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

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

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

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


チラ裏すみません。眠いです・・・
688デフォルトの名無しさん:2012/03/16(金) 08:09:03.03
>>661
サンクス
689デフォルトの名無しさん: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
690デフォルトの名無しさん:2012/03/16(金) 09:55:24.55
とりあえず
Application.WorksheetFunction.ATAN
より
Atn
のほうがいんじゃね
691デフォルトの名無しさん:2012/03/16(金) 10:30:21.14
>>689
ワークシート関数が全部VBAで使えるわけじゃない
692デフォルトの名無しさん: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
693デフォルトの名無しさん:2012/03/16(金) 11:32:07.34
あ なんかいけたっぽい こうしたらスムーズになった

sFile = Application.GetOpenFilename(FileFilter:="gif,.gif")
If sFile = "False" Then Exit Sub
694デフォルトの名無しさん:2012/03/16(金) 12:12:14.79
エクセル2003のグラフのことで教えてください。
グラフ上のマーカーの上にマウスカーソルを乗せるとデータが表示できますが、
その表示されたデータを取得することはできないでしょうか?
もしくは、そのマーカーに対応するセルをアクティブにする方法でもいいです。
どなたか、よろしくお願いします。
695デフォルトの名無しさん:2012/03/16(金) 12:32:19.74
>>694
できません
696デフォルトの名無しさん:2012/03/16(金) 12:50:50.80
>>694
マーカーに透明なラベルを被せたら余裕で何でもできる
697デフォルトの名無しさん:2012/03/16(金) 15:24:36.03
for each でレンジ範囲の文字列数え上げるとき、数え残すことある?
698デフォルトの名無しさん:2012/03/16(金) 15:27:49.62
>>697
例えば?
699デフォルトの名無しさん: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がバグる
700デフォルトの名無しさん:2012/03/16(金) 15:35:57.24
さいごにnext bは入れてる
701デフォルトの名無しさん:2012/03/16(金) 15:41:28.29
>>699
aって何?
702デフォルトの名無しさん:2012/03/16(金) 15:41:47.29
>>699
○ For b = 1 To count
× For b = 1 To a
703デフォルトの名無しさん:2012/03/16(金) 15:45:00.17
ああcountにしてるけどバグる
704デフォルトの名無しさん:2012/03/16(金) 15:45:45.84
>>703
バグる?
705デフォルトの名無しさん:2012/03/16(金) 15:52:53.95
>>699
699がかなりあほってことでよろしいか?
706デフォルトの名無しさん:2012/03/16(金) 15:54:53.70
bに同じ数続くことがあるのでする
707デフォルトの名無しさん:2012/03/16(金) 15:57:41.20
マクロ記録をそのまま使ってる人いますか?
やはり自分で全部書くのが普通でしょうか。
708デフォルトの名無しさん:2012/03/16(金) 16:22:56.46
>>707
状況によるけど
そのままでは使い物にならないことが多い

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

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

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

こうね
721694:2012/03/17(土) 22:07:32.08
グーグル先生ってすごい!
クリックで値が取れた!
722デフォルトの名無しさん:2012/03/18(日) 15:07:11.33
>>669
派遣ですか?
正社員がいいのですが
723デフォルトの名無しさん:2012/03/18(日) 15:17:58.27
腐るからやめろよ
724デフォルトの名無しさん: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の値の対応を残したいのです。どうすればよいでしょうか!!
725669:2012/03/18(日) 17:09:54.42
>>722
私は正社員ですがパートさんも居ます。
ただ、求人かけてないので・・・

あと、あまり詳しく書くと特定されそうなので
もうこれ以上書かないことにします。
とりあえず大阪府も大阪市も一切関係ない民間企業です。
726デフォルトの名無しさん:2012/03/18(日) 18:18:26.86
>>724
説明が下手すぎて質問が意味不明
727デフォルトの名無しさん:2012/03/18(日) 18:31:41.37
次の国会で青少年ネット規制法通すことにするわ
子どもたちを守るためには必要だよな
728デフォルトの名無しさん:2012/03/18(日) 19:12:42.15
>>724
おりあえず、A2:E2 をソートしたいらしい。
729デフォルトの名無しさん: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
730デフォルトの名無しさん:2012/03/18(日) 20:05:11.79
たぶん要点は
>そのとき1-5の値の対応を残したい
だと思うんだが
具体的に何をどうしたいのかがさっぱり解らんな
731デフォルトの名無しさん:2012/03/18(日) 20:42:22.24
え…わたしの説明…ヘタすぎ!?
732デフォルトの名無しさん:2012/03/18(日) 21:06:10.55
んーとですねー
数値が入ってるセルを行毎に昇順で並び変えたときの、順番を取得しまして、
次にその順番を基準に、最初にセルがあった列番号を並べ変えてですね、
さらにそれにセルに入ってた数値を対応させたいのですけど、具体的にすればいいのかはわからなくて行を2行にするくらいしか思いつかないのですのでなにかよい方方法を教えてみて下さいマシマロ
733デフォルトの名無しさん:2012/03/18(日) 21:21:45.79
何言ってんだかさっぱりワカンネ
734デフォルトの名無しさん:2012/03/18(日) 21:28:55.25
ちゃんと説明しようとしない人間の質問に答える必要なし
735デフォルトの名無しさん: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を指定するにはどうす
ればいいでしょうか。
736729:2012/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  
+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------
737デフォルトの名無しさん:2012/03/18(日) 22:05:40.66
説明が分からないから答えようがないのかそれとも説明は分かるけれども態度が気に食わないから答えないのかもし仮に後者なら貴方こそレスする必要は無いし説明が分からないならば分からない箇所を指摘してくれれば返答できるのだが!!!
738デフォルトの名無しさん:2012/03/18(日) 22:07:03.60
736まさにそれですそれを2行にするか1行に続けて書くか以外になにか案はありますかないのならば1行に続けて書いた方がスマートなんでそうしますが
739デフォルトの名無しさん:2012/03/18(日) 22:14:21.32
元データの末尾に列番号を加える
元のデータ
12 54 . 8 23 36
これを
121.542 83 234 365
にしてから並べ替えれば、下1桁をチェックすれば元の位置がわかる
740デフォルトの名無しさん:2012/03/18(日) 22:20:57.88
>>737
ちゃんと例を上げて処理をひとつずつ説明しろ
変な言葉遣い止めろ
741デフォルトの名無しさん:2012/03/18(日) 22:36:53.87
なるほどおおおお0.0001とかにすれば誤差も出ないしいい感じですなあ
742デフォルトの名無しさん:2012/03/18(日) 23:30:16.99
>>741
どんだけ低脳なんだよ
いいわけないだろ
ただ複数の値を保持したいだけなんじゃないのかよ
データ用と表示用で表を分けるとか
Idプロパティ使うとかすればいいだろ
Idなら、
A.Idを降るプロシージャ(1〜5)
B.それぞれの行を並べ替えるプロシージャ
C.IdとValueを入れ替えるプロシージャ
を作って、ABで並べ替えた後、
CBCで元の並びに戻る
743デフォルトの名無しさん:2012/03/18(日) 23:36:09.02
あっはあidプロパティねthx!
744デフォルトの名無しさん:2012/03/18(日) 23:40:58.34
真性か・・・
745デフォルトの名無しさん:2012/03/19(月) 04:38:22.65
'
↑これを
エクセルのシート上で
="'"&A1
と書くとセルA1の文字列の前に ' が
連結されるのですが

VBAで

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

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

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

いい加減にしろ!!
747デフォルトの名無しさん:2012/03/19(月) 08:02:09.18
>>746
VBAのプログラムがおかしいかと
何時間も考えたけど
ぐぐったら1分で解決しました
ありがとう
748デフォルトの名無しさん: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の区別
がついていなかった。
749デフォルトの名無しさん: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
という数字になっています

なぜ?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ソース解析&改造しててやりにくくてしかたない
808デフォルトの名無しさん: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です。
809デフォルトの名無しさん:2012/03/24(土) 17:01:15.46
書き出すファイル指定が間違ってるかと思い
Const CRFILE As String = "C:\test2"

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

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

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


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


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


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

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

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

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

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

Dim moji As string

moji = "実行1"

call moji

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

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

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

>>832
実はそのように、select で、分岐していたんですが、数が多くなりすぎて。
ただ、selectの分岐がいくら多くなっても、速度とかに影響するという
わけでもないので、良いといえば、良いのですが、スマートにできないかと
気になってしまいまして。
835デフォルトの名無しさん:2012/03/25(日) 12:59:29.22
for i=1 to n
if a(i-1) - a(i) <= x then y= false
next I
836デフォルトの名無しさん:2012/03/25(日) 15:22:52.17
a列とb列の相関を調べたい
837デフォルトの名無しさん:2012/03/25(日) 15:31:17.78
VBA使う必要ないけど
838デフォルトの名無しさん:2012/03/25(日) 17:04:00.73
複数のCSVファイルをひとつのXLSファイルへまとめるにはどのようにしたら効率がよいですか?
20120201.csv
20120202.csv
・・・
20120228.csv
というファイルを201202.xlsファイルにまとめたいと考えています。
(シート名を01,02,・・・,28にして、1bookに28シートが出来上がるイメージ)
839デフォルトの名無しさん:2012/03/25(日) 18:13:25.03
>>838
ご自身のコーディング速度と手作業での速度を比較してみればどちらが効率がよいか一目瞭然です
1回限りの作業であれば手作業でやるのが一番効率がよいでしょう
ExcelVBAに関係がない話題なのでこのへんで終了
840デフォルトの名無しさん: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

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

現在は

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

を繰り返すコードにしてるのですが、
見るからに効率が悪くなっています。
844デフォルトの名無しさん:2012/03/25(日) 20:51:07.07
>>842
相対パスって基準から見た位置ですよね
URLのは基準を指定しないとカレントフォルダからになるから危なくて
ThisWorkbook.Pathで基準をブックのある位置を指定すれば問題ないのかなと思ったんですが
845デフォルトの名無しさん:2012/03/25(日) 20:57:55.20
>>843
検索すれば、参考になるコードいくらでも出てくるだろ。
Dir 関数使えばいいんじゃない。
846デフォルトの名無しさん:2012/03/25(日) 21:37:10.43
>>843
見るからに効率が悪いことに気づいてるんだったら改善すればいい
847デフォルトの名無しさん:2012/03/25(日) 21:37:33.36
>>844
「危ない」とか「問題」ってのは具体的にどういうことなの?
具体的に説明してくれないと誰もわからないよ
848デフォルトの名無しさん:2012/03/25(日) 21:55:49.31
>>843
QueryTables.Add使え
849デフォルトの名無しさん:2012/03/25(日) 22:44:15.07
>>847
「絶対的基準に基づいてないから危ない」とか言い出すぞw
850デフォルトの名無しさん:2012/03/25(日) 22:54:44.01
>>844
もう一回お前のリンク先読み直してから来いよ
音読な
851デフォルトの名無しさん:2012/03/26(月) 01:01:30.47
>>838,840
Excelどうこうよりも、まず日本語の読み書きを勉強した方がいいと思う
社会人になってから苦労するよ?
852デフォルトの名無しさん: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"でないかと思っていますが、
どうなんでしょうか。
853デフォルトの名無しさん:2012/03/27(火) 16:48:39.95
>>852
オブジェクトブラウザというものがある
854デフォルトの名無しさん: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なども試したもののだめで、整数値で型が違うといわれるのもなぜかわかりません
初歩的で申し訳ないですが教えてください
855デフォルトの名無しさん:2012/03/27(火) 17:40:07.26
>>854
“Rows”の上にカーソルを置いて[F1]キーでヘルプを開いて読め
856デフォルトの名無しさん:2012/03/27(火) 17:58:53.56
>>855
できました
ありがとうございます
857デフォルトの名無しさん: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は純粋なオブジェクト指向言語ではないから
858デフォルトの名無しさん:2012/03/28(水) 11:52:43.27
>>857
> 基本的に継承関係は保障されているわけではない(と思う。保障されてるならソース教えてくれ)
> つまり(Setによる代入で)キャスト出来るかどうかは実行してみないと解らない

できない例は?
859デフォルトの名無しさん: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()

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

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

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

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

867デフォルトの名無しさん:2012/03/28(水) 23:31:02.19
オブジェクト指向厨は市ね。
VBAごときの小規模アプリに
オブジェクト指向など無用だ。
868デフォルトの名無しさん:2012/03/28(水) 23:33:47.05
工夫した継承はコード量が多く、結局オブジェクト不志向(データ志向っての?)に落ちついてしまう
って事があったなーと、ふと思い出したっす。
869デフォルトの名無しさん:2012/03/28(水) 23:45:10.16
ツールバー追加のマクロを組んだのですが、ブックを閉じるときに
ツールバーを削除しようとするとエラーが出ます。
原因をご教示下さい。
コードは長くなるので分けて書き込みます。
870デフォルトの名無しさん: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
871デフォルトの名無しさん: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':
プロシージャの呼び出し、または引数が不正です。

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

Templateで、日付もその日のが自動入力、って設定する方法はどうやりますか?
マクロでもokです。
date | Mail -s 今日のメール [email protected]

Unix使えよオマエら
>>876
OutlookのバージョンとExeclのバージョンを教えて
879営利利用に関するLR審議中@詳細は自治スレへ:2012/04/02(月) 21:14:12.72
ともに2007です >>878
>>876
EXCELまったく関係ないのはスレ違いなんだが
outlook テンプレート 日付 でググって最初のページでも見てろ
どう考えてもこのスレに辿り着くより解法が載ってるサイトに辿り着く方が早いと思うんだけど
検索サイトを一体どんな風に利用しているんだろう?
>>875
WithEventsで宣言した変数に参照代入する
883営利利用に関する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)
>>883
検索するときに列幅を広げて
検索が終わったら列幅を元に戻す
885営利利用に関するLR審議中@詳細は自治スレへ:2012/04/04(水) 18:14:12.91
わかりました、そーします
ありがとう
だれかSQLでdecodeに当たるような関数をVBAで教えてくれ
調べてもreplaceしか出てこないんだ
内部処理で文字列を違う文字列として扱ったりしたいんだ
>>886
IIf関数かIf...Then...Else ステートメント
ちなみに標準SQLにはDECODE関数なんて無い
888営利利用に関するLR審議中@詳細は自治スレへ:2012/04/05(木) 11:11:06.09
889886:2012/04/05(木) 23:16:08.15
>>887
>>888
さんくす!iPhoneからだと規制されてて書き込めなかった
今日、現場の作業で活用させて頂きました
オフィス田中はNGにしてほしい
>>890
なんで?
>>891
そんな有名なところだれでも知ってるから
すでに読んでる

自分が知ってることは他人も全部知ってるべきだと思ってる池沼
まぁ>>888みたいにリファレンスとして貼るならMSのサイトを貼れよとは思う
>>892
何が「誰でも知っている」だ。
俺はそんなサイト知らねえぞ。
お前のためにあるスレじゃねえから
自己厨レスはやめとけ。
>>894
マイクロソフトみたいな有名なところだれでも知ってるから
すでに読んでる
セル範囲を飛び越えて選択したいのですが
Range("A1,B3")をRange(cells(1,1),cells(2,3))でやることってできますか?
試しにコンマ入れてみたけどできませんでした
>>897
Application.Union(Cells(1, 1), Cells(2, 3))
899897:2012/04/07(土) 00:47:26.65
できました
ありがとうございます
オフィス田中は何ググッても出てくるよな
オフィス田中は数年前に行き着いたが間違い記事があり
それを2,3年経っても放置している上に、自分と大差ないレベルらしく
読んでても新たな発見とか嬉しい驚きとか全然無いんで全く行かなくなった
MSDN一日中眺めてればいいよ
20年くらい前はそれでも全体見廻せたが
いまそれやると一生無駄にすると思う
>>892
>>>891
>そんな有名なところだれでも知ってるから
google検索なんか利用できないじゃん。有名なところしかヒットしない仕組みなんだもの。
シート2のA1:A30のデータをシート1の
B2:B12,D2:D12、F2:F12
の用に3行に分けて張り付けたいときは
FOR ....next で繰り返しするしかないのでしょうか?

何か一発で行けるようなスマートなやり方はないでしょうか?
>>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
>>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を試してみると一行に全ておなじデータが入ってしまいました。
>>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
>>908
やはりそうするのが無難ですよね。

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

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

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

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

>914
アドインにすれば?
>>913

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

日経BP社の
Microsoft Excel VBA セミナーテキスト [2010/2007/2003対応]
なんてなかなか良い内容だと思ったけど。
>>912
自己解決したので報告
原因はfalseのままでメソッド終了させてたからだったみたい。最後にtrueで戻したら解決した。
お騒がせしました。
922営利利用に関する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)の代わりに使えるかなぁと思ったんだけど
質問があるのですが。
複数のエクセルファイルを開いている状態で。

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

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

エクセル2003なんですが、条件書式の色つきが3つまでしかできません。
10色ほどしたくて、ぐぐったらここに辿り着いて元となるVBAを見つけました。
ただ、これはシート1のA列が指定になっています。
これを指定の範囲ないにするにはどこをいじればいいのでしょうか。
例えばシート1のC1〜C10を範囲にするにはどうすればいいでしょうか・
http://qanda.rakuten.ne.jp/qa7116283.html
>>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
ちょっと訂正
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
まだ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
>>927
Sheet1かSheet2のどこかに数値の入ってないセルがあるんじゃない?
>>927
そのプログラムだと、Sheet1!D3:DJ1196とSheet2!C2:P112が計算に使われる
この範囲内に数値の入っていないセルとか結合されたセルがあるとエラーになる
>928
>929

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

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

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

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

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

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

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

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

>Yなら、どうやりますか?
>>2
952945:2012/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個も出てくるときにものすごく整理しやすい。
>>950
出来ました。
ありがとうございました。
954営利利用に関するLR審議中@詳細は自治スレへ:2012/04/10(火) 10:47:52.39
End(xlUp)は、プロパティですかメソッドですか?
トマトは、野菜ですか果物ですか?
バナナはおやつに入りますか?
>>954
バナナは果物です
>>954
おやつやデザートとして食べるのが果物。
おかずとして食べるのが野菜。
酢豚にパイナップルを入れるのは最近聞いたが
実際に見たことは無い
>>954はウ菜、かつ、バ果者 である
End()はメソッドxlUpは定数
960営利利用に関するLR審議中@詳細は自治スレへ:2012/04/11(水) 16:53:30.86
ある特定のフォルダ(例えば、デスクトップ\Test\A01\)にあるExcelファイルだけを開くにはどうすればいいですか?
また、そのフォルダにあるExcelファイルを開かずにその中のセルにある値をいくつか取り出すことは可能ですか?
>>960
> ある特定のフォルダ(例えば、デスクトップ\Test\A01\)にあるExcelファイルだけを開くにはどうすればいいですか?
Workbooks.Open filename:="c:\foo\bar.xls"
で特定のフォルダの特定のブックが開ける

> また、そのフォルダにあるExcelファイルを開かずにその中のセルにある値をいくつか取り出すことは可能ですか?
不可能
>>960
「Excelファイルを開かずに」の「開く」の定義をもうちょっと明確にしないと答えられないよ
963営利利用に関するLR審議中@詳細は自治スレへ:2012/04/11(水) 18:21:46.56
>>961
いや、そのフォルダにあるExcelファイルを全部開くという意味です。
そのときによってファイル名は毎回違う、みたいな。
>>963
Dir関数使えばいいよ
965営利利用に関するLR審議中@詳細は自治スレへ:2012/04/11(水) 18:45:17.49
>>964
そのDir関数はなんのための関数?どうやって使うの?
966960:2012/04/11(水) 18:45:46.25
そんな関数、本に載ってないからわからん
>>965
お前のExcelにはヘルプが無いのか?ネットに接続できるのにgoogleにはアクセス出来んのか?
968営利利用に関するLR審議中@詳細は自治スレへ:2012/04/11(水) 19:03:23.94
使ったことすらない。グーグルは邪道だ。
こんなとこで見も知らぬ他人にきくほうがよっぽど邪道だろ
970営利利用に関するLR審議中@詳細は自治スレへ:2012/04/11(水) 19:24:04.95
なんだと、このやろう
Exceは確定申告のために税額を計算するソフト
それ以外の使い方は全部邪道
972デフォルトの名無しさん:2012/04/11(水) 20:40:11.41
いきなり別のソフトの説明されても
973デフォルトの名無しさん:2012/04/11(水) 21:18:22.13
確定申告はそれ用のソフトがあるだろ
エクセでやってる奴ってその程度のお金も出せない貧乏人なの?
974デフォルトの名無しさん:2012/04/11(水) 22:11:36.36
エクセルのほうが高いだろ
975デフォルトの名無しさん:2012/04/11(水) 22:12:54.75
エクセルはそれ以外の用途で買ってて入れてる奴が多い
976デフォルトの名無しさん:2012/04/11(水) 22:24:07.49
ExcelVBAのスキルの前に、スルースキルを身につけろ
977デフォルトの名無しさん:2012/04/12(木) 01:04:05.31
もともと表計算ソフトが税金の計算のために発明されたってのは本当の話
978デフォルトの名無しさん: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
979デフォルトの名無しさん:2012/04/12(木) 10:33:50.90
別々のブックでマクロを共有することって出来ますか?
別々のブックで同じマクロ処理をしたいので、現在はコピーしながら
使っているのですが、マクロの内容が変更になりそうなので
今のうちに共有出来るなら作っておこうと思いまして。

宜しく御願いします。
980デフォルトの名無しさん:2012/04/12(木) 10:59:29.01
>>979
違う様な気がするけどこういうこと?
http://www.moug.net/tech/exvba/0010018.html
981デフォルトの名無しさん:2012/04/12(木) 11:32:55.50
>>980
ありがとうございます。
ググったら
http://d.hatena.ne.jp/language_and_engineering/20090731/p1
こんなのがあって、中身が理解出来ていないのですが、
こちらの方が希望に合ってると思いました。
982デフォルトの名無しさん:2012/04/12(木) 11:36:16.32
いやいや、アドインにしろよ
983デフォルトの名無しさん: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

トリミング部分削除のチェックを外した方がサイズが小さくなるのも疑問だけど、よろしくお願いします。
984デフォルトの名無しさん:2012/04/12(木) 12:06:58.32
>>983
excel vba 図 圧縮
でググる
985983:2012/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


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

連想配列使いたくて
Set dic = CreateObject("Scripting.Dictionary")
こうしても「変数が定義されていません」とエラーが出るんだけど、何がいけないの?
991デフォルトの名無しさん:2012/04/12(木) 20:33:28.01
変数dicの宣言し忘れか?
992デフォルトの名無しさん:2012/04/12(木) 20:57:14.54
993デフォルトの名無しさん:2012/04/12(木) 22:25:54.70
デザイン あ
994990:2012/04/13(金) 10:12:00.33
自己解決しました
原因はOption Explicit宣言してた為に結果>>991さんの言うとおりになっていました
995デフォルトの名無しさん: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です。
宜しく御願いします。
996995:2012/04/13(金) 17:00:21.61
自己解決しました。
Auto_Openを実行するには RunAutoMacros  の記述が必要でした。
スレ汚し、済みません。
997デフォルトの名無しさん:2012/04/13(金) 17:01:26.67
998デフォルトの名無しさん:2012/04/13(金) 17:18:38.00
質問したいけど新スレ立たないのかな

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

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

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


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