[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/30 05:22 / Filesize : 296 KB / Number-of Response : 978
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Excel VBA 質問スレ Part23



1 名前:既定のプロパティさん mailto:sage [2012/01/29(日) 00:05:13.16 ]
01 pc11.2ch.net/test/read.cgi/tech/1054356121/
02 pc11.2ch.net/test/read.cgi/tech/1168308855/
03 pc11.2ch.net/test/read.cgi/tech/1180192018/
04 pc11.2ch.net/test/read.cgi/tech/1189814602/
05 pc11.2ch.net/test/read.cgi/tech/1197448064/
06 pc11.2ch.net/test/read.cgi/tech/1205231499/
07 pc11.2ch.net/test/read.cgi/tech/1212587819/
08 pc11.2ch.net/test/read.cgi/tech/1219673793/
09 pc11.2ch.net/test/read.cgi/tech/1228372971/
10 pc12.2ch.net/test/read.cgi/tech/1235332603/
11 pc12.2ch.net/test/read.cgi/tech/1241885130/
12 pc12.2ch.net/test/read.cgi/tech/1247566074/
13 pc12.2ch.net/test/read.cgi/tech/1254281104/
14 pc12.2ch.net/test/read.cgi/tech/1262748898/
15 pc12.2ch.net/test/read.cgi/tech/1271261239/
16 hibari.2ch.net/test/read.cgi/tech/1280045912/
17 hibari.2ch.net/test/read.cgi/tech/1289182437/
18 hibari.2ch.net/test/read.cgi/tech/1298240666/
19 hibari.2ch.net/test/read.cgi/tech/1305754555/
20 hibari.2ch.net/test/read.cgi/tech/1312435844/
21 hibari.2ch.net/test/read.cgi/tech/1316931607/

前スレ:
Excel VBA 質問スレ Part22
toro.2ch.net/test/read.cgi/tech/1322400978/


189 名前:デフォルトの名無しさん [2012/02/12(日) 23:52:57.06 ]
他Bookに記述してるマクロを実行(あるいはSubやFunctionを呼び出し)することって
できる?
頻繁にやるのは望ましくない?

190 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2012/02/13(月) 00:26:32.22 ]
なんでマルチポストすんの?

193 名前:デフォルトの名無しさん mailto:sage [2012/02/13(月) 00:57:04.90 ]
>>189
もちろんできる
複数のブックから使用するマクロを別ブックにしたり、
複数のブックのマクロを呼び出すメニュー用のブックを作ったり、
xlsxのファイルで使用するためのマクロを別ブックにしたり、
いろいろ

ExcelVBAの考え方としては、データを置くワークシートと、
プログラムを置く標準モジュールをどう配置するか


