5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

Excel VBA 質問スレ Part16

1 :デフォルトの名無しさん:2010/07/25(日) 17:18:32
過去スレ
01 http://pc11.2ch.net/test/read.cgi/tech/1054356121/
02 http://pc11.2ch.net/test/read.cgi/tech/1168308855/
03 http://pc11.2ch.net/test/read.cgi/tech/1180192018/
04 http://pc11.2ch.net/test/read.cgi/tech/1189814602/
05 http://pc11.2ch.net/test/read.cgi/tech/1197448064/
06 http://pc11.2ch.net/test/read.cgi/tech/1205231499/
07 http://pc11.2ch.net/test/read.cgi/tech/1212587819/
08 http://pc11.2ch.net/test/read.cgi/tech/1219673793/
09 http://pc11.2ch.net/test/read.cgi/tech/1228372971/
10 http://pc12.2ch.net/test/read.cgi/tech/1235332603/
11 http://pc12.2ch.net/test/read.cgi/tech/1241885130/
12 http://pc12.2ch.net/test/read.cgi/tech/1247566074/
13 http://pc12.2ch.net/test/read.cgi/tech/1254281104/
14 http://pc12.2ch.net/test/read.cgi/tech/1262748898/
15http://pc12.2ch.net/test/read.cgi/tech/1271261239/←New

関連スレ
Excel総合相談所 93
http://pc11.2ch.net/test/read.cgi/bsoft/1279119276/
Word総合相談所
http://pc11.2ch.net/test/read.cgi/bsoft/1263719084/
【質問不可】Excel総合相談所スレの雑談・議論スレ2
http://pc11.2ch.net/test/read.cgi/bsoft/1151651536/

2 :デフォルトの名無しさん:2010/07/25(日) 18:17:03
>>1乙です。

3 :デフォルトの名無しさん:2010/07/25(日) 21:14:12
いちおつ

4 :デフォルトの名無しさん:2010/07/25(日) 23:26:18
>>1乙です

前スレ>>996に誰か返答願います


5 :デフォルトの名無しさん:2010/07/25(日) 23:39:28
>>4
フォームの開くボタンでブック選ばせて開いて
ユーザーはその開いたブックのシート適当にアクティブして
先ほどのフォームの実行ボタンでアクティブなシートに処理
閉じるボタンで開いたブックを閉じる
という3つボタンのあるフォームの考えたんだけど

6 :デフォルトの名無しさん:2010/07/25(日) 23:40:30
なんかだめかな?

7 :デフォルトの名無しさん:2010/07/25(日) 23:50:25
該当ブックのシート名を全て取得し、選択ダイアログ等にするのは微妙です
ってなに?これが一番いい方法だと思うが・・

8 :デフォルトの名無しさん:2010/07/25(日) 23:50:45
>>4
前スレ
>>996 の意味が理解できないんでパスするけど
>>991,994 を読む限り
ExcelAにあるVBAで ExcelBのイベント(各シートに切替えた時とか)を処理するには
クラスモジュール使ってイベント処理すれぱできるんだけど
少々難易度が高いかも(ポイントを掴めばそう難しくはないんだけど)

9 :8:2010/07/26(月) 00:33:01
ちょっと訂正
ExcelA → BookA
ExcelB → BookB
に読み替えて

10 :デフォルトの名無しさん:2010/07/26(月) 07:50:26
>>5
ユーザ側で3度もボタン押下させるのは厳しいです
閉じるボタンを省いても2回ボタン押下…
>>8-9の方法で厳しいようであれば>>5さんの方法で行くと思います
有難うございました


>>7
シートの中身をユーザ側で見てから、実行するシートを選ぶようにするためです
選択ダイアログではシートの中身をユーザが確認出来ないので…


>>8-9
シート切替時をトリガにする事が出来るんですね?
ありがとうございます
調べてみます

11 :デフォルトの名無しさん:2010/07/26(月) 08:56:12
前スレ>>992 サンクス
結局Excelのバージョンだけが関係するのか、それとも昔のFormatみたいにOSが関係するのか分らなかったな。


12 :デフォルトの名無しさん:2010/07/26(月) 14:48:55
なんかよくわからんけど、コード断片貼っておく。
Thisworkbookのコード。

Private WithEvents MyBook As Workbook

Sub foo()
Set MyBook = Workbooks.Open("C:\Book1.xls")
End Sub

Private Sub MyBook_SheetActivate(ByVal Sh As Object)
MsgBox Sh.Name & "が選択されました"
End Sub

VBEのオブジェクトでMyBookを選択すれば、補足できるイベントがプロシージャに表示される。

13 :デフォルトの名無しさん:2010/07/26(月) 17:33:54
witheventsって知らない人は全く知らないからなぁ(あたりまえ)

