1 :
デフォルトの名無しさん :
2011/09/25(日) 15:20:07.80
2 :
デフォルトの名無しさん :2011/09/25(日) 15:21:09.23
ExcelのVBAに関する質問スレです ★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 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み、 コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。 ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。 ★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)
タッチダウン3げと
exportの使い方がいまいち分からないので教えて欲しいのですが シート1にある画像をpicフォルダにファイル名をnow+連番で保存しながら削除していくのを作りたいのですがうまく保存できません Dim myRess As Variant Dim ren As String Dim nm As Integer nm = 0 ren = Now ren = Replace(ren, "/", "") ren = Replace(ren, ":", "") ren = Replace(ren, " ", "") For Each pic In Worksheets("Sheet1").Pictures myRess = Worksheets("Sheet1").Pictures(pic.Name).Export( _ ThisWorkbook.Path & "\pic\" & ren & "_" & nm & ".jpg" _ , "JPG", False) pic.Delete nm = nm + 1 Next exportのところがうまく動いてくれないので保存できるようにするにはどうすればいいでしょうか
for eachでpicに入れているのに Worksheets("Sheet1").Pictures(pic.Name) これは突っ込んで良いのか?
>>4 Picture オブジェクトにはExportメソッドが存在しないんじゃないの?
Chart オブジェクトなら使えるんだろうけど
ではpictureオブジェクトをjpgで保存するにはどうしたらよいでしょうか
8 :
デフォルトの名無しさん :2011/09/25(日) 17:17:04.33
ある名前のシートがbookに存在するかどうかのメソッドはないのかな 自分で調べりゃいいだけなんだけど、なんでないのかなと
>>7 vbaでは機能自体がサポートされてない
webで検索するとシート自体をHTML保存するとpictureオブジェクトがそれぞれ独立した画像ファイルとして保存されるので、
それを拾い出して使う、というやり方が多いみたい
Excel2007だけど、ユーザーフォームのコマンドボタンにtoolchiphelpとか言うんだっけ? マウスポインタを置いた時にコメントみたいなもの出すのあるじゃないですか、 あれ出すことって出来ませんでしたっけ?
>>10 CommandButton1.ControlTipText = "ツールチップはchipじゃなくてtip"
>>8 自分で答え書いてるじゃんw
> 自分で調べりゃいいだけ
だから無いんだよ
質問は >なんでないのかなと じゃないかw
>>14 何か勘違いしてないか?
「自分で調べりゃ」ってのは、自分でググればとかいう意味じゃなくて
「ある名前のシートがbookに存在するか」を「自分で(コード書いて)調べりゃ(取得すれば)」
簡単にできることだから、わざわざそういうメソッドを用意してないんだろってことが
「なんでないのか」の答えだってことだぞ
説明させんなよ、恥ずかしいw
基本的なことだと思うのですがすいません。 例えば、変数「name」が文字列"20110926tokyo晴"である場合 select case name case name の文字列にtokyo を含む場合 あるセルに東京と入れる case name にosaka を含む場合 あるセルに大阪と入れる end select みたいな処理をしたいのですが、変数の文字列の一部分だけ 一致で判別して処理を選ぶというのはどうしたらいいのでしょうか? 「*」とかで挟んだりするのかなと思い調べてみたのですが、よくわかりません。 あるいは、これは出来ないことなんでしょうか?
Is
>>17 ありがとうございます。そんなことでよかったんですね(^^;
恥ずかしいです。すいませんでした。
>>16 Select Case True
Case name Like "*tokyo*"
>>17-18 のやり取りが俺にはわからん。
俺が馬鹿なんだろうか?
select case の条件式はIsってことだろ
Select Case name Case Is like "*tokyo*" って言いたかったんじゃないだろうか... 俺もこれで行けるとおもったが、Select Caseのヘルプ見ると >Is 演算子と Like 演算子以外の比較演算子と共に使われます。 つうことで、Likeはダメみたいだ
22 :
デフォルトの名無しさん :2011/09/26(月) 15:21:56.30
23 :
デフォルトの名無しさん :2011/09/26(月) 16:56:28.03
>>21 俺は
>あるいは、これは出来ないことなんでしょうか?
と質問しているので、IS=です と言っている
つまり「できないです」と言ってると思った。
24 :
デフォルトの名無しさん :2011/09/26(月) 17:04:53.19
>>22 VBAつうかWebBrowserコントロールの仕様を調べれば済むはなしじゃね
OS:Windows Vista Ver:Excel 2007 質問です。 ワークシート上で特定範囲のセルをダブルクリックした時に、セル範囲を操作させるUserFormを設定しています。 ダブルクリックしたセルのRangeを記憶させるのに、これまではTarget値をRange型グローバル変数に格納させていました。 これで別に問題なく動かせているのですが、できればグローバル変数を使わず、変数の引き渡しを駆使して、ダブルクリックセルの位置をUserFormへ受け渡したいな、と思ったのですが、方法はあるのでしょうか??
Excel2010です。 dictionaryオブジェクトを使って重複削除したいのですが、うまくいきません。 〜途中省略〜 Range("C1").Resize(Dic.Count) = Application.WorksheetFunction.Transpose(Dic.Keys) ここでエラーです。 どうしたらいいですか?
>>26 Debug.Print Dic.Count
Excel2007のStrconv関数のヘルプで vbKatakana** 16** 文字列内のひらがなをカタカナに変換します。 vbHiragana** 32 文字列内のカタカナをひらがなに変換します。 ** 国別情報の設定が日本の場合のみ有効です。 とありますが、この国別情報の設定ってのはExcelのどこでするんですかね? 特にそういうのをした覚えってのは無いんですけど^^;
>>16 で質問したものなのですが
case is 〜〜を使って例えば以下のように条件分岐してみたのですが
Sub hoge()
Dim name As String
name = "2011_09_27tokyo晴"
Select Case name
Case Is < "tok"
Debug.Print "東京"
Case Is < "osa"
Debug.Print "大阪"
End Select
End Sub
例えば 「 Case Is < "tok"」 の"tok" の部分を全然入ってない
文字の"m"とか また"雨" とかいれてもイミディエイトに
「東京」が書き込まれ実行してしまいます。
また数字類は全部falseになってしまいます。
やりたいこととしては、変数に文字列全部が一致するものが
入っていたらtrue "toc"などのように文字列に少しでも違いが
あったらfalseで次の「case is」と照合していくというものを作りたいのですが
どうすればよいのでしょうか?
>>30 質問の意図は分かるが、文字列の部分一致を評価対象とするCaseラベルの書き方は無いと思う。
予め対象文字列から中の地域部分を示す文字列を抜き出す関数でも自作しておいて、その結果をSelect文に渡せば良いんじゃない?
>>30 Isなんかその用途では使えないよ。
"2011_09_27osaka晴"って文字列は"tok"より小さいからね。
Select Caseなら
>>19 に書いてるようにする必要がある。
単純に一つずつならIf...Then...Else ステートメントでもいいと思うが。
>>26 そのケースでエラーになるのはDic.Countが0か65536を超えたときだな。
TransposeはExcel2007以降は使えないこともあるから気を付けた方がいい。
他人に使わせるときは65536要素以内でしか使えないとかコメントを書いておかないとな。
WorksheetFunction.Transposeと同じ機能の関数は自分で作った方がいいよ。
文字数制限も要素数制限もないし、おまけに速いから。
少ないデータで使い捨てマクロならどうでもいいけど。
補足 65536要素以内ってのは各次元がそれ以内ってことね。
>>32 さん
>>19 さん
ありがとうございます
Select Case True
case 変数 Like "変数の文字列の一部分"
のやり方で望みどおりのスクリプトが出来るようですね。問題が解決しました。
ありがとうございました。
36 :
デフォルトの名無しさん :2011/09/27(火) 18:19:55.38
For t(1) = 1 to 5 For t(2) = 1 to 5 ・ ・ このような配列を使ったループを作りたいのですが、 ”Forで指定された変数はすでに使用されています”とエラーメッセージが出てしまうのですがどうすれば良いのでしょうか Excel2000、WindowsXPです
>>36 無理
ヘルプに配列は使えないと明記されてる
カウンター変数に配列を使って九九をやってみた。 Dim t(1 To 1) As Long Dim tt(2 To 2) As Long For t(1) = 1 To 9 For tt(2) = 1 To 9 Cells(t(1), tt(2)).Value = t(1) * tt(2) Next Next 使えないことはないぞwww
39 :
デフォルトの名無しさん :2011/09/27(火) 18:59:05.42
ExcelVBAの本を立ち読みしてたらオブジェクトって用語が頻繁に出てきたんですが、 これが今話題のオブジェクト指向って奴ですか?
>>40 そうです。
ワークブック、ワークシート、セル…
慣れ親しんだExcelのあらゆる部品がオブジェクトであり
それらに対して命令を下すことがExcelVBAのプログラミング
であり、使う人は知らずともオブジェクト指向プログラミングを
していることになります。
>>41 ありがとうございます。
オブジェクト指向って意外と身近な存在なんですね。
Windowsそのものがオブジェクト指向で作られています
44 :
デフォルトの名無しさん :2011/09/27(火) 23:20:09.67
話題に20年ぐらい乗り遅れてないかぁ?
>>30 は学校で<の意味習わなかったの?どうして'like'的な意味があると思っちゃったの?
instarでよくね
そしてワークブックを使っていればオブジェクト指向だと勘違いしてベタ書きする低級PGが量産される
プロパティとメソッドの違い教えろください
>>45 いや、最初無いと思ったんですが、
>>16 で質問してisといわれたので、isで不等号使って
望みどおりできるのかなと。ちょっとやってみたら出来た気がして
意味はわからなかったんですが、これでいいのかなと。
でも詳しく使ってみると、思ってた用途と全然違って、再度質問しました。
ほとんど初心者なんです。
>"2011_09_27osaka晴"って文字列は"tok"より小さいからね。
これも意味がわからないです。文字数という意味でなら前者の方が大きいと思うんですが
この場合何の大小の比較になるんでしょうか?
>>46 InStrでもLikeでもどっちでもいいんだよ。
たいがいの人は両方使えるよ。
>>50 バイナリモードの文字列の大小はまず先頭の文字の文字コードで大小比較する。
先頭の文字が同じときは次の文字で大小比較する。
それも同じときはそのまた次の文字で大小比較する。
"2011_09_27osaka晴"と"tok"ではまず"2"と"t"で比較する。
"2"の文字コードは"t"の文字コードより小さいから"2011_09_27osaka晴"は"tok"より小さい。
"a12"と"a3"の比較なら"a12"が小さい。
>>52 ありがとうございます。文字コードの大小だったんですね。
それだと確かに全然思い通りに分けられないですね。
理解しました。ありがとうございます。
なんとなく理解できた
56 :
デフォルトの名無しさん :2011/09/28(水) 17:26:18.01
今居るセルの1つ下の列から始めて 同じ列に文字が入力されているセルまでをloopで見つけたいのですが Do a = a + 1 Loop While Cells(a, 1) Like "*" と考えてみたのですが駄目無限ループしていまします。 どなたか分かる方お願いします。
文字が入力されているかどうかならこれで良いと思うんだけどなんで、わざわざLikeを使ってんの? Loop Until Cells(a, 1) <> ""
文字とか数字とかの区別が必要なのかどうかわかんないけど、 セル(a,1)から下方向にセルが空欄かどうかを調べるだけなら .cells(a,1).end(xldown).row のほうが早くない?
まさかとは思うが下方向に空欄しかないんじゃ それと列って言ってるけど行のことだよね
1つ下の行の同じ列ってことか (a,b) (a+1,b)
>>56 Like "*"
だと セルが空欄でも(入っていても) 常に True になるよ
Likeの文字パターン * は任意の数の文字(=文字数0も含む)だから
nなんでこんな知識が偏ってるんだ・・・・
execl2000です 前スレでpictureはhtmlで保存して抽出するのが一般的と教えてもらったものですが SaveAsを使ってhtmlにしたら自分自身が保存したhtmlになってしまいます エクスポートするような形でhtmlファイルに保存するにはどのようにしたら良いでしょうか
>>63 前スレにそれらしき質問が見当たらないんですが、
どんな質問だったのですか?
(前スレを全部開いて「html」と「picture」と、ついでに「jpeg」でスレ内検索しました)
pictureをエクスポートする方法を質問しました
ああ前スレじゃなかったですね
あーそれhtmlで出さなくてもjpg出力できるわー 今ちょっと時間ないしどうやったか忘れたけど昔やったわー
71 :
デフォルトの名無しさん :2011/09/29(木) 23:55:22.48
Win7、Excel2010なんだけど、 IEのダイアログを操作する方法ってないかな? ウィンドウハンドルとIHTMLDocumentは取得できるんだけど ここから、フォームに入力したり、ボタンとかクリックする方法がないかな?
Excel2007 デジタル署名をVBE→ツール→デジタル署名から作ってみたのだけど、 [証明書の表示]を見ると、 このCAルート証明書は信頼されていません。信頼を有効にするには この証明書を信頼されたルート証明機関のストアにインストールして ください。 とあります。この「ルート証明機関のストアにインストール」する にはどうすれば良いの? (全く個人用なので公開とかするつもりは全っ然ないのですが)
>>71 数年前にVB6で同じようなものを作ったが、ウィンドウハンドルは必要ない。
windows2000、Excel2003 質問です。 ある一つのユーザーフォームを呼び出すプロシージャが2つあるのですが、 どっちのプロシージャから呼び出されたか判定出来るようにしたいです。 何かヒントだけでもいいので、教えてください。
>>72 VBEで証明書つくれるようになったのか?手順教えてくれ
まあどこで作った証明書でも良いんだが、証明書ファイルを(エクスプローラで)
ダブルクリックしたらインストールできなかったか
>>74 フォームにそれ用のフィールドなり変数なり作って呼び出し元のプロシジャで値をセットする
グローバルな変数をつかう
どっかのシートにどっちが呼び出したか書く
>>75 72です
作ったのは
Windowsのスタートメニュー
→Microsoft Office
→VBAプロジェクトのデジタル署名
で出てくる[デジタル証明書の作成]
に名前を入れてみたんですが
(ちなみにOSはXP)
77 :
74 :2011/09/30(金) 20:57:22.20
>>75 シートに書くという基本的な事が頭から抜けてました。
ありがとうです。
78 :
デフォルトの名無しさん :2011/09/30(金) 21:11:16.23
With Selection .Replace what:=Worksheets("sheet1").Cells(3, 2), replacement:=Worksheets("sheet2").Cells(3, 2).Value, Lookat:=xlwhole,searchorder:=xlbyrows,matchcase:=false,matchbyte:=false End With この部分で構文エラーと出ます。何がいけないんでしょうか?
>>76 いつの間にか証明書作れるようになってたんだな
それで作ると勝手に個人用ストアに作られてるみたいなんで、管理コンソールで移動すれば良いんじゃないかな
やり方はスレチなんで、MMC 管理コンソール 証明書 あたりでググって
2、3日前に初挑戦したバカですが、どうかお相手お願いします。 LCLICK 1215,176 KEY [Ctrl]++ KEY [End] KEY [Ctrl]-- LCLICK 709,441 KEY [Ctrl]++ KEY V KEY [Ctrl]-- LCLICK 723,753 このような簡単なものを作ったのですが、何度も何度もペーストしてしまいます。 一時停止にはDELAYコマンドを使うといいという記事も見たのですが どうもDELAY 3000 等でも3秒止まってくれません、記述の仕方に問題があるのでしょうか? お願いします
82 :
81 :2011/10/01(土) 00:51:31.71
ごめんなさい、記述し忘れました。ループ操作を実行した時にペーストが数度繰り返されてしまいます。 どうか、お助けください
スレタイ2000回読んだ方がいい
>>78 それその位置で改行してるのか?
VBAはどこでも改行していい言語じゃないぞ
>>81 ここ、何のスレか解ってるのか?
uwsc??
86 :
81 :2011/10/01(土) 01:04:24.72
>>83 申し訳ないです。VBAに関するスレッドが見つからなかったもので、書き込んでしまいました。
>>84 申し訳ないです。質問スレ等が見つからなかったのでお邪魔な書き込みをしてしまいました。
許してください・・
>>85 KMmacroというのを使っております
それVBAじゃないみたいだけどVBAってなんだか分かってる?
88 :
81 :2011/10/01(土) 01:38:05.77
>>87 そうなんですか!?オフィス上で自動化の作業をマクロを組んでおけば自動化してくれるものだと思っていました。
89 :
81 :2011/10/01(土) 01:58:45.57
81です、すごくお邪魔になるので自分はここから出て行きます。ご迷惑おかけしました。
OS:Windows 7 (64bit) Excel: Excel 2007 officetanaka.net/excel/vba/tips/tips20.htm クリップボードの使い方自体が分からなかったので、ここの ダイレクトに格納/取得するを見てコピーできるようにはできたのですが、 Windowsのメモ帳でテストしてOKだったので、ペーストしたいソフトの方に ペーストをしてみたら何もペーストされませんでした。 調べてみたところ、下の通り普通のテキスト?ではないようなので、 Unicode非対応のソフトにテキストをペーストできるようにしたいのですが、 UnicodeからShift-JISへの変換はどのようにすればいいのでしょうか? dzone.sakura.ne.jp/blog/2009/12/excel-vba.html よろしくお願いします。
>>91 そこまで分かってるなら普通にUnicodeからShift-JISに変換するだけ
Msgbox LenB("a") '結果は2
Msgbox LenB(StrConv("a", vbfFromUnicode)) '結果は1
93 :
91 :2011/10/01(土) 22:43:50.50
>>92 レスありがとうございます。
その、UnicodeからShift-JISへの変換が分からないのです。
たとえば、A1のセルに「あいうえお」と入力されていて、
下記のようにしても、ペーストできるようにはなるのですが、
?????という文字になってしまいます。
Dim buf As String
Dim CB As New DataObject
Dim myStr
myStr = Sheet1.Cells(1, 1)
buf = StrConv(myStr, vbFromUnicode)
With CB
.SetText buf ''変数のデータをDataObjectに格納する
.PutInClipboard ''DataObjectのデータをクリップボードに格納する
End With
度々すみませんが、よろしくお願いします。
クリップボードってWin32APIレベルではデータの種別も持つようになってるんだけど DataObjectってその辺設定するプロパティないよね もしかしてunicode固定なんじゃないの?
95 :
デフォルトの名無しさん :2011/10/01(土) 23:59:05.29
ClipboardFormats
それは読み取り専用プロパティでしょ
>Forms 2.0 の MSForms.DataObject の SetText メソッドを用いていた場合、 >CF_TEXT 形式のデータが正しく出力されないようです。 だめぽいね
WindowsVista Wxcel2007 おはようございます。VBA歴半年の初心者です。 ユーザーフォーム上に配置した4つのチェックボックスのONOFFによって、 同じユーザーフォームに配置したリストボックスに表示されたデータにソートをかけて表示させる処理を作ったのですが、どういうわけか、この処理が実行されるたびに、リストボックスのサイズ(Height?)が少しずつ下から減っていきます。 理由が分からず、対応方法が思いつきません。 識者の方々、ご指導願います。
以下チェックボックス操作時に実行されるプロシージャです。 このコードの中にリストボックスのサイズに影響を与える要素があるとは思えないのですが… Sub ステータスチェック更新() (略) 'リストボックス再表示 Call UserForm9_OK 'リストボックスの値を recordC へ取得 recordC = UserForm8.ListBox1.column() ReDim recordD(8, UBound(recordC, 2)) k = 0 (続きます)
101 :
99 :2011/10/02(日) 10:18:29.77
(続き) 'レコードごとに処理 For i = 0 To UBound(recordC, 2) For l = 0 To 3 If recordC(0, i) = Sstr(l) Then If Scheck(l).Value = True Then '条件を満たしたレコードを recordD へ順次格納 For j = 0 To 8 recordD(j, k) = recordC(j, i) Next j k = k + 1 (続きます)
102 :
99 :2011/10/02(日) 10:20:31.50
(続き) End If End If Next l Next i 'リストボックスへ recordD のデータを表示 UserForm8.ListBox1.column() = recordD End Sub 長々と申し訳ありません。 どなたかよろしくお願い致します。
103 :
99 :2011/10/02(日) 10:23:51.40
すみません。これではわからないですね。宣言部分を一部追記します。 Dim Scheck(3) As Object Set Scheck(0) = UserForm8.CheckBox1 Set Scheck(1) = UserForm8.CheckBox2 Set Scheck(2) = UserForm8.CheckBox3 Set Scheck(3) = UserForm8.CheckBox4 Dim Sstr(3) As String Sstr(0) = "完了" Sstr(1) = "報告可能" Sstr(2) = "調査依頼中" Sstr(3) = "調査中"
104 :
99 :2011/10/02(日) 11:00:48.73
リストボックスのHeight値を250以下に設定したら、減らなくなりました。 それ以上、300とかに設定すると250ぐらいまで少しずつ減りだすようです。 できれば450ぐらいで使用したいのですが。 これはバグなのでしょうか…?
リストボックスの IntegralHeight がTrueになっていると、高さが自動調整されるので、 それをFalseにすればいいと思う。 Trueでも、設定するたびにどんどん短くなるのは、おかしな現象ですが、 フォントサイズによってなったりならなかったりします。 バグかもしれないし、最初からその程度の精度しかないのかもしれません。
106 :
99 :2011/10/02(日) 13:02:56.05
>>105 リストボックスのプロパティは全部調べたつもりでしたが、ご指摘の項目はうっかり漏れていました。
IntegralHeightをFalse に設定した所、サイズが変わらなくなりました。
どういう条件でリストボックスのサイズが少しずつ短くなるのかは、msdnのページにも書かれてないっぽいですが、
とにかく明確な対処方法が分かってスッキリしました。
ありがとうございました!
例えばシート1の、1行目のどこかに"新宿"と書かれたセルがあれば、シート2の適当な場所 に"東京"と書き込むみたいなスクリプトを作りたいのですが、それでfindメソッドを 使うのかなとやってみたところ sub hoge() Set Obj = Worksheets("sheet1").Rows(1).Find("新宿") If Obj Is Nothing Then msgbox "存在しない" else シート2の任意の場所に"東京"を貼り付け end if end sub こういう感じで一応出来るとはわかったんですが、マニュアルページで"find"は条件に合致 するものが見つかったときにtrue とか false を返すのではなく、そのセルの場所か nothingという値を返すからこのやり方じゃないといけないと書いてあったんですが できれば検索条件に合致するものが見つかったらtrueになって、IFとかselect caseに そのまま直接(Worksheets〜)を組み込んだりして何かの行程を実行するみたいな風に したいんですが、そういうやり方できる方法って無いのでしょうか? なぜしたいかというと、この例でいうと、1行目のセルの中に、新宿、中野、練馬・・・・ などの多種類の条件のうちから、合致するものがあったら、それにちなんだステートメントを 実行するみたいな作業をしたいのですが この上の文を使って、何回も書けば、それでできないことはないかなと思うのですが 出来ればスマートに出来るようになりたいんですけど、何か方法、あるいは他の メソッドなりを使って出来ないものでしょうか?
>>107 そういう時は自分で関数を作る。たとえば
Function FindB(SearchString As String) As Boolean
Set obj = Worksheets("Sheet1").Rows(1).Find(SearchString)
If obj Is Nothing Then
FindB = False
Else
FindB = True
End If
End Function
これなら
If FindB("新宿") And FindB("渋谷") Then 〜
みたいに使える
>>108 ありがとうございます。そんな風に書き換えるとでもいうような
方法があったんですね。勉強してみます。ありがとうございました。
自作のDLLを呼び出そうとしています。 複数ある関数の中で、1個だけ以下の様に関数名と()の間にスペースが自動で入ってしまうのですが、 これはどういう意味なのでしょうか? Sub1(...) Sub2 (...) Sub3(...) エクセルのVBAエディタです。
普通は入ります 入らないのがおかしい var = Sub1()とかしてんじゃねえの?
変数内の文字列を抽出して別の変数に指定することは出来ますか? たとえばaには"1234567890"が入っていて、その中から bには"5678"を入れたいのですが。
文字列から抽出??一部を抜き取るの? そりゃあ無理だから希望の文字列を変数に代入してください
>>111 普通は入らんのでは?
Callの有無で意味合いが変わってくるから気をつけてね
>>113 やはり、無理なんですか。
一度aをセルに入れてMID乃関数でbに入れないと無理ですかね?
コードレベルじゃなくて、何がやりたいの? それを聞いた方が良いアドバイス出来そうだけど。
118 :
112 :2011/10/05(水) 10:20:56.45
>>116 Sub 確認_Click()
Dim 転記元 As Worksheet
Dim a As String
Dim Obj As Object
If Worksheets("MAIN").Range("Q23").Value = 2 Then
Set 転記元 = Worksheets("オーダー@")
a = Worksheets("MAIN").TextBox1 ’@
Else
Set 転記元 = Worksheets("オーダーA")
b = Worksheets("MAIN").TextBox1
a = 'bの文字列の中の一部分を入れたい ’ A
End If
Set Obj = 転記元.Cells.Find(a)
If Obj Is Nothing Then
MsgBox "見つかりませんでした。"
Else
MsgBox "見つかりました。"
Obj.Select
End If
End Sub
>>116 解りにくいかもしれないですが↑の様な感じです。
@の時は変数aでそのまま検索出来るのですが、
Aの時にTextBox1の中の文字列の一部分で検索しないといけないのです。
TextBox1はシート上のフォームです。
この場合はやはり、一度変数bをセルに代入してMIDで一部を抽出しaに
入れ直さないといけないのでしょうか?
120 :
117 :2011/10/05(水) 10:33:30.63
自己解決 Microsoft Browser Helpersにチェックを入れるんだって IEが動作したのはこれで確認
>119 VBAの関数使えばセルに代入しなくても可能 一部を抽出するための、一部の部分を判定するルールどうなってるんだ?
>>121 ,122
おっしゃる通り、関数と同じやり方で出来ました
まさかこんな簡単に出来るとは思いもよりませんでした
ありがとうございました
VBAってインターフェースも実装できるんだね。 初めて知った。
125 :
忍法帖【Lv=13,xxxPT】 【東電】 【東電 70.3 %】 :2011/10/05(水) 23:43:30.70
EXCELでマクロを組みたくてVBAの勉強したいんだけど、オススメの本とかある?
>>114 普通は入るだろ
どうして試しもしないで言ったの?
>>125 定番の回答だが、書籍に限らず解説の類は、本人の理解力や解説方法の好み
予備知識(VBAはもちろん、他の言語経験があるかとか)などでどれが良いかは変わってくるので
自分で書店に行って実際に読んでみて、自分の理解力や好み、レベルに合った物を探すのが一番
あと、ここみたいにその時その時で偶々スレ見てる人が回答する掲示板でオススメ聞くと、
質問した時スレに居た数人個々の独断と偏見で世間的にはあまりオススメとは言えないものを
奨められることも多いので、質問したときに偶々居合わせた人だけの意見ではなく
ネット書店のレビューや評価など、書籍に対する意見や評価のみが長きに渡り蓄積されたものを
見た方が参考になるよ
シート上のドロップダウンリストで選択した内容を 変数に収める事は出来ますか? Dim a as String a = ActiveSheet.ドロップ2.value End sub では無理でした。 変数に収めなくても、別のセル(B2)等に直接コピーでも よいのですが。
>>128 ドロップダウンリストがセルA1にあった場合
変数 = Range("A1").Value
別セルにコピー
=A1
>>129 ドロップダウンリストはセルではなくてフォームなのです。
その場合はリンクさせているセルに表示される数字から
検索するしか方法はないのでしょうか?
>>130 シートに直接フォームコントロールを挿入したなら
Sheet1.Shapes("Drop Down 2").ControlFormat.Value
とか
フォームコントロールはShapeオブジェクトとして追加される
その時にNameがついてて、Shapesで指定してるのがその名前(この場合なら"Drop Down 2)なんだが
この名前を画面上で知る方法はよくわからん
これでエラーでるようなら、全Shapeの名前列挙してそれっぽいの探してくれ
>>131 試した見たのですが、ドロップダウンリストの入力範囲の
数字(順番?)が取得されて入力内容【リストの内容)は無理でした。
直接選択したリスト内容(解りにくくてすみません)を取得したいのですが
>>132 ValueじゃなくてTextってことか
>>132 コントロールへの参照は略すけど、
.ControlFormat.List(.ControlFormat.ListIndex)
で、選択されているリスト項目の内容を取得できる。
ただし、非選択時(ListIndex=-1)時はリストが取れないので場合分けして処理すべし。
135 :
132 :2011/10/06(木) 18:10:13.06
>>134 ありがとうございます
望んでいたものが出来ました!
エクセルがRC形式かどうかって分かりますか?
>>136 マクロの記録で
R1C1形式にすると
Application.ReferenceStyle = xlR1C1
って出てきて、それをヘルプで見たら
使用例
次の使用例は、現在設定されている参照形式を表示します。
Visual Basic for Applications
If Application.ReferenceStyle = xlR1C1 Then
MsgBox ("Microsoft Excel is using R1C1 references")
Else
MsgBox ("Microsoft Excel is using A1 references")
End If
って出てくる(Excel2007)
138 :
デフォルトの名無しさん :2011/10/06(木) 23:43:57.75
交換法のプログラムについて Cells(1, 1) = 2 Cells(1, 2) = 5 Cells(1, 3) = 3 Cells(1, 4) = 1 Cells(1, 5) = 4 Sub 交換法() For i = i To 4 Cells(1, i).Interior.Colors = RGB(255, 0, 0) For j = i + 1 To 5 Cells(1, j).Interior.Colors = RGB(255, 255, 0) Application.Wait (Now + TimeValue("00:00:01")) If Cells(1, i) > Cells(1, j) Then Cells(1, j).Interior.Colors = RGB(0, 255, 255) a = Cells(1, j) Cells(1, j) = Cells(1, i) Cells(1, i) = a End If Cells(1, j).Interior.Colors = RGB(0, 255, 255) Next j Cells(1, i).Interior.Colors = RGB(0, 255, 255) Next i End Sub エラー400が表示されるのはなぜでしょうか? 修正お願いします。
>>138 Sub 交換法()
For i = 1 To 4
Cells(1, i).Interior.Color = RGB(255, 0, 0)
For j = i + 1 To 5
Cells(1, j).Interior.Color = RGB(255, 255, 0)
Application.Wait (Now + TimeValue("00:00:01"))
If Cells(1, i) > Cells(1, j) Then
Cells(1, j).Interior.Color = RGB(0, 255, 255)
a = Cells(1, j)
Cells(1, j) = Cells(1, i)
Cells(1, i) = a
End If
Cells(1, j).Interior.Color = RGB(0, 255, 255)
Next j
Cells(1, i).Interior.Color = RGB(0, 255, 255)
Next i
End Sub
>>126 試すとかじゃなくて普通じゃないの、君のは。
括弧の前にスペースが入るのは
戻り値を取得せず、Callも書かない場合。
これは普通じゃないぞ?
動き違うから勝手に省略しちゃだめだぞ?
>>140 >>110 みてみろ
もろ「戻り値を取得せず、Callも書かない場合。」やってるだろ
だからこれやった場合普通はスペースが入るって言ってんだ
>>141 複数ある関数のうち1つだけって時点で
>>110 はバグとしか思ってない。
オレは「普通」について否定されたから根拠を示しただけなんだが。
>>140 Callの有無で意味が変わるって、どういう事?
Callは単なるサブルーチン呼び出しで、
記述上は省略可能で、その有無によらず
同じ意味だと理解していたのだけど、
違いがあるの?
今までずっと、Letみたいに無くても困らない
ものだと思ってた…
144 :
143 :2011/10/08(土) 06:42:49.91
ゴメン、調べたらすぐ出た。
http://www.gizcollabo.jp/vbtomo/log/archive/vbqanda_3453_0.html にもあるように、引数argが1個のサブルーチンAをCall省略で呼び出す時に()を付けると
サブルーチンコールの引数リストを示す意味の()ではなく、
第1引数を示す式中の演算子として()が評価され、Aには(arg)という式を評価した結果が渡される。
つまり、引数が右辺値を示すものになり意図によらず値渡しされる動作になる、という事ですね。
A (arg) '(arg)という式の演算結果を値渡し
A arg 'argそのものを引数として渡す(渡し方はAの定義次第)
Call A(arg) 'argそのものを引数として渡す(渡し方はAの定義次第)
断続的にVBを10年近く使ってたけど、たまたまこういうシーンに出くわさず、
知りませんでした…
>>144 いや、
>>140 もそうなんだけど、
この質問主が聞きたいのは
スペースが入る理由なんだよね。
だからそれに対する回答をしなちくゃいけない。
>>110 に対する適切な回答:
引数を持つ関数を呼ぶ場合、関数名()のみ記述した場合はスペースが入る。
これはビジュアルベーシックエディターの仕様である。
これだけでオッケー。
動作が違うとかは質問に対する回答になっていない。
Round関数がVBAとワークシート関数で仕様が違うのとかも結構な落とし穴だよね
147 :
複乳 :2011/10/08(土) 11:23:53.27
>>145 スペースが入る理由はそれでオッケーだとして
じゃあsub1と3はスペースが入らない理由は?って話になるんだが
とりあえず
>>110 はエクセルのバージョンとDeclareの部分を晒せ
昔なんか似たような現象を見た気がするんだが、
その時は非公開なエクセルで定義済みの名前とかぶってたの原因だったような
110もそんなに気にしてないんじゃない? 昔なんか似たような現象を見た気がするんだが、 その時はブック再作成で直ったような
質問させてください。
WinXP、Excel2003です。
自作マクロのプロジェクトにパスワードを設定しました。
@次に設定ファイルを読み取り、
自身に含まれるマクロを作成・入れ替えするマクロを組みました。
Aさらに下記サイトを参考(丸写し)に、パスワードをマクロで入力するものを作りました。
ttp://home.att.ne.jp/zeta/gen/excel/c04p68.htm @Aはそれぞれ単独では正常に働きます。
しかし、マクロ@の最初でマクロAで呼び出したり、マクロ@中にAを組み込んでも正常に動かない。
正確には、ワークシート相手にパスワードを打ち込む
→マクロ@は動作しない(保護に関する実行エラーも出ない)という状態です。
別々に動かせばいいだけなのですが、マクロAの後にVBEにアクセスできる状況が不安です。
@Aを上手く連動させる方法はないでしょうか。
よろしくお願いします。
すいません、ちょっと意味が分からないです。 でも面白い事してますね〜 自分も昔、同じように自身のコードを追加、変更し実行するというマクロを作りました。 その時は変更内容が開き直さないと反映されない事と、 2007以降のデフォルト設定ではVBEに対するアクセスが出来ない為諦めましたが。
読み直してみましたが、 2の呼び出しコードは動的に生成されますか? であればコードがロードされていないのでは? こういう回答はあまりしたくありませんが、やり方変えた方が良いかもしれません。 マクロ書き換えって結構問題があると思います。 まずファイルにゴミが貯まって行く事。 書き換え頻度が不明ですが、徐々にファイルサイズが増えて行くはずです。 次にバージョン管理(コード修正)がしにくい事。 自分用であればあまり問題となりませんが、エクセルブックはデータを含むのでバージョンアップが難しいです。 色んな人が使うとなるとお手上げです。 最後はセキュリティの話ですね。 自分だったら、パスワード保護が必要なコード(機能)はアドインに実装。 ブックの生成機能はそこに持たせますかね。
155 :
152 :2011/10/09(日) 17:56:29.14
少し長くなりますが…。 「CSVファイルを計算シートに張り付けて、抽出されたデータを記録シートに張り付ける」 という作業を自動化させたものです。 私自身が独学であることに加え、他の人間は完全に素人です。 また、仕事で使うものですから最低限のセキュリティは設けたい為にロックしました。 しかし、このままでは私以外設定の変更ができない。 かつ、割と半端ない構造をしているのでコードが長大です。 なら設定変更すら自動化すればいい、という結論に。 アドイン案もあったのですが、とりあえず完成させた後に分離させるというのが一つ。 ファイルが2つ以上に分かれると、移動などで欠損しやすいかなというのが二つ目の理由です。 むろん勉強不足もありますが…。
156 :
152 :2011/10/09(日) 18:02:52.72
Sub マクロ1() Call ロック解除 Worksheets("Sheet1").Activate Cells.ClearContents With ThisWorkbook.VBProject.VBComponents("UserForm1").CodeModule .DeleteLines .ProcStartLine("分類マクロ", 0), .ProcCountLines("分類マクロ", 0) 'マクロが重複するので削除 Call 書き出し_分類マクロ '文字列の切り貼りで、Sheet1に「Sub〜EndSub」を書き出します。 Worksheets("Sheet1").Activate 最終行 = Range("A65535").End(xlUp).Row For i = 1 To 最終行 .InsertLines 2, Cells(最終行 - i + 1, 1).Value '一行目は「Option Explicit」 2行目にお尻から挿入していきます。 Next i End With '最後に上書きして閉じ、パスワード保護を復活させる。 End Sub
157 :
152 :2011/10/09(日) 18:11:55.55
Public Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, _ ByVal dwFlags As Long, ByVal dwExtraInfo As Long) Private Sub ロック解除() 'パスワードは仮で「a」にしています。 Call sendkeybd_event(vbKeyMenu, vbKeyT) Call sendkeybd_event(vbKeyM) Call sendkeybd_event(vbKeyV) Call sendkeybd_event(vbKeyMenu, vbKeyT) Call sendkeybd_event(vbKeyE) Call sendkeybd_event(vbKeyA) Call sendkeybd_event(vbKeyReturn) Call sendkeybd_event(vbKeyReturn) Call sendkeybd_event(vbKeyMenu, vbKeyF4) AppActivate "Microsoft Excel" End Sub Public Sub SendKeybd_event(arg1 As Integer, Optional arg2 As Variant) 'ここが完全に丸写しです。 '内容も完全に理解できていません。 '書き込みが長大になるので、上記アドレスからコピーをお願いします。 End Sub 以上が該当部分のマクロです。 実際設定変更を掛ける部分は6カ所くらいあります。
158 :
154 :2011/10/09(日) 18:58:59.05
ん〜PGとしては、パスワード設定の部分は「無い」ですね。 ワークシート上のボタンで起動するマクロであれば、 For i = 0 to 30000 DoEvents Next i で処理開始を遅らせ、その間にVBEを前面に持ってくれば動きません? これはキーボードをエミュレートしているだけですので。 仮に、メインの処理が長引き、 ユーザーが違うウィンドウを前面に設定してしまった場合、 そのせいでパスワードがメモ帳に貼り付いてしまったりという事が考えられます。 AppActivateに指定するのもアプリ名ではなくウィンドウタイトルだったような・・・
159 :
154 :2011/10/09(日) 19:20:36.03
>.InsertLines 2, Cells(最終行 - i + 1, 1).Value これは分類の定義をコード上に書いているのでしょうか? >「CSVファイルを計算シートに張り付けて、抽出されたデータを記録シートに張り付ける」 抽出ロジックに、CSVという"データ"とは別に"分類"というメタデータが必要なので、 それをコード上に記録する為、コード自体を書き換えるようにした。 という感じでしょうか? であれば別シートに定義するのが良いと思います。 パスワード解除も不要ですし。
シートの行番号を引数に持つSubを作り、そのSubに 「1列目の値がある数値以上であれば、引数で指定した行の背景色とフォントの色を変更する」 という内容を書いて、呼び出し元からFor文などで、任意の行の範囲に対して繰り返し呼び出しをする 処理をやっています。 現在のところ対象の行の数は50ほどで、このSubによる処理はすぐに終わるんですが、ページ設定や 印刷プレビューなどを実行した後では、この50回ほどのSubの処理が非常にもたつくようになり、 その間は、無限ループを行っているように画面がちらつきます。 同時に起動している他のシートであっても、印刷に関する処理を行った後には必ず発生するため、 少々困っています。何か対策のようなものはありますでしょうか? ちなみに、このマクロで処理をしているシートは、印刷するものではありません。環境はExcel 2003です。 よろしくお願いします。
>>160 Application.ScreenUpdating=Falseってやってる?
呼び出し元って何?イベント?
Subの処理は常に50回しか実行されないの?確認した?
条件付書式で出来そうだけど出来ないの?
162 :
152 :2011/10/09(日) 21:33:32.14
>AppActivate ググってみると、「同一のタイトルが存在しない場合は、引数titleで指定された文字列で始まるタイトルを探します」とありました。 複数のエクセルを開く必要があれば、正確に指定する必要がありますね。 構造を変えることがあれば注意したいと思います。 >DoEvents 少し動作が変わりました。 別プログラムをアクティブにしていると、裏で保護に関する実行エラーが出るようになりました。 やはりVBEがうまくアクティブになってないのが原因な気がします。 入れる場所を変えて実験したいと思います。 後念のためAppActivateでVBEも呼び出すべきか。 >これは分類の定義をコード上に書いている >抽出ロジックに、CSVという"データ"とは別に"分類"というメタデータが必要なので、 >それをコード上に記録する為、コード自体を書き換えるようにした。 たぶんその認識であっていると思います。説明不足ですいません。 初期のマクロは、「計算シート(IFCOUNT等)を2つ開いて、CSVを2つ開いてそれぞれ貼り付け、ペーストを20回以上する」 という手動操作の模範でした。 さらに3つめのCSVはその程度では分類不可。 こんな回りくどい方法よりも、VBAのメモリ上で直接処理したほうが早いと改良。 実際、時間短縮にも成功し、最後の手動作業も膨大な分岐を利用して強引に完成させました。 この頃になると、VBAが膨大になりコンパイルエラーの可能性が出てきたので、 一部をFunction化などで分離したものが1個前のヴァージョンです。 今回のマクロは、この部分の修正が目的です。 合わせて入力フォームを作成して、徹底的にエクセル操作からの隔離を目指しています。 長い&分かりにくくて申し訳ありません。
レスありがとうございます。 Application.ScreenUpdatingについては存じませんでした。処理の前後に切り替えを挟んで みて、試してみます。 呼び出し元はイベントです。 Subの呼び出しの増減はありうるんですが、たとえば10回程度の呼び出しであっても、 前述のページ設定などの実行がなされた後だと、エクセルを再起動しない限り完了までに 数秒はかかっていました。 Subでは、その他の処理もやっていましたが、問題の箇所を条件付書式で解決できるようで あれば、分離させようと思います。 「その他の処理」が原因でないことは確認しています。
164 :
163 :2011/10/09(日) 22:51:32.10
165 :
154 :2011/10/09(日) 23:40:58.60
>>162 ごめんなさい、やっぱり分からないです。
その方法で突き進むんだったら、
sendkeybd_eventを完璧なまでに制御するしかないですね。
パスワード入力時、VBEが開かれるんですよね?
であれば、ツールウィンドウが開かれているかとか、
最前面ウィンドウが何かとか、
いろいろチェックかけないと安定動作は難しいように思います。
あとはウィンドウハンドル指定でsendkeybd_eventを実行するとか。
あと、最悪ESCで止まるようにしておかないと、こういったアプリは何をするかわからないです。
166 :
152 :2011/10/10(月) 00:14:27.17
>>165 >こういったアプリは何をするかわからないです
そう思って直前にバックアップしておかないと、作動しないように保険を掛けています。
色々回答ありがとうございます。
もう少し自分で弄繰り回して、それでもダメでしたら類似マクロの可能性にかけたいと思います。
最後はパスワード廃止か、自分で手動変更するか…。
配列(100,100)の 配列(1,0)から配列(10,0)を範囲指定して 一括して値を入れることは可能なのでしょうか? それとも1個ずつ指定するしかないのでしょうか?
値でも無理だろ
>>167 は という配列の中の の範囲だけを指定して
┌─┬─┬─┬─┬─┐ ┌─┬─┬─┬─┬─┐値を入れたいってことだろうから
│ │ │ │ │ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┤ ┏━┓─┼─┼─┼─┤
│ │ │ │ │ │ ┃ ┃ │ │ │ │
├─┼─┼─┼─┼─┤ ┣━┫─┼─┼─┼─┤
│ │ │ │ │ │ ┃ ┃ │ │ │ │
├─┼─┼─┼─┼─┤ ┣━┫─┼─┼─┼─┤
│ │ │ │ │ │ ┃ ┃ │ │ │ │
├─┼─┼─┼─┼─┤ ┗━┛─┼─┼─┼─┤
│ │ │ │ │ │ │ │ │ │ │ │
└─┴─┴─┴─┴─┘ └─┴─┴─┴─┴─┘
でもさ、無ければ作れば良いのがプログラム
そもそも一括した処理なんてのは、元を辿れば1個ずつの処理を関数化してるだけで
その関数の中身がコンパイル済みのライブラリの中に隠れて見えないか、
自分で作った関数故に見えるかの違いでしかない
Split関数なんかも、分割した文字列を配列に一括して入れてるように見えて
その実、Split関数の中では、1個ずつ指定して入れてるだけだからな
因みに、具体的に何がしたいのか書いてないから有効かどうかは解らないが
この手のことでは、二次元配列ではなく、配列の配列や、配列のコレクションが便利な場合もある
つまり、「配列(100, 100)」ではなく「配列(100)(100)」ってわけだ
配列(0, 0) 配列(0, 1)
配列(1, 0) 配列(1, 1)
配列(0)(0) 配列(0)(1)
配列(1)(0) 配列(1)(1)
>>169 あーそういう事か
そりゃ配列のレンジ指定して0フィルとかnullで埋めるとかでもしないとね
ジャグとか面倒そう
つーか図に感動したw
>>172 それは知ってるけど、全く関係ない話じゃん
174 :
172 :2011/10/10(月) 19:19:00.20
え? これでできるんじゃないの?
「配列→セル」、コード的には「セル=配列」なら
>>172 すら必要ない
「セル→配列」、コード的には「配列=セル」だと
>>172 は役に立たない
んで今回は後者
176 :
167 :2011/10/10(月) 22:19:00.50
すいません
出かけてる間に色々と申し訳ないです
まさに
>>169 のようなことだったのですが
やはり標準機能では無理なのですね
図に感動しましたし
貴重な意見もいただけ勉強になりました
ありがとうございます
177 :
デフォルトの名無しさん :2011/10/11(火) 09:51:36.18
L = Range("A1").Value Cells(5, 5).FormulaR1C1 = "=SUM(R20C" & L & ":R20C1)" Dim L As Integer を入れなくても動いたのですが、これはこれで大丈夫なんですか?
178 :
デフォルトの名無しさん :2011/10/11(火) 10:24:45.09
Option Explicit 入れてないんでしょ 今はそれでよくてもいずれ痛い目にあうよ
>>177 Variant型になるだけで今はおかしくないけど、
凡ミス時にちゃんとエラー吐かせたいなら、
なるべくOption Explicit設定しといた方が良いと思う。
180 :
152 :2011/10/12(水) 00:49:55.27
>>165 「DoEvents」の入れる場所とループ回数を施行実験した結果、
パスの一時解除とVBEの操作ができるようになりました。
お陰様でマクロを完成できそうです。
改めてお礼を言わせてください。
駄文にお付き合いくださって本当にありがとうございました。
頑張ります!
おめでとう あとは完成したとき、バグはありませんとか言わないように
素朴な質問なんですけど、 if とかの制御文で、判定要素を Or とかでつなぐときに、 Or の数が数十個とか百個とかの量に増やしても判定要素を大多数にしても問題は無いんでしょうか?
Orも単なる演算子。+で沢山繋ぐのと何ら変わりは無い。 ただ、それだけ増やすなら全部の式を本当に評価する必要があるか、 再検討はしたほうがいいとは思うけど。 VBAにはOrElseが無いからなあ。
ありがとうございます。実際には5個未満ぐらいにはなりそうな作業なんですが 気になったもので。 OCRソフト表のある文書をPDFからエクセルに転写したもので、OCRソフトで文字の誤読が割りと発生するので その誤読による文字化けのようなものを正しい情報に戻すという作業の際にorで文字化けの種類分を 対応するという作業でした。
185 :
デフォルトの名無しさん :2011/10/14(金) 11:51:42.25
ExcelVBEで行番号を表示する方法ってありません?(Excel2007) 今は行番号を知りたいとき、エディタにコピペで持ってって、エディタの機能で行番号を表示させてんですけど。
VBAで行番号振れよ
>>186 だろうかな、、、、とは思ったんですが
>>187 まぁそれを見れば良いんでしょうけど、他のエディタみたいにパッと見て判るようにできれば、、、と
思ったんですがw
ところで行番号が必要になるってのはどういう状況なんだろう。
err.LineNumber から特定したいんだろ
プログラム生産量を行数で報告させられる。
エクセル2003 XPです。 ファイルからデータ読み込んで、セルに書かずに 記憶してグラフにするにはどうすればいいですか?
セルに書かずにグラフにする それは出来なくはないけどExcelの仕事じゃない 故にスレ違い
なぜに?
良く知らないんだけど、グラフのデータソースって、 セル範囲以外も指定出来るもんなの?
非表示シートに書き込んでおけば良いじゃない
>>193 できない…と思ってたけど
X・Yの数値を配列に入れてグラフのオブジェクトに
セットする方法があるみたいね。
chart.seriescollection.newseriesでググって
一番上に出てきたサイトの中の
5 数値を直接コードからに指定してグラフを作成するには?
にそのサンプルコードがある。
199 :
196 :2011/10/15(土) 09:23:43.85
>>198 をを、感謝!
193じゃないけど、家に帰ったら早速ためしてみる。
200 :
193 :2011/10/15(土) 10:52:17.41
ありがとう 必ず、グラフ用にデータが並んでるとは限らないから 配列からグラフにできたら、規則性はあるけどグラフ用に 並んでいない場合とかにも応用できるので、もし出来るのら 知りたかった。
EXCEL2007ですが以下を実行すると、”ABC"はmytxt(1)の中のmytxt(1,1)に入ります。 mytxt(1,1)に”ABC"が入るようにするにはどうしたらいいでしょうか? Public Function test_a() Dim mytxt As Variant mytxt = test_b(1, 10) Debug.Print UBound(mytxt, 1) & ":" & UBound(mytxt, 2) End Function Public Function test_b(y, x) Dim mytemp As Variant ReDim mytemp(y, x) mytemp(1, 1) = "ABC" test_b = mytemp End Function
>>201 Debug.Printでmytxt(1, 1)を表示させればわかるけど、mytxt(1, 1)は"ABC"が入ってるぞ
>mytxt(1)の中のmytxt(1,1)に入ります
どういう状態が希望でどういう状態になってるって言いたいんだ?
203 :
201 :2011/10/15(土) 16:19:21.24
>>202 debug.print mytxt(1,1) とするとエラーになり、
調べてみたらなぜかmytxt(1)(1,1)に"ABC"が入ってました。
コードの書き方が悪いのかと質問してみたのですが、
EXCEL起動し直してやってみたら希望の動作になってました。
原因は不明ですが、このコードに問題はなさそうですね。
ありがとうございました!
積極的にバリアント使うのが問題かな
そのコードそのままでその結果になるわけはないから 違うコード書いてたんだろ。さもなくばVBAが誤動作してるってことになる どうせmytxtを配列で宣言したとかそんなオチだろ
●を含む文字列を検索して削除、さらにこの動作を●を含む文字列がなくなるまで繰り返すvbaを作ってます。 以下のプログラムだと実行エラー424となってしまいますが、解決方法は無いでしょうか?どなたか教えてください。 Dim x As Range Set x = Sheets("test").Cells.Find("●", After:=Range("A1")) If Not x Is Nothing Then Do While Not x Is Nothing x.Delete Loop End If
VBAに関数オブジェクトなんて無いぞ。 Deleteした時点でxが無効な状態になってそれっきりじゃん。
>>206 まず制御が分かってないな
[F8]キーでステップ実行してみるといいよ
分からないメソッドはヘルプ参照するなり
ググるなりして
Dim x As Range Set x = Sheets("test").Cells.Find("●", After:=Range("A1")) If Not x Is Nothing Then Do While Not x Is Nothing x.Delete Set x = Sheets("test").Cells.Find("●", After:=Range("A1")) Loop End If こうだな
>>209 何も解ってない初心者を騙すのは良くないぜ
>>206 Sub 全部消せ()
Dim x As Range
Do
Set x = Sheets("test").Cells.Find("●")
If Not x Is Nothing Then x.Clear
Loop Until x Is Nothing
End Sub
こいつも制御が分かってないな
> Do
> Set x = Sheets("test").Cells.Find("●")
> If Not x Is Nothing Then x.Clear
> Loop Until x Is Nothing
制御以前に不適切なコードではあるが、このやり方で行くなら普通は
Do
Set x = Sheets("test").Cells.Find("●")
If x Is Nothing Then Exit Do
x.Clear
Loop
という制御にするよな。なんかDo...Loopには、WhileかUntilで条件書かないと気が済まない初心者大杉。
こいつは、「x Is Nothing」を2回連続で判定することにバカらしさ、正確には冗長性を感じないのかねぇ?
それと、なんで皆FindNext使わないの?質問者はまだしも、2人出てきた回答者まで揃って…
極狭い範囲では大差ないけど、広い範囲で何度も検索繰り返すと、FindとFindNextでは10倍以上の差がでることもあるのに。
まあ正確に言えば、FindとFindNextの差じゃなくて、オプション引数Afterを適切に指定して、前検索結果位置以降から
検索再開させるか否かの差だが、これをやるためにはループに入る前に、最初の検索結果をxに代入しておく必要があり
それやるならループの前と中両方Findにするより、前はFind、中はFindNextにした方がいい。
これやると、ループの前にもFind処理が入り、コード記述量自体は多くなるが、処理の冗長性、処理の内容的には少なくなる。
プログラムに置いては、自分だけが使う「使い捨てマクロ」でない限り、コードの表面的な記述量を減らすより、冗長な処理を無くして
処理量を減らすのが基本だよ。「x Is Nothing」の連続判定も、After無し、あるいは
>>209 みたいな固定値のAfterでのFind繰り返しも、
冗長極まりない。初心者はコード量が少ないのが優れたプログラム、コード量が少なければ処理量も少なくなると勘違いしてそうだが、
そういう認識でコード書いてたら、いつまで経っても成長できないよ。
更に言うなら「『文字列』を検索して『削除』」なので、ClearではなくClearContentsが正解。
いるよなあ。
コードを見ると反射的に最適化しまくる香具師ってw
>>206 の質問の意図も、元のコードをできるだけ残して
最小限の変更で動くようにしてあげた
>>211 の配慮も
まるでわかってないんだろう。
プログラムばっかりやっていて対人関係を疎かにしていると
こういう空気を読めないコミュ障になるから気をつけよう。
同じようなコードは俺も考えたけど、 Do-Loopの両方に抜け出し条件を付けないのも、 それはそれで嫌な感じなんだよなあ。 あと、質問者のコードはClearじゃなくてDeleteだから。
わかっててDeleteを使ってんならいいけど、なんとなくわかってない気がするんだよなあ>質問者 元ソースの書き方だと詰める方向を明示しても良さそうなのに書いてないし
いるよなぁ
>>213 みたいに上から目線で得意げになっちゃう子。
プログラムばっかりやっていて対人関係を疎かにしていると
こういう空気を読めないコミュ障になるから気をつけよう。
ちょいと聞きたい。 料理のレシピなんかを管理したいときって、ExcelでVBA使うのとACCESS使うのどっちがいいんだろうか。 (料理名で検索したり、逆に使用している材料で検索したりしたい)
Access
>>218 サンクス!やっぱアクセスか。
値段が高いからExcelで済ませたかったんだが仕方ない。
ついでに聞きたいんだが、VBAの用途ってどんなものがある?
やっぱ計算メイン?DBと接続とか出来た気もしたんだが。
>>217 とりあえずExcel
テーブル設計ができているのならAccessだろうが
料理のレシピって、どんなテーブルを使うのか見当がつかない
>>220 検索重視ならAccessだな
材料とかジャンルとか調理方法とか、テーブルの作り方次第でどうにでもどきる
まぁ対人関係のよいっていうか人格者にはキレのあるコードを書けるやつが少ないのは確かだ。
>>212 はClearContentsでよければ
Set x =範囲.Find(********)
Do Until x Is Nothing
x.ClearContents
Set x =範囲.FindNext(x)
Loop
ってなるって教えりゃいいのに...。
あと書式が設定されてなきゃClearでも問題ないからな。
その方が早いし。
あとDeleteならFindNextはちょっと面倒になりそうだな。
そもそも
>>223 みたいなのはReplaceメソッドを使うべきだな。
コードだけ書いたんじゃ、知識のない奴には、どの回答が一番良いのか どのコードにどういう問題があるのか解らなくて混乱する 奴の書き方は確かに諄いけど、間違ったこと書いてないし 他の回答者から見たらカチンとくるかもだけど、質問者から見たらむしろ ありがたいだろうな
ちなみにDo Loopの制御構造をよく理解できてない人は下のように書きがちだ。 Set x =範囲.Find(********) If Not x Is Nothing Then Do x.ClearContents Set x =範囲.FindNext(x) Loop Unitil x Is Nothing End If
229 :
デフォルトの名無しさん :2011/10/18(火) 03:05:14.60
Sub あああ() Dim a As Variant Dim b As Variant Dim c As Variant Dim d As Variant Dim e As Variant a = 2 Do While Cells(a, 1).Value <> "" If Cells(a, 3) = Cells(a - 1, 3) And Cells(a, 2) >= 15 Then Cells(a - 1, 5) = b End If c = WorksheetFunction.SumIf(ActiveSheet.Range("f2:f288215"), "b = 1 ") d = WorksheetFunction.CountIf(ActiveSheet.Range("e2:e288215"), "b > 0") a = a + 1 Loop e = c / d Cells(8, 8) = e End Sub
230 :
229 :2011/10/18(火) 03:10:11.71
>>229 ● 「C列のアクティヴセルとその1こ上が同じ名前」かつ「B列」が15以上の時、
1・E列がセルない「1」の数
2・ 1の時、F列の数値の合計
3・ 「1/2」を算出したい
● オーバーフローになる
● エクセルの反応がなくなる
んですがどうすればいいでしょうか?
231 :
196 :2011/10/18(火) 08:27:09.75
232 :
デフォルトの名無しさん :2011/10/18(火) 09:14:55.40
>>219 >値段が高いからExcelで済ませたかったんだが仕方ない。
RDBにするならMySQLやPostgreSQLでもいいやん
自分で使うぶんには無料だし
無料のSQLserverでもええやん
>>230 変数bの内容が最初から最後までずっと0のまま
まずはそこを直せ
235 :
229 :2011/10/18(火) 12:43:14.94
>>234 やり方がわかりません・・・
確かにF列の該当セルが空欄になっちゃいます・・
236 :
229 :2011/10/18(火) 13:32:57.52
書き直しました Sub あああ() Dim a As Long Dim b As Long Dim c As Long Dim d As Long Dim e As Long a = 2 Do While Cells(a, 1).Value <> "" If Cells(a, 3) = Cells(a - 1, 3) And Cells(a, 2) >= 15 Then b=Cells(a - 1, 5) c = WorksheetFunction.SumIf(ActiveSheet.Range("f2:f200"), "b = 1 ") d = WorksheetFunction.CountIf(ActiveSheet.Range("e2:e200"), "b > 0") End If a = a + 1 Loop e = c / d Cells(8, 8) = e End Sub
237 :
229 :2011/10/18(火) 13:33:34.74
>>236を実行すると「オーバーフローしました」というエラーが出てしまいます
>>237 レス直前に、変数bとRANGE修正してたか。
とりあえず、「SumIf」「CountIf」の使い方も間違ってる気がする。
変数c,dがゼロになるから、変数eの計算をゼロで除算してる。
239 :
229 :2011/10/18(火) 14:11:01.15
>>238 >変数c,dがゼロになるから、変数eの計算をゼロで除算してる。
問題点がわかりました。
ありがとうございます
240 :
これでなぜ、エラー1004ですか :2011/10/18(火) 15:04:40.77
Sub 入力ボタン_Click() Worksheets("転載部分").Activate Dim e As String Dim f As String Dim g As String Dim h As Integer Dim nexter As Long ' 改行の動作が、これ。 nexter = ActiveSheet.Cells(3, 1).End(xlDown).Row e = 有利な特徴.Value f = 分野.Value g = レベル.Value h = ポイント.Value Worksheets("転載部分").Cells(nexter + 1, 1).Value = e ━ 途中まで、転載しました。この最後の行で、止まります。もう、謎です。たすけて。
>>240 エラーが出た時、変数nexterがいくつになってるか確認
242 :
これでなぜ、エラー1004ですか :2011/10/18(火) 16:07:44.33
65536になってます。本当はこれ、3のはずなんです。
243 :
これでなぜ、エラー1004ですか :2011/10/18(火) 16:10:28.52
4行目が空白セルで、この空白セルの一つ上のセルを自動的に見つけてくれるはずなんです。
244 :
これでなぜ、エラー1004ですか :2011/10/18(火) 16:13:51.14
nexter = ActiveSheet.Cells(2, 1).End(xlDown).Row にしたら、下の行へ下の行へと行かず、4行目のセルばかりをセレクトするようになります。 後半部を下にペーストします。 Cells(nexter + 1, 2).Value = f Cells(nexter + 1, 3).Value = g Cells(nexter + 1, 4).Value = h Range(Cells(nexter + 1, 1), Cells(nexter + 1, 4)).Select (罫線のところ中略) ActiveCell.Offset(1, 0).Select End Sub
A列の最終行
246 :
これでなぜ、エラー1004ですか :2011/10/18(火) 16:27:58.40
自己解決しました。 いったん、セル改行をされなくなるようにしてから動作させて、 再び元に戻したら、アプリケーションやオブジェクトの問題が起きなくなりました。 謎は残ります。自己解決とはいえ、なぜこうなるのかご存知でしょうか。
247 :
これでなぜ、エラー1004ですか :2011/10/18(火) 16:42:31.46
また、問題がぶり返しました。コンボ・ボックスを追加したら、先程の手順でも効果がなくなりました。
248 :
これでなぜ、エラー1004ですか :2011/10/18(火) 16:45:33.72
とりあえず、初期状態の文字入り(.value有り)のセルを2行の厚さにしました。これも、応急処置です。
249 :
これでなぜ、エラー1004ですか :2011/10/18(火) 16:55:39.81
スポーツ界も格闘界も芸能界もIT業界もヤクザが幅を利かせてると 聴きましたが、興業はともかく、なんでITもなんでしょうか。
250 :
952 :2011/10/18(火) 20:05:28.96
関数にdll使うのって、vbaのみで作った場合と比較して 計算速度としては優位になるのでしょうか。 目くそ鼻くそ?
>>248 >初期状態の文字入り(.value有り)のセルを2行の厚さ
nexter = ActiveSheet.Cells(2, 1).End(xlDown).Row
では これが最善策じゃないかな
今回の場合、このコードだと
Cells(2, 1)を含めて2行以上の連続した文字入りセルがないと .End(xlDown)は希望する
セル位置にはならないよ
とりあえず
.End(xlDown) は CTRL+↓ と基本同じ動作なので手動でテストしてみる事をお勧めするよ
んで自分なら
nexter = ActiveSheet.Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
とするかな
>>250 作って比較すりゃ分かるじゃん。
俺のはdllの方が速いよ。
速度をやたら気にする人間はこれでテストすれば良い。 'ミリ秒単位での時間の計測 Declare Function GetTickCount Lib "kernel32.dll" () As Long Sub うんたらかんたら() Dim startTime As Long Dim endTime As Long '処理の先頭で現在時刻を取得 startTime = GetTickCount '何らかの処理 '処理の末尾で現在時刻を取得し、その差分を調べる endTime = GetTickCount MsgBox "経過時間は " & Format(endTime - startTime, "#,##0") & "[ミリ秒]" End Sub
ご冗談を…
常識的に考えれば、DLLで行う処理が(呼び出しのオーバーヘッドも含めて)VBAで行う処理より早ければDLLが早いし そうじゃないならVBAの方が早いって結果になるんだが そこに有利も不利もないだろ
そういえばVBAにもコンパイルってあったよな それも比較してみたら?
>>251 >んで自分なら
>nexter = ActiveSheet.Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
>とするかな
nexter = ActiveSheet.Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
と
nexter = Cells(Rows.Count, 1).End(xlUp).Row
の違いって何なのでしょうか
同じだったら短いほうが読み易い気もするんですが。
>>258 コードが標準モジュールにあるなら一緒 好きな方にすればいい
コードがシートモジュールにあった場合
nexter = Cells(Rows.Count, 1).End(xlUp).Row
の処理対象シートは シートモジュールのシートになる(ActiveSheetではない)
行番号を求めてるうちはSelectするレベルと大差ない。 下くらい書けるようになってやっと脱初心者。 書けてもけっして上級者ではない。 Dim nexter As Range Set nexter = Range("A" & Rows.Count).End(xlUp).Offset(1) nexter.Offset(, 1).Resize(, 3).Value = Array(f, g, h) nexter.Resize(, 4).Select '(罫線のところ中略) nexter.Select
なるほど、そういう違いがあったのですか。 教えてくださってありがとうございます。 標準モジュールしか使ったことがないので分かりませんでした。 もう一個、まったく別件の質問なのですが FileSystemObjectってあるじゃないですか。 あれって皆さんどんな風に使ってるのでしょうか。 私はパブリック変数で FSO as Object を宣言して 最初のプロシージャで Set FSO = CreateObject("Scripting.FileSystemObject") ってやってますが、 パブリック変数はあまり使わないほうが良いらしいので、 他にもっと良いやり方があるなら教えてほしいです。 (参照設定でMicrosoft Scripting Runtimeにチェックを入れるやり方は 別PCで実行するときに面倒なのであまり良いやり方とは思えません。)
>>261 グローバル変数を使わない方法だと、別の手続きを呼び出すときには、いちいちオブジェクトもパラメータとして渡すってのが
まあ、正当と言えば正当かな
Call File_Sub_1(FSO, Data1, Data2)
みたいに
パブリックな変数はあまり使わない方がいいってのは、変数の有効範囲は狭い方が良いというのが基本的な考え方 FSOで考えれば、ほんとにFSO(のインスタンス)を使いまわす必要があるのか考えた方がいい あとパブリックかどうかと、参照設定するかCreateObjectするかは別の話なんだが解ってるのか?
>>262 >>263 インスタンスを使いまわすとかそういう事は考えてなくて
単純に宣言とか一回で済むほうが楽だというか、
グローバル変数使うと引数で渡さずに済むんで楽でいいな、
という程度の認識しかないです。
参照設定についてはとにかくマクロのコードの中以外で完結してない事が
やっぱり面倒だという認識で敬遠してます。
CreateObjectと参照設定の件についてはあんまり意味が分かってないです。
参照設定にするとオートコレクトが使えるんでしたっけ?
という程度です。
>>264 自分は未熟だし、いつどのようなプログラム例を見つけるか不明なので、
最初はPublicで書き連ねていく。
マクロを作りながら、そこにコメント付けて分類したりして纏めていく。
完成と言えるものができたら、
データ型の見直しとか、適切な場所への移動を行う。
まぁ、趣味でやっててヘルプファイルとグーグル先生が教師だからこんなもんだ。
266 :
VBA初心者 :2011/10/20(木) 20:28:33.52
ファイルのカスタムプロパティにDSO support.microsoft.com/kb/224351/ja を利用して、値を書き込もうとしています。 下のソースで、対象ファイルがExcelやWordなら書き込めるのですが、 SolidWorksというCADのファイルだと書き込まれません。 (OnErrorでも反応なし。ちなみにASCIIコードや半角カタカナ,全角文字は 1文字は書き込めます。) やはり、SolidWorkerの販売元に聞かないといけないでしょうか? Set objDSO = CreateObject("DSOFile.OleDocumentProperties") objDSO.Open ファイル名 objDSO.CustomProperties.Add "項目1" Set objProperty = objDSO.CustomProperties.Item("項目1") objProperty.Value = "あい" objDSO.Save objDSO.Close Set objDSO = Nothing どなたか、わかる方いましたらご教授お願いします。
グローバル変数あるとデバッグとメンテが大変なんだよね。 使用箇所は検索出来てもそれがどんな順番で実行されるか分からないし。 メソッドが変数について状態を前提としているかも分からないし。 逆に、一度初期化した後は読み取り専用って使い方はアリだと思う。
268 :
デフォルトの名無しさん :2011/10/21(金) 11:21:40.33
土素人ですいません。文系の学生で、できなくて困ってます。 VBAでCLEAN関数を使って、列一行改行を全部取りたいです。 SUB HOGE なんたら CLEAN ("A:A") END SUB みたいにできるでしょうか?縦一列の、改行を全部削除できたらいいです。
>>268 Clean関数は文字列しか処理できない(Rangeは受け付けない)ので、
自分で繰り返すように作る
For r = 1 To ActiveSheet.UsedRange.Row
Cells(r, 1) = Application.WorksheetFunction.Clean(Cells(r, 1))
Next
>>268-269 たとえば
With Range("A1",Range("A"&Rows.Count).End(xlUp))
.Value=Application.Clean(.Cells)
End With
実際は文字列は一旦消してから書き出すのが鉄則なので、Variant型変数に取得して
範囲を消してから書き出す。
271 :
デフォルトの名無しさん :2011/10/21(金) 12:39:12.00
質問です nmcファイルに関する質問はここでいいでしょうか
273 :
デフォルトの名無しさん :2011/10/21(金) 13:22:22.50
そうですか では受付しているスレがあったら教えてください ダウンロードしたツールのヘルプに書いてあるexeの実行について 説明がよくわからなく、自分で追加していいのか教えてほしいのが趣旨です よろしくお願いします
275 :
デフォルトの名無しさん :2011/10/21(金) 14:24:15.02
>>269-270 ほんとにありがとーーーーーーーーーー!(涙)涙出るほどうれしいよ。
こうやって合体させたよ。
Sub Macro2()
For r = 1 To ActiveSheet.UsedRange.Row
Cells(r, 1) = Application.WorksheetFunction.Clean(Cells(r, 1))
Next
With Range("A1",Range("A"&Rows.Count).End(xlUp))
.Value=Application.Clean(.Cells)
End With
END SUB
詳しいコード内容はわからないが、
これでA列がクリーンされた。
関数によって簡単にVBAに組み込めないものもあるのだろうか?
ほんと感謝
276 :
デフォルトの名無しさん :2011/10/21(金) 14:27:56.50
明日エキスパート(スタンダード)の試験でレジストリ関係の処理をテストしてるんですが、 ↓のコードがコンパイルエラーになります。(DeleteSettingステートメント) メッセージは「引数の数が一致していません。または不正なプロパティを指定しています」 これでなぜコンパイルエラーになるのか誰か説明してくれませんか? もう2時間も足踏みしている '登録名:Application pos = InStrRev(ThisWorkbook.Name, ".") - 1 APPNAME = Left(ThisWorkbook.Name, pos) 'データ削除 DeleteSetting APPNAME MsgBox "レジストリ掃除完了"
Functionoプロシージャか他のユーザー定義関数で、関数を格納したセルの値が 参照するセルの値の変更に伴い、自動的に再計算されて正しい数になるプロシージャはないでしょうか。 例:セルA4の値=3 セルA5の値=5 セルA6の関数の値=20 左の値を3から30に変える、左のセルから他のセルへ移った瞬間、セルA6が40になる。 ※例のセルA6には、ifやselect等で作られた独特なユーザ定義関数が入っているものとする。
>関数によって簡単にVBAに組み込めないものもあるのだろうか? WorksheetFunctionクラスのメソッドでは提供されてないものもある CODE関数とか まぁ他にもいろいろあるんだろうけど。
× For r = 1 To ActiveSheet.UsedRange.Row Cells(r, 1) = Application.WorksheetFunction.Clean(Cells(r, 1)) Next △ For r = 1 To ActiveSheet.UsedRange.Rows.Count Cells(r, 1) = Application.WorksheetFunction.Clean(Cells(r, 1)) Next ○ For Each x In ActiveSheet.UsedRange.Columns(1).Cells x = Application.WorksheetFunction.Clean(x) Next
>>277 日本語おかしいけどユーザ定義関数で解決する話じゃないの?
>>277 自分のVBA関数内でApplication.Volatileを記述すると幸せになれるかも。
ループ回すにしてもUsedRange.Columns(1).Cellsは下手だわな。 UsedRange.Resize(,1)とすればセルの集合になるし。
>>276 再現できない
レジストリエディタ見ながら
1行ずつ試してみれば?
>>279 は
>>270 の間違いを正しただけだな。
For r = 1 To ActiveSheet.UsedRange.Rowは明らかな間違いだし。
Excel2010でグラフを表示させるマクロを組んでます。 下のコードでは、実行したときに「ApplyCustomeTypeメソッドは失敗しました: '_Chart'オブジェクト」とエラーが出ます。 ネットにも割と転がってる書き方なんですが、何が原因なんでしょう? Dim ChartObj As ChartObject Dim ch As Chart Set ChartObj = ActiveSheet.ChartObjects.Add(100, 100, 100, 100) Set ch = ChartObj.Chart ch.ApplyCustomType ChartType:=xlAnyGallery, TypeName:="折れ線" '実際にはユーザー定義のグラフを作成します。 'このあと実際のデータ系列を追加していきます。
>>288 2007で試したけど、TypeNameにテンプレートに保存されてる名前指定しないとエラーになるな
可読性はどっちも変わらないよ。
そういえばOffset(,1)とすると可読性が落ちるとかいう先生がいたな。 Offset(0,1)としなさいみたいな。 Resizeの第一引数がないから可読性が落ちると思ってたりして。
293 :
288 :2011/10/22(土) 08:42:11.99
>>289 ためしにグラフのテンプレートを作ってそれを指定したらうまくいきました。
thx!
最近vb.netやってて久しぶりにVBA でちょこっとPG組んでみたけどなんか凄い違和感を感じた。 やっぱりあまり入力補完が効かないせいかな。 可読性は大事だね。変数名とかにも拘れば、その分 説明のコメントを省略出来たりすることもあるしね。
可読性なんてのはその人のレベルで違う。
欲しいのは1列目のセル集合 @ 使用範囲 の 列(1) の セル A 使用範囲 の サイズ変更(,1) はてさて、、、
>>295 VBAでは入力補完が効く書き方が概ねセンスのよい書き方だ。
入力補完が効かない場合でもきちんと固有の型の変数に一度代入すれば入力補完が効く。
たとえばWith ActiveSheetとやっても駄目だが、Worksheet型の変数に
Set sh = ActiveSheet
With sh
とすれば入力補完が効く。
300 :
デフォルトの名無しさん :2011/10/22(土) 11:12:30.41
欲しいのは1列目のセル集合 @ 使用範囲 の 列(1) の セル A 使用範囲 の サイズ変更(,1) はてさて、、、
どっちも同じ
@ 使用範囲 の 列(1) の セル A 使用範囲 のセル集合のサイズ変更(,1) だな。 UsedRangeはセル集合を最初から返すから、セルの集合のまま使った方が手っ取り早い。
> UsedRangeはセル集合を最初から返すから、セルの集合のまま使った方が手っ取り早い。 > UsedRangeはセル集合を最初から返すから、セルの集合のまま使った方が手っ取り早い。 > UsedRangeはセル集合を最初から返すから、セルの集合のまま使った方が手っ取り早い。 > UsedRangeはセル集合を最初から返すから、セルの集合のまま使った方が手っ取り早い。 > UsedRangeはセル集合を最初から返すから、セルの集合のまま使った方が手っ取り早い。
>>303 分かり切ったことを5回も書かなくていい。
つまり
@セル集合の使用範囲の列集合の列(1) のセル集合
Aセル集合の使用範囲のサイズ変更(,1)
ってことだろ?
┐(´ー`)┌
Sheet1の使用範囲の2列目のセル集合なら Sheet1.UsedRange.Columns(2).Cells Sheet1.UsedRange.Resize(,1).Offset(,1) などがあり、とりたてて後者を推奨するわけではないが、1列目に限れば Sheet1.UsedRange.Resize(,1)がすっきりしてるわな。 上級者ほどResizeを使うだろうな。
失礼、 上級者ほどResizeを使わないだろうな。 の誤りです。
話反れるけどVBA上級者ってどんな人? PGならVBから入った人が多くて、そっちの機能で大体の事は出来ちゃうと思うし、 現場で使う人は、機能は知っててもプログミングの基礎知識が無いだろうし。 自分の周りに上級者が居ないので気になりました。
310 :
デフォルトの名無しさん :2011/10/22(土) 14:34:35.64
全くの素人です。あるフォルダ―の中のエクセルファイルがあります。 のファイルの中にはいろいろ個別のデータが書き込まれているのですが、 中身チェックのマクロとか組めば、各ファイルを開いて簡単に中身を読み込んで、 一覧表みたいなのはできるのでしょうか?
VBAで上級者はいない これデフォ
できる事も、やれる環境も限られてるからな プレハブで豪邸が建たないとの同じようなもんだ プレハブにはプレハブのいい所があるんだから、そこを重視すべき
たまに、「うちの業務は全部この Excel 帳票でやってます」 なんてのがあるけど、物には限度ってものがあるよな。
314 :
デフォルトの名無しさん :2011/10/22(土) 15:18:10.23
>>310 です。 ぐぐったら出てきました。 自己解決です。
「上級者ほど〜を使う」というのは、上級者じゃないと把握出来ない つまり「上級者ほど〜を使う」というのは、「俺は上級者」と遠回しながらドヤ顔で言ってるのと同じ しかも、自分の書いたものを、他人が上級者認定してるかのように自演してまで うわぁ、痛すぎw
309だけど自演じゃないよ。 「プレハブ工法を知り尽くした男」に尊敬や憧れなんて無いし。 偉いとは思うけどね。 やっぱ上級者を育てる土壌がないのか、危険な言語だわ
上級者ほど道具を使って マニアックになって行く
というか、想定用途が違うんだから、VBA 以外でやったら上級者とかいう話じゃないでしょ。 むしろ、VBA で済ますべきか他の方法を使うべきかを見極められるのが上級者。
> 1列目に限れば 条件を勝手に限定せず 条件が変わっても違和感無く柔軟に対応できる方法を使うのが上級者 特定条件での端的なすっきりさを優先して、1列目ならResize、2列目以降ならColumnsと やりかたをコロコロ変えるのが初心者
だそうだ
実行時バインドのItemプロパティを多用する奴に上級者はいない。
>>316 プレハブの例え挙げたの俺だけど、
>>318 が正解
震災の仮設住宅設営で、一級建築士も宮大工も必要ない
言語は道具なんだから、きっちり使いどころを押さえているのが肝要
まぁプレハブ工法を極めるのもアリでしょ
かなりのスピードと精度を求められると思うが
おまいら1行目にいろんな処理をするときどちら使う? その1 With Range("A1").CurrentRegion.Rows(1) .****.*** .****.*** .****.*** End With その2 With Range("A1").CurrentRegion.Resize(1) .****.*** .****.*** .****.*** End With
Range(場所).Columns(1)
ああ、ColumnsじゃなくてRowsか
>>323 どちらが楽かと言われれば当然後者だわな。
分かってる人もいるにはいるんだな。
何故に自演してまで・・・
また始まったなw
一方を書いたの俺だが、=はハズレなので可哀想じゃないわけだね
_,====ミミミヽ、 ,,==≡ミヽミヾミミミ、ヾ、 _=≡≡三ミミミ ミミヾ、ソ)),,》 . 彡彡二二三≡ミ-_ ミミ|ノノj )||ヽ, )、 __,,,,,,,,,/彡二二二 ,- __ミ|/ノ ノノノノ) || -=二ミミミミ----==--'彡 ∠ミミ_ソノノノノ ノ //>=''"二二=-'"_/ ノ''''')λ彡/ ,,/ ̄''l 彡/-'''"" ̄-=彡彡/ ,,-''",,,,,,,ノ .彡''" (, ,--( 彡 ,,-- ===彡彡彡"_,-_ ヽ Υ ヾ-( r'''''\ //=二二''''''彡ソ ̄ ∠__\ .\ソ .| \;;;; \ Ζ彡≡彡-'''',r-、> l_"t。ミ\ノ,,r-v / ̄ ̄ ̄ ̄ ̄ ̄ \;;;; \ 彡""彡彡-//ヽ" ''''''"" ̄'''""(エア/ / \;; \'''''')彡ヽ// | (tv /| , r_>'| < 一体(ry \;;; \'" \ ,,"''-,,ノ,r-", / r'''-, .j \ \;;; \ /,,>--'''二"''' r-| 二'" / __ \______ \;;r'""彡_l:::::::::::::::::::::: /./_ " / ̄ ̄"===-, )''//rl_--::::::::::::::::/:/ヽ"'=--":
アホと戦うのも疲れるよ。
VBAスタンダードクラウン日本第1号講師のVBA講座 - YouTube www.youtube.com/watch?v=ZNx8aq9ZIvI これの Test4_1_6のプロシージャなんだけど 制御がひどくないか Worksheets("Sheet1")がWorksheets("Test")より左にあったら 実行時エラーだし VBAに関わらず、こんな制御を書く人間はプログラミングしないでくれ
>>337 何この上から目線
人が何書こうが勝手だろうに
>>337 ループの回し方の講座だろ?
Worksheets("Test")はない前提だから別にいいんだよ。
そもそもシート名を書き換えるなら普通はループは回さないし。
またコードなんか隅々まで考慮に入れて書いてたら2〜3倍の記述量になるから講義にはならん。
厨房でも設問の「ただし空気抵抗は考慮しない」云々の但し書きに あーだこーだぬかす奴がいるでしょ それと同じだよ 問題の本質を捉えられない馬鹿は普通にいる
擁護がひどいな VBAスタンダードクラウン日本第1号講師のVBA講座 - YouTube www.youtube.com/watch?v=ZNx8aq9ZIvI より、引用 Sub Test4_1_6() For i = 1 To Worksheets.Count If Worksheets(i).Name = "Test" Then MsgBox "既にTestシートが存在します" Exit Sub ElseIf Worksheets(i).Name = "Sheet1" Then Worksheets(i).Name = "Test" Exit For End If Next End Sub
Sheet1が先に見つかったらエラーですかw
シート名の"Sheet1"と"Test"は共存しない前提だろ? "Sheet1"を"Test"に変更すれば"Sheet1"はなくなるからね。 共存ありなら Sub Test4_1_6() Const FROM_NAME As String = "Sheet1" Const TO_NAME As String = "Test" Dim sh As Worksheet On Error Resume Next Set sh = Worksheets(TO_NAME) On Error GoTo 0 If sh Is Nothing Then On Error Resume Next Set sh = Worksheets(FROM_NAME) On Error GoTo 0 If Not sh Is Nothing Then sh.Name = TO_NAME End If Else MsgBox "既に" & TO_NAME & "シートが存在します" End If End Sub なんてなるんだろうけど。
ん?Testシートが既存の状態でsheet1が先に見つかったら同じ名前を付けようとしてエラーになるやん。
でも講座用なら別にこんなん普通やろ。
>>340 に同意だな。
おっと、たとえばグラフシートに"Test"とかあった場合上ではNGか。 shをObject型で宣言して Set sh = Worksheets(TO_NAME)じゃなく Set sh = Sheets(TO_NAME)だな。
普通のExcelの初期状態の新規ブックはSheet1とかSheet2って名前になってるよな。
別に
>>341 みたいに目くじら立てる問題じゃないな。
講義用ならありだと思う。
ほんまもんのプロが
>>341 みたいな不細工なコード書いてたらプロとして失格だが。
単純に、Forループを2回廻すとか、 Sheet1のインデックス取っておいて Forループ出てからファイル名変更するとか、 すれば、講座の趣旨にも沿うだろ >343とかw
スタンダードクラウンなんて資格は知らんが、大体資格なんてあてになるのか? MVPなんかかなり酷いぞ。
訂正 全員ひどいってわけじゃないと思うが、ひどいのがいるって話ね。
そいつ前いた忍者ハッタリ君じゃね?
351 :
デフォルトの名無しさん :2011/10/23(日) 22:53:10.63
エラー処理ってどこまで配慮するかのサジ加減が良く分からない。 自分で使うマクロなら例えば数字の入力を要求するところに文字は入れないし、 エラーで止まっても原因の見当がつくから適当に書いちゃってる。 でも人に使わすものだと相手がどんな使い方するか分からないから エラー処理きちんとやらないとあとで文句言われてめんどくさい。
MVPはサイトを立ち上げてティップスをいっぱい並べておけば誰でもなれる。 ティップスの質は関係ないよ。
そのとおり MVPはそもそも資格ではない
野球板でどうぞ
>>277 です。Application.Volatileでも、ダメでした。
>>355 そもそも質問が意味不明
左の値ってなんだ?
なんでA4の3を30に変えるとA6の20が40になるのかも分からんし。
ユーザー定義関数なんてのは引数をきちんと渡せば、引数の変更で普通に再計算される。
Application.Volatileなんてものは書く必要なし。
そんなもの書いてる関数のほとんどは糞関数だ。
>>355 そもそも関数にSelect使っても動かんだろ?
selectは使っておりませんが、functionプロシでifを使ってます。 ユーザー定義関数でifは使えないんですか? >なんでA4の3を30に変えるとA6の20が40になるのかも分からんし。 ユーザー定義関数で、数が変わるのを表現しました。
あと、プロシージャを標準モジュールに入れているのも、原因でしょうか。
きちんと引数を使ったら、自己解決しました。すみませんでした。 お礼に「9歳から14歳」を2ちゃんねる検索したらヌケる、この情報をお教えします。
361 :
デフォルトの名無しさん :2011/10/24(月) 12:28:08.39
すみません。素人です。 Sub B() Dim i As Long For i = 1 To 10 Cells(i, 1) = Mid(Cells(i, 11), 4, 6) Next i End Sub という、A1からJ1へMIDで6文字取り出す式を立てたつもりなのですが、 なぜか結果をA列を縦に表示します。 Xにforで代入し、iが1,2,3…と変化したら、A1,B1,C1…と行方向横に表示すると思うのですが、 X値が変化して、なぜ縦に列で出るのでしょうか????
>なぜ縦に列で出るのでしょうか???? そらぁ縦に出るように指定してるからだろ w
cells(1,i)なら横に出るよ
行,列の考え方が逆
こういう、定義をあいまいなまま放置する人が6+5×3=33という計算をしちゃうのかねぇ?
366 :
デフォルトの名無しさん :2011/10/24(月) 14:27:46.55
>>362-364 ありがとうございます。デフォですかこれ。
Cells(y,x)と指定するんですね。
367 :
361 :2011/10/24(月) 14:28:55.93
あれっ 6+5×3は195じゃないの?
x,yじゃなくてrow,colで考えれば自然
369 :
デフォルトの名無しさん :2011/10/24(月) 15:06:46.18
じゃあ自然じゃなくていいです。
計算プログラムを作っています。 列を一次元配列にfor文で入れるところが処理速度のボトルネックだと わかったのですが、高速で代入できる方法はありますか? どんな方法でも構いません。 配列はdllに渡します。
Range.Valueで、Variantの二次元配列として取り出す。 自前のdllならVariantの二次元配列を直接処理できるようにすればなお良し。
376 :
デフォルトの名無しさん :2011/10/24(月) 23:08:14.32
moji = "aaaa\nbbbb\nccccccccccc\n" Filename = ActiveWorkbook.Path & "aaa.txt" fileNo = FreeFile Open Filename For Output As #fileNo Print #fileNo, moji Close #fileNo こういう変数があった場合 aaaa bbbb ccccccccccc みたいにテキストに改行された状態で書き出したいのですが可能でしょうか?
fileNo = FreeFile Open Filename For Output As #fileNo dim s as string for each s in split(moji, vblf) Print #fileNo, s next Close #fileNo
こうだろ fileNo = FreeFile Open Filename For Output As #fileNo dim s as string for each s in split(moji, "\n") Println #fileNo, s next Close #fileNo
379 :
デフォルトの名無しさん :2011/10/25(火) 00:16:55.31
>>377-378 すみませんありがとうございます
もし宜しければ
変数内に\tがあればテキストにタブに変換されてるようにしたいです
これも教えてください。
fileNo = FreeFile Open Filename For Output As #fileNo dim s as string for each s in split(moji, "\n") Println #fileNo, replace(s, "\t", vbTab) next Close #fileNo
>>375 2003ならVariant変数に
a =WorksheetFunction.Transpose(列)とすればaは1オリジンの一次元配列になる。
65536行を超えることのある2007以降では怖くて使えない。
今後のことを考えると
>>373 のいうとおり、二次元配列を処理した方が無難かも。
2003でオンライン会議してみたいのですが、「ディレクトリサーバ」はどうするのでしょうか。 あと、エクセルで社外のネットワークを介してチャットやホワイトボードするのは今現在、一般的なのでしょうか。
テンプレから判断するとスレ違いだと分かっているのですが、他にきくべきスレが見あたらないので、ここで質問させてください。 あるオブジェクトのプロパティ(メンバ)一覧を取得するにはどうしたら良いのでしょうか? JScript の for(in) のようなことがしたいです。 (当然ですが)直接 For Each In に渡してもだめでした。
10個の連続したセルを赤から白までの グラデーションっぽく色を変えて塗りつぶしたにのですが、 ColorIndexの数字は一つ一つ調べておくしかないですか? 赤の数字を基準に一定の数字を足すなり引くなりすると グラデーションっぽくなるとか、そういう方法はないでしょうか?
>>385 RGB関数を使うと、色の濃さと数字がきっちり比例するようになるから簡単だよ
A1〜A10に色を付けるサンプル(ただしExcel2007、2010に限る)
Sub グラデ()
For r = 1 To 10
Cells(r, 1).Interior.Color = RGB(255, r * 25.4, r * 25.4)
Next
End Sub
ありがとう。 これで楽になる
>>386 は手抜き
より厳密にやるなら
r * 25.4
の部分を
Int((r - 1) * 28.4)
にすると正確に0から255までのグラデーションになる
Excel2003で、コントロール・ツールボックスからイメージを配置してピクチャーも設定しました。 そのイメージが、左クリックで選択できなくなりました。 このイメージを編集したいのですが、どのようにすればよろしいでしょうか。
390 :
196 :2011/10/26(水) 17:22:28.07
>>389 デザインモードをオンにしたら出来ないかな?
>>389 選択モードにするとか
ツールバーの白い矢印(マウスカーソルと同じ)のアイコンをクリックね
Excel2007 グラフのソース変更の質問です 元からあるグラフのデータ範囲を変更したいのですが SetSourceData を使って設定しようとしています ここで、複数のデータ範囲を一つのグラフに入れたいのですが .SetSourceData Source:=(Range(A1:E1,A3:E10)) のように、セルの名前を使った指定方法ならうまくいくのですが Function関数などを使っているので、セルの座標をCellsで指定しなければいけません どうしたらよいでしょうか?
393 :
383 :2011/10/26(水) 19:40:05.57
>>384 これは行けそうです!
非常に助かりました。ありがとうございました!!
>>390 >>391 デザインモードのタグも、白い矢印のタグも、Excel2003だからか、見当たりません。
>>394 Excel2000の場合ですけど、
[表示(V)] > [ツールバー(T)] と進み、
[コントロールツールボックス]にチェックを入れると
デザインモードのボタンが表示されます。
(ツールバーの余白部分で右クリックしても同様の操作が可能です。)
デザインモードにすればイメージの編集が可能でした。
解決しました。2007とレイアウトが大幅に変わってて、気付くことが多かったです。
2003です。 たとえばa+bを計算するときに、 一度目はセル(1.1)、(1,2)を読み込んで、計算、 (1,2)の値を変更して再計算するときに、(1,1)は読み込まずに一度目に読み込んだ値を使用して計算することは可能でしょうか。
>>398 a = Cells(1, 1)
b = Cells(1, 2)
一回目 = a + b
Cells(1, 2) = 別の値
'再計算
b = Cells(1, 2)
二回目 = a + b
仕事でどうしても使わなきゃならなくなったんだけど、VBAって理不尽なエラーが多く出ないかい? まあ、おじさん初心者が基礎をすっとばかして適当に組んでるのが原因ってのは解ってんだけどね
>>400 どんなアプリでもマクロ言語ってのはどうしてもそうなる。
それでもVBAはメジャーな分比較的きちんとしてるほう。
>>400 VBAに限らないよ
どんなプログラムでも素人が組むとエラーだらけになる
まともなアプリって、全体の半分ぐらいはエラー対策だったりするし
想定外の事態を事前にどれだけ予測してどれだけ対処できるかでプログラマーの腕がわかる
でも掲示板での質問にエラー対策が完璧な回答をしても喜ばれない。 コメントも同じ。 回答は本筋だけ示せばよい。
>>399 ありがとうございます。
staticで実現できました。
405 :
397 :2011/10/28(金) 17:21:23.53
何方か判りませんかね〜^^;
>想定外の事態を事前にどれだけ予測して 予測してたら想定外じゃないだろ
>>401 そんなもんなんですねぇ
今やっと、大体の画面作りが終わったので、これから計算や文字処理のルーチンを書いてく予定です
画面でこれだけ苦労したのに、本当に最後まで作ることができるんかいなと・・・
でもやるしかないんで、騙し騙しでも頑張るです
というか、「理不尽な」エラーなんて出た記憶がないな
理不尽なソースならいくらでもあるよ
エラー時にエラートラップされていない場合のみ止める設定の時に、 たまに数字だけのエラー表示があるのが、一寸鬱陶しくはある。 まあ、エラー時に止める設定にすれば判るから大して困りはしないが。
むしろ正常に動作していないのにエラーも何も出さないってのがMSのソフトには多いから困る
それは仕様です(キリッ
初心者です。 変数型によるメモリの使用量の違いを知りたくて sub test() debug.print application.memoryused dim a as byte a=1 debug.print application.memoryused end sub と byteをvariantに変更して比較したのですが使用量が変わりません。 どうしてなのでしょうか?
遅レスですが
>>386 >>388 の
25.4とか28.4という数字は、どこから出てきた数字なんでしょうか?
>>323 >>328 の話にあった
With Range("A1").CurrentRegion.Rows(1)
より
With Range("A1").CurrentRegion.Resize(1)
の方が楽、というのがわからないです。どういう場合に楽なんでしょう?
可読性は前者の方が高いと思うのですが??
417 :
196 :2011/10/30(日) 11:51:53.93
良く分からんけど、 mov ax,0 の代わりに xor ax,ax するようなもん。
>>416 Resizeならピリオド打つと自動メンバ表示されるがRowsは実行時バインドのItemプロパティを使ってるので自動メンバ表示されない。
With Range("A1").CurrentRegion.Rows(1)これはWith Range("A1").CurrentRegion.Rows.Item(1)の略だ。
Withでくくるときは極力Itemプロパティは使わない方がよい。
>>298 も読むように。
419 :
416 :2011/10/30(日) 13:37:49.32
>>418 非常に分かりやすい説明ありがとうございました。
「Resize」の表記で直感的に意味がわかるようになることが
良いVBA使いに至る道のようですね。
420 :
416 :2011/10/30(日) 13:40:10.44
>>417 アセンブリ言語が良くわからないので
喩えがあまり理解できませんでしたが
回答ありがとうございました。
UserFormについて質問です。 (XP&Excel2000,2003) 複数のフォームを開閉するマクロを組立て中です。 この時、1枚目を完全に閉じた上で、2枚目のフォームを開くことはできないでしょうか。 変数受け渡しでうまくいかないかと試行中。 Google先生はLoad/Showしか教えてくれない…。
どこで困ってるのか今ひとつ良くわからない
423 :
421 :2011/10/30(日) 23:01:29.14
普通に Unload Me UserForm2.show みたいにしてもフォームが消えなかったり、 先ほど開いていたフォームを開きなおすとエラーが出る等、かな。
425 :
421 :2011/10/31(月) 06:57:57.73
>>424 マクロ本体が無いので少し説明不足でした。申し訳有りません。
ダミーで確認してみたところ、
「既にフォームは表示されています。モーダルにできません。」でした。
CommandButtonでの操作は問題ない(ように思う)のですが、
右上の×ボタン操作を閉じた時の動作が思うように行きません。
Aフォームのボタンから別のBフォームを表示させ、その時にAフォームを消す んで、Bフォームを消してまたAフォームを表示させる ってことやってるけど、全然そういうエラーは出たことはない >変数受け渡しでうまくいかないかと試行中。 フォームを開くのに変数受渡しって何?
427 :
421 :2011/10/31(月) 09:42:21.52
>>426 Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
UserFormX.Show Xは読み替えで。
End Sub
↑UserFormXが起動するので、Show以降が処理されない=閉じることができない。
だから、フォーム2の後ろにフォーム1が見えたままですし、フォーム2を閉じると上述エラーが出る。
「Me.Hide」を加えると見た目では消えている…けど途中で閉じるボタンが聞かなくなる。
そもそもHideとUnloadは役割が違う。
>>変数受け渡し
フォーム毎に変数(Public)を持たせます。
そして、閉じるときにスイッチOFFをいれつつ、フォーム管理マクロを呼び出し。
強引にフォームを閉じ、必要なフォームを開けないかと思いましたが、
結局↑と似たような感じになり断念。
フォーム数だけマクロ用意すれば変数不要な気もする。
代替案で「閉じるのはCommandButtonのみ、右上×ボタンは封印」
というのも考え中ですが、こちらで何かいい案が聞けないかなと…。
UserForm_Terminate() に書けばいいよ
>>428 回答がお早い…。
Terminateでも同じフォーム開きなおすと、閉じるボタン聞かなくなりますねぇ。
他のボタンも動かなくなるのも同じです。
430 :
426 :2011/10/31(月) 10:15:44.13
こっちはExcel2007 Query_Closeでやはり 既にフォームは表示されています。モーダルにできません。 というメッセージが出るね。 まぁ早い話、これを使ってのフォームの操作は諦めろってことでは?
UserFormX.Show じゃなくて dim f as new userformx f.show ってすればいいよ。
432 :
421 :2011/10/31(月) 10:50:03.25
おぉ…完成しました。 開き方ひとつでこうも変わるものなんですね。 回答くださった方々、ありがとうございました。 少しずつですが勉強頑張ります。
このスレの趣旨と合うかどうか微妙ですが質問です。 オフィス2007使用で、会社のパソコンのマイドキュメント内に自分のフォルダを作成しそのフォルダを信頼する場所に指定して その中で自分が直接作ったファイルのみを使用してます。この状態で他人が作ったマクロ有効ファイルを一切使わない場合、 マクロウィルスなどの被害にあう可能性はありますか?
>>433 マクロウィルス「など」ってちょっと曖昧ですね。
マクロウィルス以外の被害は想定しなくても良い前提なんですか?
まぁ、仮にエクセルのマクロウィルス限定だとしても
ほかの前提条件が不明だから可能性はゼロにはならないです。
たとえば、他人が勝手にそのPCを使って出所不明のマクロを実行してしまう。
なんてのはどうです?
ってそういう頓知を聞きたいわけじゃないですよね。
そのPCを自分以外は誰も使用しなくて、自分自身でマクロウィルスを作成・実行しない。
という前提ならエクセルのマクロウィルスの被害には遭わないです。
要は信頼する場所云々以前に出所不明のマクロを実行しないというのが肝であって
それさえ守れば後は関係ないです。(あくまでもマクロウィルス限定の話ですけれど)
あるかないかで言えば、アドオンが感染とかExcel本体が感染とか常駐型に感染とか、 マクロファイル以外にも感染ルート、可能性はいくらでもある
436 :
433 :2011/10/31(月) 22:35:31.24
ありがとう。 いちおう自分がVBAを使い始めた事が原因で感染しなければ良いので。出所不明のマクロ使用しないですし大丈夫ですね。 会社がセキュリティソフト導入しないので、エクセル以外からの感染は仕方ない状態です。 共用してるもう一人が、俺のファイルが重すぎる、お前なんかしただろとわけわんない言いがかりをつけられてて一応自分のせいではないことを確認したかったのです。
嫌な現場だなw そんな心配しなきゃいけない位なら そんな所やめてしまえばいいだろうに。
438 :
デフォルトの名無しさん :2011/11/01(火) 00:05:05.81
>会社がセキュリティソフト導入しないので すげぇ会社だな、ヲイ
MSEをこっそり入れとこう
本当に自分が直接作ったファイルしか使わないなら安全かもしれんが ウィルスってのは、ファイルを書き換えたりするんだぞ お前が作ったそのままだと思ってるファイルが実はこっそりウィルスに感染してる可能性は排除できんぞ
441 :
434 :2011/11/01(火) 06:15:52.26
>>433 酷い職場ですね。
そんなんじゃあマクロウィルス以前に
どんなマルウェアに感染されてるか分かったもんじゃないですね。
ちなみにうちの会社だとインターネットにつながってるPCと
社内のネットワークだけにつながってるPCの2系統のネットワークがあって、
業務は社内ネットワーク上のPCでしか作業してないです。
外部記憶メディア(USBメモリなど)の使用も禁止です。
普段はそっちで仕事していて、
調べものとかがあるときだけインターネットにつながったPC使ってます。
>>441 うちもそういう構造してるけど、アップデート関係が完全に放置されてる。
隔離すればある程度安全には違いないんだが、
年1回ほど「ウイルス発見されたー もちこむなー」って言ってるよ。
>年1回ほど「ウイルス発見されたー もちこむなー」って言ってるよ。 「ウイルス発見されたー ちんこもむなー」に見えた。 疲れてるな、俺。
445 :
434 :2011/11/01(火) 19:53:43.66
>>443 ちがいます。
専門的な作業は外注しますし、
私はプログラマーとかじゃないのでVBAもろくに使えません。
でも簡単なマクロでも自分の仕事には十分役立ちます。
446 :
デフォルトの名無しさん :2011/11/02(水) 09:34:22.37
>>445 ウィルスって騒ぐほどの会社ならいいが。
世間一般的な(家庭レベル)セキュリティで十分な気がするけどな。
例えば、世界が認める日本企業なんかにいるんなら、そのサーバーを
ターゲットにするだろ?
一般企業でウィルス感染は、いわば社会人のモラル欠如の結果、
変なサイトにアクセスし感染って感じじゃね?だいたい一般的な
会社をターゲットにするなんて考えられない。メリットなしだ。
今のウィルスはマルウェア型で個人情報(カード情報)の抜き取り
がメインになりつつある(日経PC情報)。あまり、そこに力いれん
方が良いと思うけどな。
あとウィルスソフトのフリーも入れない会社自体も問題あるけどね!
長文すまん。むかつくやつはスルーしてくれ。
無防備なPCはそもそもネットにつなぐな 普段使うようなサイトでも改ざんされたりしてるだろ 相手のサーバがクリーンかどうかチェックできないのに 変なサイトかどうかは判断できない
448 :
デフォルトの名無しさん :2011/11/02(水) 14:16:05.36
>>447 >普段使うようなサイトでも改ざんされたりしてるだろ
ほんとに?
>変なサイトかどうかは判断できない
エロサイトやフリーダウンロード横行しているサイト
検証してアップいるサイトならOK。
変なサイトってここの事か? 昔ノートンが誤検知して大騒ぎした事があった
saymoveが改ざんされてたじゃまいか
451 :
デフォルトの名無しさん :2011/11/02(水) 15:59:02.41
>>450 saymoveは寄生型のサイト。
それを普通のサイトというのは変でないの?
452 :
デフォルトの名無しさん :2011/11/02(水) 19:36:59.65
読み上げについて、Excel2003です Application.Speech.Speak Range("A1") で文字を読み上げさせることはできたんですが、読み上げる音声(sam,kenji,naoko)を指定する方法ないですか? コントロールパネルから設定できるのは知っていますが、VBAで制御する方法を教えてください。
453 :
デフォルトの名無しさん :2011/11/02(水) 20:02:24.73
読み上げについてです コントロールパネルから読み上げる音声(sam,kenji,naoko)を設定できるそうですが どうればよいのでしょうか?
>>452 .GetVoices().Item(n)
455 :
デフォルトの名無しさん :2011/11/02(水) 21:20:33.70
>>453 そのままOKボタン押せば設定されますよ
456 :
デフォルトの名無しさん :2011/11/03(木) 10:53:32.25
458 :
デフォルトの名無しさん :2011/11/03(木) 11:49:39.30
ア キ ラ メ ロ
460 :
デフォルトの名無しさん :2011/11/03(木) 12:09:33.23
ぃゃょ
使用ソフトexcel2003で質問です。 ある特定のフォルダにある複数のエクセルファイルから,幾つかの条件でデータを抽出し, 新規のエクセルファイルに集約するマクロを作りたいと思っています。お力を拝借いただきたいです。 ○元データ あるフォルダに顧客データファイル(氏名,都道府県,郵便番号,電話番号,性別,などが一行に並んでいる)が複数ある。 仮にファイル名「顧客1」「顧客2」……とする。 ○抽出条件 例えば,氏名が「田中」または「斉藤」,かつ都道府県が「神奈川」「山梨」「鹿児島」「北海道」「沖縄」のいずれか, かつ性別が「男」。など複数の条件 ○作成ファイル 元データと同じ項目並び順で,条件に該当した顧客データを一つのエクセルファイルに収める オートフィルタとコピペを繰り返せばよいかと思ったのですが,私の知識では複雑な条件に 対応させることができませんでした。上記の都道府県の例のように最低5つのキーワードで抽出を可能にしたいです。 どなたかそれらのコードを記述していただけませんでしょうか?
accessにするべき
>>461 ExcelファイルにSQL投げればいいんじゃないかな
>>461 サンプルを用意すればそれに応じて
書いてみてもいい
データの件数によっては、VBAじゃ遅すぎて実用にならないんじゃ・・・。
元データがエクセル表だってんなら、何でやっても大差はでない気はするが
100件ぐらいまではたいした違いはないだろうけど、数千件、数万件となってくると、 一旦 CSV で出力して、Perl かなんかで処理したほうが、 CSV出力の手間を込みで見ても断然早いんじゃないかな。
>>469 あなたすごいですねぇ。
こんな上級者がこのスレにいたとは!!!
そうか、code padはVBAの場合plaintextで置けば良いんだ。
初心者です。 アクティブセルの列番号は ActiveCell.column で取れますが、 フィルターをかけて非表示の列ができると結果が変わってきます。 フィルターをかけた状態で元の列番号を取ることはできるのでしょうか? 出来る方法があれば教えて下さい。
さすがの俺もそれは知らないなぁ
>>469 こういうのをサクッっと作れちゃう人尊敬する
IDでないんだな、それが
誰かExcel2003で下がエラーになるかどうか試してくんない? 俺は2007同様エラーになると思うんだが、エラーにならないと言ってるやつがいるもので。 Sub hage() Dim a(1 To 65537) As Long MsgBox WorksheetFunction.Match(0, a, 0) End Sub
今Excelが手元にないので
>>479 Excel2000の場合だと、
Dim a(1 To 5461) As Long
までならOKで、
Dim a(1 To 5462) As Long
以上だと
実行時エラー '13':
型が一致しません。
てのが出る
>>481 トン。
2000の制限は俺も知ってたんだけど、2003は2007同様65536までじゃないのかな〜。
>>482 2003でやったところ、65536だとOK
>>483 65536でOKなのは知ってるが65537じゃどうなの?
2003でやってみたけどまさかこんな結果になろうとは
65536 "だと" OKって言ってるんだから普通に考えればNGだろw
もういいわ、誰か他の人に聞きたい。 Excel2003で次のコードはエラーになる? Sub hage() Dim a(1 To 65537) As Long MsgBox WorksheetFunction.Sum(a) End Sub
2003で実行 65537:エラー 65536:OK
まぁ区切りのいい数字だわな
490 :
デフォルトの名無しさん :2011/11/05(土) 20:52:42.28
>>488 サンクス。
やっぱ予想通りエラーだな。
某板だけどなんであんなウソ書くのかなぁ。
492 :
デフォルトの名無しさん :2011/11/06(日) 00:38:27.29
本家のVisual Basicも挑戦しようと思い本を読んでると ExcelVBAでは A=A+1 と記述すべきところは Visual Basicでは A+=1 としないといけないみたいです。 でもこんなのイヤです。 Visual Basicでも従来どおり A=A+1 でも使用可能ですか?
493 :
デフォルトの名無しさん :2011/11/06(日) 00:49:34.68
さらにVisual Basicでは、標準モジュールは使わなくて、クラスモジュールを使うと書いてます(フォームモジュールもExcelVBA同様存在する)。 このクラスってなんですか? 上級向けの本ではよく出てくるので、おそらく大事だと思うんですが ひとことでいえばどんなしくみですか?
型
495 :
デフォルトの名無しさん :2011/11/06(日) 01:28:29.79
型とは、長文でいえばどんなしくみですか?
>>492 使えるけど使わない。
論理演算子のAndやOrも、意味は知らなくてもいいから
Andalso、Orelseと書き換える様に。
>>493 VBの話はスレ違いなので
VBのスレ探してそこでやってください
>>495 例えば〜 As Collectionとした場合、このCollectionに当る部分が型。
要するに〜に当る部分が何ものなのかを定義している所。
このCollectionクラスはAddと言うメソッドを持っている。
クラスモジュールで似た様なもの作るとするならば、
Collectionと言う名をクラスモジュールに付けて、Addと言うメソッドを作る。
適当だけどこんな感じ。
スレ違いには同意なので、VB.Netスレで聞いて下さい。
500 :
493 :2011/11/06(日) 01:54:08.04
さっぱりわからん
>>500 わからなくていいんです。
クラスってのはオブジェクト指向プログラミングの
中核を成すとても難しい概念。
そう簡単にわかってもらっちゃ、世の中のプログラマー
たちがメシを食えなくなりますんで。
わからなくて良くはないだろ。 その概念に出会って一月経ってわからん言ってる奴は 半年後もわからん言ってるよ。 そして1年後も3年後も5年後も同じこと言い続ける。
おっと、スレチへのレスだったか。突っ込まなきゃ良かった
VBA はいつまて VB6 ベースで行くんだろう? そろそろ VB.net か C# でも書ける様にしてくれないだろうか。
C#でオブジェクト指向らしい言語にはなったが 大切なのはそれを設計に生かすこと 設計がオブジェクト指向ならVBでも十分 てか、メンテナンスに優れていて想像しやすいものならOK
>>505 >設計がオブジェクト指向ならVBでも十分
VB って今の VBA のこと言ってるの?
「書ける」と「書き易い」の違いぐらいは理解しようね。
エンドユーザー部門が使えるレベルの マクロ・簡易言語としての側面をVBAは持つ。 本格的なクラスベースの言語になると オブジェクト指向についての詳細な知識が必要となり エンドユーザー部門がついてこれない。 おそらくずっとVB6レベルのままだろうし、そうでなくてはならない。
別の言い方をすれば 馬鹿でもオブジェクト指向らしくせざるを得ないのがC# 客はうんなこと分かってないから喜ぶわけだがw
510 :
504 :2011/11/06(日) 12:01:24.06
>>507-508 いや、別に VBA を無くせといってるわけじゃないよ。
> VB.net か C# (* でも *) 書ける様に
そもそも、C# でオブジェクト指向らしくないコードなんていくらでも書けるだろ。
ひょっとして、class ってキーワードがあったらオブジェクト指向らしいとでも思ってるの? (w
>>510 いい加減スレ違いの話を続けるのはやめてくれ
あれ? 馬鹿がばれて逆切れ?(w
C#しか知らないんだろうね ここで勉強しようよ 仲良く
ここはVBAのスレです。 そろそろ軌道修正願います。
まぁVbaにも継承こそ出来ないものの クラスはあるんだからその話をすればいいじゃない
じゃあ行番号つけた旧BASICに則ったコード書こうぜ
>>516 旧BASICってどれだよ。N-BASIC 辺りのことか?
誰得だよw
やだなあ、先輩。Hu-Basicに決まってるじゃないですか。
いや、dbBASICかもしれんよ
ここはExcel VBA質問スレだろ? ズレまくってるのを早く修正しる
じゃ質問よろしいかしら? 呼び出し元で例外処理を一括で行ってるとして、 呼び出し先でエラーが発生した時に処理していたセルを、 ログなどに記録したいとします。 記録先や記録方法は、よしなにするとして、 このセル情報を、どーやって保持・参照すれば良さげでしょう? 出来れば自前で保持などせず、例外オブジェクトあたりから引っ張れると素敵ですが、 そんな仕組みあったかしら? なお当然ですが、呼び出し先で発生する例外は自前でスローするとは限りません。
tiny BASIC でスタートレックと聞いてやってきました。
523 :
521 :2011/11/06(日) 18:08:01.49
>>521 補足
擬似コードで説明するなら、下のe.getStacktrace()に代わる情報として、
処理中のセル位置情報を引っ張れたら幸せだなーと
でも、おそらけ例外オズジェクトからは取れないので
何か工夫しないとダメな悪寒。
class Caller() {
try {
new Callee().execute();
} catch (Exception e) {
log(e.getStacktrace()); //←これ相当
}
}
フォームのボタンについて たとえば Private Sub CommandButton1_Click() textbox1.value=textbox1.value + 1 end sub これをENTERで連打するとしっかり連続計算されるけどクリック連打だとダブルクリックになるのでゆっくり連打しかできない。 ダブルクリックイベントにならないようにクリックで早く連打してクリックイベントにする事は可能ですか?
ダブルクリックもクリックと同じ処理にすればいんでね?
>>523 そんなの書ける位理解してるなら
ファクトリーパターンでも使っとけ
527 :
523 :2011/11/06(日) 18:54:22.09
>>526 生成だけハンドルすればOKならファクトリーメソッドでいんだけど、
どちらかっていうとテンプレートメソッドが近いですかね。
で、そこまではいんですけど、
今どこ処理してたの?情報は、VBAでだとどーやって引っ張ったらいいのかしらん?
という点が質問したい点なのですわ。
その情報としては実運用を考えるとセル位置とか知りたいなー
>>521 そもそもその例外はVBAのエラーであって、EXCELのエラーではないからな
それに、VBAの例外オブジェクトにスタックトレースとかなかった気もする
自分でスタックトレース相当な何か作る(当然設定も自分でする)しかないんじゃね
>>524 ダブルクリックと判定される間隔はシステムのコントロールに設定がある
つまり、アプリでどうこうしちゃいかんって事かと
とりあえずダブルクリックイベントで+2すれば?
529 :
524 :2011/11/06(日) 19:23:46.00
ダブルクリックでも同じ処理したらいい感じになりました。エンター連打と同じぐらいスムーズには動かない けど十分快適になりました。ありがとうございます。
530 :
521 :2011/11/06(日) 19:51:50.89
>>528 うーん、やはりVBAの例外オブジェクトにはスタックトレース情報はないですよね。。
VBA風擬似コードで↓こんな感じにするしかないのかしらん
public sub caller()
on error resume next
callee.execute()
if error
log(ExcelContext.getInstance().getCell());
end if
end sub
class Callee
public sub execute
dim context as ExcelContext = ExcelContext.getInstance()
foreach cell in Selection
context.setCell(cell); //忘れずに呼ぶ
do本来やりたいことWith(cell)
end foreach
end sub
end class
忘れずに呼ばなきゃならない時点で
イケてない感がはんぱない。パフォーマンスも悪そう。
どなたか良いアイデアありますか?
531 :
デフォルトの名無しさん :2011/11/06(日) 20:39:04.45
ユーザーフォーム上のボタン名をセル上から取得するにはどうすればいいですか? たとえばA1の値を参照して、A1が"あ"なら"あ"というボタンにする
532 :
521 :2011/11/06(日) 20:45:15.17
Captionにセットするだけちゃうん?
533 :
デフォルトの名無しさん :2011/11/06(日) 21:36:47.24
Interface→implementsを使われている方にお聞きします。 今implementsにて実装しています。(勉強中…) インターフェースクラス_インターフェース定義メソッド の実装をしていくわけですが、実装の中で別のインターフェース定義メソッドを 呼び出す時にも インターフェース_ の接頭語みたいなのがつくので 何か違和感があります。こんなものですか?(下のサンプル参照) インターフェース_の接頭語がつくような設計自体おかしい事ですか? ご存じな方よろしくお願いします。 例 IAnimal sub eat() :end sub sub hunt() :end sub ////// implements IAnimal CLion sub IAnimal_eat() IAnimal_hunt() ←この部分の違和感 foo() end sub sub IAnimal_hunt() hoge() end sub
>>530 Calleeのプロパティとして参照する。
getInstance?シングルトン?VBAのクラスのコンストラクタってprivateに出来たっけ?
>>533 知らないけど勉強中との事なので。
もう何年もVBAやってるけどInterface使うプロジェクトは見たこと無いです。
535 :
521 :2011/11/06(日) 23:07:20.59
>>534 あら。CalleeとかCallerとかVBAだと予約語っぽいですね。
先のコードは書きやすい命名で書いちゃいましたが、命名規約的にNGっぽいかも。
ちと勉強してきますね。レスサンクスです。
シングルトンは格納先を素直に書いたらこうかな?レベルで書いた擬似コードなので
VBAだと書けないかも。
その場合は外部からインスタンス化されたら例外投げるとかで対処する感じでしょうかね。
>533 VBAでInplementsを使って実装する時は、 たとえば533のように、Interface名_methodのように 予約語がついてしまう。 これはVBAの仕様上の問題で、ヘルプにも書いてある。 たくさんの共通する命令がある時に 命令の実装忘れがないようにできるくらいで、 VBAで活用する機会は正直あまりないと思います。 (Interfaceの多重継承も一応できますが…)
末尾再帰の最適化について質問です。 FunctionA(n As Long) If n=0 then FunctionA=1 Else FunctionA=FunctionA(n-1)+FunctionB(n-1) End if End Function FunctionB(n As Long) If n=0 then FunctionB=2 Else FunctionB=FunctionA(n-1)+FunctionB(n-1) End if End Function このように末尾で2つの関数が再帰呼び出しされている場合、どのように最適化すればよいでしょうか。 nが大きいと2の累乗でスタックに詰まれていくから重くなるのだと思います。
>>529 mouseupイベントに書けばいいのでは?
Excel2007 Listbox(1行につき3列)に抽出した結果を格納して表示することを考えてるんですけど、その結果が1件のみの時は、 フォームを出した時点で選択状態にしたいと思ってます。 んで、その選択状態にするにはどのようにするんでしょうか?
selectedindexとかない?
>>533 VBAの勉強してるなら、Interfaceの事は見なかったことにして忘れた方が良い
オブジェクト指向のクラス設計勉強してるなら、ちゃんとしたオブジェクト指向言語つかった方が良い
>>537 どっかアルゴリズムのスレ探してそこで聞いた方がいいんじゃね
>>541 フォームのInitializeで
Me.LstBox1.Selected(0) = True
ででけました。dクス
>>537 これ、初期値のA(0)=1とB(0)=2こそ違うけど、それ以降は
A(n) = B(n) = 3*(n-1)^2 で、再帰も糞もなくないですか
例に突っ込むって馬鹿なの?
例に突っ込むとかじゃなく最適化してるじゃん こういう再帰的な呼び出しに関して 一般的な最適化の手法ってのはないんじゃね?
なんかテスト臭いな。 何て言うか、自分の考えていた答えよりちょっとレベルの低い答えが 帰ってニヤってしたかったけど、根本から最適化されてしまって逆切れしたみたいな。
おまいらなんの話してんだよ。高卒の俺にはさっぱりわからんぞ
馬鹿には無理
あれ、飛び石で範囲指定したセルってリサイズ不可? A列の入力されたセルを選択して右に5セル移動して更に範囲を横20に拡大したいんだけど。 Columns("A").Select Selection.SpecialCells(xlCellTypeConstants, 23).Select Selection.Offset(0, 5).Resize(, 20).Select
>>550 やってみりゃ分かるだろ?
For Eachでも回して処理するんだな。
書き忘れたがFor Eachはセル単位じゃなくAreas単位で処理な。
553 :
550 :2011/11/08(火) 22:57:25.82
やっぱ無理か changeイベントの実行範囲に指定したかったんだけどな…
554 :
デフォルトの名無しさん :2011/11/09(水) 00:03:03.63
sheetsとworksheets、どっち使ったらいいの?
そういう質問するうちは、worksheets を使ってればいい。
>>554 そういう質問をする内はSheetsを使っておけばいい。
対象にグラフのシートを含めてみれば分かる。
557 :
デフォルトの名無しさん :2011/11/09(水) 00:46:15.15
フォームコントロールとActiveXコントロールの違いは何ですか? どう使い分けますか?
558 :
デフォルトの名無しさん :2011/11/09(水) 00:47:23.90
>>555-556 そういう回答をするうちは、ロムっていればいい。
ちゃんと解説できる日本語を身につけたら書き込みしてよい。
ワークシートと決まってればSheetsは間違い。
何か分からないときにSheetsを使う。
たとえば
>>343 の修正の
>>345 とか。
561 :
デフォルトの名無しさん :2011/11/09(水) 11:24:12.15
Activesheetだっけ、Activeworksheetだっけ、それともどっちも使えるんだっけ? こういうどっちでもokみたいな仕様はexcel作者は即刻に止めていただきたい。 いつもとまどう。特に1か月以上ぶりにVBAを使い始めたとき。
excelの作者はちゃんと理由があって似たようなものを作ってるんだと思うんだが 問題はそれをちゃんと使い分けられないVBAプログラムの作者だろ
互換性を放棄すれば大分スマートな構造になりそうな気はする。 というか、そうなったらVBA自体確実に消されるなw
564 :
デフォルトの名無しさん :2011/11/10(木) 09:16:08.07
Sub test1() Dim a as integer Dim b as integer a=10 b=Function test2(a) End sub Function test2(c as integer) as integer test2=c*2 c=30 End function ------------------------------------------------ これを実行したあとは a=30 b=20 c=30 になってますよね? もし5行目をb=Function test2(a+1)にしたら a=10 b=22 c=30 ですか? さらに5行目をb=Function test2(a*1)にしたら a=10 b=20 c=30 ですか?
565 :
デフォルトの名無しさん :2011/11/10(木) 13:10:50.31
withつこてる?
566 :
デフォルトの名無しさん :2011/11/10(木) 13:26:31.82
フォームコントロールとActiveXコントロールの違いは何? どう使い分けます?
コマンドボタンに黒の左向きの三角を設定したいんだけど、 フォント名を合わせても四角が表示されてしまいます。 どうすれば設定できますか? イメージでも良いです。 よろしくお願いします。
568 :
デフォルトの名無しさん :2011/11/10(木) 15:03:30.32
等式で大文字と小文字を区別するにはどうしたらいいの? (例) If range("A1")=""Apple" thenで、A1がappleでもAPPLEでもaPPLEでも、正と判断してしまうので困っちゃうの。
そんなあほな
>>568 Option Compare Text
があるんじゃない?
>570 おおおおおおおお!ありがとうございました
VBAから外部ソフトのボタンを押すプログラムを書きました。 いくつかあるボタンのうち、同じプログラムで押してはいるけど、 反応しないボタンがあります。 Ret = SendMessage(hwnd1, WM_LBUTTONDOWN, 0, 0) Ret = SendMessage(hwnd1, WM_LBUTTONUP, 0, 0) このプログラムでハンドルをハンドルを変えて実験すると、 きちんと反応するボタン、反応しないボタンがあるのはどう対処すればいいでしょうか? ちなみに、ハンドルはスパイソフトでみてあっているのは確認しています。 ステップ実行でボタンがへこんで戻るのも確認しました。 Cで書いてやってみるときちんと反応します。 よろしくお願いします。
PostMessageにすればいいよ
575 :
デフォルトの名無しさん :2011/11/10(木) 18:22:42.16
>>573 VBAから外部ソフトを操作するのって、どういう命令を使うの?
それ実にやりたいことだから知りたい。
>>573 出来ました。
ありがとうございました。
>>575 ここでは説明できないし、自分もググりながらやってるから
間違った説明をしてしまうと思う。
VBA winapi とかでググってくれ。
大まかなことはすぐ理解できると思う。
>>575 GUIアプリケーションって、
他のプロセスからメッセージを受け取って、その内容に応じてイベントハンドラを呼び出してるんだけど、
メッセージ送信は送信先アプリの送信先コントロールが分からないとダメで、
その識別子をウィンドウハンドルって言うよ。
SendMessageってAPIで送信出来るよ。
579 :
575 :2011/11/10(木) 20:41:27.81
さっぱりわからん
何故、メモ帳に字が書けるか。 ボタンを押すとファイルの保存先を聞いてきて保存できるか。 まずはその仕組みのイメージだけでも理解しないと575のやりたいことは出来ないよ。
ワークブックのイベントで新しいシートを追加したら、 既存のSheet1のWorksheet_Changeのコードを追加したシート にコピーする事は可能でしょうか? 自分なりにぐぐったところ下記の様な感じだと思うのですが Private Sub Workbook_NewSheet(ByVal Sh As Object) Dim VBP, Code As String With ThisWorkbook.Sheet1.VBProject.VBComponents("Sheet1").CodeModule Code = .Lines(1, .CountOfLines) End With この後はどうしたら良いのでしょうか?
>>581 InsertLines メソッド を使って書き込むんだけど
コードをコピーするんじゃなくて
ワークブックの Workbook_SheetChangeイベントで
イベント処理するってのはどうなのかな?
これなら新しいシートを追加してもイベント処理対象だし
583 :
583 :2011/11/11(金) 04:37:40.14
セル範囲をVariant変数に入れて別のセル範囲にコピーする方法についての質問です。
ただ単にコピーするだけならできたのですが、
その中の1行目と2行目を入れ替えて貼り付ける事は可能でしょうか?
ためしに以下のようなコードを書いてみましたが
「インデックスが有効範囲にありません」のエラーが出ました。
Sub test1()
Dim MyData As Variant
Dim MyTemp As Variant
MyData = ThisWorkbook.Sheets(1).Cells(1, 1).Resize(3, 5)
MyTemp = MyData(1) <-ここでエラーになる
MyData(1) = MyData(2)
MyData(2) = MyData(3)
MyData(3) = MyTemp
ThisWorkbook.Sheets(2).Cells(1, 1).Resize(3, 5) = MyData
End Sub
・・・
>>584 に続きます
584 :
583 :2011/11/11(金) 04:38:17.31
>>583 の続きです
ForNextのネストで変数内の配列要素を一個ずつ入れ替えることはできたのですが、
それではコードがゴチャゴチャしてあまりスマートでは無いように思います。
Sub test2()
Dim MyData As Variant
Dim MyTemp As Variant
Dim I As Integer
Dim J As Integer
MyData = ThisWorkbook.Sheets(1).Cells(1, 1).Resize(3, 5)
ReDim MyTemp(5)
For J = 1 To 5
MyTemp(J) = MyData(1, J)
Next J
For I = 2 To 3
For J = 1 To 5
MyData(I - 1, J) = MyData(I, J)
Next J
Next I
For J = 1 To 5
MyData(3, J) = MyTemp(J)
Next J
ThisWorkbook.Sheets(2).Cells(1, 1).Resize(3, 5) = MyData
End Sub
何かよいお知恵があったら教えてください。よろしくお願いします。
585 :
583 :2011/11/11(金) 04:41:48.59
すみません、最初に「1行目と2行目を入れ替えて」と書きましたが コード中では3行目も入れ替えてますね。 とにかく、行の入れ替えがしたいということです。 よろしくお願いします。
一行ずつ取ってきて別の行にセットする。 CopyとPasteSpecialで事足りる気もするけど。
587 :
583 :2011/11/11(金) 18:45:06.36
>>586 回答ありがとうございます。
行、列ともに少なければどんなやり方でも良いのですが、
前述のコードはあくまでもサンプルでして、
実際の業務では複数のブック間で(数百行、数十列)のセル範囲を
数千件単位でコピーする必要があって
データをコピーするときにはセルを操作するよりも
変数で処理するほうが速いのだそうで、
少しでも高速化できればと思っていた次第です。
エクセルのヘルプでも配列内の要素の操作は
ForNextのネストで行うような説明が書いてありましたし、
残念ですがあきらめます。
そんなもんマクロの記録で十分では?
行単位で扱えればいいって事でしょ? 配列を記録する配列を用意しておいて、行を記録する配列を動的に 作って行を記録。 で、コピーするときにコピーしたい順に配列を呼び出していけばいい。
>>587 普通に交換用のプロシージャ作れば?
例えば、
Sub 交換用プロシージャ(ar As Variant, r1 As Long, r2 As Long)
'2次元配列ar の r1行目と r2行目の要素交換する
とか。
なら、呼び出しで
交換用プロシージャ 1, 2
交換用プロシージャ 2, 3
で、
>>584 の交換ができる
592 :
591 :2011/11/11(金) 23:15:25.98
間違えた 交換用プロシージャ MyData, 1, 2 交換用プロシージャ MyData 2, 3 だった…
>>587 状況にもよるけど、余り複雑だったり
ループを多く組まなければならないなら、
対象のシートにSQLを投げてレコードセットをシートに展開するループだけに
するって手もあるよ。
ある一定の範囲をドーーーーンとコピーして、別シートにバーーーーンと貼り付けて、 1行目に行挿入して、3行目をこぴーして、1行目に貼り付けて、3行目を削除でよくね? screenupdateをfalseにしとけば、そんなに遅くないんじゃ値?
そうだよ ドーーーーンにバーーーーンにビシャーーーーンだよ
ビビューンバシャーンズシーン
すまん, 583氏の質問に便乗。 この時プロシジャーとファンクションでの処理が考えられるけど、 それぞれのメリデメと実際どう使い分けてる? sub swap(Mydata as variant, r1 as long, r2 as long) と定義し call swap(Mydata, r1, r2) TargetRange.value = Mydata function getSwapVal(Mydata as variant, r1 as long, r2) as variant と定義し TargetRange.value = getSwapVal(Mydata, r1, r2)
Mydataが二次元配列と仮定するなら、
FunctionだとVariantの内容がコピーされて返されないか?
>>583 最終的な並び順のインデックスを末尾の列に書き込んで、
Range.Sortメソッドでソート実行、
その上でコピペしまくるという方法もあるな。
>>597 MyDataが呼び出し先のプロシージャ内で書き換え可なら
Subプロシージャのほうがスッキリしていると思う。
書き換え不可なら、Functionプロシージャにして
プロシージャ内で戻り値用の配列を用意して使う。
どちらにしても配列は参照渡し
r1, r2 は値渡しにする
600 :
デフォルトの名無しさん :2011/11/12(土) 09:22:23.76
>>581 > ワークブックのイベントで新しいシートを追加したら、
> 既存のSheet1のWorksheet_Changeのコードを追加したシート
> にコピーする事は可能でしょうか?
>
シートの追加、じゃなくて、シートのコピー、ではダメ?
すいません、質問させてください。(XP / Excel2000,2003) Formとボタンの形状を変えたと思っています。 (構想) 1 画像でフォーム外観、ボタン外観を作成 2 透過色の指定 3 カーソル先の座標習得 4 カーソル先の色を習得 5 MouseDownかClickイベントで、透過先をクリックできないようにする。 現在3,4を同時に進めているのですが難航しています。 いざ作り出してから非常に回りくどいとも思ったのですが、良案はないでしょうか。
602 :
581 :2011/11/13(日) 09:06:54.82
>>582 さん
>>600 さん
ご返答有難うございます。
情報不足ですいません。
やりたい事としては、複数人で使用するワークブック「A」が有り、
「A」が変更された場合にワークブック「更新情報」に変更箇所を記録。
「A」を開いた時に「更新情報」が開いてない場合には、「A」のWorkbook_Openで
開く様にしてあります。
「更新情報」に変更箇所を記録まではうまく出来ているのですが、
新しいシートを追加された時、当然ながらWorksheet_Changeに何も
コードが無いもので対応出来ません。
なので Workbook_NewSheetのイベントで、既存Sheet1のWorksheet_Changeを
新規シートにコピー出来ないかな?と思い質問させていただきました。
>>601 リージョン操作系APIを使えば3, 4はWindows側がよしなにやってくれる
あとはWindowsAPI相談室で聞いとくれ
>>602 てか、元々そんな機能なかったか?
EXCELって。
>>602 コードを流し込むことはできなくなった
Workbook_NewSheetでコードなしシートが追加された場合
コード入りのシートをコピーして新規シートの内容をコピー
新規シート削除、コピーシートリネーム
>>602 共有設定じゃ実現できない事をやりたいの?
>>605 出来なくなったkwsk
セキュリティが厳しくなったって事とは別になにかあったの?
607 :
582 :2011/11/13(日) 12:36:37.68
>>602 Worksheet_Change
じゃなくて
Workbook_SheetChange
にしたらって意味で
>>582 で書いたつもりだったんだけどな
後者の方は全てのシートのセルの変更に対してイベントが出るよ
...なんか俺
>>602 のやりたい事を 勘違いしてるのかな
Sub テスト() Range("A4").Value = Range("B4").Value & Range("C4").Value & Range("D4").Value & Range("E4").Value & Range("F4").Value & Range("G4").Value End Sub 上記のソースを以下オートフィルをしたように内容をA列すべてに適用させたいのですが Sub テスト() Range("A5").Value = Range("B5").Value & Range("C5").Value & Range("D5").Value & Range("E5").Value & Range("F5").Value & Range("G5").Value End Sub Sub テスト() Range("A6").Value = Range("B6").Value ・・・ どのように記述すればよいでしょうか?。。。
A行ですね・・・
>>608 いきなりコード書くんじゃなく、
Excelでセルに数式いれる作業を、マクロの記録でスクリプト化してみたらどうだろう?
ためしてないからダメかもだけど。
>>603 VBAでそれらしい機能が見つけれなかったので、
デバイスコンテキスト辺りを調査中。
ネットで例が見つからないわけではないのですが、
VBAで取り扱ったいるものが少ないので参考になったりならなかったり。
もう少し具体的なところで行き詰った時、
こちらかAPI質問箱で質問させて頂くかもしれません。
ありがとうございました。
>>608 ThisWorkBook.Sheets(1)内で、セルA4にB4からG4までの値をいれて、
セルA4以降のA列のすべての行について、A4の内容をオートフィルするマクロ
Sub Test_AutoFill()
With ThisWorkbook.Sheets(1)
.Cells(4, 1).FormulaR1C1 = "=RC[1]&RC[2]&RC[3]&RC[4]&RC[5]&RC[6]"
.Cells(4, 1).AutoFill Destination:=Range(.Cells(4, 1), .Cells(.Rows.Count, 1)), Type:=xlFillDefault
End With
End Sub
>>612 ありがとうございます!本当に助かりました!
614 :
デフォルトの名無しさん :2011/11/13(日) 19:04:54.85
あるbookに書かれたVBAを実行すると コードから他のbookを開いて その他のbookに記録されてるVBAを実行するにはどうすればいいの?
Application.Run
616 :
614 :2011/11/13(日) 19:51:30.83
>>615 そのとき最初のVBAで使ってた変数をそのまま次のVBAでも使うにはどうすればいいの?
618 :
デフォルトの名無しさん :2011/11/13(日) 21:20:33.81
>>618 パラメータに引数で渡す
パラメータって言い方普段しないから
バロメーターが上昇中です
バカメーターが上昇中です
デバックしても、原因が表示されません。 Sub lister() Sheets(リストシート).Range("B4").Select With Selection.Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlEqual, Formula1:="3,4,5" .InputTitle = "ファイルレイアウトを選択して下さい。" .ErrorTitle = "選択エラー" .ErrorMessage = "リスト内にあるファイルレイアウトを選択して下さい" .IgnoreBlank = True End With End Sub
>>622 "原因が表示されない"とはどゆういみ?
エラーメッセージが表示されないって事?
エラー行が表示されないって事?
実行時エラー'9'は "インデックスが有効範囲にありません。"
エラー行はたぶん2行目だとおもう
Sheets(リストシート).Range("B4").Select
624 :
デフォルトの名無しさん :2011/11/15(火) 13:30:10.10
実行ボタンを押しても、どこも黄色くならずダイヤログボックスだけが出るんです。 2行目のコード、どこらへんがまずそうでしょうか。 ちなみに、同じブック内に「リストシート」というシートはあります。 それとも、標準モジュールに置いて実行すべきでしょうか。
625 :
デフォルトの名無しさん :2011/11/15(火) 13:30:56.73
最終的には、Formula1:="3,4,5"を別のシートのセル範囲に置き換える予定でもあります。
誤: Sheets(リストシート).Range("B4").Select 正: Sheets("リストシート").Range("B4").Select
>>624 >>626 いきなり他シートのセルはセレクトできないよ?
いったんそのシートをアクティブにしないとね。
そもそもセレクトする必要はないんだけど。
628 :
626 :2011/11/15(火) 13:59:31.65
おー たしかに コードだけみて脊髄反射的に答えちゃだめだな俺
Sheets("リストシート").Activeをsubの次の行に入れました。 すると今度は、438番の実行時エラーになりました。
activateにしたら、エラーはなくなりました! でも、Formula1:="3,4,5"の右側を 別のシートのセル範囲に置き換えると、実行時エラー424が出るようになってしまいました。 シート名!範囲名では、リストにするためのオブジェクトとして認識されないのでしょうか。
「抽出条件 データの入力規則で、他のワークシートまたはブックへの参照は使用しません。」との ダイアログボックスが出てきました。 Excel2003だからでしょうか。
マクロの方では、実行時エラー1004です。
解決しました。ありがとうございました。今日は、エクセルのセルの広さに救われましたね。
Sub test() Dim a As Integer Dim b As Integer a = ActiveCell.Row b = ActiveCell.Column Dim c As String c = Cells(a & "," & b).Value MsgBox c End Sub msgboxがaのとき5、bのとき2が出ます。 そのセルには「rrt」と書きました。 でもmsgboxをcにすると、msgboxに何も表示されません。 原因は何なのでしょうか。
With Selection.Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ xlBetween, Formula1:="=$S$4:$S$20" .IgnoreBlank = True .InCellDropdown = True .InputTitle = "" .ErrorTitle = "エラー" .InputMessage = "" .ErrorMessage = "エラー" .IMEMode = xlIMEModeNoControl .ShowInput = True .ShowError = True End With 入力規則の話で恐縮ですが、functionプロシージャの中のselect文に 上記のマクロを挟んだら、エラーが出てリストボックスが作れません。 再試行を促すダイアログボックスが出て、ユーザ定義関数はセルに挿入できますが 肝心の入力規則(リスト)は作られません。
>>635 Msgbox(Cells(a, b).Address と
Msgbox(Cells(a & "," & b).Address で
違いを比べてみてください。
>>636 セルに挿入したユーザ定義関数からは値を返すだけで 変更操作は出来ない
Msgbox Cells(a, b).Addressだと、セルを絶対参照したように$B$5が出ました。 Msgbox(Cells(a & "," & b).Address を少し直すと、$AZ$1が出ました。 ちなみに、Msgbox Cells(a & "," & b).Address じゃないと構文エラーになりました。
>>638 やりたいことは、値の取得だけです。
ユーザ定義関数を挿入したセルの入力規則を、その関数から操作するのは無理なのでしょうか。
c = Cells(a, b).Valueにしたところ、参照する件だけはアッサリ解決してしまいました。 でもまだ、不思議な気持ちです。
643 :
637 :2011/11/16(水) 13:05:12.67
>>641 637は最後の「終わりカッコ」が抜けてました。
>でもまだ、不思議な気持ちです
Range(アドレス指定)と混同してますね
ひとつのセルを指定する場合は、
Range("B5")のように、カッコの中を1個の文字列値で指定するものと、
Cells(5,2)のように、カッコの中を、行と列を表す2個の数値で指定するもの
(カンマは2個の数値の区切り)の違いがわかりますか?
>>642 入力規則をセルに設定することはできますが、セルに設定されている入力規則の内容を変えることができません。
>>643 いろいろ試してみます。
>ALL
今日もたくさんお教えいただき、ありがとうございました。m(_ _)m
セル入力でオリジナルのfunctionを使うときに、 たとえばA1で記入、つぎにB1で記入など、二度連続で同じfunctionを実行したことを判別したいのですが、なにかアイデア下さい。
>>645 影響のないセル(例えばAZ1)に対して、「特定のFunction」と「それ以外のすべてのマクロ」が
異なる値を書き込むようにしたら、判別できるのでは?
初期値は 0 にしておく(ブックオープンのイベントで書き込み)
特定のFunction は 1 を書き込む(書き込む前にAZ1の値を調べ、1なら二度目ってわかる)
※3度目以上でも1のままですが・・・
それ以外のすべてのマクロ は 0 を書き込む
>>645 グローバル変数に走った回数を入れればいいんじゃないの?
聞いてる意味違う?
648 :
601 :2011/11/16(水) 21:09:47.38
先日質問に来た者です。 リージョン操作というアドバイスを頂きながら、躓いてしまいました。 API系質問スレは覗いたのですが… Google同様VBA系の質問がなさそうだったので、こちらの諸先輩方の方が良いかと思いました。 質問は2つです。よろしくお願いします。 1 リージョンでメニューバーを消したときのフォームの移動について。 「SendMessage hWnd, WM_SYSCOMMAND, SC_MOVE, 0」 というのを発見しましたが、動作させれませんでした。 フォームクリック時に「メニューバーを操作している」情報を送るというものだと思うのですが。 2 多角形リージョンについて 練習で長方形や楕円形のリージョンは作成できました。 しかし、三角系の頂点指定だけはできませんでした。 設定に失敗してもエラーが出ず、「角に黒い影が出る」or「全部消える」という挙動をしています。 Private Sub UserForm_Activate() ’座標指定 Dim p(100) As Point ’??? '??? 'リージョンの作成 Dim hRgn As Long hRgn = CreatePolyPolygonRgn(p(0), 3, 1, WINDING) 'CreatePolygonRgnはエラーから抜けれなかった 'ハンドルの習得 Dim rc As Long, hWnd As Long hWnd = FindWindowA("ThunderDFrame", Me.Caption) 'リージョン適用 rc = SetWindowRgn(hWnd, hRgn, True) End Sub
PostMessageでよくない?
>>644 副作用を伴うユーザー定義関数が実行できたとしても偶然と考えておいた方が無難だよ
http://support.microsoft.com/kb/170787/ja ワークシートのセル内の数式から呼び出されるユーザー定義関数では、Microsoft Excel の環境を変更できません。つ
まり、このような関数では次の処理が実行できません。
スプレッドシートでのセルの挿入、削除、または書式の設定。
• 別のセルの値の変更。
• ブックでのシートの移動、名前の変更、削除、または追加。
• 計算方法や画面表示など、環境オプションの変更。
• ブックへの名前の追加。
• プロパティの設定およびほとんどのメソッドの実行。
>>648 この話題は スレチだとおもうが
>>2 ★3,★4 参照
ググれば サンプルあるぞ
(VBのサンプルでも参考なる)
そもそも そのコードだと多角形の頂点座標をどこで指定してるんだい
>>646 ありがとうございます。
セルへのアクセスを減らすために実施しようと思ってますので、
少し違いますが、参考にします。
>>647 やはりそれですか。
関数がたくさんあって、
初期化を他の関数に追記するのがどうにもめんどうで。
たとえば、20個関数があったら、残りの19個はfalseにしたり0にしたりがどうも…
>651 長方形などは分かりやすかったのでVBのサンプルで解決できました。 ↑で記入したコードも成功例のどれかからコピーして使っています。 しかし、PolyPolygonRgn/PolygonRgnは動かせなかったので、一つ具体例がほしいのが現状です。 設定に関しては、Declare等々と一緒で行数的に入らなかったのと、 試してみたどの設定を代表として書けばいいのか悩みました。 スレ違い申し訳ありませんでした。 API質問箱が若干荒れ気味なのと、 VBAの例の少なさ=回答の少なさになるかと迷っていたのですが、 あちらで改めて質問してきたいと思います。
655 :
デフォルトの名無しさん :2011/11/17(木) 00:12:42.47
>>652 ああ、連続でよばれたかどうかね。
関数に対応する連番を列挙体にでも用意しておいて、
1度目にグローバル変数かモジュール変数にしまった関数に対応する連番と
2度目に呼んだ時の関数に対応する連番と比較して同じなら連続でよばれたと判断できるよ。
何連続で呼ばれたかとか、連続で呼ばれたのは何回かと言うのが欲しいなら、
その関数に対応した連番をキーにコレクションやディクショナリに
回数を設定してため込んでやればそんなに面倒臭い事にはならないんじゃないかな。
>>654 えーっと…コピーしたマクロが正常に起動しました。
文章の送信前に最後の確認をしたら、
フォームが消えるパターンから変化しました。
「Me.Move」が原因だったようです。
(後出し情報になりますが)
座標の設定方法は同じだと思います。
違う点は頂点の数を、定数で設定しているところでしたが、数字に変えてもちゃんと動きました…。
ユーザー定義名も異なってましたが、「Declare」と設定を合わせたら動くことを確認できました…。
「CreatePolygonRgn」で動いた理由もよくわかりませんが、後程「CreatePolyPolygonRgn」も試してみます。
何というか本当にご迷惑をおかけしました。
自分がAPIに手を出すのは早すぎるようです。
ありがとうございました。
(追伸)
「PostMessage」を教えてくれた方にも感謝。
多分自分の独力ではこれ以上無理そうです。
別の方法で力技回避を試みます。
>>656 つか
VBAのユーザフォームでホントにそれが必要なのか再検討したほうがよくね
APIの勉強とか個人的趣味ならいいけど
業務に適用するんだったら後々メンテする人が苦労するだけかと
>>657 に同意。
言語変えるなりVSTOなりにしたほうが…
659 :
デフォルトの名無しさん :2011/11/17(木) 13:36:19.78
VSTOとは? Very Simple Technichal Option?
>>657 耳が痛いお話です。
一応、個人の趣味勉強。
ただ、業務へのフィードバックもやっていくつもりなので線引きは薄いです。
職場でVBA弄れる人間は私しかおらず、
私自身汚いソースをあまり見せたくありません。
>別言語
職場でも勉強できる(勝手にソフトを入れれない)、
エクセルが入ってないPCはほとんどない、
偶々サンプルとなるものがあったから。
(将来的には)C++、Javaも勉強したいです。
>>660 じゃあ仕方ないか
.NetはFrameWorkだけでビルド出来るけど初心者向けではないししね
>>660 IT系以外の職場だとそんな所多いと思う
だからこそ
業務へは あまりウケ狙い的な事をしないで
"シンプル・イズ・ベスト"
VBAだけだと、かゆい所に手が届かないんだよなあ アプリを作るための言語じゃないから まあ.Netもコントロールの出来が悪いから、できそうでできないこと多いけどね 使いやすいUIとか作ろうとすると、結局めちゃくちゃ手間がかかる
664 :
デフォルトの名無しさん :2011/11/17(木) 17:53:58.68
>>662 「ザ」がぬけてる。
"シンプル・イズ・ザ・ベスト"
英語系やってるとこういうフレーズにさえ著しい違和感を感じるようになる職業病。
665 :
662 :2011/11/17(木) 18:25:39.46
へっ(汗;;;;)そうなんだ「ザ」抜きで憶えてた 学生時代英語は赤点だったからなーーー ありがと
666 :
デフォルトの名無しさん :2011/11/17(木) 18:48:03.64
>>664 この場合、theは無くてもいいんじゃないかな。
667 :
デフォルトの名無しさん :2011/11/17(木) 19:33:10.94
ExcelでBlackOnyxのような3D迷路を作っているのですが 3D表示で直角三角形はどう表現したらいいですか? ■はInteriorに色をつけてやろうとしてるんですが 斜めの部分が再現できず困ってます。
668 :
デフォルトの名無しさん :2011/11/17(木) 19:39:02.79
「最初からそう教えてくれりゃええのにぃ」シリーズの本(と言っても2冊しかないけど)では 下記のことはマスター(単に記述だけでなく手取り足取り教えてくれてるか)できますか? ・変数の値渡し・参照渡し ・変数のスコープ ・プロシージャのサブルーチン(Public, Privateについての詳細など) ・モジュールを分ける理由、たくさん作る利点 ・見やすいプログラミングのコツ
本屋で立ち読みして自分で判断ぐらいしやがれ、このクソボケ
670 :
デフォルトの名無しさん :2011/11/17(木) 20:47:42.40
なんで俺がハゲだってわかった、このストーカー
>>667 無理しないでパターンで持てばいいじゃない。
むしろ色付けは条件付き書式でやった方が楽。
673 :
667 :2011/11/17(木) 22:34:26.44
674 :
デフォルトの名無しさん :2011/11/17(木) 22:41:35.45
675 :
660 :2011/11/17(木) 23:32:12.28
ROMに戻る前に一応ご報告。
「CreatePolyPolygonRgn」も動かせるようになりました。
問題点は、座標項目が途中からずれており、リージョンが線になっていた、というものです。
>ウケ狙い
あるマクロが一部で認められてしまい、
上に報告するか、という話が持ち上がっております。
そこで趣味で調べていたAPIを組み込もうとしたのが始まりです。
>>667 作りかけのテトリスが終わったら、
大迷路を作り、それを改造してWIZを作ろうとしてる人間がここに…。
斜めをは私も悩んでました。頑張ってください。
>>673 先にいくつかの壁の絵の部品のパターンを持っておいて、
周りの壁の状況に合わせてそれを組み合わせて表示する様にしておけばいいんじゃないかと
言うつもりでレスしたんだけど、
BlackOnixと全く同じにするのはかなり厳しいと思うよ。
何と言ってもシェイプがセルよりプライオリティ高いからね。
背景にBlackOnixと同じ線が入った絵を用意してやるか、全てシェイプで描くか・・・。
677 :
デフォルトの名無しさん :2011/11/18(金) 09:10:10.24
678 :
デフォルトの名無しさん :2011/11/18(金) 09:35:49.55
テキストボックスを操るときなど ActiveSheet.Shapes("txtbox").Characters.Text = "うんこ" とするとエラーが出るんですよ。 でも、Selectを使って2行に分けて次のようにすると成功します。 これはなぜですか? ActiveSheet.Shapes("txtbox").Characters.Select Selection.Text = "うんこ"
679 :
668 :2011/11/18(金) 11:58:23.91
>>669 近くの複数の本屋に行っても置いてないから聞いておるのだ
「最初からそう教えてくれりゃええのにぃ」シリーズの本(と言っても2冊しかないけど)では
下記のことはマスター(単に記述だけでなく手取り足取り教えてくれてるか)できますか?
・変数の値渡し・参照渡し
・変数のスコープ
・プロシージャのサブルーチン(Public, Privateについての詳細など)
・モジュールを分ける理由、たくさん作る利点
・見やすいプログラミングのコツ
681 :
デフォルトの名無しさん :2011/11/18(金) 13:32:32.83
イベントトリブンというけど 例えばボタンを5つつくって、それぞれにマクロを関連づけされてたら 順番にボタンを押すと同時に5つのブロシージャが実行されることになるの?
なんで同時? 普通に「順番」に実行されるだけだと思うが。 そもそも、イベントドリブンと関係ないし。
マルチスレッドじゃないと同時は無理だし。
684 :
デフォルトの名無しさん :2011/11/18(金) 14:19:51.52
コントロールで、 ・フォームコントロール ・ActiveXコントロール はどう使い分けますか?
ActiveXコントロールはなるべく使わない どうしてもってときだけ
ActiveXコントロールは セキュリティ上嫌がる人も多いからね
687 :
デフォルトの名無しさん :2011/11/18(金) 15:03:39.70
フォームは内蔵activexは外付けって感じ
689 :
デフォルトの名無しさん :2011/11/18(金) 15:30:44.67
ActivewindowとActiveworkbookの違いは何ですか?
690 :
デフォルトの名無しさん :2011/11/18(金) 15:48:59.00
変数じゃなくて、実行中かわらない値を設定するには Const を使うと思うんですが 別に普通の変数を使って、それに値を使ってもいいんですよね? Constを使う利点は何ですか? また、普通の変数を定数で使おうとしたらどこで値を代入すればいいんでしょう? 標準モジュール内のプロシージャすべてで使いたいので 標準モジュール内の一番上でa=3.14みたいに書いたらエラーが出たよ。
>>690 Constで定義するのは「定数」
変数を定数のように使ってもいいけど、いちいち使い分けるのは、間違いや事故を防ぐ、わかりやすくする、など
ちゃんと理由がある
よくわからない場合は先生や先輩の言うことは素直に聞いとけ
693 :
デフォルトの名無しさん :2011/11/18(金) 16:21:55.27
先生の言うことを聞かないとどうなりますか?
>>693 場合によっては血祭りの生贄になります。
前にNUM_ZERO=0って定数見たことあるぜ
696 :
デフォルトの名無しさん :2011/11/18(金) 19:07:52.22
よくあることですが文字列変数に " を代入するにはどうしたらいいですか?
コード中に数字埋めちゃいかんと言うコーディング規則で、 0すら許してくれないとそうなる
698 :
デフォルトの名無しさん :2011/11/18(金) 19:40:48.75
>>697 三角形の面積を求めるとき
s=(l*h)/2
だけど、この2はどんな定数名にするの?
699 :
デフォルトの名無しさん :2011/11/18(金) 19:43:18.48
>>697 2字方程式の解を求めるときも
x=(-b+-sqar(b^2-4*a*c))/2*a
だけど、この分子の2とか4とか分母の2はどんな定数名にするの?
>>696 >よくあることですが文字列変数に " を代入するにはどうしたらいいですか?
Dim S As String
S = """" ' Chr(&h22) とか Chr(34) とかでもいいけど。
>>698-699 NUM_TWO とか NUM_FOUR だと思うが、そもそも
>>697 はそういう規則が
可笑しいと思っていると思うが。
702 :
デフォルトの名無しさん :2011/11/18(金) 20:20:03.09
助けてくれますか。 横に10個並んだセルの文字列をくっつけて、それをアクティブセルにコピーしたいんです。 でも ActiveCell = Range(Cells(1, 1), Cells(1, 10)) だとセルになにも表示されません。 なにが原因ですか?そしてどうすれば正しく表示されますか?
xllとdllでほぼ同じプログラムをかいて、 vbaで実行してみたんですが、xllの方が十倍遅いです。 配布的にxllのほうが好ましいのですが、 こんなもんなんでしょうか?原因がわかりません。 エクセルは2003、dllはvc++6.0、 xllはxlwでvc++2008で書き、runで呼びだしています。
>>702 簡単でいいならこんなので。
Sub test()
Dim 文字列 As String
Dim i As Byte
For i = 1 To 10
文字列 = 文字列 + CStr(Cells(1, i).Value)
Next i
ActiveCell.Value = 文字列
End Sub
>>702 ActiveCell = Cells(1, 1) & Cells(1, 2) & Cells(1, 3) & Cells(1, 4) & Cells(1, 5) & Cells(1, 6) & Cells(1, 7) & Cells(1, 8) & Cells(1, 9) & Cells(1, 10)
706 :
デフォルトの名無しさん :2011/11/18(金) 21:07:47.62
コード書くとき、 わざと数式で全部書いてないのに、別の行にうつるとエラーが出るのがうざいんですけど。 例えば、 if cells(x,y)= と途中まで書いて、右辺の変数名を忘れたから確認するためにコードの上のほうをスクロールして見にいきたいことって多いと思うんです。 ところがスクロールしてどこかをクリックして瞬間に、エラーで怒られます。 これを防ぐにはどうしたらいい?
>>706 オプションの"自動構文チェック"をオフにする
708 :
デフォルトの名無しさん :2011/11/18(金) 21:15:30.07
一般にプログラミングしてる人って、 セルの座標をxとyで使うときって (1) cells(x,y) (2) cells(y,x) の、どちらがより普及してる書き方?
709 :
デフォルトの名無しさん :2011/11/18(金) 21:32:36.84
数字を文字列にするとき ひとけたの数字(0〜9)は無理やりふたけたにするために0を頭につけたい(00〜09)のですが Right("0" & Str(c), 2) ではダメでした。 0じゃなくて空白があいてしまいました。 原因と対策はどうすればよいですか?
cstr
>>708 あえて選ぶなら Cells(y, x) だけど、普段は cells(r, c) にしてる
セル位置は座標とは厳密には違うから、変数名にx、yは使わない
Cells(i,j)でしょ、普通 んで、k,l,m,n,,,,,
>>713 Fortran 世代かよ。
普通に
>>711 に一票
(って言うか、一文字変数は使わないから Row, Column だが。)
オレもijだけどなんかまずいの?
>>714 プロパティと同じ変数名使うのか?
変わってるな
>>715 まずくはないと思う
ただ変数名はある程度 意味ある名前にした方が
分かりやすい
んでこの流れで聞くけど
みんなは変数名とかのネーミングはどうしてる?
(ネーミングルール的な事)
漢字は使っていいのだろうかとか
スコープ(適用範囲)を意識した名前の方がいいんだろうかとかとか
いつも悩む・・・んで結局テキトーになってしまう
(まー今は個人的にしか使わんから なんとかなってるけど)
x軸は横方向。y軸は縦方向を表す表記だろうからy、xの順番が順当でしょう。 ただ、Cellに関しては単位が行(Row)と列(Column)なので、確かにr、cにする方がより良いですね。 でも1文字の変数名はスコープが小さくて一見して何に使ってるか分かる場合だけにしておいた方が良いでしょう。 変数名は分かり易い英語で、頭文字を小文字にして付けておくと、後々幸せになれますよ。多分。
719 :
714 :2011/11/18(金) 22:35:34.87
>>715 いや、別にまずくはないよ。
>>716 ん? なんかまずいのか?
プロパティと同じものがだめなら Width, Height, Value, Offset とかもだめだし、
そもそも VBA のプロパティなんて全部覚えてられない。
>>717 個人的には漢字は使わないけど、手直しを頼まれたときに漢字を使ってるソースに手を
入れたことがある。下手な英語より確かにわかりやすい。
最初の数文字をアルファベットにしておけば、インテリセンスで入力も思ったより簡単だし。
そうなんだよねー、 Excelはモジュール単位でVssやSvnが使えないから 修正した場所はコメントにして残しておくことが多いんだよねー。 見辛くてしょうがない。
721 :
デフォルトの名無しさん :2011/11/18(金) 22:44:47.52
「数値が文字列として保存されてます」の注意書きのセルがたくさんあるのですが これらをVBAですべて数値に変えるにはどうしたらいいですか? (それらのセルはSelectで囲っています)
722 :
デフォルトの名無しさん :2011/11/18(金) 22:51:17.98
一瞬、rとcがすごいと思ったけど aやbやcのアルファベットの最初のほうは Dim a as integerでFor〜Next文で多用するから cをFor Nextで使ってることを忘れて、さらに使ってしまう(あるいはその逆もあり)心配があるから や〜めた。 やっぱりxとyにして、Cells(y,x)を使うことにした。 ところで変数の日本語はダメでしょ。 (1)予約語を使う心配がないのと、(2)日本人には見やすいのはわかるけど 国際的なプログラミングをしてる職場はとくに。(いまは経験なくても将来的に使うようになる可能性が高い) かわりに(1)(2)を満たすために 例えばintegerだったら、inTensuu、inTokutenn、stringだったらstName、stAddressのようにすれば解決。
>>720 エクスポートして svn に突っ込んでるよ。
>>722 一文字変数って TinyBasic 世代かよ。
と突っ込もうと思ったが、VBA で国際的なプログラミングって....
724 :
717 :2011/11/18(金) 23:11:15.72
>>719 >>722 いろんなサンプルコードみても
日本語変数使った物って お目にかからないんだよな
だから使わない方が良いのかなって思ってたりする
でもスゲー分かり易かったりするんでどうなのかなって質問してみた
>>722 ちなみに
PUBLICな変数とか モジュールレベルな変数
だとどうしてる?
725 :
デフォルトの名無しさん :2011/11/18(金) 23:11:27.18
昔読んだ初心者向けのVBAの本に 予約語と同じ変数名は紛らわしいからダメって書いてあった 個人的にはOffsetのように先頭が母音で始まるもの以外は 子音のみの表記を変数として使ってる たとえばRow→Rw,Column→Clm,Folder→Fldrなど、 先頭が母音の場合は先頭だけは抜かない。 Offset→Offstとかそんな感じ。
今時ハンガリアン記法もなぁ
>>725 >予約語と同じ変数名は紛らわしいからダメって書いてあった
紛らわしい以前にたいていエラーになるだろ。
あと、プロパティ名は予約語と違うぞ。
>>722 Forの制御変数を1文字で済ます場合はi、j、k〜を使うのが昔からの慣習
それに従えばcは空く
>>722 国際的なプログラムって言うなら接頭語にinとかstとか付けるのやめようよ。
730 :
デフォルトの名無しさん :2011/11/18(金) 23:31:43.44
オートフィルタが隠れてる行があるんですが それらはカウントしないように、いま表示されてる行の数だけを変えるVBA文はどう書いたらいいですか? a = Selection.Rows.Count とすると、隠れて見えない行まで数えてやがります。
731 :
デフォルトの名無しさん :2011/11/18(金) 23:44:35.74
数えるときに使うプロパティのAreaってどういうときに使うのですか? このAreaの概念がさっぱりわからん。
732 :
730 :2011/11/18(金) 23:53:56.01
奥さん、聞いてくださいよ!! できたよ! a = Selection.Resize(, 1).SpecialCells(xlCellTypeVisible).Count ああ、なんと頭がいいのだろう。
>>708 座標を使う時は(y,x)、二つ目以降は(yn,xn)かな。
Forを使う時は大抵i,j,k…で、入れ子するときはii,iii…と重ねる。
それ以外の変数は、漢字も使う方がわかりやすい。
下手なネーミングするとプロパティやメソッドと被ってエラー吐くしね。
734 :
デフォルトの名無しさん :2011/11/19(土) 00:09:59.63
>>730 a = Range(範囲).SpecialCells(xlCellTypeVisible).Cells.Count
>>734 範囲は1列の前提で書いてるのかも知らんが、SpecialCellsはセルの集合体だからCellsは要らんよ。
そもそも答えは
>>732 で出てるだろ?
>>731 Areasのことか?
連続領域の数だよ。
A1:A2とA6とA8:A10に何か入力されてて他が空白の時
Range("A:A").SpecialCells(xlCellTypeConstants).Countは3になる。
736 :
デフォルトの名無しさん :2011/11/19(土) 09:05:20.69
変数名は ハンガリアン+日本語 でつけてる。
先頭がハンガリアンだからIDEによる補完もそこそこ使えるし、ローマ字アルファベットよりは意味が通じる
「右クリックから一括エクスポート」のマクロを作ってアドイン化してるからTortoiseSVNで差分比較とかもできる。
ネタ元はこれね
Excelプロフェッショナルエンジニアテクニック
ttp://www.amazon.co.jp/dp/4904412028
その程度ならわざわざ本買わなくても ネット上に情報が転がってるけどね
ちなみにうちで飼ってるハムスターは
あれ、途中で送信された。 ちなみにうちで飼ってるハムスターは、ジャンガリアンと言うんだよ
残念。ゴールデンだ。
>>735 はAreasが抜けてたわ。
Range("A:A").SpecialCells(xlCellTypeConstants).Areas.Countは3になる。
だな。
Areasも連続領域の数じゃなくて連続領域な。
>>729 > 国際的なプログラムって言うなら接頭語にinとかstとか付けるのやめようよ。
そこに突っ込むなら、Tensuu、Tokutenn に突っ込めよ。
>>733 > 入れ子するときはii,iii…と重ねる。
Typo しても気づかないから最悪。
> 下手なネーミングするとプロパティやメソッドと被ってエラー吐くしね。
はあ? どこの VBA をお使いなのかな。 (w
743 :
デフォルトの名無しさん :2011/11/19(土) 15:35:46.17
変数は 「鬱」や「欝」みたいな難解な漢字を使うと東洋っぽくてカッコいい。 For 鬱=1 to 9 For 欝 to 9 Cells(欝,鬱)=欝*鬱 Next 欝 Next 鬱
どのスレにも負けず嫌いな奴っているな。
俺は変数に日本語は絶対に使わない。 日本語入力と英語入力の切り替えが鬱陶し過ぎる。
エンドユーザー部門で作り受け継いでいくことの多いVBAでは 漢字変数は極めて有効。 担当者の開発スキルが低く、開発時間もあまり取れないわけだから プログラムの早期理解のため視認性が最も大事。 Dim 元データシート as Worksheet Dim 編集シート as Worksheet ExcelVBAで初心者がつまづく箇所の一つであるシートの使い分けは 上記のように漢字でワークシートオブジェクト変数を定義し それぞれに実際のワークシートオブジェクトを代入して使うことにより プログラムの中で今どの機能担当のシートを扱っているのか 非常によく見えるようになる。
という英語が出来ない奴の偏見
こんなところで英語自慢ですか... (w
こんなところで英語出来ない事を公言ですか... (w
英語が出来るのが自慢になるという発想が理解に苦しむ
英語自慢と書いたら、英語できないと読み取る方が理解できないよ。
義務教育で教わる範疇のことを 自慢とか居直られえてもな・・・
なんか壷突いちゃったみたいだな (w
ゴメン、俺、義務教育修了してない 中学時代に家飛び出して、住み込みで働き始めて そこも出て会社勤めで自活し始めて 起業して軌道に乗って余裕が出来てから英語の勉強始めた だから25くらいまで中学レベルの英語さえ全然できなかった
>>754 起業したんなら一生懸命になる所が違うだろうよ。
経営破たんするぞ。
できるやつは学校なんかいかなくても成功するし 大学出てもダメなやつはニートになる
はいはい。 成功したならExcelなんて人雇ってやらせればいい。 なんで余裕のある経営者が自らExcelの変数名なんか語りにこのスレに来ちゃうかな。
758 :
デフォルトの名無しさん :2011/11/19(土) 22:05:11.29
CPU占有回避に以下のような対応してますが、 質問があります。 Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) ... Do ... 処理 DoEvents Call Sleep(1) Loop この場合でのDoEventsは意味をなしているでしょうか? あとのSleepで結局同じくCPU開放してると思うので DoEvents無しでもおなじかなっと思ったんですけど いかがでしょう?
759 :
デフォルトの名無しさん :2011/11/19(土) 23:11:45.26
DoEventで他のイベントの発生を許してるんじゃなかったっけ?
DoEvents マクロが占有している制御をOSに開放する だからといってCPUの使用率は下がらない Sleep関数は、指定した時間だけ処理を停止させる関数 ってことらしい (よく判ってないですがw
なんでWin32APIを使ってプログラミングしたことないやつがVBAやってんだ 足し算習わずに割り算やるようなもんだぞ
762 :
デフォルトの名無しさん :2011/11/20(日) 11:44:34.64
Win32APIを使ってプログラミングってどうやるんだ? なにかプログラミング環境をインストールしなきゃならなくないのか?
ブラウザでWebサイト見るのに、HTMLの構造は知らなくても問題無いだろ。
同じようにVBA使うのにWin32APIの知識は必須じゃない。
まあ、OLE Automation周りの知識があれば、
何故文字列はByRef推奨なのかとか理解できるようにはなるけど。
>>762 OS自体には開発環境以前にコンパイラすら付属していないので、
まずMSのサイトからVisualC++2010Expressをインストールするところから。
>>761 VBAはエンドユーザー向けの機能なんだから別にいいじゃん。
最初はExcel操作の自動化をするためのマクロ言語として使い始め、
徐々にステップアップしてやりたいことが増えてくれば
APIに手を出すようにもなる。自然な流れだよ。
>>761 は、「Win32API 使える俺は偉いんだぞ」のアピールだろ。
スルーでいいよ。
むしろ知ってる奴だって完全に知ってる訳じゃない。 APIの本はやたら高くて完全に網羅されている本なんか見たこともない。 逆に「APIも知らないの?」と言う奴がいたらそいつはちょっとかじったことがあるだけの知ったかぶりと思って ほぼ間違いない。
>>761 みたいなのがいるから
VBAが厨房御用達言語みたいな風潮になるんだよな
Win32API程度で得意満面も
>>761 の痴態を見物に来ましたw
redim って何でこんなに使い勝手悪いんだw
>>769 初めて聞いた意見だ。
お前が馬鹿なだけだと思うが、
なにが使い勝手悪いんだ?
言ってごらん。ん?ん?
自分でarraylistクラス作ってからは問題ない
>>770 >>769 じゃないけど、
・サイズ = 0 を指定できない。
・次元を取得できない。
のがちょっと不便と思ったことはある。
Redim Preserve は不便と思った
PreserveじゃないReDimに活躍の場なぞ無いと思うが
なんで? 何らかの演算/外部入力で、データ量が決まるケースなら、普通に ReDim( ) で必要サイズを 指定して処理するけど。
preserveを2次元以上で使うとダメだったよね?
VBAだと、Dim宣言時の配列の要素数は定数が必須だから、 変数の値で指定したい時は、Dim直後に即ReDimとかやるなあ。
C言語の配列はサイズを変えられない
>>778 VBAもC言語も静的配列は要素数を変更できないし、
動的配列は変更できる
要はメモリの使い方
reallocは?
Excel VBA の書籍、サイトに関する質問です。 私は今、Excel2007で簡単なデータ分析をおこなっています。その分析をより快適なものにするため、VBAの学習を始めました。学習を進める上で、本を3冊程度購入しています。2冊は入門書で、1冊は 田中亨『Excel VBA 逆引き辞典パーフェクト 2010/2007/2003対応』株式会社翔泳社 という書籍です。 最後の書籍は、メソッドやプロパティがまとめられている辞書のような書籍が欲しい、と思って購入したのですが、あまり満足できておりません。 なぜなら、(1)自分にはあまり関係しない項目の記述が多いから (2)かといって、内容が網羅的であるわけでもないから などの理由があげられます。 そこで、皆さんの意見を参考に新しい書籍を購入、サイトをブックマークしようと考えております。データ分析に関する「メソッドやプロパティがまとめられている辞書のような」まとめが欲しいです。
横着すぎだ
手段が目的になっている
>>781 完璧にまとまってる書籍は見たことない
msdnがあれば十分
785 :
デフォルトの名無しさん :2011/11/21(月) 15:45:14.04
>>777 なぜ最初から
Dim a(変数) as integer
にしないの?
786 :
デフォルトの名無しさん :2011/11/21(月) 15:47:17.14
VBAの入門書「「最初からそう教えてくれりゃええやん、ンもぅ」の2冊では SubプロシージャやFunction関数の、PrivateやPublicを駆使した使い方までマスターできますか?
ここで「はい」と答え、
>>786 がamazonで注文し、結果786がマスター出来なかったとしても
だれも責任の取りようもない
そんなことも分からない池沼の
>>786
788 :
デフォルトの名無しさん :2011/11/21(月) 18:55:28.32
だから、立ち読みで自分のレベルと本のレベルとでバランスを調整しろよ
>>785 おまえ馬鹿?
サイズが不定の時は動的配列でRedimするしかねーだろ?
Dim a(変数) As Integerだと「定数式が必要です。」って怒られるぞ。
動的配列って必要な分だけ増やしてんの? それとも移し替え?
VBAの書籍って買ったことないけどGoogle以上の情報って載ってるのか?
情報量で?勝てると思う??
俺の場合業務用のアプリケーション作る必要性から 知りたいことだけググりながらつまみ食い的に学んでいった だから正規ルート?で勉強した人が当然知ってるような 基本的なことが分かってなかったりする 基礎から体系的に学べるVBAの本があれば知りたいんだけど
オレハグーグルデスベテカイケツデキルンダエラインダ はいはい、分かりました。 次の方どうぞ〜
VBAのヘルプファイルで十分。 それ以上やっても他の言語との格差でウンザリするだけ。
コンボボックスAとコンボボックスBで選択した条件にあったデータを 表示するって作成可能でしょうか?
可能だから頑張りな。
798 :
796 :2011/11/21(月) 23:02:19.76
>>797 了解。
VBAでオートフィルタ使えばなんとかなりそうです。
799 :
デフォルトの名無しさん :2011/11/21(月) 23:36:52.10
800 :
796 :2011/11/22(火) 00:03:57.46
なんとかオートフィルターで条件に合うものをワークシート上に 抽出するようにできました。 必ず、抽出されるデータは一件なのですが、その抽出したデータを フォーム条のラベルに表示したいと思ってます。 Label8.Caption = Range(" ").Value オートフィルターで抽出したデータの行を取得する方法を探しております。 じゃないと、RANGEのところにセル番地をいれることができず。
>>793 古本屋に行ってSoftBankの「ExcelVba サンプルコレクション」を探すんだ。
以前現場でVBAやりたての頃、出来る人に「この本は今は全く分からなくても、いつか必ず役に立つから
買っとけ」と言われて買っておいた。
その後年月が過ぎて、色々な本を買って勉強したけど、結局最後に手元に残ったのはこの1冊だけ。
これ以上の知識が必要ならむしろVB6のいい本を探した方がいい。
803 :
796 :2011/11/22(火) 01:27:55.00
ここまでなんとか考えましたが、ラベルにオートフィルで表示したデータが表示されません。 c.rowにて行番号を取得しています。 メッセージボックスにはD2とかD3とかが表示されます。で、そこにはいってるデータをラベルに表示したいと思ってます。 For Each c In .AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible) If c.Row <> 1 Then number = "D" & c.Row MsgBox number Label8.Caption = Range(number).Value End If Next c
804 :
デフォルトの名無しさん :2011/11/22(火) 10:19:04.04
VBAの入門書「最初からそう教えろやゴルァ、殺すぞ!」の2冊は どこまでVBAを使いこなせるようになるでしょうか?
805 :
74 :2011/11/22(火) 11:51:20.21
その本に書いてある範囲の事は 出来るようになると思います()
>>804 本屋行くのめんどいなら
amazonで立ち見したら?
>>803 Label8.Caption = Range(number).Value
のところ、
Label8.Caption = Cells(c.Row ,4).Value
にしてみたら?
Label8.Captionは表示されてても見えないだけだろ? SleepとかDo Eventsをかませないとな。 ちなみに行番号やアドレスを使ってセルへの参照を得る書き方はほとんど素人向けの書き方だ。 c.Offset(,3).Valueでいいはずだ。
>素人向けの書き方 ぷっ 本人にとって分かりやすければそれが「素人向け」だろうとなんだろうと良いだろう 何偉そうに書いてんだか
>>808 見づらいなぁ。
いつもそんな書き方してるの?
ひょっとして省略出来るところは何でも省略しちゃう派?
ファイルサーバに保存されたブックを自分以外の誰かが今現在開いてるか調べるは どうすればいいんでしょうか
少しは自分で考えろよ
813 :
デフォルトの名無しさん :2011/11/23(水) 10:25:25.94
814 :
813 :2011/11/23(水) 10:27:42.50
815 :
デフォルトの名無しさん :2011/11/23(水) 11:37:24.19
>>806 俺も買おうか迷ってたが、買うことに決めたぜ。
カエルがかわいすぎる。
このカエルと一緒なら俺でも理解できそうだぜ!
最初から厨は業者の工作員 これ豆な
817 :
デフォルトの名無しさん :2011/11/23(水) 12:12:42.95
>>801 SoftBankのってどれ?
Amazonでは2つ出てきたけどどちらでもなさそうだけど。
>>813 ありがとう
ブックの共有機能って使ったことないなあ
下のやり方はトリッキーだけどシンプルでいいですね
こっちでやってみます
>>817 その2つだよ。
正式書名は「ExcelVBA実用サンプルコレクション」
青いやつが元で、緑のは新装版。
VBAの使い方や文法などごく基礎的なことはわかるけど
実践では具体的にどういうコードを書けばいいのか
テーマごとに調べたい人に向く。
EXCEL VBA でプログラミングに目覚めた30代が次に手を伸ばす言語は何がお勧めですか? スキルを上げていつかはIT方面に転職できればなあと考えてます。
VBAだけを極めるべきだ このスレ的な回答として
>>820 どんなIT方面かにもよる
ハードウェア組込、製造系ソフトなら C++
サイト関連ならjava,php,
823 :
820 :2011/11/23(水) 18:13:16.17
>>821 これは的外れな考えかも知れませんが、VBAにしても、VBAだけだけやって
本当に上級者になれる気がしないです。
VBAってスキルレベルの高い本ってあまりないし。
クラスモジュールにしても、情報が少ないですけど、これたぶん何か他の言語の下地が
できている人じゃないとうまく使いこなせないんじゃないでしょうか。
最近ネットでいろんなテクニックをつまみ食いしてもなんだか空しいです。
また先日某サイトで落とさせてもらったPING処理関係のVBAツールの中身を見たんですが、
これがプロのコードかと思い、あまりのレベルの高さに愕然としました。
あんなふうにAPIを使いこなせるスキルって、VBAだけやってたんじゃ手が届かないんじゃないでしょうか。
>>822 製造系とWEB系両方少しずつ勉強していきたいと考えてます。
C++ですか。C#はどうでしょうか?
JavaScriptとJavaではやはりJava がいいでしょうか?
ふーむ。 その志向性ならJavaかC#かな。PHPはやめた方がいいかもね、汚い言語だから。 うまく使いこなせない、っていう期間が長期化する可能性がたかそう。 JavaScriptってかECMAはJava使いにも難しいと言わせしめる部分があるから、 それなりに気合いれて取り組んだ方が良いかな。 MS系VBAが出身だからJavaよりC#は相性が良い部分があるけど、 役に立つ情報集めようとすると英語が必須かもね。お好きな方をどうぞ。
プロの俺がおすすめするにはやっぱりCだろう。 API使ってるのをすごいと思っちゃうのはCをやってないから。
824だけど、たしかに
>>825 の観点ぬけてた。
ローレベルAPIを使いこなすよーになりたいならCかな
ローレベル=簡単 ではないので。ねんのため。
Cをやると良いのは言語に入出力系の命令がなく すべて外付けのライブラリで行うってことだね。 C言語自体はすごくシンプルだからね。 そうするとAPIもたんなるそのライブラリのひとつって 考えるからすごいとかまったく思わなくなるからすんなり習得できる。 あらゆる言語を使ってきた俺が言うんだから間違いない。
829 :
デフォルトの名無しさん :2011/11/23(水) 18:46:02.41
あらゆる言語を使ってきたかたに質問なのですが CとC++とC#と、VisualCとVisualC++とVisualC#の、これらの違いはなんですか? ひょっとしたらもっと仲間があるかもしれないけど。 ところで昔流行ったBASICとかFORTRANとかアセンブラとかいうのは いまは使われてない言語ですか?
その位ググれよw つーかスレチだ
>>829 それらの言語は全部やったけど、
ようするにそういうのが気になってしまうのは
Cをやらないからなんだよ。そこをわかってもらいたいけど
わかるにはCをやらないとだめなんだな。これが。
>>829 >CとC++とC#
言語の名前
>VisualCとVisualC++とVisualC#
マイクロソフトの製品
>昔流行ったBASICとかFORTRAN
流行ってはないだろうが使われてる。BASICはVB.NETに変化してそこそこ使われてる
スレチなんでさっさとお引き取りください
833 :
820 :2011/11/23(水) 19:11:32.64
>>824 実は本屋でいろいろ立ち読みしてJavaScriptのいろんな作例を載せてる本を見たんですが、
けっこう幅広い用途で活用できそうで、またVBAのコードともぱっと見た感じ近いかなぁなどと思ってましたが、
そんなに難しいとは思いませんでした。
>>825 APIはあくまで例えで、EXCELに依存しないWindowsアプリを自分で自由に設計、作成できるようになる、
というのが現在の私の目標です。
>>828 まだ言語方面の知識が浅く、C < C++ < C#などと安易に考えていました。
違いは文法とあとは.NET使えるか、ぐらいかと…
職場のSEさんはJavaを勧めてきます。偏見かもしれませんが、Javaについて
よく耳にするのはコードが煩雑だとか動作が遅いだとかなので、ちょっとためらってしまいます。
Javaやるなら難しそうだけどC#かなと思ってました。C#を覚えればVSTOとかっていうVBAのバージョンアップ版みたいな機能も使えるみたいで面白そうだなと。
でも意外にもCって重要なんですね。Cは昔昔文法だけ勉強したことがあるんですが、まだまだ現役で使われてるのなら、Cも選択肢に含めてもうちょっと本屋で情報を漁ってみます。
スレチなのでこの辺で失礼させて頂きます。
沢山のアドバイスありがとうございました。今後の参考にさせて頂きます。
>>833 ほらね。Windowsアプリって知らないうちに限定しちゃってるでしょ
Cだと入出力系がライブラリだからWindowsとか限定する発想がなくなる。
マイコンだろうがlinuxだろうかゲーム機だろうが関係ないっていう
発想になる。
あと職場のSEがJavaをすすめるのは自分を超えられると困るからだろうなw
836 :
デフォルトの名無しさん :2011/11/23(水) 19:55:22.88
無茶を承知で言えば CでWin32APIを勉強して、COMなんかを触ってみて、もう一回VBAに戻ってくる、かなぁ・・・ やっぱりこれはハードルが高杉 VB6をして、Win32APIを触る所までいって、COMをやって、VBAに戻ってきてこの3つをつなげて考えられるようになる、のほうがいいかな
sqlite3とADODB.RecordsetをODBCドライバで繋いで、 その後copyfromrecordsetでシートにデータを吐き出させようとしたんだけど excel2003なら問題なく動くのに2007だとエラー吐くんで困ってる 2003の場合は(field).valueで普通にvalue=で数値・文字列が返ってくるんだけど 2007だとvalue(0)=って配列&バイナリ型で返ってるくるのでアウト どうすればいいんだー
>>829 アセンブラかぁ。
そうだね。アセンブラは死んだ言語といってもいいかな。
昔アセンブラはOS挟まないで直接ハード制御してたし、
今はアセンブラと言えば中間言語をアセンブラらしいコードにしたILと呼ばれているものだし。
作りも大分さまがわりしたしね。以前は番地を直接指定することも当たり前だったけど、
今は何かと言えばスタックエリアに頼るね。
まぁ速い処理が必要で無ければ、まず触る言語では無いね。
後、勉強するならやっぱりJavaの方がいいかな.。 言語的にはC#だとLINQとか使えて便利だけど、 いかんせんJavaの方が参考書が揃ってる。 Object指向はデザインパターンも大事だから勉強するならJava。 ある程度覚えた後に使うならC#と言った所かな。
すいません。もの凄く基本的なことなんだと思うのですが、使えば使うほどわからなくて困惑するこの挙動について教えてください。 Worksheet.Range プロパティでセルを扱おうとすることに失敗したり成功したりする基準がわからないのです。 たとえば、 Dim ws As Worksheet Set ws = ThisWorkbook.Sheets("Sheet1") ws.Range(Cells(1,1)).Value = 5 というコードはなぜ動かないのでしょうか。3行目をこうすると動くのですが、 ws.Cells(1,1).Value = 5 前者ではRange(Cells(1,1))の後にも自動補完が効くのに対し、ws.Cells(1,1)の後ろでは自動補完が効かなくなるので、 型的には前者の方が厳密な気がします。 あるいは、これらのコードは、ワークシートがアクティブかどうかの影響も受けるのでしょうか。
>>834 新装版は昔書店で立ち読みしたことがあるだけなので
うろ覚えだが、ページが白黒からもう少し色が増えていた
ような気がする。
あとサンプルコードの入っている付録CDを使いやすく改良した、と
書いてあったような気がする。
大幅に違うわけはないし、悪い風評もないので
今から買うなら新装版でいいんじゃないの。
しかしあれだねえ。
一部のベストセラーを除き、コンピュータ関係の技術書って
流通から消えるの早すぎだ。
>>840 >ワークシートがアクティブかどうかの影響も受けるのでしょうか。
その通り
ws.Range(Cells(1,1)).Value = 5
のうち Cells(1,1) がアクティブシートのセルを参照している
ws.Range(ws.Cells(1,1)).Value = 5
とするべし
>>842 ありがとうございます。突然Cellsと書いちゃってることの不備は何となくわかったんですが、
残念なことにいただいた修正でも同じように動きません……
私のはOffice2007です。
844 :
842 :2011/11/23(水) 21:03:59.32
ごめん実際テストしたら後者でもエラーになった なので忘れてくれ
>>819 まさか某田中のようにC.Offset(0,1)って言ってるんじゃねーよな?
あいつ大村といい勝負だぞ。
もちろん下手さ加減においてな。
846 :
845 :2011/11/23(水) 21:14:50.82
847 :
デフォルトの名無しさん :2011/11/23(水) 21:24:21.80
省略出来るところは何でも省略していいよな? 自分は.valueなんかいつも省略だ。
>>841 有益な情報ありがとうございます
将来のために買っておきます
>>840 A1にアドレスを書いてるのか?
ws.Cells(1,1).Value = 5ってSheet1のA1に5を代入してるが
ws.Range(ws.Cells(1,1)).Value = 5ってA1に"C1"とか書いてるとC1に5が代入されるコードだ。
意味的に全然違うコードだ。
>>849 何かしら問題の本質に近づいた気が。
Range(なんとか)
は引数が1つのときと2つのときでかなり意味合いが違うということなのでしょうか。
そうか Rangeプロパティには、 Range(セル範囲を表す文字列) Range(左上セルのRangeオブジェクト, 右下セルのRangeオブジェクト) の二つがあるということか。 これ2つ目の引数がオプションっていうのはなんか不親切…
CellsではItemプロパティ使ってるので入力補完は効かないよ。 入力補完を効かせたければws.Range("A1")としないとな。 どうしてもCellsを使って入力補完を効かせたければws.Cells(1,1)をいったんRange型の変数に参照を代入して Set c = Ws.Cells(1,1) c.Value=5 などとすればいい。 c.と打てば入力補完が効く。 With ws .Range(.Cells(1,1),Cells(1,1)).Value=5 End With でも入力補完は効くが、こんな馬鹿なことをする奴はいない。
おっと後ろのCells(1,1)の前のピリオドが抜けてたよ
Cells(i, j)がCells.Item(i, j)の糖衣構文なのはなんとなくわかってきました。 この辺の決まり文句的なコードって、何気に省略→規定値っていう暗黙の了解が多いですね。 今度はRowsで引っかかってます… Rows.Count というのは、Rowsで返ってくるのがアクティブシートの全行をひとつずつ要素に持っているリストみたいなもので、 その数を数えているからシートの行数がわかるって言うことでしょうか? というと、RangeというのはRangeでもあり、Rangeのリストでもある再帰データ構造ということですか?? すいません質問というより独り言みたいで。あまりググっても納得する解説がなくて悩んでいたところでもありまして。
納得するまでググれ
いろんなことがすっきりしてきました。ありがとうございましたー
>>854 オブジェクトブラウザを見ろ。
あと、Rangeは範囲を表しているだけで、データ構造とは無関係。
>>854 再起じゃなくて、左辺によって自動的に解釈が変わってるだけ
Set varObject = Range( ... )
の場合はオブジェクトになるし
varVariant = Range( ... )
という代入式の場合は
Range( ).Cells( ).Value
などのプロパティ値が省略されているとコンパイラが勝手に解釈してくれている
859 :
sage :2011/11/24(木) 13:26:45.28
>>859 あなた奥田英太郎さん?
本が売れなくてamazonに評価すら付いてないからと言って宣伝するのはいいけど
売れないならもっと内容を良くするよう努力しなきゃ。
861 :
796 :2011/11/24(木) 20:13:42.41
おそくなりましたー。 Label8.Caption = Worksheets("data").Cells(Int(c.Row), 4) とすることで、ラベルに表示されるようになりました。 Work.sheetsの指定が必要だったみたいです。
質問です。 「Aが60%、Bが40%で出現する」 「もしAなら+○○回、もしBならー××回」 というプログラムを書きたいのですが、初歩的過ぎて本にも載ってないみたいです。 誰かヒントを教えていただけませんか?
>>862 >「Aが60%、Bが40%で出現する」
「VBA 乱数」とかでググレ
>「もしAなら+○○回、もしBならー××回」
「VBA IF」とかでググレ
864 :
862 :2011/11/25(金) 22:00:24.43
>>863 様
ありがとうございます。調べてみます。
セルが1でなければその列を削除するマクロを組みたいのですが 動くけど削除されない列が出てきます For i = 50 To 100 If Cells(1, i) <> 1 Then Range(Cells(1, i), Cells(1000, i)).Delete shift:=xlToLeft End If Next i
大きな値から小さな値の方向でループしないと、削除したとき行のインデックスがずれるんじゃないか
>>865 For i=100 To 50 Step -1 で
ありがとうございますw 全然気づきませんでした
どのレベルだとVBA使いこなしてるとみとめる??
870 :
862 :2011/11/25(金) 23:35:59.50
なんとなく作ってみたのですが、型が一致しませんと出てきます。 どなたかアドバイスをお願いします。 Dim i As Long Dim j As Long j = Int((10 - 1 + 1) * Rnd + 1) For i = 1 To 10000 If j < 7 Then Cells("i: 1").Value = 1000 Else Cells("i: 1").Value = -1000 ←ここです End If Next i End Sub よろしくお願いします。
871 :
デフォルトの名無しさん :2011/11/25(金) 23:45:37.45
省略出来るところは何でも省略していいですか? 自分は.valueなんかいつも省略だけど。
Cells("i: 1")って何ですかそれ?Cells(i, 1)じゃなくて?
>>871 他の言語に移行する気がないなら好きにしろ
874 :
871 :2011/11/25(金) 23:51:26.16
他の言語に移行する気は充分にございます。 どうすればいい?
875 :
862 :2011/11/25(金) 23:54:27.68
>>872 様
できました
Private Sub kitaiti()
Dim i As Long
Dim j As Long
For i = 1 To 10000
j = Int((10 - 1 + 1) * Rnd + 1)
If j < 7 Then
Cells(i, 1).Value = 1000
Else
Cells(i, 1).Value = -1000
End If
Next i
End Sub
これでしっかりと表示してくれました。
ありがとうございます。
>>874 基本的に省略やシンタックスシュガーには頼らない
もちろん程度にもよるが
例えばC#なんかでは、デフォルトプロパティの省略は許されない
VBAでいうところの値である .Value プロパティなどがメジャーな例
完全な書き捨てでない限り「解っていても書く」のが鉄則だと思う
877 :
854 :2011/11/26(土) 00:03:47.77
Rangeが単に範囲を示しているだけ、というのも、左辺によって挙動を変えているだけ、というのも違和感があります。 Dim r1 as Range, r2 as Range, r3 as Range Set r1 = Sheet1.Cells Set r2 = Sheet1.Columns Set r3 = Sheet1.Rows としたとき、 r1とr2とr3は同じ範囲だけれども、 r1.Countとr2.Countとr3.Countは違う数字だし、(r1.Countは2007ではオーバーフローする) r1(1)とr2(1)とr3(1)の範囲も全部違う。 結果「Rangeとは、Rangeのコレクションである」としか言いようがないことになる気が。 まあもう質問じゃなくなっちゃってますが。でもこの辺の理解があやふやでよくこれまであちこちにコード書いたもんだと思ってしまいます……
878 :
デフォルトの名無しさん :2011/11/26(土) 00:23:29.52
>>876 よっしゃわかりました。
省略はしないようにします。
ということは、Sub Test()もやめたほうがよくて、Public Sub Test()のほうが良いってことね?
ところでシンタックスシュガーとはどういう意味か教えてくれたまえ
879 :
デフォルトの名無しさん :2011/11/26(土) 00:25:45.18
糖衣構文
深い関税の砂糖
>>877 Rangeが単に範囲を示しているだけ、ってのは間違ってる
>Excel 開発者用リファレンス
>Range オブジェクト
>セル、行、列、1 つ以上のセル範囲を含む選択範囲、または 3-D 範囲を表します。
これ以上でもこれ以下でもないんだが、セル範囲はより狭いセル範囲の集まりだと考えることができるから
「Rangeとは、Rangeのコレクションである」という考えかたは間違ってない
(厳密な言葉の使い方で言えばコレクションではないだろうが)
CellsプロパティとColumnsプロパティとRowsプロパティはそれぞれ返してるものは違う
Columnsプロパティ=列の集合 Rowsプロパティ=行の集合 この場合はシートの全部の行、列
だから、それぞれのRangeのCountは列の最大数と行の最大数を返してる
結果として帰ってきたセル範囲は同じだけどな
左辺によって挙動を変えているだけ、ってのもちょっと違う
式によって、代入/参照されるものが違うだけ
オブジェクトそのものだったり、デフォルトプロパティだったりで、
Rangeそのものの挙動が変わってるわけじゃない
(実はRangeのデフォルトプロパティはちょっとややこしくて、挙動を変えてるってのもあながち間違いではないとも言えるが)
シンタックスシュガーとデフォルトプロパティは別の概念だから混同しないよう注意
>>871 valueプロパティだと
Range("A2").value = Range("A1").value
Range("A2") = Range("A1")
この2つのコードは 実用上同等ではあるけど
全く同じではなかったりする
A1 の文字数が EXCEL2000だと 256文字以上だった場合
(EXCEL2007だと たしか8203文字以上)←持っていないから間違ってるかも
前者は 正しく転記するけど
後者は #VALUE! になる
884 :
デフォルトの名無しさん :2011/11/26(土) 01:18:19.26
基本的な質問かもしれないのですが、サクッと調べてもわからないので教えてください。 変数 X に例えばA1〜A20の数値の和、合計を入れたいのですが。 x = Worksheets("sheet1").Range("A1:A20") みたいな感じの1行ぐらいの文で、そういう指定ってできるんでしょうか? 現在ループをつかって、一個ずつ足すしかわからないので スマートにできる方法があるなら知りたいのですが。どうすればよいでしょうか?
>>884 X = WorksheetFunction.Sum(Worksheets("Sheet1").Range("A1:A20"))
x = evaluate("sum(A1:A20)")
887 :
デフォルトの名無しさん :2011/11/26(土) 01:48:14.18
m
888 :
デフォルトの名無しさん :2011/11/26(土) 01:50:23.02
889 :
デフォルトの名無しさん :2011/11/26(土) 01:55:56.95
>>886 evaluate というメソッドでもいけるのですね。ありがとうございます。
890 :
デフォルトの名無しさん :2011/11/26(土) 11:47:08.90
「仕事に役立つ ExcelVBA実用サンプルコレクション」は良本っぽいし 実際このスレで話題になってからamazonの中古で在庫が減ってるからここ見て注文したんだろう。 しかし2007年以前の本なので、Excel2003が対象なのが多いにマイナスだ。 ここで問題です。 Excel2007にも対応してて、しかも上記本のコンセプトを厳守した サンプルコレクションが充実した本ってないでしょうか?
892 :
890 :2011/11/26(土) 15:25:40.21
そっちは当てにならないよ
そんじゃ、こっちも当てにならないから、2ch以外へ行きな ではさようなら
894 :
890 :2011/11/26(土) 17:45:10.03
元気でな
>>890 悪いけど、分からないから教えて欲しいってスタンスだったらみんな教えてくれるかも知れないけど、
謎々じゃ答えてくれる人いないんじゃないかな。
で、解答は?
>>890 普通に買えばいいんじゃね?
2007だろーが、2010だろーが
大抵のサンプルは動くだろ。
もう詳細は忘れたが、2003 ⇒ 2007 でグラフ周りが結構変わったような気がする。 あと、2003 のままでも動くけど、オートフィルタとかソートとかで 2007 の方が使い 易くなってたような気もする。
Windows XP, Excel 2003です。 クラス側でユーザーフォームが閉じられたというイベントを取得する方法を探しています。 最初はWithEventsで次のようにQueryCloseイベントを取得しようと考えていたのですが、 UserForm型でWithEvents宣言をしてもQueryCloseイベントと取ることが出来ないようで困っています。 何かいい方法があれば教えて頂けませんでしょうか? Private WithEvents FormObj As UserForm Private Sub Class_Initialize() Set FormObj = UserForm1 End Sub Private Sub FormObj_QueryClose(ByRef Cancel As Boolean, ByRef CloseMode As Integer) 'イベント処理 End Sub
それでいい その調子でがんがれ
>>898 おそらく、FormObjと違うインスタンスのUserForm1を表示してると思うが
そもそもUserFormにQueryCloseイベントとか無いぞ
とりあえず動くだけなら
UserFrom1に
Public Event QueryClose(Cancel As Integer, CloseMode As Integer)
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
RaiseEvent QueryClose(Cancel, CloseMode)
End Sub
Class1に
Private WithEvents FormObj As UserForm1
Private Sub Class_Initialize()
Set FormObj = New UserForm1
FormObj.Show
End Sub
Private Sub FormObj_QueryClose(ByRef Cancel As Integer, ByRef CloseMode As Integer)
MsgBox "イベント処理"
End Sub
として、ThisWorkBookあたりで
Dim a As Class1
Set a = New Class1
とかやれば、イベント処理が表示されるのは確認できる
(2007で試したので引数の型がちがってるかもしれん)
やりたいのはユーザフォームのラップクラス作りたいのか?
いろいろ考えたけど、ラップクラスつくる良いやり方が浮かばんなぁ
901 :
デフォルトの名無しさん :2011/11/27(日) 07:23:31.23
「仕事に役立つ ExcelVBA実用サンプルコレクション」は オレよく書き込みしてるから amazonの中古本が飛ぶように売れまくりだ。 もう安い値段では売ってないな。 これからも値段は高騰しそう。
工作員さんご苦労様です
>>901 アレか。以前立ち読みしてワロタよ。
だって当時VBA始めて半年の俺のレベルより
本の内容というか著者のレベルが下なんだもんw
904 :
デフォルトの名無しさん :2011/11/27(日) 10:13:34.54
>>903 じゃお前が本出してここで評価してもらえよ。
逆切れカッケー (w
スレの分野の知識が全く無くても書ける テンプレどおりの煽りだな。
>>903 ExcelVBAってマイナーでニッチな言語なんだけど
半年でよくマスターレベルに達したね。
よほど集中して学習したのかな?
>>908 >ExcelVBAってマイナーでニッチな言語なんだけど
VB6 を知らんと言うオチ?
Amazonで500冊も本があるような言語は マイナーでニッチとは言わないと思うよ。
まぁ
>>903 はただの煽りだけで
知識は全く披露していない訳だから、
今の所はただのうんこと言えよう。
914 :
デフォルトの名無しさん :2011/11/27(日) 15:51:16.62
VBAは本で勉強するより なにか目的があって必死で時間が忘れるほどプログラミングして トイレに行くのも忘れてて気づいたらおしっこが止まらないほどたまってて出続ける様子にびっくりするほど 集中してた、という体験が重要だと思う。 最大の問題は、そういうプログラムを組む目的がないこと。 みんなどうしてる?
915 :
デフォルトの名無しさん :2011/11/27(日) 15:52:59.22
別に目的がなきゃ何もやらなくていいじゃん
立ってからしてる。最近は男でも座ってする人もいるらしいが。
おれは座ってするときあるよ 気分次第で使い分け
>>914 それ VBA に限らないと言うか、そんな体験いるか?
目的がないことについては、
>>916 に同意。
でも、仕事で Excel 使ってたら、それなりにここ VBA で処理すりゃ楽ジャンと思うことがあると思うけど。
>>915 お前は一人だけど、こっちは一人じゃないんだが (w
>>917-918 何の話だよ (w
おしっこに集中してびっくりする話じゃないの?
>>914 目的は目的。
本を読んだり、人に聞いたり、ネットで調べたり、ヘルプを見たりと言うのは
目的を果たす為の手段であって、手段が無ければ目的は達成されない。
だからどっちが大事とか混同している時点で話がおかしい事に気付かないとな。
>>919 お前はうんこなんだからうんこらしくブリブリ言ってりゃいいんだよw
>>919 別にVBAに限らずに、こうしたほうがいいじゃんって思うことよくあるよね。
Excelや、IMEとかの基本機能だけでも簡単にできることをわざわざ手間のかかる方法でやってる人は多い。
彼らはショートカットキーとかを知らない。調べようとしない。
そもそも効率よくやろうとする意思すらない。とりあえず今のままでもできるからいい
と思ってる。
>>923 >彼らはショートカットキーとかを知らない。調べようとしない。
そして、数年後リストラくらって会社のせいにするのだ
>>923 まあ、知らないと簡単にできると言うことに気づけないからなぁ。
俺も、その業界に人に聞くとこうやれば簡単ジャンと言われることあるから、
人のことは言えないと思う。
デリートキーでカーソルの右側消せるとか HomeやEndキーとか使わないで、いちいちチマチマカーソル動かして バックスペースキーで1文字ずつ削除を3年以上繰り返してたバカなら知ってる。
927 :
デフォルトの名無しさん :2011/11/27(日) 16:46:54.64
デリートキーでどうやってカーソルの右側消せるの?
そもそも、VBA長くやってて少しでもそう言う考えしてる奴は 旧態依然とした構造化言語のVBAだけしかやっていないと言うことはまず無い。 とっくにObject指向の言語や関数形言語の勉強に入っているだろうよ。 必要があってExcelのVBAやVB6.0をやる事はあっても、もっとリファクタリングや単体テストの作成などが出来る 効率化が図れる言語に行ってしまうよな。
>>927 どうやってって、普通に abc|def ってなってる状態で Delete キー押せば、abc|ef ってなると思うが。
まあ、上書きモードならカーソル位置の文字が消えるけど。
>>928 また、オブジェクト厨かよ。
>>930 クラスもそれを使って作るインスタンス(オブジェクト)も
普通にVBAやVB6にあるけど何か問題でも?w
便利なものは必要に応じて使うんじゃ無かったのかなあwうんこくんw
まぁ継承が使えないから普通に使えるとまでにはいかないけどな。 しかしInterfaceを使えるからポリモーフィズムは使える。便利。 ショートカットも大事だけど、プログラマならもっと プログラムの基本的なことにも目を向けないとな。
933 :
デフォルトの名無しさん :2011/11/27(日) 18:00:27.71
プログラムの基本的なことってどういうこと? クラスとか継承?
>>931 中途半端なクラスでオブジェクト指向とか笑うところ?
まあ、中途半端なオブジェクト指向厨にはお似合いかな。(w
>>933 > プログラムの基本的なことってどういうこと?
まず、素直に書くことかな。
その辺の事が分からなければスコープもどんな時にどんなエリアにプログラムや 変数が格納されるのかも分からないだろ? 使わなくても作ることは出来ても、実際分かって作ってるのとは大違いなくらい基本的なことの一つだと思うよ。 そこを意識して作れなければObject指向の言語には移れないくらいにね。
>>934 もう話してて抽象的なことしか言えないのを見てれば
如何に君が井の中の蛙なのかよく分かるよ。
どのモジュールをクラス化してインスタンスをヒープエリアに配置するか、それともシングルトンにしてスタティックエリアに配置するかだけでも考える事が出来れば
全然見える世界が変わってくると言うのに。
新しいことを取り入れられないのは非常に残念なことだね。
ああ、俺に対する発言じゃなかったのか。 でもVBAやVB6にも十分使えるクラスがあるわけだから、 便利なものを使っていく気があるなら使わない手はないと思うよ。
>>936 >もう話してて抽象的なことしか言えないのを見てれば
オブジェクト指向の会話で抽象について言うなとか、ギャグですか?(w
> どのモジュールをクラス化してインスタンスをヒープエリアに配置するか、
> それともシングルトンにしてスタティックエリアに配置するか
精一杯背伸びした文章がバレバレですよ。
>>937 適材適所でいいんだけど VBA だとどうしてもストレス溜まるから、クラス
使っていろいろやるなら、C# から Excel 使う方が楽だと思う今日この頃。
VBA だと構成管理がやりにくいしね。
>>934 中途半端なことも分からない奴が
半年で電話帳みたいな厚みがある本よりレベルが高いとかw
自分のいうレベルの高い(笑)コード書いてみてくれよw
>>938 そこで言ってる抽象的なことと抽象クラスの区別すら付かないのか・・・。
C#だってObject指向な上に関数型言語の知識が無ければ使えないだろうに・・・。
せめてGenericやLinqの利便性を説明してから奨めてやればいいのに・・・
あ、知らないのか。
941 :
sage :2011/11/27(日) 19:20:01.35
>>940 ですよねー。
そのへんの事が分かってないと
C#どころか今のVBですら
へなちょこなコードしか書けないですよねー。
>>938 は早く自分が言うところのレベルの高いコード
挙げてくれないかなー。
>>939 何を勘違いしてるのか知らんが、俺は
>>903 じゃないぞ。
厚みで勝負するような本にも興味がないしな。(w
>>940 > そこで言ってる抽象的なことと抽象クラスの区別すら付かないのか・・・。
冗談も分からんのか…。
あと、C# のどこに関数型言語の知識が要るのか教えてくれるかな。
ついでに Generic は、いざ知らず Linq の評判の悪さも知らないのか?
>>941 レベルの高いコード?
ひょっとして素人さんかな。
俺は、素直なコードがいいって書いてるんだが。
943 :
sage :2011/11/27(日) 19:37:06.04
>あと、C# のどこに関数型言語の知識が要るのか教えてくれるかな。 ・・・もう前のレスで話挙げてるんだけどな・・・ それすら気付かなかった? >ついでに Generic は、いざ知らず Linq の評判の悪さも知らないのか? LinqToSQLが遅いから全部のLinqが評判悪いとか言ってるとは到底思えないしな・・・ 知らない。ぜひ教えてくれ。
944 :
sage :2011/11/27(日) 19:40:38.90
>>942 しらばっくれちゃったようんこくんw
ごまかさなくていいから早くレベルの高いコード挙げてみろよwww
945 :
898 :2011/11/27(日) 19:45:15.80
>>900 様
助かりました!なるほど、そういう方法があったんですね。
ラッパークラスの意味はあまり知らないのですが、
やりたかったことはというとフォームの表示やイベント処理は
基本的にクラス側のみで処理させたかったという感じです。
947 :
sage :2011/11/27(日) 20:07:02.55
>>946 >具体的に書けないということでいい?
は?自分でも話に挙げてるのにまだ気付かないの?
で、2ちゃんのスレ貼って何がしたいの?
「ソースは2ちゃん」って言いたかったの?
948 :
デフォルトの名無しさん :2011/11/27(日) 20:12:44.22
「ソースは2ちゃん」(キリッ wwwwwwwwwwwww
>>947 >は?自分でも話に挙げてるのにまだ気付かないの?
御託はいいから、具体的に書いてくれ。
>「ソースは2ちゃん」って言いたかったの?
読んできた? ソースどうのこうのの前に、内容読もうよ。
821: デフォルトの名無しさんsage2011/11/27(日) 13:19:41.91
クエリ式は中途半端にメソッドが混じるから止めた方がいいと思うんだよねえ
中途半端に似てるせいで違いに戸惑うことの方が多いと思うんだけど
828: デフォルトの名無しさんsage2011/11/27(日) 14:00:20.04
ILとの直交性がないからなぁ。ふつう使わないだろ。
まずは、ここら辺から理解しようね。
950 :
デフォルトの名無しさん :2011/11/27(日) 20:18:37.54
「数字が文字列として保存されてます」のセルを 強制的に数値にしてしまうためのVBAコードは どう書きますか?
>>942 Linqに文句いう奴は.Net 2.0で成長停止した奴がほとんどだろw
理解出来てる奴はパフォーマンスの問題起こすこともなく使いこなしてるぞ
篭ってないだもっと外にでろ
VBA完全に置いてきぼりだな。
ExcelをC#で弄れるようにしないMSが悪いんだな
954 :
sage :2011/11/27(日) 20:29:19.84
>>949 ねぇ、今までさんざ言ってたLinqとかObject指向のものだと思ってたの?バカ?
それに纏わるラムダ式や反復子、拡張メソッドや匿名型なんか全部関数型言語のものだよ。
>821: デフォルトの名無しさんsage2011/11/27(日) 13:19:41.91
>クエリ式は中途半端にメソッドが混じるから止めた方がいいと思うんだよねえ
>中途半端に似てるせいで違いに戸惑うことの方が多いと思うんだけど
>828: デフォルトの名無しさんsage2011/11/27(日) 14:00:20.04
>ILとの直交性がないからなぁ。ふつう使わないだろ。
そう思うなら使わなきゃいいじゃん。
そんな事差し引いても色んなクラスにクエリを投げられる事の方が
よっぽど便利だとおもうけどね。
IL?どこぞからコピって来て偉そうに理解しろとか言ってるけど、それが本当に何だか知ってるの?
じゃあちょっとILでコード書いてみなよ。
6502系のアセンブラやってた俺ですらまだそんなに理解していないのに。
軽く「理解しようね」とか言うほど知識持ち合わせているなら、
軽くちゃちゃって書いてみせてよ。
>>954 > ねえ
> みせてよ
まで読んだ。このスケベめ
>>955 過程はともかくスケベは当たりだ。
エスパーか?
>>950 環境手近にないから、ミスってるかもしれない。
With Cells(1,1): .Value = CDbl(.Value): End With
>>954 >それに纏わるラムダ式や反復子、拡張メソッドや匿名型なんか全部関数型言語のものだよ。
で、それ使わないと C# 書けないの?
>そう思うなら使わなきゃいいじゃん。
うん、だから使ってないよ。
C# では、そんなたいしたことやってないからね。
>じゃあちょっとILでコード書いてみなよ。
今時中間コード書けって? 遠慮しとくよ。
そもそも、あのスレの 828 みて、IL 書くという発想がわけわからん。
C#からでも使えるがな
C#のラムダ式って関数型言語だったのか func1 += (x=>x*x) みたいなやつだよね
らむだこりゃ
961 :
sage :2011/11/27(日) 21:16:55.26
>で、それ使わないと C# 書けないの? はぁ? >あと、C# のどこに関数型言語の知識が要るのか教えてくれるかな。 って聞いたから答えただけだろ? それに最新のWindowsPhoneの開発環境なんかじゃこれとO/Rマッピングの 知識がなきゃ書けねーよ。 >今時中間コード書けって? 遠慮しとくよ。 >そもそも、あのスレの 828 みて、IL 書くという発想がわけわからん。 なら知ったかぶるのは止めとけ。ILはダンプである中間コードを アセンブラ形式に直したものであって、中間コードそのものではないしな。
VBA「私とC#、どっちが大切なの!?」
963 :
デフォルトの名無しさん :2011/11/27(日) 21:21:35.85
あのさ、関係ない話ならスレ立てて、そっちでやってくんない?
プログラムに興味ある人ってこんなひとばかり? はぁ? ・・・答えただけだろ? ・・書けねーよ。 知ったかぶるのはやめとけ。 ・・・ではないしな。 なんかPC初心者が集まるBBS見てるみたい。
>>961 >>あと、C# のどこに関数型言語の知識が要るのか教えてくれるかな。
>って聞いたから答えただけだろ?
自分が書いたことぐらい覚えておけよ。
>>
>>940 >> C#だってObject指向な上に関数型言語の知識が無ければ使えないだろうに・・・。
>なら知ったかぶるのは止めとけ。ILはダンプである中間コードを
>アセンブラ形式に直したものであって、中間コードそのものではないしな。
今時こんなこと言う奴がいるとは…、まあそこしか突っ込めないんだろうな。(w
>>962 断然 C# 、早く C# for Application を作ってくれ ⇒ Microsoft
そうだよ! もともとうんこくんが ここで紹介された本を 半年しかやってない自分より レベルが低くてワロタwとかー、 知りもしないC#を人にすすめたりして へんな話になったんだよ! 普通にVBAのクラスの話だったのに!
968 :
sage :2011/11/27(日) 21:47:18.14
>自分が書いたことぐらい覚えておけよ。
>
>>940 > C#だってObject指向な上に関数型言語の知識が無ければ使えないだろうに・・・。
ああ、書いたよ。それで聞いて来たのはお前だ。
>あと、C# のどこに関数型言語の知識が要るのか教えてくれるかな。
なんでC#やっててそんなこと聞いてきたのかはもう言わなくてもいい。
知らなかっただけみたいだからな。
>今時こんなこと言う奴がいるとは…、まあそこしか突っ込めないんだろうな。(w
今時も昔も関係ないな。そんな事すら知らないのによく恥ずかしげもなく
知ったかぶってレス付けられたものだ。
>ILとの直交性がないからなぁ。ふつう使わないだろ。
>まずは、ここら辺から理解しようね。
お前が理解するのが先じゃないのか?ILとの直交性ってなんだ?
Excel(笑)
VBA(泣笑)
>>967 まぁそうだな。うんこくんって呼び方はともかく、VBAに話を戻そう。
>>968 >> C#だってObject指向な上に関数型言語の知識が無ければ使えないだろうに・・・。
>ああ、書いたよ。それで聞いて来たのはお前だ。
>>あと、C# のどこに関数型言語の知識が要るのか教えてくれるかな。
>なんでC#やっててそんなこと聞いてきたのかはもう言わなくてもいい。
>知らなかっただけみたいだからな。
で?
「関数型言語の知識が無ければ使えない」はどうなったんだ?
知らないから教えてくれよ。(w
>お前が理解するのが先じゃないのか?ILとの直交性ってなんだ?
IL の説明が要るの? それとも、直行性が分からんのか?
VBA「らむだこりゃ」
975 :
sage :2011/11/27(日) 21:58:54.96
うんこくんが流れを読まずにまたC#のネタでキター。 凄い粘着性だね。 うんこなだけに。
まぁVBAもC#もMicrosoftが作ったもんだからね
> ILとの直交性 ここ笑うとこ?
978 :
sage :2011/11/27(日) 22:04:25.79
たしかに、いい加減流れを読んで欲しいな。 >で? >「関数型言語の知識が無ければ使えない」はどうなったんだ? >知らないから教えてくれよ。(w またか・・・少しは前のレス読めよ。ここまで健忘症だと いい加減相手にするの馬鹿らしくなってくるぞ。 >IL の説明が要るの? それとも、直行性が分からんのか? あのさぁ・・・・「ILとの直交性」って自分でコピって来たんだろ? 普通に日本語通りでいいよ。 って言うかVBAの会話に戻そうって気が全くないんだな、お前。
>>978 >またか・・・少しは前のレス読めよ。ここまで健忘症だと
>いい加減相手にするの馬鹿らしくなってくるぞ。
はい、お約束のループですな。
まあ、どうせ具体的に書けないから、こういう結果になると思ってたけどね。
>あのさぁ・・・・「ILとの直交性」って自分でコピって来たんだろ?
>普通に日本語通りでいいよ。
って書いて、
>って言うかVBAの会話に戻そうって気が全くないんだな、お前。
って...、ひょっとして馬鹿なの?
話をさえぎってすみません。 10000個の○と×を並べて、最も連続した回数の多い場所を 調べるためには、どのようなプログラムを組めばよろしいですか? 並べるほうのプログラムは組めたのですが、回数の多い場所を調べるプログラミングは どのメソッドを使えば良いかからわかりません。 回答よろしくお願いします。
>>979 お約束のループって、さっきお前の無知で何度も人に聞いてたアレか?
自分の無知を棚に上げてよくまぁそんな事が言えたもんだ。
で、今度は健忘症を棚に上げるのか?
いい加減にしろ。なんで俺がそんな健忘症の尻拭きしなければならないんだ。
俺は馬鹿かも知れないが、お前は空気が読めない痴れ者だな。
>>945 >フォームの表示やイベント処理は
>基本的にクラス側のみで処理
その考え方は間違いではないが、EXCELのユーザフォームには不向きかもしれん
理由はいろいろあるが、VBAのクラスの扱いがいまいちってのが大きい
汎用的な管理クラスじゃないなら
>>900 みたいな感じで行けるかもしれんが
それならそもそもUserForm1がクラスだからそこにコード書けばいいし
>>980 地道にやるしかないんじゃない?
Dim 最大連続回数 As Integer
最大連続回数 = 0
Dim 現在の値 As String
現在の値 = Cells(1,1).Value
Dim 連続回数 As Integer
連続回数 = 1
Dim 開始行 As Integer
開始行 = 1
Dim 最大連続開始行 As Integer
Dim 行 As Integer
For 行 = 2 To 10000
If Cells(行,1).Value = 現在の値 Then
連続回数 = 連続回数 + 1
Else
If 最大連続回数 < 連続回数 Then
最大連続回数 = 連続回数
最大連続開始行 = 開始行
End If
現在の値 = Cells(行,1).Value
連続回数 = 1
開始行 = 行
End If
Next
If 最大連続回数 < 連続回数 Then
最大連続開始行 = 開始行
End If
Debug.Print 最大連続開始行
>>981 >お約束のループって、さっきお前の無知で何度も人に聞いてたアレか?
>自分の無知を棚に上げてよくまぁそんな事が言えたもんだ。
>で、今度は健忘症を棚に上げるのか?
>いい加減にしろ。なんで俺がそんな健忘症の尻拭きしなければならないんだ。
>俺は馬鹿かも知れないが、お前は空気が読めない痴れ者だな。
はいはい、一生懸命なところ悪いけど、結局具体的には何も書けないんだよね。
健忘症とか言うなら、そのレス番からコピペするだけなのにねぇ。(w
。o O(このままいけば、、「ILとの直行性」をうやむやにできる!)
988 :
980 :2011/11/27(日) 22:47:15.91
>>984 ありがとうございます。
やっぱりそういう方法しかありませんかね><
せっかくなんで何か勉強してみようと思いましたが、あきらめます。
もともとそれは勉強とはいわない
991 :
980 :2011/11/27(日) 22:53:12.69
>>989 もし何か知らないメソッドがあったら使ってみたかったんです。
まだ半年も触ってないので、使った事がないメソッドもいくつかあります。
たしかに、人に聞いてる時点でだめなのかもしれないですが><
>>991 Cellsをkey、連続回数をvalueとしてハッシュマップに持ち、
valueでソートして該当のkeyのCellsから位置を知る。
>>980 A列に縦に並んでるとしたら
Dim maxval As Long
With Worksheets("sheet1")
For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
If .Cells(i, 1) = .Cells(i - 1, 1) Then
.Cells(i, 2) = .Cells(i - 1, 2) + 1
Else
.Cells(i, 2) = 1
End If
Next i
maxval = Application.WorksheetFunction.max(Columns(2))
MsgBox .Columns(2).Find(maxval).offset(-maxval+1,-1).resize(maxval,1).Address
End With
でどうだろう
>>986 =
>>990 向こうのスレ見ればわかると思うけど、なかなか説明が面倒なんだよね。
>>987 で、どこなの?
まさか、WindowsPhone でごまかせるとか思ってるの?
>>991 VBA のヘルプで、いろんなオブジェクトのメソッドとプロパティを眺めてると
発見があるかもね。
995 :
980 :2011/11/27(日) 23:05:20.27
>>993 まさに自分のイメージとぴったりでした。
ヒントどころか解答例ありがとうございます。
>>992 ちょっと組んでみようと思います。
ありがとうございます。
うわぁ。うんこくん、さらっと粘着してるね。 じゃ、次スレは「IL との直交性」から語ってみようねw
>>994 煽りとかじゃなく、ILとの直行性、何を言わんとしてるか知りたい
誰かそのスレに誘導してくれ
>>994 はぁ?
WindowsphoneがC#やVBで出来ていないとでも思ってるの?
そもそもLinqとか使わなければ別にJavaとかでもいい訳だし、
じゃあ何を根拠にC#とか奨めてるの?
それと、さっさと「IL との直交性」についても答えてよ。皆期待しているよ。
埋め
1000ならILとの直交性!!
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。