1 :デフォルトの名無しさん2011/09/25(日) 15:20:07.80
274 :デフォルトの名無しさん2011/10/21(金) 13:37:52.79
>>273
>>1を100万回読んでね
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)
651 :デフォルトの名無しさん2011/11/16(水) 22:30:18.13
>>648
この話題は スレチだとおもうが
>>2 ★3,★4 参照

ググれば サンプルあるぞ
(VBのサンプルでも参考なる)

そもそも そのコードだと多角形の頂点座標をどこで指定してるんだい
4 :デフォルトの名無しさん2011/09/25(日) 16:37:21.37
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のところがうまく動いてくれないので保存できるようにするにはどうすればいいでしょうか
6 :デフォルトの名無しさん2011/09/25(日) 16:54:00.65
>>4
Picture オブジェクトにはExportメソッドが存在しないんじゃないの?
Chart オブジェクトなら使えるんだろうけど
66 :デフォルトの名無しさん2011/09/29(木) 01:21:03.34
>>4
7 :デフォルトの名無しさん2011/09/25(日) 17:15:29.21
ではpictureオブジェクトをjpgで保存するにはどうしたらよいでしょうか
9 :デフォルトの名無しさん2011/09/25(日) 17:19:53.24
>>7
vbaでは機能自体がサポートされてない
webで検索するとシート自体をHTML保存するとpictureオブジェクトがそれぞれ独立した画像ファイルとして保存されるので、
それを拾い出して使う、というやり方が多いみたい
8 :デフォルトの名無しさん2011/09/25(日) 17:17:04.33
ある名前のシートがbookに存在するかどうかのメソッドはないのかな
自分で調べりゃいいだけなんだけど、なんでないのかなと
13 :デフォルトの名無しさん2011/09/25(日) 23:29:27.27
>>8
自分で答え書いてるじゃんw

> 自分で調べりゃいいだけ
だから無いんだよ
10 :デフォルトの名無しさん2011/09/25(日) 20:52:35.61
Excel2007だけど、ユーザーフォームのコマンドボタンにtoolchiphelpとか言うんだっけ?
マウスポインタを置いた時にコメントみたいなもの出すのあるじゃないですか、
あれ出すことって出来ませんでしたっけ?
11 :デフォルトの名無しさん2011/09/25(日) 21:19:34.71
>>10
CommandButton1.ControlTipText = "ツールチップはchipじゃなくてtip"
12 :デフォルトの名無しさん2011/09/25(日) 21:22:00.67
>>11
おおっありがとう w
14 :デフォルトの名無しさん2011/09/26(月) 04:08:35.24
質問は
>なんでないのかなと
じゃないかw
15 :デフォルトの名無しさん2011/09/26(月) 06:24:58.34
>>14
何か勘違いしてないか?

「自分で調べりゃ」ってのは、自分でググればとかいう意味じゃなくて
「ある名前のシートがbookに存在するか」を「自分で(コード書いて)調べりゃ(取得すれば)」
簡単にできることだから、わざわざそういうメソッドを用意してないんだろってことが
「なんでないのか」の答えだってことだぞ

説明させんなよ、恥ずかしいw
16 :デフォルトの名無しさん2011/09/26(月) 07:13:16.81
基本的なことだと思うのですがすいません。

例えば、変数「name」が文字列"20110926tokyo晴"である場合

select case name

case name の文字列にtokyo を含む場合
  あるセルに東京と入れる

case name にosaka を含む場合
  あるセルに大阪と入れる
end select
 
みたいな処理をしたいのですが、変数の文字列の一部分だけ
一致で判別して処理を選ぶというのはどうしたらいいのでしょうか?
「*」とかで挟んだりするのかなと思い調べてみたのですが、よくわかりません。
あるいは、これは出来ないことなんでしょうか?
30 :デフォルトの名無しさん2011/09/27(火) 05:48:35.45
>>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」と照合していくというものを作りたいのですが
どうすればよいのでしょうか?
31 :デフォルトの名無しさん2011/09/27(火) 06:07:06.54
>>30
質問の意図は分かるが、文字列の部分一致を評価対象とするCaseラベルの書き方は無いと思う。
予め対象文字列から中の地域部分を示す文字列を抜き出す関数でも自作しておいて、その結果をSelect文に渡せば良いんじゃない?
45 :デフォルトの名無しさん2011/09/27(火) 23:51:46.76
>>30は学校で<の意味習わなかったの?どうして'like'的な意味があると思っちゃったの?
50 :デフォルトの名無しさん2011/09/28(水) 04:05:46.87
>>45
いや、最初無いと思ったんですが、>>16で質問してisといわれたので、isで不等号使って
望みどおりできるのかなと。ちょっとやってみたら出来た気がして

意味はわからなかったんですが、これでいいのかなと。
でも詳しく使ってみると、思ってた用途と全然違って、再度質問しました。