14 :デフォルトの名無しさん:2010/07/26(月) 18:18:41
俺なんか知らないこと以外全部知ってるぜ

15 :デフォルトの名無しさん:2010/07/26(月) 18:41:05
知ってなくちゃいけないことを知らないけど何か問題ですかね!

16 :8:2010/07/26(月) 19:02:47
>>12
自分は全部クラスモジュール作ってたけど
こうゆうやり方もあるのね すごく勉強になった

さすがです

17 ::2010/07/27(火) 01:47:12
>選択ダイアログではシートの中身をユーザが確認出来ないので…
普通に内容を確認して現在のアクティブシートに対して処理をするなら
ツールボタンを用意しておいてマクロの入ったブックのその中のマクロを

'(ブックのフルパス).xls'!(その中のマクロ)

にしておけばそのボタン押すだけでアクティブシートに対して処理できます

マクロのブックが読み込まれていなければ当然マクロを有効にするか
聞いてくるけどこの方法が操作回数も少なくていいと思う
ツールボタン押さない限り普通の閲覧と一緒

18 :デフォルトの名無しさん:2010/07/27(火) 07:55:40
>>17
ツールボタンからのマクロ実行は盲点でした!
確かにUI的にスマートになるし全然ありですね

しかし、色々と手があるものですね
勉強になります
有難うございました

19 :デフォルトの名無しさん:2010/07/27(火) 21:12:20
質問です
シート内にあるオブジェクトとシェイプ内にある文字を取得する方法は分かったのですが、
グループ化されたシェイプでエラーになります
最初にシート内の全てのシェイプんグループ解除すれば上手く機能するんですが、
元々グループ化されていたシェイプに対して再グループ化する事は出来るのでしょうか?
また、グループシェイプか否かを判定する方法はあるのでしょうか?

20 :デフォルトの名無しさん:2010/07/27(火) 22:05:02
VBA初心者なんですが

Sub 検索()


Worksheets("Sheet2").Activate

For i = 1 To 1000

Worksheets("Sheet2").Range("B" & i).Select

If Selection = "1" Then

Worksheets("Sheet2").Range("B" & i).Copy
Worksheets("Sheet2").Range("H100").PasteSpecial
Worksheets("Sheet2").Range("D" & i).Copy
Worksheets("Sheet2").Range("H101").PasteSpecial
Worksheets("Sheet2").Range("C" & i).Copy
Worksheets("Sheet2").Range("H102").PasteSpecial
Worksheets("Sheet2").Range("E" & i).Copy
Worksheets("Sheet2").Range("H103").PasteSpecial

End If
Next

End Sub

これでB列の中から1という文字列を検索してその行のB,D,C,E列のをH100,101,102,103にコピー&ペーストしたいのですが
1を無視して1000までいってしまいます
どうすればいいですか?

21 :デフォルトの名無しさん:2010/07/27(火) 22:24:49
>>20
無視はしていないと思うけど
1 という文字列が見つかったらコピペしてそれ以上は検索しないなら
コピペ後に
Exit For
を入れる

22 :デフォルトの名無しさん:2010/07/28(水) 10:21:16
できました
ありがとうございました

23 :デフォルトの名無しさん:2010/07/28(水) 17:00:29
Excel 2003で
問題が発生したため、microsoft office excel を終了します。 ご不便をおかけして申し訳ありません。
というエラーが出て困っています。
原因は何なのでしょうか。

VBAのUserForm上のオブジェクトにアクセスしようとすると上記のエラーが発生するようです。

発生条件としては、Visual Basic Editorを開いているときはエラーは発生しません。
VBAソースを修正して保存して閉じ、その後開いた場合はエラーは発生しません。
Visual Basic Editorを開かずにExcel上で上書き保存した場合、
再度開いたときに、エラーが発生します。

気になるのは、UserFormに置いているオブジェクトの数が
相当数あるのですが、制限のようなものがあるのでしょうか。
テキストボックスを300個程度と、ラベルが600個程度、マルチページで10ページほどに
分けて配置しています。

原因と対策がわかれば教えてください。

24 : [―{}@{}@{}-] デフォルトの名無しさん:2010/07/28(水) 17:12:31
只今オープン価格中です
良かったら見てください。
http://ameblo.jp/kadenkadenkaden/

25 :デフォルトの名無しさん:2010/07/28(水) 20:54:36
今のファイル形式だと、マクロ対応ブックとそうじゃないのがあるのな
なんで書いたマクロが消えるんだよハゲ!って思ってたら、
マクロ対応した形式で保存しておかなければならなかったでござる

26 :デフォルトの名無しさん:2010/07/29(木) 01:42:55
>>25
保存する時に「このまま保存するとマクロが消えるよ」って警告メッセージ出るだろ
よく読まずにOK押すお前が悪い

