5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

Excel VBA 質問スレ Part21

1 :デフォルトの名無しさん:2011/09/25(日) 15:20:07.80
01 http://pc11.2ch.net/test/read.cgi/tech/1054356121/
02 http://pc11.2ch.net/test/read.cgi/tech/1168308855/
03 http://pc11.2ch.net/test/read.cgi/tech/1180192018/
04 http://pc11.2ch.net/test/read.cgi/tech/1189814602/
05 http://pc11.2ch.net/test/read.cgi/tech/1197448064/
06 http://pc11.2ch.net/test/read.cgi/tech/1205231499/
07 http://pc11.2ch.net/test/read.cgi/tech/1212587819/
08 http://pc11.2ch.net/test/read.cgi/tech/1219673793/
09 http://pc11.2ch.net/test/read.cgi/tech/1228372971/
10 http://pc12.2ch.net/test/read.cgi/tech/1235332603/
11 http://pc12.2ch.net/test/read.cgi/tech/1241885130/
12 http://pc12.2ch.net/test/read.cgi/tech/1247566074/
13 http://pc12.2ch.net/test/read.cgi/tech/1254281104/
14 http://pc12.2ch.net/test/read.cgi/tech/1262748898/
15 http://pc12.2ch.net/test/read.cgi/tech/1271261239/
16 http://hibari.2ch.net/test/read.cgi/tech/1280045912/
17 http://hibari.2ch.net/test/read.cgi/tech/1289182437/
18 http://hibari.2ch.net/test/read.cgi/tech/1298240666/
19 http://hibari.2ch.net/test/read.cgi/tech/1305754555/

前スレ:
Excel VBA 質問スレ Part20
http://hibari.2ch.net/test/read.cgi/tech/1312435844/

2 :デフォルトの名無しさん:2011/09/25(日) 15:21:09.23
ExcelのVBAに関する質問スレです

★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。

★2 ExcelのVBA以外の部分に関する質問はNGです。
   但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。

★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。

 VBAとは、『Visual Basic for Application』の略で
  Application
  ├Workbooks
  |└Workbook
  |  ├Worksheets
  |  |└Worksheet
 というApplication以下のオブジェクトを、VB言語で操作するものを指します。
 例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、
 セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。

★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。

★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み、
   コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
   ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。

★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)

3 :デフォルトの名無しさん:2011/09/25(日) 15:54:59.65
タッチダウン3げと

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のところがうまく動いてくれないので保存できるようにするにはどうすればいいでしょうか

5 :デフォルトの名無しさん:2011/09/25(日) 16:41:40.68
for eachでpicに入れているのに
Worksheets("Sheet1").Pictures(pic.Name)
これは突っ込んで良いのか?

6 :デフォルトの名無しさん:2011/09/25(日) 16:54:00.65
>>4
Picture オブジェクトにはExportメソッドが存在しないんじゃないの?
Chart オブジェクトなら使えるんだろうけど


7 :デフォルトの名無しさん:2011/09/25(日) 17:15:29.21
ではpictureオブジェクトをjpgで保存するにはどうしたらよいでしょうか

8 :デフォルトの名無しさん:2011/09/25(日) 17:17:04.33
ある名前のシートがbookに存在するかどうかのメソッドはないのかな
自分で調べりゃいいだけなんだけど、なんでないのかなと

9 :デフォルトの名無しさん:2011/09/25(日) 17:19:53.24
>>7
vbaでは機能自体がサポートされてない
webで検索するとシート自体をHTML保存するとpictureオブジェクトがそれぞれ独立した画像ファイルとして保存されるので、
それを拾い出して使う、というやり方が多いみたい


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

13 :デフォルトの名無しさん:2011/09/25(日) 23:29:27.27
>>8
自分で答え書いてるじゃん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
 
みたいな処理をしたいのですが、変数の文字列の一部分だけ
一致で判別して処理を選ぶというのはどうしたらいいのでしょうか?
「*」とかで挟んだりするのかなと思い調べてみたのですが、よくわかりません。
あるいは、これは出来ないことなんでしょうか?

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のやり取りが俺にはわからん。
俺が馬鹿なんだろうか?

20 :デフォルトの名無しさん:2011/09/26(月) 13:08:06.26
select case の条件式はIsってことだろ

21 :デフォルトの名無しさん:2011/09/26(月) 13:19:27.27
Select Case name
Case Is like "*tokyo*"
って言いたかったんじゃないだろうか...
俺もこれで行けるとおもったが、Select Caseのヘルプ見ると
>Is 演算子と Like 演算子以外の比較演算子と共に使われます。
つうことで、Likeはダメみたいだ

22 :デフォルトの名無しさん:2011/09/26(月) 15:21:56.30
http://homepage2.nifty.com/kmado/ke_m13.htm#E03M122

ここにある流れる文字について、
流れる文字のフォントサイズ変えることってできないですか?

23 :デフォルトの名無しさん:2011/09/26(月) 16:56:28.03
>>21
俺は

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

と質問しているので、IS=です と言っている
つまり「できないです」と言ってると思った。


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へ受け渡したいな、と思ったのですが、方法はあるのでしょうか??


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

28 :デフォルトの名無しさん:2011/09/26(月) 23:59:49.85
Excel2007のStrconv関数のヘルプで

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

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

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



29 :デフォルトの名無しさん:2011/09/27(火) 01:27:06.30
>>28
タイムゾーンとかだろ

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文に渡せば良いんじゃない?


32 :デフォルトの名無しさん:2011/09/27(火) 06:07:50.10
>>30
Isなんかその用途では使えないよ。
"2011_09_27osaka晴"って文字列は"tok"より小さいからね。
Select Caseなら>>19に書いてるようにする必要がある。
単純に一つずつならIf...Then...Else ステートメントでもいいと思うが。

33 :デフォルトの名無しさん:2011/09/27(火) 06:23:05.49
>>26
そのケースでエラーになるのはDic.Countが0か65536を超えたときだな。
TransposeはExcel2007以降は使えないこともあるから気を付けた方がいい。
他人に使わせるときは65536要素以内でしか使えないとかコメントを書いておかないとな。
WorksheetFunction.Transposeと同じ機能の関数は自分で作った方がいいよ。
文字数制限も要素数制限もないし、おまけに速いから。
少ないデータで使い捨てマクロならどうでもいいけど。

34 :デフォルトの名無しさん:2011/09/27(火) 06:28:20.37
補足
65536要素以内ってのは各次元がそれ以内ってことね。

35 :デフォルトの名無しさん:2011/09/27(火) 06:47:56.05
>>32さん >>19さん
ありがとうございます

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

のやり方で望みどおりのスクリプトが出来るようですね。問題が解決しました。
ありがとうございました。


36 :デフォルトの名無しさん:2011/09/27(火) 18:19:55.38
For t(1) = 1 to 5
For t(2) = 1 to 5



このような配列を使ったループを作りたいのですが、
”Forで指定された変数はすでに使用されています”とエラーメッセージが出てしまうのですがどうすれば良いのでしょうか
Excel2000、WindowsXPです

37 :デフォルトの名無しさん:2011/09/27(火) 18:37:45.67
>>36
無理
ヘルプに配列は使えないと明記されてる

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

39 :デフォルトの名無しさん:2011/09/27(火) 18:59:05.42
>>37
ありがとうございます

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
ありがとうございます。
オブジェクト指向って意外と身近な存在なんですね。

43 :デフォルトの名無しさん:2011/09/27(火) 23:13:34.01
Windowsそのものがオブジェクト指向で作られています

44 :デフォルトの名無しさん:2011/09/27(火) 23:20:09.67
話題に20年ぐらい乗り遅れてないかぁ?

45 :デフォルトの名無しさん:2011/09/27(火) 23:51:46.76
>>30は学校で<の意味習わなかったの?どうして'like'的な意味があると思っちゃったの?

46 :デフォルトの名無しさん:2011/09/27(火) 23:55:41.40
instarでよくね

47 :デフォルトの名無しさん:2011/09/27(火) 23:56:43.00
そしてワークブックを使っていればオブジェクト指向だと勘違いしてベタ書きする低級PGが量産される

48 :デフォルトの名無しさん:2011/09/27(火) 23:58:40.73
プロパティとメソッドの違い教えろください

49 :デフォルトの名無しさん:2011/09/28(水) 02:29:00.88
オブジェクト指向プログラミングに関して、VBAで出来ないこと
http://members3.jcom.home.ne.jp/daruma_kyo/aboutooa/vba_limit.html

50 :デフォルトの名無しさん:2011/09/28(水) 04:05:46.87
>>45
いや、最初無いと思ったんですが、>>16で質問してisといわれたので、isで不等号使って
望みどおりできるのかなと。ちょっとやってみたら出来た気がして

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

ほとんど初心者なんです。
>"2011_09_27osaka晴"って文字列は"tok"より小さいからね。
これも意味がわからないです。文字数という意味でなら前者の方が大きいと思うんですが
この場合何の大小の比較になるんでしょうか?

51 :デフォルトの名無しさん:2011/09/28(水) 07:09:23.17
>>46
InStrでもLikeでもどっちでもいいんだよ。
たいがいの人は両方使えるよ。

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
ありがとうございます。文字コードの大小だったんですね。
それだと確かに全然思い通りに分けられないですね。
理解しました。ありがとうございます。

54 :デフォルトの名無しさん:2011/09/28(水) 10:23:57.30
>>48
プロパティ=変数
メソッド=関数

55 :デフォルトの名無しさん:2011/09/28(水) 16:49:01.67
なんとなく理解できた

56 :デフォルトの名無しさん:2011/09/28(水) 17:26:18.01
今居るセルの1つ下の列から始めて
同じ列に文字が入力されているセルまでをloopで見つけたいのですが
Do
a = a + 1
Loop While Cells(a, 1) Like "*"
と考えてみたのですが駄目無限ループしていまします。
どなたか分かる方お願いします。

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
まさかとは思うが下方向に空欄しかないんじゃ
それと列って言ってるけど行のことだよね

60 :デフォルトの名無しさん:2011/09/28(水) 20:10:41.09
1つ下の行の同じ列ってことか
(a,b)
(a+1,b)

61 :デフォルトの名無しさん:2011/09/28(水) 20:17:08.39
>>56
Like "*"
だと セルが空欄でも(入っていても) 常に True になるよ
Likeの文字パターン * は任意の数の文字(=文字数0も含む)だから

62 :デフォルトの名無しさん:2011/09/28(水) 20:33:46.80
nなんでこんな知識が偏ってるんだ・・・・

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」でスレ内検索しました)

65 :デフォルトの名無しさん:2011/09/28(水) 22:18:38.38
pictureをエクスポートする方法を質問しました

66 :デフォルトの名無しさん:2011/09/29(木) 01:21:03.34
>>4

67 :デフォルトの名無しさん:2011/09/29(木) 08:05:31.43
ああ前スレじゃなかったですね

68 :デフォルトの名無しさん:2011/09/29(木) 08:21:44.17
あーそれhtmlで出さなくてもjpg出力できるわー
今ちょっと時間ないしどうやったか忘れたけど昔やったわー

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
できました
ありがとうございます

71 :デフォルトの名無しさん:2011/09/29(木) 23:55:22.48
Win7、Excel2010なんだけど、
IEのダイアログを操作する方法ってないかな?
ウィンドウハンドルとIHTMLDocumentは取得できるんだけど
ここから、フォームに入力したり、ボタンとかクリックする方法がないかな?

72 :デフォルトの名無しさん:2011/09/30(金) 10:51:15.62
Excel2007

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

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

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

(全く個人用なので公開とかするつもりは全っ然ないのですが)


73 :デフォルトの名無しさん:2011/09/30(金) 13:35:30.72
>>71
数年前にVB6で同じようなものを作ったが、ウィンドウハンドルは必要ない。

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 :74:2011/09/30(金) 20:57:22.20
>>75
シートに書くという基本的な事が頭から抜けてました。
ありがとうです。

78 :デフォルトの名無しさん:2011/09/30(金) 21:11:16.23

With Selection
.Replace what:=Worksheets("sheet1").Cells(3, 2),
replacement:=Worksheets("sheet2").Cells(3, 2).Value,
Lookat:=xlwhole,searchorder:=xlbyrows,matchcase:=false,matchbyte:=false
End With

この部分で構文エラーと出ます。何がいけないんでしょうか?

79 :デフォルトの名無しさん:2011/09/30(金) 21:14:38.11
>>76
いつの間にか証明書作れるようになってたんだな
それで作ると勝手に個人用ストアに作られてるみたいなんで、管理コンソールで移動すれば良いんじゃないかな
やり方はスレチなんで、MMC 管理コンソール 証明書 あたりでググって

80 :デフォルトの名無しさん:2011/09/30(金) 21:37:12.80
>>79
72です。出来ました。ありがとう!

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秒止まってくれません、記述の仕方に問題があるのでしょうか?
お願いします

82 :81:2011/10/01(土) 00:51:31.71
ごめんなさい、記述し忘れました。ループ操作を実行した時にペーストが数度繰り返されてしまいます。
どうか、お助けください

83 :デフォルトの名無しさん:2011/10/01(土) 00:54:08.83
スレタイ2000回読んだ方がいい

84 :デフォルトの名無しさん:2011/10/01(土) 01:00:10.36
>>78
それその位置で改行してるのか?
VBAはどこでも改行していい言語じゃないぞ

>>81
ここ、何のスレか解ってるのか?

85 :デフォルトの名無しさん:2011/10/01(土) 01:00:31.41
uwsc??

86 :81:2011/10/01(土) 01:04:24.72
>>83申し訳ないです。VBAに関するスレッドが見つからなかったもので、書き込んでしまいました。
>>84申し訳ないです。質問スレ等が見つからなかったのでお邪魔な書き込みをしてしまいました。
許してください・・
>>85
KMmacroというのを使っております


87 :デフォルトの名無しさん:2011/10/01(土) 01:34:52.43
それVBAじゃないみたいだけどVBAってなんだか分かってる?

88 :81:2011/10/01(土) 01:38:05.77
>>87そうなんですか!?オフィス上で自動化の作業をマクロを組んでおけば自動化してくれるものだと思っていました。


89 :81:2011/10/01(土) 01:58:45.57
81です、すごくお邪魔になるので自分はここから出て行きます。ご迷惑おかけしました。

90 :デフォルトの名無しさん:2011/10/01(土) 07:22:16.86
もう見てないだろうけどスレどころか板違い

こっちね
http://hibari.2ch.net/software/

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 :91:2011/10/01(土) 22:43:50.50
>>92
レスありがとうございます。
その、UnicodeからShift-JISへの変換が分からないのです。

たとえば、A1のセルに「あいうえお」と入力されていて、
下記のようにしても、ペーストできるようにはなるのですが、
?????という文字になってしまいます。

Dim buf As String
Dim CB As New DataObject
Dim myStr

myStr = Sheet1.Cells(1, 1)
buf = StrConv(myStr, vbFromUnicode)

With CB
.SetText buf ''変数のデータをDataObjectに格納する
.PutInClipboard ''DataObjectのデータをクリップボードに格納する
End With

度々すみませんが、よろしくお願いします。

94 :デフォルトの名無しさん:2011/10/01(土) 23:53:57.89
クリップボードってWin32APIレベルではデータの種別も持つようになってるんだけど
DataObjectってその辺設定するプロパティないよね
もしかしてunicode固定なんじゃないの?

95 :デフォルトの名無しさん:2011/10/01(土) 23:59:05.29
ClipboardFormats

96 :デフォルトの名無しさん:2011/10/02(日) 00:04:00.73
それは読み取り専用プロパティでしょ

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

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?)が少しずつ下から減っていきます。
理由が分からず、対応方法が思いつきません。
識者の方々、ご指導願います。

100 :デフォルトの名無しさん:2011/10/02(日) 10:15:48.44
以下チェックボックス操作時に実行されるプロシージャです。
このコードの中にリストボックスのサイズに影響を与える要素があるとは思えないのですが…
Sub ステータスチェック更新()
(略)
'リストボックス再表示
Call UserForm9_OK
'リストボックスの値を recordC へ取得
recordC = UserForm8.ListBox1.column()
ReDim recordD(8, UBound(recordC, 2))
k = 0
(続きます)

101 :99:2011/10/02(日) 10:18:29.77
(続き)
'レコードごとに処理
For i = 0 To UBound(recordC, 2)
For l = 0 To 3
If recordC(0, i) = Sstr(l) Then
If Scheck(l).Value = True Then
'条件を満たしたレコードを recordD へ順次格納
For j = 0 To 8
recordD(j, k) = recordC(j, i)
Next j
k = k + 1
(続きます)

102 :99:2011/10/02(日) 10:20:31.50
(続き)
End If
End If
Next l
Next i
'リストボックスへ recordD のデータを表示
UserForm8.ListBox1.column() = recordD
End Sub

長々と申し訳ありません。
どなたかよろしくお願い致します。

103 :99:2011/10/02(日) 10:23:51.40
すみません。これではわからないですね。宣言部分を一部追記します。
Dim Scheck(3) As Object
Set Scheck(0) = UserForm8.CheckBox1
Set Scheck(1) = UserForm8.CheckBox2
Set Scheck(2) = UserForm8.CheckBox3
Set Scheck(3) = UserForm8.CheckBox4

Dim Sstr(3) As String
Sstr(0) = "完了"
Sstr(1) = "報告可能"
Sstr(2) = "調査依頼中"
Sstr(3) = "調査中"

104 :99:2011/10/02(日) 11:00:48.73
リストボックスのHeight値を250以下に設定したら、減らなくなりました。
それ以上、300とかに設定すると250ぐらいまで少しずつ減りだすようです。
できれば450ぐらいで使用したいのですが。
これはバグなのでしょうか…?

105 :デフォルトの名無しさん:2011/10/02(日) 12:17:17.43
リストボックスの IntegralHeight がTrueになっていると、高さが自動調整されるので、
それをFalseにすればいいと思う。

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

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



106 :99:2011/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エディタです。



111 :デフォルトの名無しさん:2011/10/04(火) 21:36:44.63
普通は入ります
入らないのがおかしい
var = Sub1()とかしてんじゃねえの?

112 :デフォルトの名無しさん:2011/10/05(水) 08:24:03.92
変数内の文字列を抽出して別の変数に指定することは出来ますか?
たとえばaには"1234567890"が入っていて、その中から
bには"5678"を入れたいのですが。

113 :デフォルトの名無しさん:2011/10/05(水) 09:33:14.10
文字列から抽出??一部を抜き取るの?
そりゃあ無理だから希望の文字列を変数に代入してください


114 :デフォルトの名無しさん:2011/10/05(水) 09:44:33.78
>>111
普通は入らんのでは?
Callの有無で意味合いが変わってくるから気をつけてね

115 :デフォルトの名無しさん:2011/10/05(水) 09:47:55.06
>>113
やはり、無理なんですか。
一度aをセルに入れてMID乃関数でbに入れないと無理ですかね?


116 :デフォルトの名無しさん:2011/10/05(水) 09:52:43.61
コードレベルじゃなくて、何がやりたいの?
それを聞いた方が良いアドバイス出来そうだけど。

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
こういう場合どうすんの?


118 :112:2011/10/05(水) 10:20:56.45
>>116
Sub 確認_Click()

Dim 転記元 As Worksheet
Dim a As String
Dim Obj As Object

If Worksheets("MAIN").Range("Q23").Value = 2 Then
Set 転記元 = Worksheets("オーダー@")   
   a = Worksheets("MAIN").TextBox1      ’@
Else
Set 転記元 = Worksheets("オーダーA")
   b = Worksheets("MAIN").TextBox1   
a = 'bの文字列の中の一部分を入れたい    ’ A
End If

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

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

End If
End Sub

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

TextBox1はシート上のフォームです。
この場合はやはり、一度変数bをセルに代入してMIDで一部を抽出しaに
入れ直さないといけないのでしょうか?

120 :117:2011/10/05(水) 10:33:30.63
自己解決

Microsoft Browser Helpersにチェックを入れるんだって
IEが動作したのはこれで確認


121 :デフォルトの名無しさん:2011/10/05(水) 11:06:40.66
>>119

>>112の例だと
b = Mid(a, 5, 4)
じゃだめなの?

122 :デフォルトの名無しさん:2011/10/05(水) 11:49:45.66
>119
VBAの関数使えばセルに代入しなくても可能
一部を抽出するための、一部の部分を判定するルールどうなってるんだ?

123 :デフォルトの名無しさん:2011/10/05(水) 14:39:41.41
>>121,122
おっしゃる通り、関数と同じやり方で出来ました
まさかこんな簡単に出来るとは思いもよりませんでした
ありがとうございました


124 :デフォルトの名無しさん:2011/10/05(水) 21:51:15.79
VBAってインターフェースも実装できるんだね。
初めて知った。

125 : 忍法帖【Lv=13,xxxPT】  【東電】 【東電 70.3 %】 :2011/10/05(水) 23:43:30.70
EXCELでマクロを組みたくてVBAの勉強したいんだけど、オススメの本とかある?

126 :デフォルトの名無しさん:2011/10/06(木) 01:03:27.61
>>114
普通は入るだろ
どうして試しもしないで言ったの?

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 :132:2011/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

140 :デフォルトの名無しさん:2011/10/07(金) 18:16:41.05
>>126
試すとかじゃなくて普通じゃないの、君のは。

括弧の前にスペースが入るのは
戻り値を取得せず、Callも書かない場合。
これは普通じゃないぞ?
動き違うから勝手に省略しちゃだめだぞ?

141 :デフォルトの名無しさん:2011/10/07(金) 23:23:54.88
>>140
>>110みてみろ
もろ「戻り値を取得せず、Callも書かない場合。」やってるだろ
だからこれやった場合普通はスペースが入るって言ってんだ


142 :デフォルトの名無しさん:2011/10/08(土) 00:49:51.32
>>141
複数ある関数のうち1つだけって時点で>>110はバグとしか思ってない。
オレは「普通」について否定されたから根拠を示しただけなんだが。

143 :デフォルトの名無しさん:2011/10/08(土) 02:15:17.26
>>140
Callの有無で意味が変わるって、どういう事?
Callは単なるサブルーチン呼び出しで、
記述上は省略可能で、その有無によらず
同じ意味だと理解していたのだけど、
違いがあるの?
今までずっと、Letみたいに無くても困らない
ものだと思ってた…


144 :143:2011/10/08(土) 06:42:49.91
ゴメン、調べたらすぐ出た。
 http://www.gizcollabo.jp/vbtomo/log/archive/vbqanda_3453_0.html
にもあるように、引数argが1個のサブルーチンAをCall省略で呼び出す時に()を付けると
サブルーチンコールの引数リストを示す意味の()ではなく、
第1引数を示す式中の演算子として()が評価され、Aには(arg)という式を評価した結果が渡される。
つまり、引数が右辺値を示すものになり意図によらず値渡しされる動作になる、という事ですね。

A (arg) '(arg)という式の演算結果を値渡し
A arg 'argそのものを引数として渡す(渡し方はAの定義次第)
Call A(arg) 'argそのものを引数として渡す(渡し方はAの定義次第)

断続的にVBを10年近く使ってたけど、たまたまこういうシーンに出くわさず、
知りませんでした…

145 :デフォルトの名無しさん:2011/10/08(土) 07:43:09.99
>>144
いや、>>140もそうなんだけど、
この質問主が聞きたいのは
スペースが入る理由なんだよね。
だからそれに対する回答をしなちくゃいけない。

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

これだけでオッケー。
動作が違うとかは質問に対する回答になっていない。

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


149 :デフォルトの名無しさん:2011/10/08(土) 12:54:11.14
>>145
スペースが入る理由はそれでオッケーだとして
じゃあsub1と3はスペースが入らない理由は?って話になるんだが

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

昔なんか似たような現象を見た気がするんだが、
その時は非公開なエクセルで定義済みの名前とかぶってたの原因だったような

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

昔なんか似たような現象を見た気がするんだが、
その時はブック再作成で直ったような

151 :デフォルトの名無しさん:2011/10/08(土) 13:48:59.53
>>149
だから>>111で聞いた
>>110からは返答ないけど

152 :デフォルトの名無しさん:2011/10/09(日) 09:26:18.32
質問させてください。
WinXP、Excel2003です。

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

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

別々に動かせばいいだけなのですが、マクロAの後にVBEにアクセスできる状況が不安です。
@Aを上手く連動させる方法はないでしょうか。
よろしくお願いします。

