1 :
デフォルトの名無しさん :
2007/12/12(水) 17:27:44
★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。 ★2 ExcelのVBA以外の部分に関する質問はNGです。 但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。 ★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。 VBAとは、『Visual Basic for Application』の略で Application ├Workbooks |└Workbook | ├Worksheets | |└Worksheet というApplication以下のオブジェクトを、VB言語で操作するものを指します。 例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、 セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。 ★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。 ★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。 ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
テンプレの最中にuncoを挿入する
5 :
デフォルトの名無しさん :2007/12/12(水) 17:53:17
セル1に「1」と入力するとセル2に「A」と出力,同様に「2」と入力すると「B」と出力するようにするためにはどうすれば良いですか? どなたか教えてくださると助かりますm(_ _)m
いつまでやるんだよ・・・
7 :
前スレのクレクレ君 :2007/12/12(水) 18:16:45
いや、私じゃないですよ
8 :
デフォルトの名無しさん :2007/12/12(水) 18:31:18
前スレの
>>1000 へ
hoge = Selection.Value のSelectionが結合セルだと2次元配列になる。
結合セルをSelectしないでhoge = Range("A1").Value とすれば2次元配列にならない。
2次元配列なら MsgBox hoge(1,1) としないと動かないが、2次元配列じゃなければ
MsgBox hoge で動く。
9 :
前スレのクレクレ君 = 1000 :2007/12/12(水) 18:37:44
>5 セル2に式「=CHAR( セル1 + 64 )」をいれときゃいいんでね? VBAは関係ないけど。
11 :
デフォルトの名無しさん :2007/12/12(水) 19:08:09
1. 1900年から2008年までのうるう年を見つけて、一個のメッセージボックスにすべてのうるう年を表示するようにプログラムを作成する。 2. 下記の数値の和を繰り返し文を使用して算出しなさい。 1+2+3+4+……+100 1の二乗+2の二乗+3の二乗+……+20の二乗 1の三乗+2の三乗+3の三乗+....+20の三乗 これをExcelVBAを使って解かなきゃいけないんだけど全くわかりせん。 どなたか教えていただけませんでしょうか。
>>2 >★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
> コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
> ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
>>11 1. MsgBox 閏年 & 閏年 & 。。。
2. 1^2+2^2+3^2 。。。 +20^2
Sub 空白セル削除() Worksheets("Sheet1").Activate For i = 1 To 1000 If Cells(A, i) = "" Then Cells(A, i).Delete shift:=xlUp End If Next End Sub これのダメなところを教えてください。 エラーが出るんですよね
15 :
5 :2007/12/12(水) 21:33:13
>>10 おおっ ありがとうございます!!
スレ違いでしたねすみません
16 :
デフォルトの名無しさん :2007/12/12(水) 21:39:20
エラーで止まったところをヘルプで調べないお前の姿勢がダメだろう。
>>16 ワラタw
>>14 セルズA,iを 1,i に変えたらうごいたぜ。 Excel2007 だけどな。
もはや全部ダメって言い切って良いな
>>18 そうか?
Sub 空白セル削除()
ここら辺はわかりやすくてよい。
>>16 すいませんでした
以後気を付けます
>>17 thx
マクロはじめたばっかで基本的な勘違いをしてたぜw
>>18 是非参考コードをお願いします。
Mougでも隅から隅まで眺めてこい
なんだ自分ではたいしたコード書けないのにコード乗ってるサイト知ってるだけで出来ると思ってる人間かw
oshietekun you ga sundara beroberobaa
Rangeのポインタを渡すにはどう記載すればよいでしょうか?
逆にRangeの実体を渡す方法があったら教えて欲しい まあインデックスのポインタのことだろうけど
byvalとbyrefの話?
Dim Data AS Variant Dim d AS Variant Redim Data(1,20) Redim d(1,60) dには{1,4,3,〜(60個の数値)〜}が入っている kukanにも区間データ(20個)が入っている。 Data(2行目に入れたい)=Worksheetfunction.Frequency(d,kukan) →Data二次元配列の2行目に答えを入れるにはどう記載すればよいでしょうか?
28 :
デフォルトの名無しさん :2007/12/14(金) 01:08:47
userformのspinbuttonでmouseupしたときに押し続けまでカウントされた値を 処理できますか たとえば1から100までアップしたとき changeだと100回処理しなけらばならないので mouseupで100の値についてだけ処理したいのです
マジな回答が欲しいヤツは、とりあえず解読可能な質問をしる
>>27 dに60個のデータって、61個じゃないのか?
それにDataもdも整数なのになんでVariant型?
それはおいとくとして、ループを回せばいいだろ
f = Worksheetfunction.Frequency(d,kukan)
For i = LBound(Data,2) To UBound(Data,2)
Data(1,i) = f(i + 1,1)
Next
>>30 >
>>27 > dに60個のデータって、61個じゃないのか?
確かにそのとおりです。
> それにDataもdも整数なのになんでVariant型?
二次元配列を使っているので。配列はVariant型って考えは間違っていますか?
> それはおいとくとして、ループを回せばいいだろ
> f = Worksheetfunction.Frequency(d,kukan)
> For i = LBound(Data,2) To UBound(Data,2)
> Data(1,i) = f(i + 1,1)
> Next
Frequencyの答えは一つの数字ではなく一次元配列でかえってくるので、それを二次元配列Dataに入れたいのです。
>>31 >二次元配列を使っているので。配列はVariant型って考えは間違っていますか?
間違ってる。整数なら普通IntegerかLong
>Frequencyの答えは一つの数字ではなく一次元配列でかえってくるので
Frequencyの戻り値は1ベースの2次元配列だろ?
補足しとくが Dim Data() As Long みたいに宣言するんだからな。
もしかしてDataとかdにはセル範囲の値を一括して代入してるのか? だったらVariantでいい。ただRedimは不要。
>>34 > もしかしてDataとかdにはセル範囲の値を一括して代入してるのか?
> だったらVariantでいい。ただRedimは不要。
逆です。Dataの値を後でセル範囲に一括して代入します。
Redimは不要なのですか?行や列の数を指定しなくてもいいのですか。
>>32 > >Frequencyの答えは一つの数字ではなく一次元配列でかえってくるので
> Frequencyの戻り値は1ベースの2次元配列だろ?えっ!?区間と度数の二次元配列ですか?調べたつもりが。。。
ということはfをあるセル範囲(2×n)に代入すればよいということですね。
>>36 >Redimは不要なのですか?行や列の数を指定しなくてもいいのですか。
Variant型の変数に代入する場合不要ということ。
d = Range("A1:E1").Value
みたいなときのことね。
>区間と度数の二次元配列ですか?
度数だけの2次元配列。
>ということはfをあるセル範囲(2×n)に代入すればよいということですね。
2×nじゃなくて1×n
縦じゃなくて横なならTransposeしないと出来ない。
縦1列ならそのまま可
38 :
デフォルトの名無しさん :2007/12/14(金) 09:58:09
vbaのreplace関数って、指定の文字列がない時に何か 値を返すことって出来ます? 置換前の文章と照合するしかにあ?
39 :
37 :2007/12/14(金) 10:29:12
補足しとくがdとかkukanがセル範囲から取り込んだものなら、そんな配列は必要ないからな。 仮にデータがA1:A61にあり、区間がB1:B20なら f = Worksheetfunction.Frequency(Range("A1:A61"),Range("B1:B20")) でいい。引数を変数にするならRange型だ。 戻り値は区間より一つ多い11x1,の2次元配列になってる。 一つ多いのは区間の最後のデータより大きいもののカウント用
>>38 置換前の文字列と照合するか、先にInStrで調べてからでもいいんじゃない?
41 :
39 :2007/12/14(金) 10:35:05
マチガイ 戻り値は区間より一つ多い21x1の2次元配列な
42 :
デフォルトの名無しさん :2007/12/14(金) 10:59:42
replaceだけ、頭文字が大文字にならないのは仕様ですかw
43 :
デフォルトの名無しさん :2007/12/14(金) 11:10:28
44 :
デフォルトの名無しさん :2007/12/14(金) 16:16:50
aaapapaaaaaaapaaaap という文があったとして、 これをp毎に分割するにはどうすればいいでしょうか。 instrでpの場所を探して、その文字数分leftで取り出せばいいと思うのですが もっといい方法は無いでしょうか。
46 :
デフォルトの名無しさん :2007/12/14(金) 16:57:07
VB6スレって、2バイト文字ばっかりじゃないですか
>>44-46 そんなに目くじらたてなくてもいいんジャマイカ
pで分割してセルに書き込むのかも知らんしだろ?
つSplit関数
>>42 Replace関数もReplaceメソッドも頭文字は大文字になるぞ?
変数の宣言で使ってるとかプロシージャ名で使ってるとかなんか変なことしてるんじゃない?
独学するのにお勧めの書籍ありませんか? プログラミングは初心者です。 かつてHTMLとCSS、javascriptをほんの少しだけ学校の夏期講座で勉強した程度です。
>>50 Excelでお仕事
でぐぐる
「VBA基本」を見る
書籍不要。
>>51 そこだと変なクセがつかないか?
最近見てないけど、前みたときはあまりいい内容ではなかった。
>>50 VBAエキスパートの参考書をやってから
あとはリファレンスとして上記のEXCELでお仕事を参照すればいいと思う
稚拙なHPを読んで機会損失するコストを考えたら、3,4千円の書籍を購入する コストは非常に安い。
どの言語もそうだけど最終的に書籍はリファレンスだけしか要らなくなる
あのサイトの人、VBAに関してはかなり下手だぞ? VBAのリファレンスにはならねーな。
ほとんどの人が代案を出せずに
一人の出した案を叩くばかりという状況にワロタ
まあ、ここの回答陣がVB(A)初心者だったのが
何年前かと考えると…
古すぎてもう売ってないとか
対応バージョンがExcel95とか、
当時はWebとかほとんど無かったとか
そもそも他言語から入ったとかだろうから
仕方ないだろうけど。
>>50 まあAmazonの書評でも見るか
(これもあてにはならないが、ここよりは…)
もしくは適当なVBA本の著者名でぐぐると
サイト持ってて入門編を公開している人もいたりする。
田中亨おすすめ。 mougの人は嫌い。
59 :
デフォルトの名無しさん :2007/12/17(月) 10:52:50
>>49 replaceは名前としては一切使ってないのですが
(過去にそのプロシージャ内で使ったことがあるかも・・・)
なぜか、小文字です・・・。
あと、古いExcel97では、replace使えないんですね。ショック・・・
サブルーチンで誰か作ってないかな。
60 :
デフォルトの名無しさん :2007/12/17(月) 10:59:20
>>59 Excel97でもOSが古すぎない限り(古くてもWSHをインストールすれば)
ツール→参照設定で
「Microsoft VBScript Regular Expressions 5.5」に参照設定して
RegExpオブジェクトの.Replaceを使えば
ただしReplace関数より機能は高いが
正規表現な分ハードルも高い。
62 :
デフォルトの名無しさん :2007/12/17(月) 17:55:16
63 :
デフォルトの名無しさん :2007/12/17(月) 18:15:07
>>59 横レスだが、折れも、ずいぶん前に、何ヶ月前ぐらいかな?
何かの時にrangeが1カ所だけRangeにならないことがあった。いろいろと試していたときだった。そこだけ、いろいろと書き直しても小文字のままだったので、
折れも同じように、気になって聞いたが、誰も答えようがなかったみたいだった。
チャンと動いておれば、気にしないでオケw
64 :
デフォルトの名無しさん :2007/12/17(月) 19:04:02
*.shapes(1).DrawingObject.Text = *.Cells.Value(1.1) ' ↑(Chart) ↑(Sheet) EXCEL2000だと正常に動作する上記のようなコードがあります。 EXCEL2007だと、 "指定したコレクションに対するインデックスが境界を超えています。" というようなエラーが出てしまいます。 (上記コードをコメントアウトすると正常終了します) 普通のシートのセルの文字列を、グラフシートのラベルにコピーする コードなのですが、2日ほどひたすら検索しましたが、 何が原因なのかがわからない状況です。仕事場からソースを持ち帰ること ができないので、これだけでは解析不能かもしれませんが、 何かヒントでも頂けたら幸いです。よろしくお願いいたします。
マクロを記録して味噌
Range("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Select Selection.Delete shift:=xlShiftUp で「A列に何も入っていない行」を削除できますが、 「A列およびB列に何も入っていない行」は削除できませんでしょうか? Range("A:B").〜とすると 「A列もしくはB列に何も入っていない行」になってしまいます。 結局for〜nextでCells(i,1).value&Cells(i,2).value=""かどうか調べて、みたいなので 動くことは動いたんだけどなにか簡単な方法はないかと。
>>64 前後関係意味不明
上限がいいかげんなループの中でShape回してるんジャマイカ?
>>66 ない
Range("A:B")とやったところで内部的には1次元でしかないので
ユーザーフォーム(モードレス)を残してワークシート最小化し フォーム上のボタンを押してファイル選択ダイアログをだしているんですが ファイル選択ダイアログがマウスクリックを受け付けてくれません EXCEL 2000だと問題なく動くのですがEXCEL XPだとこの症状がでます 回避策ないでしょうか
コードさらせアホが。二度手間じゃ
こんな感じです Private Sub Workbook_Open() Dim oldState oldState = Application.WindowState Application.WindowState = xlMinimized AppActivate "Microsoft Excel" UserForm1.Show vbModeless End Sub Private Sub CommandButton1_Click() Dim fname As String fname = Application.GetOpenFilename(fileFilter:="txtファイル(*.txt),*.txt,txtファイル(*.txt),*.txt", Title:="txtファイルを選択") If fname = "False" Then Exit Sub End If End Sub
71 :
デフォルトの名無しさん :2007/12/18(火) 12:32:52
inputboxを、カイル君や冴子先生のようにするには? とカイル君に聞いても教えてくれなかった。
モードレスは対応するバージョンがあるぜ
73 :
デフォルトの名無しさん :2007/12/18(火) 14:14:14
inputboxの外観でググっても出ないな。
>>68 何も確認せずにレスするんで恐縮だが、最小化じゃなくて、非表示(App~.Visible)とかじゃダメ?
75 :
デフォルトの名無しさん :2007/12/18(火) 18:54:33
コントロールを扱うための知識はコントロールそのものではなく、 実はコレクションってのがVBAの真理だったりする
>>74 指摘のとおりに変えたらEXCEL XPで動きました ありがとうございます
明日EXCEL2000でも確認してみます
78 :
デフォルトの名無しさん :2007/12/19(水) 05:50:53
特定の範囲内でランダムに1つのセルの値(文字列)だけ残して他を消す(又は表示させない) ようにしたいんですがなにか方法ないでしょうか。 ランダムに複数セルの値を取得する→消去 の流れでいいんでしょうか。 ご教授願います。すれ違いだったらすいません。 *例えばA1〜A5に文字列が入力されていて、マクロを実行したらA1のセルの値のみがのこって他を 消すようにできないかと思います。
79 :
デフォルトの名無しさん :2007/12/19(水) 09:42:17
マクロ歴三日の私が通りますよ Sub rand() Range("D" & 1).Formula = _ "=round(rand(),1)*10" i = Range("D1").Value Range("A" & i).Select makura = MsgBox("are you sure to erase?", vbOKCancel) If makura = vbOK Then Selection.ClearContents End Sub
80 :
デフォルトの名無しさん :2007/12/19(水) 09:46:00
あ、残すのか・・・ 英語とか・・・色々すまん煎ってくるわ
81 :
デフォルトの名無しさん :2007/12/19(水) 10:06:52
Sub rand() yarinaosi: Range("D" & 1).Formula = _ "=round(rand(),1)*10" i = Range("D1").Value If i = 0 Then GoTo yarinaosi Range("A" & i).Select Selection.Cut Range("B" & i).Select ActiveSheet.Paste Range("A1:A10").Clear Range("B" & i).Select Selection.Cut ActiveCell.Offset(0, -1).Select: ActiveSheet.Paste End Sub
>>81 その式だと10になる確率が低いんじゃねーのか?
9になるのはround(rand(),1)が8.5以上9.5未満の1の幅があるが
10になるのは9.5以上で半分の幅しかねーな。
ROUNDなんか使っちゃいかんよ。
Range("D1)..Value = Int(Rnd*10)+1
とすれば1〜10の確率はそれぞれ10パーセントだ。
ちょっと書き直し 9になるのはrand()が0.85以上0.95未満の0.1の幅があるが 10になるのは0.95以上で半分の幅
84 :
79,81 :2007/12/19(水) 14:14:48
85 :
デフォルトの名無しさん :2007/12/19(水) 17:53:38
絶対パス付きを取得し、変数filepathに、ファイル名をfilenameに入れて、ファイルを開こうとしています。 しかしフォルダ名に空白があると存在しませんとエラーがでます。 openfile filepath & filename どのように書けばよいのでしょうか?
openfileが悪さしてる
87 :
デフォルトの名無しさん :2007/12/19(水) 18:06:15
trimしてみては?
88 :
デフォルトの名無しさん :2007/12/20(木) 05:13:01
htmlの指定したタグの中身を取り出す関数(メソッド?)ってどういうものでしたっけ? GetOuterHtmlみたいな感じの名前でしたが、手元にVBがなく、ググってもでてこない
分かってないのに分かったような物言いをしたところで間抜けであることは変わらない
91 :
デフォルトの名無しさん :2007/12/20(木) 11:06:38
以前質問させてもらった者ですが 1+2+3+4+……+100 この和を繰り返し文を使用して出せというのがいまだにわかりません。 この場合For文を使えばいいんでしょうか? 無知で申し訳ないです。
>>91 スレ違い For文でできる。 どうしても分からなければVBスレで。
dim a(100) as integer for i=1 to 100 a(i) = i next msgbox (a(1) + a(100))/2*100
94 :
デフォルトの名無しさん :2007/12/20(木) 15:01:54
>>90 以前エクセル付属のVBAで使った記憶があるのですが
>>94 Microsoft HTML Object Libraryを参照設定して、F2でMSHTMLを眺めて、ググるなりしろ。
これ以上の質問はVBスレでやれ。
97 :
デフォルトの名無しさん :2007/12/20(木) 16:19:13
Sub nnn() Dim a As Variant Dim i As Byte Dim sentence As String Dim sentence2 As String '''''''''''''''''''''' Range("A1").Formula = "I am Japanese." a = Array("I", "am", "Japanese", "living", "in", "USA", ".") For i = 0 To 6 sentence = Range("A1").Value sentence2 = Replace(sentence, a(i), "", 1) Next i MsgBox sentence2 End Sub このプログラムで、sentenceをa配列全て使って、 置換したいのですが、 array中の最後の文字しか変換されません。 どうすればよいでしょうか...
>>97 かろうじてExcel要素が混じってるが、基本はExcel関係ないぞ。
Forの行にブレークポイントを設定して、ステップ実行させながら、変数の中を見てみろ。
99 :
デフォルトの名無しさん :2007/12/20(木) 17:03:25
>>98 置換したはずの文字が、ふ、ふ、復活しているよっ!
100 :
デフォルトの名無しさん :2007/12/20(木) 17:14:26
あ、sentence2はsentenceでいいのか。 むずかしい
とりあえずUSAには定冠詞のTheを付けるように
>>91 学校の宿題だったっけ?
>>93 のFor Nextで合格点もらえるよ。
103 :
97 :2007/12/21(金) 09:11:06
この文の位置か・・・ sentence = Range("A1").Value
もしかしてVBAってMax(i1,i2,i3)みたいなのって無し? セルの比較ならApplication.Maxとかでいいけど変数の最大値を取得したいときはどーすれば?
セルに代入してapplication.max使えばいいんじゃね?
ヘルプ見ろよ
10分もありゃ汎用性の高い自作関数作れるだろ
108 :
デフォルトの名無しさん :2007/12/22(土) 00:34:48
汎用性の高い自作関数 例えば?
型の範囲を意識しなくていい関数はかなり便利 integerの範囲以上の値入れていちいちエラートラップするのはうざいからな
integerの範囲以上の値入れていちいちエラートラップする ・・ Variant・・・
丸め誤差を極力減らしたいのですが、式を記載する上で注意しておきたいことを教えてください。
除算を使わない
計算をしない
電卓で計算して、Excelに手作業で貼り付け w
極力ってことは・・・一気に計算したら?
117 :
デフォルトの名無しさん :2007/12/23(日) 00:08:32
>>116 よく本に掲載されているのは、ルートを有利化せずに分母においてるのがあるが、理由がよくわからなくて。
EXCELで 人人人人人 2 3 1 4 1 4 2 3 のように4人でゲームして順位を出す時に、 ちゃんと横の合計が10になるか計算したいのですが こういう空欄はスルーして計算できませんでしょうか?
何も考えずにセル関数Sum使えば終わりでね?
>>119 その通りでした。どうもありがとうございます
実は例と少し違って合計0になるかだったので勘違いしてました
麻雀かw
>>117 コンピュータは分母が整数じゃなくても
それほど困らないからいいんじゃないの?
123 :
デフォルトの名無しさん :2007/12/23(日) 10:51:16
情報工学勉強すればわかる。
VBA使うのにいちいち情報工学など勉強しれられっか
125 :
デフォルトの名無しさん :2007/12/23(日) 11:07:39
VBAに必要な知識は、 1.同じ機能を実現するために、いかに高速化する記述方法を知っているか。 言語に関わらず必要な知識は、 1.誤差伝幡をいかに少なくするか。 2.いかに高速なアルゴリズム(探索など)を知っているか。 3.その他多数〜
> 1.同じ機能を実現するために、いかに高速化する記述方法を知っているか。 開発効率という観点が欠如しているっぽいあなたには、アセンブラをオススメいたします。
>>111 桁に限界があるので技術計算には向かないが
固定小数点のCurrency型を使うとか。
>>111 除算をしないか、ロジックで極力計算回数を減らす。関数の戻りの型に注意。あと、スレ違い。
フォルダに0001〜9999jpg セル2に000*と入力すると自動的にセル1に該当の000*jpg表示さすにはどうすればいいでしょうか? よろしくお願いします
>>129 セル2の入力を常に監視し、入力に変化があるたびにフォルダ内にその画像があるか調べ、あれば表示する。
4桁に制限したければそういうifを書けばいい。
>>93 の人ありがとうございました。
1^2+2^2+3^2+……+20^2
1^3+2^3+3^3+・・・・+20^3
ついでにこれのFor文を使った書き方も教えていただけるとありがたいです。
宿題か?宿題なのか?
そんなことより聞いてくれよ。 というか教えてください。 マクロ流してるとリソース不足とかメモリ不足とか言い出すんだけど、何で? やっぱりファイルが大きすぎるのか? 1ファイルで60MBとか無理なのか? ご存知の方いたら助けてください。
>>133 うん、でかいw限界点とかはわからんが・・・
Win2000メモリ1Gの環境で、30MB程度のマクロ・数式・外部リンクつきのブック2個開くと危ういので・・・
>>132 そうなんですよ。なんとかお助け願えないでしょうか?
for i=1 to 100 a = i next
途中送信orz動作未確認 dim a as integer for i=1 to 100 a = a + i * 2 next 3は2を変更で
>>137 どいつもこいつも・・・ここはネタすれなのか?
140 :
デフォルトの名無しさん :2007/12/26(水) 02:24:13
>>138 え?あれじゃ駄目なんですか?人助けと思ってマジレスお願いします。
141 :
137 :2007/12/26(水) 02:37:44
すまん、俺は素だったんだw 汎用性もたせるなら累乗関数使うなり作るなりしてくれ。 dim a as integer for i=1 to 100 a = a + i * i '2乗 'a = a + i * i * i '3乗 next
142 :
137 :2007/12/26(水) 02:39:07
>>140 ちゃんとみりゃわかる。
>>97 はforが入ってるが結局は(1+100)/2*100だ。
dim sum as integer
for i=1 to 100
sum = sum + i
next
143 :
137 :2007/12/26(水) 02:40:02
はぁい、
>>93 の間違いねorz
スレ汚し失礼しました。
志村ー 100じゃなくて20・・・・
145 :
デフォルトの名無しさん :2007/12/26(水) 13:27:24
>>141 >>142 たびたびすいません。これらをメッセージボックスに表示するには
どうしたらいいんでしょうか?
146 :
デフォルトの名無しさん :2007/12/26(水) 14:22:26
Option Explicit Sub sum() Dim sum As Integer Dim sumMsg As Integer Dim i As Byte For i = 1 To 100 sum = sum + i Next i sumMsg = MsgBox(sum, vbOKOnly + vbInformation) If sumMsg = vbOK Then MsgBox "やったね" End Sub
147 :
デフォルトの名無しさん :2007/12/26(水) 14:23:38
共有ファイルでVBAを編集するには?
148 :
デフォルトの名無しさん :2007/12/26(水) 17:17:49
inputboxをキャンセルしたときの挙動なのですが、 これじゃだめですよね・・・ Sub nicochuu() niwango = InputBox("入力してね", "inputbox") If niwango = "" Then MsgBox "入力無し": Exit Sub Range("A1").Value = niwango If niwango = vbCancel Then Range("A2").Value = "キャンセル" End Sub
横で開いてるIEを3行スクロールさせる方法教えてください。 excelは2000でIEは7です。
150 :
デフォルトの名無しさん :2007/12/26(水) 19:14:15
三流文系大に通う腐女子です。 以下のマクロ作成方法を教えてください。 プロシージャ「斜め移動」の作成 IncrementLeftとIncrementTopを組み合わせた「斜め移動」という名称のマクロ作成。 プロシージャ「四角移動」の作成 図形が四角形を描くように移動する(移動の軌跡が四角形になる)、 「四角移動」という名称のマクロ作成。For文は”1から1まで”とする。 ☆――→ ↑ | | | | ↓ ←―― プロシージャ「三角移動」の作成 「斜め移動」と「四角移動」を応用した、「三角移動」という名称のマクロ作成。 ただし正三角形でなくてよい。
>>133 どこかに不具合がある。例えば、暗黙的なセキュリティの問題に抵触してる。
ネットワーク上のファイルを開いての処理とか、クラスへのアクセスの仕方、等々。
エクセルは、何百MBのファイルでも、ページングしながらガリゴリ起動しようとしやがりますよ。
>>150 どう動かしたいかが良く伝わらない。
マクロを実行したら、画面上に既に設置してある部品を動かして元の位置まで戻したいの?
あと、移動の仕方に指定はないのか、部品は固定なのか、で、ここ重要、何が分からないの?
152 :
デフォルトの名無しさん :2007/12/27(木) 02:33:46
セルを複数選択できないようにする(単一セルのみ選択可能)にはどう記載すれば実現できますか?
153 :
デフォルトの名無しさん :2007/12/27(木) 11:43:39
CSVファイルにフッタが一行必ず入っているので、最終の行の一行前まで 読み込みさせたいのですが、 Do Until EOF(intFF) をどうすればいいのかわかりません。 お願いします・・。
>>152 これで目的の動作をするかどうかはわからないが・・・
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Cells.Count > 1 Then
ActiveCell.Select
End If
End Sub
>>153 一行ずつ読んで、EOFに達していたらそれが最終行なので処理をスキップする。
156 :
デフォルトの名無しさん :2007/12/27(木) 15:59:23
サンクスコ スレ違いの基準が分からんぽ
スレ違いとかいう奴うぜー いっそVB6スレと統合しろ
158 :
155 :2007/12/27(木) 18:25:58
>>156 >>2 >★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。
スレチ指摘がウザけりゃ、それこそVB6スレと分ける必要ないじゃん。別に俺だってどっちでもいいっつの。
アルゴリズムとかはVB6だろうけど 初心者はわからんだろうしなあ まあそのときの気分であしらってるけどね
161 :
デフォルトの名無しさん :2007/12/27(木) 19:19:39
>>158 >★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。
VBAの方が初心者が多いから、むしろVB6しかできないことのみ向こうのスレだよ。
すべてこちらに包含するという考え方もある。
自治厨が湧いてきました
自治厨とは俺様ルールを貫いてスレを仕切ろうとする奴のこと 2chのルールやスレのルールを指摘するのは自治厨行為ではなく 逆にそれを批判するのは、俺様ルールを貫こうとする自治厨行為である事実について
どっちでもいい。はやく次の質問へ
>>2 は別にこのスレの合意事項というわけではない。
過去スレのどこかで、誰かが勝手にテンプレに入れただけ。
なので、あまり気にするな。
そうでもないか
167 :
デフォルトの名無しさん :2007/12/28(金) 12:03:27
以下のケースでVBAの処理を止める方法は?(強制終了以外で on error gotoでmsgboxに行く仕様になっているため、 あと50000回くらいmsgboxをokし続けなければならない。 escを押しても、msgboxのok扱いにしかならない。orz
電源断。
169 :
デフォルトの名無しさん :2007/12/28(金) 12:17:23
enterをテープで止めて、トイレ行ってる間に 終わってた。
msgboxのあとプロシージャをぬければいいんじゃね
171 :
デフォルトの名無しさん :2007/12/28(金) 12:31:09
もう実行しちゃった後の話よ
50000回ぽっちで抜けるならエラートラップの無限ループじゃないんだな 50000回押せばいいよな
>> 167 混じれ酢するとCtrl + Break
174 :
デフォルトの名無しさん :2007/12/28(金) 13:15:17
ありがとうござます こんなキー初めて使うわ
>>174 押しっぱにすることで、無限ループを中断できたりするので、割と良く使うよん。
176 :
デフォルトの名無しさん :2007/12/28(金) 15:12:43
良からぬsiteを見ている途中に、excelが勝手にsaveを始めて あたふたすることってありますよね。
∨ |/-O-O-ヽ| ブツブツ・・・ | . : )'e'( : . | ` ‐-=-‐ / \ ||\ ̄ ̄ ̄ ̄ ̄ ̄ \ ||\\. \ ∧_∧ ||. .\\ \ ( ;´Д`) (オイ、なんか変なのがいるぞ) . \\ \ / ヽ. . \\ / .| | | . \∧_∧ (⌒\|__./ ./ ( ´,_・・`)目合わせるなって ∧_∧ . _/ ヽ \ ( ) うわー、こっち見てるよ
セル範囲から検索できるactivecell.findみたいな関数ありませんか? (D1)=MATCH("文字列",A1:C3,0) 的なことがやりたいんですが
ってここVBAのスレじゃん 失礼。出直してきます
180 :
デフォルトの名無しさん :2007/12/28(金) 22:22:11
いきなり長文にて失礼します。 生年月日の昭和・平成をまるで囲むため、中を透明にした楕円を描き、マクロの 自動記録でできた次のものを使用してきました。 ActiveSheet.Shapes.AddShape _ (msoShapeOval, 400.75, 110.75, 30.25, 10.5).Select Selection.ShapeRange.Fill.Visible = msoFalse Selection.ShapeRange.Fill.Transparency = 0# Selection.ShapeRange.Line.Weight = 0.75 Selection.ShapeRange.Line.DashStyle = msoLineSolid Selection.ShapeRange.Line.Style = msoLineSingle Selection.ShapeRange.Line.Transparency = 0# Selection.ShapeRange.Line.Visible = msoTrue Selection.ShapeRange.Line.ForeColor.SchemeColor = 64 Selection.ShapeRange.Line.BackColor.RGB = RGB(255, 255, 255) Excel2000〜2003では、普通に使用できていましたが、2007では楕円の内部が 黒く塗りつぶされてしまいます。 ネットや本で調べてみたのですが、図形描画については記述があまり見つからず 私のスキルでは、難しそうです。 ご教授願えると助かります。
2007でマクロの自動記録すれば?
>>181 さっそくの書き込みありがとうございます。
やってみたのですが、2007では図形描画は自動記録できないらしいです。
私の調べた範囲では、どうやらExcel2007の仕様らしいです。
したがって、自分でマクロを組むしかないらしいのですが・・・
>>182 うーん、確かにその通りだった。ごめん。
ShapeRangeのプロパティをヘルプで調べるしかないかなぁ・・・
連投すみません、180 ですが・・・ ちなみに"Set"を使って、次のようなのも試してみましたがだめでした。 Set MaruShape1 = ActiveSheet.Shapes.AddShape _ (msoShapeOval, 400.75, 110.75, 30.25, 10.5) MaruShape1.Fill.Visible = msoFalse MaruShape1.Fill.Transparency = 0# MaruShape1.Line.Weight = 0.75 MaruShape1.Line.DashStyle = msoLineSolid MaruShape1.Line.Style = msoLineSingle MaruShape1.Line.Transparency = 0# MaruShape1.Line.Visible = msoTrue MaruShape1.Line.ForeColor.SchemeColor = 64 MaruShape1.Line.BackColor.RGB = RGB(255, 255, 255)
>>183 184の書き込みが、前後してすみません。
アドバイスありがとうございます。
ShapeRangeのプロパティについてヘルプを調べてみます。
>>180 の最終行に
Selection.ShapeRange.Fill.Visible = msoFalse
を追加してもダメですか
>>186 ありがとうございます。うちのパソコンはExcel2007が入っていないので
明日、職場で確かめてみます。
ShapeRangeプロパティのヘルプのあたりは見てみたのですが、私のスキル
では、ちんぷんかんぷんです。
正直結構まいっています。
遅くまで、付き合ってくださってありがとうございます。
明日、結果を報告します。
うわー2007って全然違うな うちのチームの人2007で納めるやつの動確2003でやってるけど大丈夫か?
>>188 おいおい、それは危険。 ウチは、2003で納めるため、テスト機を2007⇒2003にした。
2005と2007はどうとでもなりそうだが、 2002は.NET1.0、2003は.NET1.1だからいろいろまずいぞ。
>>190 ごばくった。なんとなく話題が似てた(笑
2007だとシェイプの位置がずれるんだけど、なんで?
>>186 昨日のアドバイスがヒントになって解決しました。
Selection.ShapeRange.Fill.Visible = msoFalse
Selection.ShapeRange.Fill.Transparency = 0#
この2行を逆にしたらOKでした。ありがとうございました。
194 :
デフォルトの名無しさん :2007/12/30(日) 03:05:22
コマンドボタンを押すと、押したコマンドボタンを消したいのです。 CommandBotton1.visible=falseでも消えません。 CommandBotton1.BackStyle=0でも消えませんでした。 どのようにすれば消す、もしくは透明にすることができるのでしょうか? よろしくお願いします。
>>194 Excel2000で試してみたが、
フォームのコマンドボタンでも、ワークシートのコマンドボタンでも、.Visibleで消せたぞ?
そりゃBottonで消えるのはボットン便所ぐらいですから
197 :
デフォルトの名無しさん :2007/12/30(日) 04:24:05
>>195 これなのですが、エラーがでてしまいます。
コマンドボタンを押したら、コマンドボタンを消す。
Private Sub CommandButton1_Click()
CommandBotton1.Visible = False
End Sub
198 :
デフォルトの名無しさん :2007/12/30(日) 04:25:09
>>195 ちなみに、ワークシートのコマンドボタンです。
199 :
デフォルトの名無しさん :2007/12/30(日) 04:35:52
>>196 解決しました。ありがとうございました。
200 :
デフォルトの名無しさん :2007/12/30(日) 11:34:38
ExcelVBAで出来ないことってなにかある? 高級言語覚えたい気持ちもあるんだけど 今のところやりたいことはVBAでできてるからあまり覚えようという気にならないんだよな 高級言語にステップアップしていいことあるかな?
Excelが無くても動くアプリが作れる
VBAは高級言語だぞ。 実行がExcelに縛り付けられていることは、言語自体の話とは別。
203 :
デフォルトの名無しさん :2007/12/30(日) 15:23:09
折れの場合、vs2005express で、やってみようとしたけど結局、VBAにしか、関心が集まらなかった。イメージがわきやすいからだと思う。 Workbooks.Add(xlWBATExcel4Macrosheet) でexcel4マクロシートを作ってみたけど、これってマクロの管理に何かいいことあるのか?
エクセルのVBAでゲーム作って来いって課題が出たんだが、インベーダーみたいのを作るとして 玉の発射とかの解説してるサイトって無いですか? というか、シューティングゲーム作成の解説のサイトで良いのですが なかなか見付からない・・・
ったく、専学はパーの製造装置でしかないな
>>204 学校の課題レベルで、ゲームってそういうアクション性のあるゲームのことなのか?w
素直に、マインスイーパみたいなヤツでいいと思うよ。
正直、オススメしないぞ。後で行き詰って困ることになる気がする。
ゲームのオブジェクトを、フォームのコントロールにすれば、まぁできんことはないと思うが。
>>206 いや、全く持ってその通りなんですが、ほら、作ってみたいじゃないですかw
敵が一体、左右に動いて、自機も左右だけに動けるとこまでは出来たんだけど
あとは玉の発射と当たり判定と、当たったら画像が消えるくらいかなーと
excel2000のVBAで、材料一覧を印刷用にまとめる、材料表を作ったのですが 利用者が動かしていると、特定の行が消えてしまったりすることがあって困ってます。 そこで、いろいろと原因を探っているんですが、質問です。 シートの保護をかけていているシートで、行や列が突然消えるということってあるんでしょうか? ご教授願います。よろしくお願いします。
>>207 よく使う処理としては、弾の座標と、対象の中心座標+大きさ(距離) で衝突判定する方法。
オブジェクトを、丸形か正方形として認識させれば、そう難しいロジックにはならないと思われ。
211 :
デフォルトの名無しさん :2007/12/31(月) 10:27:56
今日も今日とて仕事でVBA
大晦日も仕事か お疲れ様です
213 :
デフォルトの名無しさん :2007/12/31(月) 13:33:39
いい句だなぁ。
214 :
デフォルトの名無しさん :2007/12/31(月) 15:45:45
かなり微妙な手当てが出たお
myPath = "C:\TEST\*.xls" If Dir(myPath) <> "" then Kill myPath End If だとDir(myPath)がオープンしっぱなしになるそうです。 どう書けば閉じるのでしょうか?
>>215 オープンもしてないモノを、どうしろと?
意味が分かってないなら、せめて本人に書き込ませろ。
ところで、あけおめ。
>>215 解釈1
if FileExists("hoge") then Kill "hoge"
解釈2
myPath = "C:\TEST\*.xls"
TargetPath=Dir(myPath)
Do Until TargetPath= ""
Kill TargetPath
TargetPath=Dir()
Loop
オープンは関係ないけどこのどちらかがやりたいのではないかと予想
開いていないファイルに書き込みパスワードが掛かっているか どうすれば判定できますか? ファイルをパスワードで開いてからだったら、 If ActiveWorkbook.WriteReserved Then とかで判定できると思うのですが、パスワードは 不明でその有無だけ判定したいのです。
>>216 知らないのか?
myPath = "C:\TEST\"
Dir(myPath)
RmDir myPath
してみろ。オープンされてるから
あけましておめでとうございます。
>>208 についてお願いしたいのですが・・・
>>219 ・・・・
RmDir myPath
そのまま実行してみろ
ヘルプ読んで出直せ
ポカーン
>>220 ちょっと考え方が違うな。 コンピュータはウソを吐かないもんだ。
保護を掛けてようがいまいが、意図せずデータが消えるなら、まずはVBAの不具合を疑え。
これだけ出回ってるメジャーなソフトで、アプリの不具合が隠れてる可能性は極めて低い。
1 2 3 1 10 20 30 2 ------------ 問題Y=1 問題X=1 回答Y=2 回答X=1 For i = 1 To 10 Cells(回答Y, 回答X) = InputBox(Cells(問題Y, 問題X) + Cells(問題Y, 問題X + 1), "問(i)") 回答X = 回答X + 1 問題X = 問題X + 1 Next ------------- InputBoxにセル内の任意の数字(この場合"10+20")と表示させたいのですが、 上記のコードの場合、30と表示されてしまいます セル内の数字を個別に表示させることは出来ますか?(真ん中に+などの記号を表示) また、問1、問2と表示させていくためにはどうすれば良いのでしょうか? この場合、問(i)で表示されてしまいます
+じゃなくて、&で結合すべし。 "問(i)"は、"問("&i&")"にする
>>225 Cells(回答Y, 回答X) = InputBox(Cells(問題Y, 問題X) & "+" & (Cells(問題Y, 問題X + 2)), "問(" & i & ")")
にしたら出来ました^
即レスありがとうございました!
227 :
226 :2008/01/01(火) 21:09:15
あ、問題X+2は問題X+1でした、失礼しました
>>223 そうですよね。VBAのテストをもっと増やしてみます。
ありがとうございます。
Excel 2003でXPです。 このプログラムを実行すると Dim commission As Integer Sub test8() commission = 90 If commission = 100 Then MsgBox ("手数料は100円です") End If End Sub コンパイルエラー End ifに対応するブロックがありませんというメッセージが出ます。 どこが悪いのでしょうか?
thenでかいぎょうすべし
232 :
129 :2008/01/02(水) 02:53:03
>セル2の入力を常に監視し、入力に変化があるたびにフォルダ内にその画像があるか調べ、あれば表示する。 すみません何をどうやったらいいのか全くわかりませんorz とっかかりでもいいのでヒント頂けないでしょうか よろしくお願いします
VBA初心者が使う本でこういうときはどうすればいいのっ??ってやつで お勧めは逆引きのやつとかですか? 他にいいのあります??
ググれば山ほどサンプルが出てくる
236 :
デフォルトの名無しさん :2008/01/02(水) 21:18:58
かんたんプログラミング Excel 2003 これが一番良かった
238 :
かな :2008/01/03(木) 11:25:29
Excelであみだくじつくりたいんやけど、どっかにサンプルないかな? セルつかうんじゃなくてちゃんと線を引いてやりたいんや?
239 :
デフォルトの名無しさん :2008/01/03(木) 12:43:46
しね
こんにちは。突然ですが いろいろ試してみたんですけど VBAで乱数の回数分だけループさせる方法ってやっぱり不可能ですよね?
全然不可能じゃないとおもうけど・・・
乱数って少数の端数が出てしまうじゃないですか。
244 :
かな :2008/01/03(木) 15:32:36
誰かおしえて?
ループさせたいだけなら一回目に発生させた乱数を変数に入れたら終わりな話だと思う
少数の端数てことはないだろ。
つCint
0になるだろ
CIntだろ
すごい釣りだなw
つMid(Rnd,3)
Replace(Rnd,".","")
Count = CInt(Rnd * N) + 1 hoge: 'ここで何かする Count = Count - 1 If Count >= 0 Then Goto hoge End If
254 :
デフォルトの名無しさん :2008/01/03(木) 18:34:00
ループ中に乱数の値ってどんどん変わっていくんじゃない?
256 :
デフォルトの名無しさん :2008/01/03(木) 20:18:11
質問です。 実際に開発する環境はXP excel 2003で 学習環境はvista excel 2007なんですが、 何か学習書を購入するとき、2007に対応したものじゃないと 理解は難しいのでしょうか? 2007に対応したVBA書はまだ少ないように感じるもので・・・
確かに2007で変わった部分はある。でも基本部分(構文とかそういうの)は変わってない。 2007用の書籍があればそりゃいいだろうけど、変わった部分を調べておけば別に古いのでも問題はないかと。
構文規則(VB部分)は変わってないけど オブジェクトメンバ(VBA部分)は結構変わったよ 一応古いメンバにもアクセス出来るようにはなってるが 新しいメンバより動作が遅かったりというデメリットもある 2007用だと新しい体系に関しての説明が主になるだろうから 実際の開発が2003なら、2003用か2002/2003/2007兼用版とかがいいかと
259 :
デフォルトの名無しさん :2008/01/04(金) 06:26:50
EXCEL2002でVBAを書いています。 マクロでセルにEXCEL関数を入力する際に、『シートの選択』ダイアログ[OK、キャンセル]が表示されます。 ダイアログを表示さない、もしくはダイアログのキャンセルを自動で押す方法はありますか? セルに入力しようとしている文字列 ='D:\[計算書.xls]20.1月'!$J$3 計算書.xlsの20.1月は存在しません。 下記、3つは記述済みです。 On Error Resume Next Application.ScreenUpdating = False Application.DisplayAlerts = False
260 :
256 :2008/01/04(金) 07:26:44
>>257-258 ありがとうございます。
詳しい解説があったほうがいいのでよく考えて選びます。
>>259 うちは出ない (2000, 2003)
>>259 再現した。 ワークシートの存在を確認するしかないかな?
Dim s As Worksheet
For Each s In Me.Worksheets
If UCase(s.Name) = UCase("20.1月") Then
s.Range("A1").Value = "='D:\[計算書.xls]20.1月'!$J$3"
Exit For
End If
Next
あるいは、可能であればワークシート別のイベントで処理させるとか。
264 :
かな :2008/01/04(金) 09:57:33
だれか教えてん♪
266 :
まな :2008/01/04(金) 10:52:16
すいません、XPでEXCEL2003です。 複数のセルに数式が入れてあるのですが、 その数式から導かれた値が、ある一定の値を超えた場合そのセル番号を表示させるプログラムを作ろうと考えています。 このようなことは可能でしょうか? もし可能ならどのようなプロパティやメソッドを使えばいいのか教えてください。 後は本も買ってきたのでできるだけ自分でやりたいと思いますので、ヒントだけでもありがたいです。
268 :
デフォルトの名無しさん :2008/01/04(金) 17:44:47
>261 EXCELの設定で表示しないようにできるんですかね・・・。 >262 NW.Cells(tate, yoko).Formula = Replace(str_cell, this_Date, Nxt_Date) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ↑ ='D:\[計算書.xls]20.1月'!$J$3 が入る ~~~~~~ ↑このシートは存在しない。 『シートの選択』ダイアログが表示される・・・。 >263 やっぱりダイアログが表示しますよね。ない場合シート作成させるしかないですかね・・・?
271 :
263 :2008/01/05(土) 11:58:51
>>268 シート作る必要があるの?
どうせエラー("#REF")になる式なんか入れないで、263の例みたいに空白のままじゃダメ?
>>270 どうせローカル変数名でしょ、New Worksheet の頭文字。てか、そこ突っ込まなくても・・・
272 :
デフォルトの名無しさん :2008/01/07(月) 17:08:47
XP、Excel2003で、改ページの枠を固定することはできるでしょうか。 この固定とは、保護等で管理者以外は触れないようにするということです。 ウィンドウの固定ではなく、改ページ範囲の固定です。 ご存知の方がいましたら、ご教授願います。
>>272 追記です。
結合したセルがあります。
そのセルに対する設定変更(書式、結合解除、フォント)は不可とし、
入力のみ可能とすることはできますか?
ご存知の方がいましたら、ご教授願います。
対象とするアクションが起こった場合にパスワード等を求めるとかじゃだめかな?
テキストボックスの余白自動設定解除に手間取った。 なんか簡単な方法ってないの?
「手間取ってる」ではなく「手間取った」ってことは 一応目的は達成されてるわけだよね ではそれを提示してください コード貼ってもブックをうpしても構いません そしたらそれより簡単な方法があれば教えましょう それが嫌ならさようなら
277 :
デフォルトの名無しさん :2008/01/08(火) 12:52:16
散々既出ぽい話題ですが、エクセルで、 先頭の0を消さずにcsvで書き出ししたいのですが、 以下の式では当然不可能で・・・ Option Explicit Sub eight() Dim eight As String Dim bigeight As String Range("a1").Value = 8 bigeight = Range("a1").Value + 100000000 MsgBox bigeight eight = right(bigeight, 8) MsgBox eight Range("A2").Value = eight MsgBox eight End Sub 関数で同じことをやると出来るのですがゴミデータが出て、 コンマの数が変わってしまいます。
変数の型について勉強しましょう 文字列数値と数値の違いを理解しましょう プロシージャ名と変数名を同じにするセンスを何とかしましょう
>>277 セルの書式設定(F) → 表示形式:ユーザー定義 → 種類(T):00000000 (8桁固定)
280 :
デフォルトの名無しさん :2008/01/08(火) 14:13:45
281 :
デフォルトの名無しさん :2008/01/08(火) 14:18:49
てか、そもそもセルに転記しなければ良いのか(・∀・;)
>>281 転記するにしても、セル(範囲)ごと持っていけば済むよ。
Range("A1").Copy Range("A2")
283 :
デフォルトの名無しさん :2008/01/08(火) 15:06:19
あ、表示形式ってマクロ記録できるんだ。 これで、解決・・・かな
礼も言えないゆとりであった
285 :
デフォルトの名無しさん :2008/01/08(火) 23:22:13
質問なのですが、ユーザーフォームの中に80コのテキストボックスを作りたい。 プログラムでループ文を使いテキストボックスを横に4×縦に20で一気に作る方法はありますでしょうか?
あります LeftとTopを調整しましょう コード教えては厳禁
287 :
デフォルトの名無しさん :2008/01/08(火) 23:50:48
調整とはユーザーフォームの設定ということですか? プログラムだけで可能なのですよね? もう少しだけヒントをお願いできないでしょうか?
別にそこまで厳しくせんでも。 Excel2003ではできる。 Set ctrl = Me.Controls.Add("Forms.TextBox.1") って感じに追加して、ctrlのプロパティを調整する。 MSFormsに追加するのに、これでいいのか?という気もするが。
289 :
デフォルトの名無しさん :2008/01/09(水) 00:14:18
できました!あとは80コスペースを空けて作る方法を考えてみます。 288さん有難う御座いました。
丸投げを助長する 寄生虫が増殖する らしいです
丸投げと、できるだけズバリなヒントを欲しているのとは確実に違うと思うわけだが。
292 :
デフォルトの名無しさん :2008/01/09(水) 14:20:42
278=284=290
礼なんぞいらん。邪魔。
295 :
sage :2008/01/09(水) 14:47:15
IDが無いと誰が誰かワカラン
296 :
デフォルトの名無しさん :2008/01/09(水) 18:11:06
質問です。 Dim c1 as Collection Dim c2 as Collection Set c1 = New Collection c1.Add "a" c1.Add "b" Set c2 = c1 この次に、 c1.Remove(1) 'c1の最初のアイテムを削除 とやるとc2のアイテムも"b"だけになりますよね。 これはたぶんc2が、c1と同じCollectionオブジェクトを 指しているためなんだな、と理解しています。 理解できないのは、c1.Remove(1)ではなく、 Set c1 = Nothing とした場合です。 c2もNothingになるのかと思いこんでいましたが、 実際c2には、"a"も"b"も、ちゃんと残っていました。 これはなぜでしょうか?
a=1 b=a a=0 にしてもb=0にならないのと同じ
「変数そのもの」と「変数が指す先」の区別を理解しませう。 set c1=nothingは、変数そのものへの操作で、変数が指す先にたいしては、 ほとんど影響しない。(唯一、リファレンスカウントにだけ影響するんだっけか。)
それはNothingキーワードが実体を解放するものではないため
数値の代入式の場合は、値そのものをコピーする。 オブジェクトの代入式の場合は、値を保存してある場所(参照)をコピーする。 なので、c1の要素を消すと、c2の要素も消えるが、 Set c1 = Nothing とした場合は、c1と値そのものとの関連が削除されるが、値そのものは残ってる。 全ての参照が削除された時点で、値そのものも削除される状態になる。
301 :
296 :2008/01/09(水) 20:12:40
>>298 >>299 >>300 レスありがとうございました。
よくわかった、つもりです。
次のような理解でよろしいでしょうか...
Set c1 = Nothing によって、変数c1に格納された参照は削除される。
しかし参照先の実体を、まだ変数c2が参照している。
そのため、実体はメモリ上に存続する。
このあとで更に、Set c2 = Nothing とすると、
実体を指す参照がすべて無くなる。
すると、その実体が自動的に解放される。
質問なんですが、 セルの値(自動で変化する)が変わった瞬間に所定のコードを実行する(JavaScriptでいうところのonchange見たいな)、 と言うのは如何すればいいんでしょうか?
changeイベントを使えばいいよ
>>303 dクスです
なるほど、ワークシート単位ではチェンジイベントがあるんですね。
早速やってみます。
1から10000までの数字を全部掛けたときに 末尾に並ぶ0の個数を求めるのをVBAでおながいします
>>305 というか桁数が膨大になるので計算機を使っても無理かと。
代数的な解法があるんじゃないですか?数学板の質問スレに質問しては?
じゃあ100まででもいいです
>>307 アルゴリズム次第では桁数は膨大にならないよ
だって総桁数を調べるのではなく、0の数を数えるだけだから
なんにしろスレ違いだけど
310 :
デフォルトの名無しさん :2008/01/10(木) 15:05:43
セルのコピー、ペーストをvbaで行った後に、コピー元のセルを囲っている 網のようなラインが消えないのですが、これをvba内で 解除するにはどうすればいいでしょうか。
>>310 Application.CutCopyMode = False
これはちゃんとExcel VBAの質問だな
312 :
sage :2008/01/10(木) 15:31:47
313 :
デフォルトの名無しさん :2008/01/10(木) 16:28:25
オートフィルタを使ってデータベースの集計をしているのですが 1列目 2列目 3列目 A B タイトル という風になっています。1列目と2列目は評価項目でA,B,C,D,E,Fのいずれかが記入されています 現在これをカウントしているVBAが、 3行目をオートフィルタで集計したいタイトルで搾り出す 1行目をAで抽出後、SubtotalでAの数をカウント 2行目をBで抽出後、Subtotalで… となっています。昔はこれで十分だったのですが、次第にタイトルが増えてきて 全部やるとなると膨大な時間がかかるようになってきてしまいました。 1つのタイトルに付き単純に12回抽出→数えるとやっているので… いちいちAで抽出→数える、Bで抽出→数える…と繰り返さずに、 タイトルで絞った後にCoutIFのようにAはいくつ、Bはいくつみたいな具合でやる方法はないでしょうか? CountIFだと非表示のセルのA〜Fまで集計してしまって困っています
314 :
デフォルトの名無しさん :2008/01/10(木) 16:39:34
よーわからんけど.. Sub hogera_vs_mogera() For i = 1 To 8 hoge = Range("A" & i).Value If hoge = "A" Then hoge_counter = hoge_counter + 1 Next i MsgBox hoge_counter End Sub
セルに名前が "hoge" とついてる場合 range("hoge").value = "ほげほげ" と操作できますが この名前 "hoge" の行 列の値を得る方法を 教えて下さい hogeが(1,5)なら int row = 1 int col = 5 のように得たいです。
Range("hoge").Row Range("hoge").Column
318 :
デフォルトの名無しさん :2008/01/10(木) 23:06:12
質問なのですが、 Public Type SyainData Id As Long Name As String End Type Dim Kyo(5) as SyainData と宣言しループ処理で関数の引数として2番目のNameを渡したいのですがどうすればいいですか?
Kyo(2).Name
320 :
デフォルトの名無しさん :2008/01/10(木) 23:23:03
319さん、ByRefコンパイルエラーと表示されます。
321 :
デフォルトの名無しさん :2008/01/10(木) 23:26:15
319さん ちなみにAユーザーフォームからNameに入力して 標準モジュールに定義してある構造体にそれぞれ格納した値をBユーザーフォームに出力したいのです。
関数の呼び出し方と、関数の定義くらい書いたら? (先頭の、Sub/Function〜の行) 判断する情報が少なすぎる。
323 :
316 :2008/01/11(金) 09:24:37
324 :
デフォルトの名無しさん :2008/01/11(金) 10:14:12
VBAで実行中に「vbcritical」と共に、「400」って 数字が表示されるエラーはなんですか?
325 :
デフォルトの名無しさん :2008/01/11(金) 14:21:13
msgboxやinputboxの外観をもっと可愛くしたい!
326 :
デフォルトの名無しさん :2008/01/11(金) 14:33:31
スマン連投・・・
>>325 はどうでもいいです
VBAを含むxlsを「共有」した途端に、そのvbaの挙動が微妙に変わってしまいました。
vbaの内容は、セル範囲をrangeで指定して、最下行にペーストするだけなんですが・・・。
なんか、ちょっとずれる感じなんです。ウィンドウの固定が原因かも。
共有と同時にVBAがロックされるので、原因の確かめようが無い状態(T-T
質問の仕方すら何かズレてるみたいだし、しょうがないね。 そういう星の下に生まれたんだよ。
328 :
326 :2008/01/11(金) 16:19:52
共有の関係で、ペースト先の結合がバラバラになった模様・・・orz こればっかりはどうしようもないですかね 保護されたセルに書き込むというのはvbaで何とかなりましたが・・・
330 :
デフォルトの名無しさん :2008/01/11(金) 18:07:53
>>329 なるほど、カイル君が使えるんですね・・・
ありがとうございます
winxpでExcel2003を使用しています。 VBA-Editorからの実行は正常で、ワークシート上のコマンドボタンからの実行だと 時々、Excelが強制終了します。 コードは変えていないのに、上記の状況が発生しないときもあります。 バグだと思うのですが、発生しない時もあるので、原因がつかめません。 そんな事ってありますか?
>>332 あるよ。何か、以前にも出てたと思う。
クラスをインプリメントして、何かややこしいことしようとしてるヒトが居て、
エラーが出たり出なかったりするという話があった。基本的にはそれと同じ系統の問題では?
winxpでExcel2003を使用しています。 以下のコードは、都道府県ごとに1枚のデータシートを作成する処理なんですが、コードが1行づつどんな作業を意味しているのかがわかりません。 1行ごとにどのような処理をしているのかの説明をよろしくお願いします。長文で申し訳ありません。 Sub まとめ() Dim i As Integer 'カウンタ変数iの宣言 Dim n As Integer Dim MyS1 As Worksheet 'ワークシート型オブジェクトMyS1を宣言 Dim MyC As Worksheet Worksheets.Add before:=Worksheets("全国") ActiveSheet.Name = "data" Set MyS1= Worksheets("data") With Worksheets("全国") MyS1. Range(MyS1.Cells(1,1),MyS1.Cells(11,12))=.Range(Cells(1,1),.Cells(11,12)).Value End With i=12 For Each MyC In Worksheets If MyC.Name<> "data" Then n = 12 MyS1.Cells(i,1)=MyC.Name i=i+1 Do While MyC.Cells(n,2).Value<>"" MyS1.Range(MyS1.Cells(i,1),MyS1.Cells(i,12))=MyC.Range(MyC.Cells(n,1),Mc.Cells(n,12)).Value i=i+1 n=n+1 Loop End If
Sub まとめ()←死ね Dim i As Integer 'カウンタ変数iの宣言←死ね Dim n As Integer ←死ね Dim MyS1 As Worksheet 'ワークシート型オブジェクトMyS1を宣言←死ね Dim MyC As Worksheet←死ね ←死ね Worksheets.Add before:=Worksheets("全国")←死ね ActiveSheet.Name = "data"←死ね Set MyS1= Worksheets("data")←死ね With Worksheets("全国")←死ね MyS1. Range(MyS1.Cells(1,1),MyS1.Cells(11,12))=.Range(Cells(1,1),.Cells(11,12)).Value←死ね End With←死ね ←死ね i=12←死ね For Each MyC In Worksheets←死ね If MyC.Name<> "data" Then←死ね n = 12←死ね MyS1.Cells(i,1)=MyC.Name←死ね i=i+1←死ね Do While MyC.Cells(n,2).Value<>""←死ね MyS1.Range(MyS1.Cells(i,1),MyS1.Cells(i,12))=MyC.Range(MyC.Cells(n,1),Mc.Cells(n,12)).Value←死ね i=i+1←死ね n=n+1←死ね Loop←死ね End If←死ね
こんなひどい丸投げを久しぶりに見た・・・
replace "\n" "←死ね\n"
>>334 随分酷いコードだな
VBA始めて3日くらいの奴が書いたコードだろ
こんな下劣なコードの説明なんてまっぴらだぜ
ある意味、微笑ましいコードだなw VBならでは、とでも言うか。
340 :
334 :2008/01/13(日) 14:39:48
わからないのなら、レスくださらなくて結構です。 わかる方のみでお願いします。
要はググれということだ
>>340 判るんだけどさぁ、それを説明するのはスレ違いだし、そもそも野暮だろ?
馬鹿かどうかは重要じゃない 大事なのは写真だ
>>340 1行ずつ説明が必要とかいう時点でおかしいと思わないか?
Dim i As Integerにも説明が必要なのか?どのレベルでだ?
Dimが何を意味して、Integerが何を意味するかまで解説するのか?
あるいは内部でIntegerがどのように管理されているかまで必要か?
処理ってのはある程度の塊で説明するのが普通だろ?
「ここはクラスの平均点を計算する」みたいな感じでよ。
文法がわからないのであれば入門書買うなりググるなりすればいい。
ピンポイントなら教えてやれても全部教えろとか金取りたくなるわ。
写真なんかはどうでもいい。 動画だ。動画をよこせ。
クリーチャーが「あたしはできる女なのよ!」とか自己紹介してる動画とかか?
質問ですが、組み込みダイアログボックス(例えばApplication.Dialogs(xlDialogPrint).Show)の ウィンドウハンドルを取得するには、どうすればよろしいでしょうか? APIを使って行うと思いますが、Excel本体やユーザーフォームのウィンドウハンドルの取得であれば ググれば出てきたのですが、組み込みダイアログボックスのウィンドウハンドルの取得は 見つけることができなかったので、よろしくお願いします。
Spy.exe
351 :
デフォルトの名無しさん :2008/01/14(月) 06:14:32
>>334 i=12
iに12を設定する
For Each MyC In Worksheets
MyCごとの処理です
If MyC.Name<> "data" Then
n = 12
MyC.Nameがdataと違うときは、nに12を設定する
MyS1.Cells(i,1)=MyC.Name
i=i+1
MyC.NameをMyS1 の(12,1)に設定して、iを13にする
Do While MyC.Cells(n,2).Value<>""
MyCの(12,2)が空じゃなければ、以下の処理を繰り返す
MyS1.Range(MyS1.Cells(i,1),MyS1.Cells(i,12))=MyC.Range(MyC.Cells(n,1),Mc.Cells(n,12)).Value
MyS1の(13,1)から(13,12)に、 MyCの(12,1)から(12,12)を設定する
i=i+1
n=n+1
Loop
iを14に、nを13にして Do Whileに戻り、
MyCの(13,2)が空じゃなければ、また処理を繰り返す
MyS1の(14,1)から(14,12)に、 MyCの(13,1)から(13,12)を設定する
その次はMyS1の(15,1)から(15,12)に、 MyCの(14,1)から(14,12)を設定する
というふうに、iとnは1ずつ大きくなり、MyCの(n,2)が空になると処理をやめる
End If
352 :
デフォルトの名無しさん :2008/01/14(月) 07:47:13
教えたがりは一種の荒らし
中途半端なヤツほど、簡単な質問に答えたがる。 結局、自分自身の頭の整理をしてるんだろうな。
このスレ気持ち悪いよ
このスレ気持ち悪いよ
このスレ気持ち悪いよ
おいおいどう見ても皮肉のレスだろ 求めてる答えがあれなら質問の意味がないと思うぞ
だれも回答しないから自分で書いたんだろうな
質問スレって所で答えては駄目だと。じゃぁ、このスレの存在意義って何さ。
教えたがり撲滅
要は面倒なことはやりたくないだけだろw
>>362 > 質問スレって所で
そう、ここは質問スレであって、
自社商品を購入してくれた顧客相手のサポートセンターでも
受講料を支払ってくれた生徒相手のスクールでも無い
要は面倒なことはやりたくないだけだろ
ここは無知な人間をののしるためのスレに決まってんじゃん
昔はそれなりにレスが付いていたが、今となっては・・・ね
Excel VBA回答スレが必要だな
質問です。 OS: xp pro EXCELバージョン :2003 RGB値を使いセルの塗りつぶしを行いたいと思い、 Cells(1, 1).Interior.Color = RGB(227, 229, 223)と記述しました。 しかし実際セルの色を見てみるとまったく違う色が塗られていました。 色を解析するソフトでその色のRGB値を調べてみるとRGB(204,255,204)でした。 もうわけわかりません、アドバイスお願いします。
>>371 RGB(255, 0, 0)なら赤になるか?
なるならcells( i, j )にRGB( i, j, 0 )を入れたときに正しいグラデーションになるか?
RGB解析ソフトでRGB(255, 0, 0)等が正しく読み取れるか?
これくらい試してみてくれないか?
>>372 ありがとうございます、試してみました。
RGB(255, 0, 0)なら赤になるか?→ なりました。
cells( i, j )にRGB( i, j, 0 )を入れたときに正しいグラデーションになるか?
→
For w_row = 1 To 256
For w_gyo = 1 To 256
ThisWorkbook.Sheets(3).Cells(w_row, w_gyo).Interior.Color = RGB(w_row, w_gyo, 0)
Next
Next
を試したところ正しいグラデーションにはなりませんでした。
参考画像です。
ttp://nagamochi.info/src/up0296.jpg ツール→オプション→色で表示したい色を追加すると表示できました。
これ以外には方法はないのでしょうか?
>>371 エクセルは全てパレット管理。
パレットの色しか表せない。パレット以外の色をVBA等で選んでも近いパレットの色を使用させられる。
↓
すなわちパレットを変更すればいい
>ツール→オプション→色で表示したい色を追加すると表示できました。
>これ以外には方法はないのでしょうか?
その表示できた方法をマクロの記録で記録してやればいい。
>>374 解決できました、ありがとうございました。
377 :
334 :2008/01/15(火) 11:42:32
>>351 そんなことを聞いているわけじゃありません、冗談は勘弁してください。
もっと言ったれw
379 :
デフォルトの名無しさん :2008/01/15(火) 18:52:50
>>334 =377
ぷっっ て、ところだけど、何をききたいのか、言ってみたら。
折れが笑ってあげるからw
380 :
379 :2008/01/15(火) 20:05:12
解決しました
381 :
デフォルトの名無しさん :2008/01/15(火) 20:49:36
>>380 おまい、アンカーもようつけんで、・・・www
382 :
379 :2008/01/15(火) 20:52:47
383 :
379 :2008/01/15(火) 21:08:38
384 :
379 :2008/01/15(火) 21:32:44
>>373 どうでもいいが、RGB()関数って256を指定してもエラーにならないのか、知らなかった。
項目とデータを含んだ2次元配列変数A,B たとえばA(30×2),B(100×2)があり、 Bの100個の項目のなかからAの項目30に該当するものをそのままAのデータに代入したい ということを考えています。ワークシート上で行う場合はlookup関数を使えばよいのですが マクロのままで高速に行う方法はないものでしょうか? ワークシート関数を使ったとしても一度ワークシートにデータを書き出さなければ つかえないのでしょうか?色々調べても分からなかったので どなたか御教示頂けると嬉しいです。
>>387 ん? というか、既に処理を書いてるんだったら、
VBAで処理してからワークシートに吐いた方が、そりゃ若干早いはずだと思うが。
あ、すみません。Bの項目、データは揃っていますが、Aは項目だけで B100個の項目の一部でAの30個の項目と重複しているものを検索、抽出して Aの該当する項目のデータとして代入しようとしています。 ワークシートの上でやるのなら、lookup関数をつかえば良いのでしょうが ワークシートを一切いじらずに配列の内部処理だけで同様な操作を高速に できないかと悩んでいる次第です。
>>389 Dim i, j As Integer
Dim AKey(30), AValue(30), BKey(100), BValue(100)
For i = 0 To 29
For j = 0 To 99
if AKey(i) = BKey(j) Then AValue(i) = BValue(j)
Next j
Next i
こういう事かな?
この程度の個数ならワークシートでやってもほぼ一瞬だと思うけど。
391 :
デフォルトの名無しさん :2008/01/16(水) 17:41:03
質問。 セル[A2:C2]に英語・数学・国語の得点が入っている。合計点を計算し、 セル[D2]に入れるマクロを作成しなさい。 また、合計点が270点以上の時には「大変よくできました」、 180〜269点のときには「よくできました」、 180点未満のときには「がんばろう」というメッセージをセル[E2]に表示しなさい。 英語の得点は90点 数学の得点は85点 国語の得点は100点 とする。 よろちくね。
>>391 それは質問とは言わないような・・・。
Sub Macro()
Range("D2") = Range("A2") + Range("B2") + Range("C2")
Select Case Range("D2")
Case Is >= 270
Range("E2") = "大変よくできました"
Case Is >= 180
Range("E2") = "よくできました"
Case Else
Range("E2") = "がんばろう"
End Select
End Sub
デフォルトプロパティの省略はやめましょう 少なくとも他人にコードを渡すときは
2007で作ったマクロは何であんなに重くなるんだ。 一旦5.0で保存したら軽くなったんだけどまともに動かなくなるし。 これから2007が標準になっていくのかと思うと憂鬱だ。
うちの会社、未だに2000使ってて、GJ!!! 自宅の自前PCも、2000のまま。サポートし続けろよ>MS
Office 2000 メインストリーム サポート : 2004 年 6 月 30 日終了 延長サポート 期間 : 2004 年 7 月 1 日から 2009 年 7 月 14 日まで (修正プログラム サポートには最新のサービス パックがインストールされている必要があります)
397 :
デフォルトの名無しさん :2008/01/17(木) 10:00:49
>>390 ありがとうございます。
やりたいことはそういうことなのですが、
その書き方だと要素が膨大になった時は明らかに遅くなると思います。
VBA上で高速に行う書き方などご存知ありませんでしょうか?
>>397 アルゴリズム的な話なら、手法はいろいろあるが、「VBA上で高速に行う書き方」ではなく
「VB言語で高速に行う書き方」になるので、例えExcelでやるとしてもスレ違いだよ
>>2 ★3★4
>>397 参照される側(ここではB)をCollectionにすればO(n)なるよ。
Dim i As Integer
Dim AKey(30), AValue(30)
Dim B As New Collection
For i = 0 To 29
AValue(i) = B.Item(AKey(i))
Next i
各都道府県に分けられているデータをdataという名前のシートに集計するプログラムを作成したいです。 簡単に言いますと1つのシートに47個のシートを入れたいです。 よろしくお願いします
401 :
デフォルトの名無しさん :2008/01/17(木) 12:51:36
>>400 >1つのシートに47個のシートを入れたいです。
意味不明
1つのブックに47個の県別シートを作りたいという意味なのか?
逆に県別に47個あるシートから1つのdataって言う名前のシートに集計したいってことなのか?
どのセルに何をどういう条件で集計するのかも書いていない。
403 :
デフォルトの名無しさん :2008/01/17(木) 22:54:26
質問です、VBA構造体配列を初期化したいのですがどうすればいいですか? 調べたのですがよくわかりませんでした。
初期化用の構造体を作って代入
初期化用関数作る
406 :
デフォルトの名無しさん :2008/01/18(金) 01:31:22
403です。 404.405さん以外のやり方を探しているのですがEarseの使い方やZreoMemoryの使い方がわからないです
>Earseの使い方やZreoMemoryの使い方がわからないです そりゃそうでしょう、そんなものありませんから。
409 :
デフォルトの名無しさん :2008/01/18(金) 11:59:04
VBAを実行する前に、このブックが共有されているかどうか 調べて、結果を返す方法は無いでしょうか。
>>409 Workbook.MultiUserEditing で調べられるけど、これはVBAだからダメってこと?
VBA実行してからまたきてね♪
412 :
デフォルトの名無しさん :2008/01/18(金) 12:31:44
ありがとうございます! いえ、multiuserediting の存在を知りませんでした・・
413 :
397 :2008/01/18(金) 14:55:18
414 :
デフォルトの名無しさん :2008/01/18(金) 18:11:23
使えねーな
415 :
デフォルトの名無しさん :2008/01/18(金) 19:41:23
Worksheet_Changeで対応できない書式の変更にリアルタイム反応するためユーザーが入力した書式などをリアルタイム監視するプログラムを作成したところ、終了条件の問題に突き当たり処理に悩んでます。 '----------------------------- Private EndFlg As Boolean Sub Worksheets_Activate EndFlg = False Call 監視処理 End Sub Sub Worksheets_Deactivate EndFlg = True End Sub Sub 監視処理 Do (処理) DoEvents Loop Until EndFlg = True End Sub '------------------------------ このようなものが、ほとんどのワークシートに書いてある状態です。 Loop Until EndFlg = True の直後にメッセージボックスを設け確認したところ、Worksheet_Activateのあるシートに移動するとその場では終了せず、Activateのないシートに移動した瞬間に終了します。 たとえばActivateのあるシートA、BとActivateのないシートCがある場合 A→C、B→Cは正常な終了が確認できるのですが A→B、B→Aは終了メッセージが出ません。 A→B→A…を延々繰り返したあとにCを選択すると、終了メッセージがA⇔Bした回数に比例して複数出るため多重起動であると断定できました。 Activateのないシートをはさまずに開放する方法ありませんでしょうか。
TextBox1の入力に応じてlistboxの内容を決め、 クリックされた項目とTextBox1の入力を考慮して TextBox2の内容を決めるということをやろうとしています。 後述のように書こうとしました。 Private Sub TextBox1_Change() '入力に応じてワークシートからhaniにアドレスを取り出す 以下略 With UserForm1.ListBox1 .ColumnCount = 1 .RowSource = hani.Address End With End Sub Private Sub ListBox1_Click() '先ほどの入力とリストの結果からテキスト2の内容を決める。 UserForm1.TextBox2.Value = 以下略 End Sub このようにするとPrivate Sub TextBox1から Private Sub ListBox1_Click()に受け渡されるのは haniの内容だけで、それ以外の変数を渡そうとしても 上手くいかず困っています。callの構文を使えば良いのでしょうか? 色々調べてみても判らずどなたかアドヴァイス頂けると嬉しいです。
初歩的ですみません。 VBAで、あるセル範囲にある数式の答えを出力するにはどうすればいいんでしょうか? Range("A1:A5")="b2/2+b5"みたいにすると数式がそのまま出力されるし・・・
>>417 それが初歩的だとわかるぐらいならじゅうぶん中級車さ
>>415 ループが入れ子になってると思う。
監視処理を各シートにを書くんじゃなくて、どこか一枚に
Sub 監視処理
Do
if !SheetA.EndFlg(0) = False Then (処理)
if !SheetA.EndFlg(1) = False Then (処理)
・・・
DoEvents
Loop Until 監視終了=True
End Sub
とか何とか書いて、実行しておけばいいんじゃないかな?
>>416 言ってる意味がよく判らないけど、
TextBox1_Change()内で使ってる変数を、ListBox1_Click()内でも使いたい、
と言う事なら、グローバル変数でも使えばいいんじゃないの?
>>417 Range("A1:A5") = "=b2/2+b5"
>>415 DoEvents ステートメントは、ウィンドウズメッセージとイベントプロシージャの処理が終わるまで
戻ってこないから、多分、AのDeactivate⇒即座にBのActivateが走ってる状態。
ちょっと構造を見直した方がいいかもね。
OS XP、Excel2003 普段は、VBエディタから 挿入 → 標準モジュール で Module** といったファイルを作成してコードを書いています。 このModule** というファイルを自分の好きな名前にするのにはどうしたら良いのでしょうか?
右クリックの名前を変更かF2でできたと思う。
423 :
421 :2008/01/19(土) 19:16:55
>>422 ご解答ありがとう御座います。
しかし、右クリックしても「名前を変更」が見つかりません。
また、F2ではオブジェクトブラウザという表示になるのですが
名前を変更する方法がわかりません。
分かる方みえましたらお願いします。
>>423 プロパティウィンドウ→オブジェクト名を変える
>>423 プロパティウィンドウの、(オブジェクト名)を変更すると変わる。
426 :
416 :2008/01/19(土) 21:26:44
>>419 ありがとうございます。グローバル変数にしたら解決しました。
また基本的な質問ですみませんが
マクロを起動した瞬間にリストboxに
候補を表示させようとしました
Private Sub UserForm1_initialize()
Set com1_r = Range("A1:A5")
With UserForm1.ListBox2
.ColumnCount = 1
.RowSource = com1_r.Address
End With
End Sub
のように書いても表示されません。
他のPrivate Sub TextBox1_Change()等に
書いた時は表示されるのですが
一体何が誤っているか御指摘頂けませんでしょうか?
427 :
421 :2008/01/19(土) 21:29:38
>>424 >>425 教えて頂いた方法で出来ました。
大変ありがとう御座いました。お二人に幸あれ。
>>426 そのコードをそのままこちらで実行してみたけど、問題なく動いたよ。
何か別の場所でミスしてるんでは?
例えば、
値を表示させたいリストボックスのオブジェクト名が ListBox2 ではなく ListBox1 だった、とか
代入元のセル A1:A5 の値がマクロ起動時には空白だった、とか。
今一度、確認すべし。
429 :
質問 :2008/01/19(土) 22:40:54
>>428 Private Sub UserForm1_initialize()
だとgeneralになっていたので
Private Sub UserForm_initialize()
に直すとUserFormになって動きました。
作ってるのはUserForm1なのに不思議ですね。
ともかく有難うございました。
>>430 画面のコントロール以外(フォーム、クラス等)のイベントプロシージャ名は、
オブジェクト名に影響されないハズなんだけどね。何でだろ?
でも、言われてみれば違和感あるよな。今気づいたw
432 :
429 :2008/01/19(土) 23:52:15
>>429 メニューの、ツール ⇒ オプション ⇒ [ドッキング] タブ を確認してみて。
>>400 47個あるシートから1つのdataと言う名前のシートに集計したい場合は多分これです。
Sub test()
Dim ws As Worksheet
Dim r As Range
Dim rr As Range
With Worksheets("data")
Set rr = .Range("A1")
For Each ws In Worksheets
If ws.Name <> .Name Then
Set r = ws.Range("A1").CurrentRegion
rr.Resize(r.Rows.Count, r.Columns.Count).Value = r.Value
Set rr = rr.Offset(r.Rows.Count)
End If
Next
End With
End Sub
range変数で格納できる範囲はRange(Cells(1, 1), Cells(5, 4)) のような一枚のワークシート上の範囲だけでなのでしょうか? 1枚目のRange(Cells(1, 1), Cells(5, 4))と2枚目のなんたらのように 別のsheetにわたった範囲の格納などしたい場合はどうすればいいのでしょう
>>436 それは無理。 クラスの概念を知らないと分からないかもしれないけど。
別々の変数に持たせるしかないと思う。もちろん、配列やコレクションは使えるはず。
Excelの分析ツールを使ってランダムにサンプルを取り出して計算するシート作ったのですが Application.ScreenUpdating = False て書いてもサンプル取り出すたびに再計算画面が出てしまいます 画面更新しないようにするにはどうしたらいいですか? Sub MonteSample() Dim myMonte As Integer Dim i As Integer Dim myMsg As String, myTitle As String Dim myFun As Range Dim myAv As Long, myStd As Long, myMax As Long, myMin As Long Dim n As Long Dim mysouce As Range Dim mydat As Range Dim mydats As Range myMsg = "計算回数を入力してください" myTitle = "モンテカルロ・シュミレーション" myMonte = Application.InputBox(prompt:=myMsg, Title:=myTitle, Default:=30, Type:=1) If Range("A12") = "" Then MsgBox "A12のセルから損益のデータを入力してください", vbOKOnly + vbExclamation End End If Range("D12:D1011").Select Selection.ClearContents Range("K32:K100").Select Selection.ClearContents Range("i32:i33000").Select Selection.ClearContents Application.ScreenUpdating = False
For i = 1 To myMonte Range("A12").Activate Set mydat = ActiveCell.CurrentRegion Set mydats = mydat.Offset(1, 0).Resize(mydat.Rows.Count - 1, _ mydat.Columns.Count) Application.Run "ATPVBAEN.XLA!Sample", mydats, _ ActiveSheet.Range("D12:D1011"), "R", 1000, False Range("I65536").End(xlUp).Offset(1).Select ActiveCell.Value = Range("E1011") Range("D12:D1011").Select Selection.ClearContents Next i Range("N4").Value = myMonte Range("I31").Activate Set myFun = ActiveCell.CurrentRegion myFun.Offset(1, 0).Resize(myFun.Rows.Count - 1, _ myFun.Columns.Count).Select myAv = Application.WorksheetFunction.Average(myFun) Range("N5").Value = myAv myStd = Application.WorksheetFunction.StDev(myFun) Range("N6").Value = myStd myMin = Application.WorksheetFunction.Min(myFun) Range("N7").Value = myMin myMax = Application.WorksheetFunction.Max(myFun) Range("N8").Value = myMax Range("K32").Value = myMin Range("K33").Select
For i = 1 To 49 n = ActiveCell.Offset(-1).Value ActiveCell.Formula = Int((Abs(myMin) + myMax) / 49) + n ActiveCell.Offset(1).Select Next i Range("L32:L81").Select Selection.FormulaArray = Application.WorksheetFunction.Frequency(myFun, Range("K32:K81")) Set mysouce = Range("L32:L81") ActiveSheet.ChartObjects(1).Activate ActiveChart.SetSourceData Source:=mysouce, PlotBy:=xlColumns Application.ScreenUpdating = True End Sub
441 :
デフォルトの名無しさん :2008/01/20(日) 21:03:23
Application.ScreenUpdating = False Application.ScreenUpdating = True ↓ Application.EnableCalculation = False Application.EnableCalculation = True
>>441 再計算しない場合はそんなのあるのか、ありがとう。
でも、変えてみたけど実行時エラーでてだめだった、
ワークシートで再計算してるから使えないのか
ワークシートの再計算はそのままで画面の更新だけ止めるのはできないのかな
443 :
441 :2008/01/20(日) 22:05:30
折れには、試す気もないのでわからない。 続けての回答を待っているといけないから、折れには以後書くことはないと伝えておくよ。 あと、折れが使うのは Application.EnableEvents = False (と True) Application.Visible = False (と True)
>>443 いろいろありがと
新しいこと少し覚えられてよかったw
まあ、うまくいかなかったけど趣味で使ってるだけだから
そのうちできるようになると思うのでゆっくりやります
>>442 全くためしてないんだが
Application.ScreenUpdating = 画面の更新をするか
Application.EnableCalculation = 再計算してるか
を考えれば幸せになるんじゃね?
俺的には全部コードでやっちゃうがw
446 :
441 :2008/01/21(月) 01:01:55
>>445 >>446 ありがとうございます。
441さんの指摘のようにapplication.runが原因みたいです
Excelの分析ツール使うと画面更新されてしまうみたいです
ワークシート上だけで乱数関数使って同じようなコードで実行したら、
画面は更新されないでうまくいきました。
鋭い指摘ありがとう!
448 :
デフォルトの名無しさん :2008/01/21(月) 15:40:17
例えば、C3からK11まで範囲指定するのに、 rangeを使わず、offsetを使って指定することは可能でしょうか。 やりたいことをイメージ化すると以下のようなのですが・・・ Sub hoge() Range("A1").Select Range(ActiveCell.Offset(2, 2).Select, ActiveCell.Offset(10, 10).Select).Select End Sub
あのさ、 いちいちこのスレで聞くよりもさ、 自分でググるなり本を買うなりして調べた方が圧倒的に早いと思うんだけど。
range("A1").select range(selection.offset(2, 2), selection.offset(10, 10)).select -- dim r as range set r = range("A1") debug.print range(r.offset(2, 2), r.offset(10, 10)).address range(r.offset(2, 2), r.offset(10, 10)).value = 12345
>>448 つか、目的がよくわかんねーよ。 あと、その例文、.Offset に .Select付いてたらエラーになるぞ。
そもそも、Offset って、基本的にRangeのプロパティなんだが。Rangeを使わずにどうしろと?
If 気に入らない or わからない Then スルーしろ End If
意味が分かれば協力する気持ちがあるから訊いてるんだよ。全否定すんな。 それとも、どこが分からないか、こちらが分かりやすく優しく丁寧に質問しないとダメなのかよ?
454 :
448 :2008/01/21(月) 17:19:29
すまん! Sub hoge() Range("A1").Select Range(ActiveCell.Offset(2, 2), ActiveCell.Offset(10, 10)).Select End Sub selectとったらいけました。 逝ってくる
>>453 やりたいことの「イメージ」って書いてるだろ。
これで意図がわからんというのがわからん。
457 :
451 :2008/01/21(月) 21:10:50
>>455 レスの流れぐらい見ろよ。レスから読み取れる範囲で回答はしてる。
それとも、IDがないと同一人物かどうかも判断できんか?
構造体の2次元配列の参照って Kouzoutai(1,2).Member = 1 という形であってます? オブジェクトが必要ですとかいうエラーが返ってくるんですが…
すごいな。
もう思いついたことをとりあえず質問するスレになってるな。
>>458 なんてはなっから自分で調べる気ないもんな。
>>458 オブジェクトがないんだよ。
Dim Kouzoutai( 5, 5 ) as HOGE
って形になってるか?
どうせ
Type Kouzoutai
Member as integer
End Type
とかになってんだろ。
「VBA 構造体」でググればびっくりするくらいヒットするじゃないか。
461 :
デフォルトの名無しさん :2008/01/22(火) 07:24:11
OSはWindows XP Home Edition、 Excelは2003の11.8169.8172です。 VBA初心者でここも初めてです。質問させてください。 2種類のグラフをそれぞれ別のシート上のオブジェクトとして作成しました。 (2つ同時ではなく、まず1つ目のグラフを作り、その後別のグラフを作るというやり方です。) 2つ目のグラフを作る際、1つ目のグラフの数値軸で自動的に表示された軸の最大値と最小値を 2つ目のグラフにも反映させたい(同一の値にしたい)のですが、 どのように記述すれば1つ目のグラフの最大値や最小値を呼び出すことができますか? With ActiveChart.Axes(xlValue) .MinimumScale = ココと .MaximumScale = ココです。 End With ぜひヒントがほしいです、よろしくお願いします。
>>461 確認する時間がないのでヒントのみ。 あとはヘルプ見ながら直して。
Dim s As Worksheet
Dim c As ChartObject
Set s = Worksheets.Item("test") ←"test" って名前のシートが取得できる
Set c = s.ChartObjects(1) ←取得したシートの、1つめの図を取得
あとは c.Chart.Axes.Item(xlValue).MinimumScale な感じで対応する値が取得できると思われ。
まとめて書くこともできるが、とりあえず入力補助に反応する書き方にしといた。
E6からE26とN6からN26に数字を入力したのですが、このコードよりも簡単な方法はないでしょうか? Dim c As Long Dim f As String Dim v1() As Variant Dim v2() As Variant With Excel.Range("E6:E26,N6:N26") c = .Areas.Item(1).Count f = "ROW(" & .Worksheet.Range("A1") _ .Resize(c).Address & ")" v1 = .Application.Evaluate(f) v1 = .Application.Small(.Cells, v1) f = "ROW(" & .Worksheet.Range("A" & 1 + c) _ .Resize(.Areas.Item(2).Count).Address & ")" v2 = .Application.Evaluate(f) v2 = .Application.Small(.Cells, v2) .ClearContents .Areas.Item(1).Value = v1 .Areas.Item(2).Value = v2 End With
>>463 観光客の人数をExcelで作成したのですが、E6からE26とN6からN26
に観光客の人数を入力したのですが、これを小さい順に書き換えるにはどうし
たらいいのですか?
つ【並べ替え(S)】
「セルが特定の値以外のとき、自分の行を削除」したい。 IFでセル内容を指定してから Range.deleteでどうやって削除条件にすべきでしょうか。
な、何なんだこのスレは・・・
このスレは池沼のフリして教えたがりのうざいヲタを釣るスレですが、なにか?
ってことはこれは釣れたってことでFA?
471 :
デフォルトの名無しさん :2008/01/22(火) 22:49:21
やたー☆
やったー +1
474 :
デフォルトの名無しさん :2008/01/23(水) 18:41:55
ここで良いかどうか分かりませんが・・・ ビデオカードの現在の解像度(できればモニタのインチ数も)によって、 ActiveWindow.Zoomの値を変更するプログラムを考えているのですが、 vbaでビデオカードの現在の解像度を調べるのは不可能でしょうか?
475 :
デフォルトの名無しさん :2008/01/23(水) 21:16:04
>>474 vba api 解像度 でぐぐれば、2番目にあなたの望む回答が
476 :
デフォルトの名無しさん :2008/01/24(木) 08:57:54
良回答認定
477 :
デフォルトの名無しさん :2008/01/24(木) 09:11:24
>>475 ありがとうございます!
下調べはしてたつもりだったのですが、
甘かったです・・・orz
478 :
デフォルトの名無しさん :2008/01/24(木) 10:01:12
恥ずかしながら全く分かりません。 何卒お願い申し上げます。 次の選択肢より正しい記述をすべて選びなさい。 1:java.io.FileReaderはテキストファイルから文字を行単位で読み込むクラスである。 2:new File("bbs.txt")と記述すると、新しいファイルが作成される。 3:ファイルの操作を行う前には、Fileクラスのopenメソッドを必ず使用する。 4:BufferedReaderクラスのreadLineメソッドは、ファイルの終端までを読み込む。 5:FileクラスのisFileメソッドの戻り値がfalseだった場合は、そのファイルが無いか、またはその名がディレクトリである事を示している。
479 :
デフォルトの名無しさん :2008/01/24(木) 10:06:39
>>478 です。
申し訳ありません、スレ違いでした。
失礼致しました。
480 :
デフォルトの名無しさん :2008/01/24(木) 10:33:36
アクセスのVBAのスレが見付からないのでここで質問します。 アクセスのVBAで、フォーム1 ユーザ登録画面 ユーザ名[ ] パスワード[ ] 登録 があり、2つを入力し、登録を押したら登録できるのを教えてください
481 :
デフォルトの名無しさん :2008/01/24(木) 10:37:07
>>478 です。
何度もすみません。もうこのスレに書いてしまったので、
ほかのスレに書いたら、マルチポストとか云うのに
なってしまいますので、もしよろしければこのスレで
教えて頂けないでしょうか?
>>481 誤爆はマルチにはならないと思うよ。
マルチポストだって言うヤツは居るかもしれんが、普通に教えて貰えると思う。
俺も多少は分かるけど、このスレで回答したくない。回答が違ってても突っ込みがなさそうだから。
483 :
デフォルトの名無しさん :2008/01/24(木) 11:06:44
>>482 さん。
ありがとうございます。
助かりました。
484 :
デフォルトの名無しさん :2008/01/24(木) 12:07:30
AutoFilterが設定されたシートで選択されたセルの行数を知るには、下記の方法で 出来る事が分かったのですが、もっと簡単な方法がありますでしょうか? Dim r As Range, rcnt As Long rcnt = 0 For Each r in ActiveWindow.Selection.Rows If Not r.Hidden Then rcnt = rcnt + 1 End If Next
485 :
デフォルトの名無しさん :2008/01/24(木) 17:23:24
すいません、VBA超初心者です。 "地域A"というシートから魚名前を検索して個数(魚の名前の2つ下のセル)と総量(個数のセルの1つ右)の数値を 台帳(以下の記述ではシート名”漁獲量”)シートの各魚の行に転記させたいのですが、 一生懸命ヘルプやネット検索しながら自己流で記述しましたが 「オブジェクトは、このプロパティまたはメソッドをサポートしていません。」 と出ます。 どなたか正しい記述をアドバイスしていただけませんでしょうか?
486 :
485 :2008/01/24(木) 17:24:49
Private Sub CommandButton1_Click() Dim fish As String Dim i As Integer Dim wrkA As Integer Dim wrkC As Range Dim wrkB As Range With Sheets("地域A") wrkA = .Cells(1, Columns.Count).End(xlToLeft).Column wrkC = .Range("A1").Resize(1, wrkA) wrkB = .Range("A3").Resize(1, wrkA) End With Dim wrkD As Integer With Sheets("漁獲量") wrkD = .Cells(Rows.Count, 1).End(xltoUP).Row wrkE = .UsedRange fish = .Range(wrkD, 1).Value End With
487 :
485 :2008/01/24(木) 17:25:54
つづきです For i = 1 To wrkA If fish = wrkC("wrkA,i") Then fish = wrkB(1, i) Cells(wrkD, 1).Offset(0, 1) = wrkB(1, i + 1) Else fish = " " Cells(wrkD, 1).Offset(0, 1) = " " Exit For End If Next i End Sub
>>485 ちょっと突っ込みどころが多すぎるので、全部回答はできないんだけど、
まだ基本を分かりきってないみたい。
とりあえず、 With Sheets("地域A") With Sheets("漁獲量") のトコを
Dim ws As Worksheet ←もちろん最初(1箇所)だけ
Set ws = ThisWorkbook.Worksheets("地域A")
With ws
のような形に修正すれば、"."キーを押したときに入力補助が反応するから、
それを参考に修正するといいと思う。この入力補助が反応するようなコードってのは結構重要。
("."を押してもメソッドが出なければ、記述したところでほとんど実行時エラーになる)
あとは、.End(xltoUP) の定数は xlUp がいいのと、
fish = .Range(wrkD, 1).Value の行みたいに、Cells と Rangeの使い分けが混乱してるかな。
489 :
485 :2008/01/24(木) 18:00:49
>>488 どうもありがとうございます!!
突っ込みどころ満載ですか…笑
ご指摘を元に再度勉強してがんばってみます!!
490 :
488 :2008/01/24(木) 18:30:38
>>489 ゴメン、もっと重要なポイントがあった。
wrkC = .Range("A1").Resize(1, wrkA) は、オブジェクト型変数への代入になるので、
Set wrkC = .Range("A1").Resize(1, wrkA) という書式を必ずとること、です。
漁獲量・・・
すみません。vlookupのワークシート関数がうまく動きません。 普通のvlookupのようにvlookup(値、範囲、2、False)としましたが エラーが出てしまいます。範囲がおかしそうですが どう書き方が誤っているのかがよく判りません。 どなたか、御指摘願えませんでしょうか? With Worksheets(2) 'Xは適当な自然数です。 For i = 1 To 100 Cells(i + 1, 2) = Application.VLookup(Cells(1, 1).Offset(i, 0).Value, .Range(Cells(2, 3), Cells(X, 4)).Address, 2, False) Next i
すみません。色々試行錯誤していたら解決しました。有難うございました
494 :
デフォルトの名無しさん :2008/01/26(土) 17:35:21
かなり高度な質問です。 Me.Controls.Add("Forms.textbox.1","品名",True) のFormsって一体何なのですか?
余りに低レベルなので泣けてきました。
OLEコントロールの名称でないの。 Microsoft Forms 2.0 TextboxのPROGID
497 :
デフォルトの名無しさん :2008/01/27(日) 13:51:07
VBAの中でソルバ関数を実行しようとしてます。 その目的セルの評価値を計算する際に、さらにソルバを実行したいです。 (つまりソルバの2重ループになる感じ) が、これを実現できなくて困っています。 考えてたのは、内側のループのソルバ部分を関数にして ワークシートから呼び出せるようにして、 それを外側ループのソルバの目的セルの数式に放り込んでやればいい、 という方法なんですけど、 VBAのFunctionの中でソルバをまわそうとすると シート上の値を書き換えなければならないのでエラーになってしまいます。 かといってそれをサブプロシージャにしても ワークシート上の数式として表せないので、 結局外側のループで使えません。 何とかこれを達成する妙案はないですかね… 達成したとしても重くて不安定にはなると思うんですが、 それは承知の上です。 環境はWinXP SP2+Excel2000です
↑根本的に何かを勘違いしてないか?
499 :
デフォルトの名無しさん :2008/01/27(日) 14:03:45
勘違い・・・っすか どのへんがおかしいんでしょう? それすらわからんです
Excel2003です。 OnErrorでエラーメッセージの出力を指定しても、 エラーだとそのエラーで無事処理は終わるのですが、 本来エラーにならない場合でも、エラーメッセージ出力→正常処理 となるんですけど。 何か原因は考えられますか? (プログラム持ち出せないのでここに書けないのです)
デバッグトレースシテクダサーイ
>>501 On Error で飛ぶタグの前に Exit Function を書いてなかった、とか言ったら頃すぞ?
Exit Function を書いてなかった位で殺されるんじゃタマッタもんじゃない。
マジレスのハズもないのに、 ネタや回答の一つも返さず、つまらんマジツッコミを入れるとは一体どういう了見か?
うんこ出た 超きもちいい
508 :
501 :2008/01/28(月) 12:59:32
マクロの最初に On Error Msgbox On Error exit Sub で、以下正常時の処理を記述しているのだが。 Exit Function書くとエラーが出る。
>>508 そもそもそれコンパイル通るの?
↓なら問題ないと思うけど。
Privete Sub 処理()
On Error GoTo ラベル
(通常処理)
Exit Sub
ラベル:
(エラー処理)
End Sub
510 :
デフォルトの名無しさん :2008/01/28(月) 16:54:46
Sub abc Dim rng As Range Set rng = Selection test rng End Sub Function test(r As Range) Dim c As Range For Each c Iin r 'cの処理 Next End Sub と選択範囲を引数にしてtestを呼び出しますが、testの引数rはByValにした方がいいんでしょうか? きちんと動くには動くのですが、ちょっと不安になったもので教えてください。
>>510 その程度のものを分ける必要があるか知らんが、ByValは無意味。
そこはそのまんま参照渡しが正解。
それよりFunctionは気持ち悪くないかい?
Private Sub test(r As Range)
とするのが普通だろ?
Functionって戻り値を得るものに限定した方がいいと思うが。
なんだ、下はEnd Subになってるじゃん
513 :
510 :2008/01/28(月) 19:47:40
>>511-512 すみません、実際は最後はEnd Functionとなってます。
Functionはおかしいんですかねぇ。
それはさておき、実は某所で引数が参照型の場合、ByValが速いとかByRefは気持ち悪いとかいう方がいるんですがどうなんでしょうか?
ご存知でしたらお願いします。
>>513 byrefだと参照の参照が渡されるから
確かに気持ち悪くて遅いわな。
大差ないけど。
ByRef の方が遅いのか・・・。 知らなかった。 値渡し=全引数を別アドレスにコピー ⇒ 少し余分に時間が掛かる と思ってた。
そのsubなりfunctionなりの内部で変更する場合のみbyrefで、 それ以外はbyvalでという方針にしておくのが良い。 (自分で定義したサイズが大きな型は別)
>>514 なんか勘違いしてない?
実際にやってみたらどうよ。
ByValが速いはずねーだろ?
>>510 のおかしなコードじゃ分からないだろうが、なんか戻り値のあるFunctionで試したら?
>>515 やってみりゃわかるけど、byrefの方が速いよ
>>514 「参照の参照」という表記が、参照がわかってない証拠。
ポインタのポインタかよ
&*p ← キモチワルイ
俺もやってみたが何度やってもByRefが少し速いな。 Range型の引数でByValが速いケースってどういうケースだ?
測定誤差
うちではRangeの場合、ByRefの方がByValの2倍早かった@Excel 2007
試してみたけど全然違った(Excel 2003) もちろん、Byrefの方がかなり速い
エロい方timeGetTimeで測定オナがいしますorz
軽くぐぐったら、ocamlには「参照の参照」という概念があるらしい。
>>526 timeGetTimeで計ったが参照私が速かった。
言っとくがtimeGetTimeだって1/1000秒の精度はないからな。
渡すのは参照の方が早い。実質ポインタ(4byte)だから。 ただその分使用時に一段間接参照のコストがかかるだけ。
えええ?
そう言えばExcel総合相談所だったか、それともここだったか忘れたが、Worksheet型の引数をByValにしろなんて 意味不明なこと言ってたやつが前にいたな。彼は勘違いしてるんだろうね。
基本的にオブジェクト型は参照渡しでいいんです JAVAと一緒
なんか思いっきり勘違いしてる人がいない?
いや彼にはそのままでいて欲しいからやめとく
なら最初から黙っとけよ
センセー、何で一段間接参照が入るのに速くなるんでつか?
ここVBAのスレだよなぁ?
ByValでRangeが渡されると、内部で「Set 仮引数 = 実引数(か、それと同等の処理)」 されてるんじゃないの? だから、使用時に間接参照のコストなんかかからないんじゃ?
ところで514とか516とか529は試したんだろうか?
ん、俺516だけど、今回は計測してないよ。 俺のは、多少遅くとも516のポリシーが良いという主張。 VB.NETも、デフォルトByValになったことだし。
>>542 そっか遅いのは認めるわけね。
ByRefが遅いと書いた514はどうだろう?
ここまで実計測データ無し。 Excelってベンチマークデータの公表禁止だったっけ?
>>544 別に禁止じゃねーだろ?
ただみんな自分で計測して分かってると思うけどな
計測してないやつが思い込みでおかしなこと言ってるだけ
>>518 でFAなのに、いつまでやるつもりなんだろう・・・
VARIANTをC++から見ての想像。 オブジェクトをByValで渡すと、539の言う通り。オブジェクトへの参照(ポインタ)が渡される。 ByRefだとオブジェクトの変数への参照(ポインタ)が渡される。 いずれにせよ、渡されるのはポインタ値の4バイトだが、 ByValだと参照カウントの処理が要る分、コストがかかるように見える。 一方、ByRefでは2重に間接参照をしなければならないコストがあるはずなので、 測定条件によってどっちが速いかは変わってくるはず。
>>548 で、どんな時に変わるのよ? 変わる”かもしれん”から一概には言えないってか?
なんや、盛り上がってたんですねぇ。
乗り遅れたけど、実測データ書いとくね。
>>529 が考えにより、ByValが有利になるように5回、引数のcにアクセスしてのr計測だからな。
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
Sub foo()
Dim t(2) As Long, i&, j&
Dim rng As Range
Dim c As Range
Set rng = Range("A:C")
t(0) = timeGetTime
For i = 1 To rng.Count
Set c = rng(i)
j = TEST1(c)
Next
t(1) = timeGetTime
For i = 1 To rng.Count
Set c = rng(i)
j = TEST2(c)
Next
t(2) = timeGetTime
Debug.Print "TEST1", t(1) - t(0); "ミリ秒"
Debug.Print "TEST2", t(2) - t(1); "ミリ秒"
End Sub
一般的に、ByRefの間接参照はメモリ読み込み1回が余計に掛かる。 しかし、ByValの内部コピーはメモリ読み書きがそれぞれサイズ(/4)回余計に掛かることになる。 従って、どちらが早いかは自明。
上の続き
Private Function TEST1(c As Range) As Long
Dim i&, j&
For i = 1 To 5
j = c.Row
Next
TEST1 = j
End Function
Private Function TEST2(ByVal c As Range) As Long
Dim i&, j&
For i = 1 To 5
j = c.Row
Next
TEST2 = j
End Function
実測値
TEST1 2448 ミリ秒
TEST2 2528 ミリ秒
5回のループじゃなくて25回くらいならほぼ同じになった。もっと回したらやっと逆転した。
だから
>>529 の言うことがまったくウソということではないが、通常このように何度もアクセスすることはないから参照渡しで問題なし。
ましてや1回のアクセスに値渡しは無駄もいいとこ。1回なら割合としては上の計測よりもっと差がつく。
554 :
デフォルトの名無しさん :2008/01/29(火) 10:10:38
Mougからきました。 勉強になりました。
どうみても
>>514 はあの人だよなぁ。
他のオタクの人たちも既にいると見たがどうよ。
あまり詮索しないように どうやら思い違いには気がついたらしいからよかったじゃないか
なんか気持ち悪い流れとコードだったので、自分で試してみた。(Excel 2000) *ByRefとByValの違い それぞれ1000万回呼び出すのを5回繰り返した場合の平均: ByRef: 1654.8ms (A) ByVal: 3558.2ms (B) *「一段の間接参照」があるかどうか 呼び出した関数内で、次のコードを実行する。 dim s as string s = arg.address (C) 時間がかかるので、100万回の呼び出しに変更し、それを5回繰り返した場合の平均: ByRef: 4488ms ByVal: 4660ms 100万回分の関数呼び出しのコスト(A,Bをそれぞれ10で割ったもの)を引くと、 (C)のコストが算出される。 ByRef: 4488-165.48 = 4322.52ms (D) ByVal: 4660-355.82 = 4304.18ms (E) 結論: ・ByRefの方がByValの2倍以上速い ・「一段の間接参照」なるものの存在は確認できない(D,Eより)
559 :
550 :2008/01/29(火) 13:07:28
気持ち悪いコードって俺の? だったらすまんね。
560 :
558 :2008/01/29(火) 13:11:53
オブジェクトをByValとByRefで渡したときの違いは何か? プロパティNameを持った空のクラスClass1を作成し、次のコードを実行してみる。 [結果] Initialized abc def [考察] ByValでもオブジェクトのコピーが発生するわけではない。 (barから戻ったときにbarで設定したNameが表示されているので) --Class1 Public Name as String Private Sub Class_Initialize() Debug.Print "Initialized" Name = "abc" End Sub --Module1 Sub foo() Dim o As Class1 Set o = New Class1 bar o Debug.Print o.Name End Sub Sub bar(ByVal o As Class1) Debug.Print o.Name Set o = Nothing End Sub
561 :
558 :2008/01/29(火) 13:15:54
続き。
ByValをByRefに変えて実行してみる。
[結果]
Initialized
abc
(ここで実行時エラーが発生する)
[考察]
実行時エラーが発生した行は、barから戻ってo.Nameを参照する行。
このことは、bar内でオブジェクトが破棄された、すなわちByRefは参照カウントを増やしていない
ことを意味する。
>>560 の結果とあわせると、結論は、
オブジェクトをByRefで渡すと、それ自身が渡され、参照カウントも増えない。
オブジェクトをByValで渡すと、オブジェクトがコピーされるのではなく、参照カウントが増えるだけ。
>ByValでもオブジェクトのコピーが発生するわけではない。 これはみんな常識として知ってるだろうね。 もちろん考察には感謝する。
563 :
558 :2008/01/29(火) 13:19:10
>>562 のコードの訂正
Sub bar(ByVal o As Class1)
Debug.Print o.Name
o.Name = "def"
Set o = Nothing
End Sub
564 :
558 :2008/01/29(火) 13:26:55
さて、それでは実際にオブジェクトのコピーを関数に渡したいときにはどうすればいいのだろう? とふと思った。 Class1に次の関数を実装すれば良い。 が、VBAの機能だけで実現する方法があるかもしれない・・・。 Public Function Clone() As Class1 Set Clone = New Class1 Clone.Name = Me.Name End Function Sub foo() Dim o As Class1 Set o = New Class1 bar o.Clone Debug.Print o.Name End Sub Sub bar(ByRef o As Class1) Debug.Print o.Name o.Name = "def" Set o = Nothing End Sub [一連の書き込み終了]
565 :
558 :2008/01/29(火) 13:30:33
蛇足。
オブジェクトをByValで渡す場合は、前述のようにリファレンスカウントが増えるだけであり、
仮引数のconst性(不変性)を保障するものではまったくない。
その意味で、
>>516 のポリシーは間違っている。
しかし試しもしないで遅いとか気持ち悪いとか書くやつも相当だよな。 速度の計測なんてすぐできることだろうに。
>>565 組み込みオブジェクト(というのか?)だと、ByRefで渡したときは自作クラスのインスタンスとは
ちょっと違う挙動をする。
Sub foo()
Dim r As Range
Set r = Range("A1")
bar r
Debug.Print r.Address
End Sub
Sub bar(ByRef r As Range)
Set r = Range("A2")
End Sub
ByValだと$A$1と表示され、ByRefだと$A$2と表示される。
つまり、ByValは「参照のコピー」が渡ってると言える。(ここ、怪しい表現だが)
そういう意味では
>>516 は正しい。
あーややこしい。
いいかげんに許してやりなよ。 勘違いは誰でもあるし、反省してると思うよ。
あー、それが「参照の参照」という奴なのか・・・
>>555 のリンク先ちらっと見たけど、とてもじゃないが読む気になれん
禿げ胴
なんだか混乱してきた。 ただ、byrefの方がbyvalより速いというのが事実だということは確かだよな。
誰かガンダムで表現してくれ
オブジェクト型はアドレス渡されるだけで 基本はLong型と同じ byvalでも渡されるのが参照情報だからbyrefみたいに 感じちゃうってこと
>>567 それbarの中で新しいRangeオブジェクトを作り出してるから、根本的に565が書いたコードと違う
>>568 反省してるかねぇ。
すっとぼけてるけど、なんとかByValが遅いのは認めたらしい。
ただお行儀がどうのこうのとまだ言ってるよ。
別に参照渡しは行儀悪くねーだろ?
>>576 そもそも、VBAのデフォルトがbyrefなんだから、神経質ではない普通の人が
function foo(r as range)
と書くと、それはByRefになる。
これがお行儀が悪いということは、
function foo(byval r as range)
と書くのが「お行儀が良い」ということになる。
こんな書き方がデフォルトの奴は診たこと無いぞ。
578 :
デフォルトの名無しさん :2008/01/29(火) 16:54:08
右上の×(閉じるボタン)を無効にできますか?
ところで、516のいう「自分で定義したサイズが大きな型」というのが Typeで定義した型のことなら、それに関しては同意と言おうと思ったら、 そもそもTypeのユーザ定義型は、値渡しできなかった。
580 :
550 :2008/01/29(火) 17:26:39
>5回のループじゃなくて25回くらいならほぼ同じになった。もっと回したらやっと逆転した。 仕事から帰って再度試したら、もっと回しても逆転まはしてなかった。スマン 測定誤差だったみたいだな。 誰かが書いてたと思うが、結局ByValが速くなるケースってなさそうだな。
ChangeイベントやSelectio_ChangeイベントがByVal Target As Rangeとなってるのは何故? エロイ人教えて
差を比べるならこうする わかるのは差は大きいが全体でみると微々たる差ということ Private Declare Function timeGetTime Lib "winmm.dll" () As Long Sub foo() Dim t(2) As Long, i&, j& Dim rng As Range Dim c As Range Set rng = Range("A:Q") t(0) = timeGetTime For i = 1 To rng.Count TEST1 c Next t(1) = timeGetTime For i = 1 To rng.Count TEST2 c Next t(2) = timeGetTime Debug.Print "TEST1", t(1) - t(0); "ミリ秒" Debug.Print "TEST2", t(2) - t(1); "ミリ秒" End Sub Private Sub TEST1(ByRef c As Range) End Sub Private Sub TEST2(ByVal c As Range) End Sub
583 :
510 :2008/01/29(火) 18:00:36
みなさん、大変参考になりました。 どうやら参照渡しで問題ないということがわかり一安心です。 ありがとうございました。
584 :
550 :2008/01/29(火) 18:15:46
この流れを見て「Byrefなら速いんだ!」となんでもかんでもByrefの迷惑コーダーが量産されそうな
デフォルトbyrefなんでそ?
>>585 デフォルトがそうだし、仮に全部ByRef にしたトコで悪影響があるんだろうか?
要するに、関数にオブジェクト変数を渡せば、ByValにしたとこで内容の保護はできんわけだし。
>>585 それは言えるかも知らんね。ByValが速いケースもあるんだけどな。
オブジェクト型はないかも知らんが、他のケースでは確実にある。
>>588 だから、そのケースを示せっての。議論のネタにもならんわ。 自分がそう信じたいだけか?
>>589 おめー死ねよ。
自分で探すことも出来んのか?
おまえは間違ってる(でも正解を示さない) ↑ググってみて一番上ね
592 :
デフォルト知らず :2008/01/29(火) 21:59:20
折れ、今まで、全てにおいてByRefにせず、ByValできている。反省w 戻り値を親に返す必要がないから、ByValを当然に使うと考えていた。 戻り値を親に戻す必要があればByRefと、ただ単にプログラムテクニックぐらい。 で、スピードは全く気にしていなかった。 ベンチマークでなく、実用・実践のレベルでのものでも、書き換えた方が早いのだろうか? ex 与件を渡すinteger型変数5つぐらい
いいから
>>589 は死ね。
おれはここで散々
>>510 のケースはByRefが速いって書いてきたからな。
勘違いするなよ。
すみません Cells(hoge, fuga).Value で値を取り出したときに 元のセルが3だったとすると 値がそのまま3である場合と 3.0になっている場合があるようなんです 常に3であるように取り出すにはどうするのがよいでしょうか?
>>593 お前が死ね。
二度と来るな。
迷惑だ。
>>555 モーグは、大村なんとかが嫌いだったので見てなかったんだが、久しぶりに見に行ったら
井川はるきという気持ち悪い奴がのさばってた。
ぐぐったら、こいつ何冊も本出してるな。
掲示板で初心者相手に回答もしてるみたいだし、ほんときもちわりー
597 :
デフォルトの名無しさん :2008/01/30(水) 07:37:28
オラもモーグから来ますた。 ByRefとByValの話はもう終わり? 何かあるのかと思ったら、既出ネタの応酬とグダグダの展開に正直がっかりです。
もともと既出ネタなのに、何を期待してたんだ?
>>596 お前よりは役にたってるよ。
今回の引数の渡し方については、嘘をどうどうと書いたので叩かれてもしょうがないけどな。
しかし彼の本にオブジェクト型はByValで渡すべしなんて書かれてたりしたら、本を買った人がかわいそうだな。
>>594 そんなのありえないだろ?
元のセルが3.0という文字列なら別だが、もともと数値の3なら3だ。
どこかのセルにその値を代入すれば、表示形式によっては3だったり3.0だったりすることはあるがね。
>>599 役にたってるかなんかどうでもいい。
気持ち悪いかどうかって話だ。
確かにモーグは、今一番キモいコミュニティだな
漏れが一番Mougでウザイのは、あのしょっちゅうハンドル変えてるやつだな。 EFCを追放された名無しだろうけど。
>>514 参照の参照が渡されるから気持ち悪いというのを、もっと説明してください。
「下がってる」の意味が良くわからないのですが、Mougは巡回対象ではないので、 ここで回答がなければあきらめます。
もともと組み込み屋なのに転職したら最初にVBAやる羽目になってます。 VBはある程度使ってましたが忘れかけ。 質問は ユーザ定義クラスのインスタンス(の参照?)を渡して関数の先で値を入れてもらいたいのですが、 「型が一致しません」となります。何が原因でしょうか? 【Sheet1のpublicプロシージャ】 Public Sub GetData(idx As Long, ByRef item As clsUserA) item.Id = Me.Cells(idx + 1, 1) item.Name = Me.Cells(idx + 1, 2) item.Remark = Me.Cells(idx + 1, 3) item.Visible = Me.Cells(idx + 1, 4) End Sub 【それを呼び出すModule1のプロシージャ】 Sub Test() Dim tmpClass As clsUserA Dim i As Long Set tmpClass = new clsUserA For i = 0 to 10 Call sheetClassList.GetData(i, tmpClass) '★ここでエラー発生 Next End Sub よろしくお願いします・・・。
609 :
608 :2008/01/30(水) 15:52:10
簡単な名前にしようと思って書き換え忘れorz Call Sheet1.GetData(i, tmpClass) '★ここでエラー発生
>>608 clsUserAのプロパティでInstancingをPublicNotCreatebleに設定しろ
>>610 それは違うエラーが出たので昨日の時点で直しました。
クラスをやめて構造体にしてみたら
パブリックオブジェクトモジュールで定義されてないと云々・・・
何この中途半端な言語・・・。
本当に解決してほしいのなら、エラーが発生する、検証可能な最低限のコードを「全て」書け
>>608 ところで、Sheet1クラスに定義したGetData( ) を
Worksheet型で宣言したオブジェクトから呼ぼうとしてるのだとしたら大笑いなんだが、
そこは大丈夫? (要するに sheetClassList の変数の型が分からないんだが)
614 :
608 :2008/01/30(水) 17:55:22
615 :
608 :2008/01/30(水) 17:57:44
>>613 シートにプロシージャを定義してあって、
標準モジュールから呼んでます。
もしかして大笑いコース??
616 :
608 :2008/01/30(水) 18:02:44
さっき配置変更して別のシートから呼んでました。 紛らわしくてすみません。 どっちにしても動きは同じですが。
>>614 再現手順を書け、アホ
とりあえず
Public Sub GetData(idx As Long, item As clsGantClass)
にしたら、コンパイルエラー(呼び出せない)のは無くなった
>>608 ちょ、お前な。 ステップ実行で確認するくらいしろよ!
自分の意図してる場所のセルのデータが、ちゃんと取れてるかどうかと、
代入しようとしている構造体のメンバの変数型が合ってるかどうか。話はそれからだ。
ソース見る限りでは、Variantじゃなくて、クラスを指定しても動くと思うよ。
⇒ Public Sub GetData(idx As Long, item As clsGantClass)
619 :
617 :2008/01/30(水) 19:15:01
すまん、再現手順は書いてあったな。 ただ、ボタンをクリックしてもエラーは発生しないぞ?
>>610 が原因だったが、あれこれやってるうちに、何がなんだかわからなくなったと見た。
621 :
608 :2008/01/30(水) 19:35:28
エラー出ないですか・・・。 sheetClassListはどこか書き換えたんでしょうか? いまだ動きません。 ほかのマシンで動かしてみようかなぁ
Me.Cells(idx + 1, 1)がLongじゃない。 以上。
623 :
618 :2008/01/30(水) 19:44:43
>>621 え? ちょっと待て。何が分からないの? うpしてくれた .xls でいいんだよな?
直さなきゃいけないトコ、普通に分かるだろ。
あと、気になるのは、1度動かすと、sheetClassList.Count の値がぶっ飛ぶ。(ゼロになる)
624 :
608 :2008/01/30(水) 20:04:14
わかりました○| ̄|_ CellはRaw:2から読まないとだめでしたね・・・(0+1=1 "id"読んでました) GetDataの内部の行ではなく、呼び出しの行がエラーになったために、その部分ばかりこだわってました。 ありがとうございました。精進します。
625 :
618 :2008/01/30(水) 20:18:34
>>624 精進してください。 ちなみに、さっきザッと眺めた限りでは、あと変数型さえ直せば動くと思うよ。
おまいら釣られすぎ。
流れ変えようと
>>514 が質問を始めたな。
何が組み込み屋だよwww
それならそれで乗ってやりゃ済む話だろ。 どんだけ粘着なんだよ。キモイやつだな。
>>626 流れをぶった切って申し訳ないが無関係なんで・・・。
組み込み屋馬鹿にスンナヽ(`Д´)ノ
それよりzzって相当生意気な香具師だな
630 :
デフォルトの名無しさん :2008/01/30(水) 22:44:34
質問です。 配列を一気にboolean型のtrueで初期化する方法はありますか? Dim hairetu As booleanです
OSはWindows XP、Excelは2002です。 エクセルに関しては、授業で習った程度の事しか出来ません。 エクセルのVBAでゲーム作成の課題が出て、マインスイーパを作ってみようと思ったんですが。 全てのボタンをトグルボタンで作ろうとすると、凄く重くなります。 更に一個一個のボタンにコードをいちいち打たなければならないので、 もし出来たとしてもやはり使い物にならなくなると思います。 コードをすっきりさせるやり方で、何か良い方法はありませんか? お願いします。
633 :
デフォルトの名無しさん :2008/01/31(木) 00:11:47
632さん ネットで調べたのがよくわかりませんでした。 どーいうことなのですか?
>>632 それも最初考えてみたんですが…。
マインスイーパでいう、ボタンをクリックすると文字が表示されるという動作と、
ボタンに爆弾の印を付けるという動作をさせるやり方が見つからなくて…。
セルの中の値を非表示にして、クリックなどの動作で其れを表示させるというやり方が
可能なのでしょうか?
635 :
デフォルトの名無しさん :2008/01/31(木) 09:50:20
>>634 workbookのsheetchangeでいちいち全セルのvalueを見回るようにするとか
どっちにしろ重くなるけど
コントロール配列とかでイベントプロシージャ共有じゃだめなん? サブクラス化して変数持たせないと呼び出し元識別できないっけ?
>>635 >>636 コントロール配列が出来るなら…何とか出来るかもしれません。
どちらも自分には難しそうですが、またちょっと調べて作ってきます。
すいません、有難う御座います。
638 :
デフォルトの名無しさん :2008/01/31(木) 21:27:29
ワークシートにファイルからオブジェクトを挿入し 同時に同じファイルにハイパーリンクを設定するマクロを作っています。 ひとまずマクロの記録をして、それを元に作成しようと考えたのですが、 記録したものを実行すると2行目、3行目でエラーが出てしまいます。 (改変したものでもエラーが出ます) 2行目はオブジェクトを挿入すると"=EMBED("○○","")"という数式?が追加されるので それを削除する工程です。 明日までには処理完了させねばならないのですが、何が問題なのか御教示下さい。 Sub Macro() ActiveSheet.OLEObjects.Add(Filename:="C:\test.pdf", Link:=False, DisplayAsIcon:=False).Select Selection.Formula = "" ActiveSheet.Hyperlinks.Add Anchor:=Selection.ShapeRange.Item(1), Address:="C:\test.pdf" End Sub
639 :
デフォルトの名無しさん :2008/02/01(金) 11:16:45
複数あるフォームのひとつを変数扱いで表示することは可能でしょうか。 下のサンプルのようなことをやりたいのですが 「オブジェクトはこのメソッドをサポートしてません」と出てしまいしまいます。 (UserForm1は勿論つくってあります) myForm+ピリオドでShowメソッドが出てこないので、ダメなのは解っているのですが。。 Sub sump() Dim myForm As UserForm Set myForm = New UserForm1 myForm.Show End Sub
>>639 UserForm と UserForm1 はベツモノのクラスだよ。Control と Textbox みたいな親子関係。
変数の型を UserForm1 にしてやればおk。
>>640 できました
UserForm1型があるなんて知りませんでした。
親(userform)に子(userform1)を代入、みたいに考えてました・・
ありがとうございます。
>>641 フォーム型のクラスを継承するイメージかな。
当然、フォームの(オブジェクト名)を変更すると、クラス名(変数型)も変わるよ。
一旦、オブジェクトを作成してから、userform型に userform1を代入するのは間違いじゃない。
userform1、userform2・・・と型が増えたときに、userform に代入すれば、どれでも操作できる。
Control と Textbox、Label、Combobox・・・ の関係と似たようなもんだよね。
>>642 639=641です
userform1型を使うのはできましたが、これだと
myform変数にuserform2を代入できないことがわかりました。(型が違うため)
このような場合どうしたらよいでしょうか。
>userform1、userform2・・・と型が増えたときに、userform に代入すれば、どれでも操作できる。
このやり方を知りたいのですが。(繰り返しですみません)
643です たびたびすみません、object型を使ったらできました! これで合ってるでしょうか。
>>644 ↓こういう作りになってれば、少なくともエラーにはならないと思うんだけど・・・?(Excel2000)
Dim a As UserForm1, Dim b As UserForm2, Dim c As UserForm
Set a = New UserForm1
Set b = New UserForm2
Set c = a
Set c = b
Object型は、なるべく使わないに越した事はないよ。ダメだという意味じゃないけど。
>>645 やってみましたが、c.Showでエラーになってしまいます。
(メソッドをサポートしません)
>>646 あー、そういう意味か。
申し訳ない、代入した後は、代入した先の変数型の持ってるメンバしか使えないよ。
Control 型に、ラベルやチェックボックスを入れても.Caption を設定できないのと同じこと。
>myForm+ピリオドでShowメソッドが出てこないので、ダメなのは解っているのですが。。
仰るとおり、Userform 型は、.Show() をサポートしていない。
異なるクラスで、共通のメソッドを呼びたいなら、Objectを使うしかないです。
あるいは、インターフェイス用のクラスを作って Implements する方法があるけど、
フォームに使うのは怖いので、特に事情が無い限りはやめた方がいいと思います。
>>647 了解です、今回はobjct変数でやることにします。
(やりたいことはメッセージ代わりのフォームを打ち分けたいだけなので)
何度もお手数をとらせ申し訳ありませんでした。
VBってオブジェクトと初期インスタンスの名称が同じだって所が半端な感じだよね
650 :
デフォルトの名無しさん :2008/02/03(日) 16:39:17
os:xp excel:2003 VBAで指定列からAを検索し、発見したら隣のセルに0を入れるマクロを組みたいのですが、組み方がVBA初心者の為わかりません。 (例) L列に、A、B、C、D、E、Fとランダムに文字が入っていて、 文字Aを検索し、発見したら隣のI列に値0を入れるというマクロです。 Sub Search() Dim A As String Set A = Worksheets("Sheet1").Cells.Find("A") If A Is Nothing Then ActiveCell.Offset(0, 1).Value = 0 End If End Sub と自分で考えてみたのですが、Aがあった時、、、、 とコードが書けないです。 大変困っているので、ご教授頂けないでしょうか? 長文失礼しました!
突っ込みどころが多すぎ 全部に突っ込むの面倒なので正解書いておく Sub Search() Dim A As Range Set A = Worksheets("Sheet1").Columns("L").Find("A") If Not A Is Nothing Then A.Offset(0, 1).Value = 0 End If End Sub うわ、プロシージャ宣言やEnd Ifなど、間違いようのない部分以外、全部間違ってるじゃんw
notつけろの一言だけで済む話を教えたがりはこうやるわけだ
>>652 not付けました
実行結果は以下の通りです┐(´ー`)┌
---------------------------
Microsoft Visual Basic
---------------------------
コンパイル エラー:
オブジェクトが必要です。
---------------------------
OK ヘルプ
---------------------------
For n = 1 to 3 step 1 msgbox ("n nを表示したい場合はmsgbox ("n このあと何するのか分かる人いたら教えて下さい
msgbox ("n")
msgbox n
("n")バーカ
659 :
デフォルトの名無しさん :2008/02/05(火) 10:49:33
標準モジュールから、ユーザーフォームのテキストボックスに、 文字を表示させるにはどうすればいいでしょうか 以下では、ダメでした。 Sub test() If Range("A1").Value = 1 Then TextBox1.Value = "ぼぼぼぼぼぼ" End Sub
だから、どうダメだったか位書こうぜ。 つーか、エラーメッセージくらい自力で理解しろよ。
661 :
659 :2008/02/05(火) 11:39:17
それが分かったら来ませんがな・・(´・ω・) モジュール間で値渡し?しなければならないというのは 何となく分かるのですが、textbox1の「change」とか「enter」とか どこに記述すればいいのかも分からず、現在に至っております。
>>661 エラーメッセージは出ませんでしたか?
恐らく、>653のようなダイアログが出たと思うのですが。
それを見ても何も理解できないようなら人間やめた方が宜しいかと。
663 :
659 :2008/02/05(火) 11:55:57
>>662 textbox1 の変数が定義されていません と出ますね。
いちおう、フォームでtextbox1は作っているんですよ。
>>663 標準モジュールに記述してるんだったら、
Range("A1").Value にしろ TextBox1.Value にしろ、未定義扱いになると思うが?
(どこに属するオブジェクトか判断できない。明示的に指定されていない。)
シートから実行してしまうと、Rangeの方は未定義にならない罠。
666 :
664 :2008/02/05(火) 12:55:45
>>665 うを、ホントだ。素で知らんかった。Activesheetを拾うっぽいね。 どうもありがd。
>>664 その定義方法がですね、textboxから、プロシージャをcallする場合は
分かるのですが、この逆になると、textboxのchangeなのかenterなのか
keydownなのかどこで定義したらいいのか・・・そもそも不可能なのか・・
>>667 イベントプロシージャを使うつもりなら、どのイベントで処理するか決めるだけじゃないの?
つか、どういう動きをさせたいの?
>>667 もしかして、フォームのプロシージャから標準モジュールをサブルーチンとして使いたいのか?
だとしたら、フォーム自身なりテキストボックス自身をそのtest()に渡してやればいい。
やりたいこととやっていることの説明くらいできないようじゃ、先が思いやられるけどね。
670 :
デフォルトの名無しさん :2008/02/05(火) 15:14:50
お付き合い頂き感謝します。 標準モジュールから、ユーザーフォームのテキストボックスを呼び出して、 なおかつそのテキストボックスに任意の文字列を表示させたいです。 テキストボックスのプロシージャから、標準モジュールを呼び出すのは 何とかできるのですが、逆がどうしても出来ません・・
面倒だから、全ての自作オブジェクトの一覧と全てのプロシージャの一覧出しちゃえよ。 状況説明できない馬鹿にいくら聞いても説明しても無駄だって判ったからさ。
>>670 いや、だから・・・
何かしらの処理が実現できない、っていう相談じゃなくて、コードの書き方が分からんってこと?
標準モジュールに記述したプロシージャは、どこかから呼ばれるまでは処理が走らない。
その前提の上で、特定のフォームの部品を扱いたいなら、○○(Userform名).Textbox1
例えば、デフォルトのオブジェクト名であれば、Userform1.Textbox1.Value でアクセスできる。
TextBox1.Value だけでは対象が分からんからエラーになる。 単にValue とだけ書くようなもん。
うぜーーーー Sub foo() UserForm1.TextBox1.Text = "abc" UserForm1.Show End Sub
674 :
672 :2008/02/05(火) 15:29:26
>>670 あー、ごめん、よく考えたら 672の書き方じゃ絶対に分からんな。
まずはフォームの実体を取得しなきゃならんので、どこかから呼び出されるのを前提で、
”基本的には”標準モジュールのプロシージャに引数として処理対象のオブジェクトを渡すか、
フォームのインスタンスを作るトコから全て標準モジュールの処理で書かないといけない。
675 :
デフォルトの名無しさん :2008/02/05(火) 15:39:12
>>972-974 でけた^^
コードの書き方の問題なのかも分かりませんでした・・orz
ありがとうございました!
感謝まで明後日の方向向いているよ。どうしようもねぇな。
677 :
672 :2008/02/05(火) 15:42:12
ワロタw
>>674 なんか勘違いしてない?
インスタンス化はアクセスされると自動的に行われるよ?
679 :
672 :2008/02/05(火) 15:55:59
>>678 勘違い、つか、VBが特殊な使い方ができるだけで、
インスタンスを作ってから使うのが基本だと俺は思ってるから、自然とそういう書き方になった。
複数のインスタンスが持てないわけでもなし、何故突っ込まれるのかが分からんが。
680 :
672 :2008/02/05(火) 16:00:40
>>678 あ、スマン、書き込んでから言いたい事が分かった・・・。確かに、勘違いしてるように見える。
申し訳ない。
少なくとも、VBA/VB6では、規定のインスタンス(暗黙のインスタンス化)を使うのが、 まぁデフォですので・・・。
Windows XP + Excel 2000SP3です。 MouseWheel Fixをアドインマネージャに起動時/ロードで設定すると、VBEを開こうとすると 「インストールの準備中」のダイアログが出て先に進みません。 ただ、なぜだかその状態で一度Excelを終了させてすぐに起動すると、そのダイアログが 終了してVBEが立ち上がるようになります。 「起動時/ロード」を設定せずに、Excel起動後にロードしようとしても、やはり最初の一回は 「インストールの準備中」から先に進みません。 何か、解決法はあるでしょうか?
自作のDLLをDeclareで参照して使うと、Excelを終了させないとDLLがアンロードされないみたいなんですが、 強制的にDLLをアンロードするにはどうすればいいですか?
つまり、Declare宣言を編集しようと試みると強制的にアンロードされるってことでいいのかな?
>>685 Declareの"r"を削除して行を離れると、強制コンパイルされてDLLがアンロードされるから、
その行に戻って"r"をタイプして元通りにしろってことね。
687 :
デフォルトの名無しさん :2008/02/05(火) 23:14:50
i = 3 Do While Cells(i, 1) = "東京" If Range(i, 10) = 1 Then Range("i" & Columns.Count).End(xlUp).Value = st4 & st5 st1 = Range(i, 8) st2 = Range(i, 9) With ws2.Range("A" & Rows.Count).End(xlUp) .Offset(0.1) = st1 .Offset(0.2) = st2 End With i = i + 1 Loop 恐れ入ります。 A列3行目から”東京”となっている間ずっと、 もしその行の10列目が”1”であるなら”1”の一つ右の行を確認、 空白だったらST4とST5の文字列を貼り付ける。空欄でなかったらさらに一つ右の行を確認・・・(ループ) さらにST1、ST2の文字列を貼り付け・・・ というのをループさせたいのですが、 ”1”の一つ右の行を確認、空白だったらST4とST5の文字列を貼り付ける。空欄でなかったらさらに一つ右の行を確認・・・(ループ) の部分がよく分かりません。また、実行してみてもLOOPに対するDOが無いとのエラーになってしまいます。 おばかな質問で恐縮ですが、よろしくお願いします。
688 :
デフォルトの名無しさん :2008/02/05(火) 23:33:09
i=i+1の前に end ifがいる。
>>682 そんな現象なったことないが、原因分かんないならVectorとかで同種のソフト拾ってきて使えば?
もしくはExcelを再インストールして様子見るとか
>>682 他のアドイン機能はちゃんと動作するのか確認して、異常がないようなら
MouseWheel Fix を一旦登録解除(クラスライブラリ)してから、再登録してみたら?
691 :
682 :2008/02/06(水) 10:50:25
692 :
デフォルトの名無しさん :2008/02/06(水) 11:30:49
OS vista excel 2007 Dim i As Integer Dim x(10), y(10) As Single For i = 1 To 10 x(i) = i y(i) = i Next Cells(1, 1).Value = Application.WorksheetFunction.LinEst(y, x) linest関数を使いたいのですが、試しに上記のようなプログラムを作成したところ 肝心のlinest関数のところで「linestプロパティが取得できません」とエラーがでます 基礎的な間違いをしてる気がするのですが、どうかアドバイスをお願いします
'テキストファイルを開きます。 Workbooks.OpenText Filename:=strFileName, _ Origin:=xlWindows, _ StartRow:=2, _ DataType:=xlDelimited, _ TextQualifier:=xlNone, _ ConsecutiveDelimiter:=False, _ Tab:=False, Semicolon:=False, Space:=False, Other:=False, _ Comma:=True, _ FieldInfo:=Array( _ Array(1, 2), Array(2, 1), Array(3, 2), Array(4, 2), Array(5, 2), _ Array(6, 2), Array(7, 2), Array(8, 2), Array(9, 2), Array(10, 2), _ Array(11, 2), Array(12, 2), Array(13, 2), Array(14, 1), Array(15, 1), _ Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 2), Array(20, 2), _ Array(21, 2), Array(22, 2), Array(23, 2), Array(24, 2), Array(25, 2), _ Array(26, 1), Array(27, 2), Array(28, 2), Array(29, 2), Array(30, 2), _ Array(31, 2), Array(32, 2), Array(33, 2), Array(34, 2), Array(35, 2), _ Array(36, 2), Array(37, 2), Array(38, 2), Array(39, 2), Array(40, 2) _ ) 上記処理にてWinXP SP2 Office2003 SP3環境では問題なくシート表示するのですが、 WinXP SP2 OfficeXP (SP状態は不明です)の環境では文字化けして表示されます。 化けるフィールドとしては2バイト文字のところで、 テキストファイルとしては半角カナも全角漢字も混在のCSVで 改行コード、文字コードはCRLFのSjisです。 原因と対策がよくわからなくて困っております。 何かご存知でしたら教えていただければ、と思います。 よろしく頼みます。
695 :
692 :2008/02/07(木) 07:29:16
すみません。
ただの宣言ミスでした。
Dim x(10) as single, y(10) As Single
としたら動きました。
>>694 どうもありがとうございます。
聞く時はもっと気を付けてからにしようと思います。
696 :
デフォルトの名無しさん :2008/02/07(木) 12:10:10
激しくスレ違いかもしれませんが、質問です。 PCゲームを多重起動しようと試みたのですがダメでした。 大抵のゲームはWindowsのアカウントを2つ作成し、別々のアカウントで起動すれば問題ありません。 現在、Vistaを使っているのでXPではどうなるかはわかりませんが(XPは右クリックから別ユーザーで起動が可能)、 Vistaでその手法をとる場合、runasコマンドを使用することになります。 しかしこのコマンドで別々に起動しても、後から起動したほうが無効になってしまいました。 で、ここからがわけわかめなのですが、同一のデスクトップからの起動はダメでも、 Windowメニュー→ユーザー切り替えをし、別々に起動すればうまくいきました。 この違いはいったいなんなのでしょうか?
RMTでもやんのか? どちらにしても激しくスレ違いだから帰れ。
激しくスレ違いまで読んだ
激しくまで読んだ
sageがないので読んでない
701 :
デフォルトの名無しさん :2008/02/09(土) 15:17:19
Base64でファイル添付してメールを送りたいのですが、その方法があれば教えてください CDO.Messageを使ってQuotedPrintableでの送信はできています
702 :
デフォルトの名無しさん :2008/02/09(土) 15:29:15
本文に追加すればいいことじゃないの
703 :
デフォルトの名無しさん :2008/02/09(土) 15:36:00
某エクセルスレで、以前に聞いたが全く回答の反応なしだったので、 ここでも、あまり、適切な話題ではないかもしれないが教えてくれ。 2002 + XP VBAマクロ、ドロップダウンリスト入力セル、関数式埋め込みセルが あり、各ブックの大きさは700K〜2M程度の5つの同種類のブックを作ったのだが、 ブックによって、左下のステータスバーに(通常コマンドと表示されているところ) が、セル移動で「再計算」が表示されるものと、「再計算」は表示されないものとの 2通りあるようになった。selection_changeイベント等求めている機能はいずれも 正常に動いている。 皆、コマンド、入力の表示のみで、再計算表示がされないようにしたいのだが、 どうしたらいいですか。
704 :
701 :2008/02/09(土) 16:03:05
>>702 Excelでソケット通信も含めて自作しろといってるようにしか聞こえないが
705 :
デフォルトの名無しさん :2008/02/09(土) 16:32:41
某エクセルスレで、以前に聞いたが全く回答の反応なしだったので、 ここでも、あまり、適切な話題ではないかもしれないが教えてくれ。 2002 + XP VBAマクロ、ドロップダウンリスト入力セル、関数式埋め込みセルが あり、各ブックの大きさは700K〜2M程度の5つの同種類のブックを作ったのだが、 ブックによって、左下のステータスバーに(通常コマンドと表示されているところ) が、セル移動で「再計算」が表示されるものと、「再計算」は表示されないものとの 2通りあるようになった。selection_changeイベント等求めている機能はいずれも 正常に動いている。 皆、コマンド、入力の表示のみで、再計算表示がされないようにしたいのだが、 どうしたらいいですか。
>>704 最近のメーラは添付ファイルがアイコンなんかで表示されたりして隠蔽されて
いるけど,昔は送りたいバイナリをテキストにエンコードして文字通りメール
本文の下に貼り付けてましたよ。
↓こんなイメージ
-------ここから------------------------
encoded by なんちゃらかんちゃら
risdgfniefngoenogfaenogengopenoanongoneogneoagnoengea
fbwhibfiwbfiwbfiwbfiwbfibwibfiwbfiwbfiwbifbiwfbiwbfiw
OS XP、Offce 2003 A1には半角英数字のみが入ってるとします。 このファイルには複数シートがあり、全シートにA1には違う文字列があります。 各A1の文字や文字数はシート毎にバラバラですが、半角英数字は変わりません。 質問としては、各シートのA1内に入っている半角大文字のみ それぞれのシートB2に出力するのは可能?可能ならばヒントをお願いしたい です。
>>707 ・セルA1内の文字列を取得する
・大文字があるか検索する
・文字列を組み立てる
・セルB2に設定する
・それらを全てのシートについて行なう
709 :
デフォルトの名無しさん :2008/02/10(日) 15:33:57
リテラルの中に、"(ダブルクォテーション)を含めるには、 どう書けば良いのでしょうか?
””
すいません。 A1からA4まで文章があります。 A2の横のセル(B2)にA4をカットペースト(A1A2A3は何もしない)をしたいのです。 For X = 1 TO 100 で A 4*X+2の横のセル(B 4*X+2)にA 4*X+4をカットペースト 4*X+3 : 4*X+5 行を削除 Next i というのをやりたいのですが、、初心者で分かりません。 特にセルのところをどうすればいいのか分かりません。教えてください。 どなたかお願いします。
Cells(r, c).Value
713 :
デフォルトの名無しさん :2008/02/10(日) 16:23:57
音は出てないから補聴器買ったところで聞こえようが無い
そんなにいぢめてやらんでも・・・
わかんねーから教習所に通ってんのに、お前らはなんにも教えてくれない自動車教習所の教官。 へたっぴな運転を見てからかってる。
違うな、教習場に行けばいいのにこんな場末の練習場に来ている阿呆を見に来ている暇人だな。
やりたい事と合ってるかわ解らんが参考にしとくれ 行を削った後座標がズレるけど良いのか? Sub TEST() For I = 0 To 99 Cells(I + 4, 1).Cut Destination:=Cells(I + 2, 2) Range(Rows(I + 3), Rows(I + 5)).Delete Next I End Sub
721 :
デフォルトの名無しさん :2008/02/10(日) 21:12:35
質問です。 例えば、Aの列にはデータを10〜20個入れたとして、 B1にデータ一個を入れます。 このとき、Cの列にはC1=A1-B1、C2=A2-B1・・・というように、 AのデータとB1の差を代入したいと思うのですが、簡単なやり方がわかりません。 確かコピペですいすいいけたと思うのですが・・・ ご教授お願いします。 使ってるのはXPsp1のexcel2002です。
>>721 減算で。
Sub test001()
Range("A1").Resize(20).Copy Range("C1").Resize(20)
Range("B1").Copy
Range("C1").Resize(20).PasteSpecial Paste:=xlPasteAll, Operation:=xlSubtract, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
End Sub
For i=startRow To endRow Cells(i,3).Value=Cells(i,1).Value-Cells(1,2).Value Next つかVBAの質問なの???
724 :
デフォルトの名無しさん :2008/02/10(日) 21:34:29
>>721 C1に=A1-$B$1
C1の右下つかんで下方向にびろ〜んとする
>>720 ありがとうございます。。
というか自分、何やってんだorz
727 :
デフォルトの名無しさん :2008/02/11(月) 20:33:25
プログラミングは詳しくないのですが、どなかたご助力下さい。 (質問内容) フォルダ内で「読取パスワードが設定されいてるEXCELファイルを検索する」 どなかた該当の命令文をおしえていただけないでしょうか。
DOS窓を表示させないまま、DOS窓のコマンド使って標準出力の内容が欲しい場合ってどうすればいいですか? Execだとウィンドウ非表示にできないし、Runだと標準出力につなげないんですが
ぐぐれ コンソール プロセスを生成して標準ハンドルをリダイレクトする方法
KB173085
いまだにDOS窓とか使ってるやつおるんかねぇ
>>732 GUIがないソフトがあるんで使ってる。
DOS窓とコマンドプロンプトは別物
と言うか、WinXPにDOS窓って存在するの?
>>735 アレを、ほとんどの人はDOS窓と呼ぶのだ。
二つのテキストファイルABを読み取り比較した結果を表示するマクロを作りたい。 Aに行が挿入されてBになっている場合、Aにも挿入した分だけ空白行を入れて表示したいが、いい例はないものか。
つ[/usr/bin/diff]
Excel VBAスレでその回答はどうだろう
抽象的な質問には抽象的な回答を。
W9x Wme の DOS 窓は文字通り DOS 窓って言って良いんだけど コマンドプロンプトは DOS とは互換性がないからなぁ
コマンドプロンプトってDOSのエミュレートじゃないの? DOSプログラムは、コマンドプロンプトでは動かないの?
DOSプログラムも動くからDOS窓でいいじゃん
質問です。 以下のが「スタック領域が不足しています」で通りません。 多分再帰が問題なんだろうけど、よくわかりません。 VistaのExcel2007です If文以降に問題があると思うんですけど… Private Sub Worksheet_Change(ByVal Target As Range) Dim Ein As Integer Dim Fin As Integer Dim Year As Integer Dim Month As Integer Year = Range("C2").Value Month = Range("E2").Value Ein = Weekday(Year & Month & "1", 1) Cells(5, 1 + Ein) = ("1") If Month = 2 Then Fin = 28 Else Fin = 31 End If Cells(10, 10).Value = Fin End Sub
>>745 Application.EnableEvents = False
Cells(5, 1 + Ein) = ("1")
If Month = 2 Then
Fin = 28
Else
Fin = 31
End If
Cells(10, 10).Value = Fin
Application.EnableEvents = True
>>746 ありがとうございますm(_ _)m
おかげさまで解決しました
>>742 コマンドプロンプトは純粋なWin32プログラム。
仕様面でDOSの流れを大きく受け継いでいるけど。
コマンドプロンプトの中でDOSプログラムを動かすときには、
NTVDM (NT仮想DOSマシン)でDOS環境をこさえて、
その中でcommand.comを起動し、それから目的のプログラムを実行する。
それ以外だと直接NTVDMから始まるが後は同じ。
コマンドプロンプトとDOS窓の区別が付いてないやつはVBAとマクロの区別も付いていない 間違いない
>>727 無理せずテンポラリファイルにリダイレクトして読め
んなもん、どーでもいい。
>>738 それをEXCEL VBAでやりたい。
(UNIXでやれよ、というのは不可)
>>752 行が挿入されたものか、一部改変されたものかの判断って、どうやるつもり?
判別の難しさと、それに伴う処理速度考えたら現実的じゃないと思うが。
前後データまで絡める判別はVBでは実用的じゃないし、ロジックの問題なら他スレ行け。
>>752 私だったらピボットテーブル使う。
それぞれのテキストをA列に、B列にはどっちのテキストなのかわかる記号を入力しとく。後はわかるでしょ。
diffのソース読めばいいよ
アドバイス多謝。
>>753 >行が挿入されたものか、一部改変されたものかの判断って、どうやるつもり?
一部改変については、次の行を比較して、一致なら改変、そうじゃなければ挿入と考えるつもり。
(二行改変は考慮しない)
問題は、挿入か削除か。
そのセルを上方検索し、見つかれば削除、でなければ挿入って判断かな。
ロジックってこの板?
他人を巻き込んでダラダラやらずに、diffのソース読んだほうが早いって
shell c:\windows\windiff.exe
つfc.exe
"c:\program files\support tools\windiff.exe" /?
>>758-760 神認定
と思って報告したら、
「入ってるPCと入ってないPCがある」と言われたorz
winmerge
cdiff.vbs
2つのExcelファイルをdiffするのをVBAでやりたいのですが?
やればぁ?
やってくださいよ
つc:\program files\support tools\bdiff.exe
エクセルの機能にある、「Webページとして保存」ではなく 1.htmlを記述してあるシートをコピー 2.メモ帳に貼り付け、test.txtとして保存。 3.2のtest.txtをtext.htmlに名前を変更。 というような動作をVBAで自動化できるでしょうか。 もし、似たようなことが可能であれば教えてください。
できるけどエクセルでやるようなこと?
メモ帳を自動化するのはむずかしい
セルの内容をそのままファイルに出力すればいいんじゃ?
>>769 シートの内容をプレーンテキストに出力して拡張子を.htmlにしたいなら
メモ帳なんて使うまでもないが、770も言ってるとおりExcelの仕事じゃない
>>2 ★3,4
>>771 vbsとかで自動化するのは難しいけど
VBAというかVB言語ではSendMessage使えるから簡単だよ
774 :
769 :2008/02/16(土) 19:51:14
ありがとうございます。 具体的な目的を言うと、複数の条件でhtml記述を変化させている シートがありまして、そのhtmlをブラウザでプレビューするのを 先ほどの手順でやっていたのですが、それを簡素ができないものか と思っていたのです。 もう少し考えて見ます。
簡単なSendMessageを使ってもらおうか
教えてください! Excel2007のOfficeボタンを非表示にする方法ってあるのでしょうか? マイクロソフトのライブラリを見てもまだ情報がなくて……。どなたかご存知の方ご教授いただけませんでしょうか。
Officeボタンとは何かというところから解説してください
779 :
デフォルトの名無しさん :2008/02/17(日) 15:39:09
OS:XP、Excel2000でワークシート関数を使用したいと思います。 引数にシート範囲ではなくVBAの配列を指定したいのですが そのままでは出来ません。 引数に配列を指定する方法があれば、ご教授願います。 dim a(10) as long dim b as long b = WorksheetFunction.Max(a)
>>778 様
「Officeボタン」とはExcel2007から追加された、いままでで言う「ファイル」メニューのようなGUIになります。
新しく追加されたGUIのため、Officeボタンのオブジェクトライブラリを操作すれば非表示にすれば良いのか、xmlを編集すれば操作できるのかどうしても判らないんです。
ご存知でしたらご教授戴けると幸いです。
>>779 様
動的配列のサマリを計算するメソッドのようなものがあればそれを代用すれば良いのかもしれませんが、
自分には以下のような方法でいつも計算させてしまっています。
Sub subTEST()
Dim a(10) As Long
Dim b As Long
For inCnt = LBound(a) To UBound(a)
b = WorksheetFunction.Max(a(inCnt))
Next a
End Sub
781 :
デフォルトの名無しさん :2008/02/17(日) 19:13:16
>>780 ご回答ありがとう御座います。
ただ、そのコードだとa(10)の値がbに入るだけではないでしょうか?
>>780 なるほど
あいにく2003なので力にはなれません
でもApplicationクラスのどっかにCommandBarsみたいにあると思うから、
地道に探してみるしかないんじゃ
zzって何者? ヴァッカじゃねーのwww 氏ねよwww チラシの裏でスマソ
>>781 たまたま>780がmax()の仕様を知らなかっただけだろ。
どうしてもワークシート関数を使いたいなら配列を1要素ずつ処理すればいいと言う点では同意。
max()の場合なら、b = worksheetFunction.max(a(inCnt), b)とでもすれば使える。
# average()なんかはそうはいかないけど。
関数の引数にセル位置を「A1」の形式で入れたいとき、 行を変数にはできないんでしょうか? たとえば変数xをSUM関数につかう場合、=SUM(A1:Ax)としてもエラーになりますよね・・
このすれ頭から読み直せ
HYPERLINK関数で質問です。 HYPERLINK関数では、特定の文字を含むリンクは張れないのでしょうか? 現在、HYPERLINK関数を用いたシートの目次を、 マクロで作成しております。 ですが、シート名に記号を含むと参照できないようです。 (@や#などほとんどの記号は駄目ですが、 アンダーバーだけは大丈夫なようです・・・。) しかし、マクロではなく、編集メニューの [挿入]→[ハイパーリンク]から同じシートを指定した場合は、 参照できるようですorz これら2つの操作は全く別物なのかもしれませんが・・・orz --------------------------------------------- <参照できる例> =HYPERLINK("#シート名!A1", "シート名") <参照できない例> =HYPERLINK("#@シート名!A1", "@シート名") Excelのバージョン:2002(10.2614.3311) --------------------------------------------- 参照できない例のようなシート名で、 HYPERLINK関数で参照する方法はありますでしょうか? 何かわかる方がおられましたら、ご助言ください。 よろしくお願いします。
Officeボタンも知らないヤツが、質問スレで回答側に回ろうとするなよw
目先の問題の回答は出来なくても質問の仕方を教えるのはできるだろ
790 :
デフォルトの名無しさん :2008/02/21(木) 19:44:50
エクセルで計算した数値は少数桁何桁精度なのでしょうか?
3桁
Perlについての質問箱スレから誘導されて来ました。 Excel VBAからDOSコマンドを実行することはできますか? 具体的にはPerlスクリプトを実行させて、結果をExcelで受け取って 表示するまでを1クリックで行いたいと思っています。 環境はWindowsXP Home Edition、Excel 2003 です。 よろしくお願いします。
>>793 >Excel VBAからDOSコマンドを実行することはできますか?
ちょいと命令忘れたができる。
VBAからPing送ったりbatを呼び出したりしたりもできるから間違いない。
>具体的にはPerlスクリプトを実行させて、結果をExcelで受け取って
>表示するまでを1クリックで行いたいと思っています。
上の内容を具体的にしたつもりだろうが、上ができたとしてもこちらは関係ないだろ?
PerlからExcelにイベントでも起こさせられれば可能。
XPにDOSは載ってません
796 :
793 :2008/02/22(金) 01:09:30
>>794 ありがとうございます。では情報があることを信じて
再びgoogleの海へと漕ぎ出すことにします。
>上ができたとしてもこちらは関係ない
言われてみたらその通りでした。
いつPerlの処理が終わったかExcel側で知る必要がありますもんね。
>>795 すみません、XPではコマンドプロンプトでしたか。
active perlはどう?
>>792 倍精度の前のIEEE 754って、何を規定した規格の番号ですか?
>>800 Excel2000辺りは倍精度だけど、2003辺りからは拡張倍精度になっているから要注意。
前者は10進数で概ね15桁、後者は10進数で概ね19桁の精度があることになる。
803 :
693 :2008/02/23(土) 16:40:39
解決したよ。 Origin句を定数xlWindowsから、 Shift-Jisのコードページである"932"へ変更してみたところ 文字化けなく開くことができたのでご報告。 その辺の細かな挙動の違いにだいぶ時間使いました・・・。 今後の何かの参考になれば、ということで、ひとつ。
804 :
デフォルトの名無しさん :2008/02/23(土) 16:45:14
VBAやEWCELのlog関数で計算して、その答えから逆算してもとに戻してみたら3桁精度しかなかったのです。 精度をあげる方法がありましたら教えてください。
寡聞にしてEWCELなるものは存じ上げませんが、VBAでやってみたということでしたら ソースをご提示願えませんでしょうか。
EXCELの前身のアプリじゃね
WinXP+Office 2k7です。 ワークシート上部のいくつかのセルに任意の数値を入力するとそれに基づいて全体が計算されるシートを作りました。 B8というセル(自分で数値を入力する)の値がいくつならセルI818が0になるか、というのを探すためにLoopを使ったのですが、 Dim x As Integer x=0.1 Do x=x+0.0001 Range("B8").Value=x Loop Until Range("I818").Value=0 とやってもI818が0になっても普通に通り過ぎてしまいますorz ひょっとしてワークシート上でI818が計算されるのを待たずにLoopが続いてしまうんでしょうか。。? お知恵をお貸しください
お前、小卒か? 整数って意味を知ってるか?
あ、integerじゃなくてdoubleでした。 こっちに書くとき間違えた\(^o^)/
> B8というセル(自分で数値を入力する)の値がいくつならセルI818が0になるか 自分でマクロ書かなくても、それはExcelのゴールシークを使えばいいのではないかと思う。
>>810 うは・・・全然知りませんでした('A`)
お手数おかけしました。ありがとうございます
すれ違いでしたら誘導お願いします。 「マクロを有効化する」を出さずfor文相当の機能を実現しようと思ってます。 直接forは使えないので、富豪的にセルのマスを記憶装置にする方針です。 やりたいことは、以下の状況で 「列Bが「新」の行の数値を抜き出して それをコンマで連結して指定のセル(例えばD100)に入れる」です。 列A 数値(1ずつ増えていく) 列B 「新」「旧」のどちらかの文字 一旦、以下の式をC列に入れて、ドラッグでオートフィルします。 =if(B1="新",A1,"") これはうまく行き、C列には「新規」の行のみに数値が表示されます。 次に、D列の先頭にC1の値を入れます(forの初期条件) 次に「同じ行のC列に値があれば、一つ上のD列の値をコンマで連結」 「同じ行のC列に値がなければ、一つ上のD列の値をそのまま表示」 をforのステップ条件としてD2にかき、D100へオートフィルしようとしたのですが =CStr(D1) & "," & CStr(C2)やCStr(val(D1)) & ..といった式ではうまくいきません。 アドバイス頂けないでしょうか 以上長文失礼しました。
813 :
812 :2008/02/24(日) 11:03:55
↑訂正「新規」ではなく「新」ですね
Vlookupじゃね?
815 :
デフォルトの名無しさん :2008/02/24(日) 12:12:23
>>804 > VBAやEWCELのlog関数で計算して、その答えから逆算してもとに戻してみたら3桁精度しかなかったのです。
log関数は数値が小さいと精度は悪くなる。
少し値が変わると急激に値がかわるからな。
自分で精度のよい関数を作るのがよい。
級数展開とかやれば作れる。
>>805-806 おまえら厨房だな。
816 :
デフォルトの名無しさん :2008/02/24(日) 13:44:03
質問なのですが適当な大きさのユーザーフォームを作成してフォームの中にラベルや ボタンを設置します。設置したラベルやボタンが常にフォーム幅の真ん中に設置 させる方法はありますでしょうか?フォームの大きさを後で変更しても真中に自動で なるようにしたいです。
817 :
812 :2008/02/24(日) 15:25:46
>>814 それだとコンマをくっつけることができませんでした。
しかし、結局、こんな感じで解決しました
if(C2<>"",concatenate(D1,",",text(C2,"#")),D1)
819 :
800 :2008/02/24(日) 22:00:00
820 :
デフォルトの名無しさん :2008/02/24(日) 22:38:32
816さんどーゆうことですか?
821 :
802 :2008/02/24(日) 22:49:22
あーそうそう、そこの精度の欄にある、暗黙と仮数を足した53ビットを10進で表わすと概ね15桁ってこと。 つまり、log2(2^53)≒15.95=15~16桁。
822 :
デフォルトの名無しさん :2008/02/25(月) 10:04:55
教えていただきたいのですが、エクセルで、Aの列に任意のセルのカーソルが ある場合のみ(B列やC列ではプログラム自体が稼動しなくしたいのですが) FANCTIONを実行したいのですが、うまくいきません。 どうしたらうまくうごくのでしょか?
>>822 もうちょっと分かるように説明しる。あと、どんなFUNCTIONよ?
ボタン押したときに、カーソルが特定の列にある場合にのみ処理を有効にしたいってことか?
824 :
デフォルトの名無しさん :2008/02/25(月) 11:38:48
822です。 >カーソルが特定の列にある場合にのみ処理 まさにこの事です。エクセルの行列のデーター をVBで計算させてるのですが、キーの列をA列にして そこからActiveCell.Offset(0, x)とActiveCell.Offset(0, x+1) を足してActiveCell.Offset(0, x+2)へ答えを出しなさいとしてるのですが、 いかんせん、キーにしているA列以外にセルがある場合も実行していまうので ActiveCell.Offset(0, x+2)の書き込みたいところデーターのあるActiveCell.Offset(0, x+3) とかに上書きしていまうので、何とかしたいのです。FANCTIONは ActiveCell.Offset(0, x+3)=ActiveCell.Offset(0, x)+ActiveCell.Offset(0, x+2) を変数にしたものです。
825 :
デフォルトの名無しさん :2008/02/25(月) 11:42:10
すいません。間違いました。FANCTIONは ActiveCell.Offset(0, x+2)=ActiveCell.Offset(0, x)+ActiveCell.Offset(0, x+1) を変数にしたものです。 です。
>>825 単にFANCTIONとやらの先頭で、ActiveCellがA列じゃなければ終わればいいだけじゃね?
827 :
825 :2008/02/25(月) 12:58:53
ActiveCellがA列じゃなければが、 書けないのです・・・
そもそも>824のxはどこから出てきたのか知らんが、 offsetプロパティに辿り着けるくらいならcolumnプロパティくらい見つけられるだろ。 試しにmsgbox activecell.columnして味噌。
829 :
825 :2008/02/25(月) 14:11:10
If ActiveCell.Column = 1 Then で出来ました! 828さん ありがとうございます。 感謝 感謝!
830 :
デフォルトの名無しさん :2008/02/25(月) 15:57:11
基本的な質問でスミマセン! ワークシートに新しい埋め込みグラフを作成(Addメソッドによる)したいのですが Dim co As ChartObject Set co = Worksheets("sheet1").ChartObjects.Add(50, 40, 200, 100) は正常に動くんですが Worksheets("sheet1").ChartObjects.Add(50, 40, 200, 100) は、構文エラーになります。なんで? わざわざ変数に格納しないと、機能しないのはなぜなのでしょうか? 詳しい人おられましたらご教授いただけないでしょうか?
そういう構文だからだろ。疑問を持つところじゃない。
832 :
デフォルトの名無しさん :2008/02/25(月) 17:16:37
Rng AS Range Rng1 AS Range Rng2 AS Range Rng=Range("A1:G10") このRngから一番右の範囲をRng1に入れたい。 またRngから一番右の列を除いた範囲をRng2に入れたい。 どのようにすればよいでしょうか?
union
835 :
デフォルトの名無しさん :2008/02/25(月) 18:49:27
>>832 Rng1=Rng.Resize(Rng.Row.Count-1,Rng.Columns.Count).offset(1,0)
Rng2=Rng.Resize(1,Rng.Columns.Count).offset(1,0)
>>830 Worksheets("sheet1").ChartObjects.Add 50, 40, 200, 100
ところで君たちは未だにVB独特のハンガリアン記法を守っているのかい? 今度VBAをメンテすることになって読みにくいなあと思ってるんだが・・・。
なんでExcelでシステムハンガリアン使うん?
>>835 はぁ?
>>832 Set Rng1 = Rng.Columns(Rng.Columns.Count)
Set Rng2 = Rng.Resize(, Rng.Columns.Count - 1)
840 :
デフォルトの名無しさん :2008/02/25(月) 23:55:21
質問です、デスクトップでユーザーフォームだけ残してエクセルは最小化する方法はありますでしょうか?
任意のxisファイルを2個各シートに読み込みたいのですが どうやってもできません・・・ ファイルの読み込みってどうやればいいのでしょうか?
>>841 ブックを開いておいて、シートを移動すれば医院で内科医。
vbaを使用してRS232cで計測するはめになったんですが、エクセルのvbaはvb6のようなタイマがないので、 擬似的なタイマを作成するときに、何か注意点とか欠点教えてください
ご愁傷様。
>>842 VBAでボタンでファイルを選択って出したいのです!
でも参照とか選択ってBOXの出し方すら分かりません・・・
847 :
デフォルトの名無しさん :2008/02/26(火) 01:14:15
質問です、デスクトップでユーザーフォームだけ残してエクセルは最小化する方法はありますでしょうか?
>>846 おお、これでBOX造れるんですね!どうも!
またちょっと頑張ってみます
>>847 こういう事?
Private Sub UserForm_Initialize()
Application.Visible = False
UserForm1.Show
End Sub
850 :
デフォルトの名無しさん :2008/02/26(火) 08:29:10
Dim a As Integer a = Count("a1:a4") For i = 1 To a Beep Next i シートのデーター数だけ繰り返し処理したいのですが a = Count("a1:a4")ここんとこがエラーになってしまいます。 どう処理したらいいのでしょう?
a = WorksheetFunction.Count(Range("a1:a4")) でどう? 試してないけど。
852 :
デフォルトの名無しさん :2008/02/26(火) 16:50:49
851さん 850です。動きましたありがとうございました。
853 :
デフォルトの名無しさん :2008/02/26(火) 19:00:35
Renge(RefEdit1.Value)と使いたいのですが RefEdit1.Valueを『セル範囲』かどうか調べる方法はありますでしょうか? よろしくお願いします。
854 :
デフォルトの名無しさん :2008/02/26(火) 20:10:29
フォームから入力するVBAを作成しました。 プログラムを走らせ、フォームがでますが、 何も入力せずに放置するとFrame内だけが白くなります。 改善する方法はありますでしょうか?
855 :
デフォルトの名無しさん :2008/02/26(火) 21:57:03
830です。
>>834 さん
なるほど!。値を渡す構文になってしまっていたのですね!
>>836 さん
本当だ!動きました。ありがとうございました。
834さん。836さん。お陰様で疑問が解決しました。感謝!感謝!
857 :
デフォルトの名無しさん :2008/02/27(水) 09:51:07
モニタの色温度を変えると白を赤っぽく変えたりできるよ
>>854 再現する最低限の構成で、ブックもしくはユーザーフォームモジュールをうp
情報全く無しじゃ、さすがに改善法どころか改善可能か否かすらもわからんわな
俺らはそれだけVBAをさわってないってことさ。
現実の出来事かどうかすらあやしい
他のフォームでも同じ現象になるのか検証したの?
864 :
デフォルトの名無しさん :2008/03/01(土) 04:27:20
エクセルで作った表を画像として保存するマクロってありますかねぇ?
>>864 VBAの範囲だけじゃ無理だけど実現可能
866 :
入院中の側近 ◆0351148456 :2008/03/01(土) 08:15:23
>>864 (っ´▽`)っ
暇なので作ってみたよ☆
Option Explicit
Private Declare Function GetVersionExA Lib "KERNEL32.DLL" ( _
ByRef pVersionInfo As OSVERSIONINFO _
) As Integer
Private Declare Sub keybd_event Lib "USER32.DLL" ( _
ByVal bVk As Long, _
ByVal bScan As Long, _
ByVal dwFlags As Long, _
ByVal dwExtraInfo As Long _
)
Private Const VK_SNAPSHOT As Long = &H2C
Private Const VK_MENU As Long = &H12
Private Const KEYEVENTF_KEYUP As Long = &H2
Private Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End Type
(次レスに続く)
867 :
入院中の側近 ◆0351148456 :2008/03/01(土) 08:16:12
(
>>866 の続き)
Public Sub printScreen()
Dim pVersionInfo As OSVERSIONINFO
pVersionInfo.dwOSVersionInfoSize = Len(pVersionInfo)
If pVersionInfo.dwMajorVersion >= 5 Then
Call keybd_event(VK_SNAPSHOT, 1, 0, 0)
Else
Call keybd_event(VK_MENU, 0, 0, 0)
Call keybd_event(VK_SNAPSHOT, 0, 0, 0)
Call keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0)
Call keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0)
End If
End Sub
868 :
入院中の側近 ◆0351148456 :2008/03/01(土) 08:36:24
(っ´▽`)っ
>>866-867 はPrintScreenするマクロだよ。
あとは任せた☆(っ´▽`)ノシ
869 :
デフォルトの名無しさん :2008/03/01(土) 08:41:50
割り込みで申し訳ないですが、パラレルポート制御を 考えているんですが、VBIOSCMみたいなDLLってVista対応版は ありますか? その他でパラレル制御の方法はありますか? 是非ご教授願います。
870 :
デフォルトの名無しさん :2008/03/01(土) 10:07:39
PC内のフォルダおよびファイルを全て エクセルシートに書き出したい。 DIR関数でやってみたけど、 フォルダを見つけたら階層を掘って、掘り尽くしたら戻って… て処理が上手く行かない。 ご協力頼んます
(っ´▽`)っ はプロかな?凄いな
872 :
入院中の側近 ◆0351148456 :2008/03/01(土) 10:21:41
873 :
入院中の側近 ◆0351148456 :2008/03/01(土) 10:28:33
>>870 (っ´▽`)っ
こういう関数を作る。
引数:フォルダ
処理
・引数のフォルダの情報をワークシートに書き出す。
・フォルダ内の全てのファイルの情報をワークシートに書き出す。
・フォルダ内の全てのサブフォルダに対し、それを引数として当関数を呼び出す。
(っ´▽`)っ
ちなみにエラーをキャッチしておかないと、
参照不可のフォルダ、ファイルのところで処理が止まるよ。
ファイル、フォルダに関してはScripting.FileSystemObjectを使うといい。
874 :
870 :2008/03/01(土) 11:16:18
>(っ´▽`)っ ありがとう。やってみます。
なんだ、ファイルを全て書き出したいと言うから中身を書き出したいのかと思ったぜ。 単にファイル名を書き出したいだけなんだな。
FSOに慣れておくとASPにもVBSにも使えるからオトクです(^ω^)
878 :
デフォルトの名無しさん :2008/03/02(日) 23:54:52
物凄く基本的な事で申し訳ないのですが・・・、処理待ちでスリープを掛けたく、 WScript.sleep (250) と記述していますが、エラー424 オブジェクトが必要です というエラーが出るのです。 何か参照設定が足りないんでしょうか。。
ググれよ・・・
>>878 WScript.exeを参照設定しろー
881 :
デフォルトの名無しさん :2008/03/03(月) 00:45:53
>>880 ありがとうございます。
WScript.exeを参照し、Windows Script Host(Ver5.6)を参照設定に加えたのですが
やはり同じエラー出ました。
参照の問題では無さそうなので、設定も含めた他の部分をもう一度見直して見ます。
>>879 当然質問前に検索したのですが、WScriptの参照設定について記述されたページが見つからなかったもので・・・。
すみませんでした。
Win32 APIのSleep関数を使えばいいじゃない。
>>878 それって、Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)じゃいけないの?
自分が過去に作ったソースをよく探すんですけど、 Excelファイルが散在してるし、開いてからAlt+F11を押す手間とか効率悪いです。 GoogleDesktopSearch用Excel VBAプラグインってないもんですかね?
別にプラグインじゃなくてもブックファイルからVBAを抽出するだけでもよさそうな。 まぁ、そういうものがあるかどうかって話になるけど。
>>885 VBAのコードは、マクロでファイルにexportできるから、作ろうと思えば比較的簡単に作れる。
ただし、そのexportしたものがGDSでIndexingされるかどうかは、別の話。
VBAソースをいっぺんに吐き出すマクロ(Excel2003)
準備
・A列にファイルリストを作る
参考:
ttp://www.vbalab.net/vbaqa/data/excel/log/tree_199.htm ・ツール→マクロ→セキュリティ→信頼できる発行元
のVBプロジェクトへのアクセスを信頼するをON
ext(1) = ".bas": ext(2) = ".cls": ext(3) = ".frm"
Set xl = CreateObject("Excel.application")
xl.Application.Visible = True
xl.AutomationSecurity = msoAutomationSecurityForceDisable 'マクロ無効
For i = 1 To 9999
bookName = Cell(i, 1)
If bookName = "" Then Exit For
Set bk = xl.Workbooks.Open(bookName, False, True)
With bk.VBProject.VBComponents
For j = 1 To .Count
If .Item(j).Type <= 3 Then _
.Item(j).Export bookName & "_" & .Item(j).Name & ext(.Item(j).Type) & ".txt"
Next
End With
bk.Close SaveChanges:=False
Next
889 :
デフォルトの名無しさん :2008/03/04(火) 12:34:14
すいません。KILLの使い方が分かりません。 たとえば、BOOK1のファイルごと、削除したいのですが どうゆうコードで書いたらいいのですか?
killはファイルを消すときに使う
kill "your.xls"
Kill "BOOK1.*"
質問させてください。 .value = "hogeの値は" + hoge + "です" の表記をしたいのですが、""テキストと、変数を並べて表記する方法が分かりません。 +で結合ではありませんでした。 VBAでのテキストと変数の表記方法を教えてくださいませ。
895 :
デフォルトの名無しさん :2008/03/05(水) 12:44:58
Private Sub CommandButton1_Click() Kill "BOOK1.*" End Sub book1のファイルのコマンドボタンでこれを実行すると、ファイルが みつからないとエラーだでてしまうのですが・・・ ファイルをかっこよく消したいです。
>みつからないとエラーだでてしまうのですが・・・ かっこわりw もしかして、ワイルドカードが使えないんじゃないの?
897 :
デフォルトの名無しさん :2008/03/05(水) 13:17:44
*←これでしょ? でも使えないの・・・
* これを見るだけでなんか恥ずかしくなってしまうよな
899 :
デフォルトの名無しさん :2008/03/05(水) 14:42:21
違うの?
900 :
デフォルトの名無しさん :2008/03/05(水) 15:30:35
すいません、ExecuteExcel4Macroで、ループを使わずに 一気に範囲データを読み込むことは出来ないのでしょうか?
901 :
デフォルトの名無しさん :2008/03/05(水) 17:00:06
Dim d(100,100)AS Douale3Dim rng AS Range rng=Range("A1:C3") このrngから配列dに行列を入れ替えて代入する方法がわかりません。 どのようにすればよいでしょうか?
Excel VBAとかマジわかんないけど If ActiveCell.Column <> 1 Then Exit Function End If じゃだめなの?
>>901 訂正します。
Dim d(100,100)AS Double
Dim rng AS Range
rng=Range("A1:C3")
d=(double)Transport(rng)
↑
このrngから配列dに行列を入れ替えて代入する方法がわかりません。
どのようにすればよいでしょうか?
>>900 まずはどうしてもループが使えない事情があるなら説明してみろ
単に使いたくないとか時間が掛かるとかなら帰れ
906 :
900 :2008/03/05(水) 21:19:31
>>905 お前に言う必要は無い。
わからないならレス不要
907 :
900 :2008/03/05(水) 21:38:46
自己解決しました。 お前らマジ役立たず
908 :
900 :2008/03/05(水) 21:39:40
なんだか偽者出てるみたいですが、900です。
>>905 ループで一度データをコピーするプログラムを作成したのですが、
開始から終了までかなり時間がかかってしまうことが分かりました。
処理時間を軽減できないかと考えて、範囲ごとコピーできないかと考えた
のが理由です。
縦横変換したものを一旦シートに貼り付けて、それから変数に代入しろ
910 :
デフォルトの名無しさん :2008/03/06(木) 02:28:41
>>900 速度向上のためにはSelectするな!withを使え!
Rangeで取り込んで配列に一括取り込み。
911 :
デフォルトの名無しさん :2008/03/06(木) 02:32:43
>>903 まず型変換して代入で可能
d=CDbl(rng)
あと行列逆転はFor〜Nextで1セル毎にループでできるが、一括でできる方法はないかな?
速度気にするなら、まずExecuteExcel4Macroでやろうってのが間違いだと気付け
>>908 ExecuteExcel4Macroなんか使って読みにくく、また他に使い途もないコードを書くより、
ADO使って"SELECT * FROM [Sheet1$]"みたいにやった方が、将来的に考えて
色々と応用できて幸せになれる確率が高いぞ
914 :
900 :2008/03/06(木) 09:50:11
御回答ありがとうございます。 ExdcuteExcel4Macroは使わない方針でいってみたいと思います。
Publicで宣言したプロシージャを ツール→マクロ→マクロとメニュー選択した際のダイヤログボックスに 表示させない方法があったと思うのですが、 どうやればいいでしょう????
917 :
初心者 :2008/03/06(木) 11:40:13
初歩的な質問かと思いますが、可能な限り過去の書き込みを検索しましたが、解決できませんでしたので、質問させていただきます。 A1からA10に数値の値が入っているとします。 もしこのA1からA10までの値がすべて0だったら、○○というプログラムを実行する、というマクロを組みたいと思っています。 If Worksheets("Sheet1").Range("A1:A10") = 0 Then Call ○○ End If というふうに自分では作ってみたものの、うまくいきません。 アドバイスの方よろしくお願いします。
918 :
デフォルトの名無しさん :2008/03/06(木) 15:42:25
>>915 シート作成は速度の関係上できるかぎり避けたいのです。
関数やプロパティで行列を逆に入れ替える方法はないでしょうか?
>>917 dim i as integer
for i = 0 to 9
if worksheets("sheet1").range("a1")..text <> "0" then exit for
next
if i == 10 then
call ***
end if
あ、思いっきり間違ってた。 if worksheets("sheet1").range("a1")..offset(i,0).text <> "0" then exit for が正解。
922 :
デフォルトの名無しさん :2008/03/06(木) 16:47:13
>>919 シート作成するのが通常よく使うよね。
VBAではあまり速度を問われないことがおおいから。
私もそうですし他の方法しか教えられない。
>>918 気長にVBAスペシャリストを待ちましょう。
923 :
919 :2008/03/06(木) 16:53:13
スペシャリストの俺に喧嘩売ってんのか?
取りうる方法は三つしかない。 ・行列を変換しながら1セルごと配列にコピー ・rangeを配列にまるごとコピーした後に、行列を変換しながら別の配列に代入 ・行列を変換して別のシート(同じシートでもいいが)にコピーしてから、rangeを配列にコピー 実行する内容や量やExcelのバージョンやPCのスペックによって変わるから、 自分で測って一番速い奴を使え。
んなこたーない。 dim rng as range dim d as variant set rng = worksheets("sheet1").range("a1:c3") d = application.worksheetfunction.transpose(rng)
926 :
デフォルトの名無しさん :2008/03/06(木) 18:43:57
教えて先生!! あたしシートの追加をしたいのぉ Sub Macro1() Dim unko As String unko = "ウンコ" Sheets.Add ????? End Sub 変数名を取得して、その変数名をシート名としたシートを追加したいというかぁ リネームじゃなくて、ダイレクトに追加できればいいなぁとおもうの。 エロイ人おしえてーー。
>>901 dがVariant型でよければ、
d = WorksheetFunction.Transpose(Range("A1:C3"))
でdには縦横入れ替えた2次元配列が格納される。
928 :
927 :2008/03/06(木) 20:10:40
>>916 そういう時は、dummyで使わない引数をプロシジャの()の中にセットする様にしているけど邪道か?
930 :
デフォルトの名無しさん :2008/03/06(木) 21:14:07
>>925 dim rng as range
dim tmp as variant
dim d as double
set rng = worksheets("sheet1").range("a1:c3")
tmp = application.worksheetfunction.transpose(rng)
最後に
forループで
tmp(i,j)からCDbl(d(i,j))に代入しました。
かなり速度が改善しました。
ありがとうございました。
クラスを書く習慣を付ける
932 :
916 :2008/03/06(木) 22:26:58
>>929 問題なしです!ありがとうございました!
>>895 book1を開きながらbook1ファイルは削除できまい。
あと、book1は何処に保存してあるのか。
>>931 誰に言ってるの?
必要ならつけりゃいいが、必要ない場合もある。
たとえばシートモジュールでMe.なんてウザイだけ。
>>934 何だよヴォケ!
クラスを明示するの当たり前だろ?
>>925 みたいなコードもブックから明示してないからまだまだだね。
ブックの上のApplicationも明示しないとね。
相手の欠点はよくみえるが自分の欠点はみえないんだよ。 こどもじゃあるまいし、書いてることをそのまま実行したりはしないよ。 ヒントがわかれば十分。
937 :
926 :2008/03/07(金) 05:40:25
うぅ・・・分かる方、いらっしゃいましたらhelpです・・・>< もしくは、追加→リネーム の方法がベストなのでしょうか。 bookを開いてから、何枚のシートを追加したかの監査変数を使う事が避けられれば理想なのですが・・。 皆さんどのようにしているのかも興味があります。 何卒よろしくお願いします。 お礼にこれあげます。>+(
>>937 sheets.Add().name="ウンコ"
939 :
938 :2008/03/07(金) 07:12:38
>>937 試してみたら()も省略できた
sheets.Add.name="ウンコ"
>>937 一応マジレスしておくと、質問するならふざけるな。
ふざけないで質問してたらきっと即レスついたはずだ。
941 :
895 :2008/03/07(金) 09:04:48
933さんありがとうございます。 >あと、book1は何処に保存してあるのか。 これは、C:\Documents and Settings\xxx と指定すればいいのでしょうか?
942 :
895 :2008/03/07(金) 09:17:12
それと、例えば、エクセルのファイルネーム”あ”.xlsのファイルにパスワード を設けて(例えばパスワードは10)他の人に勝手に開かれないようにしてるのですが 人のPCのデータを除き見るやから達からデータを守る為、パスワードの入力を 例えば3回失敗したらファイルごと、どこのディレクトリに合っても強制削除したいのですが どうコードを書いたらいいのでしょか?
自分自身のマクロでそれをするのは無理。
>>935 おろ?
君は
>>925 と
>>931 じゃなかったの?
似たようなこといつも言ってるMougの馬鹿を一人知ってるんだが。
ってか彼はうるさい割にはいつもシートからしか明示しないがね。
945 :
925 :2008/03/07(金) 11:16:26
なんだか知らんけど、俺を巻き込まないでくれ・・・
質問です。私の持っているVBA本に 「同一モジュール内に同名の行ラベルを設置できない」 って書いてあったので、検証しようと思い以下のサンプルコードでテストしました。 ' プロシージャ「p1」 Public Sub p1() On Error GoTo ErrHandler Err.Raise 10 Exit Sub ErrHandler: Debug.Print "エラー発生@" End Sub ' プロシージャ「p2」 Public Sub p2() On Error GoTo ErrHandler Err.Raise 10 Exit Sub ErrHandler: Debug.Print "エラー発生A" End Sub 同一モジュール内にプロシージャ「p1」も「p2」も「ErrHandler:」という行ラベルを設置していますが、 それぞれの「On Error GoTo」はきちんとプロシージャ内の「ErrHandler」へ処理しています。 これってどういう事なんでしょう? 私の持ってるVBA本が間違っているのでしょうか???
>>946 はい、その通り間違っているので、書名を公開してみんなが不幸せになるのを防ぎましょう。
マクロの中で自分のファイル名(フルパスで)を取得するにはどうすればよいですか?
thisworkbook.pathとname
>>942 Sub hoge()
Dim a As String
Dim w As Object
Dim v As Object
a = ThisWorkbook.Path & "\" & ThisWorkbook.Name
Set w = CreateObject("WScript.Shell")
Set v = w.exec("cmd.exe /c del """ & a)
Application.Quit
' Do Until v.stdout.atendofstream
' MsgBox (v.stdout.readline)
' Loop
End Sub
>>950 それ、マクロ無効にすると開けちゃうから。
「クラスを書く習慣をつける」って書いたの俺なんだけどさ(
>>935 じゃない)
別件(Public云々)にレス付けたつもりだったんだが、曲解した挙げ句に意味不明な粘着を発揮してるキチガイが居るな
なんだよ「Mougにホゲホゲ」ってよ
見えない敵が見えてる系のキチガイの考えることはマジで分からんw
> 934 名前: デフォルトの名無しさん [sage] 投稿日: 2008/03/07(金) 00:08:32
>
>>931 > 誰に言ってるの?
> 必要ならつけりゃいいが、必要ない場合もある。
> たとえばシートモジュールでMe.なんてウザイだけ。
> 944 名前: デフォルトの名無しさん [sage] 投稿日: 2008/03/07(金) 11:05:26
>
>>935 > おろ?
> 君は
>>925 と
>>931 じゃなかったの?
> 似たようなこといつも言ってるMougの馬鹿を一人知ってるんだが。
> ってか彼はうるさい割にはいつもシートからしか明示しないがね。
953 :
デフォルトの名無しさん :2008/03/08(土) 00:04:09
Excel2003 XP SP2 ブックを非表示にして、フォームをタスクトレイに常駐させてタイマー処理は実装可能でしょうか? 教えてエロい人
YES
955 :
944 :2008/03/08(土) 04:39:19
>>952 とぼけても無駄無駄w
お前はMougでも感じ悪いけどこっちでも感じ悪いな。
NO
とぼけてるのがいるなw
見えない敵と戦う聖戦士がム板にも湧いてきて、粘着してくるとは思わなんだわ 悪いことは言わないからMougとやらで聖戦に興じてろや 釣りにしてもキモすぎるし、真性だとしても治療に付き合う義務はない
959 :
デフォルトの名無しさん :2008/03/08(土) 15:06:06
アクティブじゃないシートの選択しているセルの値ってとれないでしょうか? シート名が特定できれば、一旦アクティブにして値をとって戻るとか出来るのですが いろいろなシート(名)を対象に出来るようにと思っています よろしくお願いいたします
>>958 いらんおせっかい書くからだよ。
つまらん自説を述べるから粘着される。
VBEで挿入できるものに、ユーザーフォーム、標準モジュール、クラスモジュールの3つがあるけど、 クラスモジュールだけ使ったことがない。これってどういう時に使うもんなんです? Excel2002ですけど。
962 :
デフォルトの名無しさん :2008/03/08(土) 23:37:13
そのまんまクラスを書くモジュール VBAだと継承ができないんで、独自イベントを実装したいときとか、 構造体代わりに使うとか、コントロール配列を実現させたいときに 使うぐらいしかないけどね(^ω^;)
963 :
961 :2008/03/09(日) 08:10:28
んんん、、、判らん w スマソ まだ俺のレベルでは必要ないって事すかね www
ExcelVBAごときにクラスなんかいらん
strategy patternを使いたいときとか
コントロール配列を実現させたいとき=継承 だったと思うから 「継承代わりに使いたいときだけ」 しか使わん
967 :
デフォルトの名無しさん :2008/03/09(日) 18:58:31
CSVの書き出しに関して、教えてください。 EXCELデータを、カンマ区切りの改行コードつきCSV形式で書き出したいのです。 ↓このような感じ 項目1,項目2,項目3,改行コード(vbcrlf)項目1,項目2,項目3・・・ print # でコード記述 データの最後は改行コード(vbcrlf)で終了しなくてはいけないのですが、 そうすると当然のことですが、最後に余分な空白行ができてしまいます。 改行コードで終了するが、最後の空白行はなくす、ということは可能なのでしょうか? 「もう。無理です・・・」と泣きを入れてみたのですが、なんとかしろ、 とのお達しがあり、もし、良い方法があれば伝授いただければ助かります!! 宜しくお願いします。
最後に余分な空白行が出来ているというのは気のせい。
「余分な空白行」というのは、CRLFCRLFのことだが、もしファイル末尾がそうなっているとしたら、 それはコードのバグ。 ファイルの末尾がCRLFで終わっているなら、余分な空白行など存在しない。
ぐぐれ 最後の改行 vb
971 :
デフォルトの名無しさん :2008/03/09(日) 20:08:08
ありがとうございます 「EXCEL VBA 改行コード」で検索していたのですが、 良い方法を見つけることが出来ず、悩んでいました。 頑張って挑戦してみます
最後の改行と余分な空白行というのは違う意味だと思う
>>971 ちょっと待て。何をどう挑戦するつもりなんだ?
974 :
側近中の側近 ◆0351148456 :2008/03/09(日) 21:56:06
(っ´▽`)っ EOF直前の改行は本来必要なものと考えるが。 たまにEOF直前の改行がないテキストファイルを見るが、あれはどうなの? ちなみにviだとエラーメッセージが出るぞ。
975 :
側近中の側近 ◆0351148456 :2008/03/09(日) 22:01:32
(っ´▽`)っ???
>>967 のいう「余分な空白行」ってこういうことだよね?
"aaa\r\nbbb\r\nccc\r\n"(\r\nは改行コード)
これを
"aaa\r\nbbb\r\nccc"
にしたいってことでしょ?多分。
「『なんとかしろ、』とのお達しがあり」
ってあるけど、その「なんとかする」理由は何だろうね?
何もないのに言ってるなら、その人にもうちょっと勉強しろって言いたいんだけどね。
976 :
側近中の側近 ◆0351148456 :2008/03/09(日) 22:02:33
(っ´ω`)っ おもいっきりスレ違いだね いきててごめんね
「余分な空行」という夢オチ
CSVファイルはRFC 4180の仕様だと、 最後のレコードの後には改行はあってもなくてもいいらしい。 オレの場合は最後のレコードの後には必ず改行付けるけどね。
975のようなテキストをメモ帳か何かテキストエディタで開いたとき、 aaa bbb ccc I ← ここにカーソルが移動できる ということを「最後に余分な空白行ができてしまう」と言っているんだと思った。 だとしたら、それは最後にCRLFを置いているからだとしか言いようがない。
excel2003 xp 他のシートの複数セルのSetの仕方がわかりません。 Dim Rng AsRange Sheets("sheet2").Activate Set Rng = Range(Cells(1, 1), Cells(2, 2)) Sheets("sheet1").Activate Set Rng = Nothing こう書けば一応動くのですがWithを使い With Sheets("sheet2") Set Rng = Range(.Cells(1, 1), .Cells(2, 2)) End With と書いてもsheet1のA1: B2が入ってしまいます。 よろしくお願いします。
Set Rng = .Range(.Cells(1, 1), .Cells(2, 2))
Unix文化ではうんたらかんたら
983 :
デフォルトの名無しさん :2008/03/10(月) 12:48:36
「#N/A」のようなエラーセルの値を変数に入れようとすると 「型が一致しません」というエラーが出るのですが、 例えばエラーセルの値をコンスタントに、「""」として処理するような 事は可能なのでしょうか? VBAがセルのエラー値をどのように扱っているのか、 msgboxで出すことも出来ないので 困っています。 お知恵拝借できると幸いです。
トラップ処理すれば
If(IsError(...
987 :
983 :2008/03/10(月) 14:27:26
Ctrl+セルクリックで選択範囲を追加していけますよね それをVBAで行うにはどうしたらいいですか? 例えば.Cells(i,j)が選択してある状態で、さらにCells(i+10,j)を追加で選択するにはどうしたらいいですか? .Cells(i,j).Select hoge .Cells(i+10,j)Select ←ここで、それまでの選択範囲に追加する形にしたい
selectionでrange取得 rangeに新cellを追加 追加したrangeをselect
990 :
988 :2008/03/10(月) 18:07:51
>>989 >rangeに新セルを追加
はどうやって実現するのですか?
991 :
デフォルトの名無しさん :2008/03/10(月) 19:46:03
Excel2003 XP SP2 結構でかいファイルのI/Oやコピーなどの処理をワーカースレッドで行なうことは可能でしょうか?
993 :
デフォルトの名無しさん :2008/03/10(月) 20:52:13
勉強中の者です。初歩的な質問で申し訳ないのですが、お力添えをお願いします。 条件分岐で、"A1"セルに何か入っている場合に実行、 空欄の場合はエラーメッセージを出したく思います。 if range("A1") = true then msgbox("実行") else msgbox("空欄です。") end if としてみたのですが、思うように動作致しません。 てっきり、false = 0 、 true は何か要素がある。と頭にあったのでやってみたのですが、 VBAの壁にぶちあたっております。 何卒、ご助力を賜りたく存じます。よろしくお願いします。
=""
995 :
デフォルトの名無しさん :2008/03/10(月) 21:21:05
If Range("a1").Value <> "" Then MsgBox "何か入っている" Else MsgBox "空欄" End If
false = 0 、 true = -1 0 = false、 0以外 = true
if Typename(Range("A1")) <> "Empty" then 〜 ではどうか
998 :
デフォルトの名無しさん :2008/03/10(月) 22:47:48
みなさんありがとうございます。 検証してる間にスレ落ちしてしまうと申し訳ないので、お礼だけ先に。 明日検証いたします。 本当にありがとうございました。
.
1000ならジュースでも飲むか
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。