12/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:デフォルトの名無しさん
12/01/29 11:38:40.69
>>1 乙
4:デフォルトの名無しさん
12/01/29 12:22:48.13
>>1乙
それにしても前スレ最後の方ときたら次スレ案内どころか、くだらない喧嘩でスレを埋め尽くすんだから、
やっぱVBAは厨房言語と言われても仕方が無いほどの民度の低さを実感する
5:デフォルトの名無しさん
12/01/29 12:44:37.54
なんで終わった話蒸し返すかなぁ。
そんなに悔しかったのか?
6:デフォルトの名無しさん
12/01/29 12:48:28.90
>>1乙
>>4
何で蒸し返すかなぁ・・・
そういうのが呼び水になるんだって気付けよ
7:デフォルトの名無しさん
12/01/29 14:34:17.40
>>6
お前も同罪
8:デフォルトの名無しさん
12/01/29 15:20:07.91
>>7
それはむしろ>>5だろ
9:デフォルトの名無しさん
12/01/29 16:12:08.40
ID付けない辺りが民度の低さだろ
10:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/01/29 19:54:35.81
>>8
>>5
12:デフォルトの名無しさん
12/01/29 19:54:59.15
>>10
> Do While ActiveCell Like ""
ここ
「もし入っているならば」になってない
13:デフォルトの名無しさん
12/01/29 19:56:31.43
>>10
いろいろ突っ込み所満載だが
とりあえずWhileをUntilにすれば問題は解決すると思う
14:デフォルトの名無しさん
12/01/29 19:59:04.90
>>11
>>5
15:デフォルトの名無しさん
12/01/29 20:03:30.24
相当悔しかったらしい。(w
16:デフォルトの名無しさん
12/01/29 20:06:22.65
>>12
>>13
わかりました!
ありがとうです!
17:デフォルトの名無しさん
12/01/29 20:09:04.16
>>4-8、>>11、>>14-15
ほんともういい加減にしてくれない?
大概うざいんですけど。
18:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/01/29 20:19:48.99
いきなりなんだ
好きにしたらええがな
20:デフォルトの名無しさん
12/01/29 20:22:43.73
>条件内容によっては速い
これ詳しく教えてください。
どういうときに速くできるのですか?
21:デフォルトの名無しさん
12/01/29 20:22:54.82
いきなりじゃないじゃん。
つい数レス前の質問で間違いがあった部分の話題じゃん。
もしかして前スレからの下劣なケンカにご執心で
それ以外の質問回答とか目に入ってないのか?
22:デフォルトの名無しさん
12/01/29 20:27:46.68
>>21
いや、質問の内容と一切関係ない話だろ
コーディングスタイルの話なんか不毛だし荒れるだけ
23:20
12/01/29 20:34:33.04
>>22
すいません、>>18さんのレスはVBA初心者としては関心ある話題なのですが・・・
24:デフォルトの名無しさん
12/01/29 20:50:18.21
>>18
同じく初心者としては興味ある
DOとLOOPの2つと
それにwhileかuntilのどちらかの3つがセットなのかと思ったんだけど違うのか
25:デフォルトの名無しさん
12/01/29 20:57:42.84
相変わらずスレチの話題で伸びてるな
26:20
12/01/29 21:03:22.50
>>24さん
Do Loop だけで成立しますよ。
ただ、そのままだと無限ループなので何らかの脱出条件は必要ですから
通常はおっしゃるとおりにUntilやWhileを組み合わせる訳ですよね。
で、>>18さんはIf文で脱出条件を設定することを推奨されていて、
私はその手法自体は知ってたのですが、
そのほうが速くなる状況というのが分からないのでぜひ知りたいと思いました。
27:デフォルトの名無しさん
12/01/29 21:13:22.59
無理やりWhile/Untilの条件をでっち上げる位なら、
Exit Doするコードを書くほうが良い、ってことじゃね?
機械的に適用するのは頭が固すぎると思うが。
28:デフォルトの名無しさん
12/01/29 21:19:41.12
>>10のコードを
DO ifで書きなおして無事動きました。
確かにこっちのほうがわかりやすい気がします!
ありがとうです!
29:デフォルトの名無しさん
12/01/29 21:24:42.27
俺もDo Until の中に必ず If Then Exit Do End Ifを付けてる
For Next なら Exit For だな
明示しておけば(自分にとって)判りやすいという理由だけど
30:20
12/01/29 21:26:33.22
>>27
それって速度は変わらなくないですか?
自分でちょっと考えたのは脱出条件でAndを使うときに
UntilやWhileだとAndしかだめだけどIf文だとIfのネストで書けるから
(本当にほんのちょっとだけ)速く出来るかも、ということです。
31:20
12/01/29 21:32:26.12
ゴガギーン
ドッカン
m ドッカン
=====) )) ☆
∧_∧ | | / / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
( )| |_____ ∧_∧ < おらっ!出てこい>>18
「 ⌒ ̄ | | || (´Д` ) \___________
| /  ̄ | |/ 「 \
| | | | || || /\\
| | | | | へ//| | | |
| | | ロ|ロ |/,へ \| | | |
| ∧ | | | |/ \ / ( )
| | | |〈 | | | |
/ / / / | / | 〈| | |
/ / / / | | || | |
/ / / / =-----=-------- | |
32:20 ◆dMgj9t5wQ2
12/01/29 21:46:15.53
>>31
成りすましは勘弁してください
私は31じゃないです。
33:デフォルトの名無しさん
12/01/29 22:09:06.08
>>29
>明示しておけば(自分にとって)判りやすいという理由だけど
意味がわからん。
Do While ~ Loop も Do ... Loop Until ~ も、「~」で充分明示的だと思うが。
まあ、ループ中で読み込みとかの処理をして、EOF ならぬけて、そうでなければ
読み込んだデータの処理をして最初に戻ると言うような処理は、それなりにあるから
Do: ... : If ~ Then Exit Do: ... : Loop も使うけど、それに限定するのは >>27 の
言うようにちょっと頭固すぎと思う。
34:デフォルトの名無しさん
12/01/29 22:49:12.41
冗長に書いた方がわかりやすいと感じる人は結構いるっぽいね。
でも>>29は同じ条件判断を2箇所に書く(2回やる)ってことでしょ? それはないわー。
35:デフォルトの名無しさん
12/01/29 23:20:23.79
>>10
ActiveSheet.ShowDataForm
マジオススメ
36:デフォルトの名無しさん
12/01/29 23:57:52.46
>>34
>でも>>29は同じ条件判断を2箇所に書く(2回やる)ってことでしょ? それはないわー。
さすがにそれはないと思うが...、修正面倒だし、
そもそも他人が見たときヘタすると意図汲み取れないと思う。
37:デフォルトの名無しさん
12/01/30 00:27:10.99
>>35
使ってみたのですが、よく意味がわかりません。
起動時にフォーム呼び出しっぽいのですが、何もおこらないのですが
どういう効果があるのですか?
38:デフォルトの名無しさん
12/01/30 06:53:15.42
>>37
聞く前にググれ
39:デフォルトの名無しさん
12/01/31 03:33:06.65
Test
40:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/01 07:37:32.24
OnActionの実行されるスコープでは、
dicが見えていないって事なんじゃないか?
42:デフォルトの名無しさん
12/02/01 07:58:29.15
OnActionに指定するのはマクロ名
式は評価しないんだろ
43:デフォルトの名無しさん
12/02/01 22:04:08.03
OnActionは罠が多いよな…
44:デフォルトの名無しさん
12/02/01 22:12:34.88
>>40
> val = dic("foo")
> .OnAction = "'testfunc " & val & "'"
これで対処できるって事は
.OnAction = "'testfunc " & dic("foo") & "'"
で済む話のような気もするが…まさかな
45:デフォルトの名無しさん
12/02/01 22:22:00.23
&を使わずに書きたい、ってことじゃない?
46:デフォルトの名無しさん
12/02/01 22:22:58.83
>>42
評価されるよ
47:デフォルトの名無しさん
12/02/02 03:05:03.67
式を評価した結果の文字列をOnActionに設定してるだけで、
OnActionに式が設定されて評価されてるわけではないと思うが
48:デフォルトの名無しさん
12/02/02 06:49:11.59
バカ多すぎw
このレベルのことで意見割れるとかあり得ねぇw
49:デフォルトの名無しさん
12/02/02 08:01:58.10
詳細な仕様を知っている>>48がいると聞いて
50:デフォルトの名無しさん
12/02/02 08:18:33.01
>>49
いや所詮草ガキだから
51:デフォルトの名無しさん
12/02/02 22:23:01.17
草=複数の連続する"w"
1個の場合、複数でも連続でもないから、実は草ではない
52:デフォルトの名無しさん
12/02/02 22:49:35.37
>>51
さすが小学生だな
目のつけどころが違う
53:デフォルトの名無しさん
12/02/02 23:18:44.34
>>51
それは単草といって草の一種なのよ
54:デフォルトの名無しさん
12/02/02 23:34:57.87
マクロから別名保存のダイアログを出して、ユーザーにブックを保存してもらおうとしているのですが、
ダイアログおw表示させた時に初めての保存ならマイドキュメント、2回目以降なら前回のフォルダーを
表示されるようにするにはどうすればいいでしょうか?
よろしく御願いします。
55:デフォルトの名無しさん
12/02/03 02:11:09.99
>>54
まず仕様をしっかり確定させないとプログラミングはできないぞ
初めてかどうかはどうやって判別するんだ?
前回のフォルダはどこにどうやって保存するんだ?
これが答えられない(わからない)ってなら、もうちょっと詳しく状況を書かんとなんとも言えん
56:デフォルトの名無しさん
12/02/03 06:32:53.23
>>54
初めての保存→直接Excelを起動しての作成
2回目以降→既存のBookを呼出し修正保存
意味はこれで合っている?
1年1組成績表フォルダの1月成績結果というBookを呼出して新規作成を選んだ時の保存先もやはりマイドキュメント?
或いは2月成績結果にBook名に流用変更して保存する場合は?
57:デフォルトの名無しさん
12/02/04 06:16:46.60
>>53
残念、ハズレ
というか、そもそも「単草」なんてないから
草=複数の連続する"w"
数が複数と定義されているので、単数を表す接頭語を付けることは無い
芝="w"そのものであり数は関係ない
数が定義されていないので、数を表す接頭語を付けることもある->単芝、複芝
「単草」ってのは君と同じく、単芝と草を混同した勘違い君が
思いつきで口にするだけで、定義としては存在していない
58:デフォルトの名無しさん
12/02/04 07:16:08.51
>>57
どっちでもええやん
言葉とはそういう勘違いから定着するもんだよ
正しい日本語は~と言ってる学者連中はただの馬鹿だぞ
もう広まってる用法ってのは正しいものとしていかんと
59:デフォルトの名無しさん
12/02/04 07:16:34.18
>>57
そもそも「草」とか「芝」とかが定義されてるってどこで?
少なくとも非ネットの日常生活においてwを草とか芝とか言わない訳だが。
単にネット上のコミュニティーで認知されてると「君個人が認識してる」だけでしょ。
だったら「単草」だっておkじゃないの?
その辺の線引きが曖昧すぎだよ
ちなみに>>53ではありません。
草とか芝の定義とやらにも興味ないです
60:デフォルトの名無しさん
12/02/04 08:03:57.05
ネタ解説に釣られ杉wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
61:デフォルトの名無しさん
12/02/04 09:02:23.24
言い負かされるとネタで逃げる奴
62:デフォルトの名無しさん
12/02/04 09:14:49.65
かまうなよ
これは僕はレス乞食ですって自己紹介をしてるだけなんだからwwww
63:デフォルトの名無しさん
12/02/04 10:15:29.22
>>58
いい訳必死だな
あのさ、誤用と、新語や新たな言い回しを一緒くたにしてないか?
別に既存の日本語以外は使っちゃだめとは言わないけど、
間違いを内包する言葉までまとめて「定着すればそれは正しい」なんて言うのはただの馬鹿だぞ
wを芝と呼ぶのは良いが、wをエックスと呼ぶのは明らかな間違いだろ
>>59
> 「w」の文字が並ぶ様子が「雑草が生えているように見える」というところから、
~~~~~~
> 「w」を多数並べて笑いを表現する行為を「草を生やす」と呼ぶ場合がある。
~~~~~~~~~~~~~
> 草 - ネットスラングでwwwwwwwのこと。
> 草:インターネットスラングのひとつ。(笑)の略であるwを多数書き連ねることで蔑笑を表したもの。
~~~~~~~~~~~~~~~~~
どこを見ても、「並ぶ」「多数」「書き連ねる」と複数であることを説明し、例としても7連のものが上げられている
因みに上記は独断と偏見入り交じる個人サイトの記事ではなく、ウィキペやニコペなど大手の手がける辞典の記事ですよ
64:デフォルトの名無しさん
12/02/04 10:42:23.74
荒らすなら他へ行け、馬鹿
65:デフォルトの名無しさん
12/02/04 11:04:08.52
こういう話題しかレスできないんだろ。
スルーしとけ。
66:デフォルトの名無しさん
12/02/04 11:44:22.68
wikiが定義ってアホかと
67:デフォルトの名無しさん
12/02/04 13:21:17.58
広辞苑だって出版された当時のスラングを個人の独断で大量に収録してんのに
それは信頼してWikipediaをバカにする男の人って本質がわかってないってゆーか、頭悪いよね
68:デフォルトの名無しさん
12/02/04 13:41:55.07
反射的に wiki を馬鹿にする奴もどうかと思うが、
広辞苑が個人の判断で作られてるって、これまた
頭悪い以前のアホが来たな。
69:デフォルトの名無しさん
12/02/04 17:37:20.46
wikiをバカにしてるんじゃなくて、wikiがネットスラングの定義だって言ってるやつをバカにしてるんじゃないかな
70:デフォルトの名無しさん
12/02/04 18:56:03.91
まあ結論は出たみたいだから、もう終わりにしようぜ。
71:54
12/02/04 19:32:32.70
>>55-56
レス、ありがとうございます。
返事が遅くなってすみません。
ユーザーフォームに保存用のボタンを貼って、保存しようとしています。
保存を行った時に保存先フォルダーの記憶用変数を用意して、その変数が
空なら初めての保存、空白以外なら保存用ダイアログを表示した時にそのフォルダーが
表示したいという事でした。
変数に取り込めれば、フォームを閉じる際にiniファイル等に保存して次回以降は
フォルダー選択の手順を省けると思いました。
よろしく御願いします。
72:54
12/02/04 19:55:05.76
書き忘れました。
保存先記憶用変数が空の場合は、保存先ダイアログ表示時の
フォルダーはExcel任せでも良いです。
よろしくお願いします。
73:デフォルトの名無しさん
12/02/04 20:05:32.51
iniファイルへの書き込みや読み込みはAPI使うっての知ってますか?
まぁ単純にテキストファイルのオープンで読み込み書き込みでも出来なくはないだろうけど
74:デフォルトの名無しさん
12/02/04 20:16:21.93
>>72
で、何がわからないの?
75:デフォルトの名無しさん
12/02/04 21:11:43.87
>>71
chdir 前回保存先
名前を付けて保存ダイアログ表示
今回保存先を選択
非表示シートにcurdir(今回保存先)を書きみ保存
名前を付けて保存
76:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/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
78:2000
12/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:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/05 17:38:45.19
それをVBAでやりたいってことかな?
81:79
12/02/05 17:43:45.11
>80
いえ、違います。
エクセル上で上記の数式を完成させたいだけです。
82:デフォルトの名無しさん
12/02/05 17:46:29.32
>>81
だったら
Excel総合相談所 100
スレリンク(bsoft板)l50
83:79
12/02/05 17:50:34.95
あ、スレ違いでしたね。
ちょっとこっちで質問してみます。
84:デフォルトの名無しさん
12/02/06 03:30:45.14
同一コードなのに、コードのキャッシュでもされてるのか、結果不定で「?」なときがあると思いますが、そんな時の対処方法はありますか?
85:デフォルトの名無しさん
12/02/06 04:16:29.46
構文エラーを起こす
86:デフォルトの名無しさん
12/02/06 05:30:54.13
>>84
プログラムとは…
自分が思った通りに動く物ではない
自分が書いたとおりに動くのである
つまり結果が自分の希望に反して不定になるのは書き方が悪い。はっきり言えば間違ってる
よく見直せ
87:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/06 06:59:45.09
2/2
DBはMySQLをODBCで使用しています
Updateのところでエラーが発生します
実行時エラー '-2147217864 (80040e38)':
行が見つからなかっため、更新できません。列の値は最後に読み込まれた後で変更された可能性があります。
OpenしてからUpdateまでただ項目をセットしているだけでカーソルを移動させていません
項目のセット処理を削除するとエラーは出ません
ただの ○○=×× という処理でカーソルが移動するとは思えないのですがどんな問題があるのでしょうか?
89:デフォルトの名無しさん
12/02/06 11:02:10.59
ADOのUpdateコマンドではなくSQLのupdate文を
その例で言えば
crs.Execute updateのsql文
という書き方でいつもExcelからmysqlに対してやってる
そのやり方ではどうなの?
まぁ続けるとスレ違いと騒ぎ出す野郎が多そうだから
mougのDB板で聞いてみたら?
90:デフォルトの名無しさん
12/02/06 20:30:01.60
>>89
レスどうもです
>crs.Execute updateのsql文
この方法でやってみます
もし上手くいかなかったらDB板で聞くことにします
ありがとうです
91:84
12/02/07 02:38:18.51
>>85
なるほど。ありがとうございます。
>>86
ワロタ
92:デフォルトの名無しさん
12/02/07 04:59:35.62
それ主キーがないとかで行を特定できてないだけじゃないのか
93:デフォルトの名無しさん
12/02/07 12:04:22.02
質問です。
「初項(セル B3 の値)と公差(セル C3 の値)を元にして, セル範囲 B5:G5 に等差数列の値を入力する
マクロ「等差数列」を定義せよ」
という課題があるのですが、何から手を付ければいいのか分かりません。
よろしければご教授お願いします。
94:デフォルトの名無しさん
12/02/07 12:13:41.21
公式にぶちこめ
95:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/07 16:41:05.20
すみません、ワードのVBAについてはどこか質問スレってありませんでしょうか?
97:デフォルトの名無しさん
12/02/07 17:30:37.03
>>96
専門スレはないのでここで聞いてみる
Word(ワード)総合相談所 Part21
スレリンク(bsoft板)
98:デフォルトの名無しさん
12/02/07 17:46:04.08
ない
場違い承知・まともな回答返ってこない前提でここかパワポVBAスレッドで聞いてアレンジするか
ググって見つかる掲示板利用するしか
99:デフォルトの名無しさん
12/02/07 17:48:36.97
(*ノノ)イヤン
100:デフォルトの名無しさん
12/02/07 17:51:41.95
>>95
>おっぱい見せて
さろんへ行け。
101:デフォルトの名無しさん
12/02/07 17:51:42.53
VBEで入力した全角文字が片っ端から自動で確定されて日本語入力できないんですが、仕様ですか?
102:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/07 21:24:17.08
Selection.TypeParagraphが三つあるから改行がみっつ入るんじゃないのか?
それひとつにしてそのあと"物:"追加すればいいんじゃね
つか物:を置換してマクロ記録すればすぐわかるような
104:デフォルトの名無しさん
12/02/07 21:36:32.82
>>103
回答ありがとうございます。
例で出したソースは例えで、「物:」実際は数字や日付、名前のような動的なものが入ります。
なので静的に「物:」を後から足すという手法が使えません。
さらに、実際は改行は1発ではなく、間に3行欲しいので3発入れる必要があります。
例えが下手で申し訳ありません。
105:デフォルトの名無しさん
12/02/07 21:48:44.82
データの整理をVBAで行うことを考えている初心者です
VBAを試しに書いて実行してから保存をしてみたところ、VBAによって行われたシート側の改変まで保存されてしまうようなのですが、
コードの部分だけを保存する方法はないでしょうか?
106:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/07 21:57:15.58
>>105
VBAを行うファイルとデータファイルとを別々にスレばいい。
今は同じブック内でやってんでしょ?
108:デフォルトの名無しさん
12/02/07 21:59:38.02
>107
なるほど、それは盲点でした
どうもありがとうございます
109:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/07 23:20:14.94
>>109
それ 94 の方法でしょ
111:デフォルトの名無しさん
12/02/07 23:50:08.62
>>102
>>97
または
mougでもいけばいいんじゃない
With Selection.Find
Replacement.ClearFormatting
.Text = "物"
.Replacement.Text = vbCr & "物"
.Execute Replace:=wdReplaceAll
End With
112:デフォルトの名無しさん
12/02/08 00:33:54.14
>>95,>>106,>>109,>>110
の方々、ありがとうございます。とても助かります。
もうひとつ質問があるのですが、
・選択したセル範囲に対して、
a.空白セルの場合には背景色を黄色( RGB(255,255,0) )にする
b.空白でないセルの場合は背景色を色なし( xlColorIndexNone )にする
マクロ「チェック」を書きたいのですが、どのようにすればいいのでしょうか。
113:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/08 03:16:33.90
>>112
Sub チェック()
Selection.Interior.Color = -4142
Selection.SpecialCells(4).Interior.Color = 65535
End Sub
115:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/08 07:28:55.58
>>115
>>97
117:デフォルトの名無しさん
12/02/08 16:02:40.64
>>113,>>114
ありがとうございます!
118:デフォルトの名無しさん
12/02/08 16:14:10.84
>>116
ありがとうございます。>>111さんに教えて頂いたmougにて有用な回答を得て解決出来ましたので
エクセルでも応用が利くかもしれないので、方法を貼っておきます。
.Replacement.Text = "^p^p^p\1"
とすることで、\1が置換後の文字列をそのまま使ってくれる事を教わりました。
これで解決することが出来ました。
以上です。ご回答頂き本当にありがとうございました。
119:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/08 23:58:52.00
>>119
ActiveWindow.SelectedSheets.PrintPreview
121:デフォルトの名無しさん
12/02/09 00:17:23.02
>>119
Worksheet オブジェクト(普通のシート)には PrintPreview メソッドが存在する、よってシートを選択してプレビューできる
sheets オブジェクト(複数のシートを保持できる)には PrintPreview メソッドが存在する、よって複数のシートを選択してプレビューできる
range オブジェクトには PrintPreview メソッドが存在する、よって範囲を選択してプレビューできる
range オブジェクトは同一シート内なら複数の範囲を保持できる、よって同一シート内なら複数の範囲をプレビューできる
ただし、Excel には複数のシートをまたがる複数の Range を保持できるオブジェクト自体が存在しない
そのため、それに対応する PrintPreview メソッドも存在しない
たぶん
122:デフォルトの名無しさん
12/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
123:119
12/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:デフォルトの名無しさん
12/02/09 17:07:00.03
Dim 変数 as Range
このようにオブジェクト変数を使いセルを代入すると
その情報の中にそのセルの上位のシートやブックも一緒に保存されてるんですか?
125:デフォルトの名無しさん
12/02/09 18:46:47.98
>>124
たしかParentプロパティとかに入ってたと思う。
126:124
12/02/09 19:08:28.56
Parentプロパティって何でしょうか?
つまりそのRange型変数には入ってるってこと?
その特定のセルの場所を保存するには
ブック型変数(Dim~as Workbook)、シート型変数(Dim~as Worksheet)、セル型変数(Dim~as Range)の3つが必要かと思ってたけど
セル型ひとつで済むならかなり楽だけど、違うのかな?
127:125
12/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
128:125
12/02/09 19:49:11.26
>>126
ごめん、後半読んでなかった
セル範囲の指定をRange型変数ひとつでできないか、という話だったのね。
Range型変数に代入されたセル範囲はRange型変数だけで特定できるから
そういう意味ではWorkBook型やWorkSheet型の変数は不要だよ。
てっきりブックやシートの指定もレンジ型一つで全部済ませたい
ってことかと思ってたよ
(>>127で書いたとおりそれもできることはできるけど、
記述が長くなるからあんまりメリットを感じない。)
129:デフォルトの名無しさん
12/02/09 22:17:32.76
バイナリファイルを読み込んでデータの中の文字列を探したいと思ってます。
バイト配列と文字列を比較するためにしなくてはいけないのですが、
型を合わせる方法がわかりません。 バイト配列から文字列、また
文字列からバイト配列に変換する方法を教えてください。
よろしくお願いします。
130:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/09 23:44:26.34
>>129
>ANSI 形式のバイト型配列を文字列に変換する場合は、StrConv 関数を使用してください。
>Unicode 形式の配列を変換する場合は、代入式を使用してください。
以上 StrConv 関数のヘルプから
それ以外の文字コードだった場合はVBAだけで簡単にやる方法は多分ない
132:デフォルトの名無しさん
12/02/10 00:19:32.83
文字コードによるけど、バイナリファイルだって最初っからテキストモードでオープンすりゃええがな
133:126
12/02/10 00:29:11.59
>>127>>128
すばらしい解説ありがとうございます。
なるほど、Rangeでもシートやブックの情報を裏で持ってたんですね。
頭スッキリしました。
こういうスッキリ感がプログラムという複雑化しやすいことを扱うにはものすごく重要ですしね。
ということはRangeのオブジェクト変数はものすごく便利ですね。
134:デフォルトの名無しさん
12/02/10 00:53:51.04
間違ってた
○ChrW
×Chr
135:デフォルトの名無しさん
12/02/10 00:55:28.19
>>134は>>130についてです
136:129
12/02/10 01:23:07.49
>>130>>134>>135
具体的なサンプルありがとうございます。
SJISの場合はChrでUTFの場合はChrW
を使えばよいのでしょうか?
>>131
たしかSJISだったと思うのでStrConvを使えば
比較できるということですね。
ヘルプを確認してみます。
>>132
テキストモードでオープンすると正しく取得できない
値があるのでバイナリモードでオープンする方法を検討しています。
137:130
12/02/10 01:44:11.61
>>136
>SJISの場合はChrでUTFの場合はChrW
違う
ChrWは単なる間違い
130の例で Shift_JIS の "あ" を検索したいなら、
Chr(&H82) + Chr(&HA0)
を検索する必要がある
面倒だけど、その代わりバイト並びさえ分かっていれば変換による情報落ちの心配なしにどんなコードでも処理できる、という例
138:デフォルトの名無しさん
12/02/10 11:13:23.28
VBAの基本的な文法はマスターしたのですが
Error処理のしかた
プロシージャのCallの呼び方
きれいなコードの書き方
イミディエト窓の使い方
バグフィックスのしかた
など、普通の入門書にはほとんど書かれていないこともマスターしたいです
そのためのいい本はありますか?
139:デフォルトの名無しさん
12/02/10 13:05:03.46
これは正しいですか↓
-------------------------------------------------
LoadするとInitializeイベントが発生して、
ShowでActivateイベントが発生する。
HideするとDeactivateイベントが発生して、
UnloadでTerminateイベントが発生する。
LoadしないでShowすると自動的にLoadされてShowするし、
HideしないでUnloadしても自動的にHideされてUnloadする。
140:デフォルトの名無しさん
12/02/10 13:07:14.91
>>139
神!
こういう整理された情報こそ実用的であり非常に有用。
みんなも>>139みたいな情報を共有しあうために貼り付けようじゃないか!
141:デフォルトの名無しさん
12/02/10 13:34:27.98
すくなくとも
>ShowでActivateイベントが発生する。
>HideするとDeactivateイベントが発生して、
は正しくない
Showした結果アクティブになればActivateイベントが発生するし
Hideした結果アクティブじゃなくなればDeactivateイベントが発生する
HideしたからってかならずDeactivateが発生するわけじゃない
142:デフォルトの名無しさん
12/02/10 14:42:14.40
Workbooks(x)のxを
そのworkbookの名前から取り出す方法を教えてください。
143:デフォルトの名無しさん
12/02/10 15:20:21.90
取り出す必要なんてない。
144:デフォルトの名無しさん
12/02/10 16:14:52.80
>>142
WorkbookオブジェクトにはIndexプロパティがないので直接求めるのは無理
Workbooksコレクションをループで順番に見ていくしかない
けど>>143の言う通り、インデックス番号なんかわからなくてもプログラムは書ける
何がやりたいの?
145:142
12/02/10 16:31:35.11
長いコードを短くしたいの。
146:デフォルトの名無しさん
12/02/10 16:33:32.37
コピペをVBAコードて書く場合、
なぜ対象オブジェクトはシートなんですか?
普通に考えてセルであるべきだ。
納得される説明・理由が聞きたいのですが。
147:デフォルトの名無しさん
12/02/10 17:11:39.81
>>145
短くしたいなら、
dim book as workbook
set book = workbooks("bookname.xls")
'以降bookを使ってコードを書く
の方が良くない?
148:デフォルトの名無しさん
12/02/10 17:34:20.86
>>145
それならオブジェクトを変数に入れた方がいい
短くなるだけでなく、処理も少し軽くなる
具体例は>>147
コードを短くする方法はいくつかあって、Withを使うのも効果的
149:デフォルトの名無しさん
12/02/10 19:10:47.12
>>146
そんなことをここで聞かれてもな
マイクロソフトに聞け
ただ、おまえが普段どんなコードでコピペしてるかしらんが
少なくとも俺はコピーするときはRangeが対象なことがほとんどだし
Rangeに張りつけたければPasteSpecialも使えるぞ
150:デフォルトの名無しさん
12/02/10 19:38:29.05
VBAでVLOOKUPのようなことをしたい場合どうしてますか?
151:デフォルトの名無しさん
12/02/10 19:41:55.38
VBAで改行を文字列にするにはどうすればいいですか?
152:デフォルトの名無しさん
12/02/10 19:49:24.89
>>150
あなたはどうしてますか
153:デフォルトの名無しさん
12/02/10 19:50:09.64
>>151
ん?
154:デフォルトの名無しさん
12/02/10 19:57:04.82
>>152
使い方をしらないからまだ使ったことない。
>>151
vbLINEかvbCRみたいなのなかったっけ?
VBAでワークシート関数を使いたいとき、Application.WorkSheetFunctionを使えばいいと書いてあるけど
どんな関数でもVBAでも使えるのですか?
さらにWorkSheetFunctionのあとは単にワークシート関数の単語を書けばいいだけ?
155:デフォルトの名無しさん
12/02/10 20:04:05.38
ワークシートとVBAで混乱するもの
FindとInstr
TextとFormat
DateとToday
その他多数
これみんなどうやって記憶してるの?
156:デフォルトの名無しさん
12/02/10 20:08:37.99
>>150
VBAでもVLOOKUP関数は普通に使える
157:デフォルトの名無しさん
12/02/10 20:09:39.85
>>154
オブジェクトブラウザで、WorksheetFunctionオブジェクトを見れば良い。
Application.WorksheetFunctionプロパティが返してくるのがこいつだから。
別にExcel固有の記述とかそういうものじゃない。
158:デフォルトの名無しさん
12/02/10 20:09:50.18
>>151
vbCr
vbLf
vbCrLf
159:デフォルトの名無しさん
12/02/10 20:09:57.92
なんだか真面目に質問しているようにみえないんだが
気のせい?
160:デフォルトの名無しさん
12/02/10 20:12:30.38
>>155
使ってれば自然に覚える
間違えばエラーが出るから、それを見て直す
忘れたらヘルプを見る、Googleで検索する
せっかくコンピューターが色々と助けてくれるんだから
完璧に暗記することよりも、それを活用する方法を考えた方が応用範囲が広くなる
161:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/10 20:25:47.45
>合ってます?
聞く前に試せば済むこった
163:デフォルトの名無しさん
12/02/10 20:30:50.24
あなたの回答力も試したいと思って。
164:デフォルトの名無しさん
12/02/10 20:34:24.98
やはりそうでしたか
165:デフォルトの名無しさん
12/02/10 20:34:45.43
>>162
試してもエラーが出るんですけど。エラいこっちゃ。
166:デフォルトの名無しさん
12/02/10 20:36:28.19
>>165
WorksheetFunction.Sum(Range("a1:e5"))
167:デフォルトの名無しさん
12/02/10 20:37:47.13
Activecell=Application.WorksheetFunction.Sum(Range("A1:E5"))
ならうまくいきました。
しかもセルには数式じゃなく結果の数値のみが表示されてる。
もしVBAでセルに数式そのものを入力したい場合はどうすればいいの?
168:デフォルトの名無しさん
12/02/10 20:38:30.47
>>167
ActiveCell.FormulaLocal = "=Sum(A1:E5)"
169:デフォルトの名無しさん
12/02/10 20:38:34.59
>>166
1分19秒先を越された・・・・・・
170:デフォルトの名無しさん
12/02/10 20:39:38.10
>>168
ありが十匹。
ところで単にActiveCell= "=Sum(A1:E5)"、または、ActiveCell.Value= "=Sum(A1:E5)"、でも問題ないですか?
171:デフォルトの名無しさん
12/02/10 20:41:56.18
>>170
試してみたらどうだ
172:デフォルトの名無しさん
12/02/10 21:32:09.71
あなたのVBA力と回答力を試しているんですが
173:デフォルトの名無しさん
12/02/10 21:47:11.33
ワークシート関数のSumと
VBaのApplication.WorksheetFunction.のあとのSumでは
そのあとに続くコードが微妙に違うの?
Vlookupの場合は?
まさか関数ごとに全部覚えないといけないの?
>>171
できた。
174:デフォルトの名無しさん
12/02/10 21:52:43.03
>>173
> Vlookupの場合は?
試してみたらどうだ
175:デフォルトの名無しさん
12/02/10 22:03:27.91
VBAのコードを使って、ファイルやフォルダを自由自在に操ってみたいと思ってます。
[ファイル]と[フォルダ]のそれぞれ2つについて、
[移動][コピー][削除][名前の変更]の4つはどうコードで記述すればいいか(つまり2x4=8個について)、
どなたか教えていただけませんか?
それが載ってあるサイトのURLでもいいです。
(*[フォルダ]の[削除]は、もしその中にファイルやフォルダがあったらそれも含めて全部削除するとします)
176:デフォルトの名無しさん
12/02/10 22:09:50.59
>>175
VBA力と回答力を試しているんですか
177:デフォルトの名無しさん
12/02/10 22:22:14.32
>>175
んなもん、それぞれぐぐっていけばいいだけの話だろうが
Office TANAKA - トップページ
URLリンク(officetanaka.net)
URLリンク(officetanaka.net)
あたり読めば?
178:デフォルトの名無しさん
12/02/11 07:56:33.53
あなたの検索力を試したんですよ
まあまあですね
179:デフォルトの名無しさん
12/02/11 17:49:13.59
>>178
くやしいのうwwwwwwwwwくやしいのうwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
180:デフォルトの名無しさん
12/02/11 19:00:02.04
"w" も使い過ぎると逆効果だなあ。
181:デフォルトの名無しさん
12/02/11 22:54:53.04
図形を含んだシートのコピーに関して教えてください。
セル範囲を指定してコピー、別シートに貼り付けをしているのですが、
コピー自体はできるのですが図形の大きさが変わったり、印刷した時の大きさが違ったり
してしまいます。
全く同じにコピーするにはどうすればいいのでしょうか?
シート自体のコピー挿入の方がいいのでしょうか?
よろしくお願いします。
182:デフォルトの名無しさん
12/02/12 00:28:06.43
>>181
図形の生成はマクロでやってる?
そうならコピペせなんでも生成時のアドレス変えてもう一つ作ればいいんじゃ?
もし、マクロで生成したものでない図形を~って話なら
図形のプロパティでセルの移動とかにあわせて大きさを変えないようにすればいけるかと。
ペースト先セルの列の幅やら行の高さやらがコピー元と違うと大きさ修正されちゃうし。
183:デフォルトの名無しさん
12/02/12 03:55:14.43
エスパー(マクロでやってないな)
184:デフォルトの名無しさん
12/02/12 14:52:49.17
こんにつわ、他人から貰ったExcelファイルがどういうコードで動いてるか見るにはどうすればいいのじゃ?
185:デフォルトの名無しさん
12/02/12 14:59:31.37
>>184
Alt+F11
186:デフォルトの名無しさん
12/02/12 15:19:23.68
ありがとうちゃん
187:129
12/02/12 23:35:21.88
>>137
全角文字、たとえば”あ”を&H82 + &HA0に変換する場合は
どうすればよいのでしょうか?
以下のように記述を比較してみましたが一致しませんでした
ご教授おねがいします。
msg = Chr(Asc("あ"))
msg2 = Chr("&H82") + Chr("&HA0")
188:デフォルトの名無しさん
12/02/12 23:40:08.67
>>187
MsgBox Hex(Asc("あ"))
189:デフォルトの名無しさん
12/02/12 23:52:57.06
他Bookに記述してるマクロを実行(あるいはSubやFunctionを呼び出し)することって
できる?
頻繁にやるのは望ましくない?
190:デフォルトの名無しさん
12/02/13 00:22:53.83
>>189
たとえばBook1.xlsmのThisWorkbookにあるsub testを呼び出すなら
Application.Run "Book1.xlsm!ThisWorkbook.test"
でできる
頻繁どころか、アドインでもない限り他ブックのマクロ実行させるのはまったく好ましくない
191:デフォルトの名無しさん
12/02/13 00:23:18.72
マクロでコントロールを状況に応じて増やしたいんだけど
そういうことってできる?
たとえば5と入力したら別Window(Form)を開いて
そこに5つのラベルとテキストボックスを挿入したいの。
192:デフォルトの名無しさん
12/02/13 00:26:32.22
なんでマルチポストすんの?
193:デフォルトの名無しさん
12/02/13 00:57:04.90
>>189
もちろんできる
複数のブックから使用するマクロを別ブックにしたり、
複数のブックのマクロを呼び出すメニュー用のブックを作ったり、
xlsxのファイルで使用するためのマクロを別ブックにしたり、
いろいろ
ExcelVBAの考え方としては、データを置くワークシートと、
プログラムを置く標準モジュールをどう配置するか
194:187
12/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:デフォルトの名無しさん
12/02/13 02:04:05.27
「あいうえお」と書かれたテキストファイルを
>>130のコードに突っ込めば直ぐ解る。
196:187
12/02/13 02:53:20.17
>>195
きさま、舐めとんかゴルァ
197:デフォルトの名無しさん
12/02/13 19:33:16.74
保存ダイアログが出たときに、特定のフォルダーが出るように下記の様に
書いたのですが、Win7 32bitでは希望通りの動きなのですが、64bitだと
マイドキュメントが選択された状態で表示されてしまいます。
xlAPP.GetSaveAsFilename(InitialFileName:=SaveDir & FileName)
64bit版でも指定したフォルダーを選択状態にさせるにはどうすればいいですか?
よろしくお願いします。
198:デフォルトの名無しさん
12/02/13 19:57:03.92
すみません。
コピーし忘れがありました。
一度保存すると、その時のフォルダーを保存しておいて、2回目からは
SaveDirに記憶したフォルダーを選択するようにしています。
SaveaDir = CurDir
そのために上記の様にして記憶するようにしています。
(このスレを読んで参考にしました。)
32bit版は変数の中身が変わるのですが、64bit版ではブックを読みだしたフォルダーから
変更されない感じです。
よろしくお願いします。
199:デフォルトの名無しさん
12/02/13 20:18:43.27
>>198
省略しすぎ。もう少しコードを見せられないの?
200:デフォルトの名無しさん
12/02/13 21:24:43.24
>>197
ディレクトリだけ?
ファイル名は正しく表示されるの?
201:デフォルトの名無しさん
12/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 "URLリンク(keiba.yahoo.co.jp)"
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:デフォルトの名無しさん
12/02/14 17:43:32.49
>>197
& "\" &
203:デフォルトの名無しさん
12/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
204:197
12/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:デフォルトの名無しさん
12/02/14 22:07:08.20
× Save_NAME = xlAPP.GetSaveAsFilename(InitialFileName:=Save_Name)
○ Save_NAME = xlAPP.GetSaveAsFilename(InitialFileName:=Save_dir)
です
206:デフォルトの名無しさん
12/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 = "URLリンク(keiba.yahoo.co.jp)"
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
207:206の続き
12/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
208:206
12/02/15 00:15:06.33
個人的には
ie.visible=true
はFalseのほうが画面の切り替えがなくて好きだけど、
非表示にしとくとIEのアクセスでエラーが出てるときの
エラーメッセージも表示されなくなるんだっけ?
209:206
12/02/15 00:19:14.69
連投スマソ
入力する年月日のうち、日は日付じゃなくて開催何日目かなので
そこんとこよろしく
(たとえば、06120105は中山競馬場、2012年1月の開催5日目の意味)
210:デフォルトの名無しさん
12/02/15 00:31:34.64
それだと一つの競馬場で36レースやらないと全レースのデータは拾えないんじゃね?
多分、一つの競馬場では1日に12レースしかやらないと思うよ。
同じ日に最大で3カ所開催するから3*12で36レースってことじゃないかな?
211:206
12/02/15 00:54:42.24
>>210さん
えーと、
ご指摘ありがとうございます・・・orz
私は競馬やったことないんで知りませんでした。
そうすると、開催地の変更もループ処理に掛けないといけないですね。
でも、ちょっと調べたところ、
URLリンク(keiba.yahoo.co.jp)
ここを見たら同じ日でも場所によって開催何日目かがまちまちなので、
単純に場所だけを変えても上手くいかなそうです。
(データを取り込むURLが
[年][場所][月][開催何日目][何レース]の組み合わせですので、
日付から開催日を知る方法がないとすべてのデータが取り込めません。)
同じ日に開催する場所や日数に何か規則性があるなら良いのですが、
私は競馬のことをよく知らないので見当も付きません。
力不足で申し訳ないです。
212:デフォルトの名無しさん
12/02/15 02:52:59.70
皆さんホントこんな初心者の為に考えてくださってありがとうございます!
何か別な方法考えてみます!
213:デフォルトの名無しさん
12/02/15 03:05:01.57
>>212
丸投げじゃなく自力でがんばってみる気があるなら
URLリンク(keiba.yahoo.co.jp)
↑のページからURL情報を取得すればできると思うぞ
開催年と開催月 は↑のURL にあるし
開催日はページ内にあるから対象日の 開催名のリンク先URLを取得して
レースNoを付加してやればいいと思う
214:デフォルトの名無しさん
12/02/15 04:15:47.11
ありがとうございます!
なんとか頑張ってみます!!
215:デフォルトの名無しさん
12/02/15 11:53:49.85
ユーザーフォームに複数の項目(名前、年齢、身長、体重など)を設定して、
空欄があった場合に「名前を入力して下さい」とかメッセージボックスで表示するようにしたいんです。
それでもし、複数の項目が空欄なら「名前を入力して下さい」「年齢を入力して下さい」と
1つのメッセージボックス内に表示されるようにしたいのです。
順列組み合わせをIFしていったらすごいことになるので短くプログラムする方法はないかなと思いまして。
IFのネストとかstrを使ってとか断片的には思い浮かぶんですけど……
216:デフォルトの名無しさん
12/02/15 12:31:51.42
質問させてください。
シートにフォームのボタンを貼ったのですが、このボタンをVBAから押した
ことにする方法はあるでしょうか。
217:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/15 14:20:34.57
>>217
なりました!
ありがとうございますm(_ _)m
219:デフォルトの名無しさん
12/02/15 17:36:33.04
>>216
そのボタンを押した時に実行するプロシジャを実行すれば良いだけなのでは?
220:デフォルトの名無しさん
12/02/16 01:25:02.28
横から失礼。
> そのボタンを押した時に実行するプロシジャを実行
でなく、そのボタンを押す事は出来ないの?
221:デフォルトの名無しさん
12/02/16 01:40:57.51
命令文うんたらかんたら
CommandButton1_Click
命令文うんたらかんたら
222:デフォルトの名無しさん
12/02/16 03:33:49.75
>>220
メッセージを送ればボタンは押せるけど
プロシージャ実行と結果は同じだから手間がかかるだけで意味がない
他の常駐アプリでボタンクリックのメッセージ監視目的とかだとスレ違い気味だし
そんだけ知識ある人がこんな質問するとは思えない
223:デフォルトの名無しさん
12/02/16 09:20:50.66
>>220
UWSC使え w
224:216
12/02/16 10:15:08.10
みなさんありがとうございます。
>>222
どうやってシートのボタンオブジェクトを取得して、どんなメッセージを送ったらよいのでしょうか。
VC++とかはよく使いますが、ExcelVBAは初めてです。
ユーザーフォーム上のボタンは押したことにできるので、シート上のフォームのボタンも押す方法が
ないか探しております。
よろしくお願いいたします。
225:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/16 18:29:17.43
VBA初心者です
Excel2007
A1 ALL1
A600 ALL600
この範囲内に画像を取り込んでモザイク画を作っています。
画像サイズによっては空白部分も多いのですが空白部分を省いて印刷するにはどうすればいいでしょうか?
プリンターの関係上A1サイズなので後で組み合わせるのにヘッダーでページ番号もつけています
227:デフォルトの名無しさん
12/02/16 19:00:52.59
>>226
印刷した時にどこで切れるかはHPageBreaks(n).Location
またはVPageBreaks(n).Locationで調べることができる
あとは、ページごとにセルの色が全部標準か白なら印刷しないっていう
ちょっと面倒なプログラムを書くしかない
228:デフォルトの名無しさん
12/02/16 20:50:50.26
>>225
それってフォームのボタンでないんじゃない
229:デフォルトの名無しさん
12/02/16 22:53:25.40
教えてください
VBAにアドインってのが有るそうなんですが、マクロをアドインとかいうものにするのはどういうメリットがあるんですか?
皆さん、どういう風につかっておられます?
230:216
12/02/16 23:29:29.26
>>225
ありがとうございます!
コントロールツールボックスのボタンの場合は、どのようにしたらよいでしょうか。
231:デフォルトの名無しさん
12/02/16 23:37:49.90
>>230
>>225がコントロールツールボックスのボタンの場合じゃないのか
232:デフォルトの名無しさん
12/02/17 08:00:18.97
>>229
アドインって .xla のこと?
.dll のように、色んなワークブックからCallされる自分用関数をまとめておくとか。
でも、キャッシュみたいのがかかっていて結果不定になるので、デバッグ面倒だよ。
233:デフォルトの名無しさん
12/02/17 17:43:41.83
>>232
229です。
>結果不定になるので、デバッグ面倒だよ。
なんか扱いが大変そうだな・・・
教えていただきありがとうです
234:デフォルトの名無しさん
12/02/17 17:52:06.19
>>232
> でも、キャッシュみたいのがかかっていて結果不定になるので、デバッグ面倒だよ。
んなこと全然無い。
アドインのメリット。
例えば、社内用の勤怠計算を行うマクロを書いたとする。
そのマクロが入った、データ入力用シート入りのBookを社員に配布する。
配布した後で、バグが見つかって修正したり、機能を追加したりしたくなったらどうする?
「マクロが入った、データ入力用シート入りのBook」だと、もうデータ入力済みの場合、
全員のBookをまるごと取り替えることはできないから、マクロ部分だけ入れ替える必要がある。
これを、「勤怠計算を行うマクロ」が入ったxlaと、データ入力用のBookに分けておくと、
xlaを更新したら全員に配布して、ファイルを入れ替えてねで済む。
もちろん、他言語のライブラリ同様、ライブラリとしてのメリットは全て持ってる。
235:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/17 19:53:43.47
>>235
VBAでではなく、ワークシート関数でってなら
Excel総合相談所 100
スレリンク(bsoft板)l50
237:デフォルトの名無しさん
12/02/17 20:33:56.12
なにそのタライ回し。いつもより多く回ってるんじゃないの。
238:デフォルトの名無しさん
12/02/17 20:43:07.85
このスレはいつもこうだよ
239:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/18 01:26:54.85
修正です
誤 With Range("A2").Interior
正 With Range("A2:C2").Interior
241:デフォルトの名無しさん
12/02/18 01:31:10.99
× チェックシートを作成したく、
○ チェックシートを作成したいのですが、
日本語は大切にね
242:デフォルトの名無しさん
12/02/18 01:34:56.42
>>239-240
スレ違いな答えになるけど、条件付き書式を使ったほうがいいかと。
書式を「"○"」、条件付き書式として0より大きいなら背景色を設定とかやれば、
1を入力してやればチェックって感じに出来ると思う。
243:デフォルトの名無しさん
12/02/18 01:42:17.46
>>239
コマンドボタンはどのセルに配置してあるの?
D列のセル?
244:239
12/02/18 02:02:35.32
>>241
失礼しました。
以後気をつけます。
>>242
ググってみましたが自分の希望に沿えるものではなさそうです。
あくまでワンクリックで背景色の変化ができるものを作成したいと思っております。
参考画像を用意いたしました。URLリンク(uploader.sakura.ne.jp)
作成したいと思っているチェックシートについて
・隣接する行の背景色を変えることによるチェックをする。
※詳細
チェックボタンを押すと背景色を変化させる
(With Range("A2").Interior .ColorIndex = 36 以下略)
さらに隣の取り消しボタンを押すと背景色なし設定にする
・値の入力ではなく、ボタンをワンクリックすることで変化させる。(これが重要事項だと思われます)
例の画像は8行ですが実際に作成するものは100行以上になります。
以上になります。よろしくお願いいたします。
245:239
12/02/18 02:11:02.38
>>243
画像では見やすくするために中央のほうへ寄せましたが、
いわゆるD列にボタンが配置されているものと思われて結構です。
ボタン自信をセルに配置することが自分の知識ではわからないので、
配置はコピーで行ってます。(セルを選択してCtrl+vを押すだけなので我慢)
つまるところボタンのオブジェクト名の番号が1,2,3...と上昇します。
ボタンが数個なら>>239のコードを複数コピーして値を変化させることができますが、
100以上となると無理ではありませんが非常に面倒です。
そこで一括で設定する方法は無いものか模索していたところです。
多分一番重要なことを忘れていましたが私はExcelVBAについては初心者です。
度々すみません。よろしくお願いいたします。
246:デフォルトの名無しさん
12/02/18 02:15:02.93
>>244
答えてあげたいが、時間がない
例えば
topleftcellを引数で渡すプロシージャを作って
それぞれのボタンクリックのプロシージャから
呼び出せば?
テキスト(プログラム)を出力するプログラムを書いて
それをインポートする手もある
クラスモジュールを使うか
247:デフォルトの名無しさん
12/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
248:247
12/02/18 03:13:52.81
一応簡単に説明しておくと
ボタンクリックのイベント内からは Application.Caller でクリックしたボタン名が取得できる
ボタン名をあらかじめ chkbtn_<行番号> として作成しておき、イベント内で行番号をボタン名から切り出して現在の自分の行番号を取得している
イベント内でボタン名が取得できるので、クリックのイベントプロシジャを個別に作成する必要はなく、すべて共通でよい
この例はチェックボタンだけだけど、当然同じやり方でクリアボタンも作成できる
249:239
12/02/18 03:25:21.74
>>247
試してみましたがうまく動作しませんでした。
多分こちらのボタンの置き方が悪いのかもしれません。
(前述の通りExcelVBA及びコンソールの配置等は初心者です。すみません。)
また関数の大まかな意味も知っておきたいのですが、
もしお時間が許すのであればご教示のほどをお願いします。
250:239
12/02/18 03:26:41.00
>>247
書き込み中のすれ違いになってしまいました。
ありがとうございます!!
もう一度試してみます。
251:239
12/02/18 03:45:13.45
>>247
すみません何度か試行錯誤を繰り返してみましたがどうにもうまく動作しません。
お手数ではありますが扱い方のご教示、
もしくはソースファイルのアップロードをお願いいたしたいのですが。
252:54
12/02/18 03:52:25.06
>>241
別に間違ってないよ。
253:デフォルトの名無しさん
12/02/18 04:37:15.26
>>251
俺は247さんじゃないけど、
247さんのコードを標準モジュールにコピペするだけで動いたよ
(全部コピペして、Sub CreateButtons() を実行)
ちなみに環境はWin7 64bit、Excel2000、です
むしろ貴方がどのようにやったのかを具体的に提示したほうが早いと思う。
たとえば上記コードを標準モジュールじゃなくボタンに貼り付けたりしてないよね?
254:239
12/02/18 05:25:47.81
>>253
今までシート自体にコードを貼り付けていました。
標準モジュールを新たに挿入して貼り付けたら無事動作いたしました!
大変勉強にもなりました。
ご回答していただいた皆様本当にありがとうございました。
ソースコードを記述いただいた>>247さんには感謝の限りです!
本日は朝も近いのでお休みいたします。
最後に改めてありがとうございました。
255:デフォルトの名無しさん
12/02/18 06:44:14.37
俺もこれ利用したいけど 単一のセルしか塗りつぶしできない
どうすれば行を(この場合だとA2からC2までの)指定出来ますかね
256:253
12/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:デフォルトの名無しさん
12/02/18 13:19:54.76
すみません>>247のコードでボタンを二つ作りたいのですが、
標準モジュールを新たに挿入すると内容が二つとも同じになってしまいます。
対処法を調べても理解できないのでどなたか教えてください。
258:デフォルトの名無しさん
12/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
259:258
12/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
260:253
12/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番目のプロシージャを書き足す作業をすれば良いんだよ。
これだけ説明されて分からないなら、多分今の貴方には作れないと思うよ
261:253
12/02/18 13:51:56.14
って俺が長々説教かいてる間に
>>258さんがコード作ってくれちゃったね。
>>257良かったな。
でもこういうのただ丸投げするより
動作原理を理解して自分でいじれるようになった方が良いから
自分でもがんばってね
262:デフォルトの名無しさん
12/02/18 14:07:08.52
>>258
一部修正必要だけど、257には無理かもね
263:デフォルトの名無しさん
12/02/18 14:24:35.19
Application.Caller ってボタン名というかオブジェクト名しか取れないのが使いにくいけど、
あらかじめ Dictionary 使ってオブジェクト名をキーにして情報格納しておけば、
ボタンクリックでオブジェクト名から数字だけを切り出すまでもなく、
座標やチェック/クリアの属性なんかも関連付けできるようになるのでいろいろ応用は効く
264:253
12/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:デフォルトの名無しさん
12/02/18 14:47:53.44
>>264
いやオブジェクト名は、どのみち影響しないけど
修正したいと言うと予想されるのはキャプションのほうね
266:デフォルトの名無しさん
12/02/18 17:18:24.54
こんにつわ
alt+F11押したらVBAProjectパスワード、要求されたんだけど、へるぷみー
267:デフォルトの名無しさん
12/02/18 17:29:55.96
事故解決下
268:デフォルトの名無しさん
12/02/18 23:05:13.47
Excelで「平成1年」を「平成元年」と表示させるための一番簡単な方法はなんですか?
ちなみに昭和や平成の他の年もいっぱいまざっています。
269:デフォルトの名無しさん
12/02/18 23:20:54.49
Replace(s, "平成1年", "平成元年")
270:デフォルトの名無しさん
12/02/19 00:13:58.80
> 昭和や平成の他の年
の考慮が漏れてるではないか。
271:デフォルトの名無しさん
12/02/19 00:20:14.51
[^0-9]1年
272:268
12/02/19 00:58:11.82
>>269
でかした!
>>270-271
どういうこと?
273:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/19 06:24:27.04
>>272
>>269では誤動作するケースがある、というのは分かる?
経験があれば、真っ先に>>270-271のようなことが浮かぶもんだよ。
275:デフォルトの名無しさん
12/02/19 06:39:48.49
Excel上での表示の話なんだから…
「Excel 1年 元年」でググってみ。いろいろやり方があって面白いよ。
第1位に出てる、セルの表示形式を
[<32516]ggge"年"m"月"d"日";[>32873]ggge"年"m"月"d"日";"平成元年"m"月"d"日"
にしろってヤツ、いかにもExcel臭いがCool…なのかなw
自分的には、文字列にしてから置換する方が好きだ。
276:デフォルトの名無しさん
12/02/19 07:14:45.79
元号使わなきゃ無問題
277:デフォルトの名無しさん
12/02/19 07:17:24.42
>>275
VBAスレでセルの表示形式の回答?
278:デフォルトの名無しさん
12/02/19 11:10:34.97
今特別養護老人ホームに勤めていて、頭を使って手書きで勤務表を作っています
ExcelのVBAで自動で勤務を割り振ってくれる勤務表は作れますか?
279:デフォルトの名無しさん
12/02/19 11:11:32.23
特定のファイルの追加、削除の監視をDO~LOOPで行おうと思うのですが、
監視を任意のタイミングで終了させるにはどうしたらいいでしょうか?
280:デフォルトの名無しさん
12/02/19 11:19:38.11
>>278
作れる。簡単ではないけど。
コツコツやって具体的にわかんない部分が出たらまた来ればいい。
>>279
終了フラグを用意して、DO~LOOP前でクリアDO~LOOP内でチェック。
終了ボタンなどで終了フラグを書き換える。
281:デフォルトの名無しさん
12/02/19 11:21:42.39
>>279
Exit Do
282:279
12/02/19 11:30:53.47
早速のレス、ありがとうございます。
ループ中に終了ボタンって押せるんでしょうか?
UserFormにスタートボタン、終了ボタンを置いてテストしてるんですが、
ループ中は終了ボタンが押せません。
フォーカスを終了ボタンに移すこととかってできるんでしょうか?
ループ中でもボタンを押すにはどうすればいいんでしょうか?
よろしくお願いします。
283:デフォルトの名無しさん
12/02/19 11:35:10.73
>>282
DO~LOOP内、各行前後にDoEvents入れて見。
足りなそうなら増やして見。
284:279
12/02/19 11:38:53.91
>>283
できました。
ありがとうございました。
285:デフォルトの名無しさん
12/02/19 16:29:31.34
Do~LOOP使うならWhile使えよ
286:デフォルトの名無しさん
12/02/19 18:01:02.40
そーいえばどっかで平成が何年までか求めるコードがあったな
287:デフォルトの名無しさん
12/02/19 18:45:33.02
>>286
> 平成が何年までか求める
宮内庁から怒られるんじゃないのか…
288:デフォルトの名無しさん
12/02/19 19:17:04.08
今年で,,,, ゲフンゲン
289:278
12/02/19 19:36:06.20
>>280
ありがとうございます、コツコツやってすぐ分からなくなってまた来ます
その時は教えて頂けたらありがたいです
290:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/19 20:16:12.70
堂々とマルチ宣言
時代変わった? w
292:デフォルトの名無しさん
12/02/19 22:47:40.35
こんにつわ、質問です。
With ActiveSheet.QueryTables.Add(Connection:=で、Web上のテーブルを取り込んだのですが、このテーブルの指定セルだけを取り込むにはどうすれば良いですか?
293:デフォルトの名無しさん
12/02/19 23:20:17.56
>>289
勤務表作成なら興味があるので手伝ってもいいですよ
ただプロバイダが2ちゃんで書き込み禁止になることがよくあるので
書けるときだけですが
とりあえずググって見ましたか?
自分の業務で自分だけが使うのなら作りやすいのですが
自分の異動など他の人に業務を任せることも考えると
画面デザインが重要になりますね
294:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/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
として見れば?
296:278
12/02/20 00:25:03.13
>>293
ホントですか!?
ありがとうございます
色々ググって見て、とりあえずデザインから作り始めてます
自分が使うだけなので特に問題ないです
複雑だから結構難しそうですね・・・
297:デフォルトの名無しさん
12/02/20 00:38:53.21
>>296
>自分が使うだけなので特に問題ないです
仕事に使うならこの考え方はないです
エンドユーザコンピューティングの典型的な悪いところ
業務にVBAを使う以上、他の人が使えることが最低条件です
298:278
12/02/20 00:42:20.32
>>297
そうですよね・・・
異動になったりしたとき他の人が使えないと困りますしね
気をつけて作っていきたいと思います
299:デフォルトの名無しさん
12/02/20 01:13:25.65
>>298
エンドユーザーコンピューティングでやりがちなミス
・ 変数等の名づけが行き当たりばったり
・ 変数等の用途が途中で変わっても名前を放置
→ 名づけのルールを決めて、それに従う。もしずれたら補正する。
変数やSub、Functionの名前がバラバラだとソースを見る時、一々定義を確認しなきゃならない。
自前のルールで決めて、それに従ってればわりと見やすくなる。
・ 設計の時に考慮した事・あえて無視した事を書き残さない
→ メモ書きの内容も含めてあとで読んでもわかるように資料化する
資料がないと、バグが発生した時に考え方のバグなのかプログラム化する段階でのバグなのか切り分けが大変。
・ 資料を作っても読み返さない
→ 資料化したものは月に1回ぐらいは読み返してみよう。
慣れていないと、必要な事が抜け落ちた資料になったりする。
・ 必須機能や各種条件などを決める前にプログラミングを始める
→ 少なくとも基本方針、前提条件、などはプログラミング前に資料にまとめよう。
固定で必須な条件と、人数の増減などで変更が発生する条件ぐらいは切り分けてからプログラミングした方が楽。
・ 同じことの繰り返しを何か所にもコピペ
→ 同じことはFunctionやSubにまとめてそれを呼び出す。
ミスがあった場合それもコピペで増えるので、ソース内でのコピペは可能な限り避ける。
方針メモ出来たらうpしてみ。
300:278
12/02/20 07:57:10.04
>>299
そんなに色々あるのですか・・・
これ教えてもらってないと大変なことになってました;
とりあえず基本方針?と前提条件をまとめてみます
301:294
12/02/20 08:01:46.57
>>295
ありがとうございます
やっぱり独学じゃダメなのかな・・・
もっと勉強します
302:278
12/02/20 09:49:16.54
とりあえず思いついたメモを羅列
・人によってできる勤務が異なる(夜勤1は出切るが夜勤2は出来ない等)
・夜勤はなるべく連続しないようにする(夜勤、明け、休み、夜勤・・・)
・早番がすぐに来ないようにする(早番、日勤、休み、早番)
・前月の夜勤の明け、明け休みも考慮する。早番も
・希望休、希望勤務を入力できるようにする
・同じ番号の勤務はなるべく続かないように
・休みも偏らないようにする
・勤務は各回数入力できるように(休みも9回の時などあるので入力)
もっとある気がしますが、この時点で凄く難しそう…
303:デフォルトの名無しさん
12/02/20 10:07:26.30
>>302
ナーススケジューリング問題(ググれ)に匹敵するような要件の場合、勤務表を作成するのはすごく困難。
304:デフォルトの名無しさん
12/02/20 10:36:51.36
>>302
最初から自動割振りするシステムは難しいから、
割振り入力してボタンを押すと問題がある割振りに色を付けるシステム
(夜勤連続だと赤、休み集中だと青など)
を作ってみたら?
305:デフォルトの名無しさん
12/02/20 13:05:17.31
>>303
あんまりおどすなよ。
306:デフォルトの名無しさん
12/02/20 13:41:17.42
>>302
落ち着け。
勤務表作成を新人に引き継ぐ感覚でまとめてみ。
それもおまいさんが急用でどうしても質問受けれない場合にどう引き継ぐか。
その感覚でまとめれば要件資料としてはそれなりになるはず。
「すごく困難」って言ってる人がいるけど、正攻法で1からやろうとすると困難かもね。
単純ロジックで乱数うまく使って種表作って、
補正が手詰まりになったら最初からやり直すプログラムにすれば、
表が完成するまでの時間はかかるけどなんとかなる。