153 :デフォルトの名無しさん:2011/10/09(日) 14:27:07.89
すいません、ちょっと意味が分からないです。
でも面白い事してますね〜
自分も昔、同じように自身のコードを追加、変更し実行するというマクロを作りました。
その時は変更内容が開き直さないと反映されない事と、
2007以降のデフォルト設定ではVBEに対するアクセスが出来ない為諦めましたが。

154 :デフォルトの名無しさん:2011/10/09(日) 15:00:16.65
読み直してみましたが、
2の呼び出しコードは動的に生成されますか?
であればコードがロードされていないのでは?

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

自分だったら、パスワード保護が必要なコード(機能)はアドインに実装。
ブックの生成機能はそこに持たせますかね。

155 :152:2011/10/09(日) 17:56:29.14
少し長くなりますが…。
「CSVファイルを計算シートに張り付けて、抽出されたデータを記録シートに張り付ける」
という作業を自動化させたものです。
私自身が独学であることに加え、他の人間は完全に素人です。
また、仕事で使うものですから最低限のセキュリティは設けたい為にロックしました。

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

アドイン案もあったのですが、とりあえず完成させた後に分離させるというのが一つ。
ファイルが2つ以上に分かれると、移動などで欠損しやすいかなというのが二つ目の理由です。
むろん勉強不足もありますが…。

156 :152:2011/10/09(日) 18:02:52.72
Sub マクロ1()

Call ロック解除

Worksheets("Sheet1").Activate
Cells.ClearContents
With ThisWorkbook.VBProject.VBComponents("UserForm1").CodeModule

    .DeleteLines .ProcStartLine("分類マクロ", 0), .ProcCountLines("分類マクロ", 0)
    'マクロが重複するので削除  

    Call 書き出し_分類マクロ
    '文字列の切り貼りで、Sheet1に「Sub〜EndSub」を書き出します。

    Worksheets("Sheet1").Activate
    最終行 = Range("A65535").End(xlUp).Row
        For i = 1 To 最終行
        .InsertLines 2, Cells(最終行 - i + 1, 1).Value
        '一行目は「Option Explicit」 2行目にお尻から挿入していきます。
        Next i

End With

'最後に上書きして閉じ、パスワード保護を復活させる。
End Sub


157 :152:2011/10/09(日) 18:11:55.55
Public Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, _
  ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Private Sub ロック解除()

'パスワードは仮で「a」にしています。

Call sendkeybd_event(vbKeyMenu, vbKeyT)
Call sendkeybd_event(vbKeyM)
Call sendkeybd_event(vbKeyV)
Call sendkeybd_event(vbKeyMenu, vbKeyT)
Call sendkeybd_event(vbKeyE)
Call sendkeybd_event(vbKeyA)
Call sendkeybd_event(vbKeyReturn)
Call sendkeybd_event(vbKeyReturn)
Call sendkeybd_event(vbKeyMenu, vbKeyF4)
AppActivate "Microsoft Excel"

End Sub


Public Sub SendKeybd_event(arg1 As Integer, Optional arg2 As Variant)
'ここが完全に丸写しです。
'内容も完全に理解できていません。
       '書き込みが長大になるので、上記アドレスからコピーをお願いします。
End Sub


以上が該当部分のマクロです。
実際設定変更を掛ける部分は6カ所くらいあります。

158 :154:2011/10/09(日) 18:58:59.05
ん〜PGとしては、パスワード設定の部分は「無い」ですね。
ワークシート上のボタンで起動するマクロであれば、
For i = 0 to 30000
DoEvents
Next i
で処理開始を遅らせ、その間にVBEを前面に持ってくれば動きません?
これはキーボードをエミュレートしているだけですので。

仮に、メインの処理が長引き、
ユーザーが違うウィンドウを前面に設定してしまった場合、
そのせいでパスワードがメモ帳に貼り付いてしまったりという事が考えられます。
AppActivateに指定するのもアプリ名ではなくウィンドウタイトルだったような・・・

159 :154:2011/10/09(日) 19:20:36.03
>.InsertLines 2, Cells(最終行 - i + 1, 1).Value
これは分類の定義をコード上に書いているのでしょうか?

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

であれば別シートに定義するのが良いと思います。
パスワード解除も不要ですし。

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回しか実行されないの?確認した?
条件付書式で出来そうだけど出来ないの?

162 :152:2011/10/09(日) 21:33:32.14
>AppActivate
ググってみると、「同一のタイトルが存在しない場合は、引数titleで指定された文字列で始まるタイトルを探します」とありました。
複数のエクセルを開く必要があれば、正確に指定する必要がありますね。
構造を変えることがあれば注意したいと思います。


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


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


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

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

長い&分かりにくくて申し訳ありません。

163 :デフォルトの名無しさん:2011/10/09(日) 22:50:41.22
レスありがとうございます。
Application.ScreenUpdatingについては存じませんでした。処理の前後に切り替えを挟んで
みて、試してみます。
呼び出し元はイベントです。
Subの呼び出しの増減はありうるんですが、たとえば10回程度の呼び出しであっても、
前述のページ設定などの実行がなされた後だと、エクセルを再起動しない限り完了までに
数秒はかかっていました。
Subでは、その他の処理もやっていましたが、問題の箇所を条件付書式で解決できるようで
あれば、分離させようと思います。
「その他の処理」が原因でないことは確認しています。

164 :163:2011/10/09(日) 22:51:32.10
>>163>>161あてです。すいません。

165 :154:2011/10/09(日) 23:40:58.60
>>162
ごめんなさい、やっぱり分からないです。

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

166 :152:2011/10/10(月) 00:14:27.17
>>165

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

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

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

171 :デフォルトの名無しさん:2011/10/10(月) 18:14:32.53
>>25
レジストリに書けばいけんじゃね?

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
それは知ってるけど、全く関係ない話じゃん

174 :172:2011/10/10(月) 19:19:00.20
え?
これでできるんじゃないの?


175 :デフォルトの名無しさん:2011/10/10(月) 19:24:15.71
「配列→セル」、コード的には「セル=配列」なら>>172すら必要ない
「セル→配列」、コード的には「配列=セル」だと>>172は役に立たない

んで今回は後者

176 :167:2011/10/10(月) 22:19:00.50
すいません
出かけてる間に色々と申し訳ないです

まさに>>169のようなことだったのですが
やはり標準機能では無理なのですね

図に感動しましたし
貴重な意見もいただけ勉強になりました
ありがとうございます

177 :デフォルトの名無しさん:2011/10/11(火) 09:51:36.18
L = Range("A1").Value
Cells(5, 5).FormulaR1C1 = "=SUM(R20C" & L & ":R20C1)"

Dim L As Integer を入れなくても動いたのですが、これはこれで大丈夫なんですか?

178 :デフォルトの名無しさん:2011/10/11(火) 10:24:45.09
Option Explicit
入れてないんでしょ

今はそれでよくてもいずれ痛い目にあうよ

179 :デフォルトの名無しさん:2011/10/11(火) 10:26:05.03
>>177
Variant型になるだけで今はおかしくないけど、
凡ミス時にちゃんとエラー吐かせたいなら、
なるべくOption Explicit設定しといた方が良いと思う。


180 :152:2011/10/12(水) 00:49:55.27
>>165

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

お陰様でマクロを完成できそうです。
改めてお礼を言わせてください。
駄文にお付き合いくださって本当にありがとうございました。
頑張ります!

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
メニューの下に表示されてない?

188 :デフォルトの名無しさん:2011/10/14(金) 15:29:47.14
VBAで行番号振れよ

189 :デフォルトの名無しさん:2011/10/14(金) 15:46:43.29
>>186
だろうかな、、、、とは思ったんですが

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



190 :デフォルトの名無しさん:2011/10/14(金) 21:12:16.25
ところで行番号が必要になるってのはどういう状況なんだろう。


191 :デフォルトの名無しさん:2011/10/14(金) 21:23:19.88
err.LineNumber
から特定したいんだろ

192 :デフォルトの名無しさん:2011/10/14(金) 23:32:25.94
プログラム生産量を行数で報告させられる。

193 :デフォルトの名無しさん:2011/10/15(土) 01:03:07.29
エクセル2003 XPです。

ファイルからデータ読み込んで、セルに書かずに
記憶してグラフにするにはどうすればいいですか?

194 :デフォルトの名無しさん:2011/10/15(土) 01:53:25.82
セルに書かずにグラフにする

それは出来なくはないけどExcelの仕事じゃない
故にスレ違い

195 :デフォルトの名無しさん:2011/10/15(土) 02:02:19.32
なぜに?


196 :デフォルトの名無しさん:2011/10/15(土) 04:22:04.80
良く知らないんだけど、グラフのデータソースって、
セル範囲以外も指定出来るもんなの?

197 :デフォルトの名無しさん:2011/10/15(土) 07:51:59.24
非表示シートに書き込んでおけば良いじゃない

198 :デフォルトの名無しさん:2011/10/15(土) 08:28:17.58
>>193
できない…と思ってたけど
X・Yの数値を配列に入れてグラフのオブジェクトに
セットする方法があるみたいね。

chart.seriescollection.newseriesでググって
一番上に出てきたサイトの中の
5 数値を直接コードからに指定してグラフを作成するには?
にそのサンプルコードがある。

199 :196:2011/10/15(土) 09:23:43.85
>>198
をを、感謝!
193じゃないけど、家に帰ったら早速ためしてみる。

200 :193:2011/10/15(土) 10:52:17.41
ありがとう
必ず、グラフ用にデータが並んでるとは限らないから
配列からグラフにできたら、規則性はあるけどグラフ用に
並んでいない場合とかにも応用できるので、もし出来るのら
知りたかった。

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 :201:2011/10/15(土) 16:19:21.24
>>202

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

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

原因は不明ですが、このコードに問題はなさそうですね。
ありがとうございました!

204 :デフォルトの名無しさん:2011/10/15(土) 20:48:15.04
積極的にバリアント使うのが問題かな

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

207 :デフォルトの名無しさん:2011/10/16(日) 07:54:45.29
VBAに関数オブジェクトなんて無いぞ。
Deleteした時点でxが無効な状態になってそれっきりじゃん。

208 :デフォルトの名無しさん:2011/10/16(日) 07:58:32.85
>>206
まず制御が分かってないな
[F8]キーでステップ実行してみるといいよ

分からないメソッドはヘルプ参照するなり
ググるなりして

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
何も解ってない初心者を騙すのは良くないぜ

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

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が正解。

213 :デフォルトの名無しさん:2011/10/17(月) 06:58:50.28
いるよなあ。
コードを見ると反射的に最適化しまくる香具師ってw
>>206の質問の意図も、元のコードをできるだけ残して
最小限の変更で動くようにしてあげた>>211の配慮も
まるでわかってないんだろう。

プログラムばっかりやっていて対人関係を疎かにしていると
こういう空気を読めないコミュ障になるから気をつけよう。

214 :デフォルトの名無しさん:2011/10/17(月) 20:19:29.71
同じようなコードは俺も考えたけど、
Do-Loopの両方に抜け出し条件を付けないのも、
それはそれで嫌な感じなんだよなあ。
あと、質問者のコードはClearじゃなくてDeleteだから。

215 :デフォルトの名無しさん:2011/10/17(月) 20:28:23.92
わかっててDeleteを使ってんならいいけど、なんとなくわかってない気がするんだよなあ>質問者
元ソースの書き方だと詰める方向を明示しても良さそうなのに書いてないし

216 :デフォルトの名無しさん:2011/10/17(月) 20:54:56.39
いるよなぁ
>>213みたいに上から目線で得意げになっちゃう子。

プログラムばっかりやっていて対人関係を疎かにしていると
こういう空気を読めないコミュ障になるから気をつけよう。

217 :デフォルトの名無しさん:2011/10/18(火) 00:55:59.46
ちょいと聞きたい。
料理のレシピなんかを管理したいときって、ExcelでVBA使うのとACCESS使うのどっちがいいんだろうか。
(料理名で検索したり、逆に使用している材料で検索したりしたい)

218 :デフォルトの名無しさん:2011/10/18(火) 01:08:39.49
Access

219 :デフォルトの名無しさん:2011/10/18(火) 01:37:32.04
>>218
サンクス!やっぱアクセスか。
値段が高いからExcelで済ませたかったんだが仕方ない。

ついでに聞きたいんだが、VBAの用途ってどんなものがある?
やっぱ計算メイン?DBと接続とか出来た気もしたんだが。

220 :デフォルトの名無しさん:2011/10/18(火) 01:44:02.45
>>217
とりあえずExcel

テーブル設計ができているのならAccessだろうが
料理のレシピって、どんなテーブルを使うのか見当がつかない


221 :デフォルトの名無しさん:2011/10/18(火) 01:52:45.70
>>220
検索重視ならAccessだな
材料とかジャンルとか調理方法とか、テーブルの作り方次第でどうにでもどきる

222 :デフォルトの名無しさん:2011/10/18(火) 01:53:25.19
まぁ対人関係のよいっていうか人格者にはキレのあるコードを書けるやつが少ないのは確かだ。

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でも問題ないからな。
その方が早いし。 

224 :デフォルトの名無しさん:2011/10/18(火) 02:40:37.27
あとDeleteならFindNextはちょっと面倒になりそうだな。

225 :デフォルトの名無しさん:2011/10/18(火) 02:42:20.44
そもそも>>223みたいなのはReplaceメソッドを使うべきだな。

226 :デフォルトの名無しさん:2011/10/18(火) 02:50:09.29
コードだけ書いたんじゃ、知識のない奴には、どの回答が一番良いのか
どのコードにどういう問題があるのか解らなくて混乱する
奴の書き方は確かに諄いけど、間違ったこと書いてないし
他の回答者から見たらカチンとくるかもだけど、質問者から見たらむしろ
ありがたいだろうな

227 :デフォルトの名無しさん:2011/10/18(火) 02:53:47.59
>>226
>>212>>223>>225まで気づいてたのかねぇ。
まぁFindメソッドのヘルプの添削だから知ってるかも知らんが。

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 :229:2011/10/18(火) 03:10:11.71
>>229

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

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

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

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

● オーバーフローになる

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

んですがどうすればいいでしょうか?

231 :196:2011/10/18(火) 08:27:09.75
>>230
きれいな日本語で書き直して。

232 :デフォルトの名無しさん:2011/10/18(火) 09:14:55.40
>>219
>値段が高いからExcelで済ませたかったんだが仕方ない。


RDBにするならMySQLやPostgreSQLでもいいやん
自分で使うぶんには無料だし

233 :デフォルトの名無しさん:2011/10/18(火) 10:26:15.56
無料のSQLserverでもええやん

234 :デフォルトの名無しさん:2011/10/18(火) 10:32:08.13
>>230
変数bの内容が最初から最後までずっと0のまま
まずはそこを直せ

235 :229:2011/10/18(火) 12:43:14.94
>>234
やり方がわかりません・・・

確かにF列の該当セルが空欄になっちゃいます・・

236 :229:2011/10/18(火) 13:32:57.52
書き直しました

Sub あああ()

Dim a As Long
Dim b As Long
Dim c As Long
Dim d As Long
Dim e As Long

a = 2
Do While Cells(a, 1).Value <> ""

If Cells(a, 3) = Cells(a - 1, 3) And Cells(a, 2) >= 15 Then

b=Cells(a - 1, 5)

c = WorksheetFunction.SumIf(ActiveSheet.Range("f2:f200"), "b = 1 ")

d = WorksheetFunction.CountIf(ActiveSheet.Range("e2:e200"), "b > 0")

End If

a = a + 1

Loop

e = c / d

Cells(8, 8) = e

End Sub

237 :229:2011/10/18(火) 13:33:34.74
>>236を実行すると「オーバーフローしました」というエラーが出てしまいます

238 :デフォルトの名無しさん:2011/10/18(火) 13:50:54.13
>>237
レス直前に、変数bとRANGE修正してたか。

とりあえず、「SumIf」「CountIf」の使い方も間違ってる気がする。
変数c,dがゼロになるから、変数eの計算をゼロで除算してる。

239 :229:2011/10/18(火) 14:11:01.15
>>238
>変数c,dがゼロになるから、変数eの計算をゼロで除算してる。
問題点がわかりました。
ありがとうございます

240 :これでなぜ、エラー1004ですか:2011/10/18(火) 15:04:40.77
Sub 入力ボタン_Click()
Worksheets("転載部分").Activate

Dim e As String
Dim f As String
Dim g As String
Dim h As Integer

Dim nexter As Long

' 改行の動作が、これ。

nexter = ActiveSheet.Cells(3, 1).End(xlDown).Row

e = 有利な特徴.Value
f = 分野.Value
g = レベル.Value
h = ポイント.Value
Worksheets("転載部分").Cells(nexter + 1, 1).Value = e

途中まで、転載しました。この最後の行で、止まります。もう、謎です。たすけて。

241 :デフォルトの名無しさん:2011/10/18(火) 15:16:29.11
>>240
エラーが出た時、変数nexterがいくつになってるか確認

242 :これでなぜ、エラー1004ですか:2011/10/18(火) 16:07:44.33
65536になってます。本当はこれ、3のはずなんです。

243 :これでなぜ、エラー1004ですか:2011/10/18(火) 16:10:28.52
4行目が空白セルで、この空白セルの一つ上のセルを自動的に見つけてくれるはずなんです。

244 :これでなぜ、エラー1004ですか:2011/10/18(火) 16:13:51.14
nexter = ActiveSheet.Cells(2, 1).End(xlDown).Row

にしたら、下の行へ下の行へと行かず、4行目のセルばかりをセレクトするようになります。
後半部を下にペーストします。

Cells(nexter + 1, 2).Value = f
Cells(nexter + 1, 3).Value = g
Cells(nexter + 1, 4).Value = h
Range(Cells(nexter + 1, 1), Cells(nexter + 1, 4)).Select
(罫線のところ中略)
ActiveCell.Offset(1, 0).Select

End Sub

245 :デフォルトの名無しさん:2011/10/18(火) 16:27:24.33
A列の最終行

246 :これでなぜ、エラー1004ですか:2011/10/18(火) 16:27:58.40
自己解決しました。

いったん、セル改行をされなくなるようにしてから動作させて、
再び元に戻したら、アプリケーションやオブジェクトの問題が起きなくなりました。

謎は残ります。自己解決とはいえ、なぜこうなるのかご存知でしょうか。

247 :これでなぜ、エラー1004ですか:2011/10/18(火) 16:42:31.46
また、問題がぶり返しました。コンボ・ボックスを追加したら、先程の手順でも効果がなくなりました。

248 :これでなぜ、エラー1004ですか:2011/10/18(火) 16:45:33.72
とりあえず、初期状態の文字入り(.value有り)のセルを2行の厚さにしました。これも、応急処置です。

249 :これでなぜ、エラー1004ですか:2011/10/18(火) 16:55:39.81
スポーツ界も格闘界も芸能界もIT業界もヤクザが幅を利かせてると
聴きましたが、興業はともかく、なんでITもなんでしょうか。

250 :952:2011/10/18(火) 20:05:28.96
関数にdll使うのって、vbaのみで作った場合と比較して
計算速度としては優位になるのでしょうか。
目くそ鼻くそ?

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
とするかな

252 :デフォルトの名無しさん:2011/10/18(火) 20:28:56.25
>>250
作って比較すりゃ分かるじゃん。
俺のはdllの方が速いよ。


253 :デフォルトの名無しさん:2011/10/18(火) 20:34:34.30
>>249
人身売買は893の専売特許

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


255 :デフォルトの名無しさん:2011/10/19(水) 01:01:18.89
ご冗談を…

256 :デフォルトの名無しさん:2011/10/19(水) 03:05:26.89
常識的に考えれば、DLLで行う処理が(呼び出しのオーバーヘッドも含めて)VBAで行う処理より早ければDLLが早いし
そうじゃないならVBAの方が早いって結果になるんだが
そこに有利も不利もないだろ

257 :デフォルトの名無しさん:2011/10/19(水) 09:09:30.57
そういえばVBAにもコンパイルってあったよな
それも比較してみたら?


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ではない)

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型変数に取得して
範囲を消してから書き出す。

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の実行について
説明がよくわからなく、自分で追加していいのか教えてほしいのが趣旨です
よろしくお願いします

274 :デフォルトの名無しさん:2011/10/21(金) 13:37:52.79
>>273
>>1を100万回読んでね

275 :デフォルトの名無しさん:2011/10/21(金) 14:24:15.02
>>269-270

ほんとにありがとーーーーーーーーーー!(涙)涙出るほどうれしいよ。

こうやって合体させたよ。
Sub Macro2()
For r = 1 To ActiveSheet.UsedRange.Row
Cells(r, 1) = Application.WorksheetFunction.Clean(Cells(r, 1))
Next
With Range("A1",Range("A"&Rows.Count).End(xlUp))
  .Value=Application.Clean(.Cells)
End With
END SUB

詳しいコード内容はわからないが、
これでA列がクリーンされた。

関数によって簡単にVBAに組み込めないものもあるのだろうか?
ほんと感謝



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

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

  'データ削除
DeleteSetting APPNAME

MsgBox "レジストリ掃除完了"

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

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

※例のセルA6には、ifや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

280 :デフォルトの名無しさん:2011/10/21(金) 20:25:17.58
>>277
日本語おかしいけどユーザ定義関数で解決する話じゃないの?


281 :デフォルトの名無しさん:2011/10/21(金) 21:00:16.85
>>277
自分のVBA関数内でApplication.Volatileを記述すると幸せになれるかも。

282 :デフォルトの名無しさん:2011/10/21(金) 21:04:37.70
>>279
なんでループ回すの?
>>270読んだ?

283 :デフォルトの名無しさん:2011/10/21(金) 21:11:31.57
ループ回すにしてもUsedRange.Columns(1).Cellsは下手だわな。
UsedRange.Resize(,1)とすればセルの集合になるし。

284 :デフォルトの名無しさん:2011/10/21(金) 21:39:40.87
>>276
再現できない

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



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
なるほど、そういえばそうだな。

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にテンプレートに保存されてる名前指定しないとエラーになるな

290 :デフォルトの名無しさん:2011/10/22(土) 01:56:30.15
>>283
コードの可読性って知ってる?

291 :デフォルトの名無しさん:2011/10/22(土) 06:15:39.57
可読性はどっちも変わらないよ。

292 :デフォルトの名無しさん:2011/10/22(土) 06:21:27.04
そういえばOffset(,1)とすると可読性が落ちるとかいう先生がいたな。
Offset(0,1)としなさいみたいな。
Resizeの第一引数がないから可読性が落ちると思ってたりして。


293 :288:2011/10/22(土) 08:42:11.99
>>289
ためしにグラフのテンプレートを作ってそれを指定したらうまくいきました。
thx!

294 :デフォルトの名無しさん:2011/10/22(土) 09:03:09.96
>>291
残念、ハズレ

295 :デフォルトの名無しさん:2011/10/22(土) 09:57:19.71
最近vb.netやってて久しぶりにVBA でちょこっとPG組んでみたけどなんか凄い違和感を感じた。
やっぱりあまり入力補完が効かないせいかな。

可読性は大事だね。変数名とかにも拘れば、その分
説明のコメントを省略出来たりすることもあるしね。


296 :デフォルトの名無しさん:2011/10/22(土) 11:01:55.28
可読性なんてのはその人のレベルで違う。

297 :デフォルトの名無しさん:2011/10/22(土) 11:05:35.02

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

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

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

はてさて、、、

298 :デフォルトの名無しさん:2011/10/22(土) 11:08:08.95
>>295
VBAでは入力補完が効く書き方が概ねセンスのよい書き方だ。
入力補完が効かない場合でもきちんと固有の型の変数に一度代入すれば入力補完が効く。
たとえばWith ActiveSheetとやっても駄目だが、Worksheet型の変数に
Set sh = ActiveSheet
With sh
とすれば入力補完が効く。


299 :デフォルトの名無しさん:2011/10/22(土) 11:10:30.77
>>297
その人のレベル。

300 :デフォルトの名無しさん:2011/10/22(土) 11:12:30.41
欲しいのは1列目のセル集合
@ 使用範囲 の 列(1) の セル
A 使用範囲 の サイズ変更(,1)
はてさて、、、

301 :デフォルトの名無しさん:2011/10/22(土) 11:13:33.15
どっちも同じ

302 :デフォルトの名無しさん:2011/10/22(土) 11:15:55.78
@ 使用範囲 の 列(1) の セル
A 使用範囲 のセル集合のサイズ変更(,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) のセル集合
Aセル集合の使用範囲のサイズ変更(,1)
ってことだろ?

305 :デフォルトの名無しさん:2011/10/22(土) 12:34:59.89
┐(´ー`)┌

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を使うだろうな。

307 :デフォルトの名無しさん:2011/10/22(土) 14:06:46.59
失礼、
上級者ほどResizeを使わないだろうな。
の誤りです。

308 :デフォルトの名無しさん:2011/10/22(土) 14:16:01.87
>>307は下手くそな成りすまし
>>306ではない
おまえは下手を自覚した方がいい。

309 :デフォルトの名無しさん:2011/10/22(土) 14:29:00.56
話反れるけどVBA上級者ってどんな人?
PGならVBから入った人が多くて、そっちの機能で大体の事は出来ちゃうと思うし、
現場で使う人は、機能は知っててもプログミングの基礎知識が無いだろうし。

自分の周りに上級者が居ないので気になりました。

310 :デフォルトの名無しさん:2011/10/22(土) 14:34:35.64
全くの素人です。あるフォルダ―の中のエクセルファイルがあります。
のファイルの中にはいろいろ個別のデータが書き込まれているのですが、
中身チェックのマクロとか組めば、各ファイルを開いて簡単に中身を読み込んで、
一覧表みたいなのはできるのでしょうか?

311 :デフォルトの名無しさん:2011/10/22(土) 14:38:57.21
VBAで上級者はいない
これデフォ

312 :デフォルトの名無しさん:2011/10/22(土) 14:46:31.92
できる事も、やれる環境も限られてるからな
プレハブで豪邸が建たないとの同じようなもんだ
プレハブにはプレハブのいい所があるんだから、そこを重視すべき

313 :デフォルトの名無しさん:2011/10/22(土) 15:04:06.01
たまに、「うちの業務は全部この Excel 帳票でやってます」
なんてのがあるけど、物には限度ってものがあるよな。

314 :デフォルトの名無しさん:2011/10/22(土) 15:18:10.23
>>310です。 ぐぐったら出てきました。 自己解決です。

315 :デフォルトの名無しさん:2011/10/22(土) 15:29:52.56
「上級者ほど〜を使う」というのは、上級者じゃないと把握出来ない
つまり「上級者ほど〜を使う」というのは、「俺は上級者」と遠回しながらドヤ顔で言ってるのと同じ

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

うわぁ、痛すぎw

316 :デフォルトの名無しさん:2011/10/22(土) 16:17:33.95
309だけど自演じゃないよ。
「プレハブ工法を知り尽くした男」に尊敬や憧れなんて無いし。
偉いとは思うけどね。
やっぱ上級者を育てる土壌がないのか、危険な言語だわ

317 :デフォルトの名無しさん:2011/10/22(土) 16:28:19.27
上級者ほど道具を使って
マニアックになって行く

318 :デフォルトの名無しさん:2011/10/22(土) 16:41:24.11
というか、想定用途が違うんだから、VBA 以外でやったら上級者とかいう話じゃないでしょ。
むしろ、VBA で済ますべきか他の方法を使うべきかを見極められるのが上級者。

319 :デフォルトの名無しさん:2011/10/22(土) 16:53:54.68
> 1列目に限れば
条件を勝手に限定せず
条件が変わっても違和感無く柔軟に対応できる方法を使うのが上級者

特定条件での端的なすっきりさを優先して、1列目ならResize、2列目以降ならColumnsと
やりかたをコロコロ変えるのが初心者

320 :デフォルトの名無しさん:2011/10/22(土) 17:21:01.86
だそうだ

321 :デフォルトの名無しさん:2011/10/22(土) 18:51:17.38
実行時バインドのItemプロパティを多用する奴に上級者はいない。


322 :デフォルトの名無しさん:2011/10/22(土) 18:59:45.85
>>316
プレハブの例え挙げたの俺だけど、>>318が正解
震災の仮設住宅設営で、一級建築士も宮大工も必要ない
言語は道具なんだから、きっちり使いどころを押さえているのが肝要

まぁプレハブ工法を極めるのもアリでしょ
かなりのスピードと精度を求められると思うが

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


324 :デフォルトの名無しさん:2011/10/22(土) 19:18:38.01
Range(場所).Columns(1)

325 :デフォルトの名無しさん:2011/10/22(土) 19:19:38.02
ああ、ColumnsじゃなくてRowsか

326 :デフォルトの名無しさん:2011/10/22(土) 19:20:37.77
>>324
どちらへのレス?

327 :デフォルトの名無しさん:2011/10/22(土) 19:22:30.80
ちょい遅かったか。
>>324-325>>319か?

328 :デフォルトの名無しさん:2011/10/22(土) 19:25:18.84
>>323
どちらが楽かと言われれば当然後者だわな。

329 :デフォルトの名無しさん:2011/10/22(土) 19:36:40.52
分かってる人もいるにはいるんだな。

330 :デフォルトの名無しさん:2011/10/22(土) 19:41:10.60
何故に自演してまで・・・

331 :デフォルトの名無しさん:2011/10/22(土) 19:44:58.29
また始まったなw

332 :デフォルトの名無しさん:2011/10/22(土) 19:52:23.38
>>324=>>319だったらかわいそうだな。

333 :デフォルトの名無しさん:2011/10/22(土) 19:59:37.98
一方を書いたの俺だが、=はハズレなので可哀想じゃないわけだね

334 :デフォルトの名無しさん:2011/10/22(土) 20:04:13.88
>>324-325ならどっちにしてもかわいそう

335 :デフォルトの名無しさん:2011/10/22(土) 20:58:37.29
                           _,====ミミミヽ、
                         ,,==≡ミヽミヾミミミ、ヾ、
                       _=≡≡三ミミミ ミミヾ、ソ)),,》  .
                     彡彡二二三≡ミ-_ ミミ|ノノj )||ヽ, )、
                 __,,,,,,,,,/彡二二二    ,- __ミ|/ノ ノノノノ) ||
                -=二ミミミミ----==--'彡 ∠ミミ_ソノノノノ ノ
                  //>=''"二二=-'"_/   ノ''''')λ彡/
        ,,/ ̄''l       彡/-'''"" ̄-=彡彡/ ,,-''",,,,,,,ノ .彡''"
       (,  ,--(      彡 ,,-- ===彡彡彡"_,-_   ヽ Υ
       ヾ-( r'''''\    //=二二''''''彡ソ ̄ ∠__\ .\ソ  .|
         \;;;;  \   Ζ彡≡彡-'''',r-、>   l_"t。ミ\ノ,,r-v   / ̄ ̄ ̄ ̄ ̄ ̄
           \;;;;  \  彡""彡彡-//ヽ" ''''''"" ̄'''""(エア/  /
            \;;  \'''''')彡ヽ// | (tv   /|  , r_>'|  < 一体(ry
             \;;;  \'"  \ ,,"''-,,ノ,r-", /  r'''-, .j   \
               \;;;  \ /,,>--'''二"''' r-|   二'" /  __  \______
                \;;r'""彡_l:::::::::::::::::::::: /./_   " / ̄ ̄"===-,
                  )''//rl_--::::::::::::::::/:/ヽ"'=--":



336 :デフォルトの名無しさん:2011/10/22(土) 21:04:01.01
アホと戦うのも疲れるよ。


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
厨房でも設問の「ただし空気抵抗は考慮しない」云々の但し書きに
あーだこーだぬかす奴がいるでしょ
それと同じだよ
問題の本質を捉えられない馬鹿は普通にいる

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

342 :デフォルトの名無しさん:2011/10/23(日) 10:38:38.30
Sheet1が先に見つかったらエラーですかw

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
なんてなるんだろうけど。

344 :デフォルトの名無しさん:2011/10/23(日) 16:58:43.47
ん?Testシートが既存の状態でsheet1が先に見つかったら同じ名前を付けようとしてエラーになるやん。

でも講座用なら別にこんなん普通やろ。>>340に同意だな。

345 :デフォルトの名無しさん:2011/10/23(日) 17:06:56.96
おっと、たとえばグラフシートに"Test"とかあった場合上ではNGか。
shをObject型で宣言して
Set sh = Worksheets(TO_NAME)じゃなく
Set sh = Sheets(TO_NAME)だな。

346 :デフォルトの名無しさん:2011/10/23(日) 18:12:07.64
普通のExcelの初期状態の新規ブックはSheet1とかSheet2って名前になってるよな。
別に>>341みたいに目くじら立てる問題じゃないな。
講義用ならありだと思う。
ほんまもんのプロが>>341みたいな不細工なコード書いてたらプロとして失格だが。

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
訂正
全員ひどいってわけじゃないと思うが、ひどいのがいるって話ね。


350 :デフォルトの名無しさん:2011/10/23(日) 21:55:11.31
そいつ前いた忍者ハッタリ君じゃね?

351 :デフォルトの名無しさん:2011/10/23(日) 22:53:10.63
エラー処理ってどこまで配慮するかのサジ加減が良く分からない。
自分で使うマクロなら例えば数字の入力を要求するところに文字は入れないし、
エラーで止まっても原因の見当がつくから適当に書いちゃってる。
でも人に使わすものだと相手がどんな使い方するか分からないから
エラー処理きちんとやらないとあとで文句言われてめんどくさい。

352 :デフォルトの名無しさん:2011/10/23(日) 23:49:30.14
MVPはサイトを立ち上げてティップスをいっぱい並べておけば誰でもなれる。
ティップスの質は関係ないよ。

353 :デフォルトの名無しさん:2011/10/24(月) 00:04:04.69
そのとおり
MVPはそもそも資格ではない

354 :デフォルトの名無しさん:2011/10/24(月) 07:19:53.34
野球板でどうぞ

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使っても動かんだろ?

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ちゃんねる検索したらヌケる、この情報をお教えします。

361 :デフォルトの名無しさん:2011/10/24(月) 12:28:08.39
すみません。素人です。

Sub B()
Dim i As Long
For i = 1 To 10
Cells(i, 1) = Mid(Cells(i, 11), 4, 6)
Next i
End Sub

という、A1からJ1へMIDで6文字取り出す式を立てたつもりなのですが、
なぜか結果をA列を縦に表示します。
Xにforで代入し、iが1,2,3…と変化したら、A1,B1,C1…と行方向横に表示すると思うのですが、
X値が変化して、なぜ縦に列で出るのでしょうか????

362 :デフォルトの名無しさん:2011/10/24(月) 12:37:46.40
>なぜ縦に列で出るのでしょうか????

そらぁ縦に出るように指定してるからだろ w

363 :デフォルトの名無しさん:2011/10/24(月) 12:45:59.69
cells(1,i)なら横に出るよ

364 :デフォルトの名無しさん:2011/10/24(月) 13:07:58.71
行,列の考え方が逆

365 :デフォルトの名無しさん:2011/10/24(月) 14:20:27.89
こういう、定義をあいまいなまま放置する人が6+5×3=33という計算をしちゃうのかねぇ?

366 :デフォルトの名無しさん:2011/10/24(月) 14:27:46.55
>>362-364 ありがとうございます。デフォですかこれ。
Cells(y,x)と指定するんですね。

367 :361:2011/10/24(月) 14:28:55.93
あれっ
6+5×3は195じゃないの?

368 :デフォルトの名無しさん:2011/10/24(月) 14:56:33.92
x,yじゃなくてrow,colで考えれば自然

369 :デフォルトの名無しさん:2011/10/24(月) 15:06:46.18
>>368
なぜ自然なのだ?

370 :デフォルトの名無しさん:2011/10/24(月) 16:07:41.41
じゃあ自然じゃなくていいです。

371 :デフォルトの名無しさん:2011/10/24(月) 19:06:42.47
>>366
これは生きている人間?

372 :デフォルトの名無しさん:2011/10/24(月) 20:45:11.72
計算プログラムを作っています。
列を一次元配列にfor文で入れるところが処理速度のボトルネックだと
わかったのですが、高速で代入できる方法はありますか?
どんな方法でも構いません。
配列はdllに渡します。


373 :デフォルトの名無しさん:2011/10/24(月) 20:53:34.18
Range.Valueで、Variantの二次元配列として取り出す。
自前のdllならVariantの二次元配列を直接処理できるようにすればなお良し。

374 :デフォルトの名無しさん:2011/10/24(月) 21:50:49.42
>>372
Excelのバージョンは?

375 :デフォルトの名無しさん:2011/10/24(月) 23:06:28.04
>>373
ありがとうございます。
試してみます。

>>374
2003です。

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



378 :デフォルトの名無しさん:2011/10/24(月) 23:40:25.69
こうだろ
fileNo = FreeFile
Open Filename For Output As #fileNo
dim s as string
for each s in split(moji, "\n")
Println #fileNo, s
next
Close #fileNo




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

もし宜しければ
変数内に\tがあればテキストにタブに変換されてるようにしたいです
これも教えてください。

380 :デフォルトの名無しさん:2011/10/25(火) 00:20:03.11
fileNo = FreeFile
Open Filename For Output As #fileNo
dim s as string
for each s in split(moji, "\n")
Println #fileNo, replace(s, "\t", vbTab)
next
Close #fileNo



381 :デフォルトの名無しさん:2011/10/25(火) 08:10:31.17
>>375
2003ならVariant変数に
a =WorksheetFunction.Transpose(列)とすればaは1オリジンの一次元配列になる。
65536行を超えることのある2007以降では怖くて使えない。
今後のことを考えると>>373のいうとおり、二次元配列を処理した方が無難かも。

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

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

387 :デフォルトの名無しさん:2011/10/26(水) 14:11:43.76
ありがとう。
これで楽になる

388 :デフォルトの名無しさん:2011/10/26(水) 14:12:10.53
>>386は手抜き
より厳密にやるなら
r * 25.4
の部分を
Int((r - 1) * 28.4)
にすると正確に0から255までのグラデーションになる

389 :デフォルトの名無しさん:2011/10/26(水) 16:54:37.93
Excel2003で、コントロール・ツールボックスからイメージを配置してピクチャーも設定しました。

そのイメージが、左クリックで選択できなくなりました。
このイメージを編集したいのですが、どのようにすればよろしいでしょうか。

390 :196:2011/10/26(水) 17:22:28.07
>>389
デザインモードをオンにしたら出来ないかな?


391 :デフォルトの名無しさん:2011/10/26(水) 18:18:03.41
>>389
選択モードにするとか
ツールバーの白い矢印(マウスカーソルと同じ)のアイコンをクリックね

392 :デフォルトの名無しさん:2011/10/26(水) 19:22:54.69
Excel2007 グラフのソース変更の質問です

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

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

どうしたらよいでしょうか?

393 :383:2011/10/26(水) 19:40:05.57
>>384
これは行けそうです!
非常に助かりました。ありがとうございました!!

394 :デフォルトの名無しさん:2011/10/27(木) 11:26:22.50
>>390>>391
デザインモードのタグも、白い矢印のタグも、Excel2003だからか、見当たりません。

395 :デフォルトの名無しさん:2011/10/27(木) 12:05:24.34
>>394

Excel2000の場合ですけど、
[表示(V)] > [ツールバー(T)] と進み、
[コントロールツールボックス]にチェックを入れると
デザインモードのボタンが表示されます。
(ツールバーの余白部分で右クリックしても同様の操作が可能です。)
デザインモードにすればイメージの編集が可能でした。

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

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に限らないよ
どんなプログラムでも素人が組むとエラーだらけになる

まともなアプリって、全体の半分ぐらいはエラー対策だったりするし
想定外の事態を事前にどれだけ予測してどれだけ対処できるかでプログラマーの腕がわかる

403 :デフォルトの名無しさん:2011/10/28(金) 16:03:56.66
でも掲示板での質問にエラー対策が完璧な回答をしても喜ばれない。
コメントも同じ。
回答は本筋だけ示せばよい。

404 :デフォルトの名無しさん:2011/10/28(金) 16:31:51.41
>>399
ありがとうございます。
staticで実現できました。

405 :397:2011/10/28(金) 17:21:23.53
何方か判りませんかね〜^^;

406 :デフォルトの名無しさん:2011/10/28(金) 17:57:27.41
>想定外の事態を事前にどれだけ予測して

予測してたら想定外じゃないだろ

407 :デフォルトの名無しさん:2011/10/28(金) 18:57:00.97
>>401
そんなもんなんですねぇ
今やっと、大体の画面作りが終わったので、これから計算や文字処理のルーチンを書いてく予定です
画面でこれだけ苦労したのに、本当に最後まで作ることができるんかいなと・・・
でもやるしかないんで、騙し騙しでも頑張るです

408 :デフォルトの名無しさん:2011/10/28(金) 20:29:58.72
というか、「理不尽な」エラーなんて出た記憶がないな


409 :デフォルトの名無しさん:2011/10/28(金) 20:54:19.01
理不尽なソースならいくらでもあるよ

410 :デフォルトの名無しさん:2011/10/28(金) 21:08:04.44
エラー時にエラートラップされていない場合のみ止める設定の時に、
たまに数字だけのエラー表示があるのが、一寸鬱陶しくはある。
まあ、エラー時に止める設定にすれば判るから大して困りはしないが。

411 :デフォルトの名無しさん:2011/10/29(土) 00:17:47.48
むしろ正常に動作していないのにエラーも何も出さないってのがMSのソフトには多いから困る

412 :デフォルトの名無しさん:2011/10/29(土) 00:21:48.78
それは仕様です(キリッ

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に変更して比較したのですが使用量が変わりません。
どうしてなのでしょうか?

414 :デフォルトの名無しさん:2011/10/30(日) 10:14:54.03
>>402は古いと思う

415 :デフォルトの名無しさん:2011/10/30(日) 11:05:13.30
遅レスですが
>>386>>388
25.4とか28.4という数字は、どこから出てきた数字なんでしょうか?

416 :デフォルトの名無しさん:2011/10/30(日) 11:32:07.66
>>323>>328
の話にあった
With Range("A1").CurrentRegion.Rows(1)
より
With Range("A1").CurrentRegion.Resize(1)
の方が楽、というのがわからないです。どういう場合に楽なんでしょう?
可読性は前者の方が高いと思うのですが??

417 :196:2011/10/30(日) 11:51:53.93
良く分からんけど、
mov ax,0
の代わりに
xor ax,ax
するようなもん。

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 :416:2011/10/30(日) 13:37:49.32
>>418
非常に分かりやすい説明ありがとうございました。
「Resize」の表記で直感的に意味がわかるようになることが
良いVBA使いに至る道のようですね。

420 :416:2011/10/30(日) 13:40:10.44
>>417
アセンブリ言語が良くわからないので
喩えがあまり理解できませんでしたが
回答ありがとうございました。

421 :デフォルトの名無しさん:2011/10/30(日) 21:15:04.72
UserFormについて質問です。
(XP&Excel2000,2003)

複数のフォームを開閉するマクロを組立て中です。
この時、1枚目を完全に閉じた上で、2枚目のフォームを開くことはできないでしょうか。
変数受け渡しでうまくいかないかと試行中。
Google先生はLoad/Showしか教えてくれない…。

422 :デフォルトの名無しさん:2011/10/30(日) 22:25:32.61
どこで困ってるのか今ひとつ良くわからない

423 :421:2011/10/30(日) 23:01:29.14
普通に
Unload Me
UserForm2.show

みたいにしてもフォームが消えなかったり、
先ほど開いていたフォームを開きなおすとエラーが出る等、かな。

424 :デフォルトの名無しさん:2011/10/30(日) 23:25:05.89
>>421
どんなエラー?

425 :421:2011/10/31(月) 06:57:57.73
>>424
マクロ本体が無いので少し説明不足でした。申し訳有りません。

ダミーで確認してみたところ、
「既にフォームは表示されています。モーダルにできません。」でした。
CommandButtonでの操作は問題ない(ように思う)のですが、
右上の×ボタン操作を閉じた時の動作が思うように行きません。

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

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


フォームを開くのに変数受渡しって何?


427 :421:2011/10/31(月) 09:42:21.52
>>426

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
UserFormX.Show    Xは読み替えで。
End Sub

↑UserFormXが起動するので、Show以降が処理されない=閉じることができない。
だから、フォーム2の後ろにフォーム1が見えたままですし、フォーム2を閉じると上述エラーが出る。
「Me.Hide」を加えると見た目では消えている…けど途中で閉じるボタンが聞かなくなる。
そもそもHideとUnloadは役割が違う。


>>変数受け渡し
フォーム毎に変数(Public)を持たせます。
そして、閉じるときにスイッチOFFをいれつつ、フォーム管理マクロを呼び出し。
強引にフォームを閉じ、必要なフォームを開けないかと思いましたが、
結局↑と似たような感じになり断念。
フォーム数だけマクロ用意すれば変数不要な気もする。


代替案で「閉じるのはCommandButtonのみ、右上×ボタンは封印」
というのも考え中ですが、こちらで何かいい案が聞けないかなと…。

428 :デフォルトの名無しさん:2011/10/31(月) 10:00:43.25
UserForm_Terminate()
に書けばいいよ

429 :デフォルトの名無しさん:2011/10/31(月) 10:15:02.07
>>428
回答がお早い…。

Terminateでも同じフォーム開きなおすと、閉じるボタン聞かなくなりますねぇ。
他のボタンも動かなくなるのも同じです。

430 :426:2011/10/31(月) 10:15:44.13
こっちはExcel2007

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

まぁ早い話、これを使ってのフォームの操作は諦めろってことでは?


431 :デフォルトの名無しさん:2011/10/31(月) 10:30:54.52
UserFormX.Show
じゃなくて
dim f as new userformx
f.show

ってすればいいよ。

432 :421:2011/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を自分以外は誰も使用しなくて、自分自身でマクロウィルスを作成・実行しない。
という前提ならエクセルのマクロウィルスの被害には遭わないです。
要は信頼する場所云々以前に出所不明のマクロを実行しないというのが肝であって
それさえ守れば後は関係ないです。(あくまでもマクロウィルス限定の話ですけれど)

435 :デフォルトの名無しさん:2011/10/31(月) 22:07:49.81
あるかないかで言えば、アドオンが感染とかExcel本体が感染とか常駐型に感染とか、
マクロファイル以外にも感染ルート、可能性はいくらでもある

436 :433:2011/10/31(月) 22:35:31.24
ありがとう。
いちおう自分がVBAを使い始めた事が原因で感染しなければ良いので。出所不明のマクロ使用しないですし大丈夫ですね。
会社がセキュリティソフト導入しないので、エクセル以外からの感染は仕方ない状態です。

共用してるもう一人が、俺のファイルが重すぎる、お前なんかしただろとわけわんない言いがかりをつけられてて一応自分のせいではないことを確認したかったのです。

437 :デフォルトの名無しさん:2011/10/31(月) 23:56:58.15
嫌な現場だなw
そんな心配しなきゃいけない位なら
そんな所やめてしまえばいいだろうに。

438 :デフォルトの名無しさん:2011/11/01(火) 00:05:05.81
>会社がセキュリティソフト導入しないので



すげぇ会社だな、ヲイ

439 :デフォルトの名無しさん:2011/11/01(火) 00:08:46.05
MSEをこっそり入れとこう

440 :デフォルトの名無しさん:2011/11/01(火) 03:59:10.14
本当に自分が直接作ったファイルしか使わないなら安全かもしれんが
ウィルスってのは、ファイルを書き換えたりするんだぞ
お前が作ったそのままだと思ってるファイルが実はこっそりウィルスに感染してる可能性は排除できんぞ

441 :434:2011/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系じゃないよね?

444 :デフォルトの名無しさん:2011/11/01(火) 17:08:02.57
>年1回ほど「ウイルス発見されたー もちこむなー」って言ってるよ。

「ウイルス発見されたー ちんこもむなー」に見えた。
疲れてるな、俺。


445 :434:2011/11/01(火) 19:53:43.66
>>443
ちがいます。
専門的な作業は外注しますし、
私はプログラマーとかじゃないのでVBAもろくに使えません。
でも簡単なマクロでも自分の仕事には十分役立ちます。

446 :デフォルトの名無しさん:2011/11/02(水) 09:34:22.37
>>445
ウィルスって騒ぐほどの会社ならいいが。
世間一般的な(家庭レベル)セキュリティで十分な気がするけどな。
例えば、世界が認める日本企業なんかにいるんなら、そのサーバーを
ターゲットにするだろ?

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

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

あとウィルスソフトのフリーも入れない会社自体も問題あるけどね!
長文すまん。むかつくやつはスルーしてくれ。

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で制御する方法を教えてください。

453 :デフォルトの名無しさん:2011/11/02(水) 20:02:24.73
読み上げについてです
コントロールパネルから読み上げる音声(sam,kenji,naoko)を設定できるそうですが
どうればよいのでしょうか?

454 :デフォルトの名無しさん:2011/11/02(水) 20:39:14.89
>>452
.GetVoices().Item(n)

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
ニャイ場合は?

459 :デフォルトの名無しさん:2011/11/03(木) 11:52:32.60
ア キ ラ メ ロ

460 :デフォルトの名無しさん:2011/11/03(木) 12:09:33.23
ぃゃょ

461 :デフォルトの名無しさん:2011/11/03(木) 13:38:29.29
使用ソフトexcel2003で質問です。
ある特定のフォルダにある複数のエクセルファイルから,幾つかの条件でデータを抽出し,
新規のエクセルファイルに集約するマクロを作りたいと思っています。お力を拝借いただきたいです。

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

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

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

オートフィルタとコピペを繰り返せばよいかと思ったのですが,私の知識では複雑な条件に
対応させることができませんでした。上記の都道府県の例のように最低5つのキーワードで抽出を可能にしたいです。
どなたかそれらのコードを記述していただけませんでしょうか?

462 :デフォルトの名無しさん:2011/11/03(木) 13:57:03.41
accessにするべき

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
あなたすごいですねぇ。
こんな上級者がこのスレにいたとは!!!


471 :デフォルトの名無しさん:2011/11/04(金) 11:11:46.91
そうか、code padはVBAの場合plaintextで置けば良いんだ。

472 :デフォルトの名無しさん:2011/11/04(金) 11:38:07.14
>>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
サンクスです

476 :デフォルトの名無しさん:2011/11/04(金) 12:54:04.07
>>469 >>470 >>472
自演乙()

477 :デフォルトの名無しさん:2011/11/04(金) 18:31:44.08
>>469
こういうのをサクッっと作れちゃう人尊敬する

478 :デフォルトの名無しさん:2011/11/04(金) 21:35:16.35
IDでないんだな、それが

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

480 :デフォルトの名無しさん:2011/11/05(土) 00:21:37.78
今Excelが手元にないので

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じゃどうなの?

485 :デフォルトの名無しさん:2011/11/05(土) 20:24:02.33
2003でやってみたけどまさかこんな結果になろうとは

486 :デフォルトの名無しさん:2011/11/05(土) 20:25:29.55
65536 "だと" OKって言ってるんだから普通に考えればNGだろw

487 :デフォルトの名無しさん:2011/11/05(土) 20:42:14.70
もういいわ、誰か他の人に聞きたい。
Excel2003で次のコードはエラーになる?

Sub hage()
Dim a(1 To 65537) As Long
MsgBox WorksheetFunction.Sum(a)
End Sub


488 :デフォルトの名無しさん:2011/11/05(土) 20:46:58.23
2003で実行

65537:エラー
65536:OK

489 :デフォルトの名無しさん:2011/11/05(土) 20:49:42.59
まぁ区切りのいい数字だわな

490 :デフォルトの名無しさん:2011/11/05(土) 20:52:42.28
>>487
エラーになったらエラいこっちゃ。

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 でも使用可能ですか?

493 :デフォルトの名無しさん:2011/11/06(日) 00:49:34.68
さらにVisual Basicでは、標準モジュールは使わなくて、クラスモジュールを使うと書いてます(フォームモジュールもExcelVBA同様存在する)。
このクラスってなんですか?
上級向けの本ではよく出てくるので、おそらく大事だと思うんですが
ひとことでいえばどんなしくみですか?

494 :デフォルトの名無しさん:2011/11/06(日) 01:20:13.48



495 :デフォルトの名無しさん:2011/11/06(日) 01:28:29.79
型とは、長文でいえばどんなしくみですか?

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
一言どころか一文字とは。

498 :デフォルトの名無しさん:2011/11/06(日) 01:35:42.91
>>493
VBの話はスレ違いなので
VBのスレ探してそこでやってください

499 :デフォルトの名無しさん:2011/11/06(日) 01:43:19.62
>>495
例えば〜 As Collectionとした場合、このCollectionに当る部分が型。
要するに〜に当る部分が何ものなのかを定義している所。
このCollectionクラスはAddと言うメソッドを持っている。
クラスモジュールで似た様なもの作るとするならば、
Collectionと言う名をクラスモジュールに付けて、Addと言うメソッドを作る。
適当だけどこんな感じ。

スレ違いには同意なので、VB.Netスレで聞いて下さい。


500 :493:2011/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年後も同じこと言い続ける。

503 :デフォルトの名無しさん:2011/11/06(日) 08:56:26.22
おっと、スレチへのレスだったか。突っ込まなきゃ良かった

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レベルのままだろうし、そうでなくてはならない。

508 :デフォルトの名無しさん:2011/11/06(日) 11:18:08.63
別の言い方をすれば
馬鹿でもオブジェクト指向らしくせざるを得ないのがC#
客はうんなこと分かってないから喜ぶわけだがw

509 :デフォルトの名無しさん:2011/11/06(日) 11:40:05.15
>>502
じゃあ鯛焼き機の話でもしようか

510 :504:2011/11/06(日) 12:01:24.06
>>507-508
いや、別に VBA を無くせといってるわけじゃないよ。

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

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

ひょっとして、class ってキーワードがあったらオブジェクト指向らしいとでも思ってるの? (w

511 :デフォルトの名無しさん:2011/11/06(日) 12:07:25.11
>>510
いい加減スレ違いの話を続けるのはやめてくれ

512 :デフォルトの名無しさん:2011/11/06(日) 12:12:05.59
あれ?

馬鹿がばれて逆切れ?(w

513 :デフォルトの名無しさん:2011/11/06(日) 12:19:51.24
C#しか知らないんだろうね
ここで勉強しようよ 仲良く

514 :デフォルトの名無しさん:2011/11/06(日) 12:21:03.69
ここはVBAのスレです。
そろそろ軌道修正願います。

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

518 :デフォルトの名無しさん:2011/11/06(日) 17:35:57.95
やだなあ、先輩。Hu-Basicに決まってるじゃないですか。

519 :デフォルトの名無しさん:2011/11/06(日) 17:38:45.67
いや、dbBASICかもしれんよ

520 :デフォルトの名無しさん:2011/11/06(日) 17:48:44.86
ここはExcel VBA質問スレだろ?
ズレまくってるのを早く修正しる

521 :デフォルトの名無しさん:2011/11/06(日) 17:57:18.44
じゃ質問よろしいかしら?

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

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

出来れば自前で保持などせず、例外オブジェクトあたりから引っ張れると素敵ですが、
そんな仕組みあったかしら?
なお当然ですが、呼び出し先で発生する例外は自前でスローするとは限りません。

522 :デフォルトの名無しさん:2011/11/06(日) 17:59:39.33
tiny BASIC でスタートレックと聞いてやってきました。

523 :521:2011/11/06(日) 18:08:01.49
>>521補足
擬似コードで説明するなら、下のe.getStacktrace()に代わる情報として、
処理中のセル位置情報を引っ張れたら幸せだなーと
でも、おそらけ例外オズジェクトからは取れないので
何か工夫しないとダメな悪寒。

class Caller() {
try {
new Callee().execute();
} catch (Exception e) {
log(e.getStacktrace()); //←これ相当
}
}

524 :デフォルトの名無しさん:2011/11/06(日) 18:35:16.58
フォームのボタンについて

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

これをENTERで連打するとしっかり連続計算されるけどクリック連打だとダブルクリックになるのでゆっくり連打しかできない。
ダブルクリックイベントにならないようにクリックで早く連打してクリックイベントにする事は可能ですか?


525 :デフォルトの名無しさん:2011/11/06(日) 18:36:36.77
ダブルクリックもクリックと同じ処理にすればいんでね?

526 :デフォルトの名無しさん:2011/11/06(日) 18:38:17.42
>>523
そんなの書ける位理解してるなら
ファクトリーパターンでも使っとけ

527 :523:2011/11/06(日) 18:54:22.09
>>526
生成だけハンドルすればOKならファクトリーメソッドでいんだけど、
どちらかっていうとテンプレートメソッドが近いですかね。

で、そこまではいんですけど、
今どこ処理してたの?情報は、VBAでだとどーやって引っ張ったらいいのかしらん?
という点が質問したい点なのですわ。
その情報としては実運用を考えるとセル位置とか知りたいなー

528 :デフォルトの名無しさん:2011/11/06(日) 18:54:25.64
>>521
そもそもその例外はVBAのエラーであって、EXCELのエラーではないからな
それに、VBAの例外オブジェクトにスタックトレースとかなかった気もする
自分でスタックトレース相当な何か作る(当然設定も自分でする)しかないんじゃね

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

529 :524:2011/11/06(日) 19:23:46.00
ダブルクリックでも同じ処理したらいい感じになりました。エンター連打と同じぐらいスムーズには動かない
けど十分快適になりました。ありがとうございます。

530 :521:2011/11/06(日) 19:51:50.89
>>528
うーん、やはりVBAの例外オブジェクトにはスタックトレース情報はないですよね。。
VBA風擬似コードで↓こんな感じにするしかないのかしらん

public sub caller()
on error resume next
 callee.execute()
if error
 log(ExcelContext.getInstance().getCell());
end if
end sub

class Callee
 public sub execute
  dim context as ExcelContext = ExcelContext.getInstance()
  foreach cell in Selection
   context.setCell(cell); //忘れずに呼ぶ
do本来やりたいことWith(cell)
  end foreach
 end sub
end class

忘れずに呼ばなきゃならない時点で
イケてない感がはんぱない。パフォーマンスも悪そう。
どなたか良いアイデアありますか?

531 :デフォルトの名無しさん:2011/11/06(日) 20:39:04.45
ユーザーフォーム上のボタン名をセル上から取得するにはどうすればいいですか?
たとえばA1の値を参照して、A1が"あ"なら"あ"というボタンにする

532 :521:2011/11/06(日) 20:45:15.17
Captionにセットするだけちゃうん?

533 :デフォルトの名無しさん:2011/11/06(日) 21:36:47.24
Interface→implementsを使われている方にお聞きします。
今implementsにて実装しています。(勉強中…)
インターフェースクラス_インターフェース定義メソッド
の実装をしていくわけですが、実装の中で別のインターフェース定義メソッドを
呼び出す時にも インターフェース_ の接頭語みたいなのがつくので
何か違和感があります。こんなものですか?(下のサンプル参照)
インターフェース_の接頭語がつくような設計自体おかしい事ですか?

ご存じな方よろしくお願いします。

IAnimal
sub eat() :end sub
sub hunt() :end sub

//////
implements IAnimal
CLion
sub IAnimal_eat()
IAnimal_hunt()    ←この部分の違和感
foo()
end sub

sub IAnimal_hunt()
hoge()
end sub

534 :デフォルトの名無しさん:2011/11/06(日) 22:42:14.77
>>530
Calleeのプロパティとして参照する。
getInstance?シングルトン?VBAのクラスのコンストラクタってprivateに出来たっけ?

>>533
知らないけど勉強中との事なので。
もう何年もVBAやってるけどInterface使うプロジェクトは見たこと無いです。

535 :521:2011/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
頭痛が痛くなるな。俺には無理。

539 :デフォルトの名無しさん:2011/11/07(月) 15:38:15.47
>>529
mouseupイベントに書けばいいのでは?

540 :デフォルトの名無しさん:2011/11/07(月) 17:06:56.12
Excel2007

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

んで、その選択状態にするにはどのようにするんでしょうか?


541 :デフォルトの名無しさん:2011/11/07(月) 17:08:03.60
selectedindexとかない?

542 :デフォルトの名無しさん:2011/11/07(月) 18:00:25.53
>>533
VBAの勉強してるなら、Interfaceの事は見なかったことにして忘れた方が良い
オブジェクト指向のクラス設計勉強してるなら、ちゃんとしたオブジェクト指向言語つかった方が良い

>>537
どっかアルゴリズムのスレ探してそこで聞いた方がいいんじゃね

543 :デフォルトの名無しさん:2011/11/07(月) 18:16:54.06
>>541
フォームのInitializeで

Me.LstBox1.Selected(0) = True

ででけました。dクス

544 :デフォルトの名無しさん:2011/11/07(月) 20:31:22.81
>>537

これ、初期値のA(0)=1とB(0)=2こそ違うけど、それ以降は
A(n) = B(n) = 3*(n-1)^2 で、再帰も糞もなくないですか


545 :デフォルトの名無しさん:2011/11/07(月) 22:00:47.52
例に突っ込むって馬鹿なの?

546 :デフォルトの名無しさん:2011/11/07(月) 22:30:43.31
例に突っ込むとかじゃなく最適化してるじゃん
こういう再帰的な呼び出しに関して
一般的な最適化の手法ってのはないんじゃね?

547 :デフォルトの名無しさん:2011/11/07(月) 22:58:23.61
なんかテスト臭いな。
何て言うか、自分の考えていた答えよりちょっとレベルの低い答えが
帰ってニヤってしたかったけど、根本から最適化されてしまって逆切れしたみたいな。

548 :デフォルトの名無しさん:2011/11/07(月) 23:17:54.08
おまいらなんの話してんだよ。高卒の俺にはさっぱりわからんぞ

549 :デフォルトの名無しさん:2011/11/08(火) 01:05:39.01
馬鹿には無理

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でも回して処理するんだな。

552 :デフォルトの名無しさん:2011/11/08(火) 07:16:45.11
書き忘れたがFor Eachはセル単位じゃなくAreas単位で処理な。

553 :550:2011/11/08(火) 22:57:25.82
やっぱ無理か
changeイベントの実行範囲に指定したかったんだけどな…

554 :デフォルトの名無しさん:2011/11/09(水) 00:03:03.63
sheetsとworksheets、どっち使ったらいいの?

555 :デフォルトの名無しさん:2011/11/09(水) 00:28:41.37
そういう質問するうちは、worksheets を使ってればいい。

556 :デフォルトの名無しさん:2011/11/09(水) 00:37:32.18
>>554
そういう質問をする内はSheetsを使っておけばいい。
対象にグラフのシートを含めてみれば分かる。

557 :デフォルトの名無しさん:2011/11/09(水) 00:46:15.15
フォームコントロールとActiveXコントロールの違いは何ですか?
どう使い分けますか?

558 :デフォルトの名無しさん:2011/11/09(水) 00:47:23.90
>>555-556
そういう回答をするうちは、ロムっていればいい。
ちゃんと解説できる日本語を身につけたら書き込みしてよい。

559 :デフォルトの名無しさん:2011/11/09(水) 00:54:52.73
>>558
そういう突っ込みをする内は(ry

560 :デフォルトの名無しさん:2011/11/09(水) 08:41:58.50
ワークシートと決まってればSheetsは間違い。
何か分からないときにSheetsを使う。
たとえば>>343の修正の>>345とか。

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
ですか?

565 :デフォルトの名無しさん:2011/11/10(木) 13:10:50.31
withつこてる?

566 :デフォルトの名無しさん:2011/11/10(木) 13:26:31.82
フォームコントロールとActiveXコントロールの違いは何?
どう使い分けます?

567 :デフォルトの名無しさん:2011/11/10(木) 14:52:08.78
コマンドボタンに黒の左向きの三角を設定したいんだけど、
フォント名を合わせても四角が表示されてしまいます。
どうすれば設定できますか?
イメージでも良いです。
よろしくお願いします。

568 :デフォルトの名無しさん:2011/11/10(木) 15:03:30.32
等式で大文字と小文字を区別するにはどうしたらいいの?

(例) If range("A1")=""Apple" thenで、A1がappleでもAPPLEでもaPPLEでも、正と判断してしまうので困っちゃうの。


569 :デフォルトの名無しさん:2011/11/10(木) 15:08:18.03
そんなあほな

570 :デフォルトの名無しさん:2011/11/10(木) 15:13:20.98
>>567
配置を縦にして▲を表示すればいいよ

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で書いてやってみるときちんと反応します。

よろしくお願いします。


574 :デフォルトの名無しさん:2011/11/10(木) 17:43:12.12
PostMessageにすればいいよ

575 :デフォルトの名無しさん:2011/11/10(木) 18:22:42.16
>>573
VBAから外部ソフトを操作するのって、どういう命令を使うの?
それ実にやりたいことだから知りたい。

576 :デフォルトの名無しさん:2011/11/10(木) 19:18:25.24
>>573
出来ました。
ありがとうございました。

>>575
ここでは説明できないし、自分もググりながらやってるから
間違った説明をしてしまうと思う。
VBA winapi とかでググってくれ。
大まかなことはすぐ理解できると思う。

577 :デフォルトの名無しさん:2011/11/10(木) 19:26:47.69
間違えた。
>>574でした。

578 :デフォルトの名無しさん:2011/11/10(木) 20:21:09.15
>>575
GUIアプリケーションって、
他のプロセスからメッセージを受け取って、その内容に応じてイベントハンドラを呼び出してるんだけど、
メッセージ送信は送信先アプリの送信先コントロールが分からないとダメで、
その識別子をウィンドウハンドルって言うよ。
SendMessageってAPIで送信出来るよ。

579 :575:2011/11/10(木) 20:41:27.81
さっぱりわからん

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イベントで
イベント処理するってのはどうなのかな?
これなら新しいシートを追加してもイベント処理対象だし

583 :583:2011/11/11(金) 04:37:40.14
セル範囲をVariant変数に入れて別のセル範囲にコピーする方法についての質問です。
ただ単にコピーするだけならできたのですが、
その中の1行目と2行目を入れ替えて貼り付ける事は可能でしょうか?
ためしに以下のようなコードを書いてみましたが
「インデックスが有効範囲にありません」のエラーが出ました。
Sub test1()
Dim MyData As Variant
Dim MyTemp As Variant
MyData = ThisWorkbook.Sheets(1).Cells(1, 1).Resize(3, 5)
MyTemp = MyData(1)  <-ここでエラーになる
MyData(1) = MyData(2)
MyData(2) = MyData(3)
MyData(3) = MyTemp
ThisWorkbook.Sheets(2).Cells(1, 1).Resize(3, 5) = MyData
End Sub

・・・
>>584に続きます

584 :583:2011/11/11(金) 04:38:17.31
>>583の続きです
ForNextのネストで変数内の配列要素を一個ずつ入れ替えることはできたのですが、
それではコードがゴチャゴチャしてあまりスマートでは無いように思います。
Sub test2()
Dim MyData As Variant
Dim MyTemp As Variant
Dim I As Integer
Dim J As Integer

MyData = ThisWorkbook.Sheets(1).Cells(1, 1).Resize(3, 5)
ReDim MyTemp(5)
For J = 1 To 5
MyTemp(J) = MyData(1, J)
Next J
For I = 2 To 3
For J = 1 To 5
MyData(I - 1, J) = MyData(I, J)
Next J
Next I
For J = 1 To 5
MyData(3, J) = MyTemp(J)
Next J
ThisWorkbook.Sheets(2).Cells(1, 1).Resize(3, 5) = MyData
End Sub

何かよいお知恵があったら教えてください。よろしくお願いします。

585 :583:2011/11/11(金) 04:41:48.59
すみません、最初に「1行目と2行目を入れ替えて」と書きましたが
コード中では3行目も入れ替えてますね。
とにかく、行の入れ替えがしたいということです。
よろしくお願いします。

586 :デフォルトの名無しさん:2011/11/11(金) 07:05:07.56
一行ずつ取ってきて別の行にセットする。
CopyとPasteSpecialで事足りる気もするけど。

587 :583:2011/11/11(金) 18:45:06.36
>>586
回答ありがとうございます。
行、列ともに少なければどんなやり方でも良いのですが、
前述のコードはあくまでもサンプルでして、
実際の業務では複数のブック間で(数百行、数十列)のセル範囲を
数千件単位でコピーする必要があって
データをコピーするときにはセルを操作するよりも
変数で処理するほうが速いのだそうで、
少しでも高速化できればと思っていた次第です。

エクセルのヘルプでも配列内の要素の操作は
ForNextのネストで行うような説明が書いてありましたし、
残念ですがあきらめます。

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
行単位で扱えればいいって事でしょ?
配列を記録する配列を用意しておいて、行を記録する配列を動的に
作って行を記録。
で、コピーするときにコピーしたい順に配列を呼び出していけばいい。

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の交換ができる

592 :591:2011/11/11(金) 23:15:25.98
間違えた
交換用プロシージャ MyData, 1, 2
交換用プロシージャ MyData 2, 3
だった…

593 :デフォルトの名無しさん:2011/11/11(金) 23:16:03.74
>>587
状況にもよるけど、余り複雑だったり
ループを多く組まなければならないなら、
対象のシートにSQLを投げてレコードセットをシートに展開するループだけに
するって手もあるよ。

594 :デフォルトの名無しさん:2011/11/11(金) 23:31:07.22
ある一定の範囲をドーーーーンとコピーして、別シートにバーーーーンと貼り付けて、
1行目に行挿入して、3行目をこぴーして、1行目に貼り付けて、3行目を削除でよくね?
screenupdateをfalseにしとけば、そんなに遅くないんじゃ値?

595 :デフォルトの名無しさん:2011/11/11(金) 23:57:37.72
そうだよ
ドーーーーンにバーーーーンにビシャーーーーンだよ

596 :デフォルトの名無しさん:2011/11/12(土) 00:21:33.42
ビビューンバシャーンズシーン

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)


598 :デフォルトの名無しさん:2011/11/12(土) 01:03:46.68
Mydataが二次元配列と仮定するなら、
FunctionだとVariantの内容がコピーされて返されないか?

>>583
最終的な並び順のインデックスを末尾の列に書き込んで、
Range.Sortメソッドでソート実行、
その上でコピペしまくるという方法もあるな。

599 :デフォルトの名無しさん:2011/11/12(土) 01:15:33.01
>>597
MyDataが呼び出し先のプロシージャ内で書き換え可なら
Subプロシージャのほうがスッキリしていると思う。
書き換え不可なら、Functionプロシージャにして
プロシージャ内で戻り値用の配列を用意して使う。

どちらにしても配列は参照渡し
r1, r2 は値渡しにする

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

シートの追加、じゃなくて、シートのコピー、ではダメ?

601 :デフォルトの名無しさん:2011/11/12(土) 19:58:21.46
すいません、質問させてください。(XP / Excel2000,2003)
Formとボタンの形状を変えたと思っています。

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

現在3,4を同時に進めているのですが難航しています。
いざ作り出してから非常に回りくどいとも思ったのですが、良案はないでしょうか。

602 :581:2011/11/13(日) 09:06:54.82
>>582さん
>>600さん

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

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

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



603 :デフォルトの名無しさん:2011/11/13(日) 09:48:07.24
>>601
リージョン操作系APIを使えば3, 4はWindows側がよしなにやってくれる
あとはWindowsAPI相談室で聞いとくれ

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 :582:2011/11/13(日) 12:36:37.68
>>602
Worksheet_Change
じゃなくて
Workbook_SheetChange
にしたらって意味で >>582で書いたつもりだったんだけどな
後者の方は全てのシートのセルの変更に対してイベントが出るよ

...なんか俺 >>602のやりたい事を 勘違いしてるのかな

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 ・・・

どのように記述すればよいでしょうか?。。。

609 :デフォルトの名無しさん:2011/11/13(日) 13:08:54.43
A行ですね・・・

610 :デフォルトの名無しさん:2011/11/13(日) 13:10:12.97
>>608
いきなりコード書くんじゃなく、
Excelでセルに数式いれる作業を、マクロの記録でスクリプト化してみたらどうだろう?
ためしてないからダメかもだけど。

611 :デフォルトの名無しさん:2011/11/13(日) 14:50:21.78
>>603
VBAでそれらしい機能が見つけれなかったので、
デバイスコンテキスト辺りを調査中。
ネットで例が見つからないわけではないのですが、
VBAで取り扱ったいるものが少ないので参考になったりならなかったり。
もう少し具体的なところで行き詰った時、
こちらかAPI質問箱で質問させて頂くかもしれません。
ありがとうございました。

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 :614:2011/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
パラメータに引数で渡す
パラメータって言い方普段しないから

620 :デフォルトの名無しさん:2011/11/14(月) 01:14:35.01
バロメーターが上昇中です

621 :デフォルトの名無しさん:2011/11/14(月) 15:45:40.33
バカメーターが上昇中です


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 :626:2011/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だからでしょうか。

633 :デフォルトの名無しさん:2011/11/15(火) 15:57:22.72
マクロの方では、実行時エラー1004です。

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に何も表示されません。

原因は何なのでしょうか。

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文に
上記のマクロを挟んだら、エラーが出てリストボックスが作れません。

再試行を促すダイアログボックスが出て、ユーザ定義関数はセルに挿入できますが
肝心の入力規則(リスト)は作られません。

637 :デフォルトの名無しさん:2011/11/16(水) 12:12:56.36
>>635
Msgbox(Cells(a, b).Address と
Msgbox(Cells(a & "," & b).Address で
違いを比べてみてください。

638 :デフォルトの名無しさん:2011/11/16(水) 12:35:37.94
>>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 じゃないと構文エラーになりました。

640 :デフォルトの名無しさん:2011/11/16(水) 12:39:54.61
>>638
やりたいことは、値の取得だけです。
ユーザ定義関数を挿入したセルの入力規則を、その関数から操作するのは無理なのでしょうか。

641 :デフォルトの名無しさん:2011/11/16(水) 12:45:11.51
c = Cells(a, b).Valueにしたところ、参照する件だけはアッサリ解決してしまいました。
でもまだ、不思議な気持ちです。

642 :デフォルトの名無しさん:2011/11/16(水) 12:51:38.36
>>640
ん?
>>636をみると入力規則の設定を変更してるようにみえるが?

643 :637:2011/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

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
グローバル変数に走った回数を入れればいいんじゃないの?
聞いてる意味違う?

648 :601:2011/11/16(水) 21:09:47.38
先日質問に来た者です。
リージョン操作というアドバイスを頂きながら、躓いてしまいました。
API系質問スレは覗いたのですが…
Google同様VBA系の質問がなさそうだったので、こちらの諸先輩方の方が良いかと思いました。
質問は2つです。よろしくお願いします。

1 リージョンでメニューバーを消したときのフォームの移動について。
  「SendMessage hWnd, WM_SYSCOMMAND, SC_MOVE, 0」
  というのを発見しましたが、動作させれませんでした。
  フォームクリック時に「メニューバーを操作している」情報を送るというものだと思うのですが。

2 多角形リージョンについて
  練習で長方形や楕円形のリージョンは作成できました。
  しかし、三角系の頂点指定だけはできませんでした。
  設定に失敗してもエラーが出ず、「角に黒い影が出る」or「全部消える」という挙動をしています。

Private Sub UserForm_Activate()

’座標指定
Dim p(100) As Point   ’???
'???
'リージョンの作成
Dim hRgn As Long
hRgn = CreatePolyPolygonRgn(p(0), 3, 1, WINDING)  'CreatePolygonRgnはエラーから抜けれなかった
'ハンドルの習得
Dim rc As Long, hWnd As Long
hWnd = FindWindowA("ThunderDFrame", Me.Caption)
'リージョン適用
rc = SetWindowRgn(hWnd, hRgn, True)

End Sub


649 :デフォルトの名無しさん:2011/11/16(水) 22:14:30.32
PostMessageでよくない?

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

http://support.microsoft.com/kb/170787/ja
ワークシートのセル内の数式から呼び出されるユーザー定義関数では、Microsoft Excel の環境を変更できません。つ
まり、このような関数では次の処理が実行できません。
スプレッドシートでのセルの挿入、削除、または書式の設定。
• 別のセルの値の変更。
• ブックでのシートの移動、名前の変更、削除、または追加。
• 計算方法や画面表示など、環境オプションの変更。
• ブックへの名前の追加。
• プロパティの設定およびほとんどのメソッドの実行。


651 :デフォルトの名無しさん:2011/11/16(水) 22:30:18.13
>>648
この話題は スレチだとおもうが
>>2 ★3,★4 参照

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

そもそも そのコードだと多角形の頂点座標をどこで指定してるんだい

652 :デフォルトの名無しさん:2011/11/16(水) 23:05:11.79
>>646
ありがとうございます。
セルへのアクセスを減らすために実施しようと思ってますので、
少し違いますが、参考にします。

>>647
やはりそれですか。
関数がたくさんあって、
初期化を他の関数に追記するのがどうにもめんどうで。
たとえば、20個関数があったら、残りの19個はfalseにしたり0にしたりがどうも…

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

655 :デフォルトの名無しさん:2011/11/17(木) 00:12:42.47
>>652
ああ、連続でよばれたかどうかね。
関数に対応する連番を列挙体にでも用意しておいて、
1度目にグローバル変数かモジュール変数にしまった関数に対応する連番と
2度目に呼んだ時の関数に対応する連番と比較して同じなら連続でよばれたと判断できるよ。
何連続で呼ばれたかとか、連続で呼ばれたのは何回かと言うのが欲しいなら、
その関数に対応した連番をキーにコレクションやディクショナリに
回数を設定してため込んでやればそんなに面倒臭い事にはならないんじゃないかな。

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なりにしたほうが…

659 :デフォルトの名無しさん:2011/11/17(木) 13:36:19.78
VSTOとは?
Very Simple Technichal Option?

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系以外の職場だとそんな所多いと思う
だからこそ
業務へは あまりウケ狙い的な事をしないで

"シンプル・イズ・ベスト"

663 :デフォルトの名無しさん:2011/11/17(木) 16:26:01.56
VBAだけだと、かゆい所に手が届かないんだよなあ
アプリを作るための言語じゃないから

まあ.Netもコントロールの出来が悪いから、できそうでできないこと多いけどね
使いやすいUIとか作ろうとすると、結局めちゃくちゃ手間がかかる

664 :デフォルトの名無しさん:2011/11/17(木) 17:53:58.68
>>662
「ザ」がぬけてる。
"シンプル・イズ・ザ・ベスト"
英語系やってるとこういうフレーズにさえ著しい違和感を感じるようになる職業病。

665 :662:2011/11/17(木) 18:25:39.46
へっ(汗;;;;)そうなんだ「ザ」抜きで憶えてた
学生時代英語は赤点だったからなーーー
ありがと

666 :デフォルトの名無しさん:2011/11/17(木) 18:48:03.64
>>664
この場合、theは無くてもいいんじゃないかな。

667 :デフォルトの名無しさん:2011/11/17(木) 19:33:10.94
ExcelでBlackOnyxのような3D迷路を作っているのですが
3D表示で直角三角形はどう表現したらいいですか?
■はInteriorに色をつけてやろうとしてるんですが
斜めの部分が再現できず困ってます。

668 :デフォルトの名無しさん:2011/11/17(木) 19:39:02.79
「最初からそう教えてくれりゃええのにぃ」シリーズの本(と言っても2冊しかないけど)では
下記のことはマスター(単に記述だけでなく手取り足取り教えてくれてるか)できますか?

・変数の値渡し・参照渡し
・変数のスコープ
・プロシージャのサブルーチン(Public, Privateについての詳細など)
・モジュールを分ける理由、たくさん作る利点
・見やすいプログラミングのコツ

669 :デフォルトの名無しさん:2011/11/17(木) 20:44:22.64
本屋で立ち読みして自分で判断ぐらいしやがれ、このクソボケ

670 :デフォルトの名無しさん:2011/11/17(木) 20:47:42.40
>>669
なんだと、このハゲ頭

671 :デフォルトの名無しさん:2011/11/17(木) 21:06:18.86
なんで俺がハゲだってわかった、このストーカー

672 :デフォルトの名無しさん:2011/11/17(木) 22:11:11.62
>>667
無理しないでパターンで持てばいいじゃない。
むしろ色付けは条件付き書式でやった方が楽。

673 :667:2011/11/17(木) 22:34:26.44
>>672
なるほど
32x32の正方形が3D画面だとして、
セルに透明色の1や2や3・・・・・を代入するだけで
あとは条件付き書式が勝ってに色付けしてくれるってわけですか。
そのアイデア採用させていただくでやんす。

ところでパターンとは何ですか?
念のため作ろうとしてるのはこんな青や水色の壁で、
斜めになってる部分が再現できないんです。
http://homepage3.nifty.com/giga/onyx/blackonyxUturo.html

674 :デフォルトの名無しさん:2011/11/17(木) 22:41:35.45
>667
Excelで学ぶ コンピュータグラフィックス技術入門
ttp://www.coronasha.co.jp/np/isbn/9784339024555/
ttp://www.youtube.com/watch?feature=player_embedded&v=D8GOPzjl0HU

675 :660:2011/11/17(木) 23:32:12.28
ROMに戻る前に一応ご報告。
「CreatePolyPolygonRgn」も動かせるようになりました。
問題点は、座標項目が途中からずれており、リージョンが線になっていた、というものです。


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


>>667
作りかけのテトリスが終わったら、
大迷路を作り、それを改造してWIZを作ろうとしてる人間がここに…。
斜めをは私も悩んでました。頑張ってください。


676 :デフォルトの名無しさん:2011/11/17(木) 23:36:53.61
>>673
先にいくつかの壁の絵の部品のパターンを持っておいて、
周りの壁の状況に合わせてそれを組み合わせて表示する様にしておけばいいんじゃないかと
言うつもりでレスしたんだけど、
BlackOnixと全く同じにするのはかなり厳しいと思うよ。
何と言ってもシェイプがセルよりプライオリティ高いからね。
背景にBlackOnixと同じ線が入った絵を用意してやるか、全てシェイプで描くか・・・。

677 :デフォルトの名無しさん:2011/11/18(金) 09:10:10.24
>>671
ハゲ臭がしたからさ

678 :デフォルトの名無しさん:2011/11/18(金) 09:35:49.55
テキストボックスを操るときなど

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

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

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



679 :668:2011/11/18(金) 11:58:23.91
>>669
近くの複数の本屋に行っても置いてないから聞いておるのだ

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

・変数の値渡し・参照渡し
・変数のスコープ
・プロシージャのサブルーチン(Public, Privateについての詳細など)
・モジュールを分ける理由、たくさん作る利点
・見やすいプログラミングのコツ

680 :デフォルトの名無しさん:2011/11/18(金) 12:36:32.30
>>679
http://www.shuwasystem.co.jp/products/7980html/1797.html
http://www.shuwasystem.co.jp/products/7980html/2465.html
これ見て判断してください。



681 :デフォルトの名無しさん:2011/11/18(金) 13:32:32.83
イベントトリブンというけど
例えばボタンを5つつくって、それぞれにマクロを関連づけされてたら
順番にボタンを押すと同時に5つのブロシージャが実行されることになるの?

682 :デフォルトの名無しさん:2011/11/18(金) 13:54:19.77
なんで同時?
普通に「順番」に実行されるだけだと思うが。
そもそも、イベントドリブンと関係ないし。

683 :デフォルトの名無しさん:2011/11/18(金) 14:00:56.84
マルチスレッドじゃないと同時は無理だし。

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
セキュリティとどう関係があるの?

688 :デフォルトの名無しさん:2011/11/18(金) 15:28:51.60
フォームは内蔵activexは外付けって感じ

689 :デフォルトの名無しさん:2011/11/18(金) 15:30:44.67
ActivewindowとActiveworkbookの違いは何ですか?

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
場合によっては血祭りの生贄になります。


695 :デフォルトの名無しさん:2011/11/18(金) 18:25:28.45
前にNUM_ZERO=0って定数見たことあるぜ

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が答えてくれると思ったのか

701 :デフォルトの名無しさん:2011/11/18(金) 20:02:16.72
>>696
>よくあることですが文字列変数に " を代入するにはどうしたらいいですか?

Dim S As String
S = """" ' Chr(&h22) とか Chr(34) とかでもいいけど。

>>698-699
NUM_TWO とか NUM_FOUR だと思うが、そもそも >>697 はそういう規則が
可笑しいと思っていると思うが。

702 :デフォルトの名無しさん:2011/11/18(金) 20:20:03.09
助けてくれますか。

横に10個並んだセルの文字列をくっつけて、それをアクティブセルにコピーしたいんです。
でも
ActiveCell = Range(Cells(1, 1), Cells(1, 10))
だとセルになにも表示されません。
なにが原因ですか?そしてどうすれば正しく表示されますか?

703 :デフォルトの名無しさん:2011/11/18(金) 20:26:46.68
xllとdllでほぼ同じプログラムをかいて、
vbaで実行してみたんですが、xllの方が十倍遅いです。
配布的にxllのほうが好ましいのですが、
こんなもんなんでしょうか?原因がわかりません。

エクセルは2003、dllはvc++6.0、
xllはxlwでvc++2008で書き、runで呼びだしています。

704 :デフォルトの名無しさん:2011/11/18(金) 20:59:25.39
>>702
簡単でいいならこんなので。

Sub test()
Dim 文字列 As String
Dim i As Byte

For i = 1 To 10
文字列 = 文字列 + CStr(Cells(1, i).Value)
Next i

ActiveCell.Value = 文字列

End Sub

705 :デフォルトの名無しさん:2011/11/18(金) 21:00:00.76
>>702
ActiveCell = Cells(1, 1) & Cells(1, 2) & Cells(1, 3) & Cells(1, 4) & Cells(1, 5) & Cells(1, 6) & Cells(1, 7) & Cells(1, 8) & Cells(1, 9) & Cells(1, 10)

706 :デフォルトの名無しさん:2011/11/18(金) 21:07:47.62
コード書くとき、
わざと数式で全部書いてないのに、別の行にうつるとエラーが出るのがうざいんですけど。

例えば、
if cells(x,y)=
と途中まで書いて、右辺の変数名を忘れたから確認するためにコードの上のほうをスクロールして見にいきたいことって多いと思うんです。
ところがスクロールしてどこかをクリックして瞬間に、エラーで怒られます。
これを防ぐにはどうしたらいい?

707 :デフォルトの名無しさん:2011/11/18(金) 21:11:56.83
>>706
オプションの"自動構文チェック"をオフにする

708 :デフォルトの名無しさん:2011/11/18(金) 21:15:30.07
一般にプログラミングしてる人って、
セルの座標をxとyで使うときって

(1) cells(x,y)
(2) cells(y,x)

の、どちらがより普及してる書き方?

709 :デフォルトの名無しさん:2011/11/18(金) 21:32:36.84
数字を文字列にするとき
ひとけたの数字(0〜9)は無理やりふたけたにするために0を頭につけたい(00〜09)のですが
 Right("0" & Str(c), 2)
ではダメでした。
0じゃなくて空白があいてしまいました。
原因と対策はどうすればよいですか?

710 :デフォルトの名無しさん:2011/11/18(金) 21:37:35.18
cstr

711 :デフォルトの名無しさん:2011/11/18(金) 21:42:42.26
>>708
あえて選ぶなら Cells(y, x) だけど、普段は cells(r, c) にしてる
セル位置は座標とは厳密には違うから、変数名にx、yは使わない

712 :デフォルトの名無しさん:2011/11/18(金) 21:44:27.36
>>709
Format関数

713 :デフォルトの名無しさん:2011/11/18(金) 21:47:24.39
Cells(i,j)でしょ、普通
んで、k,l,m,n,,,,,

714 :デフォルトの名無しさん:2011/11/18(金) 21:56:53.11
>>713
Fortran 世代かよ。

普通に >>711 に一票
(って言うか、一文字変数は使わないから Row, Column だが。)

715 :デフォルトの名無しさん:2011/11/18(金) 22:00:04.03
オレもijだけどなんかまずいの?

716 :デフォルトの名無しさん:2011/11/18(金) 22:09:27.89
>>714
プロパティと同じ変数名使うのか?
変わってるな

717 :デフォルトの名無しさん:2011/11/18(金) 22:18:37.71
>>715
まずくはないと思う
ただ変数名はある程度 意味ある名前にした方が
分かりやすい

んでこの流れで聞くけど
みんなは変数名とかのネーミングはどうしてる?
(ネーミングルール的な事)

漢字は使っていいのだろうかとか
スコープ(適用範囲)を意識した名前の方がいいんだろうかとかとか
いつも悩む・・・んで結局テキトーになってしまう
(まー今は個人的にしか使わんから なんとかなってるけど)

718 :デフォルトの名無しさん:2011/11/18(金) 22:25:04.46
x軸は横方向。y軸は縦方向を表す表記だろうからy、xの順番が順当でしょう。
ただ、Cellに関しては単位が行(Row)と列(Column)なので、確かにr、cにする方がより良いですね。
でも1文字の変数名はスコープが小さくて一見して何に使ってるか分かる場合だけにしておいた方が良いでしょう。
変数名は分かり易い英語で、頭文字を小文字にして付けておくと、後々幸せになれますよ。多分。

719 :714:2011/11/18(金) 22:35:34.87
>>715
いや、別にまずくはないよ。

>>716
ん? なんかまずいのか?
プロパティと同じものがだめなら Width, Height, Value, Offset とかもだめだし、
そもそも VBA のプロパティなんて全部覚えてられない。

>>717
個人的には漢字は使わないけど、手直しを頼まれたときに漢字を使ってるソースに手を
入れたことがある。下手な英語より確かにわかりやすい。
最初の数文字をアルファベットにしておけば、インテリセンスで入力も思ったより簡単だし。

720 :デフォルトの名無しさん:2011/11/18(金) 22:44:12.11
そうなんだよねー、
Excelはモジュール単位でVssやSvnが使えないから
修正した場所はコメントにして残しておくことが多いんだよねー。
見辛くてしょうがない。

721 :デフォルトの名無しさん:2011/11/18(金) 22:44:47.52
「数値が文字列として保存されてます」の注意書きのセルがたくさんあるのですが
これらをVBAですべて数値に変えるにはどうしたらいいですか? (それらのセルはSelectで囲っています)

722 :デフォルトの名無しさん:2011/11/18(金) 22:51:17.98
一瞬、rとcがすごいと思ったけど

aやbやcのアルファベットの最初のほうは
Dim a as integerでFor〜Next文で多用するから
cをFor Nextで使ってることを忘れて、さらに使ってしまう(あるいはその逆もあり)心配があるから
や〜めた。
やっぱりxとyにして、Cells(y,x)を使うことにした。

ところで変数の日本語はダメでしょ。
(1)予約語を使う心配がないのと、(2)日本人には見やすいのはわかるけど
国際的なプログラミングをしてる職場はとくに。(いまは経験なくても将来的に使うようになる可能性が高い)

かわりに(1)(2)を満たすために
例えばintegerだったら、inTensuu、inTokutenn、stringだったらstName、stAddressのようにすれば解決。

723 :デフォルトの名無しさん:2011/11/18(金) 23:02:36.69
>>720
エクスポートして svn に突っ込んでるよ。

>>722
一文字変数って TinyBasic 世代かよ。

と突っ込もうと思ったが、VBA で国際的なプログラミングって....

724 :717:2011/11/18(金) 23:11:15.72
>>719 >>722
いろんなサンプルコードみても
日本語変数使った物って お目にかからないんだよな
だから使わない方が良いのかなって思ってたりする
でもスゲー分かり易かったりするんでどうなのかなって質問してみた

>>722 ちなみに
PUBLICな変数とか モジュールレベルな変数
だとどうしてる?

725 :デフォルトの名無しさん:2011/11/18(金) 23:11:27.18
昔読んだ初心者向けのVBAの本に
予約語と同じ変数名は紛らわしいからダメって書いてあった

個人的にはOffsetのように先頭が母音で始まるもの以外は
子音のみの表記を変数として使ってる
たとえばRow→Rw,Column→Clm,Folder→Fldrなど、
先頭が母音の場合は先頭だけは抜かない。
Offset→Offstとかそんな感じ。

726 :デフォルトの名無しさん:2011/11/18(金) 23:14:25.20
今時ハンガリアン記法もなぁ

727 :デフォルトの名無しさん:2011/11/18(金) 23:18:45.79
>>725
>予約語と同じ変数名は紛らわしいからダメって書いてあった

紛らわしい以前にたいていエラーになるだろ。

あと、プロパティ名は予約語と違うぞ。

728 :デフォルトの名無しさん:2011/11/18(金) 23:22:37.60
>>722
Forの制御変数を1文字で済ます場合はi、j、k〜を使うのが昔からの慣習
それに従えばcは空く

729 :デフォルトの名無しさん:2011/11/18(金) 23:23:37.13
>>722
国際的なプログラムって言うなら接頭語にinとかstとか付けるのやめようよ。

730 :デフォルトの名無しさん:2011/11/18(金) 23:31:43.44
オートフィルタが隠れてる行があるんですが
それらはカウントしないように、いま表示されてる行の数だけを変えるVBA文はどう書いたらいいですか?

a = Selection.Rows.Count

とすると、隠れて見えない行まで数えてやがります。

731 :デフォルトの名無しさん:2011/11/18(金) 23:44:35.74
数えるときに使うプロパティのAreaってどういうときに使うのですか?
このAreaの概念がさっぱりわからん。

732 :730:2011/11/18(金) 23:53:56.01
奥さん、聞いてくださいよ!!
できたよ!

a = Selection.Resize(, 1).SpecialCells(xlCellTypeVisible).Count

ああ、なんと頭がいいのだろう。

733 :デフォルトの名無しさん:2011/11/19(土) 00:02:16.62
>>708

座標を使う時は(y,x)、二つ目以降は(yn,xn)かな。
Forを使う時は大抵i,j,k…で、入れ子するときはii,iii…と重ねる。
それ以外の変数は、漢字も使う方がわかりやすい。
下手なネーミングするとプロパティやメソッドと被ってエラー吐くしね。

734 :デフォルトの名無しさん:2011/11/19(土) 00:09:59.63
>>730
a = Range(範囲).SpecialCells(xlCellTypeVisible).Cells.Count

735 :デフォルトの名無しさん:2011/11/19(土) 08:05:23.82
>>734
範囲は1列の前提で書いてるのかも知らんが、SpecialCellsはセルの集合体だからCellsは要らんよ。
そもそも答えは>>732で出てるだろ?

>>731
Areasのことか?
連続領域の数だよ。
A1:A2とA6とA8:A10に何か入力されてて他が空白の時
Range("A:A").SpecialCells(xlCellTypeConstants).Countは3になる。

736 :デフォルトの名無しさん:2011/11/19(土) 09:05:20.69
変数名は ハンガリアン+日本語 でつけてる。
先頭がハンガリアンだからIDEによる補完もそこそこ使えるし、ローマ字アルファベットよりは意味が通じる

「右クリックから一括エクスポート」のマクロを作ってアドイン化してるからTortoiseSVNで差分比較とかもできる。
ネタ元はこれね
Excelプロフェッショナルエンジニアテクニック
ttp://www.amazon.co.jp/dp/4904412028

737 :デフォルトの名無しさん:2011/11/19(土) 09:18:22.68
その程度ならわざわざ本買わなくても
ネット上に情報が転がってるけどね

738 :デフォルトの名無しさん:2011/11/19(土) 09:33:02.75
ちなみにうちで飼ってるハムスターは

739 :デフォルトの名無しさん:2011/11/19(土) 09:54:09.78
あれ、途中で送信された。

ちなみにうちで飼ってるハムスターは、ジャンガリアンと言うんだよ

740 :デフォルトの名無しさん:2011/11/19(土) 10:16:46.78
残念。ゴールデンだ。

741 :デフォルトの名無しさん:2011/11/19(土) 10:41:56.93
>>735はAreasが抜けてたわ。
Range("A:A").SpecialCells(xlCellTypeConstants).Areas.Countは3になる。
だな。
Areasも連続領域の数じゃなくて連続領域な。

742 :デフォルトの名無しさん:2011/11/19(土) 15:30:06.17
>>729
> 国際的なプログラムって言うなら接頭語にinとかstとか付けるのやめようよ。

そこに突っ込むなら、Tensuu、Tokutenn に突っ込めよ。

>>733
> 入れ子するときはii,iii…と重ねる。

Typo しても気づかないから最悪。

> 下手なネーミングするとプロパティやメソッドと被ってエラー吐くしね。

はあ? どこの VBA をお使いなのかな。 (w

743 :デフォルトの名無しさん:2011/11/19(土) 15:35:46.17
変数は
「鬱」や「欝」みたいな難解な漢字を使うと東洋っぽくてカッコいい。

For 鬱=1 to 9
  For 欝 to 9
   Cells(欝,鬱)=欝*鬱
  Next 欝
Next 鬱

744 :デフォルトの名無しさん:2011/11/19(土) 16:43:21.41
どのスレにも負けず嫌いな奴っているな。

745 :デフォルトの名無しさん:2011/11/19(土) 17:53:50.11
俺は変数に日本語は絶対に使わない。
日本語入力と英語入力の切り替えが鬱陶し過ぎる。


746 :デフォルトの名無しさん:2011/11/19(土) 18:13:17.95
エンドユーザー部門で作り受け継いでいくことの多いVBAでは
漢字変数は極めて有効。
担当者の開発スキルが低く、開発時間もあまり取れないわけだから
プログラムの早期理解のため視認性が最も大事。

Dim 元データシート as Worksheet
Dim 編集シート as Worksheet

ExcelVBAで初心者がつまづく箇所の一つであるシートの使い分けは
上記のように漢字でワークシートオブジェクト変数を定義し
それぞれに実際のワークシートオブジェクトを代入して使うことにより
プログラムの中で今どの機能担当のシートを扱っているのか
非常によく見えるようになる。

747 :デフォルトの名無しさん:2011/11/19(土) 18:21:29.64
という英語が出来ない奴の偏見

748 :デフォルトの名無しさん:2011/11/19(土) 18:36:58.00
こんなところで英語自慢ですか... (w

749 :デフォルトの名無しさん:2011/11/19(土) 18:53:06.49
こんなところで英語出来ない事を公言ですか... (w

750 :デフォルトの名無しさん:2011/11/19(土) 19:08:57.27
英語が出来るのが自慢になるという発想が理解に苦しむ

751 :デフォルトの名無しさん:2011/11/19(土) 19:17:08.06
英語自慢と書いたら、英語できないと読み取る方が理解できないよ。

752 :デフォルトの名無しさん:2011/11/19(土) 19:18:29.03
義務教育で教わる範疇のことを
自慢とか居直られえてもな・・・

753 :デフォルトの名無しさん:2011/11/19(土) 19:27:42.88
なんか壷突いちゃったみたいだな (w

754 :デフォルトの名無しさん:2011/11/19(土) 19:35:38.62
ゴメン、俺、義務教育修了してない
中学時代に家飛び出して、住み込みで働き始めて
そこも出て会社勤めで自活し始めて
起業して軌道に乗って余裕が出来てから英語の勉強始めた
だから25くらいまで中学レベルの英語さえ全然できなかった

755 :デフォルトの名無しさん:2011/11/19(土) 19:52:26.85
>>754
起業したんなら一生懸命になる所が違うだろうよ。
経営破たんするぞ。

756 :デフォルトの名無しさん:2011/11/19(土) 21:10:50.23
できるやつは学校なんかいかなくても成功するし
大学出てもダメなやつはニートになる

757 :デフォルトの名無しさん:2011/11/19(土) 21:19:15.38
はいはい。
成功したならExcelなんて人雇ってやらせればいい。
なんで余裕のある経営者が自らExcelの変数名なんか語りにこのスレに来ちゃうかな。

758 :デフォルトの名無しさん:2011/11/19(土) 22:05:11.29
CPU占有回避に以下のような対応してますが、
質問があります。
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
...
Do
...  処理
DoEvents
Call Sleep(1)
Loop

この場合でのDoEventsは意味をなしているでしょうか?
あとのSleepで結局同じくCPU開放してると思うので
DoEvents無しでもおなじかなっと思ったんですけど
いかがでしょう?


759 :デフォルトの名無しさん:2011/11/19(土) 23:11:45.26
DoEventで他のイベントの発生を許してるんじゃなかったっけ?

760 :デフォルトの名無しさん:2011/11/19(土) 23:41:10.93
DoEvents マクロが占有している制御をOSに開放する
だからといってCPUの使用率は下がらない

Sleep関数は、指定した時間だけ処理を停止させる関数

ってことらしい
(よく判ってないですがw


761 :デフォルトの名無しさん:2011/11/20(日) 11:14:44.65
なんでWin32APIを使ってプログラミングしたことないやつがVBAやってんだ
足し算習わずに割り算やるようなもんだぞ

762 :デフォルトの名無しさん:2011/11/20(日) 11:44:34.64
Win32APIを使ってプログラミングってどうやるんだ?
なにかプログラミング環境をインストールしなきゃならなくないのか?

763 :デフォルトの名無しさん:2011/11/20(日) 12:02:20.50
ブラウザでWebサイト見るのに、HTMLの構造は知らなくても問題無いだろ。
同じようにVBA使うのにWin32APIの知識は必須じゃない。
まあ、OLE Automation周りの知識があれば、
何故文字列はByRef推奨なのかとか理解できるようにはなるけど。

>>762
OS自体には開発環境以前にコンパイラすら付属していないので、
まずMSのサイトからVisualC++2010Expressをインストールするところから。

764 :デフォルトの名無しさん:2011/11/20(日) 12:05:19.21
>>761
VBAはエンドユーザー向けの機能なんだから別にいいじゃん。
最初はExcel操作の自動化をするためのマクロ言語として使い始め、
徐々にステップアップしてやりたいことが増えてくれば
APIに手を出すようにもなる。自然な流れだよ。

765 :デフォルトの名無しさん:2011/11/20(日) 12:43:04.22
>>761 は、「Win32API 使える俺は偉いんだぞ」のアピールだろ。
スルーでいいよ。

766 :デフォルトの名無しさん:2011/11/20(日) 13:18:50.22
むしろ知ってる奴だって完全に知ってる訳じゃない。
APIの本はやたら高くて完全に網羅されている本なんか見たこともない。
逆に「APIも知らないの?」と言う奴がいたらそいつはちょっとかじったことがあるだけの知ったかぶりと思って
ほぼ間違いない。

767 :デフォルトの名無しさん:2011/11/20(日) 13:20:02.13
>>761みたいなのがいるから
VBAが厨房御用達言語みたいな風潮になるんだよな


768 :デフォルトの名無しさん:2011/11/20(日) 13:52:23.11
Win32API程度で得意満面も>>761の痴態を見物に来ましたw

769 :デフォルトの名無しさん:2011/11/20(日) 14:00:15.52
redim って何でこんなに使い勝手悪いんだw

770 :デフォルトの名無しさん:2011/11/20(日) 14:31:47.00
>>769
初めて聞いた意見だ。

お前が馬鹿なだけだと思うが、
なにが使い勝手悪いんだ?
言ってごらん。ん?ん?

771 :デフォルトの名無しさん:2011/11/20(日) 14:52:33.59
自分でarraylistクラス作ってからは問題ない

772 :デフォルトの名無しさん:2011/11/20(日) 16:59:44.28
>>770
>>769 じゃないけど、

・サイズ = 0 を指定できない。
・次元を取得できない。

のがちょっと不便と思ったことはある。

773 :デフォルトの名無しさん:2011/11/20(日) 17:36:35.16
Redim Preserve は不便と思った

774 :デフォルトの名無しさん:2011/11/20(日) 23:04:02.43
PreserveじゃないReDimに活躍の場なぞ無いと思うが

775 :デフォルトの名無しさん:2011/11/20(日) 23:17:15.65
なんで?
何らかの演算/外部入力で、データ量が決まるケースなら、普通に ReDim( ) で必要サイズを
指定して処理するけど。

776 :デフォルトの名無しさん:2011/11/20(日) 23:32:22.15
preserveを2次元以上で使うとダメだったよね?

777 :デフォルトの名無しさん:2011/11/20(日) 23:38:43.26
VBAだと、Dim宣言時の配列の要素数は定数が必須だから、
変数の値で指定したい時は、Dim直後に即ReDimとかやるなあ。

778 :デフォルトの名無しさん:2011/11/20(日) 23:38:45.19
C言語の配列はサイズを変えられない

779 :デフォルトの名無しさん:2011/11/20(日) 23:59:36.00
>>778
VBAもC言語も静的配列は要素数を変更できないし、
動的配列は変更できる
要はメモリの使い方

780 :デフォルトの名無しさん:2011/11/21(月) 08:21:55.72
reallocは?

781 :デフォルトの名無しさん:2011/11/21(月) 13:06:30.95
Excel VBA の書籍、サイトに関する質問です。

私は今、Excel2007で簡単なデータ分析をおこなっています。その分析をより快適なものにするため、VBAの学習を始めました。学習を進める上で、本を3冊程度購入しています。2冊は入門書で、1冊は
田中亨『Excel VBA 逆引き辞典パーフェクト 2010/2007/2003対応』株式会社翔泳社
という書籍です。

最後の書籍は、メソッドやプロパティがまとめられている辞書のような書籍が欲しい、と思って購入したのですが、あまり満足できておりません。
なぜなら、(1)自分にはあまり関係しない項目の記述が多いから (2)かといって、内容が網羅的であるわけでもないから などの理由があげられます。

そこで、皆さんの意見を参考に新しい書籍を購入、サイトをブックマークしようと考えております。データ分析に関する「メソッドやプロパティがまとめられている辞書のような」まとめが欲しいです。

782 :デフォルトの名無しさん:2011/11/21(月) 13:10:21.59
横着すぎだ

783 :デフォルトの名無しさん:2011/11/21(月) 13:24:03.04
手段が目的になっている

784 :デフォルトの名無しさん:2011/11/21(月) 14:29:34.74
>>781
完璧にまとまってる書籍は見たことない
msdnがあれば十分

785 :デフォルトの名無しさん:2011/11/21(月) 15:45:14.04
>>777
なぜ最初から
Dim a(変数) as integer
にしないの?

786 :デフォルトの名無しさん:2011/11/21(月) 15:47:17.14
VBAの入門書「「最初からそう教えてくれりゃええやん、ンもぅ」の2冊では
SubプロシージャやFunction関数の、PrivateやPublicを駆使した使い方までマスターできますか?


787 :デフォルトの名無しさん:2011/11/21(月) 17:03:31.18
ここで「はい」と答え、
>>786がamazonで注文し、結果786がマスター出来なかったとしても
だれも責任の取りようもない


そんなことも分からない池沼の>>786

788 :デフォルトの名無しさん:2011/11/21(月) 18:55:28.32
だから、立ち読みで自分のレベルと本のレベルとでバランスを調整しろよ

789 :デフォルトの名無しさん:2011/11/21(月) 19:31:38.18
>>785
おまえ馬鹿?
サイズが不定の時は動的配列でRedimするしかねーだろ?
Dim a(変数) As Integerだと「定数式が必要です。」って怒られるぞ。

790 :デフォルトの名無しさん:2011/11/21(月) 20:50:06.49
動的配列って必要な分だけ増やしてんの?
それとも移し替え?

791 :デフォルトの名無しさん:2011/11/21(月) 20:52:21.21
VBAの書籍って買ったことないけどGoogle以上の情報って載ってるのか?

792 :デフォルトの名無しさん:2011/11/21(月) 20:56:46.05
情報量で?勝てると思う??

793 :デフォルトの名無しさん:2011/11/21(月) 21:08:38.53
俺の場合業務用のアプリケーション作る必要性から
知りたいことだけググりながらつまみ食い的に学んでいった
だから正規ルート?で勉強した人が当然知ってるような
基本的なことが分かってなかったりする
基礎から体系的に学べるVBAの本があれば知りたいんだけど

794 :デフォルトの名無しさん:2011/11/21(月) 21:12:16.67
オレハグーグルデスベテカイケツデキルンダエラインダ

はいはい、分かりました。

次の方どうぞ〜

795 :デフォルトの名無しさん:2011/11/21(月) 21:51:57.13
VBAのヘルプファイルで十分。
それ以上やっても他の言語との格差でウンザリするだけ。

796 :デフォルトの名無しさん:2011/11/21(月) 22:36:27.79
コンボボックスAとコンボボックスBで選択した条件にあったデータを
表示するって作成可能でしょうか?



797 :デフォルトの名無しさん:2011/11/21(月) 22:47:47.02
可能だから頑張りな。

798 :796:2011/11/21(月) 23:02:19.76
>>797

了解。

VBAでオートフィルタ使えばなんとかなりそうです。

799 :デフォルトの名無しさん:2011/11/21(月) 23:36:52.10
>>793
できる大事典

800 :796:2011/11/22(火) 00:03:57.46
なんとかオートフィルターで条件に合うものをワークシート上に
抽出するようにできました。

必ず、抽出されるデータは一件なのですが、その抽出したデータを
フォーム条のラベルに表示したいと思ってます。

Label8.Caption = Range("  ").Value

オートフィルターで抽出したデータの行を取得する方法を探しております。
じゃないと、RANGEのところにセル番地をいれることができず。

801 :デフォルトの名無しさん:2011/11/22(火) 00:27:06.70
>>793
古本屋に行ってSoftBankの「ExcelVba サンプルコレクション」を探すんだ。
以前現場でVBAやりたての頃、出来る人に「この本は今は全く分からなくても、いつか必ず役に立つから
買っとけ」と言われて買っておいた。
その後年月が過ぎて、色々な本を買って勉強したけど、結局最後に手元に残ったのはこの1冊だけ。
これ以上の知識が必要ならむしろVB6のいい本を探した方がいい。

802 :デフォルトの名無しさん:2011/11/22(火) 01:03:50.86
>>801
丁寧にありがとう
早速注文してみた

>>799
ありがとう、検討してみる

803 :796:2011/11/22(火) 01:27:55.00
ここまでなんとか考えましたが、ラベルにオートフィルで表示したデータが表示されません。
c.rowにて行番号を取得しています。
メッセージボックスにはD2とかD3とかが表示されます。で、そこにはいってるデータをラベルに表示したいと思ってます。


For Each c In .AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible)

If c.Row <> 1 Then

number = "D" & c.Row
MsgBox number
Label8.Caption = Range(number).Value

End If
Next c

804 :デフォルトの名無しさん:2011/11/22(火) 10:19:04.04
VBAの入門書「最初からそう教えろやゴルァ、殺すぞ!」の2冊は
どこまでVBAを使いこなせるようになるでしょうか?

805 :74:2011/11/22(火) 11:51:20.21
その本に書いてある範囲の事は
出来るようになると思います()

806 :デフォルトの名無しさん:2011/11/22(火) 22:05:45.58
>>804
本屋行くのめんどいなら
amazonで立ち見したら?

807 :デフォルトの名無しさん:2011/11/23(水) 01:07:07.98
>>803
Label8.Caption = Range(number).Value
のところ、
Label8.Caption = Cells(c.Row ,4).Value
にしてみたら?


808 :デフォルトの名無しさん:2011/11/23(水) 08:02:27.63
Label8.Captionは表示されてても見えないだけだろ?
SleepとかDo Eventsをかませないとな。
ちなみに行番号やアドレスを使ってセルへの参照を得る書き方はほとんど素人向けの書き方だ。
c.Offset(,3).Valueでいいはずだ。

809 :デフォルトの名無しさん:2011/11/23(水) 08:40:20.07
>素人向けの書き方

ぷっ
本人にとって分かりやすければそれが「素人向け」だろうとなんだろうと良いだろう
何偉そうに書いてんだか

810 :デフォルトの名無しさん:2011/11/23(水) 09:22:20.80
>>808
見づらいなぁ。
いつもそんな書き方してるの?
ひょっとして省略出来るところは何でも省略しちゃう派?

811 :デフォルトの名無しさん:2011/11/23(水) 09:54:44.08
ファイルサーバに保存されたブックを自分以外の誰かが今現在開いてるか調べるは
どうすればいいんでしょうか

812 :デフォルトの名無しさん:2011/11/23(水) 09:56:31.29
少しは自分で考えろよ

813 :デフォルトの名無しさん:2011/11/23(水) 10:25:25.94
>>811
「ブック 共有 VBA」でぐぐったらこんなの出てきた
http://officetanaka.net/excel/vba/tips/tips99.htm


814 :813:2011/11/23(水) 10:27:42.50
こっちもあった
http://officetanaka.net/excel/vba/tips/tips108.htm


815 :デフォルトの名無しさん:2011/11/23(水) 11:37:24.19
>>806
俺も買おうか迷ってたが、買うことに決めたぜ。
カエルがかわいすぎる。
このカエルと一緒なら俺でも理解できそうだぜ!

816 :デフォルトの名無しさん:2011/11/23(水) 11:48:22.00
最初から厨は業者の工作員
これ豆な

817 :デフォルトの名無しさん:2011/11/23(水) 12:12:42.95
>>801
SoftBankのってどれ?
Amazonでは2つ出てきたけどどちらでもなさそうだけど。

818 :デフォルトの名無しさん:2011/11/23(水) 13:54:50.70
>>813
ありがとう
ブックの共有機能って使ったことないなあ
下のやり方はトリッキーだけどシンプルでいいですね
こっちでやってみます

819 :デフォルトの名無しさん:2011/11/23(水) 14:20:29.96
>>817
その2つだよ。
正式書名は「ExcelVBA実用サンプルコレクション」
青いやつが元で、緑のは新装版。
VBAの使い方や文法などごく基礎的なことはわかるけど
実践では具体的にどういうコードを書けばいいのか
テーマごとに調べたい人に向く。

820 :デフォルトの名無しさん:2011/11/23(水) 17:45:27.06
EXCEL VBA でプログラミングに目覚めた30代が次に手を伸ばす言語は何がお勧めですか?
スキルを上げていつかはIT方面に転職できればなあと考えてます。

821 :デフォルトの名無しさん:2011/11/23(水) 17:47:13.61
VBAだけを極めるべきだ
このスレ的な回答として

822 :デフォルトの名無しさん:2011/11/23(水) 18:05:03.46
>>820
どんなIT方面かにもよる
ハードウェア組込、製造系ソフトなら C++
サイト関連ならjava,php,

823 :820:2011/11/23(水) 18:13:16.17
>>821
これは的外れな考えかも知れませんが、VBAにしても、VBAだけだけやって
本当に上級者になれる気がしないです。
VBAってスキルレベルの高い本ってあまりないし。
クラスモジュールにしても、情報が少ないですけど、これたぶん何か他の言語の下地が
できている人じゃないとうまく使いこなせないんじゃないでしょうか。
最近ネットでいろんなテクニックをつまみ食いしてもなんだか空しいです。
また先日某サイトで落とさせてもらったPING処理関係のVBAツールの中身を見たんですが、
これがプロのコードかと思い、あまりのレベルの高さに愕然としました。
あんなふうにAPIを使いこなせるスキルって、VBAだけやってたんじゃ手が届かないんじゃないでしょうか。

>>822
製造系とWEB系両方少しずつ勉強していきたいと考えてます。
C++ですか。C#はどうでしょうか?
JavaScriptとJavaではやはりJava がいいでしょうか?

824 :デフォルトの名無しさん:2011/11/23(水) 18:20:24.71
ふーむ。
その志向性ならJavaかC#かな。PHPはやめた方がいいかもね、汚い言語だから。
うまく使いこなせない、っていう期間が長期化する可能性がたかそう。
JavaScriptってかECMAはJava使いにも難しいと言わせしめる部分があるから、
それなりに気合いれて取り組んだ方が良いかな。
MS系VBAが出身だからJavaよりC#は相性が良い部分があるけど、
役に立つ情報集めようとすると英語が必須かもね。お好きな方をどうぞ。

825 :デフォルトの名無しさん:2011/11/23(水) 18:21:12.63
プロの俺がおすすめするにはやっぱりCだろう。
API使ってるのをすごいと思っちゃうのはCをやってないから。


826 :デフォルトの名無しさん:2011/11/23(水) 18:23:57.25
824だけど、たしかに>>825の観点ぬけてた。
ローレベルAPIを使いこなすよーになりたいならCかな

827 :デフォルトの名無しさん:2011/11/23(水) 18:25:55.62
ローレベル=簡単 ではないので。ねんのため。

828 :デフォルトの名無しさん:2011/11/23(水) 18:41:57.28
Cをやると良いのは言語に入出力系の命令がなく
すべて外付けのライブラリで行うってことだね。
C言語自体はすごくシンプルだからね。
そうするとAPIもたんなるそのライブラリのひとつって
考えるからすごいとかまったく思わなくなるからすんなり習得できる。
あらゆる言語を使ってきた俺が言うんだから間違いない。

829 :デフォルトの名無しさん:2011/11/23(水) 18:46:02.41
あらゆる言語を使ってきたかたに質問なのですが

CとC++とC#と、VisualCとVisualC++とVisualC#の、これらの違いはなんですか?
ひょっとしたらもっと仲間があるかもしれないけど。

ところで昔流行ったBASICとかFORTRANとかアセンブラとかいうのは
いまは使われてない言語ですか?

830 :デフォルトの名無しさん:2011/11/23(水) 18:47:53.73
その位ググれよw
つーかスレチだ

831 :デフォルトの名無しさん:2011/11/23(水) 18:49:56.06
>>829
それらの言語は全部やったけど、
ようするにそういうのが気になってしまうのは
Cをやらないからなんだよ。そこをわかってもらいたいけど
わかるにはCをやらないとだめなんだな。これが。

832 :デフォルトの名無しさん:2011/11/23(水) 18:57:29.19
>>829
>CとC++とC# 
言語の名前
>VisualCとVisualC++とVisualC# 
マイクロソフトの製品
>昔流行ったBASICとかFORTRAN 
流行ってはないだろうが使われてる。BASICはVB.NETに変化してそこそこ使われてる

スレチなんでさっさとお引き取りください

833 :820:2011/11/23(水) 19:11:32.64
>>824
実は本屋でいろいろ立ち読みしてJavaScriptのいろんな作例を載せてる本を見たんですが、
けっこう幅広い用途で活用できそうで、またVBAのコードともぱっと見た感じ近いかなぁなどと思ってましたが、
そんなに難しいとは思いませんでした。

>>825
APIはあくまで例えで、EXCELに依存しないWindowsアプリを自分で自由に設計、作成できるようになる、
というのが現在の私の目標です。

>>828
まだ言語方面の知識が浅く、C < C++ < C#などと安易に考えていました。
違いは文法とあとは.NET使えるか、ぐらいかと…

職場のSEさんはJavaを勧めてきます。偏見かもしれませんが、Javaについて
よく耳にするのはコードが煩雑だとか動作が遅いだとかなので、ちょっとためらってしまいます。
Javaやるなら難しそうだけどC#かなと思ってました。C#を覚えればVSTOとかっていうVBAのバージョンアップ版みたいな機能も使えるみたいで面白そうだなと。
でも意外にもCって重要なんですね。Cは昔昔文法だけ勉強したことがあるんですが、まだまだ現役で使われてるのなら、Cも選択肢に含めてもうちょっと本屋で情報を漁ってみます。

スレチなのでこの辺で失礼させて頂きます。
沢山のアドバイスありがとうございました。今後の参考にさせて頂きます。

834 :デフォルトの名無しさん:2011/11/23(水) 19:13:34.88
>>819
新装版だけあれば大丈夫でしょうか?

835 :デフォルトの名無しさん:2011/11/23(水) 19:20:02.44
>>833
ほらね。Windowsアプリって知らないうちに限定しちゃってるでしょ
Cだと入出力系がライブラリだからWindowsとか限定する発想がなくなる。
マイコンだろうがlinuxだろうかゲーム機だろうが関係ないっていう
発想になる。
あと職場のSEがJavaをすすめるのは自分を超えられると困るからだろうなw

836 :デフォルトの名無しさん:2011/11/23(水) 19:55:22.88
無茶を承知で言えば

CでWin32APIを勉強して、COMなんかを触ってみて、もう一回VBAに戻ってくる、かなぁ・・・
やっぱりこれはハードルが高杉

VB6をして、Win32APIを触る所までいって、COMをやって、VBAに戻ってきてこの3つをつなげて考えられるようになる、のほうがいいかな

837 :デフォルトの名無しさん:2011/11/23(水) 20:07:51.01
sqlite3とADODB.RecordsetをODBCドライバで繋いで、
その後copyfromrecordsetでシートにデータを吐き出させようとしたんだけど
excel2003なら問題なく動くのに2007だとエラー吐くんで困ってる

2003の場合は(field).valueで普通にvalue=で数値・文字列が返ってくるんだけど
2007だとvalue(0)=って配列&バイナリ型で返ってるくるのでアウト
どうすればいいんだー



838 :デフォルトの名無しさん:2011/11/23(水) 20:23:43.77
>>829
アセンブラかぁ。
そうだね。アセンブラは死んだ言語といってもいいかな。
昔アセンブラはOS挟まないで直接ハード制御してたし、
今はアセンブラと言えば中間言語をアセンブラらしいコードにしたILと呼ばれているものだし。
作りも大分さまがわりしたしね。以前は番地を直接指定することも当たり前だったけど、
今は何かと言えばスタックエリアに頼るね。
まぁ速い処理が必要で無ければ、まず触る言語では無いね。


839 :デフォルトの名無しさん:2011/11/23(水) 20:32:38.97
後、勉強するならやっぱりJavaの方がいいかな.。
言語的にはC#だとLINQとか使えて便利だけど、
いかんせんJavaの方が参考書が揃ってる。
Object指向はデザインパターンも大事だから勉強するならJava。
ある程度覚えた後に使うならC#と言った所かな。

840 :デフォルトの名無しさん:2011/11/23(水) 20:47:21.23
すいません。もの凄く基本的なことなんだと思うのですが、使えば使うほどわからなくて困惑するこの挙動について教えてください。

Worksheet.Range プロパティでセルを扱おうとすることに失敗したり成功したりする基準がわからないのです。

たとえば、

Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
ws.Range(Cells(1,1)).Value = 5

というコードはなぜ動かないのでしょうか。3行目をこうすると動くのですが、

ws.Cells(1,1).Value = 5

前者ではRange(Cells(1,1))の後にも自動補完が効くのに対し、ws.Cells(1,1)の後ろでは自動補完が効かなくなるので、
型的には前者の方が厳密な気がします。

あるいは、これらのコードは、ワークシートがアクティブかどうかの影響も受けるのでしょうか。


841 :デフォルトの名無しさん:2011/11/23(水) 20:50:47.75
>>834
新装版は昔書店で立ち読みしたことがあるだけなので
うろ覚えだが、ページが白黒からもう少し色が増えていた
ような気がする。
あとサンプルコードの入っている付録CDを使いやすく改良した、と
書いてあったような気がする。
大幅に違うわけはないし、悪い風評もないので
今から買うなら新装版でいいんじゃないの。

しかしあれだねえ。
一部のベストセラーを除き、コンピュータ関係の技術書って
流通から消えるの早すぎだ。

842 :デフォルトの名無しさん:2011/11/23(水) 20:53:56.96
>>840
>ワークシートがアクティブかどうかの影響も受けるのでしょうか。
その通り
  ws.Range(Cells(1,1)).Value = 5
のうち Cells(1,1) がアクティブシートのセルを参照している

ws.Range(ws.Cells(1,1)).Value = 5
とするべし

843 :デフォルトの名無しさん:2011/11/23(水) 21:02:52.21
>>842
ありがとうございます。突然Cellsと書いちゃってることの不備は何となくわかったんですが、
残念なことにいただいた修正でも同じように動きません……
私のはOffice2007です。

844 :842:2011/11/23(水) 21:03:59.32
ごめん実際テストしたら後者でもエラーになった
なので忘れてくれ

845 :デフォルトの名無しさん:2011/11/23(水) 21:09:39.10
>>819
まさか某田中のようにC.Offset(0,1)って言ってるんじゃねーよな?
あいつ大村といい勝負だぞ。
もちろん下手さ加減においてな。

846 :845:2011/11/23(水) 21:14:50.82
すまん>>810だったわ

847 :デフォルトの名無しさん:2011/11/23(水) 21:24:21.80
省略出来るところは何でも省略していいよな?
自分は.valueなんかいつも省略だ。

848 :デフォルトの名無しさん:2011/11/23(水) 21:27:01.31
>>841
有益な情報ありがとうございます
将来のために買っておきます

849 :デフォルトの名無しさん:2011/11/23(水) 21:37:56.46
>>840
A1にアドレスを書いてるのか?
ws.Cells(1,1).Value = 5ってSheet1のA1に5を代入してるが
ws.Range(ws.Cells(1,1)).Value = 5ってA1に"C1"とか書いてるとC1に5が代入されるコードだ。
意味的に全然違うコードだ。

850 :デフォルトの名無しさん:2011/11/23(水) 21:51:40.50
>>849
何かしら問題の本質に近づいた気が。
Range(なんとか)
は引数が1つのときと2つのときでかなり意味合いが違うということなのでしょうか。


851 :デフォルトの名無しさん:2011/11/23(水) 21:56:06.83
そうか
Rangeプロパティには、
Range(セル範囲を表す文字列)
Range(左上セルのRangeオブジェクト, 右下セルのRangeオブジェクト)
の二つがあるということか。
これ2つ目の引数がオプションっていうのはなんか不親切…

852 :デフォルトの名無しさん:2011/11/23(水) 21:57:13.13
CellsではItemプロパティ使ってるので入力補完は効かないよ。
入力補完を効かせたければws.Range("A1")としないとな。
どうしてもCellsを使って入力補完を効かせたければws.Cells(1,1)をいったんRange型の変数に参照を代入して
Set c = Ws.Cells(1,1)
c.Value=5
などとすればいい。
c.と打てば入力補完が効く。

With ws
 .Range(.Cells(1,1),Cells(1,1)).Value=5
End With
でも入力補完は効くが、こんな馬鹿なことをする奴はいない。

853 :デフォルトの名無しさん:2011/11/23(水) 22:02:27.55
おっと後ろのCells(1,1)の前のピリオドが抜けてたよ

854 :デフォルトの名無しさん:2011/11/23(水) 22:15:54.99
Cells(i, j)がCells.Item(i, j)の糖衣構文なのはなんとなくわかってきました。
この辺の決まり文句的なコードって、何気に省略→規定値っていう暗黙の了解が多いですね。

今度はRowsで引っかかってます…
Rows.Count
というのは、Rowsで返ってくるのがアクティブシートの全行をひとつずつ要素に持っているリストみたいなもので、
その数を数えているからシートの行数がわかるって言うことでしょうか?

というと、RangeというのはRangeでもあり、Rangeのリストでもある再帰データ構造ということですか??

すいません質問というより独り言みたいで。あまりググっても納得する解説がなくて悩んでいたところでもありまして。


855 :デフォルトの名無しさん:2011/11/23(水) 22:18:42.87
納得するまでググれ

856 :デフォルトの名無しさん:2011/11/23(水) 22:29:52.07
いろんなことがすっきりしてきました。ありがとうございましたー

857 :デフォルトの名無しさん:2011/11/24(木) 07:22:13.09
>>854
オブジェクトブラウザを見ろ。
あと、Rangeは範囲を表しているだけで、データ構造とは無関係。

858 :デフォルトの名無しさん:2011/11/24(木) 11:07:50.58
>>854
再起じゃなくて、左辺によって自動的に解釈が変わってるだけ
Set varObject = Range( ... )
の場合はオブジェクトになるし
varVariant = Range( ... )
という代入式の場合は
Range( ).Cells( ).Value
などのプロパティ値が省略されているとコンパイラが勝手に解釈してくれている

859 :sage:2011/11/24(木) 13:26:45.28
http://www.amazon.co.jp/Excel-VBA%E3%82%BB%E3%83%9F%E3%83%8A%E3%83%BC%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-2010-2007-2003%E5%AF%BE%E5%BF%9C/dp/4822293483/ref=sr_1_1?s=books&ie=UTF8&qid=1322108729&sr=1-1

これ読んでVB6.0の文法から勉強しなおせ。
いや、勉強したこともないだろうから、勉強しろ。

860 :デフォルトの名無しさん:2011/11/24(木) 13:35:07.70
>>859
あなた奥田英太郎さん?
本が売れなくてamazonに評価すら付いてないからと言って宣伝するのはいいけど
売れないならもっと内容を良くするよう努力しなきゃ。

861 :796:2011/11/24(木) 20:13:42.41
おそくなりましたー。

Label8.Caption = Worksheets("data").Cells(Int(c.Row), 4)

とすることで、ラベルに表示されるようになりました。
Work.sheetsの指定が必要だったみたいです。



862 :デフォルトの名無しさん:2011/11/25(金) 21:47:09.92
質問です。
「Aが60%、Bが40%で出現する」
「もしAなら+○○回、もしBならー××回」
というプログラムを書きたいのですが、初歩的過ぎて本にも載ってないみたいです。
誰かヒントを教えていただけませんか?


863 :デフォルトの名無しさん:2011/11/25(金) 21:58:47.41
>>862
>「Aが60%、Bが40%で出現する」

「VBA 乱数」とかでググレ

>「もしAなら+○○回、もしBならー××回」

「VBA IF」とかでググレ

864 :862:2011/11/25(金) 22:00:24.43
>>863
ありがとうございます。調べてみます。

865 :デフォルトの名無しさん:2011/11/25(金) 22:43:12.37
セルが1でなければその列を削除するマクロを組みたいのですが
動くけど削除されない列が出てきます

For i = 50 To 100
If Cells(1, i) <> 1 Then
Range(Cells(1, i), Cells(1000, i)).Delete shift:=xlToLeft
End If
Next i

866 :デフォルトの名無しさん:2011/11/25(金) 22:47:32.42
大きな値から小さな値の方向でループしないと、削除したとき行のインデックスがずれるんじゃないか

867 :デフォルトの名無しさん:2011/11/25(金) 22:48:09.99
>>865
For i=100 To 50 Step -1 で

868 :デフォルトの名無しさん:2011/11/25(金) 23:02:45.45
ありがとうございますw
全然気づきませんでした

869 :デフォルトの名無しさん:2011/11/25(金) 23:17:05.47
どのレベルだとVBA使いこなしてるとみとめる??

870 :862:2011/11/25(金) 23:35:59.50
なんとなく作ってみたのですが、型が一致しませんと出てきます。
どなたかアドバイスをお願いします。

Dim i As Long
Dim j As Long
j = Int((10 - 1 + 1) * Rnd + 1)
For i = 1 To 10000
If j < 7 Then
Cells("i: 1").Value = 1000
Else
Cells("i: 1").Value = -1000 ←ここです
End If
Next i
End Sub
よろしくお願いします。

871 :デフォルトの名無しさん:2011/11/25(金) 23:45:37.45
省略出来るところは何でも省略していいですか?
自分は.valueなんかいつも省略だけど。

872 :デフォルトの名無しさん:2011/11/25(金) 23:48:25.25
Cells("i: 1")って何ですかそれ?Cells(i, 1)じゃなくて?


873 :デフォルトの名無しさん:2011/11/25(金) 23:49:24.76
>>871
他の言語に移行する気がないなら好きにしろ

874 :871:2011/11/25(金) 23:51:26.16
他の言語に移行する気は充分にございます。
どうすればいい?

875 :862:2011/11/25(金) 23:54:27.68
>>872
できました
Private Sub kitaiti()
Dim i As Long
Dim j As Long

For i = 1 To 10000
j = Int((10 - 1 + 1) * Rnd + 1)
If j < 7 Then
Cells(i, 1).Value = 1000
Else
Cells(i, 1).Value = -1000
End If
Next i
End Sub
これでしっかりと表示してくれました。
ありがとうございます。

876 :デフォルトの名無しさん:2011/11/26(土) 00:03:02.71
>>874
基本的に省略やシンタックスシュガーには頼らない
もちろん程度にもよるが

例えばC#なんかでは、デフォルトプロパティの省略は許されない
VBAでいうところの値である .Value プロパティなどがメジャーな例

完全な書き捨てでない限り「解っていても書く」のが鉄則だと思う

877 :854:2011/11/26(土) 00:03:47.77
Rangeが単に範囲を示しているだけ、というのも、左辺によって挙動を変えているだけ、というのも違和感があります。

Dim r1 as Range, r2 as Range, r3 as Range
Set r1 = Sheet1.Cells
Set r2 = Sheet1.Columns
Set r3 = Sheet1.Rows
としたとき、
r1とr2とr3は同じ範囲だけれども、
r1.Countとr2.Countとr3.Countは違う数字だし、(r1.Countは2007ではオーバーフローする)
r1(1)とr2(1)とr3(1)の範囲も全部違う。

結果「Rangeとは、Rangeのコレクションである」としか言いようがないことになる気が。

まあもう質問じゃなくなっちゃってますが。でもこの辺の理解があやふやでよくこれまであちこちにコード書いたもんだと思ってしまいます……


878 :デフォルトの名無しさん:2011/11/26(土) 00:23:29.52
>>876
よっしゃわかりました。
省略はしないようにします。
ということは、Sub Test()もやめたほうがよくて、Public Sub Test()のほうが良いってことね?

ところでシンタックスシュガーとはどういう意味か教えてくれたまえ

879 :デフォルトの名無しさん:2011/11/26(土) 00:25:45.18
糖衣構文

880 :デフォルトの名無しさん:2011/11/26(土) 00:43:23.05
深い関税の砂糖

881 :デフォルトの名無しさん:2011/11/26(土) 00:49:40.20
>>877
Rangeが単に範囲を示しているだけ、ってのは間違ってる
>Excel 開発者用リファレンス
>Range オブジェクト
>セル、行、列、1 つ以上のセル範囲を含む選択範囲、または 3-D 範囲を表します。
これ以上でもこれ以下でもないんだが、セル範囲はより狭いセル範囲の集まりだと考えることができるから
「Rangeとは、Rangeのコレクションである」という考えかたは間違ってない
(厳密な言葉の使い方で言えばコレクションではないだろうが)
CellsプロパティとColumnsプロパティとRowsプロパティはそれぞれ返してるものは違う
Columnsプロパティ=列の集合 Rowsプロパティ=行の集合 この場合はシートの全部の行、列
だから、それぞれのRangeのCountは列の最大数と行の最大数を返してる
結果として帰ってきたセル範囲は同じだけどな

左辺によって挙動を変えているだけ、ってのもちょっと違う
式によって、代入/参照されるものが違うだけ
オブジェクトそのものだったり、デフォルトプロパティだったりで、
Rangeそのものの挙動が変わってるわけじゃない
(実はRangeのデフォルトプロパティはちょっとややこしくて、挙動を変えてるってのもあながち間違いではないとも言えるが)

882 :デフォルトの名無しさん:2011/11/26(土) 00:50:19.90
シンタックスシュガーとデフォルトプロパティは別の概念だから混同しないよう注意

883 :デフォルトの名無しさん:2011/11/26(土) 00:52:01.41
>>871
valueプロパティだと
Range("A2").value = Range("A1").value
Range("A2") = Range("A1")

この2つのコードは 実用上同等ではあるけど
全く同じではなかったりする

A1 の文字数が EXCEL2000だと 256文字以上だった場合
(EXCEL2007だと たしか8203文字以上)←持っていないから間違ってるかも
前者は 正しく転記するけど
後者は #VALUE! になる

884 :デフォルトの名無しさん:2011/11/26(土) 01:18:19.26
基本的な質問かもしれないのですが、サクッと調べてもわからないので教えてください。

変数 X に例えばA1〜A20の数値の和、合計を入れたいのですが。

x = Worksheets("sheet1").Range("A1:A20")

みたいな感じの1行ぐらいの文で、そういう指定ってできるんでしょうか?
現在ループをつかって、一個ずつ足すしかわからないので
スマートにできる方法があるなら知りたいのですが。どうすればよいでしょうか?


885 :デフォルトの名無しさん:2011/11/26(土) 01:26:51.29
>>884
X = WorksheetFunction.Sum(Worksheets("Sheet1").Range("A1:A20"))

886 :デフォルトの名無しさん:2011/11/26(土) 01:39:45.27
x = evaluate("sum(A1:A20)")


887 :デフォルトの名無しさん:2011/11/26(土) 01:48:14.18
m

888 :デフォルトの名無しさん:2011/11/26(土) 01:50:23.02
>>885
ありがとうございます!助かりました!

889 :デフォルトの名無しさん:2011/11/26(土) 01:55:56.95
>>886
evaluate というメソッドでもいけるのですね。ありがとうございます。

890 :デフォルトの名無しさん:2011/11/26(土) 11:47:08.90
「仕事に役立つ ExcelVBA実用サンプルコレクション」は良本っぽいし
実際このスレで話題になってからamazonの中古で在庫が減ってるからここ見て注文したんだろう。
しかし2007年以前の本なので、Excel2003が対象なのが多いにマイナスだ。

ここで問題です。

Excel2007にも対応してて、しかも上記本のコンセプトを厳守した
サンプルコレクションが充実した本ってないでしょうか?

891 :デフォルトの名無しさん:2011/11/26(土) 12:02:22.24
こっちで聞いた方がいいよ
http://hibari.2ch.net/test/read.cgi/tech/1321768941/

892 :890:2011/11/26(土) 15:25:40.21
そっちは当てにならないよ

893 :デフォルトの名無しさん:2011/11/26(土) 17:10:37.42
そんじゃ、こっちも当てにならないから、2ch以外へ行きな

ではさようなら

894 :890:2011/11/26(土) 17:45:10.03
元気でな

895 :デフォルトの名無しさん:2011/11/26(土) 18:05:26.55
>>890
悪いけど、分からないから教えて欲しいってスタンスだったらみんな教えてくれるかも知れないけど、
謎々じゃ答えてくれる人いないんじゃないかな。

で、解答は?


896 :デフォルトの名無しさん:2011/11/26(土) 20:37:52.36
>>890
普通に買えばいいんじゃね?
2007だろーが、2010だろーが
大抵のサンプルは動くだろ。

897 :デフォルトの名無しさん:2011/11/26(土) 20:44:37.49
もう詳細は忘れたが、2003 ⇒ 2007 でグラフ周りが結構変わったような気がする。

あと、2003 のままでも動くけど、オートフィルタとかソートとかで 2007 の方が使い
易くなってたような気もする。

898 :デフォルトの名無しさん:2011/11/26(土) 23:53:11.62
Windows XP, Excel 2003です。

クラス側でユーザーフォームが閉じられたというイベントを取得する方法を探しています。
最初はWithEventsで次のようにQueryCloseイベントを取得しようと考えていたのですが、
UserForm型でWithEvents宣言をしてもQueryCloseイベントと取ることが出来ないようで困っています。
何かいい方法があれば教えて頂けませんでしょうか?

Private WithEvents FormObj As UserForm

Private Sub Class_Initialize()
Set FormObj = UserForm1
End Sub

Private Sub FormObj_QueryClose(ByRef Cancel As Boolean, ByRef CloseMode As Integer)
'イベント処理
End Sub

899 :デフォルトの名無しさん:2011/11/26(土) 23:56:25.81
それでいい
その調子でがんがれ

900 :デフォルトの名無しさん:2011/11/27(日) 03:23:04.05
>>898
おそらく、FormObjと違うインスタンスのUserForm1を表示してると思うが
そもそもUserFormにQueryCloseイベントとか無いぞ
とりあえず動くだけなら
UserFrom1に
Public Event QueryClose(Cancel As Integer, CloseMode As Integer)
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    RaiseEvent QueryClose(Cancel, CloseMode)
End Sub
Class1に
Private WithEvents FormObj As UserForm1
Private Sub Class_Initialize()
Set FormObj = New UserForm1
FormObj.Show
End Sub
Private Sub FormObj_QueryClose(ByRef Cancel As Integer, ByRef CloseMode As Integer)
MsgBox "イベント処理"
End Sub
として、ThisWorkBookあたりで
Dim a As Class1
Set a = New Class1
とかやれば、イベント処理が表示されるのは確認できる
(2007で試したので引数の型がちがってるかもしれん)

やりたいのはユーザフォームのラップクラス作りたいのか?
いろいろ考えたけど、ラップクラスつくる良いやり方が浮かばんなぁ

901 :デフォルトの名無しさん:2011/11/27(日) 07:23:31.23
「仕事に役立つ ExcelVBA実用サンプルコレクション」は
オレよく書き込みしてるから
amazonの中古本が飛ぶように売れまくりだ。
もう安い値段では売ってないな。
これからも値段は高騰しそう。

902 :デフォルトの名無しさん:2011/11/27(日) 08:01:51.87
工作員さんご苦労様です

903 :デフォルトの名無しさん:2011/11/27(日) 10:03:56.52
>>901
アレか。以前立ち読みしてワロタよ。
だって当時VBA始めて半年の俺のレベルより
本の内容というか著者のレベルが下なんだもんw

904 :デフォルトの名無しさん:2011/11/27(日) 10:13:34.54
>>903
じゃお前が本出してここで評価してもらえよ。

905 :デフォルトの名無しさん:2011/11/27(日) 11:17:36.29
逆切れカッケー (w

906 :デフォルトの名無しさん:2011/11/27(日) 11:52:35.29
スレの分野の知識が全く無くても書ける
テンプレどおりの煽りだな。


907 :デフォルトの名無しさん:2011/11/27(日) 12:10:10.93
>>906
自己分析はできるんだな。

908 :デフォルトの名無しさん:2011/11/27(日) 14:12:07.77
>>903
ExcelVBAってマイナーでニッチな言語なんだけど
半年でよくマスターレベルに達したね。
よほど集中して学習したのかな?

909 :デフォルトの名無しさん:2011/11/27(日) 14:35:29.40
>>908
>ExcelVBAってマイナーでニッチな言語なんだけど

VB6 を知らんと言うオチ?

910 :デフォルトの名無しさん:2011/11/27(日) 14:39:57.88
Amazonで500冊も本があるような言語は
マイナーでニッチとは言わないと思うよ。

911 :デフォルトの名無しさん:2011/11/27(日) 15:30:11.39
>>908
ホームラン級の馬鹿だなw

912 :デフォルトの名無しさん:2011/11/27(日) 15:30:35.57
まぁ>>903はただの煽りだけで
知識は全く披露していない訳だから、
今の所はただのうんこと言えよう。

913 :デフォルトの名無しさん:2011/11/27(日) 15:38:30.30
>>901=>>904=>>906=>>908=>>912

く ゃ し ぃ の ぅ (w

914 :デフォルトの名無しさん:2011/11/27(日) 15:51:16.62
VBAは本で勉強するより
なにか目的があって必死で時間が忘れるほどプログラミングして
トイレに行くのも忘れてて気づいたらおしっこが止まらないほどたまってて出続ける様子にびっくりするほど
集中してた、という体験が重要だと思う。

最大の問題は、そういうプログラムを組む目的がないこと。
みんなどうしてる?

915 :デフォルトの名無しさん:2011/11/27(日) 15:52:59.22
>>913
やーい
うんこうんこ

916 :デフォルトの名無しさん:2011/11/27(日) 15:53:00.14
別に目的がなきゃ何もやらなくていいじゃん

917 :デフォルトの名無しさん:2011/11/27(日) 15:53:12.86
立ってからしてる。最近は男でも座ってする人もいるらしいが。

918 :デフォルトの名無しさん:2011/11/27(日) 16:01:28.00
おれは座ってするときあるよ
気分次第で使い分け

919 :デフォルトの名無しさん:2011/11/27(日) 16:02:52.49
>>914
それ VBA に限らないと言うか、そんな体験いるか?
目的がないことについては、>>916 に同意。
でも、仕事で Excel 使ってたら、それなりにここ VBA で処理すりゃ楽ジャンと思うことがあると思うけど。

>>915
お前は一人だけど、こっちは一人じゃないんだが (w

>>917-918
何の話だよ (w

920 :デフォルトの名無しさん:2011/11/27(日) 16:03:54.55
おしっこに集中してびっくりする話じゃないの?

921 :デフォルトの名無しさん:2011/11/27(日) 16:06:49.94
>>914
目的は目的。
本を読んだり、人に聞いたり、ネットで調べたり、ヘルプを見たりと言うのは
目的を果たす為の手段であって、手段が無ければ目的は達成されない。
だからどっちが大事とか混同している時点で話がおかしい事に気付かないとな。

922 :デフォルトの名無しさん:2011/11/27(日) 16:11:35.73
>>919
お前はうんこなんだからうんこらしくブリブリ言ってりゃいいんだよw

923 :デフォルトの名無しさん:2011/11/27(日) 16:25:24.70
>>919
別にVBAに限らずに、こうしたほうがいいじゃんって思うことよくあるよね。
Excelや、IMEとかの基本機能だけでも簡単にできることをわざわざ手間のかかる方法でやってる人は多い。

彼らはショートカットキーとかを知らない。調べようとしない。
そもそも効率よくやろうとする意思すらない。とりあえず今のままでもできるからいい
と思ってる。

924 :デフォルトの名無しさん:2011/11/27(日) 16:29:42.89
>>923

>彼らはショートカットキーとかを知らない。調べようとしない。

そして、数年後リストラくらって会社のせいにするのだ


925 :デフォルトの名無しさん:2011/11/27(日) 16:32:59.27
>>923
まあ、知らないと簡単にできると言うことに気づけないからなぁ。

俺も、その業界に人に聞くとこうやれば簡単ジャンと言われることあるから、
人のことは言えないと思う。

926 :デフォルトの名無しさん:2011/11/27(日) 16:41:49.51
デリートキーでカーソルの右側消せるとか
HomeやEndキーとか使わないで、いちいちチマチマカーソル動かして
バックスペースキーで1文字ずつ削除を3年以上繰り返してたバカなら知ってる。

927 :デフォルトの名無しさん:2011/11/27(日) 16:46:54.64
デリートキーでどうやってカーソルの右側消せるの?

928 :デフォルトの名無しさん:2011/11/27(日) 16:53:19.90
そもそも、VBA長くやってて少しでもそう言う考えしてる奴は
旧態依然とした構造化言語のVBAだけしかやっていないと言うことはまず無い。
とっくにObject指向の言語や関数形言語の勉強に入っているだろうよ。
必要があってExcelのVBAやVB6.0をやる事はあっても、もっとリファクタリングや単体テストの作成などが出来る
効率化が図れる言語に行ってしまうよな。

929 :デフォルトの名無しさん:2011/11/27(日) 17:16:11.52
>>928
だよねー
>>903なんかとくに
クラスってなあに?とか言い出しそうで怖いw

930 :デフォルトの名無しさん:2011/11/27(日) 17:30:55.08
>>927
どうやってって、普通に abc|def ってなってる状態で Delete キー押せば、abc|ef ってなると思うが。

まあ、上書きモードならカーソル位置の文字が消えるけど。

>>928
また、オブジェクト厨かよ。

931 :デフォルトの名無しさん:2011/11/27(日) 17:40:45.46
>>930
クラスもそれを使って作るインスタンス(オブジェクト)も
普通にVBAやVB6にあるけど何か問題でも?w
便利なものは必要に応じて使うんじゃ無かったのかなあwうんこくんw

932 :デフォルトの名無しさん:2011/11/27(日) 17:59:43.35
まぁ継承が使えないから普通に使えるとまでにはいかないけどな。
しかしInterfaceを使えるからポリモーフィズムは使える。便利。
ショートカットも大事だけど、プログラマならもっと
プログラムの基本的なことにも目を向けないとな。

933 :デフォルトの名無しさん:2011/11/27(日) 18:00:27.71
プログラムの基本的なことってどういうこと?
クラスとか継承?

934 :デフォルトの名無しさん:2011/11/27(日) 18:11:04.17
>>931
中途半端なクラスでオブジェクト指向とか笑うところ?
まあ、中途半端なオブジェクト指向厨にはお似合いかな。(w


>>933
> プログラムの基本的なことってどういうこと?

まず、素直に書くことかな。

935 :デフォルトの名無しさん:2011/11/27(日) 18:12:00.97
その辺の事が分からなければスコープもどんな時にどんなエリアにプログラムや
変数が格納されるのかも分からないだろ?
使わなくても作ることは出来ても、実際分かって作ってるのとは大違いなくらい基本的なことの一つだと思うよ。
そこを意識して作れなければObject指向の言語には移れないくらいにね。

936 :デフォルトの名無しさん:2011/11/27(日) 18:27:47.71
>>934
もう話してて抽象的なことしか言えないのを見てれば
如何に君が井の中の蛙なのかよく分かるよ。
どのモジュールをクラス化してインスタンスをヒープエリアに配置するか、それともシングルトンにしてスタティックエリアに配置するかだけでも考える事が出来れば
全然見える世界が変わってくると言うのに。
新しいことを取り入れられないのは非常に残念なことだね。

937 :デフォルトの名無しさん:2011/11/27(日) 18:36:02.65
ああ、俺に対する発言じゃなかったのか。
でもVBAやVB6にも十分使えるクラスがあるわけだから、
便利なものを使っていく気があるなら使わない手はないと思うよ。

938 :デフォルトの名無しさん:2011/11/27(日) 18:40:02.64
>>936
>もう話してて抽象的なことしか言えないのを見てれば

オブジェクト指向の会話で抽象について言うなとか、ギャグですか?(w

> どのモジュールをクラス化してインスタンスをヒープエリアに配置するか、
> それともシングルトンにしてスタティックエリアに配置するか

精一杯背伸びした文章がバレバレですよ。

>>937
適材適所でいいんだけど VBA だとどうしてもストレス溜まるから、クラス
使っていろいろやるなら、C# から Excel 使う方が楽だと思う今日この頃。
VBA だと構成管理がやりにくいしね。

939 :デフォルトの名無しさん:2011/11/27(日) 18:45:15.08
>>934
中途半端なことも分からない奴が
半年で電話帳みたいな厚みがある本よりレベルが高いとかw
自分のいうレベルの高い(笑)コード書いてみてくれよw

940 :デフォルトの名無しさん:2011/11/27(日) 18:54:24.54
>>938
そこで言ってる抽象的なことと抽象クラスの区別すら付かないのか・・・。
C#だってObject指向な上に関数型言語の知識が無ければ使えないだろうに・・・。
せめてGenericやLinqの利便性を説明してから奨めてやればいいのに・・・

あ、知らないのか。

941 :sage:2011/11/27(日) 19:20:01.35
>>940
ですよねー。
そのへんの事が分かってないと
C#どころか今のVBですら
へなちょこなコードしか書けないですよねー。
>>938は早く自分が言うところのレベルの高いコード
挙げてくれないかなー。

942 :デフォルトの名無しさん:2011/11/27(日) 19:27:41.98
>>939
何を勘違いしてるのか知らんが、俺は >>903 じゃないぞ。
厚みで勝負するような本にも興味がないしな。(w

>>940
> そこで言ってる抽象的なことと抽象クラスの区別すら付かないのか・・・。

冗談も分からんのか…。

あと、C# のどこに関数型言語の知識が要るのか教えてくれるかな。

ついでに Generic は、いざ知らず Linq の評判の悪さも知らないのか?

>>941
レベルの高いコード?
ひょっとして素人さんかな。
俺は、素直なコードがいいって書いてるんだが。

943 :sage:2011/11/27(日) 19:37:06.04
>あと、C# のどこに関数型言語の知識が要るのか教えてくれるかな。

・・・もう前のレスで話挙げてるんだけどな・・・
それすら気付かなかった?

>ついでに Generic は、いざ知らず Linq の評判の悪さも知らないのか?

LinqToSQLが遅いから全部のLinqが評判悪いとか言ってるとは到底思えないしな・・・

知らない。ぜひ教えてくれ。


944 :sage:2011/11/27(日) 19:40:38.90
>>942
しらばっくれちゃったようんこくんw
ごまかさなくていいから早くレベルの高いコード挙げてみろよwww

945 :898:2011/11/27(日) 19:45:15.80
>>900
助かりました!なるほど、そういう方法があったんですね。
ラッパークラスの意味はあまり知らないのですが、
やりたかったことはというとフォームの表示やイベント処理は
基本的にクラス側のみで処理させたかったという感じです。

946 :デフォルトの名無しさん:2011/11/27(日) 19:59:47.82
>>943
>・・・もう前のレスで話挙げてるんだけどな・・・

具体的に書けないということでいい?

>LinqToSQLが遅いから全部のLinqが評判悪いとか言ってるとは到底思えないしな・・・

http://hibari.2ch.net/test/read.cgi/tech/1316703574/813-

947 :sage:2011/11/27(日) 20:07:02.55
>>946

>具体的に書けないということでいい?

は?自分でも話に挙げてるのにまだ気付かないの?

で、2ちゃんのスレ貼って何がしたいの?
「ソースは2ちゃん」って言いたかったの?

948 :デフォルトの名無しさん:2011/11/27(日) 20:12:44.22
「ソースは2ちゃん」(キリッ

wwwwwwwwwwwww

949 :デフォルトの名無しさん:2011/11/27(日) 20:14:14.48
>>947
>は?自分でも話に挙げてるのにまだ気付かないの?

御託はいいから、具体的に書いてくれ。

>「ソースは2ちゃん」って言いたかったの?

読んできた? ソースどうのこうのの前に、内容読もうよ。

821: デフォルトの名無しさんsage2011/11/27(日) 13:19:41.91
クエリ式は中途半端にメソッドが混じるから止めた方がいいと思うんだよねえ
中途半端に似てるせいで違いに戸惑うことの方が多いと思うんだけど

828: デフォルトの名無しさんsage2011/11/27(日) 14:00:20.04
ILとの直交性がないからなぁ。ふつう使わないだろ。

まずは、ここら辺から理解しようね。

950 :デフォルトの名無しさん:2011/11/27(日) 20:18:37.54
「数字が文字列として保存されてます」のセルを
強制的に数値にしてしまうためのVBAコードは
どう書きますか?

951 :デフォルトの名無しさん:2011/11/27(日) 20:18:58.72
>>942
Linqに文句いう奴は.Net 2.0で成長停止した奴がほとんどだろw
理解出来てる奴はパフォーマンスの問題起こすこともなく使いこなしてるぞ
篭ってないだもっと外にでろ

952 :デフォルトの名無しさん:2011/11/27(日) 20:21:41.75
VBA完全に置いてきぼりだな。

953 :デフォルトの名無しさん:2011/11/27(日) 20:29:01.06
ExcelをC#で弄れるようにしないMSが悪いんだな

954 :sage:2011/11/27(日) 20:29:19.84
>>949

ねぇ、今までさんざ言ってたLinqとかObject指向のものだと思ってたの?バカ?
それに纏わるラムダ式や反復子、拡張メソッドや匿名型なんか全部関数型言語のものだよ。

>821: デフォルトの名無しさんsage2011/11/27(日) 13:19:41.91
>クエリ式は中途半端にメソッドが混じるから止めた方がいいと思うんだよねえ
>中途半端に似てるせいで違いに戸惑うことの方が多いと思うんだけど

>828: デフォルトの名無しさんsage2011/11/27(日) 14:00:20.04
>ILとの直交性がないからなぁ。ふつう使わないだろ。

そう思うなら使わなきゃいいじゃん。
そんな事差し引いても色んなクラスにクエリを投げられる事の方が
よっぽど便利だとおもうけどね。

IL?どこぞからコピって来て偉そうに理解しろとか言ってるけど、それが本当に何だか知ってるの?
じゃあちょっとILでコード書いてみなよ。

6502系のアセンブラやってた俺ですらまだそんなに理解していないのに。
軽く「理解しようね」とか言うほど知識持ち合わせているなら、
軽くちゃちゃって書いてみせてよ。


955 :デフォルトの名無しさん:2011/11/27(日) 20:31:30.85
>>954
> ねえ
> みせてよ
まで読んだ。このスケベめ

956 :デフォルトの名無しさん:2011/11/27(日) 20:36:56.92
>>955
過程はともかくスケベは当たりだ。
エスパーか?

957 :デフォルトの名無しさん:2011/11/27(日) 21:01:08.88
>>950
環境手近にないから、ミスってるかもしれない。

With Cells(1,1): .Value = CDbl(.Value): End With

>>954
>それに纏わるラムダ式や反復子、拡張メソッドや匿名型なんか全部関数型言語のものだよ。

で、それ使わないと C# 書けないの?

>そう思うなら使わなきゃいいじゃん。

うん、だから使ってないよ。
C# では、そんなたいしたことやってないからね。

>じゃあちょっとILでコード書いてみなよ。

今時中間コード書けって? 遠慮しとくよ。
そもそも、あのスレの 828 みて、IL 書くという発想がわけわからん。

958 :デフォルトの名無しさん:2011/11/27(日) 21:01:44.59
C#からでも使えるがな

959 :デフォルトの名無しさん:2011/11/27(日) 21:15:05.31
C#のラムダ式って関数型言語だったのか

func1 += (x=>x*x)

みたいなやつだよね

960 :デフォルトの名無しさん:2011/11/27(日) 21:16:47.35
らむだこりゃ

961 :sage:2011/11/27(日) 21:16:55.26
>で、それ使わないと C# 書けないの?

はぁ?

>あと、C# のどこに関数型言語の知識が要るのか教えてくれるかな。

って聞いたから答えただけだろ?
それに最新のWindowsPhoneの開発環境なんかじゃこれとO/Rマッピングの
知識がなきゃ書けねーよ。

>今時中間コード書けって? 遠慮しとくよ。
>そもそも、あのスレの 828 みて、IL 書くという発想がわけわからん。

なら知ったかぶるのは止めとけ。ILはダンプである中間コードを
アセンブラ形式に直したものであって、中間コードそのものではないしな。

962 :デフォルトの名無しさん:2011/11/27(日) 21:19:09.23
VBA「私とC#、どっちが大切なの!?」

963 :デフォルトの名無しさん:2011/11/27(日) 21:21:35.85

あのさ、関係ない話ならスレ立てて、そっちでやってくんない?

964 :デフォルトの名無しさん:2011/11/27(日) 21:22:57.34
プログラムに興味ある人ってこんなひとばかり?

はぁ?
・・・答えただけだろ?
・・書けねーよ。
知ったかぶるのはやめとけ。
・・・ではないしな。

なんかPC初心者が集まるBBS見てるみたい。

965 :デフォルトの名無しさん:2011/11/27(日) 21:23:32.24
λやIL語りたい方はこちらへどうぞ

C#, C♯, C#相談室 Part68
http://hibari.2ch.net/test/read.cgi/tech/1316703574/

966 :デフォルトの名無しさん:2011/11/27(日) 21:28:38.56
>>961
>>あと、C# のどこに関数型言語の知識が要るのか教えてくれるかな。
>って聞いたから答えただけだろ?

自分が書いたことぐらい覚えておけよ。

>> >>940
>> C#だってObject指向な上に関数型言語の知識が無ければ使えないだろうに・・・。


>なら知ったかぶるのは止めとけ。ILはダンプである中間コードを
>アセンブラ形式に直したものであって、中間コードそのものではないしな。

今時こんなこと言う奴がいるとは…、まあそこしか突っ込めないんだろうな。(w

>>962
断然 C# 、早く C# for Application を作ってくれ ⇒ Microsoft

967 :デフォルトの名無しさん:2011/11/27(日) 21:32:49.84
そうだよ!
もともとうんこくんが
ここで紹介された本を
半年しかやってない自分より
レベルが低くてワロタwとかー、
知りもしないC#を人にすすめたりして
へんな話になったんだよ!
普通にVBAのクラスの話だったのに!

968 :sage:2011/11/27(日) 21:47:18.14
>自分が書いたことぐらい覚えておけよ。
> >>940
> C#だってObject指向な上に関数型言語の知識が無ければ使えないだろうに・・・。

ああ、書いたよ。それで聞いて来たのはお前だ。

>あと、C# のどこに関数型言語の知識が要るのか教えてくれるかな。

なんでC#やっててそんなこと聞いてきたのかはもう言わなくてもいい。
知らなかっただけみたいだからな。

>今時こんなこと言う奴がいるとは…、まあそこしか突っ込めないんだろうな。(w

今時も昔も関係ないな。そんな事すら知らないのによく恥ずかしげもなく
知ったかぶってレス付けられたものだ。

>ILとの直交性がないからなぁ。ふつう使わないだろ。

>まずは、ここら辺から理解しようね。

お前が理解するのが先じゃないのか?ILとの直交性ってなんだ?


969 :デフォルトの名無しさん:2011/11/27(日) 21:47:57.22
Excel(笑)

970 :デフォルトの名無しさん:2011/11/27(日) 21:48:59.57
>>962
決まってるじゃないか

971 :デフォルトの名無しさん:2011/11/27(日) 21:49:43.77
VBA(泣笑)

972 :デフォルトの名無しさん:2011/11/27(日) 21:51:16.49
>>967
まぁそうだな。うんこくんって呼び方はともかく、VBAに話を戻そう。

973 :デフォルトの名無しさん:2011/11/27(日) 21:54:34.12
>>968
>> C#だってObject指向な上に関数型言語の知識が無ければ使えないだろうに・・・。
>ああ、書いたよ。それで聞いて来たのはお前だ。
>>あと、C# のどこに関数型言語の知識が要るのか教えてくれるかな。
>なんでC#やっててそんなこと聞いてきたのかはもう言わなくてもいい。
>知らなかっただけみたいだからな。

で?
「関数型言語の知識が無ければ使えない」はどうなったんだ?
知らないから教えてくれよ。(w

>お前が理解するのが先じゃないのか?ILとの直交性ってなんだ?

IL の説明が要るの? それとも、直行性が分からんのか?

974 :デフォルトの名無しさん:2011/11/27(日) 21:57:32.40
VBA「らむだこりゃ」

975 :sage:2011/11/27(日) 21:58:54.96
うんこくんが流れを読まずにまたC#のネタでキター。
凄い粘着性だね。
うんこなだけに。

976 :デフォルトの名無しさん:2011/11/27(日) 21:59:36.97
まぁVBAもC#もMicrosoftが作ったもんだからね

977 :デフォルトの名無しさん:2011/11/27(日) 22:01:49.75
> ILとの直交性
ここ笑うとこ?

978 :sage:2011/11/27(日) 22:04:25.79
たしかに、いい加減流れを読んで欲しいな。

>で?
>「関数型言語の知識が無ければ使えない」はどうなったんだ?
>知らないから教えてくれよ。(w

またか・・・少しは前のレス読めよ。ここまで健忘症だと
いい加減相手にするの馬鹿らしくなってくるぞ。

>IL の説明が要るの? それとも、直行性が分からんのか?

あのさぁ・・・・「ILとの直交性」って自分でコピって来たんだろ?
普通に日本語通りでいいよ。

って言うかVBAの会話に戻そうって気が全くないんだな、お前。

979 :デフォルトの名無しさん:2011/11/27(日) 22:12:19.49
>>978
>またか・・・少しは前のレス読めよ。ここまで健忘症だと
>いい加減相手にするの馬鹿らしくなってくるぞ。

はい、お約束のループですな。
まあ、どうせ具体的に書けないから、こういう結果になると思ってたけどね。

>あのさぁ・・・・「ILとの直交性」って自分でコピって来たんだろ?
>普通に日本語通りでいいよ。

って書いて、

>って言うかVBAの会話に戻そうって気が全くないんだな、お前。

って...、ひょっとして馬鹿なの?

980 :デフォルトの名無しさん:2011/11/27(日) 22:20:06.09
話をさえぎってすみません。
10000個の○と×を並べて、最も連続した回数の多い場所を
調べるためには、どのようなプログラムを組めばよろしいですか?
並べるほうのプログラムは組めたのですが、回数の多い場所を調べるプログラミングは
どのメソッドを使えば良いかからわかりません。
回答よろしくお願いします。

981 :デフォルトの名無しさん:2011/11/27(日) 22:21:25.23
>>979
お約束のループって、さっきお前の無知で何度も人に聞いてたアレか?
自分の無知を棚に上げてよくまぁそんな事が言えたもんだ。
で、今度は健忘症を棚に上げるのか?
いい加減にしろ。なんで俺がそんな健忘症の尻拭きしなければならないんだ。
俺は馬鹿かも知れないが、お前は空気が読めない痴れ者だな。

982 :デフォルトの名無しさん:2011/11/27(日) 22:23:09.06
>>945
>フォームの表示やイベント処理は
>基本的にクラス側のみで処理
その考え方は間違いではないが、EXCELのユーザフォームには不向きかもしれん
理由はいろいろあるが、VBAのクラスの扱いがいまいちってのが大きい
汎用的な管理クラスじゃないなら>>900みたいな感じで行けるかもしれんが
それならそもそもUserForm1がクラスだからそこにコード書けばいいし

983 :デフォルトの名無しさん:2011/11/27(日) 22:28:15.62
>>980
次スレ立ててくれたら答えるよ

984 :デフォルトの名無しさん:2011/11/27(日) 22:38:31.52
>>980
地道にやるしかないんじゃない?
Dim 最大連続回数 As Integer
最大連続回数 = 0
Dim 現在の値 As String
現在の値 = Cells(1,1).Value
Dim 連続回数 As Integer
連続回数 = 1
Dim 開始行 As Integer
開始行 = 1
Dim 最大連続開始行 As Integer
Dim 行 As Integer
For 行 = 2 To 10000
 If Cells(行,1).Value = 現在の値 Then
  連続回数 = 連続回数 + 1
 Else
  If 最大連続回数 < 連続回数 Then
   最大連続回数 = 連続回数
   最大連続開始行 = 開始行
  End If
  現在の値 = Cells(行,1).Value
  連続回数 = 1
  開始行 = 行
 End If
Next
If 最大連続回数 < 連続回数 Then
 最大連続開始行 = 開始行
End If
Debug.Print 最大連続開始行

985 :デフォルトの名無しさん:2011/11/27(日) 22:41:48.47
>>981
>お約束のループって、さっきお前の無知で何度も人に聞いてたアレか?
>自分の無知を棚に上げてよくまぁそんな事が言えたもんだ。
>で、今度は健忘症を棚に上げるのか?
>いい加減にしろ。なんで俺がそんな健忘症の尻拭きしなければならないんだ。
>俺は馬鹿かも知れないが、お前は空気が読めない痴れ者だな。

はいはい、一生懸命なところ悪いけど、結局具体的には何も書けないんだよね。
健忘症とか言うなら、そのレス番からコピペするだけなのにねぇ。(w

986 :デフォルトの名無しさん:2011/11/27(日) 22:45:17.29
。o O(このままいけば、、「ILとの直行性」をうやむやにできる!)

987 :デフォルトの名無しさん:2011/11/27(日) 22:47:11.50
>>985
>>961

死ねよ健忘症

988 :980:2011/11/27(日) 22:47:15.91
>>984
ありがとうございます。
やっぱりそういう方法しかありませんかね><
せっかくなんで何か勉強してみようと思いましたが、あきらめます。

989 :デフォルトの名無しさん:2011/11/27(日) 22:49:14.39
もともとそれは勉強とはいわない

990 :デフォルトの名無しさん:2011/11/27(日) 22:50:02.19
>>986
GJ

991 :980:2011/11/27(日) 22:53:12.69
>>989
もし何か知らないメソッドがあったら使ってみたかったんです。
まだ半年も触ってないので、使った事がないメソッドもいくつかあります。
たしかに、人に聞いてる時点でだめなのかもしれないですが><

992 :デフォルトの名無しさん:2011/11/27(日) 22:58:05.56
>>991
Cellsをkey、連続回数をvalueとしてハッシュマップに持ち、
valueでソートして該当のkeyのCellsから位置を知る。

993 :デフォルトの名無しさん:2011/11/27(日) 22:58:40.53
>>980
A列に縦に並んでるとしたら

Dim maxval As Long

With Worksheets("sheet1")
For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
If .Cells(i, 1) = .Cells(i - 1, 1) Then
.Cells(i, 2) = .Cells(i - 1, 2) + 1
Else
.Cells(i, 2) = 1
End If
Next i

maxval = Application.WorksheetFunction.max(Columns(2))
MsgBox .Columns(2).Find(maxval).offset(-maxval+1,-1).resize(maxval,1).Address
End With

でどうだろう

994 :デフォルトの名無しさん:2011/11/27(日) 23:05:14.97
>>986=>>990
向こうのスレ見ればわかると思うけど、なかなか説明が面倒なんだよね。

>>987
で、どこなの?
まさか、WindowsPhone でごまかせるとか思ってるの?

>>991
VBA のヘルプで、いろんなオブジェクトのメソッドとプロパティを眺めてると
発見があるかもね。

995 :980:2011/11/27(日) 23:05:20.27
>>993
まさに自分のイメージとぴったりでした。
ヒントどころか解答例ありがとうございます。

>>992
ちょっと組んでみようと思います。
ありがとうございます。

996 :デフォルトの名無しさん:2011/11/27(日) 23:09:08.24
うわぁ。うんこくん、さらっと粘着してるね。
じゃ、次スレは「IL との直交性」から語ってみようねw

997 :デフォルトの名無しさん:2011/11/27(日) 23:11:53.66
>>994
煽りとかじゃなく、ILとの直行性、何を言わんとしてるか知りたい
誰かそのスレに誘導してくれ

998 :デフォルトの名無しさん:2011/11/27(日) 23:15:28.30
>>994
はぁ?
WindowsphoneがC#やVBで出来ていないとでも思ってるの?
そもそもLinqとか使わなければ別にJavaとかでもいい訳だし、
じゃあ何を根拠にC#とか奨めてるの?
それと、さっさと「IL との直交性」についても答えてよ。皆期待しているよ。

999 :デフォルトの名無しさん:2011/11/27(日) 23:15:58.26
埋め

1000 :デフォルトの名無しさん:2011/11/27(日) 23:16:42.18
1000ならILとの直交性!!

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

296 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)