ほとんど初心者なんです。
>"2011_09_27osaka晴"って文字列は"tok"より小さいからね。
これも意味がわからないです。文字数という意味でなら前者の方が大きいと思うんですが
この場合何の大小の比較になるんでしょうか?
52 :デフォルトの名無しさん2011/09/28(水) 07:23:39.95
>>50
バイナリモードの文字列の大小はまず先頭の文字の文字コードで大小比較する。
先頭の文字が同じときは次の文字で大小比較する。
それも同じときはそのまた次の文字で大小比較する。
"2011_09_27osaka晴"と"tok"ではまず"2"と"t"で比較する。
"2"の文字コードは"t"の文字コードより小さいから"2011_09_27osaka晴"は"tok"より小さい。
"a12"と"a3"の比較なら"a12"が小さい。
53 :デフォルトの名無しさん2011/09/28(水) 08:25:32.72
>>52
ありがとうございます。文字コードの大小だったんですね。
それだと確かに全然思い通りに分けられないですね。
理解しました。ありがとうございます。
17 :デフォルトの名無しさん2011/09/26(月) 07:33:27.10
Is
18 :デフォルトの名無しさん2011/09/26(月) 07:37:45.22
>>17
ありがとうございます。そんなことでよかったんですね(^^;
恥ずかしいです。すいませんでした。
19 :デフォルトの名無しさん2011/09/26(月) 11:00:06.07
>>16
Select Case True
  Case name Like "*tokyo*"
>>17-18のやり取りが俺にはわからん。
俺が馬鹿なんだろうか?
32 :デフォルトの名無しさん2011/09/27(火) 06:07:50.10
>>30
Isなんかその用途では使えないよ。
"2011_09_27osaka晴"って文字列は"tok"より小さいからね。
Select Caseなら>>19に書いてるようにする必要がある。
単純に一つずつならIf...Then...Else ステートメントでもいいと思うが。
35 :デフォルトの名無しさん2011/09/27(火) 06:47:56.05
>>32さん >>19さん
ありがとうございます

Select Case True
 case 変数 Like "変数の文字列の一部分"

のやり方で望みどおりのスクリプトが出来るようですね。問題が解決しました。
ありがとうございました。
21 :デフォルトの名無しさん2011/09/26(月) 13:19:27.27
Select Case name
Case Is like "*tokyo*"
って言いたかったんじゃないだろうか...
俺もこれで行けるとおもったが、Select Caseのヘルプ見ると
>Is 演算子と Like 演算子以外の比較演算子と共に使われます。
つうことで、Likeはダメみたいだ
23 :デフォルトの名無しさん2011/09/26(月) 16:56:28.03
>>21
俺は

>あるいは、これは出来ないことなんでしょうか?

と質問しているので、IS=です と言っている
つまり「できないです」と言ってると思った。
22 :デフォルトの名無しさん2011/09/26(月) 15:21:56.30
http://homepage2.nifty.com/kmado/ke_m13.htm#E03M122

ここにある流れる文字について、
流れる文字のフォントサイズ変えることってできないですか?
24 :デフォルトの名無しさん2011/09/26(月) 17:04:53.19
>>22
VBAつうかWebBrowserコントロールの仕様を調べれば済むはなしじゃね
25 :デフォルトの名無しさん2011/09/26(月) 18:16:32.99
OS:Windows Vista
Ver:Excel 2007

質問です。
ワークシート上で特定範囲のセルをダブルクリックした時に、セル範囲を操作させるUserFormを設定しています。
ダブルクリックしたセルのRangeを記憶させるのに、これまではTarget値をRange型グローバル変数に格納させていました。
これで別に問題なく動かせているのですが、できればグローバル変数を使わず、変数の引き渡しを駆使して、ダブルクリックセルの位置をUserFormへ受け渡したいな、と思ったのですが、方法はあるのでしょうか??
171 :デフォルトの名無しさん2011/10/10(月) 18:14:32.53
>>25
レジストリに書けばいけんじゃね?
26 :デフォルトの名無しさん2011/09/26(月) 22:09:51.45
Excel2010です。
dictionaryオブジェクトを使って重複削除したいのですが、うまくいきません。
〜途中省略〜
Range("C1").Resize(Dic.Count) = Application.WorksheetFunction.Transpose(Dic.Keys)
ここでエラーです。
どうしたらいいですか?
27 :デフォルトの名無しさん2011/09/26(月) 22:25:16.06
>>26
Debug.Print Dic.Count
33 :デフォルトの名無しさん2011/09/27(火) 06:23:05.49
>>26
そのケースでエラーになるのはDic.Countが0か65536を超えたときだな。
TransposeはExcel2007以降は使えないこともあるから気を付けた方がいい。
他人に使わせるときは65536要素以内でしか使えないとかコメントを書いておかないとな。
WorksheetFunction.Transposeと同じ機能の関数は自分で作った方がいいよ。
文字数制限も要素数制限もないし、おまけに速いから。
少ないデータで使い捨てマクロならどうでもいいけど。
28 :デフォルトの名無しさん2011/09/26(月) 23:59:49.85
Excel2007のStrconv関数のヘルプで

vbKatakana** 16** 文字列内のひらがなをカタカナに変換します。
vbHiragana** 32 文字列内のカタカナをひらがなに変換します。

** 国別情報の設定が日本の場合のみ有効です。

とありますが、この国別情報の設定ってのはExcelのどこでするんですかね?
特にそういうのをした覚えってのは無いんですけど^^;

29 :デフォルトの名無しさん2011/09/27(火) 01:27:06.30
>>28
タイムゾーンとかだろ
36 :デフォルトの名無しさん2011/09/27(火) 18:19:55.38
For t(1) = 1 to 5
For t(2) = 1 to 5



このような配列を使ったループを作りたいのですが、
”Forで指定された変数はすでに使用されています”とエラーメッセージが出てしまうのですがどうすれば良いのでしょうか
Excel2000、WindowsXPです
37 :デフォルトの名無しさん2011/09/27(火) 18:37:45.67
>>36
無理
ヘルプに配列は使えないと明記されてる
39 :デフォルトの名無しさん2011/09/27(火) 18:59:05.42
>>37
ありがとうございます
38 :デフォルトの名無しさん2011/09/27(火) 18:51:37.23
カウンター変数に配列を使って九九をやってみた。
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
40 :デフォルトの名無しさん2011/09/27(火) 20:02:56.36
ExcelVBAの本を立ち読みしてたらオブジェクトって用語が頻繁に出てきたんですが、
これが今話題のオブジェクト指向って奴ですか?
41 :デフォルトの名無しさん2011/09/27(火) 20:44:43.27
>>40
そうです。
ワークブック、ワークシート、セル…
慣れ親しんだExcelのあらゆる部品がオブジェクトであり
それらに対して命令を下すことがExcelVBAのプログラミング
であり、使う人は知らずともオブジェクト指向プログラミングを
していることになります。
42 :デフォルトの名無しさん2011/09/27(火) 21:08:43.02
>>41
ありがとうございます。
オブジェクト指向って意外と身近な存在なんですね。
46 :デフォルトの名無しさん2011/09/27(火) 23:55:41.40
instarでよくね
51 :デフォルトの名無しさん2011/09/28(水) 07:09:23.17
>>46
InStrでもLikeでもどっちでもいいんだよ。
たいがいの人は両方使えるよ。
47 :デフォルトの名無しさん2011/09/27(火) 23:56:43.00
そしてワークブックを使っていればオブジェクト指向だと勘違いしてベタ書きする低級PGが量産される
48 :デフォルトの名無しさん2011/09/27(火) 23:58:40.73
プロパティとメソッドの違い教えろください
54 :デフォルトの名無しさん2011/09/28(水) 10:23:57.30
>>48
プロパティ=変数
メソッド=関数
49 :デフォルトの名無しさん2011/09/28(水) 02:29:00.88
オブジェクト指向プログラミングに関して、VBAで出来ないこと
http://members3.jcom.home.ne.jp/daruma_kyo/aboutooa/vba_limit.html
56 :デフォルトの名無しさん2011/09/28(水) 17:26:18.01
今居るセルの1つ下の列から始めて
同じ列に文字が入力されているセルまでをloopで見つけたいのですが
Do
a = a + 1
Loop While Cells(a, 1) Like "*"
と考えてみたのですが駄目無限ループしていまします。
どなたか分かる方お願いします。
61 :デフォルトの名無しさん2011/09/28(水) 20:17:08.39
>>56
Like "*"
だと セルが空欄でも(入っていても) 常に True になるよ
Likeの文字パターン * は任意の数の文字(=文字数0も含む)だから
57 :デフォルトの名無しさん2011/09/28(水) 17:47:26.99
文字が入力されているかどうかならこれで良いと思うんだけどなんで、わざわざLikeを使ってんの?

Loop Until Cells(a, 1) <> ""

58 :デフォルトの名無しさん2011/09/28(水) 19:11:04.73
文字とか数字とかの区別が必要なのかどうかわかんないけど、
セル(a,1)から下方向にセルが空欄かどうかを調べるだけなら
.cells(a,1).end(xldown).row
のほうが早くない?
59 :デフォルトの名無しさん2011/09/28(水) 20:00:04.92
まさかとは思うが下方向に空欄しかないんじゃ
それと列って言ってるけど行のことだよね
63 :デフォルトの名無しさん2011/09/28(水) 21:23:42.51
execl2000です
前スレでpictureはhtmlで保存して抽出するのが一般的と教えてもらったものですが
SaveAsを使ってhtmlにしたら自分自身が保存したhtmlになってしまいます
エクスポートするような形でhtmlファイルに保存するにはどのようにしたら良いでしょうか
64 :デフォルトの名無しさん2011/09/28(水) 21:46:35.71
>>63
前スレにそれらしき質問が見当たらないんですが、
どんな質問だったのですか?
(前スレを全部開いて「html」と「picture」と、ついでに「jpeg」でスレ内検索しました)
69 :デフォルトの名無しさん2011/09/29(木) 11:03:53.95
>>63
これなんか参考にならない?
ttp://vbatips.blog37.fc2.com/blog-entry-26.html

あと、質問するなら名前欄に最初のレス番かなにか入れてよ
もちろんHNとかトリップとかでもいいけど
ここID出ないんで誰のレスなのか分かりにくいから
70 :デフォルトの名無しさん2011/09/29(木) 15:34:38.90
>>69
できました
ありがとうございます
68 :デフォルトの名無しさん2011/09/29(木) 08:21:44.17
あーそれhtmlで出さなくてもjpg出力できるわー
今ちょっと時間ないしどうやったか忘れたけど昔やったわー
71 :デフォルトの名無しさん2011/09/29(木) 23:55:22.48
Win7、Excel2010なんだけど、
IEのダイアログを操作する方法ってないかな?
ウィンドウハンドルとIHTMLDocumentは取得できるんだけど
ここから、フォームに入力したり、ボタンとかクリックする方法がないかな?
73 :デフォルトの名無しさん2011/09/30(金) 13:35:30.72
>>71
数年前にVB6で同じようなものを作ったが、ウィンドウハンドルは必要ない。
72 :デフォルトの名無しさん2011/09/30(金) 10:51:15.62
Excel2007

デジタル署名をVBE→ツール→デジタル署名から作ってみたのだけど、
[証明書の表示]を見ると、

このCAルート証明書は信頼されていません。信頼を有効にするには
この証明書を信頼されたルート証明機関のストアにインストールして
ください。

とあります。この「ルート証明機関のストアにインストール」する
にはどうすれば良いの?

(全く個人用なので公開とかするつもりは全っ然ないのですが)
74 :デフォルトの名無しさん2011/09/30(金) 20:18:17.14
windows2000、Excel2003

質問です。
ある一つのユーザーフォームを呼び出すプロシージャが2つあるのですが、
どっちのプロシージャから呼び出されたか判定出来るようにしたいです。
何かヒントだけでもいいので、教えてください。
75 :デフォルトの名無しさん2011/09/30(金) 20:33:35.98
>>72
VBEで証明書つくれるようになったのか?手順教えてくれ
まあどこで作った証明書でも良いんだが、証明書ファイルを(エクスプローラで)
ダブルクリックしたらインストールできなかったか

>>74
フォームにそれ用のフィールドなり変数なり作って呼び出し元のプロシジャで値をセットする
グローバルな変数をつかう
どっかのシートにどっちが呼び出したか書く
76 :デフォルトの名無しさん2011/09/30(金) 20:53:25.48
>>75

72です

作ったのは
Windowsのスタートメニュー
→Microsoft Office
→VBAプロジェクトのデジタル署名
で出てくる[デジタル証明書の作成]
に名前を入れてみたんですが
(ちなみにOSはXP)
77 :742011/09/30(金) 20:57:22.20
>>75
シートに書くという基本的な事が頭から抜けてました。
ありがとうです。
79 :デフォルトの名無しさん2011/09/30(金) 21:14:38.11
>>76
いつの間にか証明書作れるようになってたんだな
それで作ると勝手に個人用ストアに作られてるみたいなんで、管理コンソールで移動すれば良いんじゃないかな
やり方はスレチなんで、MMC 管理コンソール 証明書 あたりでググって
80 :デフォルトの名無しさん2011/09/30(金) 21:37:12.80
>>79
72です。出来ました。ありがとう!
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

この部分で構文エラーと出ます。何がいけないんでしょうか?
81 :デフォルトの名無しさん2011/10/01(土) 00:49:33.54
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秒止まってくれません、記述の仕方に問題があるのでしょうか?
お願いします
84 :デフォルトの名無しさん2011/10/01(土) 01:00:10.36
>>78
それその位置で改行してるのか?
VBAはどこでも改行していい言語じゃないぞ

>>81
ここ、何のスレか解ってるのか?
82 :812011/10/01(土) 00:51:31.71
ごめんなさい、記述し忘れました。ループ操作を実行した時にペーストが数度繰り返されてしまいます。
どうか、お助けください
83 :デフォルトの名無しさん2011/10/01(土) 00:54:08.83
スレタイ2000回読んだ方がいい
85 :デフォルトの名無しさん2011/10/01(土) 01:00:31.41
uwsc??
86 :812011/10/01(土) 01:04:24.72
>>83申し訳ないです。VBAに関するスレッドが見つからなかったもので、書き込んでしまいました。
>>84申し訳ないです。質問スレ等が見つからなかったのでお邪魔な書き込みをしてしまいました。
許してください・・
>>85
KMmacroというのを使っております
87 :デフォルトの名無しさん2011/10/01(土) 01:34:52.43
それVBAじゃないみたいだけどVBAってなんだか分かってる?
88 :812011/10/01(土) 01:38:05.77
>>87そうなんですか!?オフィス上で自動化の作業をマクロを組んでおけば自動化してくれるものだと思っていました。
89 :812011/10/01(土) 01:58:45.57
81です、すごくお邪魔になるので自分はここから出て行きます。ご迷惑おかけしました。
91 :デフォルトの名無しさん2011/10/01(土) 11:22:43.57
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

よろしくお願いします。
92 :デフォルトの名無しさん2011/10/01(土) 11:57:32.58
>>91
そこまで分かってるなら普通にUnicodeからShift-JISに変換するだけ

Msgbox LenB("a") '結果は2

Msgbox LenB(StrConv("a", vbfFromUnicode)) '結果は1
93 :912011/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

度々すみませんが、よろしくお願いします。
97 :デフォルトの名無しさん2011/10/02(日) 00:45:21.02
>>91 >>93
関係あるかわからないけど
VB6の記事だけど こんなんみつけた

Microsoft Formsでのクリップボード操作のバグ?
http://hanatyan.sakura.ne.jp/vb60bbs/wforum.cgi?mode=allread&no=14459
94 :デフォルトの名無しさん2011/10/01(土) 23:53:57.89
クリップボードってWin32APIレベルではデータの種別も持つようになってるんだけど
DataObjectってその辺設定するプロパティないよね
もしかしてunicode固定なんじゃないの?
98 :デフォルトの名無しさん2011/10/02(日) 02:34:12.80
>Forms 2.0 の MSForms.DataObject の SetText メソッドを用いていた場合、
>CF_TEXT 形式のデータが正しく出力されないようです。

だめぽいね
99 :デフォルトの名無しさん2011/10/02(日) 10:11:04.04
WindowsVista
Wxcel2007
おはようございます。VBA歴半年の初心者です。
ユーザーフォーム上に配置した4つのチェックボックスのONOFFによって、
同じユーザーフォームに配置したリストボックスに表示されたデータにソートをかけて表示させる処理を作ったのですが、どういうわけか、この処理が実行されるたびに、リストボックスのサイズ(Height?)が少しずつ下から減っていきます。
理由が分からず、対応方法が思いつきません。
識者の方々、ご指導願います。
104 :992011/10/02(日) 11:00:48.73
リストボックスのHeight値を250以下に設定したら、減らなくなりました。
それ以上、300とかに設定すると250ぐらいまで少しずつ減りだすようです。
できれば450ぐらいで使用したいのですが。
これはバグなのでしょうか…?
105 :デフォルトの名無しさん2011/10/02(日) 12:17:17.43
リストボックスの IntegralHeight がTrueになっていると、高さが自動調整されるので、
それをFalseにすればいいと思う。

Trueでも、設定するたびにどんどん短くなるのは、おかしな現象ですが、
フォントサイズによってなったりならなかったりします。

バグかもしれないし、最初からその程度の精度しかないのかもしれません。

106 :992011/10/02(日) 13:02:56.05
>>105
リストボックスのプロパティは全部調べたつもりでしたが、ご指摘の項目はうっかり漏れていました。
IntegralHeightをFalse に設定した所、サイズが変わらなくなりました。
どういう条件でリストボックスのサイズが少しずつ短くなるのかは、msdnのページにも書かれてないっぽいですが、
とにかく明確な対処方法が分かってスッキリしました。
ありがとうございました!
107 :デフォルトの名無しさん2011/10/04(火) 07:42:22.19
例えばシート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行目のセルの中に、新宿、中野、練馬・・・・
などの多種類の条件のうちから、合致するものがあったら、それにちなんだステートメントを
実行するみたいな作業をしたいのですが

この上の文を使って、何回も書けば、それでできないことはないかなと思うのですが
出来ればスマートに出来るようになりたいんですけど、何か方法、あるいは他の
メソッドなりを使って出来ないものでしょうか?
108 :デフォルトの名無しさん2011/10/04(火) 08:10:15.10
>>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 〜

みたいに使える
109 :デフォルトの名無しさん2011/10/04(火) 08:24:02.11
>>108
ありがとうございます。そんな風に書き換えるとでもいうような
方法があったんですね。勉強してみます。ありがとうございました。
110 :デフォルトの名無しさん2011/10/04(火) 11:14:51.67
自作のDLLを呼び出そうとしています。
複数ある関数の中で、1個だけ以下の様に関数名と()の間にスペースが自動で入ってしまうのですが、
これはどういう意味なのでしょうか?

Sub1(...)
Sub2 (...)
Sub3(...)

エクセルのVBAエディタです。

141 :デフォルトの名無しさん2011/10/07(金) 23:23:54.88
>>140
>>110みてみろ
もろ「戻り値を取得せず、Callも書かない場合。」やってるだろ
だからこれやった場合普通はスペースが入るって言ってんだ
142 :デフォルトの名無しさん2011/10/08(土) 00:49:51.32
>>141
複数ある関数のうち1つだけって時点で>>110はバグとしか思ってない。
オレは「普通」について否定されたから根拠を示しただけなんだが。
145 :デフォルトの名無しさん2011/10/08(土) 07:43:09.99
>>144
いや、>>140もそうなんだけど、
この質問主が聞きたいのは
スペースが入る理由なんだよね。
だからそれに対する回答をしなちくゃいけない。

>>110に対する適切な回答:
引数を持つ関数を呼ぶ場合、関数名()のみ記述した場合はスペースが入る。
これはビジュアルベーシックエディターの仕様である。

これだけでオッケー。
動作が違うとかは質問に対する回答になっていない。
149 :デフォルトの名無しさん2011/10/08(土) 12:54:11.14
>>145
スペースが入る理由はそれでオッケーだとして
じゃあsub1と3はスペースが入らない理由は?って話になるんだが

とりあえず>>110はエクセルのバージョンとDeclareの部分を晒せ

昔なんか似たような現象を見た気がするんだが、
その時は非公開なエクセルで定義済みの名前とかぶってたの原因だったような
151 :デフォルトの名無しさん2011/10/08(土) 13:48:59.53
>>149
だから>>111で聞いた
>>110からは返答ないけど
111 :デフォルトの名無しさん2011/10/04(火) 21:36:44.63
普通は入ります
入らないのがおかしい
var = Sub1()とかしてんじゃねえの?
114 :デフォルトの名無しさん2011/10/05(水) 09:44:33.78
>>111
普通は入らんのでは?
Callの有無で意味合いが変わってくるから気をつけてね
126 :デフォルトの名無しさん2011/10/06(木) 01:03:27.61
>>114
普通は入るだろ
どうして試しもしないで言ったの?
140 :デフォルトの名無しさん2011/10/07(金) 18:16:41.05
>>126
試すとかじゃなくて普通じゃないの、君のは。

括弧の前にスペースが入るのは
戻り値を取得せず、Callも書かない場合。
これは普通じゃないぞ?
動き違うから勝手に省略しちゃだめだぞ?
143 :デフォルトの名無しさん2011/10/08(土) 02:15:17.26
>>140
Callの有無で意味が変わるって、どういう事?
Callは単なるサブルーチン呼び出しで、
記述上は省略可能で、その有無によらず
同じ意味だと理解していたのだけど、
違いがあるの?
今までずっと、Letみたいに無くても困らない
ものだと思ってた…
112 :デフォルトの名無しさん2011/10/05(水) 08:24:03.92
変数内の文字列を抽出して別の変数に指定することは出来ますか?
たとえばaには"1234567890"が入っていて、その中から
bには"5678"を入れたいのですが。
121 :デフォルトの名無しさん2011/10/05(水) 11:06:40.66
>>119

>>112の例だと
b = Mid(a, 5, 4)
じゃだめなの?
123 :デフォルトの名無しさん2011/10/05(水) 14:39:41.41
>>121,122
おっしゃる通り、関数と同じやり方で出来ました
まさかこんな簡単に出来るとは思いもよりませんでした
ありがとうございました
113 :デフォルトの名無しさん2011/10/05(水) 09:33:14.10
文字列から抽出??一部を抜き取るの?
そりゃあ無理だから希望の文字列を変数に代入してください
115 :デフォルトの名無しさん2011/10/05(水) 09:47:55.06
>>113
やはり、無理なんですか。
一度aをセルに入れてMID乃関数でbに入れないと無理ですかね?
116 :デフォルトの名無しさん2011/10/05(水) 09:52:43.61
コードレベルじゃなくて、何がやりたいの?
それを聞いた方が良いアドバイス出来そうだけど。
118 :1122011/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("オーダー?")
   b = Worksheets("MAIN").TextBox1   
a = 'bの文字列の中の一部分を入れたい    ’ ?
End If

Set Obj = 転記元.Cells.Find(a)
If Obj Is Nothing Then
MsgBox "見つかりませんでした。"
Else

MsgBox "見つかりました。"
Obj.Select

End If
End Sub
119 :デフォルトの名無しさん2011/10/05(水) 10:25:01.11
>>116
解りにくいかもしれないですが↑の様な感じです。
?の時は変数aでそのまま検索出来るのですが、
?の時にTextBox1の中の文字列の一部分で検索しないといけないのです。

TextBox1はシート上のフォームです。
この場合はやはり、一度変数bをセルに代入してMIDで一部を抽出しaに
入れ直さないといけないのでしょうか?
117 :デフォルトの名無しさん2011/10/05(水) 10:17:18.92
excel2007なんだけど、IE操作するのに必要なInternet Controlsに
参照設定しようと思ってVBEのツールから参照設定をしようとすると
Internet Controlsが見当たらないorz

http://www.dotup.org/uploda/www.dotup.org2103343.jpg
こういう場合どうすんの?
120 :1172011/10/05(水) 10:33:30.63
自己解決

Microsoft Browser Helpersにチェックを入れるんだって
IEが動作したのはこれで確認
122 :デフォルトの名無しさん2011/10/05(水) 11:49:45.66
>119
VBAの関数使えばセルに代入しなくても可能
一部を抽出するための、一部の部分を判定するルールどうなってるんだ?
124 :デフォルトの名無しさん2011/10/05(水) 21:51:15.79
VBAってインターフェースも実装できるんだね。
初めて知った。
125 : 忍法帖【Lv=13,xxxPT】  【東電】 【東電 70.3 %】 2011/10/05(水) 23:43:30.70
EXCELでマクロを組みたくてVBAの勉強したいんだけど、オススメの本とかある?
127 :デフォルトの名無しさん2011/10/06(木) 01:59:10.85
>>125
定番の回答だが、書籍に限らず解説の類は、本人の理解力や解説方法の好み
予備知識(VBAはもちろん、他の言語経験があるかとか)などでどれが良いかは変わってくるので
自分で書店に行って実際に読んでみて、自分の理解力や好み、レベルに合った物を探すのが一番

あと、ここみたいにその時その時で偶々スレ見てる人が回答する掲示板でオススメ聞くと、
質問した時スレに居た数人個々の独断と偏見で世間的にはあまりオススメとは言えないものを
奨められることも多いので、質問したときに偶々居合わせた人だけの意見ではなく
ネット書店のレビューや評価など、書籍に対する意見や評価のみが長きに渡り蓄積されたものを
見た方が参考になるよ
128 :デフォルトの名無しさん2011/10/06(木) 08:47:43.15
シート上のドロップダウンリストで選択した内容を
変数に収める事は出来ますか?
Dim a as String
a = ActiveSheet.ドロップ2.value
End sub
では無理でした。
変数に収めなくても、別のセル(B2)等に直接コピーでも
よいのですが。
129 :デフォルトの名無しさん2011/10/06(木) 11:11:16.44
>>128
ドロップダウンリストがセルA1にあった場合

変数 = Range("A1").Value

別セルにコピー

=A1
130 :デフォルトの名無しさん2011/10/06(木) 12:47:30.43
>>129
ドロップダウンリストはセルではなくてフォームなのです。
その場合はリンクさせているセルに表示される数字から
検索するしか方法はないのでしょうか?
131 :デフォルトの名無しさん2011/10/06(木) 14:15:39.09
>>130
シートに直接フォームコントロールを挿入したなら
Sheet1.Shapes("Drop Down 2").ControlFormat.Value
とか

フォームコントロールはShapeオブジェクトとして追加される
その時にNameがついてて、Shapesで指定してるのがその名前(この場合なら"Drop Down 2)なんだが
この名前を画面上で知る方法はよくわからん
これでエラーでるようなら、全Shapeの名前列挙してそれっぽいの探してくれ
132 :デフォルトの名無しさん2011/10/06(木) 14:51:53.79
>>131
試した見たのですが、ドロップダウンリストの入力範囲の
数字(順番?)が取得されて入力内容【リストの内容)は無理でした。
直接選択したリスト内容(解りにくくてすみません)を取得したいのですが
133 :デフォルトの名無しさん2011/10/06(木) 15:43:30.44
>>132
ValueじゃなくてTextってことか
134 :デフォルトの名無しさん2011/10/06(木) 15:55:31.13
>>132
コントロールへの参照は略すけど、
 .ControlFormat.List(.ControlFormat.ListIndex)
で、選択されているリスト項目の内容を取得できる。
ただし、非選択時(ListIndex=-1)時はリストが取れないので場合分けして処理すべし。
135 :1322011/10/06(木) 18:10:13.06
>>134
ありがとうございます
望んでいたものが出来ました!
136 :デフォルトの名無しさん2011/10/06(木) 22:49:31.10
エクセルがRC形式かどうかって分かりますか?
137 :デフォルトの名無しさん2011/10/06(木) 23:10:26.03
>>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が表示されるのはなぜでしょうか?
修正お願いします。
139 :デフォルトの名無しさん2011/10/07(金) 00:57:01.87
>>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
144 :1432011/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年近く使ってたけど、たまたまこういうシーンに出くわさず、
知りませんでした…
146 :デフォルトの名無しさん2011/10/08(土) 11:05:47.73
Round関数がVBAとワークシート関数で仕様が違うのとかも結構な落とし穴だよね
147 :複乳2011/10/08(土) 11:23:53.27
>>146
どう違うのだ?
148 :デフォルトの名無しさん2011/10/08(土) 11:49:15.17
これに対して VBA の Round 関数は "銀行型" の丸め処理を行います。
"銀行型" の丸め処理の場合は ".5" は、結果が偶数になるように丸め処理が行われ、
切り上げられることも、切り捨てられることもあります。

http://support.microsoft.com/kb/225330/ja
150 :デフォルトの名無しさん2011/10/08(土) 13:13:48.65
110もそんなに気にしてないんじゃない?

昔なんか似たような現象を見た気がするんだが、
その時はブック再作成で直ったような
152 :デフォルトの名無しさん2011/10/09(日) 09:26:18.32
質問させてください。
WinXP、Excel2003です。

自作マクロのプロジェクトにパスワードを設定しました。
?次に設定ファイルを読み取り、
  自身に含まれるマクロを作成・入れ替えするマクロを組みました。
?さらに下記サイトを参考(丸写し)に、パスワードをマクロで入力するものを作りました。
ttp://home.att.ne.jp/zeta/gen/excel/c04p68.htm

??はそれぞれ単独では正常に働きます。
しかし、マクロ?の最初でマクロ?で呼び出したり、マクロ?中に?を組み込んでも正常に動かない。
正確には、ワークシート相手にパスワードを打ち込む
→マクロ?は動作しない(保護に関する実行エラーも出ない)という状態です。

別々に動かせばいいだけなのですが、マクロ?の後にVBEにアクセスできる状況が不安です。
??を上手く連動させる方法はないでしょうか。
よろしくお願いします。
153 :デフォルトの名無しさん2011/10/09(日) 14:27:07.89
すいません、ちょっと意味が分からないです。
でも面白い事してますね〜
自分も昔、同じように自身のコードを追加、変更し実行するというマクロを作りました。
その時は変更内容が開き直さないと反映されない事と、
2007以降のデフォルト設定ではVBEに対するアクセスが出来ない為諦めましたが。
154 :デフォルトの名無しさん2011/10/09(日) 15:00:16.65
読み直してみましたが、
2の呼び出しコードは動的に生成されますか?
であればコードがロードされていないのでは?

こういう回答はあまりしたくありませんが、やり方変えた方が良いかもしれません。
マクロ書き換えって結構問題があると思います。
まずファイルにゴミが貯まって行く事。
書き換え頻度が不明ですが、徐々にファイルサイズが増えて行くはずです。
次にバージョン管理(コード修正)がしにくい事。
自分用であればあまり問題となりませんが、エクセルブックはデータを含むのでバージョンアップが難しいです。
色んな人が使うとなるとお手上げです。
最後はセキュリティの話ですね。

自分だったら、パスワード保護が必要なコード(機能)はアドインに実装。
ブックの生成機能はそこに持たせますかね。
155 :1522011/10/09(日) 17:56:29.14
少し長くなりますが…。
「CSVファイルを計算シートに張り付けて、抽出されたデータを記録シートに張り付ける」
という作業を自動化させたものです。
私自身が独学であることに加え、他の人間は完全に素人です。
また、仕事で使うものですから最低限のセキュリティは設けたい為にロックしました。

しかし、このままでは私以外設定の変更ができない。
かつ、割と半端ない構造をしているのでコードが長大です。
なら設定変更すら自動化すればいい、という結論に。

アドイン案もあったのですが、とりあえず完成させた後に分離させるというのが一つ。
ファイルが2つ以上に分かれると、移動などで欠損しやすいかなというのが二つ目の理由です。
むろん勉強不足もありますが…。
157 :1522011/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 :1542011/10/09(日) 18:58:59.05
ん〜PGとしては、パスワード設定の部分は「無い」ですね。
ワークシート上のボタンで起動するマクロであれば、
For i = 0 to 30000
DoEvents
Next i
で処理開始を遅らせ、その間にVBEを前面に持ってくれば動きません?
これはキーボードをエミュレートしているだけですので。

仮に、メインの処理が長引き、
ユーザーが違うウィンドウを前面に設定してしまった場合、
そのせいでパスワードがメモ帳に貼り付いてしまったりという事が考えられます。
AppActivateに指定するのもアプリ名ではなくウィンドウタイトルだったような・・・
159 :1542011/10/09(日) 19:20:36.03
>.InsertLines 2, Cells(最終行 - i + 1, 1).Value
これは分類の定義をコード上に書いているのでしょうか?

>「CSVファイルを計算シートに張り付けて、抽出されたデータを記録シートに張り付ける」
抽出ロジックに、CSVという"データ"とは別に"分類"というメタデータが必要なので、
それをコード上に記録する為、コード自体を書き換えるようにした。
という感じでしょうか?

であれば別シートに定義するのが良いと思います。
パスワード解除も不要ですし。
160 :デフォルトの名無しさん2011/10/09(日) 20:40:38.02
シートの行番号を引数に持つSubを作り、そのSubに
「1列目の値がある数値以上であれば、引数で指定した行の背景色とフォントの色を変更する」
という内容を書いて、呼び出し元からFor文などで、任意の行の範囲に対して繰り返し呼び出しをする
処理をやっています。

現在のところ対象の行の数は50ほどで、このSubによる処理はすぐに終わるんですが、ページ設定や
印刷プレビューなどを実行した後では、この50回ほどのSubの処理が非常にもたつくようになり、
その間は、無限ループを行っているように画面がちらつきます。
同時に起動している他のシートであっても、印刷に関する処理を行った後には必ず発生するため、
少々困っています。何か対策のようなものはありますでしょうか?
ちなみに、このマクロで処理をしているシートは、印刷するものではありません。環境はExcel 2003です。
よろしくお願いします。
161 :デフォルトの名無しさん2011/10/09(日) 21:27:13.77
>>160
Application.ScreenUpdating=Falseってやってる?
呼び出し元って何?イベント?
Subの処理は常に50回しか実行されないの?確認した?
条件付書式で出来そうだけど出来ないの?
164 :1632011/10/09(日) 22:51:32.10
>>163は>>161あてです。すいません。
162 :1522011/10/09(日) 21:33:32.14
>AppActivate
ググってみると、「同一のタイトルが存在しない場合は、引数titleで指定された文字列で始まるタイトルを探します」とありました。
複数のエクセルを開く必要があれば、正確に指定する必要がありますね。
構造を変えることがあれば注意したいと思います。


>DoEvents
少し動作が変わりました。
別プログラムをアクティブにしていると、裏で保護に関する実行エラーが出るようになりました。
やはりVBEがうまくアクティブになってないのが原因な気がします。
入れる場所を変えて実験したいと思います。
後念のためAppActivateでVBEも呼び出すべきか。


>これは分類の定義をコード上に書いている
>抽出ロジックに、CSVという"データ"とは別に"分類"というメタデータが必要なので、
>それをコード上に記録する為、コード自体を書き換えるようにした。
たぶんその認識であっていると思います。説明不足ですいません。


初期のマクロは、「計算シート(IFCOUNT等)を2つ開いて、CSVを2つ開いてそれぞれ貼り付け、ペーストを20回以上する」
という手動操作の模範でした。
さらに3つめのCSVはその程度では分類不可。
こんな回りくどい方法よりも、VBAのメモリ上で直接処理したほうが早いと改良。
実際、時間短縮にも成功し、最後の手動作業も膨大な分岐を利用して強引に完成させました。

この頃になると、VBAが膨大になりコンパイルエラーの可能性が出てきたので、
一部をFunction化などで分離したものが1個前のヴァージョンです。
今回のマクロは、この部分の修正が目的です。
合わせて入力フォームを作成して、徹底的にエクセル操作からの隔離を目指しています。

長い&分かりにくくて申し訳ありません。
165 :1542011/10/09(日) 23:40:58.60
>>162
ごめんなさい、やっぱり分からないです。

その方法で突き進むんだったら、
sendkeybd_eventを完璧なまでに制御するしかないですね。
パスワード入力時、VBEが開かれるんですよね?
であれば、ツールウィンドウが開かれているかとか、
最前面ウィンドウが何かとか、
いろいろチェックかけないと安定動作は難しいように思います。
あとはウィンドウハンドル指定でsendkeybd_eventを実行するとか。
あと、最悪ESCで止まるようにしておかないと、こういったアプリは何をするかわからないです。
166 :1522011/10/10(月) 00:14:27.17
>>165

>こういったアプリは何をするかわからないです
そう思って直前にバックアップしておかないと、作動しないように保険を掛けています。

色々回答ありがとうございます。
もう少し自分で弄繰り回して、それでもダメでしたら類似マクロの可能性にかけたいと思います。
最後はパスワード廃止か、自分で手動変更するか…。
180 :1522011/10/12(水) 00:49:55.27
>>165

「DoEvents」の入れる場所とループ回数を施行実験した結果、
パスの一時解除とVBEの操作ができるようになりました。

お陰様でマクロを完成できそうです。
改めてお礼を言わせてください。
駄文にお付き合いくださって本当にありがとうございました。
頑張ります!
163 :デフォルトの名無しさん2011/10/09(日) 22:50:41.22
レスありがとうございます。
Application.ScreenUpdatingについては存じませんでした。処理の前後に切り替えを挟んで
みて、試してみます。
呼び出し元はイベントです。
Subの呼び出しの増減はありうるんですが、たとえば10回程度の呼び出しであっても、
前述のページ設定などの実行がなされた後だと、エクセルを再起動しない限り完了までに
数秒はかかっていました。
Subでは、その他の処理もやっていましたが、問題の箇所を条件付書式で解決できるようで
あれば、分離させようと思います。
「その他の処理」が原因でないことは確認しています。
167 :デフォルトの名無しさん2011/10/10(月) 11:38:55.06
配列(100,100)の
配列(1,0)から配列(10,0)を範囲指定して
一括して値を入れることは可能なのでしょうか?
それとも1個ずつ指定するしかないのでしょうか?
168 :デフォルトの名無しさん2011/10/10(月) 12:56:40.19
>>167
ttp://officetanaka.net/excel/vba/speed/s11.htm

こういう事か?値はいいけどセルのプロパティとかは無理
169 :デフォルトの名無しさん2011/10/10(月) 16:02:47.04
値でも無理だろ
>>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)
170 :デフォルトの名無しさん2011/10/10(月) 17:23:43.76
>>169
あーそういう事か
そりゃ配列のレンジ指定して0フィルとかnullで埋めるとかでもしないとね
ジャグとか面倒そう

