Excel VBA 質問スレ Part14
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2010/01/06(水) 12:34:5801 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/
0925デフォルトの名無しさん
2010/04/10(土) 02:18:05それは自動変換がなくなったんじゃなくて、小文字に自動変換されてるんだよ
dim rowと入れてからROWと入力するとrowに変換される
0926デフォルトの名無しさん
2010/04/10(土) 03:06:19宣言していないモジュールの同名変数に「コンパイルエラー: 名前が適切ではありません」って出て困ってます。
エラーの出たシートの宣言セクションに同じようにpublicで宣言するとエラー回避出来ますがpublicの意味が無い気がします。
とにかく何でも参考にして欲しいので色々書いておくと
@全部標準モジュール
A全部の宣言セクションにOption Explicit
B当たり前だけど変数名とsubもしくはfunctionに同名は無し
Cその変数を一番使ってるシートで宣言しないといけないとかいうルール?
D2003 XP
結構困ってます。宜しくお願いします。
0927デフォルトの名無しさん
2010/04/10(土) 04:03:52そのエラーは変数のスコープじゃなくてプロシージャ名の重複
ttp://windyakin.if.land.to/src/up38_2022.png
0928デフォルトの名無しさん
2010/04/10(土) 06:10:40Excel2007でワードアートの文字サイズを変更するには
'ワードアートの大きさ調整
.ShapeRange.TextEffect.PresetShape = msoTextEffectShapePlainText '←この1行を追加
.ShapeRange.Width = wd * 0.7
0929926
2010/04/10(土) 10:34:21ここで質問する前、最初自分で調べた時も確かにそんな事書いてあったんですが、
でも実際変数が青囲み(選択状態?)になってエラーメッセージが出て困ってココに来たと・・・
勿論変数と同名のプロシージャ・プロシージャ名の重複は無しだったはずなんですが。
0930デフォルトの名無しさん
2010/04/10(土) 11:21:310931デフォルトの名無しさん
2010/04/10(土) 17:36:59二つのブックを開いている状態で、裏側に隠れている方のブックをマクロで
OnTimeを使って自動クローズします。
(この際、Before_Close内部で一部のシートを非表示にします。)
次にそのブックを開いたとき、シートが未選択の状態(シートが表示される
領域部分が真っ白)になってしまうのですが、解決手段はありますか?
0932デフォルトの名無しさん
2010/04/10(土) 17:46:30これだけだ。
0933デフォルトの名無しさん
2010/04/10(土) 21:20:340934デフォルトの名無しさん
2010/04/10(土) 21:23:550935デフォルトの名無しさん
2010/04/11(日) 13:22:31→真下にずらして計算結果セルをコピー
→ずらしてコピーした行数だけ計算元もずらして計算する
これをVBAでやろうと思っても、一番最初の計算結果そのまま全コピーしてしまいます。
おそらくcellsの中身が変数だからだと思うんですが、何か良い方法はありませんか?
今は仕方ないのでfor i 使っていちいち全セル計算させてますが遅いです・・・
0936デフォルトの名無しさん
2010/04/11(日) 14:03:01セルをコピーする時、代入するんじゃなくてCopyメソッドを使う
0937デフォルトの名無しさん
2010/04/11(日) 14:30:02文字列なら追加できるみたいなのですが、自分で作ったクラス等はCollectionに格納出来ない仕様なのか、単に文法ミスなのか教えてもらえますでしょうか?
Dim testCollection As Collection
Dim a発注 As C発注
Set testCollection = New Collection
Set a発注 = New C発注
testCollection.Add (a発注) 'ここでエラーが発生する
0938デフォルトの名無しさん
2010/04/11(日) 14:52:03testCollection.Add Item:=a発注
又は
testCollection.Add a発注
じゃないかな
ちなみに自分は
testCollection.Add Item:=New C発注
って書いてる
0939デフォルトの名無しさん
2010/04/11(日) 14:58:57ありがとうございます上手くいきました、なかなかステートメントと関数の違いになれられないですOrz
参照と実体で微妙に違う文法にも・・・
久々のBasicで、ああそういえばこんなのがというのがいっぱいです
0940938
2010/04/11(日) 14:59:49testCollection.Add a発注
はダメかも
0941デフォルトの名無しさん
2010/04/11(日) 15:00:390942デフォルトの名無しさん
2010/04/11(日) 15:10:470943デフォルトの名無しさん
2010/04/11(日) 15:56:560944デフォルトの名無しさん
2010/04/11(日) 16:08:070945デフォルトの名無しさん
2010/04/11(日) 16:12:090946デフォルトの名無しさん
2010/04/11(日) 16:55:001*(1+1)みたいに(a発注)の部分が先に実行され、
a発注がデフォルトプロパティーを持たないからエラーになったってことか、なるほど。
0947デフォルトの名無しさん
2010/04/11(日) 17:40:37VBにはあるのにVBAにはないメソッドとかイベントとかクラスとかいっぱいあるじゃん
0948デフォルトの名無しさん
2010/04/11(日) 19:06:48VBと統合して.NETframeworkで動くようにしてくれれば非常にありがたいんだが
0949デフォルトの名無しさん
2010/04/11(日) 20:07:210950デフォルトの名無しさん
2010/04/11(日) 20:20:490951デフォルトの名無しさん
2010/04/11(日) 20:42:03WORD VBAで定義されている定数を
Excel VBAで使用できないでしょうか?
WORD文書をセルA1の文字列 からセルB1の文字列に置換するコードを作成したのですが
WORD VBAは初めてだったもので
マクロの記録(Wordの)で出てきたコードを参考に
下記を作成しましたが全く置換してくれませんでした
思考錯誤して
.Execute Replace:=wdReplaceAll
で使用している定数"wdReplaceAll"が ExcelVBAでは使えない事が分かり
.Execute Replace:=2
とする事でなんとか置換してくれるようになったのですが
そもそもWORD VBAで定義されている定数"wdReplaceAll"を
ExcelVBAで参照する方法はないのでしょうか?
Set Doc = APPWord.Documents.Open(FileName:=Folder & DocName)
With Doc.Content.Find
.Text = ActiveSheet.Range("A1").Value
.Replacement.Text = ActiveSheet.Range("B1").Value
.Execute Replace:=wdReplaceAll
End With
0952デフォルトの名無しさん
2010/04/11(日) 21:14:26メニューバーに独自のメニューを追加する場合の,
OnAction プロパティを使用して,引数のついたプロシージャを起動する方法がわかりません。
例えば,追加メニューに登録する実行プロシージャ「TEST」に,引数1を付けて登録したい場合,
.OnAction="TEST(1)"
としても上手く行きません。
ヘルプを参照したりいろいろなサイトも検索したのですが,よくわかりませんでした。
ここは詳しい方が多いので,どうかよろしくお願いします。
0953952
2010/04/11(日) 21:25:58書き忘れました。
開発環境は,WindowsXP,Excel2003です。
0954デフォルトの名無しさん
2010/04/11(日) 21:35:27例えばA1に"ねこ"、B1に"いぬ"とあったら、
A1に"いぬ"、B1に"ねこ"と出るようにしたいんです。
0955デフォルトの名無しさん
2010/04/11(日) 21:40:000956デフォルトの名無しさん
2010/04/11(日) 21:47:27>>951
多分無理。参照の追加でいけるかもしれない
それか
Dim wdReplaceAll As Long
wdReplaceAll = 2
とすれば?constの方がいいが、まぁテキトーに
>>954
Sub a()
Dim a, b
a = Cells(1, 1)
Cells(1, 1) = Cells(1, 2)
Cells(1, 2) = b
End Sub
入れ替えることはできない。一旦変数に入れる
0957951
2010/04/11(日) 22:02:39やっぱ無理すかねー
Wordオブジェクト作ってるから
APPWord.wdReplaceAll
とかでいけるかと思ったけどダメだったもんで
先の質問となったんです
素直にconst定義します
これなら出来るよーーっての
今後の為にも気長にまってます
(当然 自分でも いろいろググって みますが)
ありがとでした
0958デフォルトの名無しさん
2010/04/11(日) 22:21:12x = Range("A1").Value
Range("A1").Value = Range("B1").Value
Range("B1").Value = x
0959デフォルトの名無しさん
2010/04/11(日) 22:23:09wordのタイプライブラリ(オブジェクトライブラリ)を参照設定する。
これで
Sub foo()
Debug.Print wdReplaceAll
End Sub
が2と出力される。
0960デフォルトの名無しさん
2010/04/11(日) 22:23:11テキトーすぎ
aが重複してるしbは空のままだし
0962デフォルトの名無しさん
2010/04/12(月) 00:56:53配列の値のmaxってどうやって調べればいいんですか?
maxkensaku(1 to 100)と100個数値入れて、その中で最大値が入ってる変数(仮にmaxkensaku(30))とか出したいんですけど・・・
0963デフォルトの名無しさん
2010/04/12(月) 01:52:34そういう関数とかは無いよ
0964デフォルトの名無しさん
2010/04/12(月) 02:04:310965962
2010/04/12(月) 02:19:16わかりにくいと思いますけど。こんな感じでmaxの入ってる配列番号は取得できるっぽいです
Sub maxtest()
kaisirow = 5003
Dim maxkensaku(1 To 10) As Double’小数点対策
For i = 1 To 10 '配列番号は順行だけど回すのは下からだから注意
maxkensaku(i) = Cells(kaisirow + 10 - i, 4) '5012〜5003に逆行しながら10セル取得
Next
i = 0
Do
i = i + 1
Loop Until maxkensaku(i) = WorksheetFunction.Max(maxkensaku())
msgbox i
End Sub
値が文字列の時の判定もしないかんしメンドクサイ
つうかDoubleだと多分エラーだなw variant使いたくねぇ。
0966デフォルトの名無しさん
2010/04/12(月) 07:41:17Sub maxtext()
Const kaisirow As Long = 5003
Dim X As Variant
Dim MaxValue As Double
With WorksheetFunction
X = .Transpose(Cells(kaisirow, 1).Resize(10, 1).Value)
MaxValue = .Max(X)
End With
Dim i As Long
For i = 1 To UBound(X)
If IsNumeric(i) Then
If i = MaxValue Then MsgBox i
End If
Next
End Sub
0967デフォルトの名無しさん
2010/04/12(月) 07:53:15なんで10個ずつ分けるんだよ
かえってめんどくさいし遅くなるだろ
Variansの配列に入れてワークシートにコピー、MAX関数で最大値を求めてFIND関数でインデックス番号を求める
まあ100個程度ならForで回しても大差ないけど
0968デフォルトの名無しさん
2010/04/12(月) 12:15:12使える1次元目の要素数は65536までだもんね。
バージョンによってはもっと少ないし。
Transposeなんて配列じゃなくセル範囲でも65536までしか使えないね。
配列ならループまわして十分だよ。
WorksheetFunctionと早さは変わらん。
0969デフォルトの名無しさん
2010/04/12(月) 12:41:43そのように配列がセルから取り込んだものならそんなやり方は間違いだよ。
配列がなんでも速いと思ってるやつがいるが、WorksheetFunctionは配列は遅い。
>>966
そんなんじゃまるで駄目だな。
配列に取得しちゃいかんよ。
下と同じじゃないか。
set r = Range("d5003).resize(10)
with worksheetfunction
i=.Match(.Max(r),r,0)
End with
>>965読む限り最大値の入ってる最後のセル位置を求めたいようだから、これじゃ駄目だろうけど。
0970デフォルトの名無しさん
2010/04/12(月) 13:45:20ありがとうございます、できました!!
返事遅くなってすいません。
0971デフォルトの名無しさん
2010/04/13(火) 10:29:38勿論コード自体はいじってないので全く同じです。
試しに、複製元のブックをもう一度別に新規に複製した先のマクロではそんな現象は起こりませんでした。
0972971
2010/04/13(火) 14:36:10対処が訳変わらんので違うコードに書き換えますが。使うごとに処理速度が劣化するなんてよっぽど変なコード組んでしまったみたいです。
0973デフォルトの名無しさん
2010/04/13(火) 19:11:480974デフォルトの名無しさん
2010/04/13(火) 19:21:13多分それほど変なコードではないと思う
0975デフォルトの名無しさん
2010/04/13(火) 19:35:140976デフォルトの名無しさん
2010/04/13(火) 19:39:050977デフォルトの名無しさん
2010/04/13(火) 21:09:18仕様だってMSのサイトにあったきがする。
0978デフォルトの名無しさん
2010/04/13(火) 21:15:31ゴミが溜まりにくくなったと思う
2007自体の評価は知らんが
0979971
2010/04/13(火) 23:00:09しかも、使ってるうちっても一回使っただけで後半もうすでに息切れしてるんです。
特徴があって、とある一瞬から急激に速度が落ちてるみたいなんです。
(処理の合間にbeep入れて音の感覚で確認してます。)
確かに、大量の新品のセルにfor each駆使して数式打ち込むのがメインのマクロです。
"=average(〜〜" & 変数 & "〜" & 変数 & "〜" & 変数 & "〜〜〜〜〜〜〜)" 見たいな感じで。
不思議なのは、このコード終了して別のシートで同じマクロ使うと速度の低下が持ち越されるんですよ。
ちなみに標準モジュールで書いたマクロです。
長文失礼しました。
0980デフォルトの名無しさん
2010/04/13(火) 23:39:29教えてください。
XP SP3 + Excel2000です。
セルに入力されたデータを、ワンタッチで消去するのを、
Range関数で、行っています。こんな感じです。
Range("A1:D10").ClearContents
ボタンのワンタッチでサッと消えるのは便利なのですが、
実行後に「Ctrl+Z」でのUNDO (再度データ復活) ができないのです。
マウスだと矩形に囲ってdeleteした後に、Ctrl+Zで戻すことができるのですが、
Range()の後にでも、それがしたいのです。
何か良い方法はないでしょうか?
0981デフォルトの名無しさん
2010/04/13(火) 23:48:580982デフォルトの名無しさん
2010/04/14(水) 00:07:20プログラムで処理する場合は、エクセルの保護を受けられません。
プログラマが自分で履歴機能を作る必要があります。
例えば、不可視のシートを用意しておいて、
消去ボタンクリック時にセルの内容をそのシートにコピーしてからClearContentsし、
戻すボタンでコピーした内容を書き戻す、など。
0983デフォルトの名無しさん
2010/04/14(水) 00:35:06さっそく、ありがとうございました。
大変よくわかりました。
別シートへの待避と復元をやってみます。
どうもありがとうございました。
0984デフォルトの名無しさん
2010/04/14(水) 01:01:18とりあえず、マクロの先頭に
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
ActiveWindow.DisplayGridlines = False
Application.DisplayPasteOptions = False
Application.DisplayInsertOptions = False
Application.AutoRecover.Enabled = False
Application.ErrorCheckingOptions.BackgroundChecking = False
マクロの最後に
Application.Calculation = xlCalculationAutomatic
ActiveWindow.DisplayGridlines = True
Application.DisplayPasteOptions = True
Application.DisplayInsertOptions = True
Application.AutoRecover.Enabled = True
Application.ErrorCheckingOptions.BackgroundChecking = True
というのを付け足してみ。もしかしたらちょっと速くなるかもよ。
0985デフォルトの名無しさん
2010/04/14(水) 01:09:27そのマクロをこんなふうに書き換えて、
Sub 範囲消去()
Range("A1:D10").Select
SendKeys ("{DEL}")
End Sub
マクロのオプションでショートカットキーを定義してから使うようにすれば、Ctrl+Zで元に戻せるようになるよ。
0986デフォルトの名無しさん
2010/04/14(水) 01:27:18>Ctrl+Zで元に戻せるようになるよ。
えっ、ホントですか? ありがとうございます。早速明日やってみます。ありがとうございます。
僕も不便に思っていましたが、まわりでやっている人のことを思うと、
ぜひ何とかしてあげたいと思っていました。
うまくいくと、みなさんに喜んでもらえそうです。
どうもありがとうございました。
0987971
2010/04/14(水) 03:15:49チョットどころか途中で鈍行する事無1m5sで完了しました。奇跡です。
一番上は当然として、ワークシート関数をセルに記載するのが大量にあるコードだったのでApplication.Calculation = xlCalculationManualが効いたみたいです。
ちなみに下5つの奴は全部つけても1sしか短縮出来ませんでしたw
皆様ありがとうございました。
0988デフォルトの名無しさん
2010/04/14(水) 16:56:02各関数が参照したい変数を、Publicで初期値付き宣言したいのですが、
うまくできません。記述の方法をご存じでしたら、教えてください。
やりたいことは、
Public Dim Const hoge(5) As Integer = { 1, 5, 9, 6, 4 }
もちろん上の記述はめちゃくちゃなので、通りませんが、意味合いとしては、
・Constのhogeという整数の変数を、配列で5個確保して、
・初期値として右のような順番で数値を代入したい。
・しかも それら全部を1行で書きたい。
です。
宜しくお願いします
0989デフォルトの名無しさん
2010/04/14(水) 17:22:421行でも何行でも、Constで配列を宣言するのは無理
0990デフォルトの名無しさん
2010/04/14(水) 19:19:551行で書きたい理由がわかんないけど、似たようなのが数十行あって…とかであれば、
Public Const HOGE As String = "1,2,3,4,5"
と宣言、使うときは
Split(HOGE)(0)
これじゃ文字列型配列になっちゃうから、Array関数とかも使えるかも
0991デフォルトの名無しさん
2010/04/14(水) 19:50:550992988
2010/04/14(水) 20:53:30C言語だと、初期値付きの宣言ができるので、同じようにやってみたところ
エラーばっかり出るので、質問しました。
VBAの作法がわかっていないので、変な質問ですみませんでした。また教えてください。
Public hoge(256) As String として宣言して、
Private Sub Workbook_Open()の中で、代入することにします。
しかしPrivate Sub Workbook_Open()だと、Excelを落として起動して、落として起動して
を繰り返さなければならないので、デバッグに時間がかかります。トホホ
ありがとうございました。
0993デフォルトの名無しさん
2010/04/14(水) 21:00:210994デフォルトの名無しさん
2010/04/14(水) 21:01:53ニコニコだけど、テトリス一時間の作者が
BrainF*ckのインタプリタを作ってる動画
http://www.nicovideo.jp/watch/sm10384056
0995デフォルトの名無しさん
2010/04/14(水) 21:24:210996デフォルトの名無しさん
2010/04/14(水) 22:14:52ならクラスでやってみたらどうかな?
適当だけどこんな感じで
' クラスモジュール Class1
Private m_Hoge As Variant
Public Sub Class_Initialize()
m_Hoge = Array(1, 5, 9, 6, 4)
End Sub
Public Property Get Hoge(idx As Integer)
Hoge = m_Hoge(idx)
End Property
' 標準モジュール Module1
Sub main()
Dim fuga
Set fuga = New Class1
MsgBox fuga.Hoge(3)
End Sub
0997デフォルトの名無しさん
2010/04/14(水) 22:23:11チューリングマシン、要するに今出回ってる全てのPCやソフトは絶対に実現できる
CPU・メモリをエミュレートすればいいだけだからな。
ただしものすごく遅い(Pen4・オンボで最新のネトゲやるような感じ)という条件が加わる
ついでに言うとその質問のレベルだと実現は不可能だ。諦めとけ
0998デフォルトの名無しさん
2010/04/14(水) 22:49:20安心しました
0999デフォルトの名無しさん
2010/04/14(水) 22:50:151000デフォルトの名無しさん
2010/04/14(水) 22:50:5610011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。