194 名前:187 [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 名前:デフォルトの名無しさん mailto:sage [2012/02/13(月) 02:04:05.27 ]
「あいうえお」と書かれたテキストファイルを
>>130のコードに突っ込めば直ぐ解る。

196 名前:187 mailto:sage [2012/02/13(月) 02:53:20.17 ]
>>195
きさま、舐めとんかゴルァ

197 名前:デフォルトの名無しさん mailto:sage [2012/02/13(月) 19:33:16.74 ]
保存ダイアログが出たときに、特定のフォルダーが出るように下記の様に
書いたのですが、Win7 32bitでは希望通りの動きなのですが、64bitだと
マイドキュメントが選択された状態で表示されてしまいます。

xlAPP.GetSaveAsFilename(InitialFileName:=SaveDir & FileName)

64bit版でも指定したフォルダーを選択状態にさせるにはどうすればいいですか?
よろしくお願いします。



198 名前:デフォルトの名無しさん mailto:sage [2012/02/13(月) 19:57:03.92 ]
すみません。
コピーし忘れがありました。
一度保存すると、その時のフォルダーを保存しておいて、2回目からは
SaveDirに記憶したフォルダーを選択するようにしています。

SaveaDir = CurDir

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

32bit版は変数の中身が変わるのですが、64bit版ではブックを読みだしたフォルダーから
変更されない感じです。
よろしくお願いします。

199 名前:デフォルトの名無しさん mailto:sage [2012/02/13(月) 20:18:43.27 ]
>>198
省略しすぎ。もう少しコードを見せられないの?

200 名前:デフォルトの名無しさん mailto:sage [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 "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 名前:デフォルトの名無しさん mailto:sage [2012/02/14(火) 17:43:32.49 ]
>>197
& "\" &

203 名前:デフォルトの名無しさん mailto:sage [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

204 名前:197 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2012/02/14(火) 22:07:08.20 ]
× Save_NAME = xlAPP.GetSaveAsFilename(InitialFileName:=Save_Name)
○ Save_NAME = xlAPP.GetSaveAsFilename(InitialFileName:=Save_dir)
です


206 名前:デフォルトの名無しさん mailto:sage [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 = "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


207 名前:206の続き mailto:sage [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




208 名前:206 mailto:sage [2012/02/15(水) 00:15:06.33 ]
個人的には
ie.visible=true
はFalseのほうが画面の切り替えがなくて好きだけど、
非表示にしとくとIEのアクセスでエラーが出てるときの
エラーメッセージも表示されなくなるんだっけ?

209 名前:206 mailto:sage [2012/02/15(水) 00:19:14.69 ]
連投スマソ
入力する年月日のうち、日は日付じゃなくて開催何日目かなので
そこんとこよろしく
(たとえば、06120105は中山競馬場、2012年1月の開催5日目の意味)

210 名前:デフォルトの名無しさん mailto:sage [2012/02/15(水) 00:31:34.64 ]
それだと一つの競馬場で36レースやらないと全レースのデータは拾えないんじゃね?
多分、一つの競馬場では1日に12レースしかやらないと思うよ。
同じ日に最大で3カ所開催するから3*12で36レースってことじゃないかな?

211 名前:206 mailto:sage [2012/02/15(水) 00:54:42.24 ]
>>210さん
えーと、
ご指摘ありがとうございます・・・orz
私は競馬やったことないんで知りませんでした。

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

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


212 名前:デフォルトの名無しさん [2012/02/15(水) 02:52:59.70 ]
皆さんホントこんな初心者の為に考えてくださってありがとうございます!

何か別な方法考えてみます!

213 名前:デフォルトの名無しさん mailto:sage [2012/02/15(水) 03:05:01.57 ]
>>212
丸投げじゃなく自力でがんばってみる気があるなら

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 名前:デフォルトの名無しさん mailto:sage [2012/02/15(水) 14:20:34.57 ]
>>217
なりました!
ありがとうございますm(_ _)m

219 名前:デフォルトの名無しさん mailto:sage [2012/02/15(水) 17:36:33.04 ]
>>216
そのボタンを押した時に実行するプロシジャを実行すれば良いだけなのでは?


220 名前:デフォルトの名無しさん [2012/02/16(木) 01:25:02.28 ]
横から失礼。
> そのボタンを押した時に実行するプロシジャを実行
でなく、そのボタンを押す事は出来ないの?

221 名前:デフォルトの名無しさん mailto:sage [2012/02/16(木) 01:40:57.51 ]
命令文うんたらかんたら

CommandButton1_Click

命令文うんたらかんたら

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

他の常駐アプリでボタンクリックのメッセージ監視目的とかだとスレ違い気味だし
そんだけ知識ある人がこんな質問するとは思えない

223 名前:デフォルトの名無しさん mailto:sage [2012/02/16(木) 09:20:50.66 ]
>>220
UWSC使え w

224 名前:216 [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 名前:デフォルトの名無しさん mailto:sage [2012/02/16(木) 19:00:52.59 ]
>>226
印刷した時にどこで切れるかはHPageBreaks(n).Location
またはVPageBreaks(n).Locationで調べることができる

あとは、ページごとにセルの色が全部標準か白なら印刷しないっていう
ちょっと面倒なプログラムを書くしかない



228 名前:デフォルトの名無しさん mailto:sage [2012/02/16(木) 20:50:50.26 ]
>>225
それってフォームのボタンでないんじゃない

229 名前:デフォルトの名無しさん mailto:sage [2012/02/16(木) 22:53:25.40 ]
教えてください
VBAにアドインってのが有るそうなんですが、マクロをアドインとかいうものにするのはどういうメリットがあるんですか?
皆さん、どういう風につかっておられます?

230 名前:216 [2012/02/16(木) 23:29:29.26 ]
>>225
ありがとうございます!
コントロールツールボックスのボタンの場合は、どのようにしたらよいでしょうか。

231 名前:デフォルトの名無しさん mailto:sage [2012/02/16(木) 23:37:49.90 ]
>>230
>>225がコントロールツールボックスのボタンの場合じゃないのか

232 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 08:00:18.97 ]
>>229
アドインって .xla のこと?
.dll のように、色んなワークブックからCallされる自分用関数をまとめておくとか。
でも、キャッシュみたいのがかかっていて結果不定になるので、デバッグ面倒だよ。

233 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 17:43:41.83 ]
>>232
229です。

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

なんか扱いが大変そうだな・・・
教えていただきありがとうです

234 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 17:52:06.19 ]
>>232
> でも、キャッシュみたいのがかかっていて結果不定になるので、デバッグ面倒だよ。
んなこと全然無い。

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

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

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

もちろん、他言語のライブラリ同様、ライブラリとしてのメリットは全て持ってる。

235 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 19:53:43.47 ]
>>235
VBAでではなく、ワークシート関数でってなら

Excel総合相談所 100
toro.2ch.net/test/read.cgi/bsoft/1325935411/l50


237 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 01:34:56.42 ]
>>239-240
スレ違いな答えになるけど、条件付き書式を使ったほうがいいかと。
書式を「"○"」、条件付き書式として0より大きいなら背景色を設定とかやれば、
1を入力してやればチェックって感じに出来ると思う。