27 :デフォルトの名無しさん:2010/07/29(木) 09:35:08
23です。

>>25
Excel2003では、どちらもxlsなので普通に保存できてしまいます。

結果ですが、
ファイルの保存形式を「Microsoft Excel 97-Excel 2003 および 5.0/95ブック(*.xls)」
としていたのがダメだったようです。
「Microsoft Excelブック(*.xls)」
にしたら大丈夫なようです。

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

28 :デフォルトの名無しさん:2010/07/30(金) 21:03:26
Excel2000で質問です。

対象セル(特定の1セル)がブランクかどうか判定したいと思い、
.SpecialCells(xlCellTypeBlanks)
を利用したのですが、結局うまく機能しませんでした。

SpecialCells(xlCellTypeBlanks)が一体どういう動きをしているのか教えていただけませんか?

29 :28:2010/07/30(金) 21:12:16
具体的に試した内容は以下の通りです。
   A   B
1 (Blank) hoge1
2 (Blank) hoge2
3 (Blank) hoge3
4 (Blank) hoge4
5 (Blank)(Blank)
※これ以外のセルも全てブランクです

Range("B5").SpecialCells(xlCellTypeBlanks).Select
とすると、A1:A4のエリアを1つ持つRangeオブジェクトが返ってきます。
期待していたのは「B5というエリア内の全てのBlankセルを持つRangeオブジェクト」なので、
「Countが1でB5だけを持つRangeオブジェクト」が返って来る予定だったのですが全然違いました。

Range("B5:B5").SpecialCells(xlCellTypeBlanks).Select
Range("B4").SpecialCells(xlCellTypeBlanks).Select
Range("B4:B4").SpecialCells(xlCellTypeBlanks).Select
もまったく同じ答えです。

Range("B4:B5").SpecialCells(xlCellTypeBlanks).Select
こうすると実行時エラー1004(該当セルが見つかりません)が返ります。

よく、わかりません。

30 :デフォルトの名無しさん:2010/07/30(金) 22:08:12
>>29
あまり詳しくないけどテストした限りでは
1)単一セルだと
 その指定を無視して.UsedRange内のブランクセルを返している
2)セル範囲だと
 指定したセル範囲内で かつ .UsedRange内のブランクセルを返している
ように見えるな(あくまで今回テストした状況では)

※ .UsedRange = ワークシートで使われたセル範囲


>Range("B5").SpecialCells(xlCellTypeBlanks).Select
>Range("B5:B5").SpecialCells(xlCellTypeBlanks).Select
>Range("B4").SpecialCells(xlCellTypeBlanks).Select
>Range("B4:B4").SpecialCells(xlCellTypeBlanks).Select
 これは全て単一セルで 1)に該当

>Range("B4:B5").SpecialCells(xlCellTypeBlanks).Select
 これは 2)に該当するけど
 .UsedRange が [A1:B4] なら
 [B4:B5]と[A1:B4]の両方に該当するセル範囲(つまり B4)に
 ブランクセルは無いのでエラー

31 :デフォルトの名無しさん:2010/07/30(金) 23:17:35
Excel2007なら指定したセル範囲内で かつ .A1〜最後のセル内の空白セルだな。
UsedRange内じゃないようだ。
2003でも同じじゃなかったか?


32 :デフォルトの名無しさん:2010/07/31(土) 12:22:38
>>28
判定したいだけなら、ワークシート関数のISBLANKで良い気がするけど・・・

33 :デフォルトの名無しさん:2010/07/31(土) 23:46:46
Excelのマクロでファイルをダウンロードし、DLが失敗した場合はポップアップを出力させ、
正常にDLした場合はなにもさせないという処理をさせてます。

そのマクロを、タスクに登録したvbsファイルで実行しているんですが、
処理終了時にエクセルを閉じさせることができません。

試しにマクロ側でif文を設け正常にDLできた際にapplication.quitを実行させましたがvbs側でエラーが出てしまいました。

正常終了時はエラーもなくエクセルを終了させ、異常時はそのままポップアップを出力させるにはどうしたらいいでしょうか?

34 :デフォルトの名無しさん:2010/08/01(日) 20:57:15
excel2003で、マクロを使って新しいシートを作りたいのですが、
その新しく作ったシートにマクロを入れたいのです。
マクロのコードを他のシートにコピーする又は最初からマクロを持ったシートを作ることは出来ますか?

35 :デフォルトの名無しさん:2010/08/01(日) 22:19:30
>>34
テンプレートを使用するってのはどうでしょうか

1)シートを 1 つだけ含むブックを作成しそのシートにマクロを記述しテンプレートとして保存

