Excel VBA 質問スレ Part14
レス数が950を超えています。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/
0886デフォルトの名無しさん
2010/04/07(水) 16:28:15Wordの「あいまい検索」にあたるExcelでの関数は何になるのでしょうか?(´・ω・`)
MatchFuzzyを差し込んだらエラー吐いたんですが、Excelにはコレ無いのかな??
0887デフォルトの名無しさん
2010/04/07(水) 20:03:052007ではVBAのリファレンスはオンラインヘルプだけになってしまった。
Visual Basic Editorを起動したら、メニューバーのヘルプ→Microsoft Visual Basic ヘルプ→
Excel2007開発者用リファレンス→リファレンスを開くと、全オブジェクトの一覧が出てくる。
もしかしたら、MSDNライブラリにオフライン版があるかもしれんが、俺はよく知らん。
あるんならこっちが教えてほしいぐらい。
0888デフォルトの名無しさん
2010/04/07(水) 22:45:38エラー吐いたコード と エラー内容 を書きこんだ方が回答がつきやすいかも
0889デフォルトの名無しさん
2010/04/08(木) 00:06:13そんなもの入手して何するの?
オブジェクトブラウザとヘルプで十分だろ?
0890デフォルトの名無しさん
2010/04/08(木) 13:43:55おれの使ってる2000の場合は(>>887によれば2003までは)
VisualBasicEditorからヘルプ→MicrosoftVisualBasicヘルプを開けば
オフラインでもリファレンスを参照できた
>>885 CDとはいうまでもなくExcel(またはOffice)のCD-ROMのこと。
以前は、
Excel(またはOffice)の購入=Excel(またはOffice)のCD-ROMの購入
と同等なので
Excelの利用者はExcel(またはOffice)のCD-ROM持ってるはず。
2007以降は削除されたとの事なので、DVDにはないんだろうけど
0891デフォルトの名無しさん
2010/04/08(木) 14:22:540892デフォルトの名無しさん
2010/04/08(木) 14:35:25ありがとうございます
2002ですがそれと同じ手順で出てきました
もっとも昨日質問してからいろいろやっていて何とかたどり着いていたところでしたが
VBエディターのヘルプを開いても左側のコラムは出ない初期設定(もしくは当初闇雲にいじってそういう設定になってしまっていた)になっていたようです
それを変えると出てきました
0893デフォルトの名無しさん
2010/04/08(木) 14:36:11ありがとうございます
2002ですが出て来ました
0894デフォルトの名無しさん
2010/04/08(木) 17:22:07Excelは2003です。
コンボボックスを配置したシートを複数作り(シートのインデックスは1〜3)、
標準モジュールのauto_openで各シートのコンボボックスの内容を初期化しているんですが、
Excel起動時にauto_open内でSheets(1)のみを認識することができず、
「実行時エラー'32809'」が発生してしまいました。
しかもこの事象は全てのBookで発生するわけではなく、
コントロールをコピペしてきて同様の初期処理を組み込んだ他のBookでは
発生しません。
どなたかこのエラー発生の原因をご存知ありませんか?
0895デフォルトの名無しさん
2010/04/08(木) 17:30:542007では同名のファイルがダミーになってしまったのでヘルプが無くなったと思い込んでる人がいるようだが、
実はzip圧縮されたxml形式で格納されている。
わざわざダミーファイルを置いてる理由は不明。
0896デフォルトの名無しさん
2010/04/08(木) 19:11:17下のような処理で、1〜3、8〜10のどこかにブレークポイントをつければ
2つめのIfの中の処理をしてくれるのですが
はずすと1件も処理しません(3行目のIFでfalseになると思います)
ブレークポイントのあるなしで、なにか制御が変わってしまうんでしょうか?
2007です
1 For rowidx = 20 To lastrow
2 str1 = MotoSheet.Cells(s3row, 1).Value
3 If Len(str1) = 10 Then
4 If Mid(str1,3,2) = "**" Then
5 dcnt = dcnt + 1
6 いろいろ処理
7 End If
8 End If
9 LoopCnt = Loopcnt + 1
10 Next
0897896
2010/04/08(木) 20:52:00その上でやってるwebクエリーのせいだと思います。
0898デフォルトの名無しさん
2010/04/08(木) 23:36:14【2 Excelのバージョン】 Excel2002
【3 VBAが使えるか】 初心者です
【4 VBAでの回答の可否】 可
【5 検索キーワード】 private sub フォーム 呼び出せない
フォーム1にコマンドボタンを2個付けました。
そのボタンを押すとメッセージボックスでどちらのボタンが押されたかを表示するサンプルです。
フォーム『UserForm1』のコード
Private Sub CommandButton1_Click()
atai = 1
Call 選択表示
End Sub
Private Sub CommandButton2_Click()
atai = 2
Call 選択表示
End Sub
標準モジュール『module1』のコード
Public atai As Integer
Private Sub 選択表示() ’←をSubにすると実行できるがマクロ一覧に出てきてしまう。
If atai = 1 Then
MsgBox "押されたのは上のボタンです"
Else
MsgBox "押されたのは下のボタンです"
End If
End Sub
マクロ一覧に出したくないので『module1』のコードでPrivate Sub 選択表示()としたところ、『Subまたは Functionが定義されていません』とエラーが返ってきます。
Sub 選択表示()とすると実行出来るのですが、フォームからはPrivate Subは呼び出せないのでしょうか?
0899デフォルトの名無しさん
2010/04/08(木) 23:46:18Private指定したSubやFunctionは、そのモジュール以外の場所から呼び出すことはできない。
逆の言い方をすれば、他から呼び出して欲しくないとき、呼び出せないようにしたいときにPrivateを指定する。
解決策としては、Private Sub 選択表示() はmodule1ではなくUserForm1の中に書く。
0900デフォルトの名無しさん
2010/04/08(木) 23:58:45わかりやすい説明ありがとうございました。
すべてUserForm1に書いて、「Sub Auto_Open()」 で呼び出します。
誠にありがとうございました。
0901デフォルトの名無しさん
2010/04/09(金) 00:33:33sub と function の違いって値を返す返さないの違いとググる先生は言ってましたが、そもそもfunctionの存在意義ってあるんですか?
call subで代用出来るような気がするのですが、理解が難解なのを我慢して使う価値のある代物なのですか?
どういう時に使うのが有効なのかが私の理解力が低すぎて全く見えてこないので、何か良き実例などありましたら教えてください。
0902デフォルトの名無しさん
2010/04/09(金) 00:43:47逆にそういったものを作る必要が無いならSubで十分。
0903デフォルトの名無しさん
2010/04/09(金) 02:19:00逆だよ。
SubはFunctionで代用できるけど、逆は難しい、というかかなりめんどくさい。
もしどちらかに統一するとしたら、Subを廃止してFunctionを残すだろうね。
簡単なマクロはSubだけで作ることが多いからFunctionはいつ使うの?って思うかもしれないけど、
自分で作らなくてもシステムに用意されているFunctionを普段からたくさん使ってるんだよ。
たぶん、知識が足りなくて気が付いてないだけ。
0904デフォルトの名無しさん
2010/04/09(金) 02:35:11たくさんプログラム作ってくうちに理解できるようになるよ。
気が付くと、毎回同じ記述してることあったりするからw
そういうのをFunctionで作っておいて、あちこち使いまわしできると楽になる。
0905デフォルトの名無しさん
2010/04/09(金) 06:43:08Declare Function SetSysColors Lib "user32" (ByVal nChanges As Long, lpSysColor As Long, lpColorValues As Long) As Long
Sub 黒白反転()
Dim rc As Long
rc = SetSysColors(1#, 5#, 0#): rc = SetSysColors(1#, 8#, 16777215#)
End Sub
0906デフォルトの名無しさん
2010/04/09(金) 10:06:49> 2007ではVBAのリファレンスはオンラインヘルプだけになってしまった。
オフラインコンテンツあるけど?
0907デフォルトの名無しさん
2010/04/09(金) 13:27:04>2003まではOfficeフォルダのvbaxl10.chmをダブルクリックすればVBAのリファレンスを直接見ることができた。
2002ですが見ることが出来ました
同じく2002のVisual Basic Editorのヘルプで出てくる「Visual Basicのランゲージリファレンス」とはまた違いますね
0908デフォルトの名無しさん
2010/04/09(金) 14:43:18Range型の変数にオブジェクトがセットされているかの
判定方法がわかりません。
複数のテキストボックスにセル範囲(a1:g5など)を入力してもらい
unionで繋げているのですが
if tbox1.txt <> "" then
set r = range(tbox1.txt)
end if
if tbox2.txt <> "" then
set r = union(r,range(tbox2.txt))
end if
.
ここでunionの前にRange rにオブジェクトがセットされているかの
判定を入れてtbox1が空白の時の対応をしたいのです
0909デフォルトの名無しさん
2010/04/09(金) 15:23:28ワードアートを作成したのですが、その設定に
With Selection.ShapeRange.Width = WD * 0.7
(WDの変数にはSelection.Widthがはいってます)
とかやってるんですが、幅が変わらず・・・
ググりつかれました・・・
知っている方がいれば教えてください。
0910デフォルトの名無しさん
2010/04/09(金) 15:33:13オフラインにしてるか?
0911デフォルトの名無しさん
2010/04/09(金) 16:10:06HDD節約のためにカスタムインストールでヘルプをインストールしない設定にしてるとか
0912デフォルトの名無しさん
2010/04/09(金) 16:19:53変数 r が
Dim r As Range
のようにRangeオブジェクト型としてきちんと宣言してあれば、r が空なら
If r Is Nothing Then
で判定できる。これが正攻法。
まあ、もうちょっと手を抜くなら
If tbox1.txt <> "" And tbox2.txt <>"" Then
Set r = Range(tbox1.txt & "," & tbox2.txt)
Else
Set r = Range(tbox1.txt & tbox2.txt)
End IF
みたいに文字列の段階で結合してしまうのも一つの方法だし、
さらに手を抜くなら On Error でエラーを無視して続行するという手もある。
0913デフォルトの名無しさん
2010/04/09(金) 16:28:152007はオートシェイプのマクロが作りにくいからなあ。
(1) そのWithの使い方はおかしい
(2) セル範囲じゃなくてちゃんと図形がSelectされてる?
とりあえず模範解答
ActiveSheet.Shapes("WordArt 1").Select
WD = Selection.ShapeRange.Width
Selection.ShapeRange.Width = WD * 0.7
0914デフォルトの名無しさん
2010/04/09(金) 16:35:51ActiveSheet.Shapes("WordArt 1").Select
With Selection
WD = .ShapeRange.Width
.ShapeRange.Width = WD * 0.7
End With
0915908
2010/04/09(金) 16:51:08解決しましたありがとうございます。
IsNothing(r)
IsNull(r)
If r.IsEmpty
If r.IsNothing
などは試していたのですが
If r Is Nothing Then
という書き方があるんですね
勉強になりました。
0916デフォルトの名無しさん
2010/04/09(金) 17:23:01>>914
レスありがとうございます。
すいません、初心者なもので・・・
言葉足らずだった様ですので、補足です
ActiveSheet.Select
'変数の宣言(位置設定用:上位置、左位置、高さ、広さ)
Dim tp, lf, ht, wd
tp = Selection.Top
lf = Selection.Left
ht = Selection.Height
wd = Selection.Width
ActiveSheet.Shapes.AddTextEffect(msoTextEffect1, "てすと1", "MS P明朝", 18# _
, msoFalse, msoFalse, lf + (wd / 2 - wd * 0.35), tp - 4).Select
0917デフォルトの名無しさん
2010/04/09(金) 17:25:12'フォント内側の色指定
.Characters.Font.Color = RGB(255, 0, 0)
'フォント外側の色変更
.ShapeRange.TextFrame2.TextRange.Font.Line.ForeColor.RGB = RGB(255, 0, 0)
'ワードアートの大きさ調整
.ShapeRange.Width = wd * 0.7
End With
End Sub
上記で一応、指定していると思います。
で、選択範囲の中央付近に文字を持って来て、
文字を選択範囲の割合にたいして伸び縮みさせたいんですが・・・
これではワードアートの文字ではなく、わくの幅のみの変化となり、
文字に影響が無いんです。
excel2007の、ワードアートスタイル-文字の効果-変形-四角の効果
をvbaで指定できれば理想的かと思うんですが・・・
長文すいません
よろしくお願いします。
0918デフォルトの名無しさん
2010/04/09(金) 17:50:05Dim r As Range で Rが自動で大文字にならずDim r As Rangeとなるのは2003の仕様ですか?
あと、プロパティだとrowsだと大文字になるのにrowだとなりません。
0919デフォルトの名無しさん
2010/04/09(金) 17:53:28○ Dim r As rangeとなるのは
変数もrだったし例えが紛らわしかったですw ごめんなさい。
Rowsと自動大文字されるのにrowは自動で大文字にならないって事です
0920デフォルトの名無しさん
2010/04/09(金) 19:59:21うっかり最初に「range」と入れてしまうと、
消した後で改めて大文字で始めても勝手に小文字に直されてしまうとか、
そんな感じじゃなかったっけ?
0921デフォルトの名無しさん
2010/04/09(金) 20:42:41正しく入力すればちゃんと大文字になる。
ならない時は、どこか間違えてる。はず。
前後の行もよく確認。
>>920
それはユーザー定義名の場合。変数名とか関数名とか。最後に入れた方に自動的に統一される。
0922デフォルトの名無しさん
2010/04/09(金) 22:44:291 "dim r as range"と打ってEnter→"Dim r As Range"になる
2 全部削除
3 "dim range"と打ってEnter→"Dim range"になる
4 全部削除
5 "dim r as range"と打ってEnter→"Dim r As range"になる
0923デフォルトの名無しさん
2010/04/10(土) 01:01:00rangeが変数名として記憶されちゃったのか
どこまで戻ればリセットされるんだろう
小文字のままでもちゃんとRangeオブジェクトとして動作するから
ソースエディタのバグと言っていいのかな
0924918
2010/04/10(土) 01:37:24>>922に従って
dim Range(Rは手打ちで大文字)
dim Row(Rは手打ちで大文字)
とバリアントで宣言するとそれ以降は自動変換に戻りました。
逆に、小文字で宣言すると以降の自動変換なくなりました。全く訳の分からない仕様ですw
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で元に戻せるようになるよ。
レス数が950を超えています。1000を超えると書き込みができなくなります。