つーか図に感動したw
172 :デフォルトの名無しさん2011/10/10(月) 18:37:20.11
>>167-170
Office TANAKA にはこんなやり方も書いてある
ttp://officetanaka.net/excel/vba/tips/tips124.htm
173 :デフォルトの名無しさん2011/10/10(月) 19:03:35.08
>>172
それは知ってるけど、全く関係ない話じゃん
175 :デフォルトの名無しさん2011/10/10(月) 19:24:15.71
「配列→セル」、コード的には「セル=配列」なら>>172すら必要ない
「セル→配列」、コード的には「配列=セル」だと>>172は役に立たない

んで今回は後者
176 :1672011/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 を入れなくても動いたのですが、これはこれで大丈夫なんですか?
179 :デフォルトの名無しさん2011/10/11(火) 10:26:05.03
>>177
Variant型になるだけで今はおかしくないけど、
凡ミス時にちゃんとエラー吐かせたいなら、
なるべくOption Explicit設定しといた方が良いと思う。
178 :デフォルトの名無しさん2011/10/11(火) 10:24:45.09
Option Explicit
入れてないんでしょ

今はそれでよくてもいずれ痛い目にあうよ
181 :デフォルトの名無しさん2011/10/12(水) 11:23:46.66
おめでとう
あとは完成したとき、バグはありませんとか言わないように
182 :デフォルトの名無しさん2011/10/14(金) 07:18:13.37
素朴な質問なんですけど、
if とかの制御文で、判定要素を Or とかでつなぐときに、
Or の数が数十個とか百個とかの量に増やしても判定要素を大多数にしても問題は無いんでしょうか?
183 :デフォルトの名無しさん2011/10/14(金) 07:33:07.23
Orも単なる演算子。+で沢山繋ぐのと何ら変わりは無い。
ただ、それだけ増やすなら全部の式を本当に評価する必要があるか、
再検討はしたほうがいいとは思うけど。
VBAにはOrElseが無いからなあ。
184 :デフォルトの名無しさん2011/10/14(金) 07:41:26.00
ありがとうございます。実際には5個未満ぐらいにはなりそうな作業なんですが
気になったもので。

OCRソフト表のある文書をPDFからエクセルに転写したもので、OCRソフトで文字の誤読が割りと発生するので
その誤読による文字化けのようなものを正しい情報に戻すという作業の際にorで文字化けの種類分を
対応するという作業でした。
185 :デフォルトの名無しさん2011/10/14(金) 11:51:42.25
ExcelVBEで行番号を表示する方法ってありません?(Excel2007)

今は行番号を知りたいとき、エディタにコピペで持ってって、エディタの機能で行番号を表示させてんですけど。
186 :デフォルトの名無しさん2011/10/14(金) 13:48:35.20
>>185
無理
エディタにコピペするしかない
187 :デフォルトの名無しさん2011/10/14(金) 14:47:54.63
>>185
メニューの下に表示されてない?
189 :デフォルトの名無しさん2011/10/14(金) 15:46:43.29
>>186
だろうかな、、、、とは思ったんですが

>>187
まぁそれを見れば良いんでしょうけど、他のエディタみたいにパッと見て判るようにできれば、、、と
思ったんですがw

190 :デフォルトの名無しさん2011/10/14(金) 21:12:16.25
ところで行番号が必要になるってのはどういう状況なんだろう。
193 :デフォルトの名無しさん2011/10/15(土) 01:03:07.29
エクセル2003 XPです。

ファイルからデータ読み込んで、セルに書かずに
記憶してグラフにするにはどうすればいいですか?
198 :デフォルトの名無しさん2011/10/15(土) 08:28:17.58
>>193
できない…と思ってたけど
X・Yの数値を配列に入れてグラフのオブジェクトに
セットする方法があるみたいね。

chart.seriescollection.newseriesでググって
一番上に出てきたサイトの中の
5 数値を直接コードからに指定してグラフを作成するには?
にそのサンプルコードがある。
199 :1962011/10/15(土) 09:23:43.85
>>198
をを、感謝!
193じゃないけど、家に帰ったら早速ためしてみる。
194 :デフォルトの名無しさん2011/10/15(土) 01:53:25.82
セルに書かずにグラフにする

それは出来なくはないけどExcelの仕事じゃない
故にスレ違い
196 :デフォルトの名無しさん2011/10/15(土) 04:22:04.80
良く知らないんだけど、グラフのデータソースって、
セル範囲以外も指定出来るもんなの?
200 :1932011/10/15(土) 10:52:17.41
ありがとう
必ず、グラフ用にデータが並んでるとは限らないから
配列からグラフにできたら、規則性はあるけどグラフ用に
並んでいない場合とかにも応用できるので、もし出来るのら
知りたかった。
201 :デフォルトの名無しさん2011/10/15(土) 15:27:00.72
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
202 :デフォルトの名無しさん2011/10/15(土) 16:02:50.70
>>201
Debug.Printでmytxt(1, 1)を表示させればわかるけど、mytxt(1, 1)は"ABC"が入ってるぞ

>mytxt(1)の中のmytxt(1,1)に入ります
どういう状態が希望でどういう状態になってるって言いたいんだ?
203 :2012011/10/15(土) 16:19:21.24
>>202

debug.print mytxt(1,1) とするとエラーになり、
調べてみたらなぜかmytxt(1)(1,1)に"ABC"が入ってました。

コードの書き方が悪いのかと質問してみたのですが、
EXCEL起動し直してやってみたら希望の動作になってました。

原因は不明ですが、このコードに問題はなさそうですね。
ありがとうございました!
205 :デフォルトの名無しさん2011/10/15(土) 21:10:01.20
そのコードそのままでその結果になるわけはないから
違うコード書いてたんだろ。さもなくばVBAが誤動作してるってことになる

どうせmytxtを配列で宣言したとかそんなオチだろ
206 :デフォルトの名無しさん2011/10/16(日) 05:07:34.87
●を含む文字列を検索して削除、さらにこの動作を●を含む文字列がなくなるまで繰り返す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
208 :デフォルトの名無しさん2011/10/16(日) 07:58:32.85
>>206
まず制御が分かってないな
[F8]キーでステップ実行してみるといいよ

分からないメソッドはヘルプ参照するなり
ググるなりして
211 :デフォルトの名無しさん2011/10/16(日) 18:32:08.05
>>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
213 :デフォルトの名無しさん2011/10/17(月) 06:58:50.28
いるよなあ。
コードを見ると反射的に最適化しまくる香具師ってw
>>206の質問の意図も、元のコードをできるだけ残して
最小限の変更で動くようにしてあげた>>211の配慮も
まるでわかってないんだろう。

プログラムばっかりやっていて対人関係を疎かにしていると
こういう空気を読めないコミュ障になるから気をつけよう。
216 :デフォルトの名無しさん2011/10/17(月) 20:54:56.39
いるよなぁ
>>213みたいに上から目線で得意げになっちゃう子。

プログラムばっかりやっていて対人関係を疎かにしていると
こういう空気を読めないコミュ障になるから気をつけよう。
207 :デフォルトの名無しさん2011/10/16(日) 07:54:45.29
VBAに関数オブジェクトなんて無いぞ。
Deleteした時点でxが無効な状態になってそれっきりじゃん。
209 :デフォルトの名無しさん2011/10/16(日) 10:02:01.15
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

こうだな
210 :デフォルトの名無しさん2011/10/16(日) 14:56:45.02
>>209
何も解ってない初心者を騙すのは良くないぜ
212 :デフォルトの名無しさん2011/10/17(月) 06:01:38.76
こいつも制御が分かってないな

>   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が正解。
223 :デフォルトの名無しさん2011/10/18(火) 02:38:17.16
>>212はClearContentsでよければ
Set x =範囲.Find(********)
Do Until x Is Nothing
  x.ClearContents
  Set x =範囲.FindNext(x)
Loop
ってなるって教えりゃいいのに...。
あと書式が設定されてなきゃClearでも問題ないからな。
その方が早いし。 
225 :デフォルトの名無しさん2011/10/18(火) 02:42:20.44
そもそも>>223みたいなのはReplaceメソッドを使うべきだな。
227 :デフォルトの名無しさん2011/10/18(火) 02:53:47.59
>>226
>>212は>>223や>>225まで気づいてたのかねぇ。
まぁFindメソッドのヘルプの添削だから知ってるかも知らんが。
214 :デフォルトの名無しさん2011/10/17(月) 20:19:29.71
同じようなコードは俺も考えたけど、
Do-Loopの両方に抜け出し条件を付けないのも、
それはそれで嫌な感じなんだよなあ。
あと、質問者のコードはClearじゃなくてDeleteだから。
215 :デフォルトの名無しさん2011/10/17(月) 20:28:23.92
わかっててDeleteを使ってんならいいけど、なんとなくわかってない気がするんだよなあ>質問者
元ソースの書き方だと詰める方向を明示しても良さそうなのに書いてないし
217 :デフォルトの名無しさん2011/10/18(火) 00:55:59.46
ちょいと聞きたい。
料理のレシピなんかを管理したいときって、ExcelでVBA使うのとACCESS使うのどっちがいいんだろうか。
(料理名で検索したり、逆に使用している材料で検索したりしたい)
220 :デフォルトの名無しさん2011/10/18(火) 01:44:02.45
>>217
とりあえずExcel

テーブル設計ができているのならAccessだろうが
料理のレシピって、どんなテーブルを使うのか見当がつかない
221 :デフォルトの名無しさん2011/10/18(火) 01:52:45.70
>>220
検索重視ならAccessだな
材料とかジャンルとか調理方法とか、テーブルの作り方次第でどうにでもどきる
218 :デフォルトの名無しさん2011/10/18(火) 01:08:39.49
Access
219 :デフォルトの名無しさん2011/10/18(火) 01:37:32.04
>>218
サンクス!やっぱアクセスか。
値段が高いからExcelで済ませたかったんだが仕方ない。

ついでに聞きたいんだが、VBAの用途ってどんなものがある?
やっぱ計算メイン?DBと接続とか出来た気もしたんだが。
232 :デフォルトの名無しさん2011/10/18(火) 09:14:55.40
>>219
>値段が高いからExcelで済ませたかったんだが仕方ない。


RDBにするならMySQLやPostgreSQLでもいいやん
自分で使うぶんには無料だし
222 :デフォルトの名無しさん2011/10/18(火) 01:53:25.19
まぁ対人関係のよいっていうか人格者にはキレのあるコードを書けるやつが少ないのは確かだ。
226 :デフォルトの名無しさん2011/10/18(火) 02:50:09.29
コードだけ書いたんじゃ、知識のない奴には、どの回答が一番良いのか
どのコードにどういう問題があるのか解らなくて混乱する
奴の書き方は確かに諄いけど、間違ったこと書いてないし
他の回答者から見たらカチンとくるかもだけど、質問者から見たらむしろ
ありがたいだろうな
228 :デフォルトの名無しさん2011/10/18(火) 03:04:41.25
ちなみに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 :2292011/10/18(火) 03:10:11.71
>>229

● 「C列のアクティヴセルとその1こ上が同じ名前」かつ「B列」が15以上の時、

1・E列がセルない「1」の数

2・ 1の時、F列の数値の合計

3・  「1/2」を算出したい

● オーバーフローになる

● エクセルの反応がなくなる

んですがどうすればいいでしょうか?
231 :1962011/10/18(火) 08:27:09.75
>>230
きれいな日本語で書き直して。
234 :デフォルトの名無しさん2011/10/18(火) 10:32:08.13
>>230
変数bの内容が最初から最後までずっと0のまま
まずはそこを直せ
235 :2292011/10/18(火) 12:43:14.94
>>234
やり方がわかりません・・・

確かにF列の該当セルが空欄になっちゃいます・・
236 :2292011/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 :2292011/10/18(火) 13:33:34.74
>>236を実行すると「オーバーフローしました」というエラーが出てしまいます
238 :デフォルトの名無しさん2011/10/18(火) 13:50:54.13
>>237
レス直前に、変数bとRANGE修正してたか。

とりあえず、「SumIf」「CountIf」の使い方も間違ってる気がする。
変数c,dがゼロになるから、変数eの計算をゼロで除算してる。
239 :2292011/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

途中まで、転載しました。この最後の行で、止まります。もう、謎です。たすけて。
241 :デフォルトの名無しさん2011/10/18(火) 15:16:29.11
>>240
エラーが出た時、変数nexterがいくつになってるか確認
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
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行の厚さにしました。これも、応急処置です。
251 :デフォルトの名無しさん2011/10/18(火) 20:24:07.43
>>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
とするかな
258 :デフォルトの名無しさん2011/10/19(水) 11:11:51.04
>>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
の違いって何なのでしょうか
同じだったら短いほうが読み易い気もするんですが。
259 :デフォルトの名無しさん2011/10/19(水) 13:46:08.73
>>258
コードが標準モジュールにあるなら一緒 好きな方にすればいい
コードがシートモジュールにあった場合
nexter = Cells(Rows.Count, 1).End(xlUp).Row
の処理対象シートは シートモジュールのシートになる(ActiveSheetではない)
249 :これでなぜ、エラー1004ですか2011/10/18(火) 16:55:39.81
スポーツ界も格闘界も芸能界もIT業界もヤクザが幅を利かせてると
聴きましたが、興業はともかく、なんでITもなんでしょうか。
253 :デフォルトの名無しさん2011/10/18(火) 20:34:34.30
>>249
人身売買は893の専売特許
250 :9522011/10/18(火) 20:05:28.96
関数にdll使うのって、vbaのみで作った場合と比較して
計算速度としては優位になるのでしょうか。
目くそ鼻くそ?
252 :デフォルトの名無しさん2011/10/18(火) 20:28:56.25
>>250
作って比較すりゃ分かるじゃん。
俺のはdllの方が速いよ。
254 :デフォルトの名無しさん2011/10/18(火) 23:16:59.36
速度をやたら気にする人間はこれでテストすれば良い。

