トップページtech
1001コメント371KB

Excel VBA 質問スレ Part14

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん2010/01/06(水) 12:34:58
過去スレ
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/
0886デフォルトの名無しさん2010/04/07(水) 16:28:15
Excelに用意した文字列からマクロでWordの文章内を置換したいと考えているのですが、
Wordの「あいまい検索」にあたるExcelでの関数は何になるのでしょうか?(´・ω・`)

MatchFuzzyを差し込んだらエラー吐いたんですが、Excelにはコレ無いのかな??
0887デフォルトの名無しさん2010/04/07(水) 20:03:05
>>883
2007ではVBAのリファレンスはオンラインヘルプだけになってしまった。
Visual Basic Editorを起動したら、メニューバーのヘルプ→Microsoft Visual Basic ヘルプ→
Excel2007開発者用リファレンス→リファレンスを開くと、全オブジェクトの一覧が出てくる。

もしかしたら、MSDNライブラリにオフライン版があるかもしれんが、俺はよく知らん。
あるんならこっちが教えてほしいぐらい。
0888デフォルトの名無しさん2010/04/07(水) 22:45:38
>>886
エラー吐いたコード と エラー内容 を書きこんだ方が回答がつきやすいかも
0889デフォルトの名無しさん2010/04/08(木) 00:06:13
>>883
そんなもの入手して何するの?
オブジェクトブラウザとヘルプで十分だろ?
0890デフォルトの名無しさん2010/04/08(木) 13:43:55
>>883
おれの使ってる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:54
あるよ
0892デフォルトの名無しさん2010/04/08(木) 14:35:25
>>887
ありがとうございます
2002ですがそれと同じ手順で出てきました
もっとも昨日質問してからいろいろやっていて何とかたどり着いていたところでしたが
VBエディターのヘルプを開いても左側のコラムは出ない初期設定(もしくは当初闇雲にいじってそういう設定になってしまっていた)になっていたようです
それを変えると出てきました
0893デフォルトの名無しさん2010/04/08(木) 14:36:11
>>890
ありがとうございます
2002ですが出て来ました
0894デフォルトの名無しさん2010/04/08(木) 17:22:07
質問です。
Excelは2003です。

コンボボックスを配置したシートを複数作り(シートのインデックスは1〜3)、
標準モジュールのauto_openで各シートのコンボボックスの内容を初期化しているんですが、
Excel起動時にauto_open内でSheets(1)のみを認識することができず、
「実行時エラー'32809'」が発生してしまいました。

しかもこの事象は全てのBookで発生するわけではなく、
コントロールをコピペしてきて同様の初期処理を組み込んだ他のBookでは
発生しません。

どなたかこのエラー発生の原因をご存知ありませんか?
0895デフォルトの名無しさん2010/04/08(木) 17:30:54
2003まではOfficeフォルダのvbaxl10.chmをダブルクリックすればVBAのリファレンスを直接見ることができた。
2007では同名のファイルがダミーになってしまったのでヘルプが無くなったと思い込んでる人がいるようだが、
実は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
08978962010/04/08(木) 20:52:00
すいません、質問を取り消します
その上でやってるwebクエリーのせいだと思います。
0898デフォルトの名無しさん2010/04/08(木) 23:36:14
【1 OSの種類】 WindowsXP
【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:18
>>898
Private指定したSubやFunctionは、そのモジュール以外の場所から呼び出すことはできない。
逆の言い方をすれば、他から呼び出して欲しくないとき、呼び出せないようにしたいときにPrivateを指定する。

解決策としては、Private Sub 選択表示() はmodule1ではなくUserForm1の中に書く。
0900デフォルトの名無しさん2010/04/08(木) 23:58:45
>>899
わかりやすい説明ありがとうございました。
すべてUserForm1に書いて、「Sub Auto_Open()」 で呼び出します。
誠にありがとうございました。
0901デフォルトの名無しさん2010/04/09(金) 00:33:33
2003 XPです。

sub と function の違いって値を返す返さないの違いとググる先生は言ってましたが、そもそもfunctionの存在意義ってあるんですか?
call subで代用出来るような気がするのですが、理解が難解なのを我慢して使う価値のある代物なのですか?
どういう時に使うのが有効なのかが私の理解力が低すぎて全く見えてこないので、何か良き実例などありましたら教えてください。
0902デフォルトの名無しさん2010/04/09(金) 00:43:47
Left関数とかSubで代用されたらどうなるかを考えてみると良いよ。
逆にそういったものを作る必要が無いならSubで十分。
0903デフォルトの名無しさん2010/04/09(金) 02:19:00
>>901
逆だよ。
SubはFunctionで代用できるけど、逆は難しい、というかかなりめんどくさい。
もしどちらかに統一するとしたら、Subを廃止してFunctionを残すだろうね。

簡単なマクロはSubだけで作ることが多いからFunctionはいつ使うの?って思うかもしれないけど、
自分で作らなくてもシステムに用意されているFunctionを普段からたくさん使ってるんだよ。
たぶん、知識が足りなくて気が付いてないだけ。
0904デフォルトの名無しさん2010/04/09(金) 02:35:11
>>901
たくさんプログラム作ってくうちに理解できるようになるよ。
気が付くと、毎回同じ記述してることあったりするからw
そういうのをFunctionで作っておいて、あちこち使いまわしできると楽になる。
0905デフォルトの名無しさん2010/04/09(金) 06:43:08
やっとできた。こういうことか

Declare 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
>>887
> 2007ではVBAのリファレンスはオンラインヘルプだけになってしまった。

オフラインコンテンツあるけど?
0907デフォルトの名無しさん2010/04/09(金) 13:27:04
>>895
>2003まではOfficeフォルダのvbaxl10.chmをダブルクリックすればVBAのリファレンスを直接見ることができた。
2002ですが見ることが出来ました
同じく2002のVisual Basic Editorのヘルプで出てくる「Visual Basicのランゲージリファレンス」とはまた違いますね
0908デフォルトの名無しさん2010/04/09(金) 14:43:18
Rangeについてなんですが
Range型の変数にオブジェクトがセットされているかの
判定方法がわかりません。

複数のテキストボックスにセル範囲(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
Excel2007で、選択範囲内にvbaで
ワードアートを作成したのですが、その設定に

With Selection.ShapeRange.Width = WD * 0.7

(WDの変数にはSelection.Widthがはいってます)

とかやってるんですが、幅が変わらず・・・
ググりつかれました・・・
知っている方がいれば教えてください。
0910デフォルトの名無しさん2010/04/09(金) 15:33:13
2007でヘルプが見れない奴ってF1押しても見れないのか?
オフラインにしてるか?
0911デフォルトの名無しさん2010/04/09(金) 16:10:06
>>910
HDD節約のためにカスタムインストールでヘルプをインストールしない設定にしてるとか
0912デフォルトの名無しさん2010/04/09(金) 16:19:53
>>908
変数 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:15
>>909
2007はオートシェイプのマクロが作りにくいからなあ。

(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:51
とりあえず、Withを使うとしたらこんな感じかな。

ActiveSheet.Shapes("WordArt 1").Select
With Selection
  WD = .ShapeRange.Width
  .ShapeRange.Width = WD * 0.7
End With
09159082010/04/09(金) 16:51:08
>>912
解決しましたありがとうございます。

IsNothing(r)
IsNull(r)
If r.IsEmpty
If r.IsNothing

などは試していたのですが

If r Is Nothing Then

という書き方があるんですね
勉強になりました。
0916デフォルトの名無しさん2010/04/09(金) 17:23:01
>>913
>>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
    With Selection

'フォント内側の色指定
.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:05
便乗質問ですけど
Dim r As Range で Rが自動で大文字にならずDim r As Rangeとなるのは2003の仕様ですか?
あと、プロパティだとrowsだと大文字になるのにrowだとなりません。
0919デフォルトの名無しさん2010/04/09(金) 17:53:28
× Dim r As Rangeとなるのは
○ Dim r As rangeとなるのは

変数もrだったし例えが紛らわしかったですw ごめんなさい。
Rowsと自動大文字されるのにrowは自動で大文字にならないって事です
0920デフォルトの名無しさん2010/04/09(金) 19:59:21
大文字・小文字の自動変換は割と適当な動きだったような……
うっかり最初に「range」と入れてしまうと、
消した後で改めて大文字で始めても勝手に小文字に直されてしまうとか、
そんな感じじゃなかったっけ?
0921デフォルトの名無しさん2010/04/09(金) 20:42:41
>>919
正しく入力すればちゃんと大文字になる。
ならない時は、どこか間違えてる。はず。
前後の行もよく確認。

>>920
それはユーザー定義名の場合。変数名とか関数名とか。最後に入れた方に自動的に統一される。
0922デフォルトの名無しさん2010/04/09(金) 22:44:29
Excel 2007で試してみたが
1 "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:00
2003でも再現できたわ
rangeが変数名として記憶されちゃったのか
どこまで戻ればリセットされるんだろう

小文字のままでもちゃんとRangeオブジェクトとして動作するから
ソースエディタのバグと言っていいのかな
09249182010/04/10(土) 01:37:24
多くの回答感謝します。
>>922に従って

dim Range(Rは手打ちで大文字)
dim Row(Rは手打ちで大文字)
とバリアントで宣言するとそれ以降は自動変換に戻りました。

逆に、小文字で宣言すると以降の自動変換なくなりました。全く訳の分からない仕様ですw
0925デフォルトの名無しさん2010/04/10(土) 02:18:05
>>924
それは自動変換がなくなったんじゃなくて、小文字に自動変換されてるんだよ
dim rowと入れてからROWと入力するとrowに変換される
0926デフォルトの名無しさん2010/04/10(土) 03:06:19
標準モジュールの宣言セクションで public で変数宣言すると同ブック他モジュールでも宣言有効のはずですよね?
宣言していないモジュールの同名変数に「コンパイルエラー: 名前が適切ではありません」って出て困ってます。
エラーの出たシートの宣言セクションに同じようにpublicで宣言するとエラー回避出来ますがpublicの意味が無い気がします。

とにかく何でも参考にして欲しいので色々書いておくと
@全部標準モジュール
A全部の宣言セクションにOption Explicit
B当たり前だけど変数名とsubもしくはfunctionに同名は無し
Cその変数を一番使ってるシートで宣言しないといけないとかいうルール?
D2003 XP

結構困ってます。宜しくお願いします。
0927デフォルトの名無しさん2010/04/10(土) 04:03:52
>>926
そのエラーは変数のスコープじゃなくてプロシージャ名の重複
ttp://windyakin.if.land.to/src/up38_2022.png
0928デフォルトの名無しさん2010/04/10(土) 06:10:40
>>916-917
Excel2007でワードアートの文字サイズを変更するには

'ワードアートの大きさ調整
.ShapeRange.TextEffect.PresetShape = msoTextEffectShapePlainText '←この1行を追加
.ShapeRange.Width = wd * 0.7
09299262010/04/10(土) 10:34:21
>>927
ここで質問する前、最初自分で調べた時も確かにそんな事書いてあったんですが、
でも実際変数が青囲み(選択状態?)になってエラーメッセージが出て困ってココに来たと・・・

勿論変数と同名のプロシージャ・プロシージャ名の重複は無しだったはずなんですが。
0930デフォルトの名無しさん2010/04/10(土) 11:21:31
ソースの一部だけでも晒してみたらどう?特にエラーになってる部分だけでも
0931デフォルトの名無しさん2010/04/10(土) 17:36:59
不可解な現象がありますので、お分かりの方いましたらご教示ください。

二つのブックを開いている状態で、裏側に隠れている方のブックをマクロで
OnTimeを使って自動クローズします。
(この際、Before_Close内部で一部のシートを非表示にします。)
次にそのブックを開いたとき、シートが未選択の状態(シートが表示される
領域部分が真っ白)になってしまうのですが、解決手段はありますか?
0932デフォルトの名無しさん2010/04/10(土) 17:46:30
使ったらきちんと終わらせる。
これだけだ。
0933デフォルトの名無しさん2010/04/10(土) 21:20:34
なんか質問者よりスキル無さそうなレスだな。中学生か?
0934デフォルトの名無しさん2010/04/10(土) 21:23:55
おまえは素人だけどなw
0935デフォルトの名無しさん2010/04/11(日) 13:22:31
エクセル上でavarege関数で計算
→真下にずらして計算結果セルをコピー
→ずらしてコピーした行数だけ計算元もずらして計算する

これをVBAでやろうと思っても、一番最初の計算結果そのまま全コピーしてしまいます。

おそらくcellsの中身が変数だからだと思うんですが、何か良い方法はありませんか?
今は仕方ないのでfor i 使っていちいち全セル計算させてますが遅いです・・・
0936デフォルトの名無しさん2010/04/11(日) 14:03:01
>>935
セルをコピーする時、代入するんじゃなくてCopyメソッドを使う
0937デフォルトの名無しさん2010/04/11(日) 14:30:02
始めてVBA使うんですが、次のコードで「プロパティーまたはメソッドをサポートしていません」なるエラーで停止します。
文字列なら追加できるみたいなのですが、自分で作ったクラス等は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:03
>>937

testCollection.Add Item:=a発注
又は
testCollection.Add a発注
じゃないかな


ちなみに自分は
testCollection.Add Item:=New C発注
って書いてる
0939デフォルトの名無しさん2010/04/11(日) 14:58:57
>>938
ありがとうございます上手くいきました、なかなかステートメントと関数の違いになれられないですOrz
参照と実体で微妙に違う文法にも・・・
久々のBasicで、ああそういえばこんなのがというのがいっぱいです
09409382010/04/11(日) 14:59:49
訂正
testCollection.Add a発注
はダメかも
0941デフォルトの名無しさん2010/04/11(日) 15:00:39
>>940 大丈夫でしたよ
0942デフォルトの名無しさん2010/04/11(日) 15:10:47
()あると渡し方変わるのは知ってたけど、でもなんで?
0943デフォルトの名無しさん2010/04/11(日) 15:56:56
functionになるから
0944デフォルトの名無しさん2010/04/11(日) 16:08:07
正直フルセット C# and VB.NET のVBAが欲しいです、色々中途半端
0945デフォルトの名無しさん2010/04/11(日) 16:12:09
何が中途半端?
0946デフォルトの名無しさん2010/04/11(日) 16:55:00
Function?
1*(1+1)みたいに(a発注)の部分が先に実行され、
a発注がデフォルトプロパティーを持たないからエラーになったってことか、なるほど。
0947デフォルトの名無しさん2010/04/11(日) 17:40:37
>>945
VBにはあるのにVBAにはないメソッドとかイベントとかクラスとかいっぱいあるじゃん
0948デフォルトの名無しさん2010/04/11(日) 19:06:48
VBAは所詮マクロだからねぇ
VBと統合して.NETframeworkで動くようにしてくれれば非常にありがたいんだが
0949デフォルトの名無しさん2010/04/11(日) 20:07:21
一部は使えるだろ
0950デフォルトの名無しさん2010/04/11(日) 20:20:49
一部しか使えないから中途半端だと言ってるゲソ
0951デフォルトの名無しさん2010/04/11(日) 20:42:03
すみませんが教えて下さい

WORD 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)"

としても上手く行きません。

ヘルプを参照したりいろいろなサイトも検索したのですが,よくわかりませんでした。
ここは詳しい方が多いので,どうかよろしくお願いします。
09539522010/04/11(日) 21:25:58
952です。

書き忘れました。
開発環境は,WindowsXP,Excel2003です。
0954デフォルトの名無しさん2010/04/11(日) 21:35:27
文字を入れ替えるのはどうすればいいですか?
例えばA1に"ねこ"、B1に"いぬ"とあったら、
A1に"いぬ"、B1に"ねこ"と出るようにしたいんです。
0955デフォルトの名無しさん2010/04/11(日) 21:40:00
VBA関係ないね
0956デフォルトの名無しさん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
入れ替えることはできない。一旦変数に入れる
09579512010/04/11(日) 22:02:39
>>956
やっぱ無理すかねー

Wordオブジェクト作ってるから
APPWord.wdReplaceAll
とかでいけるかと思ったけどダメだったもんで
先の質問となったんです
素直にconst定義します

これなら出来るよーーっての
今後の為にも気長にまってます
(当然 自分でも いろいろググって みますが)

ありがとでした
0958デフォルトの名無しさん2010/04/11(日) 22:21:12
>>954
x = Range("A1").Value
Range("A1").Value = Range("B1").Value
Range("B1").Value = x
0959デフォルトの名無しさん2010/04/11(日) 22:23:09
>>957
wordのタイプライブラリ(オブジェクトライブラリ)を参照設定する。
これで
Sub foo()
Debug.Print wdReplaceAll
End Sub
が2と出力される。
0960デフォルトの名無しさん2010/04/11(日) 22:23:11
>>956
テキトーすぎ
aが重複してるしbは空のままだし
09619512010/04/11(日) 22:39:54
>>959
やった 出てきた!!!!
ありがとう御座います
感謝感謝です
0962デフォルトの名無しさん2010/04/12(月) 00:56:53
2003 xpです
配列の値のmaxってどうやって調べればいいんですか?

maxkensaku(1 to 100)と100個数値入れて、その中で最大値が入ってる変数(仮にmaxkensaku(30))とか出したいんですけど・・・
0963デフォルトの名無しさん2010/04/12(月) 01:52:34
どうやって?ループして全部調べれば?
そういう関数とかは無いよ
0964デフォルトの名無しさん2010/04/12(月) 02:04:31
速度に目をつぶるなら、rangeに入れてしまうってのはあり
09659622010/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:17
Variant使うならこうか?あんまメリットないな
Sub 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
100個いっぺんに処理しろよ
なんで10個ずつ分けるんだよ
かえってめんどくさいし遅くなるだろ

Variansの配列に入れてワークシートにコピー、MAX関数で最大値を求めてFIND関数でインデックス番号を求める
まあ100個程度ならForで回しても大差ないけど
0968デフォルトの名無しさん2010/04/12(月) 12:15:12
配列をWorksheetFunctionなんてまともに使えないよ。
使える1次元目の要素数は65536までだもんね。
バージョンによってはもっと少ないし。
Transposeなんて配列じゃなくセル範囲でも65536までしか使えないね。
配列ならループまわして十分だよ。
WorksheetFunctionと早さは変わらん。
0969デフォルトの名無しさん2010/04/12(月) 12:41:43
>>965
そのように配列がセルから取り込んだものならそんなやり方は間違いだよ。
配列がなんでも速いと思ってるやつがいるが、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
>>928
ありがとうございます、できました!!
返事遅くなってすいません。
0971デフォルトの名無しさん2010/04/13(火) 10:29:38
ブックを複製した先のマクロ、デバッグで調べたところとある一部のループ処理が無茶苦茶遅くなってたんだけど、そんなバグってあるの?
勿論コード自体はいじってないので全く同じです。

試しに、複製元のブックをもう一度別に新規に複製した先のマクロではそんな現象は起こりませんでした。
09729712010/04/13(火) 14:36:10
どうやらそうではなく、ブックとか関係無く使ってくうちに処理が遅くなるみたいなんです。
対処が訳変わらんので違うコードに書き換えますが。使うごとに処理速度が劣化するなんてよっぽど変なコード組んでしまったみたいです。
0973デフォルトの名無しさん2010/04/13(火) 19:11:48
使ってるうちに遅くなるのはWindowsの宿命
0974デフォルトの名無しさん2010/04/13(火) 19:21:13
エクセルは新しいセルを使ったりすると内部にゴミデータが溜まる
多分それほど変なコードではないと思う
0975デフォルトの名無しさん2010/04/13(火) 19:35:14
そのごみはどうすればリセットできるの?
0976デフォルトの名無しさん2010/04/13(火) 19:39:05
新しくブックを作って必要なところだけこぴぺ
0977デフォルトの名無しさん2010/04/13(火) 21:09:18
ファイルサイズが増えるやつ?
仕様だってMSのサイトにあったきがする。
0978デフォルトの名無しさん2010/04/13(火) 21:15:31
2007からシートやオートシェイプ等の番号の振り方が変わったので
ゴミが溜まりにくくなったと思う


2007自体の評価は知らんが
09799712010/04/13(火) 23:00:09
御免なさい。2003のXPです。

しかも、使ってるうちっても一回使っただけで後半もうすでに息切れしてるんです。
特徴があって、とある一瞬から急激に速度が落ちてるみたいなんです。
(処理の合間に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:58
ありません
0982デフォルトの名無しさん2010/04/14(水) 00:07:20
>>980
プログラムで処理する場合は、エクセルの保護を受けられません。
プログラマが自分で履歴機能を作る必要があります。

例えば、不可視のシートを用意しておいて、
消去ボタンクリック時にセルの内容をそのシートにコピーしてからClearContentsし、
戻すボタンでコピーした内容を書き戻す、など。
0983デフォルトの名無しさん2010/04/14(水) 00:35:06
>>981 >>982
さっそく、ありがとうございました。
大変よくわかりました。
別シートへの待避と復元をやってみます。
どうもありがとうございました。
0984デフォルトの名無しさん2010/04/14(水) 01:01:18
>>979
とりあえず、マクロの先頭に

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
>>980
そのマクロをこんなふうに書き換えて、
Sub 範囲消去()
  Range("A1:D10").Select
  SendKeys ("{DEL}")
End Sub

マクロのオプションでショートカットキーを定義してから使うようにすれば、Ctrl+Zで元に戻せるようになるよ。
レス数が950を超えています。1000を超えると書き込みができなくなります。