243 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 01:42:17.46 ]
>>239
コマンドボタンはどのセルに配置してあるの?
D列のセル?

244 名前:239 mailto:sage [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行以上になります。

以上になります。よろしくお願いいたします。


245 名前:239 mailto:sage [2012/02/18(土) 02:11:02.38 ]
>>243
画像では見やすくするために中央のほうへ寄せましたが、
いわゆるD列にボタンが配置されているものと思われて結構です。

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

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

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

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

度々すみません。よろしくお願いいたします。


246 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 02:15:02.93 ]
>>244
答えてあげたいが、時間がない

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

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

クラスモジュールを使うか

247 名前:デフォルトの名無しさん mailto:sage [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




248 名前:247 mailto:sage [2012/02/18(土) 03:13:52.81 ]
一応簡単に説明しておくと
ボタンクリックのイベント内からは Application.Caller でクリックしたボタン名が取得できる
ボタン名をあらかじめ chkbtn_<行番号> として作成しておき、イベント内で行番号をボタン名から切り出して現在の自分の行番号を取得している
イベント内でボタン名が取得できるので、クリックのイベントプロシジャを個別に作成する必要はなく、すべて共通でよい

この例はチェックボタンだけだけど、当然同じやり方でクリアボタンも作成できる

249 名前:239 mailto:sage [2012/02/18(土) 03:25:21.74 ]
>>247
試してみましたがうまく動作しませんでした。
多分こちらのボタンの置き方が悪いのかもしれません。
(前述の通りExcelVBA及びコンソールの配置等は初心者です。すみません。)
また関数の大まかな意味も知っておきたいのですが、
もしお時間が許すのであればご教示のほどをお願いします。

250 名前:239 mailto:sage [2012/02/18(土) 03:26:41.00 ]
>>247
書き込み中のすれ違いになってしまいました。
ありがとうございます!!
もう一度試してみます。 

251 名前:239 mailto:sage [2012/02/18(土) 03:45:13.45 ]
>>247
すみません何度か試行錯誤を繰り返してみましたがどうにもうまく動作しません。
お手数ではありますが扱い方のご教示、
もしくはソースファイルのアップロードをお願いいたしたいのですが。

252 名前:54 mailto:sage [2012/02/18(土) 03:52:25.06 ]
>>241
別に間違ってないよ。

253 名前:デフォルトの名無しさん [2012/02/18(土) 04:37:15.26 ]
>>251
俺は247さんじゃないけど、
247さんのコードを標準モジュールにコピペするだけで動いたよ
(全部コピペして、Sub CreateButtons() を実行)
ちなみに環境はWin7 64bit、Excel2000、です

むしろ貴方がどのようにやったのかを具体的に提示したほうが早いと思う。
たとえば上記コードを標準モジュールじゃなくボタンに貼り付けたりしてないよね?


254 名前:239 mailto:sage [2012/02/18(土) 05:25:47.81 ]
>>253
今までシート自体にコードを貼り付けていました。
標準モジュールを新たに挿入して貼り付けたら無事動作いたしました!
大変勉強にもなりました。

ご回答していただいた皆様本当にありがとうございました。
ソースコードを記述いただいた>>247さんには感謝の限りです!
本日は朝も近いのでお休みいたします。
最後に改めてありがとうございました。

255 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 06:44:14.37 ]
俺もこれ利用したいけど 単一のセルしか塗りつぶしできない
どうすれば行を(この場合だとA2からC2までの)指定出来ますかね