2)新規作成時にそのブックを使用する
 Sheets.Add Type:="c:\temp\Book1.xlt", after:=Sheets(1)

※テンプレートとして保存しなくても xlsでも問題ないと思う

36 :デフォルトの名無しさん:2010/08/01(日) 23:22:02
>>33
なんか色々とおかしい気がするんだが・・。

37 :デフォルトの名無しさん:2010/08/01(日) 23:35:13
>>33
実際のコードを書き込んでくれ

38 :デフォルトの名無しさん:2010/08/02(月) 07:35:25
モジュールに書き込むコードがあったはず

39 :デフォルトの名無しさん:2010/08/02(月) 09:26:20
vlookupって各キーにアイテムって一つしか登録できないですよね
引っ張ってきたいアイテム(列)が複数ある場合は毎回「キー登録、列変えてアイテム登録、検索」を
繰り返すしかないのでしょうか?

40 :デフォルトの名無しさん:2010/08/02(月) 10:32:08
知人が仕事でVBAを使うらしく尋ねられたのですが、
自分はVB系はサッパリダメでアドバイスのしようが有りませんでした。
そのまま放り出すのもアレなのでせめて適当な書籍を紹介してあげたいのですが
何かありませんでしょうか

プログラム未経験者がとっかかりになるようなレベルでお願いします

41 :33:2010/08/02(月) 10:35:08
ファイルのDL自体はFTPで取得し、その後ローカルにファイルが存在するかをif文で判定させて
判定結果によってポップアップorエクセルを閉じるという処理をしたいと考えてます。

その処理をタスクで実行させるために、マクロを実行させるvbsファイルを作成し、タスク登録してます。
コードは今手元にないので一部しか覚えてないです。。

■■EXCELのマクロ■■
sub ○○
 <ファイル取得処理>
if ファイルが存在しない then
 ポップアップ出力
else
Application.Quit
Windows("Book1.xls").Close True
end if
end sub

■■VBS■■
すみません。全く覚えてないです。
しかし、マクロを実行させるコードしか書いておらず、
終わった後にエクセルを閉じる処理は記載してません。

42 :デフォルトの名無しさん:2010/08/02(月) 17:04:39
>>40


本屋に行けばそれこそ入門書が山のようにある
10日でできるシリーズとか。

本人に大きい本屋に行かせて自分で選ばせなはれ


43 :デフォルトの名無しさん:2010/08/03(火) 09:23:20
ループの回し方の質問です。
1行目がタイトルで2行目以降のデータ処理がしたくて
Dim MyRng As Range
Dim MyCell As Range
Set MyRng = Range("A2", Range("A65536").End(xlUp))
For Each MyCell In MyRng
 '処理
Next
としたときA2以下にデータがないときA1も対象になってしまいます。
For i = 2 To Range("A65536").End(xlUp).Row
 '処理 
Next
とすればデータがないときは何もしないで抜けますが、For Eachでも
何もしないで抜けるにはどうすればいいですか?

44 :デフォルトの名無しさん:2010/08/03(火) 09:31:53
Set MyRng = Range("A2:A65536")

45 :デフォルトの名無しさん:2010/08/03(火) 09:47:03
>>43
MyRng.Rowが2より小さかったら抜ければいいんだよ。
Sub foo()
Dim MyRng As Range
Dim rngTop As Range
Dim MyCell As Range
Set rngTop = Range("A2")
Set MyRng = Excel.Range(rngTop, Range("A" & Row.Count).End(xlUp))
If MyRng.Row < rngTop.Row Then Exit Sub
For Each MyCell In MyRng
Next
End Sub
そういえばどこぞのコメントの王様は行番号をこねくりまわしてたな。

>>44
おいおい、データのないセルまで処理するのかよ

46 :デフォルトの名無しさん:2010/08/03(火) 10:19:12
>>45のSet MyRngのとこは
Set MyRng = Excel.Range(rngTop, rngTop.EntireColumn.Cells(Rows.Count).End(xlUp))
としてもいいね。

47 :43:2010/08/03(火) 10:43:16
>>45-46
なるほど、行番号で比較とは思いもよりませんでした。
仕方ないのでA2:A65536をCountAで先に数えるのかなぁ思ってました。
>>44はそのヒントですか?

48 :デフォルトの名無しさん:2010/08/03(火) 12:05:41
お前らいつまで65536行しか使えないエクセル使ってるんだと

49 :デフォルトの名無しさん:2010/08/03(火) 13:31:52
VBAのオブジェク名の変更をC#のようなデザインコードから
エディットしたいのですが どこかにありませんか?
プロパティ値から一個一個変更するのは手間がかかりますので

50 :49:2010/08/04(水) 02:15:35
追記としてバージョンは2003です

19 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)