'ミリ秒単位での時間の計測
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
256 :デフォルトの名無しさん2011/10/19(水) 03:05:26.89
常識的に考えれば、DLLで行う処理が(呼び出しのオーバーヘッドも含めて)VBAで行う処理より早ければDLLが早いし
そうじゃないならVBAの方が早いって結果になるんだが
そこに有利も不利もないだろ
257 :デフォルトの名無しさん2011/10/19(水) 09:09:30.57
そういえばVBAにもコンパイルってあったよな
それも比較してみたら?
260 :デフォルトの名無しさん2011/10/19(水) 23:29:39.97
行番号を求めてるうちは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
261 :デフォルトの名無しさん2011/10/19(水) 23:33:55.17
なるほど、そういう違いがあったのですか。
教えてくださってありがとうございます。
標準モジュールしか使ったことがないので分かりませんでした。

もう一個、まったく別件の質問なのですが
FileSystemObjectってあるじゃないですか。
あれって皆さんどんな風に使ってるのでしょうか。
私はパブリック変数で FSO as Object を宣言して
最初のプロシージャで
Set FSO = CreateObject("Scripting.FileSystemObject")
ってやってますが、
パブリック変数はあまり使わないほうが良いらしいので、
他にもっと良いやり方があるなら教えてほしいです。

(参照設定でMicrosoft Scripting Runtimeにチェックを入れるやり方は
別PCで実行するときに面倒なのであまり良いやり方とは思えません。)
262 :デフォルトの名無しさん2011/10/19(水) 23:40:28.38
>>261
グローバル変数を使わない方法だと、別の手続きを呼び出すときには、いちいちオブジェクトもパラメータとして渡すってのが
まあ、正当と言えば正当かな

Call File_Sub_1(FSO, Data1, Data2)

みたいに
263 :デフォルトの名無しさん2011/10/20(木) 01:38:14.59
パブリックな変数はあまり使わない方がいいってのは、変数の有効範囲は狭い方が良いというのが基本的な考え方
FSOで考えれば、ほんとにFSO(のインスタンス)を使いまわす必要があるのか考えた方がいい
あとパブリックかどうかと、参照設定するかCreateObjectするかは別の話なんだが解ってるのか?
264 :デフォルトの名無しさん2011/10/20(木) 02:11:51.13
>>262
>>263
インスタンスを使いまわすとかそういう事は考えてなくて
単純に宣言とか一回で済むほうが楽だというか、
グローバル変数使うと引数で渡さずに済むんで楽でいいな、
という程度の認識しかないです。
参照設定についてはとにかくマクロのコードの中以外で完結してない事が
やっぱり面倒だという認識で敬遠してます。
CreateObjectと参照設定の件についてはあんまり意味が分かってないです。
参照設定にするとオートコレクトが使えるんでしたっけ?
という程度です。
265 :デフォルトの名無しさん2011/10/20(木) 19:33:18.65
>>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

どなたか、わかる方いましたらご教授お願いします。
267 :デフォルトの名無しさん2011/10/21(金) 09:27:50.30
グローバル変数あるとデバッグとメンテが大変なんだよね。
使用箇所は検索出来てもそれがどんな順番で実行されるか分からないし。
メソッドが変数について状態を前提としているかも分からないし。
逆に、一度初期化した後は読み取り専用って使い方はアリだと思う。
268 :デフォルトの名無しさん2011/10/21(金) 11:21:40.33
土素人ですいません。文系の学生で、できなくて困ってます。
VBAでCLEAN関数を使って、列一行改行を全部取りたいです。

SUB HOGE 

なんたら CLEAN ("A:A")

END SUB

みたいにできるでしょうか?縦一列の、改行を全部削除できたらいいです。

269 :デフォルトの名無しさん2011/10/21(金) 11:55:45.10
>>268
Clean関数は文字列しか処理できない(Rangeは受け付けない)ので、
自分で繰り返すように作る

For r = 1 To ActiveSheet.UsedRange.Row
Cells(r, 1) = Application.WorksheetFunction.Clean(Cells(r, 1))
Next
270 :デフォルトの名無しさん2011/10/21(金) 12:31:44.69
>>268-269
たとえば
With Range("A1",Range("A"&Rows.Count).End(xlUp))
  .Value=Application.Clean(.Cells)
End With
実際は文字列は一旦消してから書き出すのが鉄則なので、Variant型変数に取得して
範囲を消してから書き出す。
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に組み込めないものもあるのだろうか?
ほんと感謝

282 :デフォルトの名無しさん2011/10/21(金) 21:04:37.70
>>279
なんでループ回すの?
>>270読んだ?
285 :デフォルトの名無しさん2011/10/21(金) 22:17:30.54
>>279は>>270の間違いを正しただけだな。
For r = 1 To ActiveSheet.UsedRange.Rowは明らかな間違いだし。
286 :デフォルトの名無しさん2011/10/21(金) 22:20:19.40
すまん>>270じゃなく>>269の間違いを正したってことね。
287 :デフォルトの名無しさん2011/10/21(金) 22:30:26.40
>>285-286
なるほど、そういえばそうだな。
271 :デフォルトの名無しさん2011/10/21(金) 12:39:12.00
質問です
nmcファイルに関する質問はここでいいでしょうか
272 :デフォルトの名無しさん2011/10/21(金) 12:53:13.58
>>271
だめです
273 :デフォルトの名無しさん2011/10/21(金) 13:22:22.50
そうですか
では受付しているスレがあったら教えてください

ダウンロードしたツールのヘルプに書いてあるexeの実行について
説明がよくわからなく、自分で追加していいのか教えてほしいのが趣旨です
よろしくお願いします
276 :デフォルトの名無しさん2011/10/21(金) 14:27:56.50
明日エキスパート(スタンダード)の試験でレジストリ関係の処理をテストしてるんですが、
↓のコードがコンパイルエラーになります。(DeleteSettingステートメント)
メッセージは「引数の数が一致していません。または不正なプロパティを指定しています」
これでなぜコンパイルエラーになるのか誰か説明してくれませんか?
もう2時間も足踏みしている

'登録名:Application
pos = InStrRev(ThisWorkbook.Name, ".") - 1
APPNAME = Left(ThisWorkbook.Name, pos)

  'データ削除
DeleteSetting APPNAME

MsgBox "レジストリ掃除完了"
284 :デフォルトの名無しさん2011/10/21(金) 21:39:40.87
>>276
再現できない

レジストリエディタ見ながら
1行ずつ試してみれば?

277 :デフォルトの名無しさん2011/10/21(金) 15:08:45.89
Functionoプロシージャか他のユーザー定義関数で、関数を格納したセルの値が
参照するセルの値の変更に伴い、自動的に再計算されて正しい数になるプロシージャはないでしょうか。

例:セルA4の値=3 セルA5の値=5 セルA6の関数の値=20
左の値を3から30に変える、左のセルから他のセルへ移った瞬間、セルA6が40になる。

※例のセルA6には、ifやselect等で作られた独特なユーザ定義関数が入っているものとする。
280 :デフォルトの名無しさん2011/10/21(金) 20:25:17.58
>>277
日本語おかしいけどユーザ定義関数で解決する話じゃないの?
281 :デフォルトの名無しさん2011/10/21(金) 21:00:16.85
>>277
自分のVBA関数内でApplication.Volatileを記述すると幸せになれるかも。
355 :デフォルトの名無しさん2011/10/24(月) 09:36:34.66
>>277です。Application.Volatileでも、ダメでした。
356 :デフォルトの名無しさん2011/10/24(月) 10:10:40.93
>>355
そもそも質問が意味不明
左の値ってなんだ?
なんでA4の3を30に変えるとA6の20が40になるのかも分からんし。
ユーザー定義関数なんてのは引数をきちんと渡せば、引数の変更で普通に再計算される。
Application.Volatileなんてものは書く必要なし。
そんなもの書いてる関数のほとんどは糞関数だ。
357 :デフォルトの名無しさん2011/10/24(月) 10:25:45.25
>>355
そもそも関数にSelect使っても動かんだろ?
278 :デフォルトの名無しさん2011/10/21(金) 16:49:52.72
>関数によって簡単にVBAに組み込めないものもあるのだろうか?

WorksheetFunctionクラスのメソッドでは提供されてないものもある
CODE関数とか
まぁ他にもいろいろあるんだろうけど。
279 :デフォルトの名無しさん2011/10/21(金) 20:23:24.18
×
 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
283 :デフォルトの名無しさん2011/10/21(金) 21:11:31.57
ループ回すにしてもUsedRange.Columns(1).Cellsは下手だわな。
UsedRange.Resize(,1)とすればセルの集合になるし。
290 :デフォルトの名無しさん2011/10/22(土) 01:56:30.15
>>283
コードの可読性って知ってる?
288 :デフォルトの名無しさん2011/10/21(金) 23:25:21.00
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:="折れ線"

'実際にはユーザー定義のグラフを作成します。
'このあと実際のデータ系列を追加していきます。
289 :デフォルトの名無しさん2011/10/22(土) 01:40:03.91
>>288
2007で試したけど、TypeNameにテンプレートに保存されてる名前指定しないとエラーになるな
293 :2882011/10/22(土) 08:42:11.99
>>289
ためしにグラフのテンプレートを作ってそれを指定したらうまくいきました。
thx!
291 :デフォルトの名無しさん2011/10/22(土) 06:15:39.57
可読性はどっちも変わらないよ。
294 :デフォルトの名無しさん2011/10/22(土) 09:03:09.96
>>291
残念、ハズレ
292 :デフォルトの名無しさん2011/10/22(土) 06:21:27.04
そういえばOffset(,1)とすると可読性が落ちるとかいう先生がいたな。
Offset(0,1)としなさいみたいな。
Resizeの第一引数がないから可読性が落ちると思ってたりして。
295 :デフォルトの名無しさん2011/10/22(土) 09:57:19.71
最近vb.netやってて久しぶりにVBA でちょこっとPG組んでみたけどなんか凄い違和感を感じた。
やっぱりあまり入力補完が効かないせいかな。

可読性は大事だね。変数名とかにも拘れば、その分
説明のコメントを省略出来たりすることもあるしね。
298 :デフォルトの名無しさん2011/10/22(土) 11:08:08.95
>>295
VBAでは入力補完が効く書き方が概ねセンスのよい書き方だ。
入力補完が効かない場合でもきちんと固有の型の変数に一度代入すれば入力補完が効く。
たとえばWith ActiveSheetとやっても駄目だが、Worksheet型の変数に
Set sh = ActiveSheet
With sh
とすれば入力補完が効く。
418 :デフォルトの名無しさん2011/10/30(日) 13:25:17.86
>>416
Resizeならピリオド打つと自動メンバ表示されるがRowsは実行時バインドのItemプロパティを使ってるので自動メンバ表示されない。
With Range("A1").CurrentRegion.Rows(1)これはWith Range("A1").CurrentRegion.Rows.Item(1)の略だ。
Withでくくるときは極力Itemプロパティは使わない方がよい。
>>298も読むように。
419 :4162011/10/30(日) 13:37:49.32
>>418
非常に分かりやすい説明ありがとうございました。
「Resize」の表記で直感的に意味がわかるようになることが
良いVBA使いに至る道のようですね。
297 :デフォルトの名無しさん2011/10/22(土) 11:05:35.02

欲しいのは1列目のセル集合

? 使用範囲 の 列(1) の セル

? 使用範囲 の サイズ変更(,1)

はてさて、、、
299 :デフォルトの名無しさん2011/10/22(土) 11:10:30.77
>>297
その人のレベル。
300 :デフォルトの名無しさん2011/10/22(土) 11:12:30.41
欲しいのは1列目のセル集合
? 使用範囲 の 列(1) の セル
? 使用範囲 の サイズ変更(,1)
はてさて、、、
302 :デフォルトの名無しさん2011/10/22(土) 11:15:55.78
? 使用範囲 の 列(1) の セル
? 使用範囲 のセル集合のサイズ変更(,1)
だな。
UsedRangeはセル集合を最初から返すから、セルの集合のまま使った方が手っ取り早い。
303 :デフォルトの名無しさん2011/10/22(土) 11:42:21.69
> UsedRangeはセル集合を最初から返すから、セルの集合のまま使った方が手っ取り早い。
> UsedRangeはセル集合を最初から返すから、セルの集合のまま使った方が手っ取り早い。
> UsedRangeはセル集合を最初から返すから、セルの集合のまま使った方が手っ取り早い。
> UsedRangeはセル集合を最初から返すから、セルの集合のまま使った方が手っ取り早い。
> UsedRangeはセル集合を最初から返すから、セルの集合のまま使った方が手っ取り早い。
304 :デフォルトの名無しさん2011/10/22(土) 11:46:00.34
>>303
分かり切ったことを5回も書かなくていい。
つまり
?セル集合の使用範囲の列集合の列(1) のセル集合
?セル集合の使用範囲のサイズ変更(,1)
ってことだろ?
306 :デフォルトの名無しさん2011/10/22(土) 13:45:11.77
Sheet1の使用範囲の2列目のセル集合なら
Sheet1.UsedRange.Columns(2).Cells
Sheet1.UsedRange.Resize(,1).Offset(,1)
などがあり、とりたてて後者を推奨するわけではないが、1列目に限れば
Sheet1.UsedRange.Resize(,1)がすっきりしてるわな。
上級者ほどResizeを使うだろうな。
308 :デフォルトの名無しさん2011/10/22(土) 14:16:01.87
>>307は下手くそな成りすまし
>>306ではない
おまえは下手を自覚した方がいい。
307 :デフォルトの名無しさん2011/10/22(土) 14:06:46.59
失礼、
上級者ほどResizeを使わないだろうな。
の誤りです。
309 :デフォルトの名無しさん2011/10/22(土) 14:29:00.56
話反れるけどVBA上級者ってどんな人?
PGならVBから入った人が多くて、そっちの機能で大体の事は出来ちゃうと思うし、
現場で使う人は、機能は知っててもプログミングの基礎知識が無いだろうし。

自分の周りに上級者が居ないので気になりました。
310 :デフォルトの名無しさん2011/10/22(土) 14:34:35.64
全くの素人です。あるフォルダ―の中のエクセルファイルがあります。
のファイルの中にはいろいろ個別のデータが書き込まれているのですが、
中身チェックのマクロとか組めば、各ファイルを開いて簡単に中身を読み込んで、
一覧表みたいなのはできるのでしょうか?
314 :デフォルトの名無しさん2011/10/22(土) 15:18:10.23
>>310です。 ぐぐったら出てきました。 自己解決です。
312 :デフォルトの名無しさん2011/10/22(土) 14:46:31.92
できる事も、やれる環境も限られてるからな
プレハブで豪邸が建たないとの同じようなもんだ
プレハブにはプレハブのいい所があるんだから、そこを重視すべき
313 :デフォルトの名無しさん2011/10/22(土) 15:04:06.01
たまに、「うちの業務は全部この Excel 帳票でやってます」
なんてのがあるけど、物には限度ってものがあるよな。
315 :デフォルトの名無しさん2011/10/22(土) 15:29:52.56
「上級者ほど〜を使う」というのは、上級者じゃないと把握出来ない
つまり「上級者ほど〜を使う」というのは、「俺は上級者」と遠回しながらドヤ顔で言ってるのと同じ

しかも、自分の書いたものを、他人が上級者認定してるかのように自演してまで

うわぁ、痛すぎw
316 :デフォルトの名無しさん2011/10/22(土) 16:17:33.95
309だけど自演じゃないよ。
「プレハブ工法を知り尽くした男」に尊敬や憧れなんて無いし。
偉いとは思うけどね。
やっぱ上級者を育てる土壌がないのか、危険な言語だわ
318 :デフォルトの名無しさん2011/10/22(土) 16:41:24.11
というか、想定用途が違うんだから、VBA 以外でやったら上級者とかいう話じゃないでしょ。
むしろ、VBA で済ますべきか他の方法を使うべきかを見極められるのが上級者。
322 :デフォルトの名無しさん2011/10/22(土) 18:59:45.85
>>316
プレハブの例え挙げたの俺だけど、>>318が正解
震災の仮設住宅設営で、一級建築士も宮大工も必要ない
言語は道具なんだから、きっちり使いどころを押さえているのが肝要

まぁプレハブ工法を極めるのもアリでしょ
かなりのスピードと精度を求められると思うが
319 :デフォルトの名無しさん2011/10/22(土) 16:53:54.68
> 1列目に限れば
条件を勝手に限定せず
条件が変わっても違和感無く柔軟に対応できる方法を使うのが上級者

特定条件での端的なすっきりさを優先して、1列目ならResize、2列目以降ならColumnsと
やりかたをコロコロ変えるのが初心者
327 :デフォルトの名無しさん2011/10/22(土) 19:22:30.80
ちょい遅かったか。
>>324-325は>>319か?
332 :デフォルトの名無しさん2011/10/22(土) 19:52:23.38
>>324=>>319だったらかわいそうだな。
321 :デフォルトの名無しさん2011/10/22(土) 18:51:17.38
実行時バインドのItemプロパティを多用する奴に上級者はいない。
323 :デフォルトの名無しさん2011/10/22(土) 19:01:05.96
おまいら1行目にいろんな処理をするときどちら使う?
その1
With Range("A1").CurrentRegion.Rows(1)
  .****.***
  .****.***
  .****.***
End With

その2
With Range("A1").CurrentRegion.Resize(1)
  .****.***
  .****.***
  .****.***
End With
328 :デフォルトの名無しさん2011/10/22(土) 19:25:18.84
>>323
どちらが楽かと言われれば当然後者だわな。
416 :デフォルトの名無しさん2011/10/30(日) 11:32:07.66
>>323>>328
の話にあった
With Range("A1").CurrentRegion.Rows(1)
より
With Range("A1").CurrentRegion.Resize(1)
の方が楽、というのがわからないです。どういう場合に楽なんでしょう?
可読性は前者の方が高いと思うのですが??
324 :デフォルトの名無しさん2011/10/22(土) 19:18:38.01
Range(場所).Columns(1)
326 :デフォルトの名無しさん2011/10/22(土) 19:20:37.77
>>324
どちらへのレス?
334 :デフォルトの名無しさん2011/10/22(土) 20:04:13.88
>>324-325ならどっちにしてもかわいそう
333 :デフォルトの名無しさん2011/10/22(土) 19:59:37.98
一方を書いたの俺だが、=はハズレなので可哀想じゃないわけだね
337 :デフォルトの名無しさん2011/10/23(日) 01:58:17.38
VBAスタンダードクラウン日本第1号講師のVBA講座 - YouTube
www.youtube.com/watch?v=ZNx8aq9ZIvI