256 名前:253 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 13:19:54.76 ]
すみません>>247のコードでボタンを二つ作りたいのですが、
標準モジュールを新たに挿入すると内容が二つとも同じになってしまいます。
対処法を調べても理解できないのでどなたか教えてください。



258 名前:デフォルトの名無しさん mailto:sage [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


259 名前:258 mailto:sage [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


260 名前:253 mailto:sage [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番目のプロシージャを書き足す作業をすれば良いんだよ。

これだけ説明されて分からないなら、多分今の貴方には作れないと思うよ


261 名前:253 mailto:sage [2012/02/18(土) 13:51:56.14 ]
って俺が長々説教かいてる間に
>>258さんがコード作ってくれちゃったね。
>>257良かったな。

でもこういうのただ丸投げするより
動作原理を理解して自分でいじれるようになった方が良いから
自分でもがんばってね

262 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 14:07:08.52 ]
>>258
一部修正必要だけど、257には無理かもね

263 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 14:24:35.19 ]
Application.Caller ってボタン名というかオブジェクト名しか取れないのが使いにくいけど、
あらかじめ Dictionary 使ってオブジェクト名をキーにして情報格納しておけば、
ボタンクリックでオブジェクト名から数字だけを切り出すまでもなく、
座標やチェック/クリアの属性なんかも関連付けできるようになるのでいろいろ応用は効く


264 名前:253 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 14:47:53.44 ]
>>264
いやオブジェクト名は、どのみち影響しないけど
修正したいと言うと予想されるのはキャプションのほうね

266 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 17:18:24.54 ]
こんにつわ
alt+F11押したらVBAProjectパスワード、要求されたんだけど、へるぷみー

267 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 17:29:55.96 ]
事故解決下



268 名前:デフォルトの名無しさん [2012/02/18(土) 23:05:13.47 ]
Excelで「平成1年」を「平成元年」と表示させるための一番簡単な方法はなんですか?
ちなみに昭和や平成の他の年もいっぱいまざっています。


269 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 23:20:54.49 ]
Replace(s, "平成1年", "平成元年")


270 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 00:13:58.80 ]
> 昭和や平成の他の年
の考慮が漏れてるではないか。

271 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 00:20:14.51 ]
[^0-9]1年

272 名前:268 [2012/02/19(日) 00:58:11.82 ]
>>269
でかした!

>>270-271
どういうこと?

273 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 06:24:27.04 ]
>>272
>>269では誤動作するケースがある、というのは分かる?
経験があれば、真っ先に>>270-271のようなことが浮かぶもんだよ。

275 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 07:14:45.79 ]
元号使わなきゃ無問題

277 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 07:17:24.42 ]
>>275
VBAスレでセルの表示形式の回答?



278 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 11:10:34.97 ]
今特別養護老人ホームに勤めていて、頭を使って手書きで勤務表を作っています
ExcelのVBAで自動で勤務を割り振ってくれる勤務表は作れますか?

279 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 11:11:32.23 ]
特定のファイルの追加、削除の監視をDO〜LOOPで行おうと思うのですが、
監視を任意のタイミングで終了させるにはどうしたらいいでしょうか?

280 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 11:19:38.11 ]
>>278
作れる。簡単ではないけど。
コツコツやって具体的にわかんない部分が出たらまた来ればいい。

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



281 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 11:21:42.39 ]
>>279
Exit Do

282 名前:279 mailto:sage [2012/02/19(日) 11:30:53.47 ]
早速のレス、ありがとうございます。
ループ中に終了ボタンって押せるんでしょうか?
UserFormにスタートボタン、終了ボタンを置いてテストしてるんですが、
ループ中は終了ボタンが押せません。
フォーカスを終了ボタンに移すこととかってできるんでしょうか?
ループ中でもボタンを押すにはどうすればいいんでしょうか?
よろしくお願いします。

283 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 11:35:10.73 ]
>>282
DO〜LOOP内、各行前後にDoEvents入れて見。
足りなそうなら増やして見。


284 名前:279 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 18:45:33.02 ]
>>286
> 平成が何年までか求める

宮内庁から怒られるんじゃないのか…



288 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 19:17:04.08 ]
今年で,,,, ゲフンゲン

289 名前:278 mailto:sage [2012/02/19(日) 19:36:06.20 ]
>>280
ありがとうございます、コツコツやってすぐ分からなくなってまた来ます
その時は教えて頂けたらありがたいです






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<296KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef