Excel VBA 質問スレ P ..
[2ch|▼Menu]
2:デフォルトの名無しさん
10/07/25 18:17:03
>>1乙です。

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

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

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


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

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

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

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

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

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


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


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

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


12:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/07/26 17:33:54
witheventsって知らない人は全く知らないからなぁ(あたりまえ)

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

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

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

さすがです

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

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

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

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

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

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

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

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

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

23:デフォルトの名無しさん
10/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: [―{}@{}@{}-] デフォルトの名無しさん
10/07/28 17:12:31
只今オープン価格中です
良かったら見てください。
URLリンク(ameblo.jp)

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

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

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

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

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

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

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

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

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

29:28
10/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:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/07/30 23:17:35
Excel2007なら指定したセル範囲内で かつ .A1〜最後のセル内の空白セルだな。
UsedRange内じゃないようだ。
2003でも同じじゃなかったか?


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

41:33
10/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:デフォルトの名無しさん
10/08/02 17:04:39
>>40


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

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


43:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/08/03 09:31:53
Set MyRng = Range("A2:A65536")

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

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

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

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

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

51:デフォルトの名無しさん
10/08/05 15:41:49
Outlook VBAの情報が少なくてよくつまずくんだが、Outlookもここでしつもんしてもいいの?

52:デフォルトの名無しさん
10/08/05 19:27:00
専用スレないし、スルーされても泣かないなら良いんじゃね?
分かる事なら答えるよ。

53:デフォルトの名無しさん
10/08/05 20:57:56
ならばWordVBAも話題もここで良いですか?

54:デフォルトの名無しさん
10/08/05 22:16:56
むしろ俺が聞きたいくらい

55:デフォルトの名無しさん
10/08/06 03:56:55
ほかに適切なスレが見当たらないからここで聞いてもいいと思うけど
スレタイがExcelだから、答えられる人がここを見てるとは限らないよ

56:デフォルトの名無しさん
10/08/06 10:02:39
レファレンス調べるくらいなら出来るから聞くだけなら
もし解答してくれる人が不在でスレ違いとか言われたら諦め

57:デフォルトの名無しさん
10/08/08 23:57:59
>レファレンス

www

58:デフォルトの名無しさん
10/08/09 00:05:38
>>57
英語の発音を日本語で正確に書き込むことはできない。
日本語で書くと「モンキー」だが、英語の発音に近づけるならば「マンキー」だ。
リファレンスと書こうがレファレンスと書こうが、問題はない。
Wikipedia項目リンク

59:デフォルトの名無しさん
10/08/09 13:45:52
それを言うなら「マンキ」の方がさらに近い
日本語だと長音に一音節分の時間を当てるけど英語の発音ではあんまり語尾を長く伸ばさない

60:デフォルトの名無しさん
10/08/11 21:25:03
必死だなwww

61:デフォルトの名無しさん
10/08/11 22:48:51
で、ワードはいいのか?

62:デフォルトの名無しさん
10/08/11 23:10:25
VBAなら何でも良いんじゃね?VBSでも何でも良いと思うわ。
分かる事なら答えるし、分からない事なら無視するけど。
それで泣かないならじゃんじゃか質問しちゃいなよ。

63:デフォルトの名無しさん
10/08/12 18:49:21
HOGE = Range("A10:M129").Value
とやってセルの一定の範囲を配列に突っ込んで、
配列上で後から空白行を削除しようとしてるんですが、
やりかたがわからないです・・・。

EntireRow.Deleteってのはセルでしか使えないんですかね?

64:デフォルトの名無しさん
10/08/12 19:15:19
なんか途中の要素を削除するってのはめんどくさそうですね・・・。

65:デフォルトの名無しさん
10/08/12 23:22:48
>>63
2次元配列に格納して、削除するのは1次元か?
そりゃ訳分からなくなるぞ。
どうやってループすればいいのかも分からん。

66:デフォルトの名無しさん
10/08/13 07:34:08
>>65
まさにそうなんです。
二次元配列として折角行列毎取り込んでメモリ上で扱えるんだから、
EXCELの行列みたいに扱えたらいいのになあ、と思ったんですが、そうもいかないようです。
最初からワークシート上で一行づつ逐次評価して行く方がレベルに合ってるかもですね。
また暇な時にでも調べてみます。

67:デフォルトの名無しさん
10/08/13 14:17:01
セル範囲の内容を保持しつつ、一部を書き換えるようなことはできますか?

具体的には、
A1〜B2の2*2のセルに値「1」が入っているとします。
その中のB1の値を2に書き換え、C1〜D2に転記するような感じです。

Sub 書き換え()
Dim a
Set a = Range("A1:B2")
a(0, 1) = 2 'B1の値を2に置き換え
Range("C1:D2") = a
End Sub
(注)もちろん、動きません。

68:デフォルトの名無しさん
10/08/13 14:49:12
>>67
こんなかんじかな?

a.Cells(1, 2).Value = 2
Range("C1:D2").Value = a.Value

又は

a(1, 2).Value = 2
Range("C1:D2").Value = a.Value

69:デフォルトの名無しさん
10/08/13 16:01:52
>>68
レスありです。
前スレだったかな?「Valueは規定値なので省略可」というのを見たため、
基本的にはずしてました。

ただ、元の「A1:B2」の値が変わってしまうのが問題です。
書き方が悪かったようです。
「A1:B2」の一部の値を書き換えたものを「C1:D2」へ転記です。

最初に「A1:B2」の値を「C1:D2」へ移して、「D1」の値を書き換えるという方法もあるのですが、
データが大量にあるため、配列に格納してメモリ内で処理し、最後に貼り付けようと思っています。

今現在は、
For i = 0 to 1
 For j = 0 to 1
  a(i, j) = Cells(i + 1, j + 1)
 Next
Next
a(0, 1) = 2
と、全てループし、配列に格納しています。

70:68
10/08/13 16:15:54
>>69
Sub 書き換え()
Dim a As Variant
a = Range("A1:B2").Value
a(1, 2) = 2
Range("C1:D2").Value = a
End Sub

ちなみに配列a のインデックスの最小値は 1

71:デフォルトの名無しさん
10/08/13 17:34:02
>>70
ありがとうございます。
思った通りの動作になりました。

72:デフォルトの名無しさん
10/08/15 15:15:57
If IsArray(OpenFileName) Then
For i = 1 To UBound(OpenFileName)
Workbooks.Open OpenFileName(i)
OpneFile = ActiveWorkbook.Name
SheetsCount = Workbooks(OpneFile).Worksheets.Count
Next i
Else

このコードで

OpneFile = ActiveWorkbook.Name
SheetsCount = Workbooks(OpneFile).Worksheets.Count

の部分を

SheetsCount = Workbooks(OpenFileName(i)).Worksheets.Count

にできませんかね?

OpneFile = ActiveWorkbook.Name

がとってもいやんなのです

よろしくお願いします

73:デフォルトの名無しさん
10/08/15 15:46:15
>>72
"できませんかね?"じゃなくて実際にやってみたらどうなのよ
なにが"とってもいやんなのです"も分からんし
実際にやってみて希望通り動作しないなら
どうダメなのかも含めて質問しる

74:デフォルトの名無しさん
10/08/15 16:17:56
俺ならActiveWorkbookの部分を固定できるようにするな
ActiveWorkbook、sheetは誤作動がこわい

75:デフォルトの名無しさん
10/08/15 21:14:24
>>72
ブックをopenする時にオブジェクト型変数にsetすれば良くなるんじゃない?
そうすりゃブック型変数をかっちりと指定出来るから誤作動も減るだろうし可読性も上がると思うよ。

76:デフォルトの名無しさん
10/08/16 14:29:09
各セルに
新,復,復w,復,新,復,新
のように並んでいる行の中から、復wを含むセルが左から何番目にあるのか
(上記例なら3番目)を得ようとしています。
Sub match()
Dim myRange As Range
Set myRange = Worksheets("sheet1").Range(Cells(1, 1), Cells(1, 350)) 'Range("A1:IV1")
Dim i As Long

i = Application.WorksheetFunction.match("復w", myRange, 0)
MsgBox (i)
End Sub
このとき、3行目で、コメントアウトしているA1形式だとうまくいくのですが、
R1C1形式にすると、実行時エラー'1004'が出てとまってしまいます。
R1C1形式でうまくいってほしいのですが、なにがまずのでしょうか。
よろしくお願いします。

77:デフォルトの名無しさん
10/08/16 18:23:40
Range("A10:X40").Value = ""

このマクロを流すとNull文字が入ってしまいます
実際、マクロ流した後シートを開くとセルの中は空なんですがNull文字があると認識されます
(該当セルに関係してる他のセル式の挙動が半角ブランクを入力した時と同じになる)

これをクリア(無)するにはどうマクロを書いたら良いでしょうか?


78:デフォルトの名無しさん
10/08/16 18:39:49
empty

79:デフォルトの名無しさん
10/08/16 19:40:45
>>77
Range("A10:X40").ClearContents

>>76
原因は2つ考えられる

1)sheet1がアクティブになっていない
 Worksheets("sheet1").Range(Cells(1, 1), Cells(1, 350))
 これは
 Worksheets("sheet1").Range(ActiveSheet.Cells(1, 1), ActiveSheet.Cells(1, 350))
と同じ意味である

 Worksheets("sheet1").Range(Worksheets("sheet1").Cells(1, 1), Worksheets("sheet1").Cells(1, 350))
 とすべきである(Withとか オブジェクト変数とかで 短く出来るけど)

2)実在するセル範囲ではない
 IV1 なら Cells(1, 256) じゃない?
 Cells(1, 350) だと 多分"ML1"(ちょっと自信ない)
 になると思うけど >>76 の環境では実在するセルなの?

80:76
10/08/16 20:04:08
>>79さん
ありがとうございました。原因2)のほうでした。
テキトーなことするとやはり失敗するものですね。
おっしゃるとおり、Cells(1, 256)なら成功し、
Cells(1, 257)にすると>>76の失敗症状になりました。
助かりました。

81:デフォルトの名無しさん
10/08/16 22:15:47
>>75
ですな
どうもですた

82:77
10/08/17 08:51:01
>>79
ありがとうございました!
無事に解決できました
クリアする時はNull文字を考慮してクリアするように気をつけます

83:デフォルトの名無しさん
10/08/18 10:42:25
OLEObject使用時の種別判定についてお聞きしたいのですが
例えばシート内に
ToggleButton
CommandButton
を配置した際にOLEObject(i)がどちらの種類のボタンか判定したいのですが
どのような方法があるのでしょうか?
現在のところ
If OLEObjects(i).name Like "ToggleButton*" Then
で判定しているのですが他にもっといい方法があれば教えてください。

84:デフォルトの名無しさん
10/08/18 14:39:05
複数行選択したセルの値を一定間隔ごとに詰める処理をしています。
(n個残してm個削除の繰り返し)

例(注:実際は行方向ですがレスが長くなるので列方向で記載します)
1 2 3 4 5 6 7 8 9 10

n=1,m=1であれば
1 3 5 7 9

n=2,m=2であれば
1 2 5 6 9 10

です。
拙い知識で.Delete Shift:=xlUpを使って目的は達成しましたが
非常に遅くなっています。

もっと高速にしたいのですが、多分.Delete Shift:=xlUpではこれ以上
早く出来そうにありません。
他の方法があればヒントなり教えてください。

条件として選択範囲以降の行は上に詰めることでお願いします。

環境:WindowsXP Excel2003

宜しくお願いします。


85:デフォルトの名無しさん
10/08/18 20:15:54
>>84
適当だけど、
最初に削除対象の複数の行をすべて選択してから削除するとか
処理のあいだ、画面更新を抑止するとか
そういうのはやってる?

86:840
10/08/19 09:47:17
>85
>最初に削除対象の複数の行をすべて選択してから削除するとか

対象個数が不定なんですがVBAで処理できるんでしょうか?

87:デフォルトの名無しさん
10/08/19 11:39:26
>>86
selection.delete

88:デフォルトの名無しさん
10/08/19 11:58:37
エクセルからのOLEObj制御は充実してないようだ
VS入れて使うとかしかないんじゃないかしら
詳しい話はMSDNでググーれ

89:デフォルトの名無しさん
10/08/19 12:40:04
>>84
とびとびに削除ってのは遅いんだよ。
だから>>85の方法は駄目ね。
作業列と並び替えを使えばよい。
n=2,m=2であれば
作業列が仮にC列なら選択範囲の右のC列に全部1とでも書いておく
C1とC2を消す
C1:C4を選択して右下のフィルハンドルをダブルクリック
C列をキーにして並び替えれば作業列が1のデータが前に並ぶから、そこをまとめて削除すればよい
ようするにとびとび削除じゃなく、ひとかたまりを削除なり消去するのがコツだ

90:84
10/08/19 13:43:11
>87

不定数のセルをどうやってselectするのですか?

>89

レスありがとう。