これの Test4_1_6のプロシージャなんだけど
制御がひどくないか

Worksheets("Sheet1")がWorksheets("Test")より左にあったら
実行時エラーだし

VBAに関わらず、こんな制御を書く人間はプログラミングしないでくれ
338 :デフォルトの名無しさん2011/10/23(日) 02:48:03.74
>>337
何この上から目線
人が何書こうが勝手だろうに
339 :デフォルトの名無しさん2011/10/23(日) 07:29:17.41
>>337
ループの回し方の講座だろ?
Worksheets("Test")はない前提だから別にいいんだよ。
そもそもシート名を書き換えるなら普通はループは回さないし。
またコードなんか隅々まで考慮に入れて書いてたら2〜3倍の記述量になるから講義にはならん。
340 :デフォルトの名無しさん2011/10/23(日) 09:41:01.03
厨房でも設問の「ただし空気抵抗は考慮しない」云々の但し書きに
あーだこーだぬかす奴がいるでしょ
それと同じだよ
問題の本質を捉えられない馬鹿は普通にいる
344 :デフォルトの名無しさん2011/10/23(日) 16:58:43.47
ん?Testシートが既存の状態でsheet1が先に見つかったら同じ名前を付けようとしてエラーになるやん。

でも講座用なら別にこんなん普通やろ。>>340に同意だな。
341 :デフォルトの名無しさん2011/10/23(日) 10:10:32.61
擁護がひどいな

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
346 :デフォルトの名無しさん2011/10/23(日) 18:12:07.64
普通のExcelの初期状態の新規ブックはSheet1とかSheet2って名前になってるよな。
別に>>341みたいに目くじら立てる問題じゃないな。
講義用ならありだと思う。
ほんまもんのプロが>>341みたいな不細工なコード書いてたらプロとして失格だが。
343 :デフォルトの名無しさん2011/10/23(日) 16:57:01.73
シート名の"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
なんてなるんだろうけど。
345 :デフォルトの名無しさん2011/10/23(日) 17:06:56.96
おっと、たとえばグラフシートに"Test"とかあった場合上ではNGか。
shをObject型で宣言して
Set sh = Worksheets(TO_NAME)じゃなく
Set sh = Sheets(TO_NAME)だな。
560 :デフォルトの名無しさん2011/11/09(水) 08:41:58.50
ワークシートと決まってればSheetsは間違い。
何か分からないときにSheetsを使う。
たとえば>>343の修正の>>345とか。
347 :デフォルトの名無しさん2011/10/23(日) 19:13:50.91
単純に、Forループを2回廻すとか、

Sheet1のインデックス取っておいて
Forループ出てからファイル名変更するとか、

すれば、講座の趣旨にも沿うだろ

>343とかw
348 :デフォルトの名無しさん2011/10/23(日) 20:21:54.46
スタンダードクラウンなんて資格は知らんが、大体資格なんてあてになるのか?
MVPなんかかなり酷いぞ。
349 :デフォルトの名無しさん2011/10/23(日) 20:25:29.08
訂正
全員ひどいってわけじゃないと思うが、ひどいのがいるって話ね。
351 :デフォルトの名無しさん2011/10/23(日) 22:53:10.63
エラー処理ってどこまで配慮するかのサジ加減が良く分からない。
自分で使うマクロなら例えば数字の入力を要求するところに文字は入れないし、
エラーで止まっても原因の見当がつくから適当に書いちゃってる。
でも人に使わすものだと相手がどんな使い方するか分からないから
エラー処理きちんとやらないとあとで文句言われてめんどくさい。
352 :デフォルトの名無しさん2011/10/23(日) 23:49:30.14
MVPはサイトを立ち上げてティップスをいっぱい並べておけば誰でもなれる。
ティップスの質は関係ないよ。
358 :デフォルトの名無しさん2011/10/24(月) 10:32:23.54
selectは使っておりませんが、functionプロシでifを使ってます。
ユーザー定義関数でifは使えないんですか?

>なんでA4の3を30に変えるとA6の20が40になるのかも分からんし。
ユーザー定義関数で、数が変わるのを表現しました。
359 :デフォルトの名無しさん2011/10/24(月) 10:33:33.47
あと、プロシージャを標準モジュールに入れているのも、原因でしょうか。
360 :デフォルトの名無しさん2011/10/24(月) 10:44:41.45
きちんと引数を使ったら、自己解決しました。すみませんでした。

お礼に「9歳から14歳」を2ちゃんねる検索したらヌケる、この情報をお教えします。
362 :デフォルトの名無しさん2011/10/24(月) 12:37:46.40
>なぜ縦に列で出るのでしょうか????

そらぁ縦に出るように指定してるからだろ w
366 :デフォルトの名無しさん2011/10/24(月) 14:27:46.55
>>362-364 ありがとうございます。デフォですかこれ。
Cells(y,x)と指定するんですね。
371 :デフォルトの名無しさん2011/10/24(月) 19:06:42.47
>>366
これは生きている人間?
365 :デフォルトの名無しさん2011/10/24(月) 14:20:27.89
こういう、定義をあいまいなまま放置する人が6+5×3=33という計算をしちゃうのかねぇ?
368 :デフォルトの名無しさん2011/10/24(月) 14:56:33.92
x,yじゃなくてrow,colで考えれば自然
369 :デフォルトの名無しさん2011/10/24(月) 15:06:46.18
>>368
なぜ自然なのだ?
372 :デフォルトの名無しさん2011/10/24(月) 20:45:11.72
計算プログラムを作っています。
列を一次元配列にfor文で入れるところが処理速度のボトルネックだと
わかったのですが、高速で代入できる方法はありますか?
どんな方法でも構いません。
配列はdllに渡します。
374 :デフォルトの名無しさん2011/10/24(月) 21:50:49.42
>>372
Excelのバージョンは?
375 :デフォルトの名無しさん2011/10/24(月) 23:06:28.04
>>373
ありがとうございます。
試してみます。

>>374
2003です。
373 :デフォルトの名無しさん2011/10/24(月) 20:53:34.18
Range.Valueで、Variantの二次元配列として取り出す。
自前のdllならVariantの二次元配列を直接処理できるようにすればなお良し。
381 :デフォルトの名無しさん2011/10/25(火) 08:10:31.17
>>375
2003ならVariant変数に
a =WorksheetFunction.Transpose(列)とすればaは1オリジンの一次元配列になる。
65536行を超えることのある2007以降では怖くて使えない。
今後のことを考えると>>373のいうとおり、二次元配列を処理した方が無難かも。
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
みたいにテキストに改行された状態で書き出したいのですが可能でしょうか?
377 :デフォルトの名無しさん2011/10/24(月) 23:12:21.56
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

379 :デフォルトの名無しさん2011/10/25(火) 00:16:55.31
>>377-378
すみませんありがとうございます

もし宜しければ
変数内に\tがあればテキストにタブに変換されてるようにしたいです
これも教えてください。
382 :デフォルトの名無しさん2011/10/25(火) 13:20:07.31
2003でオンライン会議してみたいのですが、「ディレクトリサーバ」はどうするのでしょうか。

あと、エクセルで社外のネットワークを介してチャットやホワイトボードするのは今現在、一般的なのでしょうか。
383 :デフォルトの名無しさん2011/10/26(水) 12:27:58.98
テンプレから判断するとスレ違いだと分かっているのですが、他にきくべきスレが見あたらないので、ここで質問させてください。

あるオブジェクトのプロパティ(メンバ)一覧を取得するにはどうしたら良いのでしょうか?
JScript の for(in) のようなことがしたいです。
(当然ですが)直接 For Each In に渡してもだめでした。
384 :デフォルトの名無しさん2011/10/26(水) 12:54:36.28
>>383
ExcelじゃなくてAccess VBAの例だけど、応用できないかな?
ttp://www.accessclub.jp/bbs5/0044/vba14224.html
393 :3832011/10/26(水) 19:40:05.57
>>384
これは行けそうです!
非常に助かりました。ありがとうございました!!
385 :デフォルトの名無しさん2011/10/26(水) 13:22:26.89
10個の連続したセルを赤から白までの
グラデーションっぽく色を変えて塗りつぶしたにのですが、
ColorIndexの数字は一つ一つ調べておくしかないですか?
赤の数字を基準に一定の数字を足すなり引くなりすると
グラデーションっぽくなるとか、そういう方法はないでしょうか?
386 :デフォルトの名無しさん2011/10/26(水) 13:52:48.38
>>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
388 :デフォルトの名無しさん2011/10/26(水) 14:12:10.53
>>386は手抜き
より厳密にやるなら
r * 25.4
の部分を
Int((r - 1) * 28.4)
にすると正確に0から255までのグラデーションになる
415 :デフォルトの名無しさん2011/10/30(日) 11:05:13.30
遅レスですが
>>386>>388の
25.4とか28.4という数字は、どこから出てきた数字なんでしょうか?
389 :デフォルトの名無しさん2011/10/26(水) 16:54:37.93
Excel2003で、コントロール・ツールボックスからイメージを配置してピクチャーも設定しました。

そのイメージが、左クリックで選択できなくなりました。
このイメージを編集したいのですが、どのようにすればよろしいでしょうか。
390 :1962011/10/26(水) 17:22:28.07
>>389
デザインモードをオンにしたら出来ないかな?
391 :デフォルトの名無しさん2011/10/26(水) 18:18:03.41
>>389
選択モードにするとか
ツールバーの白い矢印(マウスカーソルと同じ)のアイコンをクリックね
394 :デフォルトの名無しさん2011/10/27(木) 11:26:22.50
>>390>>391
デザインモードのタグも、白い矢印のタグも、Excel2003だからか、見当たりません。
395 :デフォルトの名無しさん2011/10/27(木) 12:05:24.34
>>394

Excel2000の場合ですけど、
[表示(V)] > [ツールバー(T)] と進み、
[コントロールツールボックス]にチェックを入れると
デザインモードのボタンが表示されます。
(ツールバーの余白部分で右クリックしても同様の操作が可能です。)
デザインモードにすればイメージの編集が可能でした。
392 :デフォルトの名無しさん2011/10/26(水) 19:22:54.69
Excel2007 グラフのソース変更の質問です

元からあるグラフのデータ範囲を変更したいのですが
SetSourceData を使って設定しようとしています

ここで、複数のデータ範囲を一つのグラフに入れたいのですが
.SetSourceData Source:=(Range(A1:E1,A3:E10))
のように、セルの名前を使った指定方法ならうまくいくのですが
Function関数などを使っているので、セルの座標をCellsで指定しなければいけません

どうしたらよいでしょうか?
396 :デフォルトの名無しさん2011/10/27(木) 12:26:02.88
解決しました。2007とレイアウトが大幅に変わってて、気付くことが多かったです。
397 :デフォルトの名無しさん2011/10/27(木) 16:07:55.38
Excel2007だけど、?なので教えてください
Formを挿入すれば参照設定で自動で
Microsoft Forms 2.0 Object Libraryにチェックが入りますけど
フォームを削除してこの参照のチェックをオフにしようとすると、
画像のようなメッセージが出てオフに出来ないっす。
一旦Excelを閉じてもう1回開いてからでも駄目でした。
要らなくなったんだから、参照しないようにしたいんですけど

http://www.dotup.org/uploda/www.dotup.org2188169.jpg

398 :デフォルトの名無しさん2011/10/28(金) 09:35:51.90
2003です。
たとえばa+bを計算するときに、
一度目はセル(1.1)、(1,2)を読み込んで、計算、
(1,2)の値を変更して再計算するときに、(1,1)は読み込まずに一度目に読み込んだ値を使用して計算することは可能でしょうか。
399 :デフォルトの名無しさん2011/10/28(金) 11:41:14.12
>>398
a = Cells(1, 1)
b = Cells(1, 2)
一回目 = a + b
Cells(1, 2) = 別の値
'再計算
b = Cells(1, 2)
二回目 = a + b
404 :デフォルトの名無しさん2011/10/28(金) 16:31:51.41
>>399
ありがとうございます。
staticで実現できました。
400 :デフォルトの名無しさん2011/10/28(金) 12:16:49.27
仕事でどうしても使わなきゃならなくなったんだけど、VBAって理不尽なエラーが多く出ないかい?
まあ、おじさん初心者が基礎をすっとばかして適当に組んでるのが原因ってのは解ってんだけどね
401 :デフォルトの名無しさん2011/10/28(金) 12:43:23.12
>>400
どんなアプリでもマクロ言語ってのはどうしてもそうなる。
それでもVBAはメジャーな分比較的きちんとしてるほう。
402 :デフォルトの名無しさん2011/10/28(金) 13:09:42.58
>>400
VBAに限らないよ
どんなプログラムでも素人が組むとエラーだらけになる

まともなアプリって、全体の半分ぐらいはエラー対策だったりするし
想定外の事態を事前にどれだけ予測してどれだけ対処できるかでプログラマーの腕がわかる
407 :デフォルトの名無しさん2011/10/28(金) 18:57:00.97
>>401
そんなもんなんですねぇ
今やっと、大体の画面作りが終わったので、これから計算や文字処理のルーチンを書いてく予定です
画面でこれだけ苦労したのに、本当に最後まで作ることができるんかいなと・・・
でもやるしかないんで、騙し騙しでも頑張るです
414 :デフォルトの名無しさん2011/10/30(日) 10:14:54.03
>>402は古いと思う
403 :デフォルトの名無しさん2011/10/28(金) 16:03:56.66
でも掲示板での質問にエラー対策が完璧な回答をしても喜ばれない。
コメントも同じ。
回答は本筋だけ示せばよい。
406 :デフォルトの名無しさん2011/10/28(金) 17:57:27.41
>想定外の事態を事前にどれだけ予測して

予測してたら想定外じゃないだろ
408 :デフォルトの名無しさん2011/10/28(金) 20:29:58.72
というか、「理不尽な」エラーなんて出た記憶がないな
410 :デフォルトの名無しさん2011/10/28(金) 21:08:04.44
エラー時にエラートラップされていない場合のみ止める設定の時に、
たまに数字だけのエラー表示があるのが、一寸鬱陶しくはある。
まあ、エラー時に止める設定にすれば判るから大して困りはしないが。
411 :デフォルトの名無しさん2011/10/29(土) 00:17:47.48
むしろ正常に動作していないのにエラーも何も出さないってのがMSのソフトには多いから困る
413 :デフォルトの名無しさん2011/10/30(日) 09:45:17.96
初心者です。

変数型によるメモリの使用量の違いを知りたくて

sub test()
debug.print application.memoryused
dim a as byte
a=1
debug.print application.memoryused
end sub

と byteをvariantに変更して比較したのですが使用量が変わりません。
どうしてなのでしょうか?
417 :1962011/10/30(日) 11:51:53.93
良く分からんけど、
mov ax,0
の代わりに
xor ax,ax
するようなもん。
420 :4162011/10/30(日) 13:40:10.44
>>417
アセンブリ言語が良くわからないので
喩えがあまり理解できませんでしたが
回答ありがとうございました。
421 :デフォルトの名無しさん2011/10/30(日) 21:15:04.72
UserFormについて質問です。
(XP&Excel2000,2003)

複数のフォームを開閉するマクロを組立て中です。
この時、1枚目を完全に閉じた上で、2枚目のフォームを開くことはできないでしょうか。
変数受け渡しでうまくいかないかと試行中。
Google先生はLoad/Showしか教えてくれない…。
424 :デフォルトの名無しさん2011/10/30(日) 23:25:05.89
>>421
どんなエラー?
425 :4212011/10/31(月) 06:57:57.73
>>424
マクロ本体が無いので少し説明不足でした。申し訳有りません。

ダミーで確認してみたところ、
「既にフォームは表示されています。モーダルにできません。」でした。
CommandButtonでの操作は問題ない(ように思う)のですが、
右上の×ボタン操作を閉じた時の動作が思うように行きません。
423 :4212011/10/30(日) 23:01:29.14
普通に
Unload Me
UserForm2.show

みたいにしてもフォームが消えなかったり、
先ほど開いていたフォームを開きなおすとエラーが出る等、かな。
426 :デフォルトの名無しさん2011/10/31(月) 07:38:25.66
Aフォームのボタンから別のBフォームを表示させ、その時にAフォームを消す
んで、Bフォームを消してまたAフォームを表示させる
ってことやってるけど、全然そういうエラーは出たことはない

>変数受け渡しでうまくいかないかと試行中。


フォームを開くのに変数受渡しって何?
427 :4212011/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のみ、右上×ボタンは封印」
というのも考え中ですが、こちらで何かいい案が聞けないかなと…。
428 :デフォルトの名無しさん2011/10/31(月) 10:00:43.25
UserForm_Terminate()
に書けばいいよ
429 :デフォルトの名無しさん2011/10/31(月) 10:15:02.07
>>428
回答がお早い…。

Terminateでも同じフォーム開きなおすと、閉じるボタン聞かなくなりますねぇ。
他のボタンも動かなくなるのも同じです。
430 :4262011/10/31(月) 10:15:44.13
こっちはExcel2007

Query_Closeでやはり
既にフォームは表示されています。モーダルにできません。
というメッセージが出るね。

まぁ早い話、これを使ってのフォームの操作は諦めろってことでは?
432 :4212011/10/31(月) 10:50:03.25
おぉ…完成しました。
開き方ひとつでこうも変わるものなんですね。

回答くださった方々、ありがとうございました。
少しずつですが勉強頑張ります。
433 :デフォルトの名無しさん2011/10/31(月) 20:26:14.54
このスレの趣旨と合うかどうか微妙ですが質問です。

オフィス2007使用で、会社のパソコンのマイドキュメント内に自分のフォルダを作成しそのフォルダを信頼する場所に指定して
その中で自分が直接作ったファイルのみを使用してます。この状態で他人が作ったマクロ有効ファイルを一切使わない場合、
マクロウィルスなどの被害にあう可能性はありますか?
434 :デフォルトの名無しさん2011/10/31(月) 21:39:37.48
>>433
マクロウィルス「など」ってちょっと曖昧ですね。
マクロウィルス以外の被害は想定しなくても良い前提なんですか?

まぁ、仮にエクセルのマクロウィルス限定だとしても
ほかの前提条件が不明だから可能性はゼロにはならないです。
たとえば、他人が勝手にそのPCを使って出所不明のマクロを実行してしまう。
なんてのはどうです?

ってそういう頓知を聞きたいわけじゃないですよね。

そのPCを自分以外は誰も使用しなくて、自分自身でマクロウィルスを作成・実行しない。
という前提ならエクセルのマクロウィルスの被害には遭わないです。
要は信頼する場所云々以前に出所不明のマクロを実行しないというのが肝であって
それさえ守れば後は関係ないです。(あくまでもマクロウィルス限定の話ですけれど)
441 :4342011/11/01(火) 06:15:52.26
>>433
酷い職場ですね。
そんなんじゃあマクロウィルス以前に
どんなマルウェアに感染されてるか分かったもんじゃないですね。

ちなみにうちの会社だとインターネットにつながってるPCと
社内のネットワークだけにつながってるPCの2系統のネットワークがあって、
業務は社内ネットワーク上のPCでしか作業してないです。
外部記憶メディア(USBメモリなど)の使用も禁止です。
普段はそっちで仕事していて、
調べものとかがあるときだけインターネットにつながったPC使ってます。
442 :デフォルトの名無しさん2011/11/01(火) 14:06:28.11
>>441
うちもそういう構造してるけど、アップデート関係が完全に放置されてる。
隔離すればある程度安全には違いないんだが、
年1回ほど「ウイルス発見されたー もちこむなー」って言ってるよ。
443 :デフォルトの名無しさん2011/11/01(火) 14:48:13.78
>>441
IT系じゃないよね?
445 :4342011/11/01(火) 19:53:43.66
>>443
ちがいます。
専門的な作業は外注しますし、
私はプログラマーとかじゃないのでVBAもろくに使えません。
でも簡単なマクロでも自分の仕事には十分役立ちます。
446 :デフォルトの名無しさん2011/11/02(水) 09:34:22.37
>>445
ウィルスって騒ぐほどの会社ならいいが。
世間一般的な(家庭レベル)セキュリティで十分な気がするけどな。
例えば、世界が認める日本企業なんかにいるんなら、そのサーバーを
ターゲットにするだろ?

一般企業でウィルス感染は、いわば社会人のモラル欠如の結果、
変なサイトにアクセスし感染って感じじゃね?だいたい一般的な
会社をターゲットにするなんて考えられない。メリットなしだ。

今のウィルスはマルウェア型で個人情報(カード情報)の抜き取り
がメインになりつつある(日経PC情報)。あまり、そこに力いれん
方が良いと思うけどな。

あとウィルスソフトのフリーも入れない会社自体も問題あるけどね!
長文すまん。むかつくやつはスルーしてくれ。
435 :デフォルトの名無しさん2011/10/31(月) 22:07:49.81
あるかないかで言えば、アドオンが感染とかExcel本体が感染とか常駐型に感染とか、
マクロファイル以外にも感染ルート、可能性はいくらでもある
436 :4332011/10/31(月) 22:35:31.24
ありがとう。
いちおう自分がVBAを使い始めた事が原因で感染しなければ良いので。出所不明のマクロ使用しないですし大丈夫ですね。
会社がセキュリティソフト導入しないので、エクセル以外からの感染は仕方ない状態です。

共用してるもう一人が、俺のファイルが重すぎる、お前なんかしただろとわけわんない言いがかりをつけられてて一応自分のせいではないことを確認したかったのです。
437 :デフォルトの名無しさん2011/10/31(月) 23:56:58.15
嫌な現場だなw
そんな心配しなきゃいけない位なら
そんな所やめてしまえばいいだろうに。
438 :デフォルトの名無しさん2011/11/01(火) 00:05:05.81
>会社がセキュリティソフト導入しないので



すげぇ会社だな、ヲイ
440 :デフォルトの名無しさん2011/11/01(火) 03:59:10.14
本当に自分が直接作ったファイルしか使わないなら安全かもしれんが
ウィルスってのは、ファイルを書き換えたりするんだぞ
お前が作ったそのままだと思ってるファイルが実はこっそりウィルスに感染してる可能性は排除できんぞ
444 :デフォルトの名無しさん2011/11/01(火) 17:08:02.57
>年1回ほど「ウイルス発見されたー もちこむなー」って言ってるよ。

「ウイルス発見されたー ちんこもむなー」に見えた。
疲れてるな、俺。
447 :デフォルトの名無しさん2011/11/02(水) 10:57:04.17
無防備なPCはそもそもネットにつなぐな

普段使うようなサイトでも改ざんされたりしてるだろ
相手のサーバがクリーンかどうかチェックできないのに
変なサイトかどうかは判断できない
448 :デフォルトの名無しさん2011/11/02(水) 14:16:05.36
>>447
>普段使うようなサイトでも改ざんされたりしてるだろ
ほんとに?

>変なサイトかどうかは判断できない
エロサイトやフリーダウンロード横行しているサイト
検証してアップいるサイトならOK。
449 :デフォルトの名無しさん2011/11/02(水) 14:17:29.21
変なサイトってここの事か?
昔ノートンが誤検知して大騒ぎした事があった
450 :デフォルトの名無しさん2011/11/02(水) 14:19:00.18
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で制御する方法を教えてください。
454 :デフォルトの名無しさん2011/11/02(水) 20:39:14.89
>>452
.GetVoices().Item(n)
453 :デフォルトの名無しさん2011/11/02(水) 20:02:24.73
読み上げについてです
コントロールパネルから読み上げる音声(sam,kenji,naoko)を設定できるそうですが
どうればよいのでしょうか?
455 :デフォルトの名無しさん2011/11/02(水) 21:20:33.70
>>453
そのままOKボタン押せば設定されますよ
456 :デフォルトの名無しさん2011/11/03(木) 10:53:32.25
>>455
コントロールパネルのどこで?
457 :デフォルトの名無しさん2011/11/03(木) 11:46:58.15
http://www.geocities.co.jp/SiliconValley-Bay/2717/VBA/excel_026.htm
コントロールパネルに「音声認識」がある場合に動作します
458 :デフォルトの名無しさん2011/11/03(木) 11:49:39.30
>>457
ニャイ場合は?
461 :デフォルトの名無しさん2011/11/03(木) 13:38:29.29
使用ソフトexcel2003で質問です。
ある特定のフォルダにある複数のエクセルファイルから,幾つかの条件でデータを抽出し,
新規のエクセルファイルに集約するマクロを作りたいと思っています。お力を拝借いただきたいです。

○元データ
あるフォルダに顧客データファイル(氏名,都道府県,郵便番号,電話番号,性別,などが一行に並んでいる)が複数ある。
仮にファイル名「顧客1」「顧客2」……とする。

○抽出条件
例えば,氏名が「田中」または「斉藤」,かつ都道府県が「神奈川」「山梨」「鹿児島」「北海道」「沖縄」のいずれか,
かつ性別が「男」。など複数の条件

○作成ファイル
元データと同じ項目並び順で,条件に該当した顧客データを一つのエクセルファイルに収める

オートフィルタとコピペを繰り返せばよいかと思ったのですが,私の知識では複雑な条件に
対応させることができませんでした。上記の都道府県の例のように最低5つのキーワードで抽出を可能にしたいです。
どなたかそれらのコードを記述していただけませんでしょうか?
463 :デフォルトの名無しさん2011/11/03(木) 15:25:20.59
>>461
こんなページが有ったよ。
参考にできるんじゃないか?
http://www.eurus.dti.ne.jp/yoneyama/Excel/vba/vba_autofilter.html
464 :デフォルトの名無しさん2011/11/03(木) 16:02:54.01
>>461
ExcelファイルにSQL投げればいいんじゃないかな
465 :デフォルトの名無しさん2011/11/03(木) 22:01:10.50
>>461
サンプルを用意すればそれに応じて
書いてみてもいい
466 :デフォルトの名無しさん2011/11/03(木) 22:23:55.12
データの件数によっては、VBAじゃ遅すぎて実用にならないんじゃ・・・。
467 :デフォルトの名無しさん2011/11/04(金) 03:28:43.61
元データがエクセル表だってんなら、何でやっても大差はでない気はするが
468 :デフォルトの名無しさん2011/11/04(金) 08:24:28.27
100件ぐらいまではたいした違いはないだろうけど、数千件、数万件となってくると、
一旦 CSV で出力して、Perl かなんかで処理したほうが、
CSV出力の手間を込みで見ても断然早いんじゃないかな。
469 :デフォルトの名無しさん2011/11/04(金) 09:33:12.22
ひとつのExcelファイルにまとめるスクリプトを書いてあげたよ。
http://codepad.org/2O4Mh3PV
まあこれを超えるものは作れないだろう。
470 :デフォルトの名無しさん2011/11/04(金) 10:15:22.29
>>469
あなたすごいですねぇ。
こんな上級者がこのスレにいたとは!!!
472 :デフォルトの名無しさん2011/11/04(金) 11:38:07.14
>>469
何コレ。天才じゃないの?
476 :デフォルトの名無しさん2011/11/04(金) 12:54:04.07
>>469 >>470 >>472
自演乙()
477 :デフォルトの名無しさん2011/11/04(金) 18:31:44.08
>>469
こういうのをサクッっと作れちゃう人尊敬する
473 :デフォルトの名無しさん2011/11/04(金) 12:18:24.35
初心者です。
アクティブセルの列番号は ActiveCell.column で取れますが、
フィルターをかけて非表示の列ができると結果が変わってきます。
フィルターをかけた状態で元の列番号を取ることはできるのでしょうか?
出来る方法があれば教えて下さい。
474 :デフォルトの名無しさん2011/11/04(金) 12:24:27.86
さすがの俺もそれは知らないなぁ
475 :デフォルトの名無しさん2011/11/04(金) 12:35:17.76
>>474
サンクスです
479 :デフォルトの名無しさん2011/11/05(土) 00:08:29.18
誰かExcel2003で下がエラーになるかどうか試してくんない?
俺は2007同様エラーになると思うんだが、エラーにならないと言ってるやつがいるもので。
Sub hage()
Dim a(1 To 65537) As Long
MsgBox WorksheetFunction.Match(0, a, 0)
End Sub
481 :デフォルトの名無しさん2011/11/05(土) 09:37:23.44
>>479
Excel2000の場合だと、

Dim a(1 To 5461) As Long

までならOKで、

Dim a(1 To 5462) As Long

以上だと

実行時エラー '13':
型が一致しません。

てのが出る
482 :デフォルトの名無しさん2011/11/05(土) 11:16:59.21
>>481
トン。
2000の制限は俺も知ってたんだけど、2003は2007同様65536までじゃないのかな〜。
483 :デフォルトの名無しさん2011/11/05(土) 11:45:41.27
>>482
2003でやったところ、65536だとOK
484 :デフォルトの名無しさん2011/11/05(土) 18:51:59.71
>>483
65536でOKなのは知ってるが65537じゃどうなの?
487 :デフォルトの名無しさん2011/11/05(土) 20:42:14.70
もういいわ、誰か他の人に聞きたい。
Excel2003で次のコードはエラーになる?

Sub hage()
Dim a(1 To 65537) As Long
MsgBox WorksheetFunction.Sum(a)
End Sub
490 :デフォルトの名無しさん2011/11/05(土) 20:52:42.28
>>487
エラーになったらエラいこっちゃ。
488 :デフォルトの名無しさん2011/11/05(土) 20:46:58.23
2003で実行

65537:エラー
65536:OK
491 :デフォルトの名無しさん2011/11/05(土) 21:04:48.81
>>488
サンクス。
やっぱ予想通りエラーだな。
某板だけどなんであんなウソ書くのかなぁ。
492 :デフォルトの名無しさん2011/11/06(日) 00:38:27.29
本家のVisual Basicも挑戦しようと思い本を読んでると
ExcelVBAでは A=A+1 と記述すべきところは Visual Basicでは A+=1 としないといけないみたいです。
でもこんなのイヤです。
Visual Basicでも従来どおり A=A+1 でも使用可能ですか?
496 :デフォルトの名無しさん2011/11/06(日) 01:29:32.60
>>492
使えるけど使わない。
論理演算子のAndやOrも、意味は知らなくてもいいから
Andalso、Orelseと書き換える様に。
497 :デフォルトの名無しさん2011/11/06(日) 01:32:49.84
>>479
一応だが…2010でも実行。
結果は他の人と同じだった。

>>492-494
一言どころか一文字とは。
493 :デフォルトの名無しさん2011/11/06(日) 00:49:34.68
さらにVisual Basicでは、標準モジュールは使わなくて、クラスモジュールを使うと書いてます(フォームモジュールもExcelVBA同様存在する)。
このクラスってなんですか?
上級向けの本ではよく出てくるので、おそらく大事だと思うんですが
ひとことでいえばどんなしくみですか?
498 :デフォルトの名無しさん2011/11/06(日) 01:35:42.91
>>493
VBの話はスレ違いなので
VBのスレ探してそこでやってください
495 :デフォルトの名無しさん2011/11/06(日) 01:28:29.79
型とは、長文でいえばどんなしくみですか?
499 :デフォルトの名無しさん2011/11/06(日) 01:43:19.62
>>495
例えば〜 As Collectionとした場合、このCollectionに当る部分が型。
要するに〜に当る部分が何ものなのかを定義している所。
このCollectionクラスはAddと言うメソッドを持っている。
クラスモジュールで似た様なもの作るとするならば、
Collectionと言う名をクラスモジュールに付けて、Addと言うメソッドを作る。
適当だけどこんな感じ。

スレ違いには同意なので、VB.Netスレで聞いて下さい。
500 :4932011/11/06(日) 01:54:08.04
さっぱりわからん
501 :デフォルトの名無しさん2011/11/06(日) 02:00:07.93
>>500
わからなくていいんです。
クラスってのはオブジェクト指向プログラミングの
中核を成すとても難しい概念。
そう簡単にわかってもらっちゃ、世の中のプログラマー
たちがメシを食えなくなりますんで。
502 :デフォルトの名無しさん2011/11/06(日) 08:54:58.20
わからなくて良くはないだろ。
その概念に出会って一月経ってわからん言ってる奴は
半年後もわからん言ってるよ。
そして1年後も3年後も5年後も同じこと言い続ける。
509 :デフォルトの名無しさん2011/11/06(日) 11:40:05.15
>>502
じゃあ鯛焼き機の話でもしようか
504 :デフォルトの名無しさん2011/11/06(日) 09:01:51.18
VBA はいつまて VB6 ベースで行くんだろう?
そろそろ VB.net か C# でも書ける様にしてくれないだろうか。
505 :デフォルトの名無しさん2011/11/06(日) 10:51:32.57
C#でオブジェクト指向らしい言語にはなったが
大切なのはそれを設計に生かすこと
設計がオブジェクト指向ならVBでも十分
てか、メンテナンスに優れていて想像しやすいものならOK
506 :デフォルトの名無しさん2011/11/06(日) 11:05:38.78
>>505
>設計がオブジェクト指向ならVBでも十分

VB って今の VBA のこと言ってるの?

「書ける」と「書き易い」の違いぐらいは理解しようね。
507 :デフォルトの名無しさん2011/11/06(日) 11:14:25.39
エンドユーザー部門が使えるレベルの
マクロ・簡易言語としての側面をVBAは持つ。
本格的なクラスベースの言語になると
オブジェクト指向についての詳細な知識が必要となり
エンドユーザー部門がついてこれない。
おそらくずっとVB6レベルのままだろうし、そうでなくてはならない。
510 :5042011/11/06(日) 12:01:24.06
>>507-508
いや、別に VBA を無くせといってるわけじゃないよ。

> VB.net か C# (* でも *) 書ける様に

そもそも、C# でオブジェクト指向らしくないコードなんていくらでも書けるだろ。