試してみました。
多少は早くなっているようですが、作業列に並び替え用キーを入力す
るのに時間が掛かってる・・・orz

気長にいろいろとトライしてみます。
ありがとうございました。



91:デフォルトの名無しさん
10/08/19 14:34:59
>>90
コンマで区切る
A1セル、C3セル、E列全体、5行目全体をSelectしたい時は
Range("A1,C3,E:E,5:5").Select

92:デフォルトの名無しさん
10/08/19 14:57:57
>>91

その区切る個数が不定だと言ってると思われ。

93:デフォルトの名無しさん
10/08/19 15:16:50
nとmわかるんだから
セレクトは出来るんだろう
どこまでループさせるかはいろいろあるだろうけど

94:デフォルトの名無しさん
10/08/19 15:17:29
>>90
暇だから試してみたけど、やっぱりソートしてから削除が圧倒的に速かった。
全行(65536)から偶数行だけ削除で、うちだと5秒くらい。
複数Rangeの一括削除は、以外に遅くて、対象が増えると一行毎に削除するより遅くなってる気がする。
ちなみに複数Rangeの選択はUnion()を使う。

95:デフォルトの名無しさん
10/08/19 15:58:19
それはうにおんのせいでわ

96:702
10/08/19 16:27:23
>94

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

こちらではソートキーの設定だけでおよそ1sec/50行ほど掛かって
しまいます。この作り方が悪いんでしょうね。

そのソートキーの作り方を教えていただけないでしょうか?
当方がテストしたのは下記です。

宜しくお願いします。

Sub test()
n = 2
m = 2
myRows = Selection.Rows.Count
myColumns = Selection.Columns.Count
Selection.Resize(1, 1).Select
myRow = Selection.Row
myColumn = Selection.Column
Columns(myColumn).Select
Selection.Insert Shift:=xlToRight
With Cells(myRow, myColumn)
For i = 1 To myRows
.Offset(i - 1, 0) = i
If (i - 1) Mod (n + m) >= n Then _
.Offset(i - 1, 0) = i + myRows
Next i
End With
End Sub


97:84
10/08/19 16:28:08
>96は>84です。
名前欄間違えました(汗

98:デフォルトの名無しさん
10/08/19 17:03:04
>>96
なんでそんなに違うんだろう?
やり方はあまり変わらないと思うけど、一応試したの貼っておく。

Sub test5()
Dim i As Long
Dim n As Long
n = 65536
Debug.Print "= 5 ==== "
Debug.Print "start " & Now()
Application.ScreenUpdating = False
Cells(1, 1).EntireColumn.Insert
For i = 1 To n
If Cells(i, 1).Row Mod 2 = 0 Then
Cells(i, 1).Value = "x"
End If
Next
Debug.Print "sort " & Now()
Range(Cells(1, 1), Cells(n, 2)).Sort key1:=Cells(1, 1), order1:=xlDescending
Debug.Print "delete " & Now()
If Cells(1, 1) = "x" Then
Range(Cells(1, 1), Cells(Cells(1, 1).End(xlDown).Row, 2)).Delete shift:=xlShiftUp
End If
Debug.Print "delete work" & Now()
Cells(1, 1).EntireColumn.Delete
Application.ScreenUpdating = True
Debug.Print "end " & Now()
End Sub



99:84
10/08/19 17:35:50
>98

ソースをありがとうございました。

試してみましたが・・・終わりません。
n=655にしたらstartからsortまでが30秒掛かりました。

何か違うところに原因がありそうです。
のんびり調べてみます。

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

100:デフォルトの名無しさん
10/08/19 21:44:03
>>99
重い数式使ってるんじゃねーの?
最近はアホ回答者が平気で揮発性関数やら配列数式教えるからな。
その都度再計算してるんじゃねーかな。
根本的な解決策じゃないが試しに下の二つではさんでみたらどうなる?
Application.Calculation = xlCalculationManual
'記述
Application.Calculation = xlCalculationAutomatic

101:デフォルトの名無しさん
10/08/19 22:02:54
つか、重いって言ってる人間にUnion勧める奴は何なんだよ。
Unionなんてあんこ力士並の機敏性だぞ。

102:デフォルトの名無しさん
10/08/19 22:18:50
まてまて
そう言うことならまずあんこ力士の機動力を測定しなければならんな

103:84
10/08/20 14:52:12
>100

ご指摘の通り自動計算の問題でした。
ありがとうございました。

104:デフォルトの名無しさん
10/08/20 20:53:23
気軽にSQLを叩く方法は無いかのう…。
ADOで自分のシートに接続するとか、MS-Queryが普通なの?

105:デフォルトの名無しさん
10/08/20 20:56:28
うん(`・ω・´)

それ以外あるのかな?・・・

106:デフォルトの名無しさん
10/08/20 21:38:27
>>104
VBAに直接記述してから読み込ませれば?

107:デフォルトの名無しさん
10/08/21 13:43:05
自作関数ってこと?

108:デフォルトの名無しさん
10/08/21 18:24:33
教えてください。
Wordのパスワードを解除できるようにしたいのですが、

.Password = ""

上記のように "" で上書きしようとしても、元のパスワードのまま変更することができません。
何か文字列を入れれば上書きされ、変更することはできるのですが…
説明が下手で申し訳ありませんが、どうにか方法がありましたら教えてください。

109:デフォルトの名無しさん
10/08/21 19:10:34
空文字入れても駄目なのか。
VbNullとか・・・ダメだよな、やっぱり。

110:デフォルトの名無しさん
10/08/21 19:51:57
そりゃ元のパスワードなしで解除できたらセキュリティホールすぎるだろ
Word VBA のヘルプで検索したら↓が出てきた
Document.Unprotect Password:=strPassword

111:デフォルトの名無しさん
10/08/21 19:58:16
ごめん ↑は文書の保護で別物っぽい

112:108
10/08/21 23:24:41
レスありがとうございます。
元のパスワードは開く時に入力しています。
パスワードの変更はできるのですが、解除ができない状態です。
NULLも試してみましたが、空文字と同じでした…。

113:デフォルトの名無しさん
10/08/21 23:37:52
俺のワードだとパスワード削除したら出来るな

ワードのパスワード変更は
ツール→オプション→セキュリティ
からだぞ

114:108
10/08/22 00:05:42
こちらでもワード上で直接操作してパスワード削除すれば解除されます。
ワード上でマクロの記録も使ってみましたが、何も記録できませんでした。
もちろん自分でも調べたり色々試しているのですが行き詰っています。

115:108
10/08/22 01:46:34
ありがとうございました。一応、解決…というか、どうにかなったので報告しておきます。
空文字を入力(PWを削除)した場合、上書き保存ができていなかったようです。
別名で保存後、元ファイルを削除、リネームという方法で上手くいきました。
なんだか回りくどくて不満ですが、妥協することにします。

116:デフォルトの名無しさん
10/08/22 12:57:22
スレ違いでしたらすみません

業務にて3ヶ月前よりVBAの作成、改修の業務をしております

プログラムは未経験のためかなり苦労しておりますが頼りの先輩の辞職してしまったため1人でで対応しなくてはならない状況になってしまいました

みなさんの上達方法と一人前になるためにかかる期間を教えていただけますでしょうか

またよい研修がありましたら教えていただけると嬉しいです

よろしくお願いします


117:デフォルトの名無しさん
10/08/22 13:15:35
記録する
ところどころ変えてみる
本読む
やりたい動作をリストアップして実際に書いて動かす

早ければ3日、遅くても20年くらいじゃね

118:デフォルトの名無しさん
10/08/22 18:05:10
答えが分かる質問だと
上から目線で横柄な態度で仰々しく答える。

答えが分からない質問だと
なんだかんだと攻撃して
答えなくて済むようにしてその場を繕う。

あなた方はクソですね。

  ァ ∧_∧ ァ,、
 ,、'` ( ´∀`) ,、'`
  '`  ( ⊃ ⊂)  '`


119:デフォルトの名無しさん
10/08/22 18:44:35
>>116
一番の上達方法は、いかに検索が上手く出来るかだと思う。
入門書を1冊、上級者向けを1冊買って、しっかり読み解く。

それが出来たら、見よう見まねである程度のプログラミングは出来るようになると思うけど、
それからが本番だよ。

検索して、先人の作ったプログラムを解釈して行く。
決してコピペで済ませない。面倒でも自分で手打ちする事。
分からなくなったら上級者向けの本を読みなおす。

120:デフォルトの名無しさん
10/08/22 19:24:42
>>118
> 答えが分かる質問だと
> 上から目線で横柄な態度で仰々しく答える。

正確には
解ってるつもりで、不適切なことを教える。

121:デフォルトの名無しさん
10/08/23 00:46:45
>>104
Access使うのが常道
ExcelでSQL使うのは○道

122:デフォルトの名無しさん
10/08/23 12:10:36
VBSやJScriptからの利用なのですが、質問させて下さい
Excelを開く際にBookにパスワードが掛かっている場合
パスワード入力ダイアログが表示されますが
このダイアログにフォーカスが当たっている時のIMEが全角か半角かを判定する術はありますでしょうか?

恐らく、作成したテキストフィールド等ではVBAで可能だと思うのですが
(JavaScriptでも出来るので)
パスワード入力ダイアログで、どう判定するのかご存知でしたら教えて下さい

123:デフォルトの名無しさん
10/08/23 13:05:20
win32APIのimm32.dllを使うのはどうかしら

124:デフォルトの名無しさん
10/08/23 14:18:02
と言うか、開くだけならopenの引数にパスワード入れればいいし、入力させるならそんなに神経質になる必要もない

125:デフォルトの名無しさん
10/08/23 20:05:43
>>123
DLLは環境的に使用できません

>>124
開くExcelはユニークで固定じゃない
だからパスワードは開く時に同時に処理するってのは無理で、
あくまでユーザーサイドで入力をさせたい
で、ユーザーサイドの入力支援スクリプトとしてJSファイルを作成中
Sendkeys("password123")だけだとIMEが全角の時やラージ文字だと失敗するから、これを防ぎたい
CAPS LockやShiftのキーコードで、半角ラージ文字は問題なくいけたけど
全角時は何故かダメだった…全く理由が分からないので
Excel側でパスワード入力ダイアログを制御出来る関数とかないのかなぁ、と

126:デフォルトの名無しさん
10/08/23 20:53:28
つ アスキーコード

127:デフォルトの名無しさん
10/08/23 22:04:49
エクセル開いてIME無効にしてからターゲット開くとか

128:デフォルトの名無しさん
10/08/23 22:42:11
>>126
コードを漁ってみます
助言ありがとう
これで無理なら諦めますわ

>>127
ターゲットのBookが直に開かれる仕様なので無理ですね


スレ違いに等しい内容に付き合ってくれて、ありがとうございました

129:デフォルトの名無しさん
10/08/23 22:45:37
>>126
まだ試してないですがアスキーコードならいけそうですね!
助かりました。視野が狭くて恐縮です
スレ汚しスマソ

130:デフォルトの名無しさん
10/08/27 00:26:30
質問です。

「かぼちゃ」
「だふぁfだd」
などと文字がランダムに並んだ文字列があります。

これを
「ゃちぼか」
「dだfぁふだ」
という風に、文字列を逆にしたいのですが
解決する方法はあるでしょうか?


131:デフォルトの名無しさん
10/08/27 02:23:01
下記の通り、エクセルでDLLを呼び出すと、なぜかエクセルが強制終了します。
同じような経験をされた方がいらっしゃいましたら、対処方法をご教授いただきたく。
目的:VBAで用意した構造体にdllで計算した値を格納したいです。
→これが可能であれば、intとdoubleを15個ほど織り交ぜた構造体で実装したいです。

VBA(Excel2003)
---------------------------------------
Type XXX
x as integer
y as integer
z as integer
End Type

Declare Sub adder Lib "c:\test.dll" Alias add(ByRef a as XXX)
Sub test()
Dim s as XXX
s.x=1
s.y=2
s.z=0
Call adder(s)
Cells(1,1)=s.z

End Sub
---------------------------------------


132:つづき
10/08/27 02:24:02
C++(VC++2008express)
---------------------------------------
typedef struct
{
int x;
int y;
int z;
} XXX;

extern "C" void _stdcall add(XXX * s)
{
int a=s->x;
int b=s->y;
s->z=a+b;
}
-------------------------------------
test.def
------------------------------------
LIBRARY test.dll
EXPORTS
add @1
------------------------------------

133:デフォルトの名無しさん
10/08/27 06:48:09
>>130

つ StrReverse


134:デフォルトの名無しさん
10/08/27 10:36:54
相談させてください。

1=2=3=4=

例えばこのような文字列があるセルにあったとき、これを区切り位置機能で

1 =2 =3 =4 =

のように各セルに分割したいです。

TextToColumns Destination:=Range("A1"), DataType:=xlFixedWidth, _
FieldInfo:=Array(Array(0, 1), Array(1, 1), Array(3, 1), Array(5, 1),以下略

で分割すると結果セルの中身は=2や=3は2や3になってしまいます。
最初に該当するセルの書式をすべて文字列にしてからこの処理にかけても
値の上では=2,=3になるのですが、表示の上では2や3になり、
ダブルクリックして一度編集モードにしないと=2,=3と表示されません。

分割した時点で=2,=3と表示させるにはどうしたらよいでしょうか?

135:デフォルトの名無しさん
10/08/27 11:09:41
つ "'"&

136:デフォルトの名無しさん
10/08/27 12:15:01
>>135
いや、区切った時点で=2ではなくなってしまうみたいで、
区切った直後のコードで
Cells(1,1) = "'" & Cells(1,1)
としても=は残らないんです。
区切る前にテキストの特定の文字数部分に"'"を入れれば出来るかもしれませんが手間がかかりすぎます。

137:デフォルトの名無しさん
10/08/27 12:55:34
>136

区切る前に置換すれば?
そもそも先頭に=を持ってくる様な処理が腐ってる。

138:デフォルトの名無しさん
10/08/27 13:02:55
>>136
>>137をヒントにして、
  Dim a, b, c, d
  a = "1=2=3=4="
  b = Replace(a, "=", "@'=")
  c = Split(b, "@")
  For Each d In c
    Debug.Print d
  Next
こんなのどう?

139:デフォルトの名無しさん
10/08/27 14:11:14
>>138
コーディングや関数とは無関係に文字列としての=が先頭に必要な事態になったんだから
そんなこと言ってもしょうがない。

>>139
ありがとうございます!区切り位置で頭が固まっててsplitを思いつきませんでした。
助かりました。



140:デフォルトの名無しさん
10/08/27 23:11:49
おちつけw

141:デフォルトの名無しさん
10/08/28 08:09:21
お前らはvbaをどこで使ってるの?やっぱ仕事?

142:デフォルトの名無しさん
10/08/28 15:55:37 BE:773310454-2BP(1201)
VBを経由してexcelを開かせたいのです
普通に起動したらelcelを強制終了したいですがどうしたらよいでしょうか?

143:デフォルトの名無しさん
10/08/28 16:29:28
普通に起動ってなに?

144:デフォルトの名無しさん
10/08/28 17:08:52 BE:386655825-2BP(1201)
>>143 アイコンをクリックして起動させる

145:デフォルトの名無しさん
10/08/28 18:19:54
その他以外の目的でExcel使うときはどうするの?

146:デフォルトの名無しさん
10/08/28 18:21:31
日本語が変だった。
「その目的以外(つまり通常の方法で)でExcelを使うときは〜」と書きたかった。

いずれにせよ、エクセルを殺すことになるんじゃない。

147:デフォルトの名無しさん
10/08/28 18:23:22
EXCELVBAだけならじゃムリ
EXCELアイコンをEXCEL開かないようにして,クリックしたら終了メッセージだけ出すとかなら出来そうだけどVBAじゃねえな

148:デフォルトの名無しさん
10/08/28 18:29:51
>>142
ちょっとやりたい事(理由)が分かりずらいんだけど
特定ブックは VBA経由以外では開かせたくないって事かな?
そのブックにパスワードを設定しておくってのはどうです?

1)VBAなら パスワード指定でオープンする
2)普通にオープン(パスワードを知らないと開けない)

149:デフォルトの名無しさん
10/08/28 18:38:44
どう考えても仕様を練り直した方が良いレベル。

150:デフォルトの名無しさん
10/08/28 22:11:58
Excelを起動してからじゃないとVBAは動かせないんだから、
Excelの起動を禁止したら、そのExcelを開くためのVBAはどうやって開くんだよ

151:デフォルトの名無しさん
10/08/29 00:33:52
ADのグループポリシー側でやるとかしか無いんじゃないのかなあ。

152:デフォルトの名無しさん
10/08/29 02:44:25
フラグが経ってなければ自動で終了させればいいだけかもしらんが

153:デフォルトの名無しさん
10/08/29 03:30:58
どうせ、スタートメニューからExcelのショートカット消せば解決する程度の話だろ?

154:デフォルトの名無しさん
10/08/29 05:30:32
>>142
VBAからでなくて、VBからExcelを呼び出すのだよな?
そのVBのプログラムが起動しているかチェックして
起動していなければ終了、というVBAをブックオープン
イベントに記述しておけばいいんじゃないの。

特定のプログラムが起動していることをチェックする方法は
俺は知らないけど、この手のOSに近いことはマイクロソフトの
製品なら得意のはず。

155:デフォルトの名無しさん
10/08/29 08:27:37
開いた時にレジストリにフラグ書き込んでおけば?

156:デフォルトの名無しさん
10/08/29 12:14:55
API呼べばプロセスはチェックできる

157:デフォルトの名無しさん
10/08/29 19:15:46
チェックするためのExcelを開いていないとAPIも呼べないな
VBSで常駐させとくか?

158:デフォルトの名無しさん
10/08/29 20:13:26
文字列変数に

>このデータは{あいうえお,abcdefg}です

というデータが格納されているとします。

これを
>このデータはあいうえおです
>このデータはabcdefgです

というように抽出する手っ取り早い手段に悩んでいます。
{}の中にはカンマ区切りで2種類のデータがあり3種類以上になることはないという条件です。

159:デフォルトの名無しさん
10/08/29 21:55:56
>>158
s = "このデータは{あいうえお,abcdefg}です"

p = InStr(s, ",")
t = "このデータは" & Mid(s, 8, p - 8) & "です"
u = "このデータは" & Mid(s, p + 1, Len(s) - p - 3) & "です"

Debug.Print t
Debug.Print u

160:デフォルトの名無しさん
10/08/29 21:56:37
では後出しの条件をどうぞ↓

161:158
10/08/29 22:42:32
言い忘れましたがデータ中に区切りではないカンマも含まれる場合があります。

162:デフォルトの名無しさん
10/08/29 22:46:15
なりすましは無視して

s = "このデータは{あいうえお,abcdefg}です"

a1 = Split(s, "{")
a2 = Split(a1(1), ",")
a3 = Split(a2(1), "}")
t = a1(0) & a2(0) & a3(1)
u = a1(0) & a3(0) & a3(1)

Debug.Print t
Debug.Print u

163:デフォルトの名無しさん
10/08/29 23:44:49
なんかモヤモヤする

164:デフォルトの名無しさん
10/08/30 10:43:20
>163

俺もそう思う。
でもここでメモリの無駄遣いを説いても分かってくれないだろうし・・・

165:デフォルトの名無しさん
10/08/30 15:50:25
面白そうなことやってるな、俺も混ぜてくれ

s = "このデータは{あいうえお,abcdefg}です"

Set re = CreateObject("VBScript.RegExp")

With re
.Pattern = "(^.+{)([^}]+)(}.+$)"
.IgnoreCase = True
.Global = True

args = Split(.Replace(s, "$2"), ",")

For Each arg In args
Debug.Print (.Replace(s, "$1" + arg + "$3"))
Next

End With

メモリ効率?んなもん知らんわw

166:デフォルトの名無しさん
10/08/30 16:23:11
s = "このデータは{あいうえお,abcdefg}です"

w = Replace(Replace(s, "}", ","), "{", ",")
a = Split(w, ",")
t = a(0) & a(1) & a(3)
u = a(0) & a(2) & a(3)

Debug.Print t
Debug.Print u

167:デフォルトの名無しさん
10/08/30 16:50:21
a = Split(Replace(Replace(s, "{", ","), "}", ","), ",")

168:デフォルトの名無しさん
10/08/30 16:59:57
ユーザー定義書式

169:デフォルトの名無しさん
10/08/30 22:09:19
面白れぇ〜w

170:デフォルトの名無しさん
10/08/31 11:11:38
このデータは{あいうえお,abcdefg}です

文字列変数にこんな風に格納されないようにしたほうが早いんじゃないか?

171:われは海の子
10/09/02 11:07:40
はじめまして
2ちゃん初心者です

VBA画面でオブジェクト(Sheet1(表紙)〜・・・)が
たてに並んでます。23こ。

あれがオブジェクト名順に並んでないんですがどうしてですか?
シート名順に並んでいるわけでもありません。

オブジェクト名順に並び替えるにはどうしたらいいですか?

172:デフォルトの名無しさん
10/09/02 11:21:59
1,10,2,3…という並び方なら心当たりがある。そういうケースだとしたら、
01,02,03…と命名すれば吉


173:われは海の子
10/09/02 11:32:56
まさに!

Sheet01(表示)にしなければだめですか?

for文で回したりするときなどに
支障がないか心配です。。。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4522日前に更新/313 KB
担当:undef