ひょっとして、class ってキーワードがあったらオブジェクト指向らしいとでも思ってるの? (w
511 :デフォルトの名無しさん2011/11/06(日) 12:07:25.11
>>510
いい加減スレ違いの話を続けるのはやめてくれ
508 :デフォルトの名無しさん2011/11/06(日) 11:18:08.63
別の言い方をすれば
馬鹿でもオブジェクト指向らしくせざるを得ないのがC#
客はうんなこと分かってないから喜ぶわけだがw
515 :デフォルトの名無しさん2011/11/06(日) 12:29:40.65
まぁVbaにも継承こそ出来ないものの
クラスはあるんだからその話をすればいいじゃない
516 :デフォルトの名無しさん2011/11/06(日) 15:56:34.80
じゃあ行番号つけた旧BASICに則ったコード書こうぜ
517 :デフォルトの名無しさん2011/11/06(日) 16:13:24.96
>>516
旧BASICってどれだよ。N-BASIC 辺りのことか?
誰得だよw
520 :デフォルトの名無しさん2011/11/06(日) 17:48:44.86
ここはExcel VBA質問スレだろ?
ズレまくってるのを早く修正しる
521 :デフォルトの名無しさん2011/11/06(日) 17:57:18.44
じゃ質問よろしいかしら?

呼び出し元で例外処理を一括で行ってるとして、
呼び出し先でエラーが発生した時に処理していたセルを、
ログなどに記録したいとします。

記録先や記録方法は、よしなにするとして、
このセル情報を、どーやって保持・参照すれば良さげでしょう?

出来れば自前で保持などせず、例外オブジェクトあたりから引っ張れると素敵ですが、
そんな仕組みあったかしら?
なお当然ですが、呼び出し先で発生する例外は自前でスローするとは限りません。
523 :5212011/11/06(日) 18:08:01.49
>>521補足
擬似コードで説明するなら、下のe.getStacktrace()に代わる情報として、
処理中のセル位置情報を引っ張れたら幸せだなーと
でも、おそらけ例外オズジェクトからは取れないので
何か工夫しないとダメな悪寒。

class Caller() {
try {
new Callee().execute();
} catch (Exception e) {
log(e.getStacktrace()); //←これ相当
}
}
526 :デフォルトの名無しさん2011/11/06(日) 18:38:17.42
>>523
そんなの書ける位理解してるなら
ファクトリーパターンでも使っとけ
527 :5232011/11/06(日) 18:54:22.09
>>526
生成だけハンドルすればOKならファクトリーメソッドでいんだけど、
どちらかっていうとテンプレートメソッドが近いですかね。

で、そこまではいんですけど、
今どこ処理してたの?情報は、VBAでだとどーやって引っ張ったらいいのかしらん?
という点が質問したい点なのですわ。
その情報としては実運用を考えるとセル位置とか知りたいなー
524 :デフォルトの名無しさん2011/11/06(日) 18:35:16.58
フォームのボタンについて

たとえば
Private Sub CommandButton1_Click()
textbox1.value=textbox1.value + 1
end sub

これをENTERで連打するとしっかり連続計算されるけどクリック連打だとダブルクリックになるのでゆっくり連打しかできない。
ダブルクリックイベントにならないようにクリックで早く連打してクリックイベントにする事は可能ですか?
528 :デフォルトの名無しさん2011/11/06(日) 18:54:25.64
>>521
そもそもその例外はVBAのエラーであって、EXCELのエラーではないからな
それに、VBAの例外オブジェクトにスタックトレースとかなかった気もする
自分でスタックトレース相当な何か作る(当然設定も自分でする)しかないんじゃね

>>524
ダブルクリックと判定される間隔はシステムのコントロールに設定がある
つまり、アプリでどうこうしちゃいかんって事かと
とりあえずダブルクリックイベントで+2すれば?
530 :5212011/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

忘れずに呼ばなきゃならない時点で
イケてない感がはんぱない。パフォーマンスも悪そう。
どなたか良いアイデアありますか?
529 :5242011/11/06(日) 19:23:46.00
ダブルクリックでも同じ処理したらいい感じになりました。エンター連打と同じぐらいスムーズには動かない
けど十分快適になりました。ありがとうございます。
539 :デフォルトの名無しさん2011/11/07(月) 15:38:15.47
>>529
mouseupイベントに書けばいいのでは?
531 :デフォルトの名無しさん2011/11/06(日) 20:39:04.45
ユーザーフォーム上のボタン名をセル上から取得するにはどうすればいいですか?
たとえばA1の値を参照して、A1が"あ"なら"あ"というボタンにする
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
534 :デフォルトの名無しさん2011/11/06(日) 22:42:14.77
>>530
Calleeのプロパティとして参照する。
getInstance?シングルトン?VBAのクラスのコンストラクタってprivateに出来たっけ?

>>533
知らないけど勉強中との事なので。
もう何年もVBAやってるけどInterface使うプロジェクトは見たこと無いです。
535 :5212011/11/06(日) 23:07:20.59
>>534
あら。CalleeとかCallerとかVBAだと予約語っぽいですね。
先のコードは書きやすい命名で書いちゃいましたが、命名規約的にNGっぽいかも。
ちと勉強してきますね。レスサンクスです。

シングルトンは格納先を素直に書いたらこうかな?レベルで書いた擬似コードなので
VBAだと書けないかも。
その場合は外部からインスタンス化されたら例外投げるとかで対処する感じでしょうかね。
536 :デフォルトの名無しさん2011/11/06(日) 23:38:42.94
>533

VBAでInplementsを使って実装する時は、
たとえば533のように、Interface名_methodのように
予約語がついてしまう。
これはVBAの仕様上の問題で、ヘルプにも書いてある。

たくさんの共通する命令がある時に
命令の実装忘れがないようにできるくらいで、
VBAで活用する機会は正直あまりないと思います。
(Interfaceの多重継承も一応できますが…)
537 :デフォルトの名無しさん2011/11/07(月) 15:28:13.65
末尾再帰の最適化について質問です。

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の累乗でスタックに詰まれていくから重くなるのだと思います。
538 :デフォルトの名無しさん2011/11/07(月) 15:31:06.87
>>537
頭痛が痛くなるな。俺には無理。
542 :デフォルトの名無しさん2011/11/07(月) 18:00:25.53
>>533
VBAの勉強してるなら、Interfaceの事は見なかったことにして忘れた方が良い
オブジェクト指向のクラス設計勉強してるなら、ちゃんとしたオブジェクト指向言語つかった方が良い

>>537
どっかアルゴリズムのスレ探してそこで聞いた方がいいんじゃね
544 :デフォルトの名無しさん2011/11/07(月) 20:31:22.81
>>537

これ、初期値のA(0)=1とB(0)=2こそ違うけど、それ以降は
A(n) = B(n) = 3*(n-1)^2 で、再帰も糞もなくないですか
540 :デフォルトの名無しさん2011/11/07(月) 17:06:56.12
Excel2007

Listbox(1行につき3列)に抽出した結果を格納して表示することを考えてるんですけど、その結果が1件のみの時は、
フォームを出した時点で選択状態にしたいと思ってます。

んで、その選択状態にするにはどのようにするんでしょうか?
541 :デフォルトの名無しさん2011/11/07(月) 17:08:03.60
selectedindexとかない?
543 :デフォルトの名無しさん2011/11/07(月) 18:16:54.06
>>541
フォームのInitializeで

Me.LstBox1.Selected(0) = True

ででけました。?クス
546 :デフォルトの名無しさん2011/11/07(月) 22:30:43.31
例に突っ込むとかじゃなく最適化してるじゃん
こういう再帰的な呼び出しに関して
一般的な最適化の手法ってのはないんじゃね?
547 :デフォルトの名無しさん2011/11/07(月) 22:58:23.61
なんかテスト臭いな。
何て言うか、自分の考えていた答えよりちょっとレベルの低い答えが
帰ってニヤってしたかったけど、根本から最適化されてしまって逆切れしたみたいな。
548 :デフォルトの名無しさん2011/11/07(月) 23:17:54.08
おまいらなんの話してんだよ。高卒の俺にはさっぱりわからんぞ
550 :デフォルトの名無しさん2011/11/08(火) 03:55:30.21
あれ、飛び石で範囲指定したセルってリサイズ不可?

A列の入力されたセルを選択して右に5セル移動して更に範囲を横20に拡大したいんだけど。

Columns("A").Select
Selection.SpecialCells(xlCellTypeConstants, 23).Select
Selection.Offset(0, 5).Resize(, 20).Select
551 :デフォルトの名無しさん2011/11/08(火) 07:15:33.62
>>550
やってみりゃ分かるだろ?
For Eachでも回して処理するんだな。
553 :5502011/11/08(火) 22:57:25.82
やっぱ無理か
changeイベントの実行範囲に指定したかったんだけどな…
554 :デフォルトの名無しさん2011/11/09(水) 00:03:03.63
sheetsとworksheets、どっち使ったらいいの?
556 :デフォルトの名無しさん2011/11/09(水) 00:37:32.18
>>554
そういう質問をする内はSheetsを使っておけばいい。
対象にグラフのシートを含めてみれば分かる。
555 :デフォルトの名無しさん2011/11/09(水) 00:28:41.37
そういう質問するうちは、worksheets を使ってればいい。
558 :デフォルトの名無しさん2011/11/09(水) 00:47:23.90
>>555-556
そういう回答をするうちは、ロムっていればいい。
ちゃんと解説できる日本語を身につけたら書き込みしてよい。
559 :デフォルトの名無しさん2011/11/09(水) 00:54:52.73
>>558
そういう突っ込みをする内は(ry
557 :デフォルトの名無しさん2011/11/09(水) 00:46:15.15
フォームコントロールとActiveXコントロールの違いは何ですか?
どう使い分けますか?
561 :デフォルトの名無しさん2011/11/09(水) 11:24:12.15
Activesheetだっけ、Activeworksheetだっけ、それともどっちも使えるんだっけ?
こういうどっちでもokみたいな仕様はexcel作者は即刻に止めていただきたい。
いつもとまどう。特に1か月以上ぶりにVBAを使い始めたとき。
562 :デフォルトの名無しさん2011/11/09(水) 17:15:55.07
excelの作者はちゃんと理由があって似たようなものを作ってるんだと思うんだが
問題はそれをちゃんと使い分けられないVBAプログラムの作者だろ
563 :デフォルトの名無しさん2011/11/09(水) 20:08:45.75
互換性を放棄すれば大分スマートな構造になりそうな気はする。
というか、そうなったら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
ですか?
566 :デフォルトの名無しさん2011/11/10(木) 13:26:31.82
フォームコントロールとActiveXコントロールの違いは何?
どう使い分けます?
567 :デフォルトの名無しさん2011/11/10(木) 14:52:08.78
コマンドボタンに黒の左向きの三角を設定したいんだけど、
フォント名を合わせても四角が表示されてしまいます。
どうすれば設定できますか?
イメージでも良いです。
よろしくお願いします。
570 :デフォルトの名無しさん2011/11/10(木) 15:13:20.98
>>567
配置を縦にして▲を表示すればいいよ
568 :デフォルトの名無しさん2011/11/10(木) 15:03:30.32
等式で大文字と小文字を区別するにはどうしたらいいの?

(例) If range("A1")=""Apple" thenで、A1がappleでもAPPLEでもaPPLEでも、正と判断してしまうので困っちゃうの。
571 :デフォルトの名無しさん2011/11/10(木) 15:19:07.49
>>568
Option Compare Text
があるんじゃない?
572 :デフォルトの名無しさん2011/11/10(木) 15:24:50.03
>570
おおおおおおおお!ありがとうございました
573 :デフォルトの名無しさん2011/11/10(木) 17:28:27.63
VBAから外部ソフトのボタンを押すプログラムを書きました。
いくつかあるボタンのうち、同じプログラムで押してはいるけど、
反応しないボタンがあります。

Ret = SendMessage(hwnd1, WM_LBUTTONDOWN, 0, 0)
Ret = SendMessage(hwnd1, WM_LBUTTONUP, 0, 0)

このプログラムでハンドルをハンドルを変えて実験すると、
きちんと反応するボタン、反応しないボタンがあるのはどう対処すればいいでしょうか?

ちなみに、ハンドルはスパイソフトでみてあっているのは確認しています。
ステップ実行でボタンがへこんで戻るのも確認しました。
Cで書いてやってみるときちんと反応します。

よろしくお願いします。
575 :デフォルトの名無しさん2011/11/10(木) 18:22:42.16
>>573
VBAから外部ソフトを操作するのって、どういう命令を使うの?
それ実にやりたいことだから知りたい。
576 :デフォルトの名無しさん2011/11/10(木) 19:18:25.24
>>573
出来ました。
ありがとうございました。

>>575
ここでは説明できないし、自分もググりながらやってるから
間違った説明をしてしまうと思う。
VBA winapi とかでググってくれ。
大まかなことはすぐ理解できると思う。
578 :デフォルトの名無しさん2011/11/10(木) 20:21:09.15
>>575
GUIアプリケーションって、
他のプロセスからメッセージを受け取って、その内容に応じてイベントハンドラを呼び出してるんだけど、
メッセージ送信は送信先アプリの送信先コントロールが分からないとダメで、
その識別子をウィンドウハンドルって言うよ。
SendMessageってAPIで送信出来るよ。
574 :デフォルトの名無しさん2011/11/10(木) 17:43:12.12
PostMessageにすればいいよ
577 :デフォルトの名無しさん2011/11/10(木) 19:26:47.69
間違えた。
>>574でした。
580 :デフォルトの名無しさん2011/11/10(木) 20:56:18.21
何故、メモ帳に字が書けるか。
ボタンを押すとファイルの保存先を聞いてきて保存できるか。
まずはその仕組みのイメージだけでも理解しないと575のやりたいことは出来ないよ。
581 :デフォルトの名無しさん2011/11/10(木) 21:12:01.99
ワークブックのイベントで新しいシートを追加したら、
既存の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

この後はどうしたら良いのでしょうか?
582 : 忍法帖【Lv=2,xxxP】 2011/11/11(金) 02:58:43.64
>>581
InsertLines メソッド を使って書き込むんだけど
コードをコピーするんじゃなくて

ワークブックの Workbook_SheetChangeイベントで
イベント処理するってのはどうなのかな?
これなら新しいシートを追加してもイベント処理対象だし
600 :デフォルトの名無しさん2011/11/12(土) 09:22:23.76
>>581
> ワークブックのイベントで新しいシートを追加したら、
> 既存のSheet1のWorksheet_Changeのコードを追加したシート
> にコピーする事は可能でしょうか?
>

シートの追加、じゃなくて、シートのコピー、ではダメ?
602 :5812011/11/13(日) 09:06:54.82
>>582さん
>>600さん

ご返答有難うございます。

情報不足ですいません。
やりたい事としては、複数人で使用するワークブック「A」が有り、
「A」が変更された場合にワークブック「更新情報」に変更箇所を記録。
「A」を開いた時に「更新情報」が開いてない場合には、「A」のWorkbook_Openで
開く様にしてあります。

「更新情報」に変更箇所を記録まではうまく出来ているのですが、
新しいシートを追加された時、当然ながらWorksheet_Changeに何も
コードが無いもので対応出来ません。
なので Workbook_NewSheetのイベントで、既存Sheet1のWorksheet_Changeを
新規シートにコピー出来ないかな?と思い質問させていただきました。

604 :デフォルトの名無しさん2011/11/13(日) 09:50:29.19
>>602
てか、元々そんな機能なかったか?
EXCELって。
605 :デフォルトの名無しさん2011/11/13(日) 10:02:00.37
>>602
コードを流し込むことはできなくなった
Workbook_NewSheetでコードなしシートが追加された場合
コード入りのシートをコピーして新規シートの内容をコピー
新規シート削除、コピーシートリネーム
606 :デフォルトの名無しさん2011/11/13(日) 11:38:30.11
>>602
共有設定じゃ実現できない事をやりたいの?

>>605
出来なくなったkwsk
セキュリティが厳しくなったって事とは別になにかあったの?
607 :5822011/11/13(日) 12:36:37.68
>>602
Worksheet_Change
じゃなくて
Workbook_SheetChange
にしたらって意味で >>582で書いたつもりだったんだけどな
後者の方は全てのシートのセルの変更に対してイベントが出るよ

...なんか俺 >>602のやりたい事を 勘違いしてるのかな
583 :5832011/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 :5832011/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

何かよいお知恵があったら教えてください。よろしくお願いします。
591 :デフォルトの名無しさん2011/11/11(金) 23:14:01.49
>>587
普通に交換用のプロシージャ作れば?

例えば、
Sub 交換用プロシージャ(ar As Variant, r1 As Long, r2 As Long)
'2次元配列ar の r1行目と r2行目の要素交換する
とか。

なら、呼び出しで
交換用プロシージャ 1, 2
交換用プロシージャ 2, 3
で、>>584の交換ができる
598 :デフォルトの名無しさん2011/11/12(土) 01:03:46.68
Mydataが二次元配列と仮定するなら、
FunctionだとVariantの内容がコピーされて返されないか?

>>583
最終的な並び順のインデックスを末尾の列に書き込んで、
Range.Sortメソッドでソート実行、
その上でコピペしまくるという方法もあるな。
585 :5832011/11/11(金) 04:41:48.59
すみません、最初に「1行目と2行目を入れ替えて」と書きましたが
コード中では3行目も入れ替えてますね。
とにかく、行の入れ替えがしたいということです。
よろしくお願いします。
586 :デフォルトの名無しさん2011/11/11(金) 07:05:07.56
一行ずつ取ってきて別の行にセットする。
CopyとPasteSpecialで事足りる気もするけど。
587 :5832011/11/11(金) 18:45:06.36
>>586
回答ありがとうございます。
行、列ともに少なければどんなやり方でも良いのですが、
前述のコードはあくまでもサンプルでして、
実際の業務では複数のブック間で(数百行、数十列)のセル範囲を
数千件単位でコピーする必要があって
データをコピーするときにはセルを操作するよりも
変数で処理するほうが速いのだそうで、
少しでも高速化できればと思っていた次第です。

エクセルのヘルプでも配列内の要素の操作は
ForNextのネストで行うような説明が書いてありましたし、
残念ですがあきらめます。
593 :デフォルトの名無しさん2011/11/11(金) 23:16:03.74
>>587
状況にもよるけど、余り複雑だったり
ループを多く組まなければならないなら、
対象のシートにSQLを投げてレコードセットをシートに展開するループだけに
するって手もあるよ。
588 :デフォルトの名無しさん2011/11/11(金) 20:09:17.68
そんなもんマクロの記録で十分では?
589 :デフォルトの名無しさん2011/11/11(金) 22:11:24.39
回答した>>586>>588より質問者の方がレベルが高い件
590 :デフォルトの名無しさん2011/11/11(金) 23:05:47.35
行単位で扱えればいいって事でしょ?
配列を記録する配列を用意しておいて、行を記録する配列を動的に
作って行を記録。
で、コピーするときにコピーしたい順に配列を呼び出していけばいい。
592 :5912011/11/11(金) 23:15:25.98
間違えた
交換用プロシージャ MyData, 1, 2
交換用プロシージャ MyData 2, 3
だった…
594 :デフォルトの名無しさん2011/11/11(金) 23:31:07.22
ある一定の範囲をドーーーーンとコピーして、別シートにバーーーーンと貼り付けて、
1行目に行挿入して、3行目をこぴーして、1行目に貼り付けて、3行目を削除でよくね?
screenupdateをfalseにしとけば、そんなに遅くないんじゃ値?
595 :デフォルトの名無しさん2011/11/11(金) 23:57:37.72
そうだよ
ドーーーーンにバーーーーンにビシャーーーーンだよ
597 :デフォルトの名無しさん2011/11/12(土) 00:43:08.87
すまん, 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)
599 :デフォルトの名無しさん2011/11/12(土) 01:15:33.01
>>597
MyDataが呼び出し先のプロシージャ内で書き換え可なら
Subプロシージャのほうがスッキリしていると思う。
書き換え不可なら、Functionプロシージャにして
プロシージャ内で戻り値用の配列を用意して使う。

どちらにしても配列は参照渡し
r1, r2 は値渡しにする
601 :デフォルトの名無しさん2011/11/12(土) 19:58:21.46
すいません、質問させてください。(XP / Excel2000,2003)
Formとボタンの形状を変えたと思っています。

(構想)
1 画像でフォーム外観、ボタン外観を作成
2 透過色の指定
3 カーソル先の座標習得
4 カーソル先の色を習得
5 MouseDownかClickイベントで、透過先をクリックできないようにする。

現在3,4を同時に進めているのですが難航しています。
いざ作り出してから非常に回りくどいとも思ったのですが、良案はないでしょうか。
603 :デフォルトの名無しさん2011/11/13(日) 09:48:07.24
>>601
リージョン操作系APIを使えば3, 4はWindows側がよしなにやってくれる
あとはWindowsAPI相談室で聞いとくれ
611 :デフォルトの名無しさん2011/11/13(日) 14:50:21.78
>>603
VBAでそれらしい機能が見つけれなかったので、
デバイスコンテキスト辺りを調査中。
ネットで例が見つからないわけではないのですが、
VBAで取り扱ったいるものが少ないので参考になったりならなかったり。
もう少し具体的なところで行き詰った時、
こちらかAPI質問箱で質問させて頂くかもしれません。
ありがとうございました。
608 :デフォルトの名無しさん2011/11/13(日) 13:07:43.19
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 ・・・

どのように記述すればよいでしょうか?。。。
610 :デフォルトの名無しさん2011/11/13(日) 13:10:12.97
>>608
いきなりコード書くんじゃなく、
Excelでセルに数式いれる作業を、マクロの記録でスクリプト化してみたらどうだろう?
ためしてないからダメかもだけど。
612 :デフォルトの名無しさん2011/11/13(日) 16:55:38.57
>>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
613 :デフォルトの名無しさん2011/11/13(日) 17:10:34.61
>>612
ありがとうございます!本当に助かりました!
614 :デフォルトの名無しさん2011/11/13(日) 19:04:54.85
あるbookに書かれたVBAを実行すると
コードから他のbookを開いて
その他のbookに記録されてるVBAを実行するにはどうすればいいの?
615 :デフォルトの名無しさん2011/11/13(日) 19:31:41.60
Application.Run
616 :6142011/11/13(日) 19:51:30.83
>>615
そのとき最初のVBAで使ってた変数をそのまま次のVBAでも使うにはどうすればいいの?
617 :デフォルトの名無しさん2011/11/13(日) 21:15:34.61
>>616
パロメータに引数で渡す
618 :デフォルトの名無しさん2011/11/13(日) 21:20:33.81
>>617
それパラメータのことですか?(大笑)
619 :デフォルトの名無しさん2011/11/13(日) 21:29:12.05
>>618
パラメータに引数で渡す
パラメータって言い方普段しないから
622 :実行時エラー9が出ます。どこが悪いのでしょうか。2011/11/15(火) 10:26:19.47
デバックしても、原因が表示されません。
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
623 :デフォルトの名無しさん2011/11/15(火) 13:25:54.88
>>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"を別のシートのセル範囲に置き換える予定でもあります。
626 :デフォルトの名無しさん2011/11/15(火) 13:36:09.46
誤: Sheets(リストシート).Range("B4").Select
正: Sheets("リストシート").Range("B4").Select
627 :デフォルトの名無しさん2011/11/15(火) 13:49:53.55
>>624
>>626
いきなり他シートのセルはセレクトできないよ?
いったんそのシートをアクティブにしないとね。
そもそもセレクトする必要はないんだけど。
628 :6262011/11/15(火) 13:59:31.65
おー たしかに
コードだけみて脊髄反射的に答えちゃだめだな俺
629 :デフォルトの名無しさん2011/11/15(火) 14:39:04.06
Sheets("リストシート").Activeをsubの次の行に入れました。
すると今度は、438番の実行時エラーになりました。

630 :デフォルトの名無しさん2011/11/15(火) 14:42:14.77
activateにしたら、エラーはなくなりました!

でも、Formula1:="3,4,5"の右側を
別のシートのセル範囲に置き換えると、実行時エラー424が出るようになってしまいました。

シート名!範囲名では、リストにするためのオブジェクトとして認識されないのでしょうか。
631 :デフォルトの名無しさん2011/11/15(火) 15:25:12.84
>>630
Excel(エクセル)基本講座:入力規則の使い方
http://www.eurus.dti.ne.jp/yoneyama/Excel/n-kis.htm
632 :デフォルトの名無しさん2011/11/15(火) 15:56:44.22
「抽出条件 データの入力規則で、他のワークシートまたはブックへの参照は使用しません。」との
ダイアログボックスが出てきました。

Excel2003だからでしょうか。
634 :デフォルトの名無しさん2011/11/15(火) 16:00:29.12
解決しました。ありがとうございました。今日は、エクセルのセルの広さに救われましたね。
635 :デフォルトの名無しさん2011/11/16(水) 11:48:33.65
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に何も表示されません。

原因は何なのでしょうか。
637 :デフォルトの名無しさん2011/11/16(水) 12:12:56.36
>>635
Msgbox(Cells(a, b).Address と
Msgbox(Cells(a & "," & b).Address で
違いを比べてみてください。
636 :デフォルトの名無しさん2011/11/16(水) 11:56:11.56
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文に
上記のマクロを挟んだら、エラーが出てリストボックスが作れません。

再試行を促すダイアログボックスが出て、ユーザ定義関数はセルに挿入できますが
肝心の入力規則(リスト)は作られません。
638 :デフォルトの名無しさん2011/11/16(水) 12:35:37.94
>>636
セルに挿入したユーザ定義関数からは値を返すだけで 変更操作は出来ない
640 :デフォルトの名無しさん2011/11/16(水) 12:39:54.61
>>638
やりたいことは、値の取得だけです。
ユーザ定義関数を挿入したセルの入力規則を、その関数から操作するのは無理なのでしょうか。
642 :デフォルトの名無しさん2011/11/16(水) 12:51:38.36
>>640
ん?
>>636をみると入力規則の設定を変更してるようにみえるが?
639 :デフォルトの名無しさん2011/11/16(水) 12:37:41.64
Msgbox Cells(a, b).Addressだと、セルを絶対参照したように$B$5が出ました。

Msgbox(Cells(a & "," & b).Address を少し直すと、$AZ$1が出ました。
ちなみに、Msgbox Cells(a & "," & b).Address じゃないと構文エラーになりました。
641 :デフォルトの名無しさん2011/11/16(水) 12:45:11.51
c = Cells(a, b).Valueにしたところ、参照する件だけはアッサリ解決してしまいました。
でもまだ、不思議な気持ちです。
643 :6372011/11/16(水) 13:05:12.67
>>641   637は最後の「終わりカッコ」が抜けてました。
>でもまだ、不思議な気持ちです
Range(アドレス指定)と混同してますね
ひとつのセルを指定する場合は、
Range("B5")のように、カッコの中を1個の文字列値で指定するものと、
Cells(5,2)のように、カッコの中を、行と列を表す2個の数値で指定するもの
(カンマは2個の数値の区切り)の違いがわかりますか?
644 :デフォルトの名無しさん2011/11/16(水) 14:35:41.18
>>642
入力規則をセルに設定することはできますが、セルに設定されている入力規則の内容を変えることができません。

>>643
いろいろ試してみます。

>ALL
今日もたくさんお教えいただき、ありがとうございました。m(_ _)m
650 :デフォルトの名無しさん2011/11/16(水) 22:18:01.86
>>644
副作用を伴うユーザー定義関数が実行できたとしても偶然と考えておいた方が無難だよ

http://support.microsoft.com/kb/170787/ja
ワークシートのセル内の数式から呼び出されるユーザー定義関数では、Microsoft Excel の環境を変更できません。つ
まり、このような関数では次の処理が実行できません。
スプレッドシートでのセルの挿入、削除、または書式の設定。
• 別のセルの値の変更。
• ブックでのシートの移動、名前の変更、削除、または追加。
• 計算方法や画面表示など、環境オプションの変更。
• ブックへの名前の追加。
• プロパティの設定およびほとんどのメソッドの実行。
645 :デフォルトの名無しさん2011/11/16(水) 20:24:27.87
セル入力でオリジナルのfunctionを使うときに、
たとえばA1で記入、つぎにB1で記入など、二度連続で同じfunctionを実行したことを判別したいのですが、なにかアイデア下さい。
646 :デフォルトの名無しさん2011/11/16(水) 20:48:57.40
>>645
影響のないセル(例えばAZ1)に対して、「特定のFunction」と「それ以外のすべてのマクロ」が
異なる値を書き込むようにしたら、判別できるのでは?
初期値は 0 にしておく(ブックオープンのイベントで書き込み)
特定のFunction は 1 を書き込む(書き込む前にAZ1の値を調べ、1なら二度目ってわかる)
※3度目以上でも1のままですが・・・
それ以外のすべてのマクロ は 0 を書き込む
647 :デフォルトの名無しさん2011/11/16(水) 20:49:21.98
>>645
グローバル変数に走った回数を入れればいいんじゃないの?
聞いてる意味違う?
652 :デフォルトの名無しさん2011/11/16(水) 23:05:11.79
>>646
ありがとうございます。
セルへのアクセスを減らすために実施しようと思ってますので、
少し違いますが、参考にします。

>>647
やはりそれですか。
関数がたくさんあって、
初期化を他の関数に追記するのがどうにもめんどうで。
たとえば、20個関数があったら、残りの19個はfalseにしたり0にしたりがどうも…
655 :デフォルトの名無しさん2011/11/17(木) 00:12:42.47
>>652
ああ、連続でよばれたかどうかね。
関数に対応する連番を列挙体にでも用意しておいて、
1度目にグローバル変数かモジュール変数にしまった関数に対応する連番と
2度目に呼んだ時の関数に対応する連番と比較して同じなら連続でよばれたと判断できるよ。
何連続で呼ばれたかとか、連続で呼ばれたのは何回かと言うのが欲しいなら、
その関数に対応した連番をキーにコレクションやディクショナリに
回数を設定してため込んでやればそんなに面倒臭い事にはならないんじゃないかな。
648 :6012011/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
653 :デフォルトの名無しさん2011/11/16(水) 23:53:31.95
>651
長方形などは分かりやすかったのでVBのサンプルで解決できました。
↑で記入したコードも成功例のどれかからコピーして使っています。
しかし、PolyPolygonRgn/PolygonRgnは動かせなかったので、一つ具体例がほしいのが現状です。
設定に関しては、Declare等々と一緒で行数的に入らなかったのと、
試してみたどの設定を代表として書けばいいのか悩みました。

スレ違い申し訳ありませんでした。
API質問箱が若干荒れ気味なのと、
VBAの例の少なさ=回答の少なさになるかと迷っていたのですが、
あちらで改めて質問してきたいと思います。
654 :デフォルトの名無しさん2011/11/17(木) 00:08:31.63
>>653
VBなら ここで多角形(星型)のサンプルあるぞ
http://hanatyan.sakura.ne.jp/vbhlp/enkei.htm
656 :デフォルトの名無しさん2011/11/17(木) 02:12:10.37
>>654
えーっと…コピーしたマクロが正常に起動しました。
文章の送信前に最後の確認をしたら、
フォームが消えるパターンから変化しました。
「Me.Move」が原因だったようです。

(後出し情報になりますが)
座標の設定方法は同じだと思います。
違う点は頂点の数を、定数で設定しているところでしたが、数字に変えてもちゃんと動きました…。
ユーザー定義名も異なってましたが、「Declare」と設定を合わせたら動くことを確認できました…。
「CreatePolygonRgn」で動いた理由もよくわかりませんが、後程「CreatePolyPolygonRgn」も試してみます。

何というか本当にご迷惑をおかけしました。
自分がAPIに手を出すのは早すぎるようです。
ありがとうございました。

(追伸)
「PostMessage」を教えてくれた方にも感謝。
多分自分の独力ではこれ以上無理そうです。
別の方法で力技回避を試みます。
657 :デフォルトの名無しさん2011/11/17(木) 02:47:36.65
>>656
つか
VBAのユーザフォームでホントにそれが必要なのか再検討したほうがよくね
APIの勉強とか個人的趣味ならいいけど
業務に適用するんだったら後々メンテする人が苦労するだけかと
658 :デフォルトの名無しさん2011/11/17(木) 13:07:35.75
>>657に同意。
言語変えるなりVSTOなりにしたほうが…
660 :デフォルトの名無しさん2011/11/17(木) 14:41:21.40
>>657
耳が痛いお話です。
一応、個人の趣味勉強。
ただ、業務へのフィードバックもやっていくつもりなので線引きは薄いです。
職場でVBA弄れる人間は私しかおらず、
私自身汚いソースをあまり見せたくありません。


>別言語
職場でも勉強できる(勝手にソフトを入れれない)、
エクセルが入ってないPCはほとんどない、
偶々サンプルとなるものがあったから。
(将来的には)C++、Javaも勉強したいです。
661 :デフォルトの名無しさん2011/11/17(木) 15:30:56.30
>>660
じゃあ仕方ないか
.NetはFrameWorkだけでビルド出来るけど初心者向けではないししね
662 :デフォルトの名無しさん2011/11/17(木) 16:15:47.91
>>660
IT系以外の職場だとそんな所多いと思う
だからこそ
業務へは あまりウケ狙い的な事をしないで

"シンプル・イズ・ベスト"
664 :デフォルトの名無しさん2011/11/17(木) 17:53:58.68
>>662
「ザ」がぬけてる。
"シンプル・イズ・ザ・ベスト"
英語系やってるとこういうフレーズにさえ著しい違和感を感じるようになる職業病。
666 :デフォルトの名無しさん2011/11/17(木) 18:48:03.64
>>664
この場合、theは無くてもいいんじゃないかな。
663 :デフォルトの名無しさん2011/11/17(木) 16:26:01.56
VBAだけだと、かゆい所に手が届かないんだよなあ
アプリを作るための言語じゃないから

まあ.Netもコントロールの出来が悪いから、できそうでできないこと多いけどね
使いやすいUIとか作ろうとすると、結局めちゃくちゃ手間がかかる
665 :6622011/11/17(木) 18:25:39.46
へっ(汗;;;;)そうなんだ「ザ」抜きで憶えてた
学生時代英語は赤点だったからなーーー
ありがと
667 :デフォルトの名無しさん2011/11/17(木) 19:33:10.94
ExcelでBlackOnyxのような3D迷路を作っているのですが
3D表示で直角三角形はどう表現したらいいですか?
■はInteriorに色をつけてやろうとしてるんですが
斜めの部分が再現できず困ってます。
672 :デフォルトの名無しさん2011/11/17(木) 22:11:11.62
>>667
無理しないでパターンで持てばいいじゃない。
むしろ色付けは条件付き書式でやった方が楽。
673 :6672011/11/17(木) 22:34:26.44
>>672
なるほど
32x32の正方形が3D画面だとして、
セルに透明色の1や2や3・・・・・を代入するだけで
あとは条件付き書式が勝ってに色付けしてくれるってわけですか。
そのアイデア採用させていただくでやんす。

ところでパターンとは何ですか?
念のため作ろうとしてるのはこんな青や水色の壁で、
斜めになってる部分が再現できないんです。
http://homepage3.nifty.com/giga/onyx/blackonyxUturo.html
675 :6602011/11/17(木) 23:32:12.28
ROMに戻る前に一応ご報告。
「CreatePolyPolygonRgn」も動かせるようになりました。
問題点は、座標項目が途中からずれており、リージョンが線になっていた、というものです。


>ウケ狙い
あるマクロが一部で認められてしまい、
上に報告するか、という話が持ち上がっております。
そこで趣味で調べていたAPIを組み込もうとしたのが始まりです。


>>667
作りかけのテトリスが終わったら、
大迷路を作り、それを改造してWIZを作ろうとしてる人間がここに…。
斜めをは私も悩んでました。頑張ってください。
676 :デフォルトの名無しさん2011/11/17(木) 23:36:53.61
>>673
先にいくつかの壁の絵の部品のパターンを持っておいて、
周りの壁の状況に合わせてそれを組み合わせて表示する様にしておけばいいんじゃないかと
言うつもりでレスしたんだけど、
BlackOnixと全く同じにするのはかなり厳しいと思うよ。
何と言ってもシェイプがセルよりプライオリティ高いからね。
背景にBlackOnixと同じ線が入った絵を用意してやるか、全てシェイプで描くか・・・。
668 :デフォルトの名無しさん2011/11/17(木) 19:39:02.79
「最初からそう教えてくれりゃええのにぃ」シリーズの本(と言っても2冊しかないけど)では
下記のことはマスター(単に記述だけでなく手取り足取り教えてくれてるか)できますか?

・変数の値渡し・参照渡し
・変数のスコープ
・プロシージャのサブルーチン(Public, Privateについての詳細など)
・モジュールを分ける理由、たくさん作る利点
・見やすいプログラミングのコツ
669 :デフォルトの名無しさん2011/11/17(木) 20:44:22.64
本屋で立ち読みして自分で判断ぐらいしやがれ、このクソボケ
670 :デフォルトの名無しさん2011/11/17(木) 20:47:42.40
>>669
なんだと、このハゲ頭
679 :6682011/11/18(金) 11:58:23.91
>>669
近くの複数の本屋に行っても置いてないから聞いておるのだ

「最初からそう教えてくれりゃええのにぃ」シリーズの本(と言っても2冊しかないけど)では
下記のことはマスター(単に記述だけでなく手取り足取り教えてくれてるか)できますか?

・変数の値渡し・参照渡し
・変数のスコープ
・プロシージャのサブルーチン(Public, Privateについての詳細など)
・モジュールを分ける理由、たくさん作る利点
・見やすいプログラミングのコツ
680 :デフォルトの名無しさん2011/11/18(金) 12:36:32.30
671 :デフォルトの名無しさん2011/11/17(木) 21:06:18.86
なんで俺がハゲだってわかった、このストーカー
677 :デフォルトの名無しさん2011/11/18(金) 09:10:10.24
>>671
ハゲ臭がしたからさ
674 :デフォルトの名無しさん2011/11/17(木) 22:41:35.45
678 :デフォルトの名無しさん2011/11/18(金) 09:35:49.55
テキストボックスを操るときなど

  ActiveSheet.Shapes("txtbox").Characters.Text = "うんこ"

とするとエラーが出るんですよ。
でも、Selectを使って2行に分けて次のようにすると成功します。
これはなぜですか?

  ActiveSheet.Shapes("txtbox").Characters.Select
  Selection.Text = "うんこ"

681 :デフォルトの名無しさん2011/11/18(金) 13:32:32.83
イベントトリブンというけど
例えばボタンを5つつくって、それぞれにマクロを関連づけされてたら
順番にボタンを押すと同時に5つのブロシージャが実行されることになるの?
682 :デフォルトの名無しさん2011/11/18(金) 13:54:19.77
なんで同時?
普通に「順番」に実行されるだけだと思うが。
そもそも、イベントドリブンと関係ないし。
684 :デフォルトの名無しさん2011/11/18(金) 14:19:51.52
コントロールで、

・フォームコントロール
・ActiveXコントロール

はどう使い分けますか?
685 :デフォルトの名無しさん2011/11/18(金) 14:22:17.70
ActiveXコントロールはなるべく使わない
どうしてもってときだけ
686 :デフォルトの名無しさん2011/11/18(金) 14:39:35.76
ActiveXコントロールは
セキュリティ上嫌がる人も多いからね
687 :デフォルトの名無しさん2011/11/18(金) 15:03:39.70
>>685
どうして?
>>686
セキュリティとどう関係があるの?
690 :デフォルトの名無しさん2011/11/18(金) 15:48:59.00
変数じゃなくて、実行中かわらない値を設定するには
Const
を使うと思うんですが
別に普通の変数を使って、それに値を使ってもいいんですよね?
Constを使う利点は何ですか?

また、普通の変数を定数で使おうとしたらどこで値を代入すればいいんでしょう?
標準モジュール内のプロシージャすべてで使いたいので
標準モジュール内の一番上でa=3.14みたいに書いたらエラーが出たよ。
691 :デフォルトの名無しさん2011/11/18(金) 16:19:39.73
http://hibari.2ch.net/tech/>;>690
Const:変更されないことが保証される。
変更されていないという前提でプログラム内から使用できる。
また他言語だと最適化の時に有利になる。
692 :デフォルトの名無しさん2011/11/18(金) 16:20:15.95
>>690
Constで定義するのは「定数」
変数を定数のように使ってもいいけど、いちいち使い分けるのは、間違いや事故を防ぐ、わかりやすくする、など
ちゃんと理由がある
よくわからない場合は先生や先輩の言うことは素直に聞いとけ
693 :デフォルトの名無しさん2011/11/18(金) 16:21:55.27
先生の言うことを聞かないとどうなりますか?
694 :デフォルトの名無しさん2011/11/18(金) 16:30:43.83
>>693
場合によっては血祭りの生贄になります。
696 :デフォルトの名無しさん2011/11/18(金) 19:07:52.22
よくあることですが文字列変数に " を代入するにはどうしたらいいですか?
697 :デフォルトの名無しさん2011/11/18(金) 19:14:25.01
コード中に数字埋めちゃいかんと言うコーディング規則で、
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はどんな定数名にするの?
700 :デフォルトの名無しさん2011/11/18(金) 20:01:28.55
何故>>697が答えてくれると思ったのか

マイクロソフト ワイヤレス ブルートラック マウス Arc Touch Mouse RVF-00006
マイクロソフト ワイヤレス ブルートラック マウス Arc Touch Mouse RVF-00006