Excel VBA 質問スレ Part20

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
2デフォルトの名無しさん:2011/08/04(木) 14:31:25.82
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 忍法帖【Lv=2,xxxP】 【東電 78.9 %】 :2011/08/04(木) 18:20:10.09
>1-2 乙
4デフォルトの名無しさん:2011/08/04(木) 21:56:17.18
いきなりの質問ですが
例えば列を20列目までデータを入力した後
データを全て消しても、UsedRange.Rows.Counで最後の列を取得すると
20列目が選択されてしまいます。
これを解消するには何か手段はあるのでしょうか?
よろしくお願いします。
5デフォルトの名無しさん:2011/08/04(木) 22:11:49.66
workbookをたくさん扱うVBAを書いてるんですが、
workbookのブックナンバー(シートでも出てくるindexと呼ばれるヤツ)を取得するにはどうすればいいんですか?
エラーが出るばかりでエラいことになってるんですが・・・
6デフォルトの名無しさん:2011/08/04(木) 22:15:20.68
cells(x,y)やrange("A1")を扱うとき、その直後に .value は省略できないんですか?
いままで .value となるべきところではずっと省略して書いてきたんですが
たったいま初めて .valueを書かないと正常に実行されない現象を確認しました。
7デフォルトの名無しさん:2011/08/04(木) 22:30:50.81
>>4
UsedRangeを使わなければいい。

>>5
Index使わないとダメ?For eachで何とかならない?

>>6
外すな。付けとけ。
84=5=6:2011/08/04(木) 22:44:53.39
>>7
じゃどうすればよい?

>>7
うんIndexを使いたい

>>7
わかった。でも省略できる条件とかある?
9デフォルトの名無しさん:2011/08/04(木) 22:45:56.72
EXCEL2003 XP32bitSP3の環境です。

VBAからwindowsのAPIを使いたいと思って、調べた結果
VBAから直接呼び出せないAPIはDLLを作って呼び出す方法が
有るのは見つけたのですが、最終的にDLLになるんだからDLL作成
言語は何でもいいという認識で良いですか?
10デフォルトの名無しさん:2011/08/04(木) 23:42:25.91
>>4
1回保存したら行ける気がする
しかし、いま2007で確認したら、ちゃんと消した後の範囲返したぞ
>>5
WorkBooksに使うインデックスなら、名前でも行けるからブック名使っとけ
>>5
Rangeのデフォルトプロパティは実はValueではないからValueを期待した省略はやめとけ

>>9
そのAPIが呼び出せて、VBAから呼び出し可能なDLLが作れればなんでも良いんじゃね
11デフォルトの名無しさん:2011/08/05(金) 02:54:06.12
>>5
>>10 の意見に賛成だけど

どうしてもIndex取得したければ自前で作るしかない
でも Index だと 途中でブックをクローズしたりすると
それ以降のIndexが ずれるけどいいの?

まあ下記とかで取得するしかないような

Sub TEST()
 WBNO = BookNo("BOOK2.XLS")
 Debug.Print WBNO, Workbooks(WBNO).Name
End Sub

Function BookNo(WBNAME)
 'ブックが存在していない場合 0 を返す
 Dim No As Integer
 Dim Wb As Workbook
 BookNo = 0
 No = 0
 For Each Wb In Workbooks
  No = No + 1
  If LCase(Wb.Name) = LCase(WBNAME) Then
    BookNo = No
    Exit For
  End If
 Next
End Function
12デフォルトの名無しさん:2011/08/05(金) 10:27:36.52
しかし、何でBookのIndexなんか欲しがるんだろうな。
何をやりたいのかよく分からん。

>>11
そのコードが実行される時、アプリケーション内にブックが存在しないケースなんて有るの?
1311:2011/08/05(金) 10:43:58.78
>>12

たぶんコメントの事をいってるのだと思うけど
プロシージャ BookNoは ※文字列※としての"ブック名"を引数として必要としてるが

Callする際に存在していない(又は無効な)ブック名を指定する事はいくらでも可能なわけだが
14デフォルトの名無しさん:2011/08/05(金) 11:50:21.97
そもそもIndexで管理したいというのが間違い
15デフォルトの名無しさん:2011/08/05(金) 15:33:17.88
>>13
ああ、なるほどね。
済まんかった。
16デフォルトの名無しさん:2011/08/05(金) 21:08:35.58
画面上にコマンドボタンを表示して
押せばVBAが実行されるようになっていますが
画面を下へスクロールさせるとボタンだけが取り残されてしまい
現時点では手動でボタンの移動を行っています。
これをどうにかして画面をスクロールさせた場合でも
同じ位置に表示させることは可能でしょうか?
17デフォルトの名無しさん:2011/08/05(金) 21:10:56.66
【原発問題】汚染水処理システム、パソコンのフリーズで稼働停止 パソコン再起動で完全復旧[08/05]
http://raicho.2ch.net/test/read.cgi/newsplus/1312544716/
18デフォルトの名無しさん:2011/08/05(金) 21:21:19.27
>>16
VBAとは関係ないけど
"ウインドウ枠の固定"をしておいてスクロールしないエリアへ
コマンドボタンを配置じゃダメなの?
19デフォルトの名無しさん:2011/08/06(土) 11:28:15.73
IEで表示したサイトをコピーして、エクセルシートに貼り付ける処理を行っています。
今まで順調に利用できていたのですが、つい先日から

、「このページを使用して、クリップボードから情報を貼り付けますか?」

というダイアログボックスが表示されるようになってしまいました。
環境は

エクセル2003
IE6 SP3
WinXP

です。

スクリプトによる貼り付けの許可は有効にしてあります。
どのような対処をすればよいでしょうか。
20デフォルトの名無しさん:2011/08/06(土) 11:54:32.37
コピーじゃなくてinnerText使えばいいんじゃね?
21デフォルトの名無しさん:2011/08/06(土) 12:05:12.28
>>19
ちょっとくぐってみたけど
そのメッセージは、IEからでてない?
Excel vba 関係ないような

スレチ じゃね
22デフォルトの名無しさん:2011/08/06(土) 21:54:06.01
publicな変数でもそれは同じブック内に限り
どんなモジュールからでも参照できるということで
他のブックからは参照できないという認識であってますか?

もしそうならブック間でも共通に使えるような変数ってどうにか作れないのだろうか?
23デフォルトの名無しさん:2011/08/06(土) 21:59:13.20
>>12
わたしがBookのIndexが欲しいと言ってるから使いたいのだ。
きみがSheetのIndexの使用をわたしに禁止されたら困るだろ?
24デフォルトの名無しさん:2011/08/06(土) 22:10:28.24
VBAに限らず、CやJava含めたプログラミングにあたり、
変数は、値渡し、参照渡し、矢切りの渡し、
どれをメインに使っていくのが得策でしょうか?
25デフォルトの名無しさん:2011/08/06(土) 22:11:27.24
>>22
セルに書いておけば良いじゃん
26デフォルトの名無しさん:2011/08/06(土) 22:15:32.32
>>25
シートを汚したくないの
27デフォルトの名無しさん:2011/08/06(土) 22:17:16.84
>>22
その考え方で合ってると思います。
が、
そもそも、複数モジュール間のやりとりをPublicな変数で行うのは如何なものかと思います。
プロパティであれメソッドであれ、セッタやゲッタを作ってやりとりすれば
モジュール間であれBOOK間であれ、
特に深く考える必要も無くて宜しいんじゃないでしょうか。
28デフォルトの名無しさん:2011/08/06(土) 22:22:58.97
>>27
ありがとうございます。
セッタやゲッタのことについて勉強して出直してきます。
29デフォルトの名無しさん:2011/08/06(土) 22:26:07.05
VBAを勉強するにも結局はいろいろいじらないと覚えないけで
本だけじゃ使いこなすスキルにおいて身に付きません。
Excelのシート関数も同様で、結局は他人の作った関数がいっぱいあるシートをたくさん見ているときがかなり上達した気がしました。

VBAでも誰かが作ったコードを大量に見れるようなサイトはないですか?
30デフォルトの名無しさん:2011/08/06(土) 22:31:28.63
シートモジュールじゃなく標準モジュールに

Sub worksheet_change(ByVal a As Range)
MsgBox "うんこ"
End Sub

と書いたら反応しないのはぜですか?

また、シートモジュールに書いても別シートだと反応しないのはなぜですか?(Private Subじゃないのに)
31デフォルトの名無しさん:2011/08/06(土) 22:34:31.73
>>30
釣り?
3230:2011/08/06(土) 22:43:27.11
釣れた(笑)
3330:2011/08/06(土) 22:43:53.13
冗談はさておき、

シートモジュールじゃなく標準モジュールに
 Sub worksheet_change(ByVal a As Range)
 MsgBox "うんこ"
 End Sub
と書いたら反応しないのはぜですか?
また、シートモジュールに書いても別シートだと反応しないのはなぜですか?(Private Subじゃないのに)
34デフォルトの名無しさん:2011/08/06(土) 22:50:29.28
>>33
つヘルプ
35デフォルトの名無しさん:2011/08/06(土) 23:36:03.24
>>29
VBAに限らずこう言ったものを作りたいと言った時に、
こう言った組み方をすると綺麗に実装出来るよと言う
定石的な物が有ります。
それをデザインパターンと言うのですが、
VBAには継承と言うものが無く(当然、継承が無いわけですから
オーバーロードやオーバーライドは存在しません。
しかし何故かインターフェースは有りますので、そちらでポリモーフィズムは
使えたりします。)
実際には継承の替りに委譲を使ったりしなければなりませんが、
それでも考え方として取り入れると、VBA固有のクラスに関しては
別途使い方を覚える必要はあるものの、
どういう組み方をすればいいかの参考にはなると思います。
求めているものと違うかもしれませんがご参考までに。

ttp://www.atmarkit.co.jp/fdotnet/vbcheer/vbcheer12/vbcheer12_01.html
36デフォルトの名無しさん:2011/08/07(日) 00:04:09.08
>>24
いつまでたっても馬鹿なわたし
37デフォルトの名無しさん:2011/08/07(日) 01:10:11.13
あれっVBAのフォームに、メニュー作ることってできなかったっけ?
38デフォルトの名無しさん:2011/08/07(日) 01:58:45.51
デキルヨ
39デフォルトの名無しさん:2011/08/07(日) 06:01:00.41
>>24
ドジっ娘がてんぱってわたわたし
40デフォルトの名無しさん:2011/08/07(日) 09:58:15.11
>>38
どうやるの?
41デフォルトの名無しさん:2011/08/07(日) 10:20:00.81
ここで聞いていいものか不明です。
スレ違いで有れば削除します。

VBAでGroupMaxのメール操作は出来ますでしょうか?

具体的には共有book(非ブックの共有)の勤務表等で
間違いや未記入が有る場合に対象者にお知らせメールなどを
VBAで自動的に送信したい。
Outlookが使えれば出来そうなんですが・・・・。

使用環境

Win XP SP3
Excel 2007
GropMax 6
42デフォルトの名無しさん:2011/08/07(日) 11:07:52.20
まずスレ違いだと思うよ

たが ちょっとコメントを
GroupMaxって日立のグループウェアでしょ
この手のアプリって自社開発ソフト以外の外部アプリから操作って基本出来ない(させない)って
思うけどな。(セキュリティ問題もあるし)
まあGroupMaxの開発元に聞くしかないよ
4337:2011/08/07(日) 12:07:18.00
>>38
ゎたしどうゃって作るか聞ぃてるんですけど♪
44デフォルトの名無しさん:2011/08/07(日) 14:32:16.91
モジュールの宣言セクションに書いておいた「ステートメント」は
そのモジュール内のどのプロシージャが実行されるときにその直前に必ず実行されるのでしょうか?
気になって夜も眠れません。
45デフォルトの名無しさん:2011/08/07(日) 14:35:33.45
あれっモジュールの宣言セクションに「ステートメント」って書けなかったっけ?
46デフォルトの名無しさん:2011/08/07(日) 14:36:41.67
誰か助けて。

宣言セクションって、変数を宣言することくらいしかできないの?
その変数に初期値を代入しようとしてるんだけど、そうしたらマクロ自体が実行できなくなった。
47デフォルトの名無しさん:2011/08/07(日) 15:07:21.46
あれっVBAのフォームのコントロールって、配列コントロールにすることってできないっけ?
48デフォルトの名無しさん:2011/08/07(日) 15:16:20.14
フォームを使ったマクロを終えるとき
フォームを消すための「Unload UserForm1」みたいなコマンドは
付けておいたほうがいいですか?または無くてもいいですか?

またそうするのがいいと思った考え方を教えてください。
49デフォルトの名無しさん:2011/08/07(日) 15:49:23.59
50デフォルトの名無しさん:2011/08/07(日) 16:23:07.50
>>49
ありがとうございます。
そうするとloadはshowを含み
unloadはhideを含むということですね。

つまりshowしたらload+show、
unloadしたらhide+unload
をしたことになる?みたぃな。
51デフォルトの名無しさん:2011/08/07(日) 16:29:44.74
VBなら
UserForm_Initialize()
UserForm_Load()
の2つあるのに

VBAなら
UserForm_Initialize()
の1つしかないんですね。

ついでに質問ですがVBでプログラミングしてるときに
UserForm_Initialize()とUserForm_Load()の使い分けってあるんでしょうか?
またどちらかをメインに使ったほうがいいのであればその心を教えてください。
52デフォルトの名無しさん:2011/08/07(日) 17:20:02.65
Private Sub UserForm_Terminate()
はどういうときに使うの?
53デフォルトの名無しさん:2011/08/07(日) 17:30:38.99
ユーザーフォームをターミネートする時でしょ
54デフォルトの名無しさん:2011/08/07(日) 17:46:19.32
>>53
なるほど。さっぱりわからん。Thanks.
55デフォルトの名無しさん:2011/08/07(日) 18:04:32.85
>>47
出来ないはず。おかげでイベントハンドラ書くのがしんどい。
56デフォルトの名無しさん:2011/08/07(日) 18:08:03.93
>>55
やっぱりできなかったのか。ありがとう。Thanks
57デフォルトの名無しさん:2011/08/07(日) 18:18:36.12
>>55
クラスモジュール使えば それに近い事できるけど
メンドイからその説明はしない
58デフォルトの名無しさん:2011/08/07(日) 18:30:38.51
>>51
> UserForm_Initialize()とUserForm_Load()の使い分けってあるんでしょうか?
当然ありますよ。自分はフォームを拡張するクラスを作って、WithEvents使って
クラス側でフォームのイベント処理をしているけど、InitializeにもLoadにもコードは書いてあるし
これはどちらかにまとめることも、当然ながら入れ替えることも出来ない。

> またどちらかをメインに使ったほうがいいのであれば
それは目的次第だよ。基本的に目的に合ってる方を使えば良い。
両方とも目的に合ってるなら好きな方を使えばいいし、目的に合わない物を無理して使う必要も無い。

>>47,55-56
クラスとコレクション使って、疑似コントロール配列にすれば良い。
疑似なんて言うと本来のというかVB6のコントロール配列に劣るように聞こえるかも知れないが
実は疑似コントロール配列の方が高度な処理が出来て、VB6でも標準のコントロール配列を使わず
疑似コントロール配列で実装することも多い。
59デフォルトの名無しさん:2011/08/08(月) 14:18:45.05
>>58
横レスになるけど失礼します

疑似コントロール配列の作り方というか
綺麗に実装出来る参考となる文献なりサイトってご存知ないですか?
何度か疑似コントロール配列は作った事はあるんですが

コレクションは使わず
配列にクラスオブジェクトを入れてたりしたんですが
なんか定石みたいなのって ないかなって思ってます。
60デフォルトの名無しさん:2011/08/08(月) 17:57:56.02
>>59
添字でアクセスしたいだけとか
イベントをまとめたいとか
動的に作成したいとか
目的によって実装方法は千差万別

(疑似)コントロール配列は、目的そのものではなく
目的を満たすための手段でしかないんだから定石も無いし
実装の何を以て「綺麗」とするかは人それぞれなので
君が綺麗だと思う実装方法は君にしか見つけられない

つーか、初心者は綺麗とか定石とかに拘りすぎ
綺麗に書くことが目的になっていて、その先が見えていない
全てのコードは目的を実現するための手段でしかないことを忘れるな
6159:2011/08/08(月) 18:54:37.55
>>60
ありがとうごさいます
ご意見を胸に刻み精進します。
62デフォルトの名無しさん:2011/08/08(月) 19:34:54.73

コードに「綺麗さ」を求める奴は大概トリッキーなコードを書いて後々保守する奴がそれで苦労させられるということを全く考えていない
所期の目的を達してなおかつ判りやすいというのを目標にすりゃぁいいものを

63デフォルトの名無しさん:2011/08/08(月) 22:43:33.68
vbaってマルチスレッドできない?
64デフォルトの名無しさん:2011/08/08(月) 23:02:15.51
すれ違いじゃないかという気もするけど

VBAにおけるマルチスレッド処理
http://bbs.wankuma.com/index.cgi?mode=al2&namber=47345&KLOG=80
65デフォルトの名無しさん:2011/08/09(火) 11:26:23.27
>>62
お前の「後々保守する奴がそれで苦労させられるようなトリッキーなコードが綺麗なコードである」
という認識が間違ってるとは思わないの?
66デフォルトの名無しさん:2011/08/09(火) 11:41:23.14
とりあえずみんな『ビューティフルコード』くらい読んでから綺麗とは何かを語れや
67デフォルトの名無しさん:2011/08/09(火) 13:10:06.34
OS:Windows7 x86 SP1
Office:Excel2010(14.0.6023.1000)
【コード】
With Application
.Calculation = xlCalculationManual
.ScreenUpdating = False
End With

シートの枚数分ループ---
maxRow = Worksheets(targetSheet).Range("A65536").End(xlUp).Row
Worksheets(targetSheet).Range("1:" & maxRow).Copy

targetRow = Worksheets(1).Range("A65536").End(xlUp).Row + 1
Worksheets(1).Rows(targetRow).PasteSpecial Paste:=xlPasteValues
----

【現象】
上記コードで複数シートに入力されているセルを1つのシートへまとめてるVBAマクロ
を実行した後に、
With Application
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic ←これ
End With
を実行するとExcelのステータスバーに
再計算:(プロセッサ 4個): 0%
と出てだんまり状態になってしまう。
マウスホイール回転やクリックするとすぐに再計算が実行されて終わるけど
何もしないでいるとずっとこのままで、マウスカーソルが○マークになって
マクロの処理は終わっているのにまだ処理中になっている状態に見えてしまい
気になるのでなんとかしたいんですが、解決策をご存知の方はいらっしゃいますか?
自動再計算はVBA終了後ONに戻したいです。
ちなみに、コピー対象のセルは他のシートを参照する関数を使ってます。
68デフォルトの名無しさん:2011/08/09(火) 13:28:16.96
>>65
> お前の「後々保守する奴がそれで苦労させられるようなトリッキーなコードが綺麗な
> コードである」という認識が間違ってるとは思わないの?

>>62 も間違っていると書いてあるんだが。

ひょっとして馬鹿?
69デフォルトの名無しさん:2011/08/09(火) 14:10:20.51
> コードに「綺麗さ」を求める奴は大概トリッキーなコードを書いて
というのが間違い。
コードに綺麗さを求める奴は、大概トリッキーなコードは書かないだろ。
まあC++で簡単なテンプレートを使うくらいで「トリッキーなコード書きやがって」とかいう低脳もいるが。
70デフォルトの名無しさん:2011/08/09(火) 14:14:17.01
>>68
>>62が間違っていると主張しているのは、コードに綺麗さを求める行為。

なぜなら、綺麗なコードは得てしてトリッキーなコードであり、後続のメンテナを苦しめるから、という主張でしょ。
71デフォルトの名無しさん:2011/08/09(火) 14:28:42.89
>>70
> 綺麗なコードは得てしてトリッキーなコードであり

新たな主張?

>>62 が書いてるのは「「綺麗さ」を求める奴は大概トリッキーなコード
を書いて」だけ。

「綺麗さ」を求める奴が「綺麗なコード」を書いてるとは書いてないよ。
72デフォルトの名無しさん:2011/08/09(火) 14:36:50.00
>>71
> 新たな主張?
表現が間違ってた。訂正する。

なぜなら、綺麗なコードは得てしてトリッキーなコードであり、後続のメンテナを苦しめるから、という主張でしょ。

なぜなら、綺麗なコードを求める行為は得てしてトリッキーなコードを産みだし、後続のメンテナを苦しめるから、という主張でしょ。

綺麗なコードを求めると、なぜ全員が綺麗なコードが書けないと思っているのかが不思議。
綺麗なコードを求めて、綺麗なコードを書けばいいでしょ。
73デフォルトの名無しさん:2011/08/09(火) 14:49:37.27
まあ、VBAの世界じゃ、Class使っただけでトリッキーと言われ、
Eventを使いこなすと悪魔と言われるからな。
74デフォルトの名無しさん:2011/08/09(火) 14:57:03.68
>>72
> 綺麗なコードを求めると、なぜ全員が綺麗なコードが書けないと思っているのかが不思議。

「大概」を無視して勝手に不思議がる方が不思議なんだが...。

> 綺麗なコードを求めて、綺麗なコードを書けばいいでしょ。

陥りやすいってことでしょ。
真偽は知らんけど。
75デフォルトの名無しさん:2011/08/09(火) 15:42:27.44
そもそも「綺麗なコード」を求める奴のほぼ全てがトリッキーなコードを書くだなんてこと
>>62はおろか、お前さんらも知るはずもないので、議論しても無駄。

「綺麗なコード」を求める行為を良しとするかどうかは、>>62が思う「綺麗なコード」の内容を
聞かなければ議論しても無駄。
76デフォルトの名無しさん:2011/08/09(火) 15:47:43.96
>>74
誰が何に陥りやすいと?
77デフォルトの名無しさん:2011/08/09(火) 16:53:12.31
シート上にフォームコントロールからチェックボックスを配置して
チェックの状態でif文を使い判断させたいのですが
このオブジェクトの指定方法が分かりません。
シート上のチェックボックスの名前はチェックにしています。
chk = Worksheets("Sheet1").OLEObjects("チェック").Object.Value
だと上手くいきません。
どこが悪いのか分かる方教えてください。お願いします。
78デフォルトの名無しさん:2011/08/09(火) 17:01:43.62
>>76
>誰が何に陥りやすいと?

>>「綺麗さ」を求める奴は大概トリッキーなコードを書いて

の意味が理解できないの?
79デフォルトの名無しさん:2011/08/09(火) 19:42:33.52
とりえあずお前ら、綺麗なコードの定義を出せ
80デフォルトの名無しさん:2011/08/09(火) 20:21:30.59
>>77
これでいいんじゃね
chk = Worksheets("Sheet1").CheckBoxes("チェック").Value
If chk = xlOn Then
    Debug.Print "onです"
  Else
    Debug.Print "offです"
End If
81デフォルトの名無しさん:2011/08/09(火) 20:24:45.73
>>79
役割ごとにきちんと分割してあれば見やすいな。
綺麗なのとはずれるけど
82デフォルトの名無しさん:2011/08/09(火) 20:25:36.88
Me.CheckBox1.checked = True
とかそんな感じじゃないの
8377:2011/08/09(火) 21:23:43.80
>>80
>>82
ありがとうございます。
一応思った通りの動作をさせることができました。
84デフォルトの名無しさん:2011/08/09(火) 22:14:20.22
=ROUNDDOWN(( D3 ) - 26 * 110 * Sheet1!E2,0)
とセルに入っている内容を
replaceを使って
=ROUNDDOWN((( D3 ) - 26 * 110) * Sheet1!E2,0)
のようにしたいのですが上手くいきません。
分かる方お願いします。
85デフォルトの名無しさん:2011/08/09(火) 23:17:50.35
>>84
上手くいきません。だけじゃなく
どのようなコードで どうゆう結果なのか書いてくれないと
(エラーなら エラーめっせーじも)

もしかして
Rangeオブジェクトのreplaceメソッドを使ってるのかな?
だとしたら この例だと
計算式が 一時的にせよ 破綻しないように変更するの難しいような
つまり 一発で ( ) を追加できない限り 計算式が一時的に破綻する
(破綻した時点で 実行時エラー となる)

下のやり方の方が良いんじゃない?
 .Formula で計算式を文字列として取り出し
 変更(Replace関数等使って)後に 元のセルに戻す
8684:2011/08/09(火) 23:47:51.50
すみません。自分で考えたのは以下の式です。
Cells(1, 1).Formula = Replace(Cells(1, 1).Formula,
"=ROUNDDOWN" * " * Sheet1!E2,0)", "=ROUNDDOWN(" * ") * Sheet1!E2,0)")
これでいくと型が一致しません。とエラーが出ます。
多分*のところが駄目なのかと思いますが解決策が見つかりません。
>つまり 一発で ( ) を追加できない限り 計算式が一時的に破綻する
まさにその状態で直接書き換えるぶんには破綻しないのですが
replaceで一気にいくとエラーの件で書き換えられません。
87デフォルトの名無しさん:2011/08/10(水) 00:11:55.31
型が一致しませんって当然のような

これ自体が VBA の文字列式(構文的)に 既に破綻している
"=ROUNDDOWN" * " * Sheet1!E2,0)"

"=ROUNDDOWN" と " * Sheet1!E2,0)"
を積算しようとしてるからな

やるなら
"=ROUNDDOWN"" * "" * Sheet1!E2,0)"
だろ
あと
Replace関数ってワイルドカードってできたっけ?
8884:2011/08/10(水) 00:15:39.47
>>87
答えて頂きありがとうございます。自己解決しました。
Cells(1, 1).Formula = Replace(Cells(1, 1).Formula, "=", "")
Cells(1, 1).Formula = Replace(Cells(1, 1).Formula, "ROUNDDOWN", "ROUNDDOWN(")
Cells(1, 1).Formula = Replace(Cells(1, 1).Formula, "* Sheet1", ") * Sheet1")
Cells(1, 1).Formula = "=" & Cells(1, 1).Formula
=を無くして式でな形式にしてエラーを防ぎ
カッコを付けたして最後に=を足して式にする。
いろいろとお騒がせしました。
8984:2011/08/10(水) 00:16:55.33
あとひとつ書き忘れです。
>Replace関数ってワイルドカードってできたっけ?
自分もそこが分からなかったのですができるかな?と思って。
90デフォルトの名無しさん:2011/08/10(水) 01:02:54.05
>>「綺麗さ」を求める奴は大概トリッキーなコードを書いて

持論厨乙すぎる
なんで「綺麗=トリッキー」って等式作っちゃったのか気になる
まさかとは思うが変なアルゴリズムかまして短くまとまったコードを「綺麗」と形容してるんだとしたらゴミだな
9185=87:2011/08/10(水) 03:22:37.24
>>88
もう見てないかもしれないけど
自己解決して納得してるんならいいんだが
セルへのアクセスは最小限にした方がいいような
自分ならこうする
Str = Cells(1, 1).Formula
Str = Replace(Str, "ROUNDDOWN", "ROUNDDOWN(")
Str = Replace(Str, "* Sheet1", ") * Sheet1")
Cells(1, 1).Formula = Str
92デフォルトの名無しさん:2011/08/10(水) 05:47:40.16
>>90
持論厨、乙
93デフォルトの名無しさん:2011/08/10(水) 07:36:29.88
vbaってプログラムを他人に見られないように、コンパイルとか
ファイルにパスワードとかけるの?
94デフォルトの名無しさん:2011/08/10(水) 08:12:36.02
>>93
よくわからんがプロジェクトのロックのことか?
95デフォルトの名無しさん:2011/08/10(水) 08:15:33.67
そうです、プロジェクトの事です。
96デフォルトの名無しさん:2011/08/10(水) 08:50:55.32
>>67なんだが、解決策ってやっぱないのかな?
2007はどうか知らないけど、2003では起こらない現象で、2010では起こる
2003から再計算の仕様変更とかその辺りのが原因なのかな
2010でネット上に同じような質問あるけど、解決しましたってのはないしね
画面をクリックしないとマクロの動作が終了しないってのはなんなんだろう
マクロの動作というか再計算で固まるっていう現象
97デフォルトの名無しさん:2011/08/10(水) 09:33:59.61
フォームにボタンを置いて、ボタンのクリックイベントの中で
whileを使ったループ処理をしたいんだけど、ループ処理中に
ループを停止させたい場合ってどうすればいいの?

ループ中はフォーム側に制御が戻ってこないから、
停止用ボタンを作っても押せないからどうしたもんかと。
98デフォルトの名無しさん:2011/08/10(水) 10:17:45.83
DoEventsってVBAにはなかったっけ?
99デフォルトの名無しさん:2011/08/10(水) 13:29:38.13
トリッキーなコードを書こうと思ってる奴か、
トリッキーなコードが綺麗なコードだと思ってる奴じゃ無いと
綺麗なコードを書こうとしてトリッキーなコードを書いてしまうなんてまれ。
100デフォルトの名無しさん:2011/08/10(水) 13:33:46.64
処理中に制御権をアプリ側に明け渡す事なんか良くある事じゃん
101デフォルトの名無しさん:2011/08/10(水) 15:08:57.77
>>99
まず前提として
・コードが簡潔にまとまってる方が綺麗なコードである
・コードの量を(ある程度以上に)減らすとトリッキーなコードになる
というのがあると思う

こうやった方がコードが短くて簡潔だな、と思ってどんどんコード量を減らしていくと
ある程度のラインを超えるとトリッキーなコードになってくる
その加減が結構難しい。人によってもそのラインは違うだろうし
102デフォルトの名無しさん:2011/08/10(水) 16:58:17.91
その前提はVBAで成り立つかなあ?C/C++でそれを言うなら、まあ納得だけどさ。
目的を達するコードを、C++とかだと、それこそ無数に書きようがあるから、中にはトリッキーなものも出てくる。
でも、VBAはそんなにバリエーションないと思うんだけどね。寧ろトリッキーなVBAのコードの具体例を見てみたい。
103デフォルトの名無しさん:2011/08/10(水) 17:13:50.73
他人が見て理解してもらえるのが綺麗なコード
他人が見てイミフ、なんでこんなことしてるの?って思われるのが汚いコードじゃないの?
104デフォルトの名無しさん:2011/08/10(水) 17:35:58.23
>>102
たとえば、整数 a が
31以上40以下の場合、1を引く
40より大きい場合、2を引く
という処理があったとして

何も考えないで
    If a >= 31 And a <= 40 Then
        a = a - 1
    End If
    If a > 40 Then
        a = a - 2
    End If

綺麗(俺基準)に書くと
    Select Case a
        Case 31 To 40
            a = a - 1
        Case Is > 40
            a = a - 2
    End Select

だが、トリッキーなコードを書くと
    a = a + (a >= 31) + (a > 40)
の1行でできてしまう
105デフォルトの名無しさん:2011/08/10(水) 17:52:03.51
ありがとう。確かに、これはきめえわw
真が-1って共通認識をプロジェクトで共有できているなら使ってもよさげなんだが。
コメントで、注釈してもいいかも。
a = a + (a >= 31) + (a > 40) ' 条件が真ならば-1
てな感じ。

でもまあ、その程度じゃない?式中で代入は出来ないし、評価の短絡もない。
他の構文もそうそう別の簡単な書き方がある訳でもない。With使いまくりは勘弁な。
106デフォルトの名無しさん:2011/08/10(水) 18:01:41.25
大昔のインタプリタなBASICだと圧倒的に速度差がでたんだが
今なら速度気にすることはあんまりないし(そもそもコンパイルで差が出ないかもしれん)
まあ使っちゃいかん類の書き方だと思う
107デフォルトの名無しさん:2011/08/10(水) 18:24:40.87
>>104
うん、そうそう。

だから、綺麗なコードを書こうとしている奴が
> a = a + (a >= 31) + (a > 40)
なんてコードを書くかね、って話をしてるんだが、
なんか変な奴が一人まぎれてるっぽい。
そいつは、綺麗なコードを書こうとすると上のようなコードを書きがちだと思ってるらしい、
108デフォルトの名無しさん:2011/08/10(水) 18:55:53.99
>>107
うん、そうそう。

>その加減が結構難しい。人によってもそのラインは違うだろうし
その為の極端な例だと理解できない、注意力散漫な馬鹿ほど口出ししたいらしい
109デフォルトの名無しさん:2011/08/10(水) 19:11:22.11
シートに表示→ツールバー→フォームからボタンを設定したする時に
複数のボタンをまとめるフォームというかコンテなってないの?

110デフォルトの名無しさん:2011/08/10(水) 22:03:25.62
>>92
図星だったってこと?さすがゴミだな
111デフォルトの名無しさん:2011/08/10(水) 22:10:55.30
Excelで逆引き検索をしたいのですが、
コンボボックスで選択された文字を
セルにコピーする方法が分かりません。
ご教授願います。

サンプルです。
http://www1.axfc.net/uploader/Sc/so/264099.xls
112デフォルトの名無しさん:2011/08/10(水) 22:21:56.09
113デフォルトの名無しさん:2011/08/10(水) 23:33:50.04
>>106
VBAってPコードコンパイラ積んでた?案外全部コロンでつなげた方が速いかもな。
114デフォルトの名無しさん:2011/08/11(木) 00:29:14.76
>>112
あれ?名前に90って入れなきゃいけなかった?
そんな意味のない返ししするなんて相当悔しかったんだね
115デフォルトの名無しさん:2011/08/11(木) 00:33:00.01
>>111 Cells(1, 1).Value = ComboBox1.List(ComboBox1.ListIndex)
116デフォルトの名無しさん:2011/08/11(木) 00:48:56.93
>>113
Pコードコンパイルかどうかはしらんが
デバッグメニューにコンパイルってあるからなぁ
117デフォルトの名無しさん:2011/08/11(木) 01:15:53.14
Dim TaTe As Long
For TaTe = 3 To 99
Worksheets("sheet").Range(Cells(TaTe, 2), Cells(TaTe, 96)).Select
With Selection
.Replace What:=0, Replacement:=Worksheets("0").Cells(TaTe, 49).Value
99までは問題なく動くのですが100にすると
RangeクラスのReplaceメソッドが失敗しましたとエラーが出ます
118デフォルトの名無しさん:2011/08/11(木) 01:29:09.70
>>116
そういえばあったか。コンパイルって結果をブックにでも保存してるんか?毎回開くたびに走ってるのかな。
119デフォルトの名無しさん:2011/08/11(木) 01:42:26.14
>>117
100行目のどっかのセルに変なコードが入ってんじゃないの?
120デフォルトの名無しさん:2011/08/11(木) 01:52:50.11
綺麗なコードで書くと言うのは、如何に可読性を高めて次回の改修作業をより行い易くする為に行うこと。
無論、処理コストとの兼ね合いもあるが今までのレスを見ていると
もっと根本的なクラス設計の話が出て来て然るべきと思うんだけどなぁ。
まず、>>104みたいなのは論外。型を何だと思ってるんだ。
ついで言うと、グローバル変数を指定して他のクラスから呼ぶのもやめれ。
きちんとそう言った他のモジュールと橋渡しになるエンティティを作ること。
設計の際にはどのクラスにどう言う役割と責任を持たせるか最初から考えて作っておくこと。
細い所で技に走ってちょこっとソース縮めてみても根本的な所がしっかりしていなければ
全体的にグダグダなソースになってしまう。
121デフォルトの名無しさん:2011/08/11(木) 06:10:00.58
CTRL+スペースでchrが出て来るのに、実行するとCHRが無いってエラーが出て、
定義で調べても無いって言われるのは何故?
122デフォルトの名無しさん:2011/08/11(木) 06:14:26.85
123デフォルトの名無しさん:2011/08/11(木) 08:13:34.35
>>120
>綺麗なコードで書くと言うのは、如何に可読性を高めて次回の改修作業をより行い易くする為に行うこと。

持論厨乙

て言うか、VBA でクラス設計云々言うのはちょっと痛すぎ。
124デフォルトの名無しさん:2011/08/11(木) 08:54:13.62
>>123
クラス設計云々はともかく、メンテナビリティは重要な要素だろうが
125デフォルトの名無しさん:2011/08/11(木) 09:11:34.34
子供に部屋のかたづけとはまずは部屋のレイアウトをCADにおこして、かたづけのフローを書いてだな
とか言い出しかねないな。
126デフォルトの名無しさん:2011/08/11(木) 09:17:48.39
ウチは大げさに捉えればそうしてる
127デフォルトの名無しさん:2011/08/11(木) 09:52:30.13
エンティティとか役割と責任って言葉を最近覚えたんだろ。

外は暑いけど、暖かく見守ってやろうじゃないか。
128デフォルトの名無しさん:2011/08/11(木) 11:43:10.35
綺麗なプログラムって話で、
ちゃんとしたクラス志向のオブジェクト言語の話なら解らんでもないが
VBAでの綺麗なコードって話で何言ってんのって感じだな
129デフォルトの名無しさん:2011/08/11(木) 12:38:52.82
やっぱりな。他のオブジェクト指向の言語とかやった事無い奴は
設計が既に疎かになっているから次に進めないしここを突つくと顔真っ赤にして反論する。
テキトーに考えてテキトーに組んで、いい感じでスパゲッティーにするんだろうな。
まぁ、ここで色々反論してくる奴は、そんな基本的な事も分かっていない様だから、
オブジェクト指向の言語や関数型言語なんてまともに使えないまま一生を終えるんだろうな。
130デフォルトの名無しさん:2011/08/11(木) 13:16:37.54
>>123
井の中の蛙乙
これは一般的に言われている事だ
131デフォルトの名無しさん:2011/08/11(木) 13:30:14.29
使い分けって大事だよな。Cでもオブジェクト指向っぽく出来るけど、わざわざやらないだろ。そういうライブラリ使う場合は別として。
VBA向けのクラスライブラリでも作るっていうのなら、気にする必要があるのかもしれないが、少なくともVBAの世界では一般的じゃないな。
132デフォルトの名無しさん:2011/08/11(木) 13:33:46.93

だから今話してるのはだな
部屋を片付ける=部屋を綺麗にする
だよね
例えばおもちゃを片付けるのをおもちゃ箱にしまうのか部屋の見えない所に隠してしまうのかの話で
どちらも部屋を綺麗にすることに変わりないがおもちゃ箱にしまったほうがまた遊ぶときすぐ遊べるってことだろ

そこに部屋を片付けるプランから考えるとかはまた別問題なわけで。

プログラミングにそれが大事なのは当たり前のようにわかってるよ。
ただ今はそんな話してないってだけじゃないのか?
133デフォルトの名無しさん:2011/08/11(木) 13:39:10.98
マクロでシートを保存するとブックの名前も変わってしまうのですが、
マクロ実行中に保存以外の方法で元の名前に戻すことはできますか?
134デフォルトの名無しさん:2011/08/11(木) 13:53:00.94
その保存するブックをどうやって開いているのかと
ブックを保存するマクロをどう書いてるのかを示して
135デフォルトの名無しさん:2011/08/11(木) 14:00:44.31
>>131
> VBA向けのクラスライブラリでも作るっていうのなら、気にする必要があるのかもしれないが、
> 少なくともVBAの世界では一般的じゃないな。

継承とコンストラクタにパラメータが渡せないのがきついからなぁ。

この二つがサポートされてりゃまだそれなりの暮らすライブラリがかけると思うんだが...。
136デフォルトの名無しさん:2011/08/11(木) 14:15:22.77
ブックの開き方というのがわかりませんが、マクロが有るブックでシートを保存しています
別のブックからデータを読み込んだりしますが、その時はファイル名は変わりません
ThisWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & tooshibango & ".txt", FileFormat:=xlText
137デフォルトの名無しさん:2011/08/11(木) 14:27:52.44
>>131
VBA+クラスで検索
約 2,000,000 件 (0.17 秒)

VBA+classで検索
約 493,000,000 件 (0.20 秒)

まぁこれを見て、一般的でないと見るかどうかだけどな。
138デフォルトの名無しさん:2011/08/11(木) 15:04:47.33
>>137
絶対的な指標になり得ないものを上げて判断を仰ぐのはペテンくさい。
ちゃんと他と比べないといけないよね。

C++ クラス
約 59,200,000 件 (0.18 秒)

VBA クラス ライブラリ
約 64,700 件 (0.19 秒)

C++ クラス ライブラリ
約 500,000 件 (0.06 秒)

あと、分かっててやってるんだろうけど、
検索使うときは対象絞るようにしないと、VBAのままだとVBにもヒットするよ。
VBでの話がしたい?なら該当スレへどうぞ。

そもそも何でそれを検索したんだ?クラス=オブジェクト指向なのか?本当に?
139デフォルトの名無しさん:2011/08/11(木) 15:08:41.21
>>136
SaveAsは名前を付けて保存だから、名前変わるのは当然だな
ブック名をどう使いたいか解らんが、名前をもとに戻す方法考えるより
保存するシートをマクロと別ブックにする方がいいんじゃね
140デフォルトの名無しさん:2011/08/11(木) 15:14:24.49
>>138
>検索使うときは対象絞るようにしないと、VBAのままだとVBにもヒットするよ。

はあ?
141デフォルトの名無しさん:2011/08/11(木) 16:09:14.91
>>138
お前こそ何がしたいんだよ。

「VBAでクラスライブラリを構築する」なんて概念こそがほぼ無いことだろ。
なんでわざわざ「ライブラリ」を付けて検索するんだよ。

VBAで.NETのクラスライブラリを使うことができることを考慮して検索すると、

vba "クラスライブラリ" -.NET
約 18,700 件 (0.34 秒)

しかも、1ページ目のほとんどが他言語のクラスライブラリの話だ。

> そもそも何でそれを検索したんだ?クラス=オブジェクト指向なのか?本当に?

この流れでそれがわからないとか、馬鹿なの?
142デフォルトの名無しさん:2011/08/11(木) 16:26:28.99
>>141
VBAでクラスを使うことが異端であると言いたいんだと思うよ。
きっとクラスを使ったことないんだよ。
便利な場面で使えばいいだけのことなのにね。
使ったことないから、いつ便利なのかわかんないんだろうけど。
143デフォルトの名無しさん:2011/08/11(木) 16:45:26.55
エクセルVBAでクラス設計とかアホだろ
そもそもクラスはエクセルのセル、というかエクセルのブックがクラスなんだから、
それを最大限に生かせばいいだけの話。

エクセルのセル内容をほとんど使わないアプリとかは知らん。

クラス=オブジェクト指向
よりも、
エクセル=オブジェクト指向
という結びつきのほうが強い
バグは置いておいてくれ。これを言い出すとキリがないからな

なんにしろ普通は
データベース、特にアクセス(更に言えば普通は専用システム)でvbaを使い、データ整理
エクセルでデータを引っ張り出し、vbaでレイアウトの整理、出力
が基本
144デフォルトの名無しさん:2011/08/11(木) 16:50:49.24
お前の中ではそれが基本なんだな
145デフォルトの名無しさん:2011/08/11(木) 16:51:25.37
>>142
わざわざC++と比べてるんだから、異端か異端でないかじゃなくて、
他の言語と比べて一般的かってことだろ。
大体検索結果なんてものによって分母も違ってなんの参考にもならんのに、
ドヤ顔で結果を貼り付けるて、挙句意図も説明しないから、
結局訳が分からなくなる。
意見があるなら、それをまずちゃんと日本語で書くべき。
146デフォルトの名無しさん:2011/08/11(木) 16:54:34.68
どうでもいいが、設計論やりたいならスレ立てるかなんかで余所でやってくれ
147デフォルトの名無しさん:2011/08/11(木) 16:58:04.39
ここ最近の流れって、ちょっと真面目に読むと笑えてくる。皆それぞれ独自の認識してるんだ。
VBAのクラスはただの構造体+メソッドだろ。多態もできないと言い切れるレベルなのに、オブジェクト指向って・・・()笑
あっ、もちろんこれは俺の中ではこうだって話だから、皆さんはそれぞれ自分の中のVBA像を語ってください><
148デフォルトの名無しさん:2011/08/11(木) 17:18:24.07
>>147
こんなこと結構するけど。

Class1.cls:
Private WithEvents m_sheet As Worksheet

Public Sub SetWorkSheet(ByRef aSheet As Worksheet)
  Set m_sheet = aSheet
End Sub

Private Sub m_sheet_Change(ByVal Target As Range)
  MsgBox m_sheet.Name & "!" & Target.Address & " was changed"
End Sub

ThisWorkbook:
Private m_sheets As New Collection

Private Sub Workbook_Open()
  Dim obj As Class1
  Dim aSheet As Worksheet

  For Each aSheet In Worksheets
    Set obj = New Class1
    obj.SetWorkSheet aSheet
    m_sheets.Add obj
  Next
End Sub
149デフォルトの名無しさん:2011/08/11(木) 17:23:39.40
>>147
あと、多態に関しては、例えばこのページとか。
http://zebratch.blog.so-net.ne.jp/2009-04-14-1

それと、こんなページとか。
http://www.objectclub.jp/community/memorial/homepage3.nifty.com/masarl/article/excel-decorator.html

軽くググっただけだから、もっと良いページがあるかも。
150デフォルトの名無しさん:2011/08/11(木) 17:48:15.78
RSSで読み込んでいるデータと固定値を比べて同じならBEEPを鳴らすようにしているのですが、
以下のソースで (1)はなんら問題なく動作しますが、(2)はExcelファイル起動にRSSからの更新データ読み込み更新の有無のダイアログ表示後「更新する」ボタンをクリックして継続すると
実行時エラー13:型が一致しません と出て処理がとります。
VBAから再度実行すると普通に動きます。
考えたのですが問題点がよくわかりません。

(1)
For Each myRange In Range("d12:d21")
  If myRange.Value = Range("b2") Then
  Beep
 End If
Next

(2)
For Each myRange In Range("b2:b11")
If myRange.Value = Range("h23").Value Then
Beep
End If
Next myRange

対象となるセルはすべて、数値としてあります。
セルh23に固定値が入っています。
151デフォルトの名無しさん:2011/08/11(木) 17:49:26.62
C++で言うと、それtemplate使えば簡単に書けるよとか、boost使えば簡単だよとか言うと
いきなりファビョりだす奴と行動が似てる
152デフォルトの名無しさん:2011/08/11(木) 17:55:27.53
>>148-149
がんばってるなぁ、でも馬鹿みたいとしか思えない。

ボケ防止に趣味でやってるなら止めはしないけど。
153デフォルトの名無しさん:2011/08/11(木) 18:00:07.66
セルがすごい複雑で優秀なクラス構造をしてるから、それを利用するという意見は少数なのか
もったいないなぁ
154デフォルトの名無しさん:2011/08/11(木) 18:03:32.38
逃げることしかできないへたれ
155デフォルトの名無しさん:2011/08/11(木) 18:07:03.76
>>152
同じ構造のシートで数十シート(可変)以上あるようなBookを読み込んで、
それぞれのシートに同じ処理を適用するような場合を思いつかない?

まあ、後は普通にクラスで実装した方が楽な場合は使うよ。
クラスなしにVBA用のxUnit実装してとか言われたら発狂もの。
156デフォルトの名無しさん:2011/08/11(木) 18:07:23.96
>>154
なるほど!>>154さんは中卒なのですね(泣)
月収は16万ぐらいなのでしょう・・・
お互い大変ですけれども、頑張りましょう!
私も25万しかもらっていません(泣)
今年はボーナス無しです・・・
157デフォルトの名無しさん:2011/08/11(木) 18:16:43.94
こいつ、ExcelでJavascriptが使えるようになったとしても、絶対に使わんだろうな
あ、Javascriptでオブジェクト指向なんて、とか言い出すかw
158デフォルトの名無しさん:2011/08/11(木) 18:23:19.98
>>155
>それぞれのシートに同じ処理を適用するような場合を思いつかない?

そんなもん別に VBA でクラスなんぞ作らんでも作れるだろ?
まあ、がんばってクラス作ってくれてもいいんだけどね。

Excel 自体はそりなりにクラス構造が作られてるから普通に利用すりゃいいだけで、
VBA でクラス作らないといけないわけじゃない。
なので、>>153 とか何言ってるのか意味わからん。

ちなみにそれなりの機能を持つアプリで入出力が Excel の場合、最近は >>154
言うように C# で Excel 呼び出す方向に「逃げる」ようにしている。
でも、 Javascript だと、ちょっと嫌かも (w
159150:2011/08/11(木) 18:30:23.35
自己解決しました。
ファイルを開いた瞬間は各セルの値は #N/A でアサインされていないので、アサインされてから比較するようにしたらうまくいきました。
お騒がせしました。
160デフォルトの名無しさん:2011/08/11(木) 18:41:45.57
A1の値を別ブックのシート1にコピー
A2の値を別ブックのシート2にコピー・・・・・・
このようなマクロを作りたいのですが
Worksheet(変数).Selectのところでうまくいきません
161デフォルトの名無しさん:2011/08/11(木) 18:45:03.12
うまいこといかないじゃなくてエラーメッセージとその付近のコードを晒せ
162デフォルトの名無しさん:2011/08/11(木) 19:04:34.89
ユーザーフォーム上のコントロールの状態を記憶させておく簡単な方法ってない?
終了時にファイルに適当に記録するにしても、一発でチェックボックスの
状態の読み書きが出来るとかそんなのない?
163デフォルトの名無しさん:2011/08/11(木) 20:14:41.08
>>161こんな感じです。コピーまでは動くのですが
Dim P As Integer
For P = 1 To 100
Workbooks("XXX.xls").Activate
Range(Cells(1, P), Cells(500, P)).Copy
Workbooks("YYY.xls").Activate
Worksheets(P).Range("D1").Select
Selection.PasteSpecial Paste:=xlValues
Next P
RangeクラスのSelectメソッドが失敗しました
164デフォルトの名無しさん:2011/08/11(木) 20:25:11.71
workbooks(x)
で、xをsheetsのimdexのように使う用法ってまさかないんですか?
あるはずだよね?
どうやるの?
万一ないなら、代替えとしてどうやってbookを操作するの?
165デフォルトの名無しさん:2011/08/11(木) 20:46:05.29
>>163
もしかして
"YYY.xls"へ 非表示のワークシートがあったりしない?
非表示のワークシートもにもインデックス番号がついてるから
それをSelect すると"RangeクラスのSelectメソッドが失敗しました" になるけど
166デフォルトの名無しさん:2011/08/11(木) 21:31:16.94
>>163
Worksheets(P).Select
Range("D1").Select
167デフォルトの名無しさん:2011/08/11(木) 22:53:34.64
>>166
できました。ありがとうございます。
どこかのサイトにSelectはあまり使わないほうが良いと書いてあったのですが
繋げるのとSelectで分けるのとどう違うのでしょうか
168デフォルトの名無しさん:2011/08/12(金) 00:02:19.88
>>167
Worksheets(P).Range("D1").Select
このコードはあくまで セルをSelect しようとしてるんであって
Worksheets(P)を Selectしている訳ではありません
Selectされていないシートの セルをSelectしようとしているので
エラーになる(ううむ ややこしい)
169デフォルトの名無しさん:2011/08/12(金) 00:18:08.40
Worksheets(index)ってできないの?
170デフォルトの名無しさん:2011/08/12(金) 00:22:09.64
なぜできないと思ったのかその根拠を示せ
171デフォルトの名無しさん:2011/08/12(金) 00:41:31.34
まず、できないと思ってると考えた根拠を示すのが先だろ。
そもそも質問してるだけだ。
172デフォルトの名無しさん:2011/08/12(金) 00:45:54.22
エクセルVBAでクラス設計とかアホだろとか言ってる奴は
EXCELが全てクラスで構成されている事なんか知らないんだろうな。
標準モジュールですらスタティックエリアに展開される静的なシングルトンのクラスだと言うのに。
それらの使い方や作り方をおざなりにすると言うことはアジャイル開発なんて全く念頭にないな。
そんな奴が作ったプログラムの改修作業に入る人は悲惨だな。
173デフォルトの名無しさん:2011/08/12(金) 01:12:41.49
こらそこ難しい単語使わない
174デフォルトの名無しさん:2011/08/12(金) 06:08:16.29
難しい単語なんて出てきたか?

>>172
半分くらいは言ってること正しいんだが、"クラス"の捉え方次第では的外れな主張になる
君が言ってるのは、プログラム言語一般でのクラス、でもここはVBAスレなので
VBAのクラスとして捉えると、標準モジュールどころかシートモジュールさえもクラスでは無いと定義される

特定言語でのコミュニティー(掲示板や開発チームなど)に入ったときに、その言語特有の概念や定義を理解せず
プログラム言語一般論で語り出しちゃう奴は何処に行っても疎まれ、チームでは役に立たず掲示板ではウザがられるだけ

そんな奴と一緒にチーム開発させられる人が居るとすれば悲惨だな
175デフォルトの名無しさん:2011/08/12(金) 06:21:30.46
いいから設計論は余所でやれ
176デフォルトの名無しさん:2011/08/12(金) 08:20:54.19
>>174
悪いがそんな受け捉え方なんてもので実際の本質が変わる様なあやふやなものでは無い。
持論を持ち出すのは結構だが、実際にそいつらの本質がクラスであるのは変わり様のない事実。
そして開発チームどうのと言う以前の問題。使われているのはそう言った性質を持ったアプリケーションなんだからな。
そう言ったウチの開発チームでは、とか、俺的には、とかそう言う細かい本質から離れたプライオリティの低い話を
あたかも本質として扱おうと言うのは「既に私の話は破綻していますよ」と言っている様なものだ。
そして、そう言った知識レベルの低いチームが一般的で無い組み方をしたプログラムを後に他のチームが改修に入り、
その時にはどう言う意図でそう組んだのか誰も分からなくなるなんてざらにある事。
要するに一般的な事の前に持論が来ちゃってるんだよな。
三流の下っ端プログラマとして終わりたく無ければもっと外にも目を向けるべきだな。
177デフォルトの名無しさん:2011/08/12(金) 08:27:06.16
そもそも VBA って三流の下っ端プログラマ (=素人、MS 的にはエンドユーザ) 向けだと思うが。
178デフォルトの名無しさん:2011/08/12(金) 08:39:45.46
ホントたのむからスレタイ読んで芯でくれ
179デフォルトの名無しさん:2011/08/12(金) 08:59:15.34
>>176
お前らが三流なのはよく解った
プログラマ板にでも行け
180デフォルトの名無しさん:2011/08/12(金) 09:39:55.09
>>158
> そんなもん別に VBA でクラスなんぞ作らんでも作れるだろ?

じゃ、クラス使わずに>>148と同等の処理ができるコード示して。

> まあ、がんばってクラス作ってくれてもいいんだけどね。

がんばって、というのがよくわからないんだけど。>>148のどこががんばってる?

> ちなみにそれなりの機能を持つアプリで入出力が Excel の場合、最近は >>154
> 言うように C# で Excel 呼び出す方向に「逃げる」ようにしている。

永続化の手段としてExcel Bookを使う場合の話?
俺が話してるのは、UIの手段としてExcel Bookを使う場合なんだが。
181デフォルトの名無しさん:2011/08/12(金) 09:43:37.53
ユーザーフォームを一旦HideにしてからShowにする時に、
Hide時の位置に表示させたいのですがどうしたらいいですか
182デフォルトの名無しさん:2011/08/12(金) 09:50:03.14
おまいら俺のくそきったないコード見て落ちつけよ(IEは描画できません><)

http://www42.atwiki.jp/syugyou?cmd=upload&act=open&pageid=240&file=syk.html
183デフォルトの名無しさん:2011/08/12(金) 11:08:42.36
>>180
>じゃ、クラス使わずに>>148と同等の処理ができるコード示して。

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  MsgBox Sh.Name & "!" & Target.Address & " was changed"
End Sub

> >>148のどこががんばってる?

がんばってると言うか、はっきり言えばアホみたい。

>俺が話してるのは、UIの手段としてExcel Bookを使う場合なんだが。

C# からでも Excel の UI 制御できるよ。
君にできるかどうかは知らんけど。
184デフォルトの名無しさん:2011/08/12(金) 11:51:37.31
何度言ったらわかる消えろ
185デフォルトの名無しさん:2011/08/12(金) 11:53:39.99
>>183
うーん、そのコードを同等と言うならしょうがないね。もういいよ。

> C# からでも Excel の UI 制御できるよ。

UIを制御するんじゃなくて、UIとしてExcel Bookを使う場合なんだけど。

まあ「がんばって」C#でExcelのUI制御でもしてれば。
186デフォルトの名無しさん:2011/08/12(金) 11:56:00.74
基本機能としてクラスモジュールが使えて、クラスを使うと便利な場面があるのに、
頑なに使おうとしないんだからもう平行線だね。
どこぞのstatic親父と似た匂いがする。
187デフォルトの名無しさん:2011/08/12(金) 12:08:03.82
>>181
Me.Top と Me.Left の値をどこかに保存しておいて
Showする時に戻すとか ちなみにその時に
Me.StartUpPosition = 0
じゃないと位置変更されないと思う
188デフォルトの名無しさん:2011/08/12(金) 14:21:11.20
こういう時のためにすいとんがあるんじゃないか
誰かやれよ
189デフォルトの名無しさん:2011/08/12(金) 15:29:42.61
>>187
> Me.StartUpPosition = 0
> じゃないと位置変更されないと思う

これでした。
ありがとうございました。
190デフォルトの名無しさん:2011/08/12(金) 15:30:51.56
Windows8ではExsel VBAどうなるの?どうせ変態仕様で継続されるんだろうと予測
191デフォルトの名無しさん:2011/08/12(金) 15:45:51.74
vbaで外部ソフトを操作するプログラムを作ってて、ほぼ出来上がってるんだけど
ある1つのボタンだけvbaからのクリック動作を3回に1回くらいしか受け付けてくれません。

ググって見たら WM_COMMAND を使うようなページが幾つか見つかったんですが動作しません。

Call SendMessage(hnd_A_Button, WM_LBUTTONDOWN, 0, ByVal 0)
Call SendMessage(hnd_A_Button, WM_LBUTTONUP, 0, ByVal 0)

こんな感じでボタンをクリックしていたのですが、1つのボタンだけ素直に受けつてくれません。
ググッたページを見て

Call SendMessage(hnd_OYA_Window, WM_COMMAND, BN_CLICKED * &H10000 + GetDlgCtrlID(hnd_A_Button), ByVal hnd_A_Button)

こんな風にしたのですが反応しません。
ハンドルはスパイソフトで確認して間違えないのは確認しています。
何が間違えているのでしょうか?

よろしくお願いします。
192デフォルトの名無しさん:2011/08/12(金) 18:19:48.11
>>185
>うーん、そのコードを同等と言うならしょうがないね。もういいよ。

え゛っ、どこか違うか?

違うなら、違いを示してくれよ。

>UIを制御するんじゃなくて、UIとしてExcel Bookを使う場合なんだけど。

プロパティもイベントも普通に使えるから UI として Excel 使う上で何の
問題もないわけだが。

まあ別に君に使えと言うわけじゃないから安心しなよ。

>>186
「クラスを使うと便利な場面がある」なら使えばいいと思うよ。

でも少なくとも、自信満々で出してきた >>148 なんて、わざわざクラス
使って20行近く書くよりより3行書く方が楽だと思わないか?

思わないとしたら、平行線でもしょうがないと思うけどね。
193デフォルトの名無しさん:2011/08/12(金) 18:21:13.53
>>190
Visual Bacik for Apprikation になると思われ。
194デフォルトの名無しさん:2011/08/12(金) 18:42:36.43
>>190
なんか卑猥だな> Exsel
195デフォルトの名無しさん:2011/08/12(金) 18:42:42.34
え?
196デフォルトの名無しさん:2011/08/12(金) 21:07:00.46
>>176みたいに恥ずかしい奴って、昔から見かけるよね
もしかして同一人物がずっと粘着してるのかな?
197デフォルトの名無しさん:2011/08/12(金) 21:13:21.35
恥ずかしいってか、バカ相手にムキになり過ぎ。ほっときゃいいのに。
198デフォルトの名無しさん:2011/08/12(金) 21:21:52.86
お前ら、質問に答えろや
お願いします。
199デフォルトの名無しさん:2011/08/12(金) 21:43:37.23
水戸市民の俺参上
200デフォルトの名無しさん:2011/08/13(土) 01:55:13.14
>>197
バカは言い過ぎ
新しいことが受け付けられない
お年寄りになっただけ
201デフォルトの名無しさん:2011/08/13(土) 03:10:36.69
>>198
質問者の態度でかいしお礼も言えない子が多いからね
202デフォルトの名無しさん:2011/08/13(土) 03:28:42.55
>>201
まぁこういうゴミクズに礼を言う必要はないからなw
203デフォルトの名無しさん:2011/08/13(土) 03:38:19.54
いいからさっさと答えろグズ
204デフォルトの名無しさん:2011/08/13(土) 03:48:46.42
>>203
205デフォルトの名無しさん:2011/08/13(土) 05:37:25.29
>>201
童貞のお前には聞いてない
206デフォルトの名無しさん:2011/08/13(土) 07:25:52.36
>>200
>新しいことが受け付けられない
>お年寄りになっただけ

進歩の止まった VBA ってお年より向け言語だろ?
ひょっとして、VBA のクラス使いこなしてる俺すげーと思ってる >>148 さんですか?
207デフォルトの名無しさん:2011/08/13(土) 07:34:06.55
>>202
生きるうえで礼儀大切だよ粗末にしてると本物のゴミクズになっちゃうよ
208デフォルトの名無しさん:2011/08/13(土) 08:20:51.73
そういえばうちのおじいちゃんも
切符の券売機でよくまごついてるなあ
209デフォルトの名無しさん:2011/08/13(土) 08:32:36.54
>>208
窓口に行って駅員に売って貰えばいいだろ
210デフォルトの名無しさん:2011/08/13(土) 09:00:58.80
>>208-209
おまいらナイス!
実に素晴らしい例え方だわw
券売機(クラス)が使える普通の人は券売機でさっさと買って行ってしまえばいいし、
使えないおじいちゃんは窓口で買えばいいわな。
211デフォルトの名無しさん:2011/08/13(土) 10:06:21.91
>>206
クラス使えるとスゲーなんて発想になるのは君だけじゃない?
ここにいるほとんどの人は、使えるけど状況に応じてあえて使わないだけだと思うよ。
212デフォルトの名無しさん:2011/08/13(土) 10:56:01.54
自分専用ツールぐらいしかVBA使わないわー

券売機クラスってwwwせめて関数程度だろwww
213デフォルトの名無しさん:2011/08/13(土) 11:11:04.19
券売機クラスってどういう構造で表現するのがいいんだ?
↑の例えでいくと人か機械かどっちかのインターフェースがあって、その下に発券のシステムがあるイメージ?
でも発券のシステムって、入力と出力が一対一だろ、ファイルに全対応を書き出しておいて検索しても十分だ。
特に好んでクラス使う例にはなりそうに無いな。
214デフォルトの名無しさん:2011/08/13(土) 11:36:52.17
俺がVBAでクラスを使って良かったと思えたのは、シューティングゲーム作った時かな。
不特定多数の敵や弾を、その種類毎にクラス作っておいて、
発生する時にインスタンスをぽこぽこ作って、コンストラクタで最初の位置を設定して、
後はコレクションに格納して、インターフェース使ってポリモーフィズムでそれぞれの敵や弾毎に別れた処理をぐるぐる回す。

らくちんw
215デフォルトの名無しさん:2011/08/13(土) 11:38:16.43
>>210
>券売機(クラス)が使える普通の人は券売機でさっさと買って行ってしまえばいいし、

こんなぼろい券売機もどきでなに言ってるんだ?

>>211
日本語ぐらいちゃんと読めよ...。
216デフォルトの名無しさん:2011/08/13(土) 11:41:03.00
>>214
>コンストラクタで最初の位置を設定して、

引数ももてないコンストラクタでどうやって設定したのか kwsk
217デフォルトの名無しさん:2011/08/13(土) 11:59:43.60
>>216
えっ?
218デフォルトの名無しさん:2011/08/13(土) 12:03:25.85
>>215
御老体向けの券売機もどきも使いこなせない人っていったい・・・
219デフォルトの名無しさん:2011/08/13(土) 12:54:47.27
ごめん、「御老体向けの券売機もどき」で満足してる人だったんだね。
220デフォルトの名無しさん:2011/08/13(土) 15:08:52.91
>>219
満足とか意味不明。
無い機能は使えないし
ある機能は使えば便利な時に使うだけ。

君、自己満足の為にVBAでプログラミングしてるんだ。いい身分だねw
221デフォルトの名無しさん:2011/08/13(土) 16:54:43.79
>>220
>無い機能は使えないし
>ある機能は使えば便利な時に使うだけ。

それを「「御老体向けの券売機もどき」で満足してる」って言うんだけど...、
日本語不自由な人なのか?

俺は、機能がなくて不満なときは C# に逃げるけどね。
222デフォルトの名無しさん:2011/08/13(土) 18:18:13.81
>>221
あれぇ?
VS2010はプロフェッショナル以上のエディションなら直接EXCEL2010を.Net環境から開発出来るよねぇ。
古いのでやってるの?それともお金が無いの?
で、C#に逃げるって、それもクラス設計しないで作ってるの?
クラス図から直接コードに落とす機能も有ったりするのに?
それともやっぱりお金が無くて.NetFreamWorkだけ突っ込んでテキストファイルで一生懸命書いてコンパイルしてたりするの?w
ひょっとして、テスト環境とか作ったりリファクタリングする機能があるのも知らないんじゃないの?
俺はC#もVB.Netもやってるけど、スレ違いになるからわざわざ言わなかったのに。
そんなスレ違いの方向に持って行って何がしたいの?
223デフォルトの名無しさん:2011/08/13(土) 19:02:39.03
攻撃方法変えて金持ってる事を自慢し始めちゃったよこの人
224デフォルトの名無しさん:2011/08/13(土) 19:07:39.81
>>221がボロが出始めて話をそらし始めました
225デフォルトの名無しさん:2011/08/13(土) 19:13:03.58
自分が満足どうのとC#の話振っといて、
突かれたらお金の自慢されたとかw
どうなの?古い環境や低いエディションで満足出来てるの?w
226デフォルトの名無しさん:2011/08/13(土) 19:34:39.36
早く夏休み終わらないかなぁ
227デフォルトの名無しさん:2011/08/13(土) 20:11:25.26
>>226
What's the difference?
Every single annoying person is a NEET.
228デフォルトの名無しさん:2011/08/13(土) 20:25:51.85
両者引っ込みつかなくなってアホ丸出しなどーでもいい議論ははよ終わらせてくれや
229222:2011/08/13(土) 21:29:01.63
済まん。本当は>>214>>216とのやり取りで、>>216が少なくともObject指向のこと少しでも分かってたら
そんな質問は出て来ないだろうと言うことで、ろくすっぽ知らない事は分かってたんだ。
>>215>>216はそのレスのタイムスタンプから同一人物である可能性が極めて高いと判断した。
そして>>221でC#に逃げるとか言ってたから、ちょっと意地悪してみたくなったんだ。
ちょっと大人気なかったな。そこは素直に謝らせて貰う。済まんかった。
230デフォルトの名無しさん:2011/08/13(土) 21:40:15.07
>>222
一応 Professional は買ってもらってるけど、仲間内で使うちょっとしたツール作るだけに、Ultimate
(定価 160万) は、買えないよ。Office アプリは本職じゃないしね。

>そんなスレ違いの方向に持って行って何がしたいの?

いや今頃言われても...。
>>158 で2日も前に書いてるし、>>180〜 あたりの話は理解できなかったのかなぁ。
231デフォルトの名無しさん:2011/08/13(土) 22:23:21.74
>>229
で、いつから VBA のコンストラクタにパラメータが指定できるようになったの?
232222:2011/08/13(土) 22:30:34.31
>>230
そこで会話を交わしているのは俺じゃないし、実は>>214も俺じゃない。
ま、信じるかどうかはそちらに任せるけど、
今そっちのレスを読み返してみたけど、どっちも本当は互いの言いたい事分かっててあえて意固地になって
戦ってる様にしか見えないぞ。
後、余計なお世話かもしれないが金が無いならWindoswPhoneの環境を見ると、あれはまだBetaだがまだ日本語の本も出てないくらい本気で最新だ。
開発環境も無料だしな。データベースとのやり取りを行う時SQLを使う事もないし、
基本UIの項目から直接値を取る様な事もしない。
構造化言語からObject指向言語に移行した時に味わった苦しみを次はObject指向を開発している人達が近々味わうだろうと
思わせる一品だ。
スレチだからこの辺にしとくわ。じゃあな。
233222:2011/08/13(土) 22:35:09.07
>>231
その関数自体の引数で渡せないなら他にどんな渡し方がある?
流石にここまで言えば分かってくれるよな?
234デフォルトの名無しさん:2011/08/13(土) 23:36:20.56
>>232
> データベースとのやり取りを行う時SQLを使う事もないし、

笑うところ?
まさか、Uiltimate で C# とか VB.net 使ってて、Linq 知らないなんてことはないよねぇ?

>>233
はぁ、関数? なにそれ。

まじで、さっぱりわからんから詳しく教えてくれ。
235デフォルトの名無しさん:2011/08/14(日) 00:09:42.10
>>234
なんだ、LINQを知っているのに>>233みたいなのは知らんのか。
覚える順序が滅茶苦茶だな。なんか胡散臭いなあ。
LINQを使うと言う事は既にObject指向の範疇から外れているものなのは知っているよな。
で、LINQを使うと言う事は他にも色々知っていなければ出来ない訳だが、それらの内Object指向の範疇で無いものに
どんなものが有るのか、どんな働きをするものなのか教えてくれよ。
後、そこまで豪語するなら「基本UIの範疇から直接値を使う事もしない」って言うのも当然知っている訳で、
本当は>>233見たいなのも知ってて言ってるんだよなぁ先生。じゃなきゃそこまで豪語出来ないもんなぁ。
おっと、スレチ過ぎだな。じゃあC#板で待ってるからとっとと来て説明してくれよ。
236デフォルトの名無しさん:2011/08/14(日) 00:11:32.15
板じゃないな。失礼。スレだ。
237デフォルトの名無しさん:2011/08/14(日) 00:26:33.26
>>235
Linq の話なんてどうでもいいから、>>216 に答えてくれよ。
238デフォルトの名無しさん:2011/08/14(日) 00:34:36.47
C#,.NETできますアピールもういいから
239デフォルトの名無しさん:2011/08/14(日) 00:39:46.09
>>237
悪いがそこまで言われればどうでもいい訳には行かないなぁ先生。
あれだけ豪語してくれたんだから取り敢えず話を聞かせてくれないと
こっちも話す気になんかなれないのは分かるだろ?
説明してくれるのか、それとも本当にハッタリ君だったのか先にはっきりさせてくれ。
丁度いいスレ見つけたんだ。
【VB.NET】LINQ友の会【C#, C♯, C#】
http://hibari.2ch.net/test/read.cgi/tech/1202568694/
もうこれ以上このスレに迷惑掛ける訳にもいかないのも分かるよな?
じゃあ待ってるから
240デフォルトの名無しさん:2011/08/14(日) 01:00:55.51
>>239
豪語?
「MS」「SQL 使わない」「 C#/VB.net」とキーワードがあれば、"Linq" ぐらいは
知識としてあるだろ。
Windows Phone でも C# で Linq 使えるのは当たり前で、わざわざ言うほどの
ことじゃないはずだから指摘しただけ。

俺は SQL 書けるから、Linq なんて使ったことないし興味もない。

> もうこれ以上このスレに迷惑掛ける訳にもいかないのも分かるよな?

>>216 は、VBA の話なのでここで答えてくれていいよ。
241デフォルトの名無しさん:2011/08/14(日) 01:56:39.96
>>240
君、面白い事いうね。

>「MS」「SQL 使わない」「 C#/VB.net」とキーワードがあれば、"Linq" ぐらいは
>知識としてあるだろ。

平たく言うと、そのキーワードで今ググったって事だよね?
そう言うのは知識とは言わないよね。
で何、
>笑うところ?
>まさか、Uiltimate で C# とか VB.net 使ってて、Linq 知らないなんてことはないよねぇ?

何でLINQとエディションが関係有るのか説明して欲しいな。それと
Uiltimate?何でUiltimateだと思ったのかな?

>一応 Professional は買ってもらってるけど、仲間内で使うちょっとしたツール作るだけに、Ultimate
>(定価 160万) は、買えないよ。Office アプリは本職じゃないしね。

本当にProfessionalを持っているなら>>222で挙げた機能は、実は全て入ってる事知ってる筈だけど。おかしいねぇ。
MSDNのページででも調べちゃったのかな?
君はハッタリ君な上に嘘付きなのかな?

これらの事から言える結論は、君はC#やった事が有るとは到底俺には思え無いんだけど。
やっぱりちょっとC#のスレ来てちょこっとC#やってたってのを証明出来る様なコード書いて俺を納得させてくれよ。
逃げ回ってばかりでこのスレに迷惑掛け続ける訳にもいかないだろ?
242デフォルトの名無しさん:2011/08/14(日) 01:56:56.26
お前らスレ違いだから下らん論争は他でやれ
ここは質問スレだ
243デフォルトの名無しさん:2011/08/14(日) 02:02:02.74
>>242
外でやると言ってる訳だが、ハッタリ君が逃げ回って拒絶しているんだニンニン
244デフォルトの名無しさん:2011/08/14(日) 02:22:30.34
>>243
だったら放置しろ屑
弱いもの虐めすんなって小学校で教わらなかったのか
245デフォルトの名無しさん:2011/08/14(日) 02:47:07.54
いいだろう。今日は命名負け犬ハッタリ君の目出度い日だからこの辺にしておこう。
246デフォルトの名無しさん:2011/08/14(日) 03:00:54.19
>>241
> 本当にProfessionalを持っているなら>>222で挙げた機能は、実は全て入ってる事知ってる筈だけど。

本当におかしいねぇ、俺が使ってる Pro. には、「クラス図から直接コードに落とす機能」なんてないんだけど。
君の Ultimate にはあるんでしょ? Ultimate しかないしねぇ、その機能。
247デフォルトの名無しさん:2011/08/14(日) 03:13:54.76
>>244
ごめん、ハッタリ君な上に嘘付きで MSDN のページも調べられない情弱を虐めてしまった。

>>222 で、あまりにもアホなこと書いてるから、ついつい遊んでしまった。(w

>>234 の Ultimate にも、食いついてくれるし、言うことのないアホっぷりだったから、
さすがにもう出てこれない思うけどね。

# よくよく見たら、Ultimate の綴りが所々間違ってるな...。
248デフォルトの名無しさん:2011/08/14(日) 03:44:44.15
おまいら水遁と土遁の刑な
249デフォルトの名無しさん:2011/08/14(日) 04:05:43.18
ハッタリ君は茶かして逃走。
以後、ずっと負け犬ハッタリ君のレッテルは貼られ続けられるなw
250デフォルトの名無しさん:2011/08/14(日) 04:45:04.69
忍者ハッタリくん
251デフォルトの名無しさん:2011/08/14(日) 07:40:24.33
>>249
あれ? >>246 にはレスしないの?

まあさすがにできないよな、Visual Studio の比較ページ見たらすぐわかることだし。

> 以後、ずっと負け犬ハッタリ君のレッテルは貼られ続けられるなw

自己紹介乙。
あっ、情弱ハッタリ君のほうがいいんじゃないかな (pgr
252デフォルトの名無しさん:2011/08/14(日) 11:14:56.40
粘着質きも
253デフォルトの名無しさん:2011/08/14(日) 11:46:50.67
早く夏休みなんて終わってしまえ
254デフォルトの名無しさん:2011/08/14(日) 14:47:48.46
オフでもネットでもキモがられて生きてて楽しいのだろうか
255デフォルトの名無しさん:2011/08/14(日) 15:24:56.86
>>246
>>247
>>251

忍者ハッタリ君 今日も大嘘ハッタリがバレるの巻
ttp://iup.2ch-library.com/i/i0391455-1313301826.jpg
ttp://iup.2ch-library.com/i/i0391454-1313301826.jpg
ttp://iup.2ch-library.com/i/i0391453-1313301826.jpg

さて、もう心残りはないだろう。
大嘘付きながら散々逃げ回ってこのスレに迷惑掛けた事をみんなに謝って
とっととC#スレに来い。

次回予告
今度はC#やってないのがバレちゃったよの巻
256デフォルトの名無しさん:2011/08/14(日) 15:47:33.01
ニンニン
257デフォルトの名無しさん:2011/08/14(日) 16:03:42.72
XMLを使ってwebページを直接ダウンロードすることってできますか?
258デフォルトの名無しさん:2011/08/14(日) 16:13:02.17
正確にはファイルに保存するところまでしたいです
259デフォルトの名無しさん:2011/08/14(日) 17:45:24.74
XMLを使うってのはどういう意味?
260デフォルトの名無しさん:2011/08/14(日) 18:29:47.53
ページの情報を読み込んでそれを保存するってことです
261デフォルトの名無しさん:2011/08/14(日) 20:08:08.40
>>255
まだやってたのか
お前のせいで
自殺者が出るんじゃないか?

今となっては>>251が痛々しいな
262デフォルトの名無しさん:2011/08/14(日) 21:25:57.02
>>260
それのどこにXMLを使うんだ?
263デフォルトの名無しさん:2011/08/14(日) 22:29:03.73
>>255
すごいな、この人。
> テキストファイルで一生懸命書いてコンパイルしてたりするの?
なんて豪語しながら、いまさらクラスダイアグラムを出してきたよ。
クラスダイアログラムだと、ロジック部はどうしてるのかなぁ?
当然テキストで一生懸命書いてないんだよね。まあ、書くほどのロジックがないのかな (w

# クラスダイアグラムは使ってるバージョン管理システムと相性悪いからマジで忘れてたわ。
# コード生成といってもクラス定義だけだから、たいして効率あがらないし。
# そもそもいまさら UML 以外でクラス図ってどうよ。
264デフォルトの名無しさん:2011/08/14(日) 22:31:53.74
>>263
お前もうやめといたら?
見苦しいしただの恥の上塗りだよ。
265デフォルトの名無しさん:2011/08/14(日) 22:34:11.43
>>255
> 散々逃げ回って

あれ? 散々逃げ回ってるのは、君でしょ?

>>216 の回答を書いてくれないかなぁ、VBA のスレなんだからみんなの役に立つと思うよ。

あと C# スレに来て欲しけりゃ、向こうでネタ振っとけ。

>>257
XML って、msxml のこと言ってるのか?

であれば、

http://www.f3.dion.ne.jp/~element/msaccess/AcTipsVbaXMLHTTP.html

とかかな。
266デフォルトの名無しさん:2011/08/14(日) 22:46:09.53
>>264
だね。オブジェクト指向言語はクラスの設計がキモで、基本となる所の
ひとつひとつのメソッドのロジックはそんなに長くなるもんじゃないし、
長く作る人はへたっぴだってJavaやってる先輩に聞いた事がある。
267デフォルトの名無しさん:2011/08/14(日) 22:56:12.36
このスレって、なんで俺より上位の奴が居ないの?
世間から見たら、俺なんか中の下か下の上くらいなのに
ここにはその下しか居ない
268デフォルトの名無しさん:2011/08/14(日) 23:06:39.57
>>265
ネタむこうで振ったら向こうの人が先に答えたりするし、
ネタ振ってもまたググって適当に答えられてのらりくらりと逃げられても意味ないでしょ?
だから前から言ってる>>241の通りでいいよハッタリ君。
どんどんボロが出て来るし、スレ違いでみんなに迷惑掛けるし、引き際も知らないし、本当に見苦しいねw
269デフォルトの名無しさん:2011/08/14(日) 23:10:46.13
>>267
うわぁ・・・
ハッタリもここまで来るとネタでもキモいね
270デフォルトの名無しさん:2011/08/14(日) 23:29:11.67
頭悪くてごめん、>>263の言い方だと、
上のバージョンだとクラス図の中にロジック部分のコードが書けたりするのか?
前からクラス図からコードが落とせるかってことが論点だったと思ってたから、
違ってるなら何で今頃と思ったんだが・・・
横槍ごめんな
271デフォルトの名無しさん:2011/08/14(日) 23:30:46.10
>>266
はいはい、短いからどうしたの?
書かないといけないのは変わらないだろ。
はぐらかしたい気持ちはわかるけど、それこそ「見苦しいしただの恥の上塗りだよ。」 (w
272デフォルトの名無しさん:2011/08/14(日) 23:43:35.43
>>268
>ネタむこうで振ったら向こうの人が先に答えたりするし、
>ネタ振ってもまたググって適当に答えられてのらりくらりと逃げられても意味ないでしょ?

結局どうしろと?

>だから前から言ってる>>241の通りでいいよハッタリ君。
>> 証明出来る様なコード書いて俺を納得させてくれよ。

書いても、ググったって言って、納得しないだろ?

そもそも C# の話なんてこのスレではどうでもいいから、>>216 に答えてよ。
それとも、まだ逃げ回るの?
273デフォルトの名無しさん:2011/08/14(日) 23:44:44.10
>>270
申し訳ない、俺も Ultimate は触ったことないので、実際のところはよくわからない。

ただ、今評価している IBM Rational Rhapsody なんかだと、クラス図 / 状態遷移図 から、
その状態遷移を実現するコードを自動生成できるし、そのコードがシーケンス図通り動くか
を検証できたりするので、Visual Studio でもそれに近いことはできるとのではないかと思う。

ソフトの種別によるけど、うちの会社がやっているような用途だと、ロジックの多くを状態遷
移図で表現できるので、それなりの効果が見込めると踏んでいる。

なお、細かいコードは、その状態遷移図の中に人手でのコーディングが必要。
274デフォルトの名無しさん:2011/08/14(日) 23:53:32.52
>>272
C#の話は元々、君がVBAから逃げる時に使うと言う話から起因しているからね。
いつもやってる通り普通に書いて
納得させてくれればいいんじゃないか?

>>272
>書いても、ググったって言って、納得しないだろ?

それは前科が有るから仕方ないよね。
275デフォルトの名無しさん:2011/08/14(日) 23:58:52.74
奴はUltimateじゃなくてUiltimateなら持ってるかもしれんぞ
自慢げに連呼してたからなw
276デフォルトの名無しさん:2011/08/15(月) 00:17:19.23
Accessのカレンダーコントロールを使ってる場合、Access2007ランタイム
ttp://www.microsoft.com/downloads/ja-jp/details.aspx?FamilyID=D9AE78D9-9DC6-4B38-9FA6-2C745A175AED
をインストールしてもらえばカレンダー機能が使えるようになるの?
277デフォルトの名無しさん:2011/08/15(月) 00:17:57.06
>>274
>いつもやってる通り普通に書いて
>納得させてくれればいいんじゃないか?

>>書いても、ググったって言って、納得しないだろ?

>それは前科が有るから仕方ないよね。

前科? はぁ、どこのことを言ってるのかレス番具体的に示してくれ。

あと、なんで C# の話はぐだぐだ書くのに、VBA の話である >>216 は無視するの?

>>275
>>247 に間違えたって書いてるんだから、許してくれよ。
278デフォルトの名無しさん:2011/08/15(月) 00:27:16.52
>>240-241
>>「MS」「SQL 使わない」「 C#/VB.net」とキーワードがあれば、"Linq" ぐらいは
>>知識としてあるだろ。

>平たく言うと、そのキーワードで今ググったって事だよね?
>そう言うのは知識とは言わないよね。

そう、知りもしないのにあんな豪語垂れてた訳だから、
ちゃんとC#で作ってるって証明してくれないとそれ以上の話はする気がしないと
前にも書いただろ?
記憶力無いの?
279デフォルトの名無しさん:2011/08/15(月) 00:53:29.07
>>278
>そう、知りもしないのにあんな豪語垂れてた訳だから、

C# で DB 使う奴なら、Linq の概要ぐらいいちいちググらなくても知ってると思ってたけど、
キーワードって書くと Google しか思いつかない奴もいることを学んだよ。(w

# て言うか、こんなことで人を前科者呼ばわりか。相変わらずすげー奴だな。

>ちゃんとC#で作ってるって証明してくれないとそれ以上の話はする気がしないと

だから、そんなお前に証明しようがないだろ?

できないこと言い続けて、>>216 をごまかす気なの?
280デフォルトの名無しさん:2011/08/15(月) 01:04:05.56
しかしIDなしコテなしでよくバトル出来るよな、こいつら

馬鹿が二匹しかいないからこそ、齟齬なく相互認識できるんだろうけど
281デフォルトの名無しさん:2011/08/15(月) 01:05:35.52
この煽り口調の馬鹿なんとかならないのか
はぁ・・未成年はネット禁止にするべきだって気持ち分かるわ・・
282デフォルトの名無しさん:2011/08/15(月) 01:08:35.16
>>279
>>232の前に事前にそのキーワードを出してましたってかwエスパーかよw
ほんっと見苦しいよな。

VBAで出来ない事が有ったらC#に逃げてたんだろ?
だったらその様に普通に書いて証明すればいいって何度も言わせるなよ。ボケ老人かよ。

それで証明出来れば>>216の話をしようって言ってるだろ?君が逃げなければ話は進行するんだよ。
283デフォルトの名無しさん:2011/08/15(月) 01:21:25.92
>>282
>だったらその様に普通に書いて証明すればいいって何度も言わせるなよ。

書いたらぐぐったというだけだろ?
それこそ何回も言わせるな。

>それで証明出来れば>>216の話をしようって言ってるだろ?

もういいよ、証明できないことを要求して、逃げるんだろ。

まあ、VBA のコンストラクタ (Class_Initialize) にパラメータを持てないことも知らずに、
VBA のクラス使いこなしてるなんて恥ずかしくて答えられないわな。
284デフォルトの名無しさん:2011/08/15(月) 01:22:23.85
でもさ、VBAやAPI呼び出しで
できなくてC#でできることって
どんなことがあるんだろ
285デフォルトの名無しさん:2011/08/15(月) 01:24:02.26
>>283
何だ、結局逃げたな
さすがハッタリ君だ
286デフォルトの名無しさん:2011/08/15(月) 01:28:53.16
>>284
VBAからも.NET FrameWorkの機能呼び出せるしな
287デフォルトの名無しさん:2011/08/15(月) 01:54:32.96
>>284
クラスに関して言えば、>>135 にも書いたけど、VBA のクラスは...

> 継承とコンストラクタにパラメータが渡せないのがきついからなぁ。

と思う。

言語仕様的には、Generic / 例外 とかかな。

>>285
はいはい、>>214 のハッタリにはかなわないけどね。(pgr
288デフォルトの名無しさん:2011/08/15(月) 02:48:56.94
>>255
死ねキチガイ
289デフォルトの名無しさん:2011/08/15(月) 02:54:23.06
>>265
msxmlのことでした
そのページのはソースを変数に格納してるんだけどそうじゃなくて

もうmsxmlじゃなくてもいいので
webページ丸ごとダウンロードして同じ階層ににあるhtってフォルダの中に保存したいです
拡張子はなんでも
290デフォルトの名無しさん:2011/08/15(月) 07:51:31.60
>>289
>そのページのはソースを変数に格納してるんだけどそうじゃなくて

変数の内容をファイルに格納することもできないレベルなのか... orz

>webページ丸ごと

Web ページって複数のファイルから構成されてることは知ってる?

msxml でなくてもいいなら、IE でやればいいんじないかな。
http://oshiete.goo.ne.jp/qa/4253824.html
291デフォルトの名無しさん:2011/08/15(月) 08:34:29.40
半端にプライドの高い馬鹿が延々と場違いな争いを繰り広げる夏休み
292デフォルトの名無しさん:2011/08/15(月) 08:44:25.87
>>216
本当にそんな大したことやってるわけじゃないんだけど、
来てみたら何でこんなに話が大きくなってるんだ?
俺、そんな変なこと書いたかな・・・。
>>233の人の
「その関数自体の引数で渡せないなら他にどんな渡し方がある?」
って言うフレーズから、この人との認識とは一致してるっぽいけど
ごめん、ヘタレだから怖くて答えられないやw
>>233の人には答えてもらって、俺の作りが変じゃないっていって欲しいけどね。
293デフォルトの名無しさん:2011/08/15(月) 09:28:11.88
GREEのコミュニティのトピックに自動書き込みできるVBAを組んでるんだけど、さっぱり分からん

<textarea name="thread_msg" rows="5" style="width:98%" cols="5000"></textarea>

ってのがフォーム部分のソースで

objIE.Document.all("thread_msg").Value = "入力するコメント"

って記述したら始めの2,3回はちゃんと動いたんだけど
その後に送信ボタンを押す記述を加えたらエラーで動かなくなって
追加した送信ボタンを押す記述を削除してもエラーで動かなくなっちまった。

そもそも記述が間違ってる?
294デフォルトの名無しさん:2011/08/15(月) 09:46:21.00
ステップインで一行一行実行するとSendMessageが送れるのに
普通に実行すると送れないってどういう事?
295デフォルトの名無しさん:2011/08/15(月) 09:52:20.75
いや、始めからツールバーにある再生ボタンを押して実行してたんだ。
始めはちゃんとフォームに文字がセットされたのに、今は何故かエラーで動かず。
296デフォルトの名無しさん:2011/08/15(月) 09:58:06.35
パソコン再起動したら再度エラーなしで動き出した
なんなんだ
297デフォルトの名無しさん:2011/08/15(月) 10:31:00.12
連投ごめん

なんかIEを再起動したらエラーが解決する事が分かったわ
起動済みIEを発見する記述に問題があったっぽい

スレ汚してすいませんでした
298デフォルトの名無しさん:2011/08/15(月) 13:50:54.41
>>292
大したことやってないし、認識も一致してるっぽいのに

具 体 的 に は な に も 書 か な い

もういいよ。
299デフォルトの名無しさん:2011/08/15(月) 15:09:13.18
どなたか>>294に答えてくだしゃー
300デフォルトの名無しさん:2011/08/15(月) 16:12:34.85
クラス必要無いって人がいるみたいだけど、カプセル化とか、オブジェクト自身がデータとメソッドを持ってるとか、
多態性(もどき)が使えることとかをメリットとしては見てないの?
301デフォルトの名無しさん:2011/08/15(月) 16:37:07.49
俺は必要ないとは思わないけど、そのメリットを認識していても
そのメリットを必要としていなければ、クラスも必要ないって話になるのでは?
302デフォルトの名無しさん:2011/08/15(月) 16:37:28.22
>>300
>クラス必要無いって人がいるみたいだけど、

そんなやついたっけ?
303デフォルトの名無しさん:2011/08/15(月) 16:45:05.32
>>302
ん、いないの?
詳しく読むのだるいので、ざっと読んで「クラスいらん」って人がいたと思ったので。
304デフォルトの名無しさん:2011/08/15(月) 16:49:12.46
>>301
> 俺は必要ないとは思わないけど、そのメリットを認識していても
> そのメリットを必要としていなければ、クラスも必要ないって話になるのでは?

え、そういう話だったの?
ただ単に自分がそのメリットを享受できるようなコンテキストに出会ってないだけって事か。
305デフォルトの名無しさん:2011/08/15(月) 17:41:54.74
まぁメリットデメリットを理解した上でクラスが不要というのはあり得る
vbaはエクセルに対してはメソッド程度の存在だからな
ただそれをどこまで理解しているかだな
306デフォルトの名無しさん:2011/08/15(月) 18:01:18.11
不要ということは、クラスモジュールがあるVBAという言語体系は、設計そのものがあやまりだったということ?
307デフォルトの名無しさん:2011/08/15(月) 18:06:58.07
>>305
> vbaはエクセルに対してはメソッド程度の存在だからな

そう?
上の方で出てきたのと似てるけど、VBAのクラスはEvent発行者になれたりする。
VB6でも同じ事ができて、かなり強力(いまだにVB6改造案件がかなりある)。
308デフォルトの名無しさん:2011/08/15(月) 18:19:46.94
つか、デフォルトで揃ってないデータ構造が必要なときは、良くクラス使うけど。
木構造とか、グラフ構造とか、スタックとかでもクラスのが楽。
309305:2011/08/15(月) 19:50:50.78
>>306
個人的にはあやまり、とは言いたくないです。私もお世話になった。
>>307
vb6は何だかんだでキュ雨力、でも嫌われれた
羨ましシイ
>>308
ベッの言語使ったほうがいいんじゃねか
310デフォルトの名無しさん:2011/08/15(月) 20:08:20.61
>>294
SendMessageの後にDoEventsとか入れてみたら?
SendMessageはメッセージュキューに積まないからそれでいけるか微妙だけど
311デフォルトの名無しさん:2011/08/15(月) 20:11:45.96
class使わなきゃCollectionに入れられないじゃん
312デフォルトの名無しさん:2011/08/15(月) 20:31:16.99
クラス要らない派ってもしかしてDictionaryとか自分で実装してんの?
Excel上のデータ管理するならDictionaryは必須だと思うけど
なんであるもの使わないかな
車輪の再発明好きか
バグ入り込みやすいし周りはやめて欲しいと思ってるんじゃない?
個人的にはTypeより使い勝手いいと思う
くだらない喧嘩でレス消費するのやめて本題の質問応答に戻ろう
ここはそういうスレだよ
313デフォルトの名無しさん:2011/08/15(月) 20:35:54.37
>くだらない喧嘩でレス消費
しへぇ
314デフォルトの名無しさん:2011/08/15(月) 21:06:48.89
>>312
>くだらない喧嘩でレス消費するのやめて

くだらない持論を披露するスレでもないよ。
315デフォルトの名無しさん:2011/08/15(月) 21:33:47.79
>>312
どういうクラス作ってるの?
Dictionaryとかはエクセルで実装してる範囲内では使ってるけど
わざわざクラスは作るまでもない
316デフォルトの名無しさん:2011/08/15(月) 21:35:31.65
c#の議論が終わったら今度はクラスの議論か。 w
317デフォルトの名無しさん:2011/08/15(月) 21:43:24.06
ところでなぜWordってみんなVBAを活用してないの?
できるとこはできるみたいなんだからもったいない。
318317:2011/08/15(月) 21:44:06.49
自分もやりたいけど大型書店にも「Word VBA」みたいな本が1冊もないからどうしようもない。
319デフォルトの名無しさん:2011/08/15(月) 21:47:36.22
>>317
wordって一回書式作ったらそうそう変えること無いしなぁ
むしろどういうふうに活用してるか教えて欲しい
320デフォルトの名無しさん:2011/08/15(月) 21:51:03.84
>>319
写真が大量(100以上)あって、
それを文章とともに作ってる書類がある。

文章を追加すると当然レイアウトがくずれる。
しかし例え文章を追加してもレイアウトを自動的に調整してくれるマクロが欲しい。
321デフォルトの名無しさん:2011/08/15(月) 22:05:13.82
>>320
くずれる、の崩れるがなぁ
100ぐらいなら手作業のほうが早いんじゃないかっていう
322デフォルトの名無しさん:2011/08/15(月) 22:10:31.46
じゃ500だ。
323デフォルトの名無しさん:2011/08/15(月) 22:19:28.93
じゃあってなんだよw
324デフォルトの名無しさん:2011/08/15(月) 22:23:27.48
楽だから増やせばいいとか
どこのブラックの上司だよ・・・
あれはちょっとトラウマだった
325デフォルトの名無しさん:2011/08/15(月) 22:43:53.37
Dim sry() As String
Dim server As String, ita As String, dat As String
Dim hdate As Variant
Dim y As Integer

Range("A:A").Clear

Set http = CreateObject("MSXML2.XMLHTTP")

server = "hibari.2ch.net"
ita = "tech"
dat = "1312435844"

http.Open "GET", "http://bg20.2ch.net/test/r.so/" & server & "/" & ita & "/" & dat & "/", False
http.Send

hdate = StrConv(http.ResponseBody, vbUnicode)

sry = Split(hdate, vbLf)
y = 1
For i = 0 To UBound(sry)
Cells(y, 1) = sry(i)
y = y + 1

Next i
Set http = Nothing

こんな感じにbg20.2ch.netからこのスレのdat?を取得してA列に表示する奴作ったんだけど
Excelを終了しないと取得したのが変わらない、どうしてだよ
326デフォルトの名無しさん:2011/08/15(月) 22:45:12.81
あと2chでインデントってどうやんの
327デフォルトの名無しさん:2011/08/15(月) 23:15:57.33
>>325
コード見てないけど、今朝鮮人のおかげでkamome鯖が落ちてる
鯖落ち対策とかしてるかの
328デフォルトの名無しさん:2011/08/15(月) 23:47:53.75
いや鯖は関係ないと思う
前から終了しないと最新のが取得できなかった
329デフォルトの名無しさん:2011/08/15(月) 23:51:05.00
っていうかちゃんとhibari.2ch.netとかからdatを取得してみたいんだけど
リクエストの飛ばし方とか差分取得がさっぱりだわ
330デフォルトの名無しさん:2011/08/16(火) 00:34:09.04
>>328
すまねぇ、この板だったな
http.Open "GET", "http://hibari.2ch.net/tech/dat/1312435844.dat", False
これじゃだめか?
むしろbg20とかどこの鯖かよくわかんねんだけど
331デフォルトの名無しさん:2011/08/16(火) 00:36:01.38
あと差分取得は
http://info.2ch.net/wiki/index.php?monazilla%2Fdevelop%2Faccess
のrangeがどーたら
俺も大昔vb.netで2chブラウザ作ったことあるが、
通信部分はまるまるコピペだったな
差分取得も面倒で実装しなかった
332 忍法帖【Lv=39,xxxPT】 :2011/08/16(火) 00:49:30.87
>>330
bg20はバーボンに掛からないからやってたんだけどそれが原因だったか
ってかこの鯖どういう仕組みなんだよ、ブラウザで更新したらちゃんと取得できてるのに
333デフォルトの名無しさん:2011/08/16(火) 01:19:39.14
http://bg20.2ch.net/test/r.so/hibari.2ch.net/tech/1312435844/dat
だと
短パンマン ★<><>2011/08/16 01:16:54 ID:TanpanM<>いろいろあるさ @bg r.so ver 2008/02/19<br>ERROR = 5656 <br>(e_mes = [888 buf=HTTP/1.1 302 Found]) <br> <>名古屋はエ〜エ〜で ♪
って返ってきてるね。302ってなんだっけ。なんでもいいや
>>326
ユニコードで半角スペースでいけたと思う
じゃなきゃ全角スペースが手っ取り早い
334デフォルトの名無しさん:2011/08/16(火) 01:23:25.70
最後datは要らない
335デフォルトの名無しさん:2011/08/16(火) 01:28:55.81
実は朝鮮人のVBA砲だった
336デフォルトの名無しさん:2011/08/16(火) 01:49:09.94
んなもんどこにでも落ちてまんがな
337デフォルトの名無しさん:2011/08/16(火) 08:03:38.86
>>332
なにが忍法帖だよこの野郎。
2chにどっぷりはまってそうでダサくてかっこ悪い。
338デフォルトの名無しさん:2011/08/16(火) 10:58:32.33
VBAのファイルって、単独で配布できるの?
339デフォルトの名無しさん:2011/08/16(火) 11:42:25.84
>>338
アドインにすれば配布できる。
340デフォルトの名無しさん:2011/08/16(火) 11:43:45.59
>>309
> ベッの言語使ったほうがいいんじゃねか
逆に聞くけど、木構造とかスタックとかが必要になったとき、態々別言語でそこだけ実装してんの?
341デフォルトの名無しさん:2011/08/16(火) 12:45:05.71
作ったマクロをショートカットで使えるようにしたく
試しにマクロの記録で作ったコードを見たら
' の注釈文の中に使用キーが書いてあったから
そこで設定するのかと思ったら
実はこれはあくまでも注釈であり
ここを変えても反映されないし自分が作成したマクロにそう書いても使用できない。
なので実際はわれわれの目に見えないところで
ショートカットキーが登録されているよう思われる。

どうやるの?
342デフォルトの名無しさん:2011/08/16(火) 13:19:13.11
>>341
Alt+F8->Option
343デフォルトの名無しさん:2011/08/16(火) 15:21:24.64
>>338-339
エクスポートすれば、アドインにしなくても単独で配布できる

つーか、アドインはVBAのファイル(モジュール)の単独配布では無いだろw
344デフォルトの名無しさん:2011/08/16(火) 15:26:20.25
.bas
345デフォルトの名無しさん:2011/08/16(火) 17:22:27.91
>>314
俺だけの持論てことはもしかして>>314
「単価、製造元」の情報を「製品名」をキーとして連想配列したい場合
自分で連想配列を実装しちゃうって事?効率悪すぎね?
俺なら
 Public 単価 As Long
 Public 製造元 As String
だけ定義したデータクラス作って商品名をキーにしてDictionaryに入れちゃうけど
346デフォルトの名無しさん:2011/08/16(火) 17:29:11.53
俺ならADODBを使う
347デフォルトの名無しさん:2011/08/16(火) 17:30:28.59
「持論」厨は相手にしない方が良いよ
348デフォルトの名無しさん:2011/08/16(火) 17:41:04.67
>>347という持論
349デフォルトの名無しさん:2011/08/16(火) 17:45:04.48
俺ならどこぞのシートに製品名、単価、製造元の列つくって書いとく
350デフォルトの名無しさん:2011/08/16(火) 17:50:18.92
で、毎回O(n)になると
351デフォルトの名無しさん:2011/08/16(火) 18:09:15.89
連想配列厨はワンオフのしょうもないクラスを作った

一方、>>349はワークシートに書き込んでVLOOKUPした
352デフォルトの名無しさん:2011/08/16(火) 18:14:54.74
353デフォルトの名無しさん:2011/08/16(火) 18:16:19.40
ケースバイケース。
実にくだらん。
354デフォルトの名無しさん:2011/08/16(火) 18:20:55.27
クラスに相当なコンプレックスを持ってる奴がいるな
355デフォルトの名無しさん:2011/08/16(火) 19:45:20.59
VBAのクラスの使い方さっぱりだわ
356デフォルトの名無しさん:2011/08/16(火) 20:18:28.03
変な質問ですみませんが
Sub a()
If Range("A1") = "あ" Or Range("A1") = "い" Then
MsgBox ("a")
Else
End If
End Sub
と、if文でorを使い複数条件を指定する時
If Range("A1") = "あ" Or "い" Then
では型が一致しません、と出てエラーになります。
いちいちRange("A1")を指定しないと駄目なのでしょうか?
357デフォルトの名無しさん:2011/08/16(火) 20:26:32.45
駄目
演算子の優先順位が理由
358デフォルトの名無しさん:2011/08/16(火) 20:31:28.11
そんなことより
Else
End If
これelseいらなくね?
359デフォルトの名無しさん:2011/08/16(火) 20:50:17.34
>>333のレスをコピーしてRange("A1")に貼り付けて
Range("B1") = Range("A1")
ってやったら#VALUE!ってセルに表示されて代入された値も#VALUE!なんですけどなんでですかね
360デフォルトの名無しさん:2011/08/16(火) 20:54:07.88
.valueつけたら表示されたわ
なんでこれ省略したらいかんのかね
361デフォルトの名無しさん:2011/08/16(火) 20:58:42.33
Rangeのデフォルトプロパティがvalueじゃないから
362デフォルトの名無しさん:2011/08/16(火) 21:00:39.90
デフォルトってValueじゃなかったっけ?
363デフォルトの名無しさん:2011/08/16(火) 21:49:54.94
Excelがやってる日付解釈関連の変な処理のバグだね
エラー2015
364デフォルトの名無しさん:2011/08/16(火) 22:23:45.24
>>345
>>314 ... 理由は >>353
365デフォルトの名無しさん:2011/08/16(火) 22:43:40.46
エクセルVBAを使ってWEBから数値を取ってきて貼り付けるってことはできませんかね?
366デフォルトの名無しさん:2011/08/16(火) 22:50:45.26
>>364
クラス使わないって言ったやつにこういう場合はクラス使うだろって例出しただけなんだけど
ケースバイケースなんて当然だろ
お前ずっとクラス使わないって豪語してるヤツだろ
攻撃されて悔しいからって重箱の隅突こうとして外しまくりで自分で空しくならない?
367デフォルトの名無しさん:2011/08/16(火) 23:01:56.75
VC++からExcelを操作するよりもVBAで書いた方がExcelのver違いによる
動作不良は起きにくいんでしょうか?

VC++からはタイプライブラリとか使用せずShellExecuteで
Excelを立ち上げる処理だけして後の処理はVBAに
任せるみたいな方法はver違い克服に有効?
368デフォルトの名無しさん:2011/08/16(火) 23:09:22.39
外部からだとWorkBookのOpenですら引数の個数違ったりするから色々調べたり結構めんどいと思う。
それと解放忘れでExcelプロセスがゾンビ化したりもあるからVC++等で使用する場合は注意が必要ですね。
やっぱりExcel+VBAでやった方が親和性的にもよろしいかと。
369デフォルトの名無しさん:2011/08/16(火) 23:27:21.98
C#の後はC++か・・・
その内ILとか出て来そうな勢いだな
370デフォルトの名無しさん:2011/08/16(火) 23:35:21.22
>>365
VBAで株価データを取ってくるなんて作業なら毎日やってる
371デフォルトの名無しさん:2011/08/16(火) 23:54:51.70
>>370
やりかたおしえて
372デフォルトの名無しさん:2011/08/17(水) 01:07:56.12
>>366
>クラス使わないって言ったやつに

そんなやついたか?

勝手に敵作って一人相撲乙。
373デフォルトの名無しさん:2011/08/17(水) 01:28:42.84
>>372
m9(^д^)
374デフォルトの名無しさん:2011/08/17(水) 05:12:05.81
連想配列厨はクラスを使う良い例が出せないセンスの無さを、
「クラスを意地でも使わないやつがいる!」
と脳内変換することで防衛機制を発動しているのです
375デフォルトの名無しさん:2011/08/17(水) 06:22:30.96
こいつ何にでも粘着するな
分かりやす
376デフォルトの名無しさん:2011/08/17(水) 07:29:20.37
こないだのハッタリ君とか呼ばれてた奴じゃね?
377デフォルトの名無しさん:2011/08/17(水) 08:47:36.44
呼ばれてたってか、お前ともう一人の馬鹿が暴れてただけだろw
378デフォルトの名無しさん:2011/08/17(水) 10:56:08.06
>>374
そもそも何で例なんか必要なんだ?
教えてもらわないとわからないのか?
お前、C#とかC++やJavaでクラス抽出できないの?
379デフォルトの名無しさん:2011/08/17(水) 11:01:25.80
クラスを作ってDictionaryにぶち込むって書いてた人がいたけど、それって毎回データをファイルから読んでるの?
VBAのクラスの生成コストがどんなもんか知らないけど、良く利用している人の感覚からすると速度ってどんなもんなの?
ケースバイケースなんだろうが、DBを毛嫌いする理由もないよな。Excelからじゃ使いにくいって考えかもしれないけど。
380デフォルトの名無しさん:2011/08/17(水) 11:06:58.87
>>379
もはや支離滅裂。
言いたいこと整理しろよ。
381デフォルトの名無しさん:2011/08/17(水) 11:34:13.66
>>379
なんでDBの話が出てくるのかわからないけど、木構造が必要になったときとかにクラスでデータ構造を
表現すると便利だよねって例がわからない?
382デフォルトの名無しさん:2011/08/17(水) 11:37:28.38
>>379
あ、それとDictionaryが便利なのは、ハッシュ構造だからだよ。
383デフォルトの名無しさん:2011/08/17(水) 12:22:02.83
連想配列厨がただ一匹暴れている微笑ましい光景はいいんだが、
いいかげん連投レスがうざいんでコテつけてくれないか>>380-382
384デフォルトの名無しさん:2011/08/17(水) 12:41:18.53
お前が付けろ
NGするから
385デフォルトの名無しさん:2011/08/17(水) 13:08:05.08
>>383
みんなは、お前一人が暴れてると思ってるよ。
386デフォルトの名無しさん:2011/08/17(水) 17:58:45.76
マクロで縦5〜497までの繰り返しで
Gが空白ならそのまま、何か入っていればA~Gを水色に染める
ってどうなりますか?
387デフォルトの名無しさん:2011/08/17(水) 18:26:47.72
>386
VBAじゃなくても、条件付書式ではどうですか?
388デフォルトの名無しさん:2011/08/17(水) 18:31:18.93
>>387
それでも大丈夫だと思います!
やり方わかりませんが・・・
389デフォルトの名無しさん:2011/08/17(水) 18:47:55.75
>>387
その枠だけは色を変えれる様になりました
ありがとうございます
390デフォルトの名無しさん:2011/08/17(水) 19:17:11.01
>386,389 今後は
Excel総合相談所 97
http://hibari.2ch.net/test/read.cgi/bsoft/1304307841/l50
で質問することをお勧めします。ついでに、他のセルの内容で条件付書式を設定するには
http://turedure.cocolog-nifty.com/log/2008/06/excel_e3d1.html あたりを参考にどうぞ
391390:2011/08/17(水) 19:20:32.36
こっちだった
Excel総合相談所 98
http://hibari.2ch.net/test/read.cgi/bsoft/1312896741/l50
392デフォルトの名無しさん:2011/08/17(水) 19:45:32.27
>>390,>>391
誘導から何からありがとうございます
393デフォルトの名無しさん:2011/08/17(水) 23:08:33.70
エクセル2007でwindowsXPです

ブックをセーブする時に時々
「共有違反のため保存されませんでした」
というエラーが出ました

ググッたら
校閲→ブックの共有→複数のユーザーによる同時編集と、ブックの結合を許可する
にチェックを入れればいいというのが見つかったので、そうしました。

それでいまのとこ「共有違反のため保存されませんでした」は出てません。

そしたら、今まで何年も問題無く使えてた自作のマクロを使おうとした時に
「このコマンドは、共有ファイルで実行することはできません」
と出て使えないんです。

で、ググッたら
「複数のユーザーが同時に編集する(ブックを結合する)」のチェックを外せばいい
という事でした。

結局どっちかを諦めるしかないんでしょうか?
394デフォルトの名無しさん:2011/08/17(水) 23:21:36.32
共有を外すっていう選択肢はないの?
395デフォルトの名無しさん:2011/08/17(水) 23:26:34.28
どっちも諦めたら考えてる手間が省けるよ
396デフォルトの名無しさん:2011/08/18(木) 00:29:45.08
>>394
共有を外すっていうのはどうすればいいんですか?
397デフォルトの名無しさん:2011/08/18(木) 01:24:48.93
ネットワーク上のファイルなのこれ
398393:2011/08/18(木) 01:32:29.68
>>397
いいえ。普通にHDにあるブックです
399デフォルトの名無しさん:2011/08/18(木) 01:37:56.65
>>393
>校閲→ブックの共有→複数のユーザーによる同時編集と、ブックの結合を許可する
>にチェックを入れればいいというのが見つかったので、そうしました。
まずこれ対処間違ってるから
Officeのバグなので「時々」出るくらいならそのままパッチを待ちましょう
400393:2011/08/18(木) 02:10:59.63
>>399
はい。ググった時にもバグという記述があって、とりあえずこれでいけるって書いてあったのでそうしてました。
これ間違ってたんですね。チェックはずします。

セーブ失敗するのは、たまになのでこのまま使います。
ありがとう。
401デフォルトの名無しさん:2011/08/18(木) 22:35:08.45
vbaでm4a(AAC)って再生できますか
402デフォルトの名無しさん:2011/08/18(木) 22:36:40.86
できます
403デフォルトの名無しさん:2011/08/18(木) 22:36:50.25
関連付けられているアプリを使ってっていうことなら出来る、、、、、、、、、、、ような気がするw
404デフォルトの名無しさん:2011/08/19(金) 00:10:45.97
A列だけを使って行がたくさんあるシートがあります。
これをメモ帳の形式(つまり拡張子txt)で文書として保存するには
どういうVBAを書けばいいでしょうか?
405デフォルトの名無しさん:2011/08/19(金) 00:14:26.26
Word VBAのスレがないからここで書くけど

WordのVBAって、マクロの自動記録の機能を使って研究しようと思ったら
マウスカーソルの下にテープのような小アイコンが出てきて
マクロに記録したい「右クリックで使用できる機能」や「文字を選択する機能」などが全く使えないじゃないか。
そのため研究すらできやしない。
これはどういうこと?
そもそもこれじゃなにも記録できないから自動記録の意味がないじゃん。
406デフォルトの名無しさん:2011/08/19(金) 01:25:03.16
右クリックがダメならメニューから使えばぁ?
407デフォルトの名無しさん:2011/08/19(金) 01:39:55.52
>>404
とりあえずマクロの記録
名前を付けて保存でテキスト選んで保存してみれ
408デフォルトの名無しさん:2011/08/19(金) 01:44:57.73
WordのVBAは腐ってるからないものと思ったほうがいいよ
409デフォルトの名無しさん:2011/08/20(土) 10:38:38.73
大文字小文字を区別してデータの個数を数えたいのですが、

関数なら
=SUMPRODUCT((EXACT(A1:A100,A100))*1)
と書く場合を

VBAで書くにはどうしたら良いのでしょうか?
(Application.WorksheetFunction.SumProductの使い方?)

.Formulaに関数を書くのではなく直接求める方法を教えて下さい。
よろしくお願いします。

OSはXP、EXCELのバージョンは2003です。
410デフォルトの名無しさん:2011/08/20(土) 16:04:49.67
"もしアクティブセルがB列にあるならアクティブセルに○と記入"

これのやり方お願いします
411デフォルトの名無しさん:2011/08/20(土) 17:30:56.91
間違ってても責任とらん


If ActiveCell.Column = 2 Then
ActiveCell.Value = "◯"
End If

412デフォルトの名無しさん:2011/08/20(土) 17:33:04.12
どうでもいいけどみんな最初は入門サイトとかでColumnWidthとかRowheightとかを先に覚えてから
後でColumnとかを知るよな
413デフォルトの名無しさん:2011/08/20(土) 19:17:31.90
>>411
どうも
414デフォルトの名無しさん:2011/08/20(土) 20:29:27.11
た〜くさんあるセルの文字列を連結して
それを別の1つのセルに入れたいんだけど
この場合はどの関数を使うの?
415デフォルトの名無しさん:2011/08/20(土) 21:02:24.48
>>414
CONCATENATE 関数だけど普通使わないかなぁ
& で いけるから
416413:2011/08/20(土) 21:10:35.86
>>415
=A1&A2&A3
程度ならいいけど
=A1&B1&C1&D1&E1&F1&G1&H1&I1&J1&K1&L1&M1&N1&O1&P1&Q1&R1&S1&T1&U1&V1&・・・・
とどんどん続く場合は?
417デフォルトの名無しさん:2011/08/20(土) 21:24:16.91
>>414
VBA 使うしかないみたい。
http://www.relief.jp/itnote/archives/001342.php
418デフォルトの名無しさん:2011/08/20(土) 21:27:39.63
>>414
>>2を256回読めば答えが出ると思うよ。
419デフォルトの名無しさん:2011/08/20(土) 21:33:05.07
For n = 1 to m
  str = str & Cells(1,n)
Next n

cells(2,1).Value = str

こんな感じじゃいかんのか?
420デフォルトの名無しさん:2011/08/20(土) 21:36:22.54
>>419
頑張ってVBAなんて使わなくてもできるだろ。
421デフォルトの名無しさん:2011/08/20(土) 21:36:48.27
419のをコピペしたらコンパイルエラーなるで
422デフォルトの名無しさん:2011/08/20(土) 21:42:05.90
>>421
当たり前だろ。全部答え乗せる馬鹿いるかよw
423デフォルトの名無しさん:2011/08/20(土) 21:46:27.05
Function link(myRng As Range) As String

Dim n As Object
Dim x As String

For Each n In myRng
x = x & n.Value
Next n

link = x

End Function

これ標準フォームに貼ってセルには
=link(範囲)
これで連結されるはず
424デフォルトの名無しさん:2011/08/20(土) 22:15:10.90
VBAで
指定したフォルダ内の全ファイルのファイル名を
A列に1列にならべるにはどうすればいいですか?
425デフォルトの名無しさん:2011/08/20(土) 22:18:49.34
>>424
>>2
426デフォルトの名無しさん:2011/08/20(土) 22:40:34.21
指定フォルダ内の全ファイルを
A列に1列にならべるにはどうすればいい?
427デフォルトの名無しさん:2011/08/20(土) 22:49:45.48
>>426
VBAで書けば出来るよw
428デフォルトの名無しさん:2011/08/20(土) 22:51:17.75
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_080.html
ここ見て理解できなかったらあきらめたほうがいい
429デフォルトの名無しさん:2011/08/20(土) 22:53:16.29
>>426
cd 指定フォルダ
dir /a-d /b > temp.txt

temp.txt を Excel で読む。
430デフォルトの名無しさん:2011/08/20(土) 23:25:37.00
VBAに限らず、CやJava含めたプログラミングにあたり、
変数は、値渡し、参照渡し、矢切りの渡し、
どれをメインに使っていくのが得策でしょうか?
431430:2011/08/20(土) 23:26:40.37
変数のスコープのような「できるだけローカル変数にしたほうがいい」みたいな指針はありますか?
432デフォルトの名無しさん:2011/08/20(土) 23:54:40.60
>>430
ケースバイケース

>>431
スコープは可能な限り狭い方がいい。
人が理解できる範囲は限られているから。
433デフォルトの名無しさん:2011/08/20(土) 23:58:05.20
>>430
変数の値渡し、参照渡し、矢切の渡しは用途に応じて使い分けるもんでしょ。
ユーザインターフェースに関係ないところは全てローカル変数なんじゃないの?
因みにC言語には参照渡しなんて無いから。

これ以上はスレチになるんでやめとく。
434デフォルトの名無しさん:2011/08/21(日) 00:33:43.61
スコープを小さくする、が基本
グローバル変数よりも、モジュール変数、できればローカル変数で。
可能なら値渡しをつかう。
435デフォルトの名無しさん:2011/08/21(日) 08:03:41.75
矢切の渡しはどういうときに使いますか?
436デフォルトの名無しさん:2011/08/21(日) 10:15:16.51
江戸川を渡りたい時
437デフォルトの名無しさん:2011/08/21(日) 10:26:31.54
>>436
とおっしゃいますと、矢切とは江戸川のこと?
438 忍法帖【Lv=1,xxxP】 :2011/08/21(日) 22:15:27.68
>>437
Cells(3, i).Select
ActiveCell.FormulaR1C1 = "=RC[-52] - RC[-6]"

RC[-6]を絶対パスにはせずに固定する方法ってありますか?
439デフォルトの名無しさん:2011/08/22(月) 01:35:02.07
440デフォルトの名無しさん:2011/08/22(月) 01:36:19.74
RC使うよりoffsetじゃいかんのか?
441 忍法帖【Lv=1,xxxP】 :2011/08/22(月) 03:08:35.67
セルに式が入っていればなんでもいいです。オートフィルしたいので。
変数を使って書き直してみたんですがダメでした。最後のセルだけちゃんとなってたんですが
Cells(3, i).FormulaR1C1 = "=RC[-52] - RC[" & -変数 & "]"

>>439わざわざ貼ってもらってありがとうございます。でも解決できなかったです。

あと>>438のアンカーはミスです;
442デフォルトの名無しさん:2011/08/22(月) 07:04:40.08
>>441
>>439だと固定にするには[]を外せば絶対参照になるって書いてある。
何でそのようになっていない?
443デフォルトの名無しさん:2011/08/22(月) 07:26:33.63
javascriptではグローバル変数はローカルに代入してから使ったほうが速いって聞いたんだけどVBはどうなの
444デフォルトの名無しさん:2011/08/22(月) 14:43:54.88
>>441
なんで絶対参照でダメなのか解らんが
相対参照でやりたいなら、自分で目的セルまでの相対的な位置を計算すればいいんじゃね
445デフォルトの名無しさん:2011/08/22(月) 16:53:12.32
再計算方法を特定のシートだけ自動計算、ほかは手動計算にする方法はありますか?
446デフォルトの名無しさん:2011/08/22(月) 16:55:54.88
>>445
Workbook_SheetActivateで切り替え
447デフォルトの名無しさん:2011/08/22(月) 17:02:41.38
>>446
わからないんでちょっとだけ書いてもらえませんか?
448デフォルトの名無しさん:2011/08/22(月) 17:31:54.08
>>445-446
特定のシートから他のシートを参照していたりするケースを考えると、無理じゃね?
449デフォルトの名無しさん:2011/08/23(火) 14:29:20.37
>>445が無理なら
bookの設定を手動計算にして、VBAで再計算させるときSheet1以外を再計算させる方法ありますか?
450デフォルトの名無しさん:2011/08/23(火) 18:50:37.73
>449
なぜ、一部のシートだけ自動再計算を止めたいの?
値を変えたくなかったら、コピーして値貼り付けすればいいんじゃないの?
451デフォルトの名無しさん:2011/08/23(火) 19:25:23.67
解決したんでもういいです
452デフォルトの名無しさん:2011/08/23(火) 19:27:10.84
(#^ω^)
453デフォルトの名無しさん:2011/08/23(火) 19:40:59.01
ていうか>>450を聞く必要あった?
>>449を聞いてんだろ
454デフォルトの名無しさん:2011/08/23(火) 23:39:41.78
マイクロソフト、次期Officeではスクリプト言語にJavaScriptを採用か?
ttp://www.publickey1.jp/blog/11/officejavascript.html
455デフォルトの名無しさん:2011/08/24(水) 00:37:46.73
>453
なぜそれを聞く必要があった?
456デフォルトの名無しさん:2011/08/24(水) 01:08:27.65
>>455
お前もな
はいキリがないからこれで終わり
457デフォルトの名無しさん:2011/08/24(水) 10:03:13.70
ユーザーフォームにオプションボタンを2個置いてiniファイルで状態記憶させています。
iniファイルが無い状態で実行した時は、オプションボタンAのValueをTrueに、オプションボタンBの
ValueをFalseにするようにしています。
この時オプションボタンAのチェックする所がグレーになってしまいます。
オプションボタンAのキャプション部分をクリックすればきちんと表示されます。
iniファイルから状態を読み込んだ時は正常に表示されます。

iniファイルが無い状態で起動させた時もグレーにさせないようにするにはどうしたらいいでしょうか?
iniファイルの読み込みは下記のように書いています。

RC = GetPrivateProfileString(FormData, "optionA", "Ture", buf, Len(buf), iniFile)
UserForm1.optionA.Value = Left$(buf, InStr(buf, vbNullChar) - 1)

RC = GetPrivateProfileString(FormData, "optionB", "False", buf, Len(buf), iniFile)
UserForm1.optionB.Value = Left$(buf, InStr(buf, vbNullChar) - 1)
458デフォルトの名無しさん:2011/08/24(水) 10:40:34.43
多分 "Ture" のせい
459457:2011/08/24(水) 11:25:06.07
>>458
まさにそれでした。
ありがとうございました。
460デフォルトの名無しさん:2011/08/25(木) 20:50:14.60
Word VBAのスレがないのでここで質問です。
文書があります。
段落が50個くらいあります(Wordの定義の段落ではなく、世間一般の段落。)。
写真が200枚くらいあります。
写真は必ずどこかの段落に属していて、各段落は0個〜10個くらいの写真を支配下に置いてあります。
段落の文章は追加したり構成したりで、長くなったり短くなったりします。
そこでマクロの登場。
文章の長さが変わっても、自動で写真がレイアウトされるようなマクロは作れますか?
レイアウトは人工知能のように勝手に見た目よく配置されるような仕様にしたいです。
461457:2011/08/25(木) 22:03:31.55
Boolで書くのと、0,1で書く場合の区別って何でしょうか?
オブジェクトインスペクタではチェックの状態はBool値になっているのでTrueとか書いたのですが。
462デフォルトの名無しさん:2011/08/25(木) 22:31:07.28
>>457
BoolはTrueかFalseしか値を取れない。
0,1はIntegerだから、2値以上扱う場合に使用できる。

簡単な例だけど、
関数の成功、失敗だけの返却値が欲しいのならBool。
関数の失敗を詳しく返すのであればIntegerにするとかかな。
463デフォルトの名無しさん:2011/08/25(木) 23:10:22.22
>>460
Word 捨てて、TeX とか DocBook とか使え。
464デフォルトの名無しさん:2011/08/25(木) 23:12:44.66
>>462
言ってることよく分からないけど解決してるんでもういいです。
465デフォルトの名無しさん:2011/08/25(木) 23:42:31.77
Cells(1, 1).fomula = "=" & 値段 & "* 130"
と上記のようにセルに式を入力したいのですが
オブジェクトは、このプロパティまたはメソッドをサポートしていません。
と表示され上手くいきません。
この場合どのようにすれば上手くいきますか?
よろしくお願いします。
466デフォルトの名無しさん:2011/08/25(木) 23:45:04.81
>>460
見た目良くという仕様をまずは一意に解釈出来るように定義しよう。
それさえ出来れば後は作業に過ぎないし、それが出来ないなら話にならない。
467デフォルトの名無しさん:2011/08/25(木) 23:50:16.58
>>462
457の質問をよく嫁
468デフォルトの名無しさん:2011/08/25(木) 23:52:30.30
>>465
抜粋した記述なのか否か分からなかったけど、
Range("a1").Cells(1,1).Formula=〜
みたいに、Rangeオブジェクトにぶら下げる形で書いても駄目?
469デフォルトの名無しさん:2011/08/26(金) 12:46:27.97
>465
* と 130 の間に半角のスペースがありますが、これのせい?
値段 という変数には何が入っているの?
470デフォルトの名無しさん:2011/08/26(金) 12:46:35.33
>>465
これ スペルミスだろ
X fomula
〇 Formula
471デフォルトの名無しさん:2011/08/26(金) 14:02:33.98
h
472デフォルトの名無しさん:2011/08/26(金) 16:48:19.93
セルのChangeイベントって100個とか200個とか複数のセルが
一気に書き換わっても追従する?
473デフォルトの名無しさん:2011/08/26(金) 18:21:17.38
>>472
なんで試さないの?
474デフォルトの名無しさん:2011/08/26(金) 18:31:53.53
そんな事書いてる暇があったら答えろカス
475デフォルトの名無しさん:2011/08/26(金) 19:10:57.65
そんな事書いてる暇があったら試せカス
476デフォルトの名無しさん:2011/08/26(金) 19:20:03.57
やだ
477デフォルトの名無しさん:2011/08/26(金) 23:35:00.69
For Each c In Selection
Select Case c.Value
Case "1"
c.Interior.ColorIndex = 7
こんな感じでセルの値によって別のセルの値を入れるにはどうすればいいでしょうか。
置換だと時間がかかったのでこっちで処理したいのですが
c.value = cells(tate,yoko).value では動いてくれません。
478デフォルトの名無しさん:2011/08/26(金) 23:46:47.96
c.value = cells(tate,yoko).value
でいいと思うけど型違うとか?
479デフォルトの名無しさん:2011/08/26(金) 23:47:40.73
>>477
セルの値によって別のセルの値を代入すればいいんじゃね?
480デフォルトの名無しさん:2011/08/26(金) 23:53:00.67
>>478
Longではだめですか?
>>479
selectcaseを使わないでもっと簡単にできる方法がありましたら是非教えてください
481デフォルトの名無しさん:2011/08/27(土) 00:20:43.79
""で囲ったらstringになるんじゃかったっけ?
482デフォルトの名無しさん:2011/08/27(土) 06:40:27.93
> c.value = cells(tate,yoko).value
が動かないのではなく、条件分岐が不適切で、そもそもそのコードが実行すらされていないのでは?
>>481も言ってるが、「case 1」と「case "1"」は別物
セルに「1」と入れたら前者には一致するが、後者には一致しない
セルに「="1"」とか「'1」と入れたら後者に一致する

特定行のコードが実行されているか否かは、ステップ実行やブレイクポイントを使えば、
バカでも簡単に確認出来ることなので、PC初心者板ならまだしも、プログラム技術板に
来る奴がその程度の初歩的な確認すらしてないなんてことは無いと思いたいが
ここにも偶にプログラム技術板ではなくPC初心者板が相応しいようなバカが迷い込むからなぁ

因みに、Select CaseよりはIfの方が僅かに速いぞ
「簡単に」と簡単に言ってくれるが、「簡単」の定義を明確に書かないと、実行の簡単さ(速さ)なのか、
コードを書く上での簡単さ(コード量の少なさ)なのか、コードを読む上での簡単さ(可読性)なのか、
何を求めているのか解らないし、具体的な分岐条件も書かれていないのでは尚更答えようが無い
分岐条件によってはコピー元のセル行列を演算やChoose、Iif、Arrayなどを使って求め、条件分岐自体を
廃することも可能だが、不特定の条件に万能に対応出来る方法となるとIfとSelect Caseしか答えようがないからなぁ
483デフォルトの名無しさん:2011/08/27(土) 08:43:13.00
うわ偉そうなうっとおしい長文回答
484デフォルトの名無しさん:2011/08/27(土) 09:44:33.74
無能の遠吠えを聞いた気がする
485デフォルトの名無しさん:2011/08/27(土) 12:10:39.07
select caseもifもコンパイルで最適化されるんじゃないの
486デフォルトの名無しさん:2011/08/27(土) 15:29:57.23
>>482
とりあえずはっきりした間違いだけ指摘しとく
>セルに「1」と入れたら前者には一致するが、後者には一致しない
これは間違い
暗黙の型変換によって両者に一致するぞ

仮にもVBAのスレッドにいるプログラム技術者が暗黙の型変換わからんとか言うなよ
487デフォルトの名無しさん:2011/08/27(土) 22:25:06.14
セル範囲のデータを取得してXMLに出力するプログラムを作成しています。
各要素の前後にLF改行を入れるため
Call AAA_node.appendChild(xmlDoc.createTextNode(vbLf))
としているのですが、作成されたXMLをEmEditorなどの改行コードを区別して表示できるエディタで確認すると
CRLFで改行されています。
XMLに出力される改行コードをLFにしたいのですがどうすればよいでしょうか?
488デフォルトの名無しさん:2011/08/28(日) 00:12:31.54
いろいろ試せばいいんじゃないの
489デフォルトの名無しさん:2011/08/28(日) 00:38:33.56
>>487
エディタ側で気を利かせて改行文字を勝手に変換してるオチは無い?
変換してるのが、エディタかVBAか切り分けるため、
ファイルのバイナリをチェックしてみては?
490デフォルトの名無しさん:2011/08/28(日) 00:40:39.10
ごめん、ボケてエディタの種類見落としてた…ちと吊ってくる
491487:2011/08/28(日) 02:01:11.21
一旦作成したXMLをOpenAsTextStreamで開き
Replace(text, vbCrLf, vbLf)して再度保存するという方法に逃げました。。
492デフォルトの名無しさん:2011/08/28(日) 06:05:02.79
>>487
バイナリエディタでチェックせずに対策しちゃったのか?
バイナリデータでどんな値が入っているか確認しないで結論出せるとは天才だな。
493デフォルトの名無しさん:2011/08/28(日) 06:35:50.28
そもそも XML なのに改行コード云々ってどういう環境なんだろう?
494デフォルトの名無しさん:2011/08/28(日) 06:45:07.09
>>493
セルのデータだからじゃないの?
セルの中の改行はLFだから。
495デフォルトの名無しさん:2011/08/28(日) 09:30:56.34
楽天証券が配布してるツールでエクセルのアドオンでRSSって言うのがあります。
セルに =RSS|'9501.T'!現在値 (9501は東京電力の株価コード)と書くと東電の株価がセルに表示されます。

これをVBAで kabuka = RSS|'9501.T'!現在値みたいに直接扱うにはどうしたらいいでしょうか?
現在は Cells(1,1) = "=RSS|'9501.T'!現在値" みたいに一旦セルに記入させてから値を取得しています。
環境はXP、エクセルは2003です。
よろしくお願いします。
496デフォルトの名無しさん:2011/08/28(日) 11:08:31.82
>>494
「改行」を保存するんじゃなくて
「改行コード」のコードを保存したいなら、テキストで保存しちゃダメだな

>>495
そのアドオンの仕様がわからんので答えられません
楽天証券に聞いてください
497デフォルトの名無しさん:2011/08/28(日) 11:44:23.07
アドオンなら中見えないの?
498495:2011/08/28(日) 12:37:48.35
今、中身見たけどサパーリ分かりません。
499デフォルトの名無しさん:2011/08/28(日) 14:58:36.68
思い通りに動くならどんなやり方でもいいんじゃないの
アドオンの関数使ってCalculateして値とればいいじゃない
500デフォルトの名無しさん:2011/08/28(日) 16:13:07.78
>>496
セルの内容をXMLファイルに吐き出すVBAを作ったことがある。
セルの内容をString型の変数に保存するだけで問題なくXMLに登録できたし、
XMLファイルから文字列として取り出しても普通に改行コードはそのままだったよ。
普通セルのデータならString型の変数に格納するんじゃないの?

テキストで保存っていうのはどこから出てきた話なのかな?
501デフォルトの名無しさん:2011/08/28(日) 16:26:22.19
すみません。
ファイル書き出しについて、ファイル名に選択セル内の文字列を引用する場合はどのように書けばよいでしょうか?

選択セル内に"123"とあれば、123.txt を保存など
strFileName = "C:\temp\***.txt"

502デフォルトの名無しさん:2011/08/28(日) 19:00:25.65
"C:\temp\" & Cells(i,j) & ".txt"

503デフォルトの名無しさん:2011/08/28(日) 19:40:07.85
>>500
>>487です。実際のところCRLFでもLFでも特に問題ないんですが
W3Cの勧告に以下のようにあるのでLFで保存しておいたほうが良いのかなと思ったんです。
http://www.y-adagio.com/public/standards/xml/xmlmain.htm#sec-line-ends
504デフォルトの名無しさん:2011/08/28(日) 19:59:57.21
>>503
そこをどう読んでもXMLファイルの改行コードはLFにすべきと読めないんだが。
505デフォルトの名無しさん:2011/08/28(日) 20:25:27.86
そうですか。全く違う意味だったんですね。失礼しました
506デフォルトの名無しさん:2011/08/29(月) 00:13:41.77
>>502
>>2を声を出して1億回読め。
お前のようなやつがいるから、小学生でも分かるような内容を質問してくるヤツがつけあがるんだろ。

>>505
本当に理解してるのか怪しいね。
どこをどう理解したんだ?
だれかが「LFにすべきだろ」と言い出したらどうするの?
507デフォルトの名無しさん:2011/08/29(月) 00:47:35.93
自己満足のために蒸し返すなよ
508デフォルトの名無しさん:2011/08/29(月) 06:17:18.03
>>507
蒸し返されても仕方ない書き込みのほうが問題だろ。
509デフォルトの名無しさん:2011/08/29(月) 07:05:13.52
問題を作る能力に長けてますね
510デフォルトの名無しさん:2011/08/29(月) 07:29:28.95
なぜそこまで粘着するのかようわからんが、もうええやんw
511デフォルトの名無しさん:2011/08/29(月) 14:03:26.48
セルのチェンジイベントに関して教えて下さい。
セルにキーボードから入力した場合はチェンジイベントが発生するのですが、
たとえばA1からA10までの集計をSUMでA11に表示する場合、A11ではイベントが発生しません。
セルの表面上の値が変わった時に発生するイベントを教えて下さい。
512デフォルトの名無しさん:2011/08/29(月) 14:33:57.88
だから、うだうだ言う前に書いたコードを晒せ
513デフォルトの名無しさん:2011/08/29(月) 14:49:25.52
>>511
A11 の値をどこかに覚えておいて、Calculate イベントで更新されたことを
見る方法しか思いつかない。
514デフォルトの名無しさん:2011/08/29(月) 14:58:03.89
>>513
ありがとうございます。
ググっていてcalculateイベントにたどり着きました。
それで、改めて質問をしたいのですが、
自分のやりたい事は、このcalculateイベントが起きたセルによって
処理を変えたいので、どこのセルで起きたかを知る方法です。
よろしくお願いします。
515デフォルトの名無しさん:2011/08/29(月) 15:09:08.17
>>513さんの具体的なサンプルをググったらありました。
513さんの言われるように監視用のシートを作ったりする必要が有るみたいです。
ありがとうございました。
516デフォルトの名無しさん:2011/08/29(月) 16:43:31.33
>>514
計算式にユーザ定義関数を使うってのは?
517デフォルトの名無しさん:2011/08/29(月) 17:27:53.31
>>516
ユーザー定義関数は今ググって調べました。
しかし、中身をどうすればいいかが分からないです。
せっかくレスくれたのに、申し訳ない。
518デフォルトの名無しさん:2011/08/29(月) 17:39:37.92
>>517
セル位置によってどう処理を変えたいのか詳しく説明すれば、
だれかが適切な内容を考えてくれるさ
519デフォルトの名無しさん:2011/08/29(月) 17:48:03.17
VBEに

function hoge(a as nanka)
//shori
hoge = hage
end function

=hoge()
520デフォルトの名無しさん:2011/08/29(月) 18:02:10.54
>>518
レス、ありがとうございます。
お言葉に甘えて状況を書きます。

5枚のシートが有り、それぞれA列からE列、100行使います。
E1〜E100まではサーバーから勝手に数字が入ってきます。(この部分は業者が作ってくれた)
やりたい事なのですが、E1からE10、E11からE20と言う感じでグループとして、
どのグループのデータが変更されたかで、その変更されたグループに色を付けたいのです。

E1からE10のどれかが変更されたら赤、次にE41からE50が変わったら、赤を消してE41からE50を
赤(別の色でも良いですけど)みたいにしたいのです。

数字の合計がいくつ以上とかなら、calculateイベントの度に計算すればいいのですが、
どこが変わったのかなので>>514さんのレスのように何処かに記憶させて比較するしかないのかと
思いました。

よろしくお願いします。
521デフォルトの名無しさん:2011/08/29(月) 18:02:41.83
つーかさ、ChangeイベントでA1:A10を見ればいいだけじゃん

A11の【内容】は「=SUM(A1:A10)」であり、A1:A10に変更があってA11の【表示】が変わっても
A11の【内容】は「=SUM(A1:A10)」のまま変わらないのだから、
セルの【内容】が変更されたときに起こるChangeイベントがA11で発生しないのは当然のこと

しかし、A11の【表示】が変更されると言うことは、A11が参照しているA1:A10の【内容】が変更されて
いるわけだから、A1:A10側ではChangeイベントが発生する
つまり、A1:A10の【内容】変更を監視すれば、A11の【表示】変更を取得できるというわけだ
522デフォルトの名無しさん:2011/08/29(月) 18:06:21.00
>>519
リロードしていませんでした。
どう応用できるか、考えます。
ありがとうございます。
523デフォルトの名無しさん:2011/08/29(月) 18:09:05.48
>>521
> セルの【内容】が変更されたときに起こるChangeイベントがA11で発生しないのは当然のこと
すみません。
自分の知りたい事を強調しようと思って書いた例でした。
524デフォルトの名無しさん:2011/08/29(月) 18:16:40.57
>>520
それ、セルの値が変わったかどうかが問題で、計算式関係ないじゃないか

一番の解決方法は、E列を設定するその業者に、値が変わったら色変えてくださいって頼め
525デフォルトの名無しさん:2011/08/29(月) 18:17:41.48
>>524
ガ━━(゚Д゚;)━━━ン!!!!!
526デフォルトの名無しさん:2011/08/29(月) 18:20:15.85
>>517
>しかし、中身をどうすればいいかが分からないです。

>>511 の例だと、標準モジュールに

Public Function Hoge(R As Range) as Variant
MsgBox "A11 が変わったよ。"
A11 = Application.WorksheetFunction.Sum(R)
End Function

って書いといて、シートの A11 に "=Hoge(A1:A10)" と入力する。
527デフォルトの名無しさん:2011/08/29(月) 18:23:01.49
>>520
>E1〜E100まではサーバーから勝手に数字が入ってきます。(この部分は業者が作ってくれた)

Excel だよね?
ブックの共有でもやってるの?
528デフォルトの名無しさん:2011/08/29(月) 18:34:48.82
>>526
なるほど。
分かりました。応用できます。

>>527
サーバーとのやり取りをしています。
中身は分かりませんが、サーバーからデータを取ってきて数字によって
E列の何処かに値を書き込む感じです。

ありがとうございました。
529デフォルトの名無しさん:2011/08/29(月) 18:54:42.37
VBAやってて面白いと思うときってfunctionとシートやり取りしてるときだよな
なんか関数を司ってる気がする
530デフォルトの名無しさん:2011/08/29(月) 22:45:42.34
>>529
もうすこしくわしくおしえてくださらんか?
531デフォルトの名無しさん:2011/08/29(月) 23:51:12.20
>>529
普段プログラミングしてない子?
532デフォルトの名無しさん:2011/08/30(火) 00:16:25.64
してない子の方が圧倒的に多いし
533デフォルトの名無しさん:2011/08/30(火) 03:11:35.59
友達より早く
534デフォルトの名無しさん:2011/08/30(火) 07:21:30.31
ListBoxのColumnCountいじると高さが変わるのってなんで?
535デフォルトの名無しさん:2011/08/30(火) 08:44:25.56
Worksheets("MAIN").Cells(2, 2)にフォルダを書いておいて実行したんですが

With Worksheets("MAIN")
If Dir(.Cells(2, 2), vbDirectory) = "" Then ←
MsgBox "指定したフォルダが見つかりません。"
Exit Sub
End If
End With

矢印の部分で「型が一致しません」って出るんですけどDir関数って
引数 pathname に指定した内容が見つからないときは、長さ 0 の文字列 (" ") を返します
ってヘルプにあるのにどうして?
536デフォルトの名無しさん:2011/08/30(火) 08:51:18.36
Dirの第一引数の型ってRangeでもいいの?
537デフォルトの名無しさん:2011/08/30(火) 09:04:59.23
>>536

そちらの方だったのか。。。
Cells(2,2)には d:\test と書いておいたんで文字列だと思ってたんですけど

If Dir(CStr(.Cells(2, 2)), vbDirectory) = "" Then

と訂正しました

ありがとうございました
538デフォルトの名無しさん:2011/08/30(火) 09:46:07.76
.value
これは?
539デフォルトの名無しさん:2011/08/30(火) 18:13:47.19
Excel97という古いExcelですが分かる方 よろしくお願いします。

画像&オートシェイブ複数を グループ化した状態で
グループ内の 特定オートシェイブのテキストを変更したいと思い
以下のコードを書きましたが

 実行時エラー '1004'
 Characters クラスの Textプロパティを設定できません。

となってしまいます。
グループ化した状態では変更できないのでしょうか?

 Dim CapText As String
 Dim AddText As String
 Dim ThisShape1 As Shape

 AddText = "HogeHoge"

 For Each ThisShape1 In ActiveSheet.Shapes("Target-Img2").GroupItems
  If (ThisShape1.Type = msoAutoShape) And _
    (ThisShape1.Name Like "*-[FB][BHP]-Frame") Then
      CapText = ThisShape1.TextFrame.Characters.Text
      CapText = CapText & "(" & AddText & ")"
      ThisShape1.TextFrame.Characters.Text = CapText '<---ここでエラー
  End If
 Next
540デフォルトの名無しさん:2011/08/30(火) 20:41:29.32
Excel2007/2010でマクロを実行し、処理対象のブックを97-2003形式で保存したいのですが、
SaveAsのFileFormatにはxlWorkbookNormalとxlExcel8のどちらを指定すればよいでしょうか?
どちらで試しても97-2003形式で正常に保存されているような気がします。
xlExcel8はExcel2003以前だとサポートされていないということは知っていますが、他に違いはあるのでしょうか?
541デフォルトの名無しさん:2011/08/30(火) 20:59:17.01
>>538

遅くなってすんませんでした。それでもOKでした。どうもm(_ _)m
542デフォルトの名無しさん:2011/08/31(水) 00:19:16.41
>>539
これグループ化した時点でShapeが書き換え不可になるんじゃないの?
543539:2011/08/31(水) 01:41:31.87
>>542
やはり書き換え不可になるのですかね

別の処理なんですが
特定Shapeを 非表示(Visible = False) には出来たので
テキストの変更もできそうだと思ったのですが.....
一旦グループ解除するしかないのかな

レスありがとうこざいました。
544デフォルトの名無しさん:2011/08/31(水) 10:50:30.71
>>526への便乗質問なんですが、
プロシージャの引数でセルを1つだけの指定にさせるにはどうすればいいのでしょうか?
Rangeだと範囲が指定できてしまいますので、セル1つだけに制限したいのです。
Cellsってやったら怒られました。
545デフォルトの名無しさん:2011/08/31(水) 11:12:16.83
VBAでWEBページにある画像をまとめて取得することはできますか?

例えばこのページにある
http://www2.anzen.mofa.go.jp/info/pcmap.asp?id=125&infocode=2011T041&filetype=1&fileno=1

このような国の危険情報の画像
http://www.anzen.mofa.go.jp/attached2/2011T041_1.gif

を、このサイトに存在する世界の国の数だけ集めてExcelシートに貼り付けたいんです。
546デフォルトの名無しさん:2011/08/31(水) 11:17:19.14
>>544
型としてはRangeを引数で渡して、関数内でRows,Columns,Areasの
各Countが1以外ならエラー値を返すんじゃ駄目なの?
まぁ、Cellsを指定するとか言ってるなら、型を理解してるかどうかが怪しいが…
547デフォルトの名無しさん:2011/08/31(水) 11:30:48.81
>>546
了解しました。ありがとうございます。
548デフォルトの名無しさん:2011/08/31(水) 12:12:34.00
単一セルのオブジェクトが無いから、それがexcelの基本方針なんだろうね
ところで、Cellsって昔はメソッドだった気がするんだが、いつのまにプロパティになったんだ?
549デフォルトの名無しさん:2011/08/31(水) 14:40:17.39
ユーザー定義関数で

Public Hage(ABC As Range) As nantoka
If ABC.Value>0 Then
Range("A1").Value="0より大きい"
End If
End Function

みたいに関数内からシート等に働きかける事ってできませんか?

#Valueエラーが出てどうして良いか分かりません。
よろしくお願いします
550デフォルトの名無しさん:2011/08/31(水) 14:50:19.63
無理だからワークシートチェンジのところに書け
551デフォルトの名無しさん:2011/08/31(水) 15:06:43.56
働きかけたい先も引数にとれば行けそうな気がする
552デフォルトの名無しさん:2011/08/31(水) 15:26:11.70
function忘れてる
553549:2011/08/31(水) 16:36:59.89
レスありがとうございます。
ワークシートチェンジに書くしかないようです。

このイベントなんですが、100カ所くらいのセルが
ランダムに書き換わって、当然何カ所かは同時に
書き換わるような場合、100回処理がきちんと行われるんでしょうか?

もしくは、そういう場合は最初のイベント処理の時に
イベントが発生しないようして、何個もプロシージャが
走らないようにした方が良いのでしょうか?
554デフォルトの名無しさん:2011/08/31(水) 17:18:48.04
誰がどうやって複数のセルに同時に書き込むんだ?
555デフォルトの名無しさん:2011/08/31(水) 17:44:46.96
どなたか>>540にお答えいただける方いませんか。。
556デフォルトの名無しさん:2011/08/31(水) 18:26:59.37
>>554
>>520氏のような感じ。
うちは機械とシリアルでやり取りしてさせてるんだけど。
100台機械を繋げてる訳じゃなくて、シリアルのデータの中から
セル100個(おおざっぱな数字だけど)にデータを振り分けてる。
557デフォルトの名無しさん:2011/08/31(水) 19:09:11.32
for each
558デフォルトの名無しさん:2011/08/31(水) 19:11:18.84
ついでにいうと同時に書き変わるというのはシングルタスクのVBAでは無理
559デフォルトの名無しさん:2011/08/31(水) 19:51:15.96
それは理解している
PCの性能にもよるんだろうけど、どこまできっちりイベント処理してくれるのかな
560デフォルトの名無しさん:2011/08/31(水) 23:43:31.02
質問です。
整数で二枚の各シートA,Bの2列に1から600までの整数がランダムに各列36万行入力
しています。シート1のA,B列の整数をシート2の整数A,Bと合致する行を検索するプログラムを
作ろうと思います。各シートの中の同じ組み合わせのA,Bは、2つありません。

そこで実際にシート1.2の各行を一つ一つ照らし合わせるプログラムを書いて見たが、実行すると
あまりにも計算する量が多くてパソコンが止まってしまいます。
そこで質問ですが、計算量を少なくするには、どのようなやり方がよいでしょうか?
561デフォルトの名無しさん:2011/09/01(木) 00:13:25.63
シート3に1と2が一致してるかどうかの関数いれる
562デフォルトの名無しさん:2011/09/01(木) 00:25:26.70
>>560
ひとつひとつ参照ってどんな風に書いてるの?
563デフォルトの名無しさん:2011/09/01(木) 00:54:16.92
>>559
取りこぼすと思ってるの?
564デフォルトの名無しさん:2011/09/01(木) 09:04:09.44
>>562
If sheet1.Cells(a, "A") = sheet2.Cells(b, "A") And _
sheet1.Cells(a, "B") = sheet2.Cells(b, "B") Then
Loop
a = a + 1

のようにFor文で一致する行を検索してます。
565デフォルトの名無しさん:2011/09/01(木) 11:36:02.45
>>563
APIを直接叩くプログラムだと、EXEファイルと挙動が違ったり
windowsにメッセージが行く時と行かない時があるから疑ってる
566デフォルトの名無しさん:2011/09/01(木) 11:59:07.71
>560,564
シートのセルを直接参照するんじゃなくて、
A列とB列の値を連結した1個の数字(値は1,001〜600,600)×36万の1次元の
配列2個(シートAからのものと、シートBからのもの)を作って、配列同士の比較をした
方が速いんじゃないの?
567デフォルトの名無しさん:2011/09/01(木) 12:59:37.79
>>566
それでいいのなら、36万要素の配列Aを一つ用意して、一つ目のシートに対して、
hash = (sheet1.Cells(i, "A").Value - 1) * 600 + sheet1.Cells(i, "B").Value - 1: A(hash) = i
を計算しておいて、今度は二つ目のシートに対して、同じようにhashを計算すれば一瞬で済むじゃない。
568デフォルトの名無しさん:2011/09/01(木) 14:56:36.90
Excel, pptのマクロにて,
Set Menubar = Application.CommandBars("Tools")
Set cbcbtn = cbMenubar.Controls.Add(Type:=msoControlButton)
cbcbtn.Caption = "ほげほげ"
などとして,アドインタブにマクロを追加しているのですが,
アドインタブ内のバーのタイトルが"メニューコマンド"となっていて,
変更方法がわかりません.これを変更するにはどうしたらいいのでしょうか?
"Tools"が,アドイン->メニューコマンドとして
定義されてしまっているのでしょうか?

569デフォルトの名無しさん:2011/09/01(木) 16:04:12.73
>>565
初心者は先に自分を疑った方が良い
570デフォルトの名無しさん:2011/09/01(木) 16:45:53.74
>>560
シートのセル参照すると結構遅い
どこまで早くしたいかわからんが、素直にシート1のA1:B360000と
シート2のA1:B360000をそれぞれ2次元配列に入れて、配列どうしで比較するだけで良いんじゃね
    s1 = Sheet1.Range("A1:B360000")
    s2 = Sheet2.Range("A1:B360000")
    For i = 1 To 360000
        If s1(i, 1) = s2(i, 1) And s1(i, 2) = s2(i, 2) Then
...
みたいな感じ
つか普通にセル参照しても、うちの環境なら数秒のオーダーで終わったけどな
参照と比較以外で時間かかってるんじゃないか?
571デフォルトの名無しさん:2011/09/01(木) 17:31:07.37
>570
ループは2重で「総当たり」だから時間がかかるんでしょ。
572570:2011/09/01(木) 18:43:03.79
>>571
ああ、俺が仕様を勘違いしてるのか
573デフォルトの名無しさん:2011/09/01(木) 19:29:24.27
俺のexeclは6万行くらいしかないんだけど
574デフォルトの名無しさん:2011/09/01(木) 19:44:47.27
65535行が上限です
575デフォルトの名無しさん:2011/09/01(木) 19:51:53.36
>573,574
ナカーマ   いつまでもExcel2003を使い続けましょう!
576デフォルトの名無しさん:2011/09/01(木) 21:38:16.81
>>560
ソート&二分木探索で解決するだろJK
577デフォルトの名無しさん:2011/09/02(金) 08:36:54.24
ご指導願います

あるマクロを設定しましてマクロボタンを作って 現在指定時間にクリックしてマクロ実行しているのですが
ボタンがたくさん増えたため 時間のずれがでてきまして・・・・

このボタンを毎日指定時間に 自動でボタンを押してくれるマクロを設定したいのです
ご指導お願いできないでしょうか? お願いいたします
578デフォルトの名無しさん:2011/09/02(金) 08:46:07.02
OnTimeでそのボタンのマクロを起動すればよいのでは?
579デフォルトの名無しさん:2011/09/02(金) 15:23:37.81
Set FoundCell = range("B:B").CurrentRegion.Find(What:=名前)
If FoundCell Is Nothing Then
Else
FoundCell.Select
上記のようにfindで見つけたセルをセレクトしたいのですが
検索範囲をB列のみとしているのですが実行して
セレクトされる列は何故かA列になってしまいます。
どこが悪いのか分かる方ごご指摘ください。お願いします。
580デフォルトの名無しさん:2011/09/02(金) 16:36:11.95
CurrentRegionのせいで範囲が広がってると思う
581デフォルトの名無しさん:2011/09/02(金) 16:36:58.67
ボタン作らなくても関数名入力するだけでいいと思うが
582デフォルトの名無しさん:2011/09/02(金) 19:47:15.12
>>578 >>581
初心者なので 一旦自分なりにくぐって見ます ありがとうございました
583デフォルトの名無しさん:2011/09/02(金) 21:10:23.01
VBAの入門レベルは突破したから
こんどは仕事で使える「便利技」を重点的にたくさん学びたいんだけど
そういう中級レベル以上を対象としてる
とくに便利技のサンプル例がたくさん載ってる本はありませんか?
584デフォルトの名無しさん:2011/09/02(金) 21:15:29.68
寧ろ懇切丁寧にプログラミングの基礎から書いてある本より、こういうときはこう書け、みたいなのが多い気がする
585デフォルトの名無しさん:2011/09/02(金) 21:20:41.04
正直基礎完璧にしてAPIの使い方分かったらほとんどのことはできる
586デフォルトの名無しさん:2011/09/02(金) 21:58:30.79
>>583
基礎が出来たなら、仕事で使えそうな便利技を勉強するも、仕事の中でこういう風に出来たら便利なのになと思うことを実際にコード書いてみるといいと思う。

大抵のことは、検索すれば答え出ると思う。その中で不足していることを補えばいいのでは…

学生だと話ずれてしまってるかもだが…

587デフォルトの名無しさん:2011/09/02(金) 22:36:16.11
入門レベルは突破っていうのがどのくらいのレベルのことを言うのかな?
・Excel VBAのルールを理解している
・構造化プログラミングが出来る
・クラス設計が出来る
・プログラミングの定石を理解している

俺はどれも中途半端。
っていうかクラスモジュール使ったことないorz
クラスが必要になる場面に出くわしていないっていうのもあるけど。
588583:2011/09/02(金) 22:54:38.45
入門

for nextが使いこなせる
ローカル変数とグローバル変数がわかる
フォームも使いこなせる
モジュールの考え方がわかる
サブルーチンで、値渡し、参照渡し、矢切りの渡しの区別がつく

しかし

クラスとはなんのことかさっぱり分りません
構造化プログラミングの意味は説明はひととおり読んで意味はわかったけどそんな大そうな用語を使う意味が分りません。
589デフォルトの名無しさん:2011/09/02(金) 23:17:58.61
Excelでお仕事!
http://www.asahi-net.or.jp/~ef2o-inue/top01.html

ここのVBA応用とかAPI関係とか社内でいろいろするなら配布の問題とか
ここら辺が望んでる辺りじゃないの
590デフォルトの名無しさん:2011/09/03(土) 00:26:33.50
>>587-588
VBA のクラスは不完全だから、あまり気にしなくてもいい。
591デフォルトの名無しさん:2011/09/03(土) 00:49:23.41
中級者:
 On Error Resume Next が正しく使える
592デフォルトの名無しさん:2011/09/03(土) 02:23:48.91
それはない
593デフォルトの名無しさん:2011/09/03(土) 02:32:09.18
帰ってくる型が違うときにOn Errorで条件分岐するともれなく奇怪なコードを作れます
594デフォルトの名無しさん:2011/09/03(土) 05:47:47.10
通常3日あれば入門突破できるはずなのに
何で理解できないのか分からないけどクラス理解してないとか入門突破してないよ
595デフォルトの名無しさん:2011/09/03(土) 07:00:19.95
矢切りの渡しってなんぞ?
596デフォルトの名無しさん:2011/09/03(土) 07:57:45.62
江戸時代初期、地元住人専用に幕府が設けた渡し場のうちのひとつ。都内に残っている渡しはここだけ。小説や歌謡曲で有名。
597591:2011/09/03(土) 08:33:43.40
いや、オートフィルタを解除する時とかにつかわない?>>On Error Resume Next

他にもどうしてもって時にOn Error goto 0 と挟んで使うけど
598デフォルトの名無しさん:2011/09/03(土) 08:43:11.41
>>569
遅レスだがあまり信用はしてはいけないよ
何にでもバグはある
599デフォルトの名無しさん:2011/09/03(土) 13:07:47.43
vbaでListBoxを引数にするにはどうすればいいです?
また、引数に出来るとして、受け取った側で渡されたのが
ListBoxなのかどうかを判断するにはどうすればいいでしょうか?
よろしくお願いします。
600デフォルトの名無しさん:2011/09/03(土) 13:46:23.05
>>599
普通にAs ListBoxで渡せなかったっけ
もしくはVariantで受けてTypeNameで判定
http://officetanaka.net/excel/vba/function/TypeName.htm
601デフォルトの名無しさん:2011/09/03(土) 15:18:34.21
>>599
どういう状況でListBoxを引数にする必要が出てきたのかな?
602デフォルトの名無しさん:2011/09/03(土) 16:50:42.75
リストボックスが5個あって条件によって商品名を各リストボックスに
登録していくのですが、リストボックスには最大10個までしか商品名は
登録しない。
古い順から消去して、追加される商品名は先頭に追加する。
こういうルールなので、リストボックスが違うだけで、リストボックスに追加、削除する
プログラムは同じなので、追加、削除するプロシージャを使い回したいのです。

Add_ListBox(Name as string,LB as ListBox)とやると、LBに引数を設定する際、
修正候補"="とエラーが出ます。
Variantでもおなじです。
よろしくお願いします。
603デフォルトの名無しさん:2011/09/03(土) 17:15:33.21
>>602
そのAsは何?
604デフォルトの名無しさん:2011/09/03(土) 17:22:10.41
型指定する時の接続詞じゃないの
605デフォルトの名無しさん:2011/09/03(土) 18:14:22.77
コードがあまりに断片的過ぎて困る
606デフォルトの名無しさん:2011/09/03(土) 18:41:52.98
このスレでAsを知らない池沼は>>603だけ
607デフォルトの名無しさん:2011/09/03(土) 18:50:13.29
これじゃダメ?
ググればこれくらいのことは分かる。

sub hoge()
Call Add_ListBox("foo",ListBox1.Object)
End Sub

sub Add_ListBox(Name as string,LB as Object)
LB.AddItem(Name)
End Sub
608デフォルトの名無しさん:2011/09/03(土) 22:05:08.91
>>594
なんか定期的に出てくるなぁ、VBA でクラスマスターしたってアホが。

>>598
なんにでもバグはあるけど、その確率がぜんぜん違うだろ。
609デフォルトの名無しさん:2011/09/03(土) 22:06:53.57
ListBoxを変数に格納するときにSetせずに代入してるとエスパー
610デフォルトの名無しさん:2011/09/03(土) 22:12:42.81
「世界で1番簡単なExcelVBAのe本」っての読んだけど、
次に読むべきオススメの本ってありますか?
あまりお金がないので後はその二冊目の本と辞書っぽい本だけ買って何とか自分で大抵のものは作れるようにしたいです
611デフォルトの名無しさん:2011/09/03(土) 22:24:12.29
>>608
> なんにでもバグはあるけど、その確率がぜんぜん違うだろ。
お前素人だろ
612デフォルトの名無しさん:2011/09/03(土) 22:48:31.82
半導体が接触不良を起こす確率
613デフォルトの名無しさん:2011/09/03(土) 23:00:14.99

半導体が接触不良を起こす確率 vs ここに質問しに来る人間のバグを仕込む確率
614デフォルトの名無しさん:2011/09/03(土) 23:07:38.14
>>611
自称玄人乙
615デフォルトの名無しさん:2011/09/04(日) 00:01:52.65
Set range = range("A:A").End(xlDown)
range.Select
これでA列の一番下のセルを選択したいのですが
A列が2列以上あれば正常に動きます。
しかし、A列が1列しか無い場合、A1048576が選択されてしまいます。
何故でしょうか?分かる方教えてください。お願いします。
616デフォルトの名無しさん:2011/09/04(日) 00:08:36.30
それはバグだな
617デフォルトの名無しさん:2011/09/04(日) 00:44:55.80
>>608
あれ?例のクラス理解できない子?
618デフォルトの名無しさん:2011/09/04(日) 00:48:35.30
A列は2列以上ないはずなので
目がバグってる可能性がある
619デフォルトの名無しさん:2011/09/04(日) 02:03:03.01
>>617
>自称玄人乙
「〜乙」はヤツの口癖だったからおそらく同一人物だろ
620デフォルトの名無しさん:2011/09/04(日) 02:04:36.73
xldown って要はCTRL+↓の動作でしょ
だから 2行 以上ないとそうなるでしょ
621デフォルトの名無しさん:2011/09/04(日) 02:43:40.23
俺のexecl6万行くらいしかないんだけど
622デフォルトの名無しさん:2011/09/04(日) 02:47:08.78
大丈夫だ、問題ない
623デフォルトの名無しさん:2011/09/04(日) 07:42:15.81
>>617
例のクラスって何だ?

>>619
深夜作業乙 (w
624デフォルトの名無しさん:2011/09/04(日) 07:43:37.31
素人は意外とバグ発見器だけどね
625デフォルトの名無しさん:2011/09/04(日) 09:11:14.81
パソコン新しくしたらマクロ実行速度大幅に短縮された

もう簡易用途だったら、わざわざプログラムの最適化作業に時間費やす必要はなさそう
626デフォルトの名無しさん:2011/09/04(日) 22:19:39.87
そう思ってればいい
627デフォルトの名無しさん:2011/09/05(月) 07:48:37.26
>>626
手法を知ってるならやらなくていいだろ
628デフォルトの名無しさん:2011/09/05(月) 10:41:41.33
ユーザーフォームが呼び出されているかを知る方法って有りますか?
629デフォルトの名無しさん:2011/09/05(月) 10:52:53.15
>>628
呼び出されているというのがいまいちよくわからんけど、
Initailize/Terminate もしくは Activate/Deactivate で、
フラグ On/Off して、それ見るんじゃだめ?
630デフォルトの名無しさん:2011/09/05(月) 12:01:06.41
UserForm1.Show vbModeless
Load UserForm2

Debug.Print "表示されているユーザーフォームの数:" & DoEvents
Debug.Print "ロードされているユーザーフォームの数:" & UserForms.Count
631デフォルトの名無しさん:2011/09/05(月) 14:55:19.20
VBAじゃなくてセルに直接書く関数に関して質問でもおk?
632デフォルトの名無しさん:2011/09/05(月) 15:24:38.67
>>631

こっちのほうが良いと思う
Excel総合相談所 98
http://hibari.2ch.net/test/read.cgi/bsoft/1312896741/l50
633デフォルトの名無しさん:2011/09/05(月) 16:36:33.90
>>630
そのコードじゃ「どれが」ってのがわからないよ
634628:2011/09/05(月) 18:45:09.69
今、629さんに教えてもらったようにInitailize/Terminateにフラグ建てて判断するようにしてみました。
やってる事は、シートのダブルクリックイベントでフォームのcheckboxがチェックされているかによって
プロシージャを実行するかしないかという事なんですが、フォームを閉じる際にTerminateが走るのは
確認しました。
しかし、フォームを閉じた後シートをダブルクリックするとフォームは呼び出していないのに
Initailizeが走ってフラグがTrueになってしまいます。
ユーザーフォームが呼び出されていないのにInitailizeが走るのってバグ?
エクセル2003です。
635デフォルトの名無しさん:2011/09/05(月) 19:31:21.96
>>628
> ユーザーフォームが呼び出されているかを知る方法って有りますか?

フォームがロードされているかどうか確認する

function dfIsFormLoaded(Byval strFormName as String) as Boolean

 on Error Goto ErrTrap

 Dim i as integer

 dfIsFormLoaded = false

 for i=0 to forms.count - 1
  if UCase$(Forms(i).name) = UCase$(strFormName) then
   dfIsFormLoaded = truen
   Exit Function
  end if
 Next

 Exit Function

ErrTrap:
 On Error goto 0

End Function
636デフォルトの名無しさん:2011/09/05(月) 19:38:00.60
>>633

書いてあるのは「ユーザーフォームが呼び出されているかを知る方法」であって
「どれが」とは書いて無い
637デフォルトの名無しさん:2011/09/05(月) 21:09:29.72
皆さまお力を貸してください。
findにて連続検索をして、見つかったセルの隣のセルの値を取得して
見つかったセルが3個あればその中から一番高い値を選択したいのですが
どのような方法、または関数を使うのがいいでしょうか?
お願いします。
638デフォルトの名無しさん:2011/09/05(月) 21:22:17.87
>>637
MAX
639デフォルトの名無しさん:2011/09/05(月) 21:46:15.56
連続検索はFindNext、隣のセルはOffset、
最大値はWorksheetFunction.Maxでも比較演算でもお好きに

それだけ解れば、あとは自分で書いた
> 連続検索をして、見つかったセルの隣のセルの値を取得して
> 見つかったセルが3個あればその中から一番高い値を選択
をそのままVBAに直すだけだろ
640デフォルトの名無しさん:2011/09/05(月) 21:53:08.02
>>637
丸投げかよ。
っていうかさ、お前どこまで考えたの?
コード書いたの?馬鹿なの?死ぬの?
641デフォルトの名無しさん:2011/09/05(月) 21:53:55.91
ニコニコにあるインベーダ―ゲーム作るにはどうしたらよい?
642デフォルトの名無しさん:2011/09/05(月) 22:05:08.20
>作るにはどうしたらよい?

プログラムを書けばよい
643デフォルトの名無しさん:2011/09/05(月) 22:08:26.92
逐次探索のプログラムについて

Cells(1, 1) = 11
Cells(1, 2) = 24
Cells(1, 3) = 36
Cells(1, 4) = 44
Cells(1, 5) = 58
Cells(1, 6) = 64
Cells(1, 7) = 77

Sub 逐次探索()
Dim k As Integer, j As Integer
k = InputBox("数字を入力してください。")
For j = 1 To 7
If cells(1, j) Then
Exit For
End If
Next
If cells(1, j) Then
MsgBox j & "番目です"
Else
MsgBox "無いよん"
End If
End Sub

ここまで、自力で作成しましたがどんな数を入れても、
"1番目です"としか出ません。
どなたか対処法をお願いします。
644デフォルトの名無しさん:2011/09/05(月) 22:10:53.31
>>643
If cells(1, j) Then
って何を判定させたいの?
645デフォルトの名無しさん:2011/09/05(月) 22:38:33.08
>>643
すみません、=36です。
646デフォルトの名無しさん:2011/09/05(月) 22:52:03.84
>643,645
2カ所ある cells(1, j) を cells(1, j).Value = k ってしたらいいのでは?
inputboxに入れた数字を k に保存して、for〜nextループで調べて
一致したら、その数字が何番目なのかを表示するって処理でしょ?
(一致しなかったら「無いよん」と表示)
647デフォルトの名無しさん:2011/09/05(月) 22:56:25.97
>>646
無事に完成しました。
ご指摘ありがとうございました。
648デフォルトの名無しさん:2011/09/06(火) 07:18:07.17
>>646-647
二つめのIf文は危険なコードだと思う。
最初のIf文で検索できなかった場合、jは8となる。

今回は偶々一つ多くてもセルの位置に余裕があるからいいけど、
セルの位置が最大255の場合ならセルの列の最大数超えるし、
配列の場合は定義の範囲を超えてしまう。

二つめのIf文は j で判定したほうが安全。
649デフォルトの名無しさん:2011/09/06(火) 10:33:07.56
複数のセルの値を順にみていって、条件にあったらメッセージボックスを表示させたいんだけど、
普通に表示させたらOKボタン押すまでマクロの実行が止まりますよね。
メッセージボックスが出てもセルの値を順に見続けて既にメッセージボックスが出てても、
次のメッセージボックスを表示させたいんだけどどうすればいいですか?
650デフォルトの名無しさん:2011/09/06(火) 11:02:04.18
Application.ScreenUpdating を使って処理中の画面のちらつきは
抑えられますが、 Application.ScreenUpdating = Trueになるときに
ちらつくのは抑えられませんか?
651デフォルトの名無しさん:2011/09/06(火) 14:58:48.98
>>649
全部調べて文章作ってからメッセージボックスを表示する
652デフォルトの名無しさん:2011/09/06(火) 15:20:19.25
文章かぁ
考えつかんかった。
653デフォルトの名無しさん:2011/09/06(火) 15:46:46.61
ウィンドウを最小化しておけばいいんでねーの?
654デフォルトの名無しさん:2011/09/06(火) 15:58:38.39
ユーザーフォームでmodeless
655デフォルトの名無しさん:2011/09/06(火) 19:09:40.71
>>648
指摘有難うございます。先程修正しました。
今、>>643と同じ条件で二分探索を作っていますが、良く分からず止まっています…。
656デフォルトの名無しさん:2011/09/06(火) 19:32:51.78
subプロシージャ内で自subプロシージャ名を取得するには如何すればよろしいでござるか?
657デフォルトの名無しさん:2011/09/06(火) 19:34:19.22
そんな事はできん。
と、思うでござるが
658デフォルトの名無しさん:2011/09/06(火) 20:12:50.24
>>655
同じ条件ってよくわからん。具体的に。
659デフォルトの名無しさん:2011/09/06(火) 21:11:04.80
>658
A1〜G1まで昇順にならんでいる前提で、列位置の数字を
1→7→4→2→3で当たり!って半分ずつ探す方法 のことでしょ
660デフォルトの名無しさん:2011/09/06(火) 21:31:15.70
>>659
余計分からん。
その探索は二分木探索じゃないし、>>643では二分木探索なんかしてない。
661デフォルトの名無しさん:2011/09/06(火) 21:36:36.64
逐次探索

>>643と条件は一緒で、自分なりに考えたのだが…

Sub 二分探索()
Dim i As Integer, j As Integer, k As Integer, m As Integer
k = InputBox("数字を入力してください。")
i = 1
j = 7
Do While i <= j
m = (i + j) / 2
If cells(m) = k Then
MsgBox m & "番目です。"
ElseIf cells(m) > k Then
j = m - 1
MsgBox j & "番目です。"
Else
i = m + 1
MsgBox i & "番目です。"
End If
Loop
End Sub

 どんな数入れても、5番目、7番目、8番目と出てしまう。
 訂正お願いします。
662デフォルトの名無しさん:2011/09/06(火) 21:48:42.47
>>661
逐次→二分でした
663デフォルトの名無しさん:2011/09/06(火) 21:56:18.89
>>661
デバッグできないの?馬鹿なの?死ぬの?
664デフォルトの名無しさん:2011/09/06(火) 22:07:08.13
>>663
すみません、初心者です。
665デフォルトの名無しさん:2011/09/06(火) 22:12:35.05
>>664
デバッグの仕方ぐらいググれよ。
デバッグぐらい小学生でも出来るよ。
666656:2011/09/06(火) 22:24:37.02
>>657
じゃあ、Subプロシージャから呼び出されたFunction()側から、何処から呼ばれたか知る術はないでござろうか?
引数として決め内でフラグを渡すとかは論外で、汎用的にできないですかね
667デフォルトの名無しさん:2011/09/06(火) 22:35:11.19
>661 は、該当しない場合のことが抜けてますよ
Sub new二分探索()
Dim i As Integer, j As Integer, k As Integer, m As Integer
  k = InputBox("数字を入力してください。")
  i = 1: j = 7
  If (Cells(1, i).Value > k) Or (Cells(1, j).Value < k) Then
    MsgBox ("範囲外です"): GoTo end_sub
  End If
  Do While i <= j
    m = (i + j) / 2
    If Cells(1, m).Value = k Then
      MsgBox (m & "番目です"): Exit Do
    ElseIf i = j Then
      MsgBox ("該当なし"): Exit Do
    End If
    If Cells(1, m).Value > k Then
      j = m - 1
    Else
      i = m + 1
    End If
  Loop
end_sub:
End Sub
668デフォルトの名無しさん:2011/09/06(火) 23:03:50.88
>>667
その場合、どんな数を入れても範囲外→該当なしになるので、考え直しています。
669667:2011/09/06(火) 23:12:59.34
>668 ???
>643 では「無いよん」って表示してるのに?
670デフォルトの名無しさん:2011/09/06(火) 23:15:26.81
>>669
失礼しました。自分の勘違いでした、
親切におしえてくださり、ありがとうございました。
671デフォルトの名無しさん:2011/09/07(水) 06:04:25.03
>>666
プログラムってものの作り方を解ってないなw

俺もプログラミング初めて1ヶ月くらいの超初心者の頃
そういうことが出来ないかと模索したことがあったよ
2,3ヶ月もすると、「自分は何バカなことやろうとしてたんだろう」と
思うようになったがw
672デフォルトの名無しさん:2011/09/07(水) 06:16:52.40
673デフォルトの名無しさん:2011/09/07(水) 08:02:28.51
>>661
7個くらいならどんな二分探索でもよいが、もし範囲が広い場合は毎回一致してるかどうかの判定は無駄なのでこんな二分探索になる。
Sub 二分探索()
  Dim r As Range
  Dim k, i&, j&, m&
  k = Application.InputBox("数字を入力してください。", Type:=1)
  If VarType(k) = vbBoolean Then Exit Sub
  Set r = Range("A1:G1")
  i = 1
  j = r.Count
  Do While i <= j
    m = (i + j) \ 2
    If r(m).Value > k Then
      j = m - 1
    Else
      i = m + 1
    End If
  Loop
  If j > 0 Then
    If r(j).Value = k Then
      MsgBox j & "番目です"
    Else
      MsgBox "該当なし"
    End If
  Else
    MsgBox "該当なし"
  End If
End Sub

r(m)とかの意味が分からないときは、とりあえずCells(1,m)とかに置き換えればいい。
674デフォルトの名無しさん:2011/09/07(水) 08:17:29.22
まじに書いてはみたが、ちょっと素人にはわかりづらいアルゴリズムだな。
675デフォルトの名無しさん:2011/09/07(水) 08:31:27.97
>>671
いや、だから関数とかないのかと思ってね
カーネル使えば出来そうだけど自分参照できんのかな
676デフォルトの名無しさん:2011/09/07(水) 09:01:13.37
>>673を素人向きに分かりやすいアルゴリズムで書けばこうなるのかな?
Sub 二分探索()
  Dim r As Range
  Dim k, i&, j&, m&, temp#
  k = Application.InputBox("数字を入力してください。", Type:=1)
  If VarType(k) = vbBoolean Then Exit Sub
  Set r = Range("A1:G1")
  i = 1
  j = r.Count
  Do While i <= j
    m = (i + j) \ 2
    temp = r(m).Value
    If temp > k Then
      j = m - 1
    ElseIf temp < k Then
      i = m + 1
    Else
      MsgBox m & "番目です"
      Exit Sub
    End If
  Loop
  MsgBox "該当なし"
End Sub

ループを抜けたら不一致だ。
677デフォルトの名無しさん:2011/09/07(水) 10:48:10.61
Excel2007で並び替えダイアログを表示するVBAを作成しています。
「先頭行をデータの見出しとして使用する」をデフォルトでチェックを
入れたいのですが。
↓では出来ませんでした。
パラメータの渡し方が間違っているのでしょうか。

Application.Dialogs(xlDialogSort).Show arg8:=1
678デフォルトの名無しさん:2011/09/07(水) 19:17:57.38
オートシェイプが移動したときに発生するイベントってありますか
679デフォルトの名無しさん:2011/09/07(水) 20:11:37.03
>>677
名前付き引数は使えないっぽ

Application.Dialogs(xlDialogSort).Show , , , , , , , xlYes
680デフォルトの名無しさん:2011/09/07(水) 22:49:19.96
玄人さんはいつもって訳じゃないけど、基本はこうだな。

素人でも分かりやすいコードを書く→玄人プログラマ
素人でも分かりにくいコードを書く→素人プログラマ
681デフォルトの名無しさん:2011/09/07(水) 23:29:18.91
玄人ほど基本に忠実だよ
682デフォルトの名無しさん:2011/09/08(木) 04:41:21.87
玄人でも基本ができてないやつは多い。
とくにVBAでは本を書くようなやつでも合格レベルの玄人は少ない。
所詮素人に毛が生えてるおかも知らんけど。
683デフォルトの名無しさん:2011/09/08(木) 06:43:51.03
そいつは玄人じゃない
684デフォルトの名無しさん:2011/09/08(木) 06:47:05.08
ゎたしゎマンコに毛が生ぇてるけど
素人ですか玄人ですか?
685デフォルトの名無しさん:2011/09/08(木) 06:50:00.94
昔と違って余裕で1000とか2getとか
686デフォルトの名無しさん:2011/09/08(木) 06:58:30.84
>>683
禿同。本を書いているからって玄人というわけじゃない。
素人でも参考書は書ける。
687デフォルトの名無しさん:2011/09/08(木) 07:28:00.08
素人玄人云々は別にして、プロなら>>676の二分探索アルゴリズムだけじゃなく、>>673の手法も知ってた方がいい。
同じものが複数あるとき後ろの位置を返すには>>673になる。
688デフォルトの名無しさん:2011/09/08(木) 07:50:27.79
>>687
>>673のコードの基本は二分木探索で、その応用なんだから二分木探索だけ覚えておけばいいんじゃね?
ライブラリみたいな形にしておいてもいいと思うけど。
689デフォルトの名無しさん:2011/09/08(木) 09:28:12.80
二分探索と二分木探索って同じものだっけ?
690デフォルトの名無しさん:2011/09/08(木) 10:11:23.47
>>679
ご回答ありがとうございます。
カンマで引数を指定しましたが、やはり出来ませんでした。

Application.Dialogs(xlDialogSort).Show
の前にセル選択をしていると
「先頭行をデータの見出しとして使用する」のチェックが
ついていなくて、
セル選択をしないとチェックが付いていました。

一番下の行も並び替え対象から外したいので
セル選択をしてから並び替えダイアログを表示しています。

691デフォルトの名無しさん:2011/09/08(木) 18:25:10.66
何かのイベント処理中に同じイベントが起こったら、
処理が終わり次第、順番にイベントが処理されていくと
思うのですが、イベント処理する時に溜まっている
イベントを破棄することって出来ますか?
692デフォルトの名無しさん:2011/09/08(木) 18:35:45.68
for each で一定範囲内にあるオートシェイプってできますか?
具体的には
Top1〜Top2の間かつLeft1〜Left2の間にあるオートシェイプのみをfor each したいです
693デフォルトの名無しさん:2011/09/08(木) 20:41:03.42
>>689
スレの流れでは二分探索だな。
694デフォルトの名無しさん:2011/09/08(木) 22:13:38.64
俺は>>676みたいな二分探索しか知らなかったわ。
なるほど>>673は比較回数が少なくなるね。
ここで久々に勉強になった。
理解するのに少々手こずったが。
695デフォルトの名無しさん:2011/09/08(木) 22:22:13.97
>>692
すべてのオートシェイプをFor Eachで回して、そのオートシェイプがTop1〜Top2の間かつLeft1〜Left2の間にあるときだけ
実行すりゃいいんじゃね?
696sage:2011/09/09(金) 10:15:37.68
http://ec.nikkeibp.co.jp/item/books/B14400.html
この本だけは認める。
697デフォルトの名無しさん:2011/09/09(金) 10:27:02.77
>>696
その本のサンプルコードをダウンロードして見たけど、玄人とは言えないな。
698デフォルトの名無しさん:2011/09/09(金) 10:57:50.81
今まで記録マクロしか扱ったことがない素人ですが,どうかお知恵を貸してください。
ソフトはエクセル2003です。

○状況
フォルダ1に,商品データファイルが商品コードの頭文字A〜Zごとに,それぞれに独立のエクセルファイルに収納されている。
(商品コード,数量,値段,更新日などが1行ごとに並んでいて,列は固定です)

同じ書式で,一定期間ごとに更新用データファイルが送られてくる。(コードの頭文字に関係なく,ランダムな商品データが配列されている)

○やりたいこと
更新用ファイルの商品コードと一致するものを,フォルダ1のA〜Zのファイルの中から検索し,
フォルダ1の中の該当した商品の数量,値段などを最新のものに書き換えたい

VBAの中でvlookup,match+index関数などを組み込んで試してみましたが,一致しないとエラーが出たり,
非常に時間がかかってしまうなど上手くできませんでした。(1ファイルに3〜5万件のデータがあるため)
また,調べたところでは,配列形式など高速で処理する方法もあるようなのですが,私には理解できませんでした。
これをできるだけ高速に,エラーなく処理するプログラムのヒントをいただきたく存じます。
全体的にこういう流れ,という概要と,途中までの具体的なコードを書いていただけると,非常に助かります。お願いします。
699デフォルトの名無しさん:2011/09/09(金) 11:21:48.25
>>698
とりあえず、更新用データのファイルの中身を商品コードでソートして。
それからマッチングと書き換え処理をさせれば、単純にランダムな並びのまま
ファイルを更新するよりは、ファイルのオープン、クローズや検索のための
走査回数の無駄が省けるはず。
700デフォルトの名無しさん:2011/09/09(金) 11:49:30.52
俺ならaccessに入れる
701デフォルトの名無しさん:2011/09/09(金) 12:49:07.19
>>698
醜い例でよければ、こんな感じで書ける。

Sub updateData()

ActiveSheet.Range(ActiveSheet.Cells(1, 1), ActiveSheet.Cells( _
ActiveSheet.Range("A1").End(xlDown).Row, _
ActiveSheet.Range("A1").End(xlToRight).Column)).Select
'商品コードでソート(先頭行が見出し行と仮定、以降も同様)
Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
:=xlPinYin, DataOption1:=xlSortNormal

'更新処理本体
Dim IniChar As String, IniCharPrev As String
Dim bIsOpen As Boolean, bMatch As Boolean
Dim TimeStamp As Date
Dim a As Variant, b As Variant, vSrc As Variant
Dim sDataFolder As String, sDestFilename As String
Dim wbDest As Workbook
Dim wsDest As Worksheet

TimeStamp = Date '本日日付を取得(更新日も更新ファイルの値を反映するなら不要)
sDataFolder = "d:\folder1\" '対象フォルダを設定
IniCharPrev = ""
ActiveSheet.Range("A2:A" & ActiveSheet.Range("A2").End(xlDown).Row).Select
bIsOpen = False
'続く
702デフォルトの名無しさん:2011/09/09(金) 12:54:10.71
ゴメン、ミスって上げてしまった…
'続き
For Each a In Selection
IniChar = Left(a.Value, 1) '更新データの頭文字を取得
If IniChar <> IniCharPrev Then '直前に操作していたデータと頭文字が異なれば、ファイルを開きなおす
If bIsOpen = True Then '既に開いているデータファイルがあれば保存して閉じる
wbDest.Save : wbDest.Close : Set wsDest = Nothing : Set wbDest = Nothing : bIsOpen = False
End If
sDestFilename = IniChar & ".xls" '更新先ファイル名を設定(ファイル名に応じて要更新)
Workbooks.Open Filename:=sDataFolder & sDestFilename
Set wbDest = Workbooks(sDestFilename)
Set wsDest = wbDest.Worksheets(1) 'シートが複数あるなら要修正
bIsOpen = True
End If
IniCharPrev = IniChar
703デフォルトの名無しさん:2011/09/09(金) 12:54:36.62
'続き(これで終わり)
'検索
vSrc = a.Value : bMatch = False
For Each b In wsDest.Range("A1:A" & wsDest.Range("A1").End(xlDown).Row)
If vSrc = b.Value Then '一致したら更新
b.Cells(1, 2) = a.Cells(1, 2) : b.Cells(1, 3) = a.Cells(1, 3) '値段&数量
b.Cells(1, 4) = TimeStamp '更新日(更新日も更新ファイルの値を反映するなら要修正)
bMatch = True
Exit For
End If
Next b
If bMatch = False Then
MsgBox "データ " & Chr(34) & CStr(a.Value) & Chr(34) & "(" & a.Row & "行目)は見つかりませんでした。", vbExclamation
End If
Next a
If bIsOpen = True Then '既に開いているデータファイルがあれば保存して閉じる
wbDest.Save : wbDest.Close : Set wsDest = Nothing : Set wbDest = Nothing : bIsOpen = False
End If
End Sub
704デフォルトの名無しさん:2011/09/09(金) 13:31:07.40
ここだとインデントもなくなるし複数のレスに跨ると見辛くなるしpastebinの類を使った方がいい
705デフォルトの名無しさん:2011/09/09(金) 14:41:03.12
スレ汚してしまって、ゴメン。次回以降、気をつけます。
706デフォルトの名無しさん:2011/09/09(金) 15:29:15.05
Excelで管理するようりDBで管理したほうがよさげなデータだな
707デフォルトの名無しさん:2011/09/09(金) 15:30:52.22
Janeだと引用付きレスを使えばインデントも復元できるけど、やっぱ半角スペースを全角スペースに全置換する程度の気遣いは必要かもね
708デフォルトの名無しさん:2011/09/09(金) 15:39:29.87
それは気遣いちゃう
気違いじゃ
709デフォルトの名無しさん:2011/09/09(金) 15:51:08.43
>>706
その意見に大賛成だけどネックは「今まで記録マクロしか扱ったことがない素人」にDB扱わせるのは
問題ありすぎだと
710デフォルトの名無しさん:2011/09/09(金) 15:56:41.33
でも5万件もの商品データを扱うのにExcelを使ってるような
会社?が信用できるのかどうか。
遊びでもなさそうだし。
711デフォルトの名無しさん:2011/09/09(金) 16:28:34.60
>>710
>>698に「1ファイルに3〜5万件のデータがあるため」と書かれているので
a. A〜Zのファイルそれぞれに3〜5万件ある
b. 更新用ファイルの内容が3〜5万件ある
b-1. 全データ数が3〜5万件あって、毎回その全てのデータが更新用ファイルに入っている
b-2. 全データは5万件以上あって、更新用ファイルにはその中の3〜5万件分が入っている

のどれかなんだけど、Zから始まるものが3万件もあるとは考えづらいのでb.じゃないかと睨んでる。

そうすると、処理毎に3〜5万回の検索をしなければならないので、データベース的なものを
考えないと無理だと思う。(金曜の夜に起動しておいて、月曜来たときに終わってればOKとかいう場合は別)
712デフォルトの名無しさん:2011/09/09(金) 16:33:50.13
まぁでも事前に26個のデータファイルをオープンしておいて、3〜5万回のrange.find()しても
たいした時間かからないような気もする。

あと、>>701のコードは駄目駄目だから。rangeをSelectするのはド素人。
713698:2011/09/09(金) 21:29:19.94
用途は仕事です。
データ件数の話ですが,フォルダ1内ののA〜Zのファイルがそれぞれ3〜5万件といったところです。
更新データは1万以下です。
正確には数の少ないX〜Zなどは1ファイルにまとめてあったりするところもあります。
結局は全部開いて検索しなければならないと思ったので詳細は省いて説明してしまいました。

時間がある程度かかることは承知していますが,その間放置しておけばよいので,
できるだけ自動化して上手く反映させられることを優先しています。

>>701
ありがとうございました。

でもこのコードは駄目駄目?なんですか?
まずAのファイルから開いてFor Eachで検索→一致したものを更新→Bのファイル→C……Zまで繰り返し
という流れで良いのでしょうか? まあそれが分かっても自分でコードは書けないわけですが
714デフォルトの名無しさん:2011/09/09(金) 21:51:45.53
>>713
>>701です。あくまで1例だけど、考え方はその理解で合ってる。
確かに指摘されてる通り直す余地が色々ある効率も良くないコードだけど、
一応やりたい事は実現できる。おいらもVBA熟練者じゃないんでお手本を見て参考にしたいなぁ。

更新データだけでなく、フォルダ中のデータも並びを入れ替えても良いなら、
最初にフォルダ中のデータも全部ソートしちゃうと効率上げられるね。
フォルダ中のデータに存在しないレコードを探す場合以外は、
マッチング処理用の走査開始位置を、前回のマッチング行の次の行から行えば良いので、
データ全体を検索のために走査する回数は1回で済ませられるはず。

まぁでもみんなの言う通り、Excelで処理しなければならない特別な理由が無いなら、
データベースに移行した方が良いと思うし、イニシャル毎にファイルを分ける運用も
やめてデータは1つの表にまとめた方が良いと思う。
それなら今回の処理だってACCESSとかならSQLを1文書くだけで済む。
715デフォルトの名無しさん:2011/09/09(金) 23:24:55.48
全角スペースでインデントできるけど。
716デフォルトの名無しさん:2011/09/09(金) 23:25:57.60
物すごく遠回りなデータベース
717デフォルトの名無しさん:2011/09/09(金) 23:32:39.25
Range("A1").FormulaR1C1 = "='E:\[Book1.xls]" & i & "'!RC-'E:\[Book2.xls]" & i & "'!RC"
作業しているブックのシート名とBook1のシート名が同じ場合、上のようなマクロを実行すると
「リンクするシートを選択してください」とBook1のシートを選択する小窓が出ます。
Book2と同じシート名では問題なく実行できたのですが
なぜこのようになるのか教えてください
718698:2011/09/09(金) 23:57:35.55
>701
ありがとう。まず少ないデータで確認しながらやってみます。

>716&その他の方
遠回りせずにすむ方法があればぜひ教えてください
719デフォルトの名無しさん:2011/09/09(金) 23:59:43.06
まずaccessを買ってください
720デフォルトの名無しさん:2011/09/10(土) 08:16:09.19
>>673
質問者とは全然関係ないんだけど
たまたま似たようなことやっててとても参考になりました。
どうもありがとう
721デフォルトの名無しさん:2011/09/10(土) 08:18:44.44
Accessを買わなくてもADOでSQLはつかえるぞ
メモりリークするけどw
722デフォルトの名無しさん:2011/09/10(土) 08:43:01.94
>>721
それは何かしらのデータベースがインストールされていればの話でしょ。
mySQLとかPosGreとか無料のDBインストールして使ってみるのもいいかもしれないけどね。

DB使うってことは必然的にSQLの知識も必要になってくるわけで。
VBAで手軽にっていうのとかけ離れているのかもしれない。
DB向けの内容をExcelにやらせていること自体、システム設計に問題があると思う。
723デフォルトの名無しさん:2011/09/10(土) 09:10:02.17
>>722
> >>721
> それは何かしらのデータベースがインストールされていればの話でしょ。
> mySQLとかPosGreとか無料のDBインストールして使ってみるのもいいかもしれないけどね。

Excelの表に対してもADO&SQLで操作できるぞ?一部使えない命令(DELETE文とか)もあるけど
でも、使ってみたかんじではちょっと凝ったSQLは上手く動かなかったな
724デフォルトの名無しさん:2011/09/10(土) 09:23:53.56
ExcelをDBとして使うのが間違ってるからなぁ

絵を書くのにペイントを使わずワードを使ってるようなものだし
725デフォルトの名無しさん:2011/09/10(土) 10:22:21.98
たまにはこいつのことを思い出してください
http://www.connectionstrings.com/excel

サポートキレたって聞いたけどまだ生きてるのかな・・・
726デフォルトの名無しさん:2011/09/10(土) 10:24:32.72
脊髄反射で書いてしまった
727デフォルトの名無しさん:2011/09/10(土) 21:59:43.93
OS=XP
エクセルバージョン=2003

ワークシートを判別する方法を教えてください。
もしSheet1がアクティブだったらこの処理。
Sheet2がアクティブだったらこの処理ってマクロ組んでるんですけど
IF反応してくれません。
他に.Selectとか =Trueとか試してみたけどさっぱり・・・
ググレカスしてもヒットせず途方に暮れてます。。。

IF Sheets("Sheet1").Activate Then
処理
Elseif Sheets("Sheet2").Activate Then
 処理
 ・
 ・
 ・
728デフォルトの名無しさん:2011/09/10(土) 22:16:48.89
If ActiveSheet Is Worksheets("Sheet1") Then

てな感じかな。
729デフォルトの名無しさん:2011/09/10(土) 22:18:17.76
>>727
Activateはシートをアクティブにするメソッド
アクティブなシートで処理を切り替えたいなら、
ActiveSheet.Nameみて判断すればいい
730デフォルトの名無しさん:2011/09/10(土) 22:31:31.23
>>728
>>729

解決できた!ありがとう。
助かりました。

知っていれば簡単な記述だけど、知らなかったら難しいですね。
おかげさまで更に応用させられそうです。
731デフォルトの名無しさん:2011/09/10(土) 22:37:15.47
これはググレカスと言わざるを得ない
732デフォルトの名無しさん:2011/09/10(土) 23:14:22.96
各シートがアクティブかどうか見るんじゃなくて、
アクティブなシートは何か調べるっていう発想の転換が必要なわけで
自分で書いてるけどいろいろググってもヒットしなかったんだろ

まあどんな単語でググったのか気にはなるが
733デフォルトの名無しさん:2011/09/11(日) 03:01:35.79
アクティブかどうかの判定の目的なのにActivateメソッドを使うって事は、
英語力に問題があるような…。高校で英語サボるとこうなるのか?
734デフォルトの名無しさん:2011/09/11(日) 05:23:26.90
最近VBAに必要性を感じて入門サイトなどから勉強して概要はつかめたのですが
今現在は、図形描画ツールによって作成された数十個のテキストボックスに書かれた文章をセルにコピーペーストするという
作業をやりたいのですが、

以前にそのスクリプトを頂いたのですが、数十個あるうちの半分ぐらいしかコピーペーストされなかったりします。

自分でそのコードを理解して、思うように作り直したいと思い勉強していたのですが、まだまだイマイチ理解できず。
思うように書けません。スクリプトを作っていくときに、熟練した方はどのように調べて書いているんでしょうか?
私はヘルプを読んだり、マクロの記録をやったりして出てくるスクリプト文とにらめっこしているのですがピンと来ないです。

用途別にわかりやすく解説されたリファレンスなどがあるサイトなどないでしょうか?
イメージとしては辞書を引きながらみたいな感じで少しずつでも目的のものが書けていくようになりたいのですが
そういう作業に適したサイトなどあるでしょうか?

熟練した人はヘルプなどから、細かなオブジェクトやメソッドを理解して作っていってらっしゃるんでしょうか?
735デフォルトの名無しさん:2011/09/11(日) 11:51:19.06
=================
取りあえず、下のコードを実行する
Sub test()
Dim O As Object
On Error Resume Next
For Each O In ActiveSheet.Shapes
Debug.Print O.TextFrame.Characters.Text & " " & O.Name
Next
End Sub
デバッグ表示に「図形のテキスト 数字」が表示されている
その数字を下のコードのShapes(?)に入れる

Cells(1, 1) = ActiveSheet.Shapes(?).TextFrame.Characters.Text

複数の場合はShapes()の所をForで回して。
========================
ちなみに入門サイトで図形の操作はあまりないよ。
基本はWorksheetの操作。
グラフ・ピボット・図形はまれ。

サイトは検索しだいで出てくるけど、素人には解りにくい。
さらにヘルプはもっと解りにくい。

>>>細かな・・・理解とあるが時と場合による。
オブジェクトやメソッドと言うよりプロパティ(引数)は
組み合わせ次第でかなり変わる。



736デフォルトの名無しさん:2011/09/11(日) 14:02:38.21
熟練した人はそりゃあ細かな仕様を知っているし、ヘルプも読めます。
でもVBA=VB6+EXCELなんで
普通の人が深く理解するのは難しいかも知れないです。
とりあえずヘルプについてはある日突然読めるようになります、多分。
それまで頑張ってみてはどうでしょうか。
737デフォルトの名無しさん:2011/09/11(日) 16:17:31.67
>>735>>736
ありがとうございます。やっぱり地道にググッたりヘルプったりして
調べていくしかないのですね。

>>735様、コードもありがとうございます。
>>736様突然読めるようになるというのは、なんとなくわかります。
色々調べながらやってると、前よりはちょっとだけ意味がわかるので。
わかりました。ありがとうございます。
738デフォルトの名無しさん:2011/09/11(日) 23:45:13.68
Likeを使った文字列の一致法で
文字列の中に$が入っていなかった場合の式は
Range("A1") like "[!$]"
では上手くいかないのですがどこが駄目でしょうか?
教えてください。
739デフォルトの名無しさん:2011/09/11(日) 23:57:52.71
>>738
not (〜 like "$")かな
〜 like "[!$]"だと「$以外の任意の文字がある場合」でtrueなんでない
740デフォルトの名無しさん:2011/09/11(日) 23:58:26.91
Likeは部分文字列のマッチングには使えないよ
やるならこう
If Not s Like "*$*" Then
'入っていなかった場合の処理
End IF
741デフォルトの名無しさん:2011/09/12(月) 09:57:48.91
Likeにこだわるのはなぜ?
できなければMidとかで取り出せば?
理解せずコピペしたって、暫くしたら
意味不明なコードになるだけ。
742デフォルトの名無しさん:2011/09/12(月) 10:10:44.86
Like演算子が好きだけど、Likeの機能じゃ事足りないとなたら正規表現を使うのが良い

まあ正規表現で出来ることは、コードが冗長になっても良いなら全てVBAの組み込み関数と
制御構造で再現できるが、VBScript.RegExpならVBAから簡単に使えるし、
Win98SE以降ならOSに標準で入っているから避ける理由も無いだろう

まあVBScript.RegExpで事足りなくなると、次は鬼車などのライブラリとなるが、ここまでくると
敷居が高いと感じる人も居るし、鬼車の入ってない他機では使えないなどの障害も出てくるけどな

VB6の話になるが、俺の場合正規表現パターンをユーザーが入力するようなアプリでは
鬼車使って、正規表現を決め打ちで組み込む場合は、ほとんどVBScript.RegExpを使ってる
743デフォルトの名無しさん:2011/09/12(月) 10:57:23.18
この用途ならInStrが一番良さそうに思うが
744デフォルトの名無しさん:2011/09/12(月) 13:19:26.63
VBAスレで正規表現を薦めるのは悲しいバグを生むだけな気がする
745デフォルトの名無しさん:2011/09/12(月) 13:27:31.66
バグを見つけたら新たなバグを埋め込んで納期と責任をずらすんだ
746デフォルトの名無しさん:2011/09/12(月) 13:32:27.17
>>744
残念、ハズレ

正規表現使って悲しいバグ生む奴は、正規表現使わなくても結局悲しいバグを生むし
正規表現無しなら悲しいバグ生まないという奴は、正規表現使っても悲しいバグなど生まない

結局は、本人がデキる奴かデキない奴かということで、正規表現を使うか使わないかは関係なかったりする
747738:2011/09/12(月) 13:56:18.16
>>739-740
ありがとうございます。参考にさせて頂きます。
自分のプログラムへの理解度が低いのは分かっています。
なのでいろいろと作ってみて勉強をしている最中です。
いろいろな意見が聞けて助かっています。
748デフォルトの名無しさん:2011/09/12(月) 14:10:10.81
>>746
お前がハズレ人間だ。
このスレから去れ。
749デフォルトの名無しさん:2011/09/12(月) 14:44:02.66
>>738
Likeを使うことそれ自体が目的じゃないのなら、
If InStr(Range("A1").Value, "$") = 0 Then
  'なかった時の処理
End If
750デフォルトの名無しさん:2011/09/12(月) 16:00:37.98
I hate like !!
751デフォルトの名無しさん:2011/09/12(月) 17:31:18.31
>>750
ワロタwww
752デフォルトの名無しさん:2011/09/12(月) 17:58:54.49
>>748
キミはバグの有無に関わらず悲しい奴だなw
753デフォルトの名無しさん:2011/09/12(月) 18:02:08.47
自分がずれまくってるのに気づかない勘違い君憐れ
754デフォルトの名無しさん:2011/09/12(月) 18:09:19.20
いや、そうでもないか
755デフォルトの名無しさん:2011/09/12(月) 18:19:37.92
InStr()を使うより、RegExpを使う方が一般にバグの入り込む余地は増えると思うが。
つか、なんでこの流れで正規表現の話になるのかわからんわ。
756デフォルトの名無しさん:2011/09/12(月) 18:25:44.16
正規表現使って悲しいバグ生む奴は、正規表現使わなくても結局悲しいバグを生むし
正規表現無しなら悲しいバグ生まないという奴は、正規表現使っても悲しいバグなど生まない(キリッ
757デフォルトの名無しさん:2011/09/12(月) 18:25:55.53
> Like演算子が好きだけど、Likeの機能じゃ事足りないとなたら正規表現を使うのが良い
ってだけで、別に件の処理に正規表現使えと言ってるわけでもないのに
何故か勘違いしたバカが湧いたから、延々と正規表現の話が続いてる。
758デフォルトの名無しさん:2011/09/12(月) 20:08:19.88
この程度のことなら普通はLikeかInStrで十分だわな。
759デフォルトの名無しさん:2011/09/12(月) 20:12:00.10
>>758
普通っていうとファビョり出す人が結構いるのから気をつけんとな。
760デフォルトの名無しさん:2011/09/12(月) 20:16:55.54
>>759
うん知ってる。
761デフォルトの名無しさん:2011/09/12(月) 20:28:19.58
>>756
そのカキコが君には悔しくて仕方なかったようだけど、
言ってることは正論でしょ。
762デフォルトの名無しさん:2011/09/12(月) 21:18:29.19
どうせバグを生むなら何もするな
もしくは全部やれ
763デフォルトの名無しさん:2011/09/12(月) 22:41:40.35
流れぶった切ってすみません。

ブール型の変数ってTrueとFalseの2値しか取らないのだから
1bitでも十分な気がするのですが、
どうして2Byteもメモリを使うのでしょうか?

例えば、PCで2Byteの方が扱いやすいという理由だとしたら
バイト型変数が1Byteだということと整合性が取れないですし。

別に理由を知らなくても特に困らない興味本位の質問なのですが、
どなたか理由をご存知でしたら教えてください。
764デフォルトの名無しさん:2011/09/12(月) 23:08:24.86
>>763
少なくともビット単位では扱いにくいしメモリ効率も悪いだろう
何ビット目に割り当てているっていう情報が必須でしょ

バイトじゃなくてワードで割り当てられている理由はちょっと分からない
バイト単位でのアクセスよりワード単位のアクセスの方が速かった気がするから
それが原因か、原型のVBでそうなっていたのをただ引き継いだだけかもしれない
765763:2011/09/12(月) 23:21:25.64
>>764
どうもありがとうございます
やっぱりワードの方が処理しやすいからですか。

根が貧乏性なせいか、理由があると分かっても
どうにももったいない気がしてしまいますw
766デフォルトの名無しさん:2011/09/12(月) 23:31:54.65
>>765
そう思うならByteを使ってBooleanの代わりをさせた場合と
Integerとマスクを使ってビット単位でBooleanの代わりをさせた場合と
Booleanそのものを使った場合とで実行速度がどれくらい違うのか測ってみるといいのでは?
767763:2011/09/12(月) 23:52:39.32
>>766
>そう思うならByteを使ってBooleanの代わりをさせた場合と

いや、そこまでするほどの話じゃないのでおとなしくBoolean使います。
あと、マスク云々の方はやり方すらわからないので私にはできないです。
わざわざ提案していただきましたがご期待に沿えず申し訳ないです。
768デフォルトの名無しさん:2011/09/13(火) 00:45:38.73
というか、Variant_Booleanじゃないの?
769デフォルトの名無しさん:2011/09/13(火) 03:50:05.87
おそらく16ビット単位でデータを処理するCPUを想定して設計されているんだと思う
CPU的にはバイト型も16ビットでも同じ速度なんだが、それではメモリの効率が悪いのでバイト型は8ビットで済むようにしてる
ただ、バイトデータのメモリ格納には制限があったりするんで、実際にVBAで1バイトの変数が、メモリを1バイトしか使ってないとは限らんはず
770763:2011/09/13(火) 07:05:51.69
>>768
>>769

すみません、寝落ちしてました
こんなくだらない質問に色々教えてくださった皆さん
どうもありがとうございました。
771デフォルトの名無しさん:2011/09/13(火) 10:30:43.18
聞いてないし
772デフォルトの名無しさん:2011/09/13(火) 10:33:50.96
>>769
間違いだらけで話にならん
773デフォルトの名無しさん:2011/09/13(火) 11:02:28.43
addressof 演算子でvbaの関数アドレス引っ張ってプロセスメモリを見るソフトで関数アドレス付近を見ると
なんとなくP-CODEっぽい
774デフォルトの名無しさん:2011/09/13(火) 11:36:21.64
知ったかは書き込みを遠慮しなさい。
775デフォルトの名無しさん:2011/09/13(火) 11:39:48.32
便所の落書きだろ?
776デフォルトの名無しさん:2011/09/13(火) 11:40:32.11
おまえもな〜
777デフォルトの名無しさん:2011/09/13(火) 11:42:01.30
じゃあみんなべんじょなかまだ
778デフォルトの名無しさん:2011/09/13(火) 23:47:47.83
ここで弁当食べていい?
779デフォルトの名無しさん:2011/09/14(水) 07:45:26.44
>>778
クチャ食い禁止。
780デフォルトの名無しさん:2011/09/14(水) 13:19:01.80
むしゃむしゃ
781デフォルトの名無しさん:2011/09/14(水) 13:29:16.31
ぱくぱく
782デフォルトの名無しさん:2011/09/14(水) 14:52:35.19
つるつる
783デフォルトの名無しさん:2011/09/14(水) 17:46:17.99
おまいら、エサだぞ。

データ転記の際の上書きコードを教えろ

【スペック】
シートAに入力フォーム、シートBにデータテーブル。
シートAに入力したレコードをシートBに転記。(ボタン1)
シートBのレコードからシートAにレコードを呼び出す。(ボタン2)

【問題】
データを呼び出すコードを使った後、再度入力ボタンを押すと
転記先用シート”データテーブル”には呼び出した前のレコードと再度入力したレコードが重複。

【教えろ】
呼び出したデータに対し上書きできるコードをおまいら教えろ
784デフォルトの名無しさん:2011/09/14(水) 17:50:16.66
もう高度すぎて頭がクラクラするわ
785デフォルトの名無しさん:2011/09/14(水) 18:42:07.13
あわよくば丸投げで書いて貰おうってやつか?

俺も>>783みたいなことは厨房の頃やったっきりでしばらくやってないから
もう訳解らなくて目眩がする
786デフォルトの名無しさん:2011/09/14(水) 23:20:26.51
重複チェックにはキー(レコードを一意に特定するもの)が必要になる。
残念ながらこれはRDBの概念。
EXCELで出来ちゃったらAccessいらないわな
SQLServerなんかも無料で良いかも
787デフォルトの名無しさん:2011/09/14(水) 23:39:11.21
excelの並び替えだとうまく並ばなくて、Shift_JIS順に並んでるみたいです。

例えば、a2に”亜”と入っていて、
a3に”亜”のShift_JISの9999(例)とか表示したい場合は
どうしたらいいのでしょうか?よろしくお願いします。
788デフォルトの名無しさん:2011/09/14(水) 23:54:30.44
そういうのはユーザー定義関数が良いな。
Excelが手元に無くて試せないけど、
asc("亜")でコードが取れるようなのでそれを返却するようにしてはいかが?
789デフォルトの名無しさん:2011/09/15(木) 01:35:30.85
ウソ教えないで
790デフォルトの名無しさん:2011/09/15(木) 01:47:36.94
CODE(A1) 文字列の先頭文字に対応する ASCII または JIS コードを返します。
791デフォルトの名無しさん:2011/09/15(木) 07:05:12.75
dim s as string
s = "あ"
dim hoge() as byte
hoge = strconv(s, vbfromunicode)
dim c as string
for each c in hoge
print hex(c)
next
792デフォルトの名無しさん:2011/09/15(木) 07:49:59.61
厨の頃コード自体を動的に生成するのやったわー
多重ループの中の一行だけ変えるために
793デフォルトの名無しさん:2011/09/15(木) 08:10:10.96
Dim b() As Byte
b = StrConv("亜", vbFromUnicode)
Dim i
Dim s As String
For Each i In b
s = s & Hex(i)
Next
MsgBox s
794デフォルトの名無しさん:2011/09/15(木) 10:01:58.48
Excel2007
先頭一文字の文字種別を判定しようとしてます
Sub test_Kanji()
Dim wrd As String
Dim i As Integer
For i = 1 To 10
wrd = Left(Cells(i, 1), 1)
Select Case LCase(wrd)
Case "a" To "z"
Cells(i, 2) = "アルファベット"
Case "あ" To "ん"
Cells(i, 2) = "ひらがな"
Case "ア" To "ン"
Cells(i, 2) = "カタカナ"
Case Is >= "亜"
Cells(i, 2) = "漢字"
End Select
Next
End Sub
んで以下の文字列に対してチェックしたんですが、(互)換、(一)定範囲、(二)に対してはチェックが出来ませんでした。
互換
一定範囲
asdrf
ひらがな
カタカナ
漢字


何故なんでしょうか。後、対処方法とかお教え願えないでしょうか
795デフォルトの名無しさん:2011/09/15(木) 10:40:49.73
>>794
Option Compare Text
796デフォルトの名無しさん:2011/09/15(木) 11:27:57.46
エクセルからUDPでいいので、データを同じLAN内のPCへ送りたいのですが、
エクセル単体で可能でしょうか?
ググったらエクセルでTCP,UDP,RS232Cのテストをするソフトがあったのですが、
VB6のライブラリがいるとか書いてあったので、そういったものが無くても可能でしょうか?
797796:2011/09/15(木) 11:29:58.15
エクセル2003です。
798デフォルトの名無しさん:2011/09/15(木) 11:41:58.22
winsockをapiで呼べばできるよ。
799デフォルトの名無しさん:2011/09/15(木) 12:29:39.14
>>795
う〜っむ、、、、
有難うです
800デフォルトの名無しさん:2011/09/15(木) 12:47:12.71
801デフォルトの名無しさん:2011/09/15(木) 13:00:37.62
>>796
自分でVBA用のライブラリを作ればいい
ライブラリの中身は通信関係のAPI呼び出しの定義が書いてあるだけなんで、
自分でいちいちAPI呼んでもいいけど、ライブラリ化しといた方があとあと便利
802デフォルトの名無しさん:2011/09/15(木) 13:17:06.54
>>801
多分いろいろ勘違いしてると思うよ
803デフォルトの名無しさん:2011/09/15(木) 18:57:08.40
>>801
ほう、詳しく教えてくれないか?
804デフォルトの名無しさん:2011/09/15(木) 18:58:58.32
いつでもAPIが使えるように宣言を書いたライブラリを作っておくと便利だよって事でしょ。
805デフォルトの名無しさん:2011/09/15(木) 19:04:40.12
>>804
>>801からそれを読み取るとは尊敬するわ
806796:2011/09/15(木) 19:14:36.05
皆さんありがとうございます。
winsockが私のエクセルにはないらしいです。
VBAエディタの参照設定にも無かったorz
807デフォルトの名無しさん:2011/09/15(木) 19:31:27.72
>>805
コードを書けって言ってるんかと思ったけど、VBAでAPI使うって
単純に宣言を書き直すだけじゃん。
コールバックみたいなのもあるけど。
808807:2011/09/15(木) 19:33:54.65
それくらい読み取れよとも思う。
809デフォルトの名無しさん:2011/09/15(木) 19:42:01.19
読み取れない香具師は馬鹿だろ
810デフォルトの名無しさん:2011/09/15(木) 21:56:53.36
自分でライブラリを作ればいいって解決策を提示したかのような口ぶりで、
今手間はかかるが次同じような事があれば楽だぜ!
って、、、結局手間だし、
796はAPIを使用することにに難色を示していて、手間を惜しんでる訳ではないし、
796が言ったライブラリってそーゆー意味じゃないし。

804を見て本物のエスパーだと思った。
811デフォルトの名無しさん:2011/09/15(木) 21:59:51.05
バカンス
812デフォルトの名無しさん:2011/09/15(木) 22:16:47.95
このへんコピペすれば動くよ
http://pcdn.int21.co.jp/pcdn/vb/noriolib/vbmag/9802/winsock/
813デフォルトの名無しさん:2011/09/15(木) 22:22:11.06
814デフォルトの名無しさん:2011/09/15(木) 22:22:36.00
>>810
お前もう出てこない方が良い。
なんか、gdgd
815デフォルトの名無しさん:2011/09/16(金) 01:21:41.77
ソースコードでライブラリですって出されると何か違う感じだな
バイナリ配布できないvbaならではって感じ
816デフォルトの名無しさん:2011/09/16(金) 05:28:21.74
VBAだけでDLL作れないが、バイナリ配布ってならDLLでライブラリ配布できるぞ
ただ元の質問が外部モジュールや外部ライブラリとか使わないでできないか、って話だから
ソース提示してコピペすれば動くって言ってるんじゃないか?
817デフォルトの名無しさん:2011/09/16(金) 06:40:18.93
>>815
それは、「私はライブラリの意味を勘違いしている愚か者です」って自嘲しているのか?
818デフォルトの名無しさん:2011/09/16(金) 08:11:57.57
そういうときのアドインじゃないの?
819デフォルトの名無しさん:2011/09/16(金) 08:26:24.60
>>813で楽勝で動いた
820デフォルトの名無しさん:2011/09/16(金) 08:31:14.03
>>817
かつ、OCX版を知らなかったんだろう。
821デフォルトの名無しさん:2011/09/16(金) 09:43:47.68
>>813
ありがとうございます。
今、教えてもらったサイトを見てテストしようとしたのですが、
Private Sub Command3_Click() のしたほうに書かれている

lngWnP = GetWindowLong(Text1.hWnd, GWL_WNDPROC)

で、hWndがないとエラーが出てしまいます。

フォームには、プログラムを見てコマンドボタン3個とText1をみてテキストボックスを1つ
置いたのですが、何がいけないのでしょうか?

822796:2011/09/16(金) 09:47:27.15
821は796です。
よろしくお願いします。
823デフォルトの名無しさん:2011/09/16(金) 09:58:45.40
他の人が動いたって聞いてから試すようじゃ
教える価値が無いと思う。
824796:2011/09/16(金) 10:20:28.45
いや、今朝見たから。。。
825デフォルトの名無しさん:2011/09/16(金) 10:43:55.81
>>823
お前には聞いてない
826デフォルトの名無しさん:2011/09/16(金) 12:15:47.44
>>820
あれVBAでOCX作れたっけ
827デフォルトの名無しさん:2011/09/16(金) 15:59:00.94
>>821
それってサーバー側に必要なだけじゃない?
クライアントにはいらないでしょ?
828デフォルトの名無しさん:2011/09/17(土) 03:57:23.09
"=countif(B1:B100," & i & ")"
i の値を0からループできますか?
今は0と1以上で分けて問題なく動いてますが、まとめてしまいたいです。
829デフォルトの名無しさん:2011/09/17(土) 05:01:18.79
>>828
何を言いたい?ちゃんと脳内を整理して書こうよ。
830デフォルトの名無しさん:2011/09/17(土) 06:24:36.86
>>828

つ Option Base 0
831デフォルトの名無しさん:2011/09/17(土) 12:29:09.38
図形に文字が書かれていたら表示するのを作っているのですが

For Each myShape In Worksheets("Sheet1").shapes
If myShape.Text <> "" Then
MsgBox myShape.Text
End If
Next myShape

text caption labelいろいろためしたけどだめでした
どれにすればいいのでしょうか
832デフォルトの名無しさん:2011/09/17(土) 12:38:48.35
myShape.TextFrame.Characters().Text
833デフォルトの名無しさん:2011/09/17(土) 13:06:18.91
On error Goto nex
For Each myShape In Worksheets("Sheet1").shapes
If myShape.TextFrame.Characters.Text <> "" Then
処理
End if
nex:
Next myShape

on error使ってエラー出たら次に飛ばすようにしてみたのですがエラーでます
なぜでしょうか
834デフォルトの名無しさん:2011/09/17(土) 14:20:58.92
なぜってErr.Descriptionで分かるでしょう。
それぐらいはしような
835デフォルトの名無しさん:2011/09/17(土) 14:30:37.16
お勧めはしないが、On Error Resume Next をつかい、その都度ごとにErr.Numberを確認すれば期待する動きになる、たぶん

それか、

On error Goto nex
For Each myShape In Worksheets(\"Sheet1\").shapes
If myShape.TextFrame.Characters.Text <> \"\" Then
処理
End if
nex:
エラー解消処理の何か
Resume \'再試行
Next myShape

すればいい、たぶん。

つーか、gotoでループなんかの処理制御しないほうがいいと思う
836デフォルトの名無しさん:2011/09/17(土) 14:36:34.45
というか文字が入力されてないかどうか判定するくらいならエラーで判定しなくても他に方法あるんじゃね
知らないけど
837デフォルトの名無しさん:2011/09/17(土) 19:38:53.96
Variantと他の型の変数の計算速度って同じ?
838デフォルトの名無しさん:2011/09/17(土) 20:12:20.27
試せばわかるじゃん。
839デフォルトの名無しさん:2011/09/17(土) 20:22:43.19
だからね、そこまで速度が気になるんだったらExcelのVBAなんか使わずに実行ファイルをコンパイルして作れって
それでも不満ならアセンブラやれ、アセンブラ。
840デフォルトの名無しさん:2011/09/17(土) 20:43:34.08
だいたい同じ。でもちょっと違う、気になる人もいれば気にしない人もいる。
841デフォルトの名無しさん:2011/09/17(土) 21:18:28.61
変数の種類について教えて下さい。
テキストファイルを読み込んだ時に、変数に入れて
一行一行取り出して処理をしたいのですが、
それに適した変数の型ってありますか?
配列を自分で作るのでしょうか?
842デフォルトの名無しさん:2011/09/17(土) 21:21:35.14
Line Inputなんてなかったっけ?文字列型で、というか扱うデータも分からんな
843デフォルトの名無しさん:2011/09/17(土) 21:27:51.49
早速のレス、ありがとうございます。
ググってすぐに、Line Inputは出てきたのですが、
用例として1行読み込んだらセルに書く用例ばかりでして。

読み込んだ1行を溜め込む、リスト形式の変数がないかを
お聞きしたかったんです。
844デフォルトの名無しさん:2011/09/17(土) 22:02:19.51
変数に入れてってそういうことか
Redimで配列を大きくしながら代入していけばいいし
ファイルをバイナリで丸ごと文字列型に読み込んでsplit(ファイル全体, vbCrLf)で配列に分割してもいい
845デフォルトの名無しさん:2011/09/17(土) 22:17:18.82
ありがとうございます。
助かりました。
846デフォルトの名無しさん:2011/09/17(土) 22:23:58.06
.NETのコレクションクラスを使う方法もある

Dim objArrayList
Dim obj
Set objArrayList = CreateObject("System.Collections.ArrayList")
objArrayList.Add "a"
objArrayList.Add "bb"
objArrayList.Add "ccc"
For Each obj In objArrayList
MsgBox obj
Next
847デフォルトの名無しさん:2011/09/17(土) 22:42:49.54
無いでしょ
.Netめっちゃ遅いし、初回はCLR起動時間もプラスされるし
848デフォルトの名無しさん:2011/09/17(土) 23:04:31.20
VBAならCollectionなかったっけ
849デフォルトの名無しさん:2011/09/17(土) 23:24:34.25
VBAならscripting.dictionaryでしょ
850デフォルトの名無しさん:2011/09/18(日) 00:03:31.79
>>841
バリアントにスプリットするのが簡単でいいと思う
851デフォルトの名無しさん:2011/09/18(日) 00:20:23.52
>>844
改行コード区切りをvbCrLfにしちゃうって誰に教わったの?
852デフォルトの名無しさん:2011/09/18(日) 01:30:31.33
VBA初心者です。
お勧めの入門書があれば教えて下さい。
今は「ひと目でわかる・・・」シリーズを見てます
853デフォルトの名無しさん:2011/09/18(日) 01:39:24.21
VBAは触ったその日にそれなりのものが出来るくらいLLしいから
入門書読んでる時点で将来性ないと思う
本気でやるならマクロの記録で自分で調べてくのがいいです
854デフォルトの名無しさん:2011/09/18(日) 08:00:14.33
>>853
本人がまずどのくらいプログラムできるか次第

他の言語である程度プログラムできるのであれば
マクロの記録から調べて行けば何とかなる
プログラム全くの初心者がマクロの記録みてどうこうするのは無理がある

次の入門書はいろいろ自分でみて、ある程度内容が解るけど全部は解らない、ぐらいのが良いと思う
855デフォルトの名無しさん:2011/09/18(日) 10:41:53.37
>>853
マクロの記録はEXCELのオブジェクトモデルを理解する上でしか役に立たない。
俺もそうやって覚えたけど、多様なRange指定方法などを覚える為に参考書は見ておいたほうがいいよ。
856デフォルトの名無しさん:2011/09/18(日) 14:33:41.48
VBAでAAC形式のオーディオファイルのタグ書き込みってできる?
857デフォルトの名無しさん:2011/09/18(日) 16:09:56.04
>>856
バイナリファイルの読み書きができるから、可能か不可能かで言えば可能
858デフォルトの名無しさん:2011/09/18(日) 16:54:27.19
愛知 名古屋営業所
愛知 豊橋営業所
岐阜 関営業所
岐阜 四日市営業所

上記の文字列を、shift_jisに変換したいです。
愛知(88a4 926d)名古屋営業所(96bc 8cc3 89ae 8963 8bc6 8f8a)
最終的にshift_jisで並び替えをして表示したいのですが
excelの文字列をshift_jisに変換する方法はどうしたらいいでしょうか?
859デフォルトの名無しさん:2011/09/18(日) 19:43:58.71
>>858
目的を果たすためには

@セルの文字列を取得する
A取得した文字列のShift_JISコードを取得する
B取得したコードをセルに書き込む

という流れになるわけだが、Aは>>2の★3,★4にもある通り
Excelとは関係無いのでスレ違い
よって、ここで教えるとしたら@とBのみだけど、それでも良いの?
860デフォルトの名無しさん:2011/09/18(日) 22:06:42.85
そもそもExcelって普通に文字列比較したら何順になるの?SJISで並ばないならUTF16か?気にしたことがなかったは
861デフォルトの名無しさん:2011/09/18(日) 23:26:59.99
If〜ElseIfを使ってユーザーフォーム1が開かれていなかった場合、スルーして次の動作に移るようにするにはどうすればいいでしょうか?
862デフォルトの名無しさん:2011/09/19(月) 01:26:30.68
マクロ1年生です。
職場で使う工程管理表を作成しています。

下のような、ガントチャート風(?)の工程管理表を作っています。
横軸は時間、作業者の名前が縦に並んだ表で、
”各人に割り当てられた[仕事]や[休憩]などをオートシェイプのテキストボックスで作成”し、
表の上に置くことで全体の工程を管理する、という表です。

      09  10  11  12  13  14
Aさん   [仕事1]     [ 休憩 ]
Bさん     [ 仕事2 ]      [ 休憩 ]
Cさん   [    仕事3    ] [ 休憩 ]

この表を作成し使用する上で非常に手間がかかる、
”各人に割り当てられた[仕事]や[休憩]などをオートシェイプのテキストボックスで作成”
という部分をマクロを使って素早くできないか、と考えています。

イメージとしては、マクロを実行すると、
”仕事内容は?” ”必要時間は?”
という質問が出てきて、それに対して答えを入力すると、
仕事内容が書かれたテキストボックスが、必要時間に合った幅で作成される、
というようなものを作りたいと考えています。

・質問と回答のフォームが表示される
・テキストボックスを作成しそこに文字を入れる

というマクロを作ったことが無いのですが、どんなキーワードで検索すれば、
参考になるサイト等が出てくるでしょうか?
教えてエロいひと!!
863デフォルトの名無しさん:2011/09/19(月) 01:29:05.71
服を脱ぎます
864デフォルトの名無しさん:2011/09/19(月) 01:39:19.24
>862
オートシェイプのテキストボックスでなければならない必要は何ですか?
評判の悪い「エクセル方眼紙」風の使い方になるけど、10分や15分単位に列をせばめておいて、
ユーザーフォームへの入力内容の結果を受けて、当該時間の範囲のセルを結合させ、結合セルの
中に文字を入れる方法じゃダメですか? 時間の単位が5分単位とか?
865デフォルトの名無しさん:2011/09/19(月) 01:44:43.33
>>862
見事に自問自答してるじゃん。やりたいことがそれだけはっきりしてるなら一つ一つやっていったらいいよ。
検索は自分で言ってる言葉でまずググってみればいい。大抵のことはヒットすると思うよ。
ただ工程管理表なんてのはよくあるからある程度近いもののサンプルが多分見つかる気がするけど。。
866864:2011/09/19(月) 01:49:59.78
>862
× 必要
○ 理由
ついでに、セルを利用したものだと、時間の重複のチェックもわりと簡単にできます。
セルに割り当てる時間の最小単位を15分と仮定します。
ある時刻〜15:15 がすでに「仕事2」に設定されていて、続いて15:00〜15:30を
「休憩」に設定しようとしたとき、15:00〜15:15に割り当てられたセルはすでに
結合セルになっているor当該セルに値がある と判定できます。
※ある時刻が14:00などの場合、1行×5列のセル結合になっている
※ある時刻が15:00だった場合はセルの結合には該当しないけど、当該セルには"仕事2"という文字が入ってる

>865
私は>862さんではありません。
867864:2011/09/19(月) 02:03:39.70
>865
自問自答 を 自演乙 って意味にとらえてしまった。気を悪くされてたらすいません。勘違いです。もう寝ます。
868デフォルトの名無しさん:2011/09/19(月) 02:09:22.17
>>864
ご指摘の通り、セルの結合も考えてみたのですが、、、、
時間が10分単位で、使うのがおっさんばかりで細かいセルを見れないので、
テキストボックスを作って置くというやり方をしています。
仕事が増えたり減ったり伸びたりが非常に多く、簡単な操作で対応出来る点も大切です。
オートシェイプ扱えるようになりたいというのも、どうでもいい理由なんですけどね。
"ユーザーフォーム"というキーワードが知りたかったものでした。
ありがとうございます。

>>865
オートシェイプ
ユーザーフォーム
とりあえずググってみます。

こんな時間のありがとうございます。
869デフォルトの名無しさん:2011/09/19(月) 07:59:46.73
>>868
結局セルの上にテキストボックスを貼り付けるのなら、テキストボックスの文字も
見難くなるような気がするんだけど。
セルが見難いのならセルの高さをもっと大きくして、表示するフォントのポイントも大きく設定すればいいんじゃね?

セルを扱うよりオートシェープの扱いのほうがめんどくさい気もするし。
セルの結合なんてたいそうなことせずにセルに色つければ済むんじゃないかな。
仕事別に色分けすれば見やすいだろうし。
870デフォルトの名無しさん:2011/09/19(月) 09:23:13.54
>868
10分で1列となってるセルを手作業で結合させるんなら「細かい作業だからおっさんには無理」なんだろうけど
ユーザーフォームで時間を入れてマクロで結合させる方法なら「細かい作業」はないよ。
オートシェイプの方が位置とサイズをドット(?)単位で指定しなきゃならないし、処理対象のオートシェイプの
判断は大変でしょ。(新規はともかく、変更に伴うサイズ変更対象テキストボックスはどれ?)
871デフォルトの名無しさん:2011/09/19(月) 09:38:51.32
質問なのですが、VBAで変数名そのものを文字列として認識させる方法ってありますか?
872デフォルトの名無しさん:2011/09/19(月) 10:15:49.47
ないよ
873デフォルトの名無しさん:2011/09/19(月) 10:20:13.44
>>872
ありがとうございました。
874デフォルトの名無しさん:2011/09/19(月) 12:18:48.97
キーワードググったら、とりあえず思った位置にオートシェイプを作成することはでました。
あとはユーザーフォームの勉強をします。
ありがとうございます。

>>869
テキストボックスの中の文字は確かに見にくいですが、
それよりも多くの行を見渡すことでチーム全体の進捗を把握出来ることのほうが重要なんです。
ディスプレイが大きければ解決するんですけどね。
もしくはおっさんじゃなくて若者を起用するかw

>>869,870
・やっぱり時間が伸びそうだな → オートシェイプの端をドラッグして幅を広くする
・この仕事は他の人にやってもらおう → オートシェイプをドラッグして移動
工程の計画だけでなく、進捗をモニターしつつ、次の工程を作成するという使い方なので、
頻繁に書いたり消したり、伸ばしたり縮めたり、移動したりします。
オートシェイプの場合はこれらのことを直感的に行うことができるので使っています。
サッカーの作戦会議を、ホワイトボードの上で選手に見たてたマグネットを使ってやるような感じです。

だったらそもそもExcelでやるなという意見も出そうですが・・・・

勤務表がExcelなので、勤務表からその日に出勤している人をピックアップして、
工程表に名前を貼り付けて、シフトごとに並べるということをしています。
というわけでExcelを使っています。
875デフォルトの名無しさん:2011/09/19(月) 18:45:46.99
条件によって該当する値を返すVBを作ってみました。
=sif(条件1,値1,条件2,値2,条件3,値3,…,条件n,値n,値n+1)
条件Xを満たすときは値Xを、該当無しの場合は値n+1を返す

Public Function sif(ParamArray params())
 Dim c As Integer
 Dim max As Integer
 max = UBound(params())
 For c = 0 To max Step 2
  If c = max Then
   sif = params(c)
  Else
   If params(c) = True Then
    sif = params(c + 1)
    GoTo Break
   ElseIf c = max - 1 Then
    sif = CVErr(xlErrNA)
   End If
  End If
 Next
Break:
End Function

条件が14個まではOKなのですが、15個以上になるとエラーになります。原因は何でしょうか?
876デフォルトの名無しさん:2011/09/19(月) 18:56:11.68
いつも思うんだが、エラーになるって言ってる奴、なんでそのエラーメッセージを示そうとしないのだろうか。
エラーの場所も言わないし
877デフォルトの名無しさん:2011/09/19(月) 18:57:25.36
エラー内容は?
878デフォルトの名無しさん:2011/09/19(月) 19:06:54.97
VBAってBreakもないのか…
879デフォルトの名無しさん:2011/09/19(月) 19:11:19.91
>>876-877
以下のようなエラーメッセージが出ます(>の部分)

>Microsoft Excel ヘルプ(&H)

>入力した数式は正しくありません。

>・ [ヘルプ] をクリックすると、数式を修正するための情報が表示されます。
>・ 関数の作成に関するヘルプを表示する場合は、[OK] をクリックし、[挿入] - [関数] をクリックします。
>・ 数式を入力していない場合は、等号 (=) やマイナス記号 (-) を使用しないか、または入力した値の
> 先頭にシングル クォーテーション マーク ( ' ) を入力します。


OKを押すとセル内容が表示され、15番目の条件に対応する値15が反転表示されます。
配列の要素=(条件1)0,(値1)1,(条件2)2,(値2)3,・・・、(条件15)28,(値15)29,・・・・)の(値15)
0から数えて29番目の引数のところで反転!

=sif(条件1,値1,条件2,値2,条件3,値3,…,条件14,値14,値15)だとOKで
=sif(条件1,値1,条件2,値2,条件3,値3,…,条件14,値14,条件15,値15,値16)だと上記エラーになります。
880デフォルトの名無しさん:2011/09/19(月) 19:18:53.32
引数の個数に30個とか制限あったと思うけど
881デフォルトの名無しさん:2011/09/19(月) 19:37:42.03
やっぱりそう言うことですか!

ググってみたら一つの関数に使用できる引数は30 までと有りました、お騒がせしました。
882861:2011/09/19(月) 23:28:18.87
酔ってて質問の意味がよくわからない状態でした・・・すいません

ユーザーフォームのコマンドボタンにハイパーリンクを設定したものを複数作ったのですが
このマクロを登録しているexcelファイルがアクティブな時は常にユーザーフォームを表示
するように設定したいと思っています。
ブックのイベントでactivateを使用しましたが、ハイパーリンクを実行するときにもう一度
ユーザーフォームを開こうとしてエラーが発生します。
このエラーを回避するためにif〜elselfでユーザーフォームが既に開かれている場合は
次の動作に移るようにしたいのですが、次の動作に移らせる為のコードがわかりません。
説明が分かりにくいかと思いますが、よろしくお願いします。
883デフォルトの名無しさん:2011/09/20(火) 00:57:30.78
>>882
このPCにはエクセル入ってないから実際に出来るかどうか試してないんですけど、
ユーザーフォーム開く命令(たしか Userform.Show でしたっけ?)の前に
On Error Resume Next を書いておいて
開く命令の次には On Error Goto 0 で Resume Next の効果を取り消すということで
二重に開こうとしてエラーが出ても無視するように出来ませんでしょうか?

こういうやり方(エラートラップでエラーを回避する手法)は
邪道らしいですけど、とりあえず目的は果たせそうな気がします。
884デフォルトの名無しさん:2011/09/20(火) 01:12:53.06
ユーザフォームにはVisibleみたいなプロパティはないの?
885デフォルトの名無しさん:2011/09/20(火) 01:36:26.14
フォーム上のリンクボタンを処理するのに、
その処理でフォームを開く必要なんてないと思うんだが
886デフォルトの名無しさん:2011/09/20(火) 07:37:46.41
>>883
On Error GotoとかOn Error Resume Nextとか本来の使い方じゃない方法で
問題を解決するという癖はやめておいたほうがいい。
887デフォルトの名無しさん:2011/09/20(火) 07:49:08.65
>>886
On Error Resume Nextはいつも後ろめたさを感じる使い方しかしてないな。
エラーを発生させることでしか判定が出来ない状況で使うって事でいいんじゃない?
当然別の判定方法があればそちらを使うべきだが。
888デフォルトの名無しさん:2011/09/20(火) 10:01:24.07
VBAで整数Aが下記の範囲の時、Bの値を求めるには、どのようにしたらよいのでしょうか。

A B
0 〜 4 → 0
5 〜 9 → 5
10 〜 14 → 10
15 〜 19 → 15
20 〜 24 → 20
以下続く
889デフォルトの名無しさん:2011/09/20(火) 10:22:51.55
>>881
初歩的なことなので既に解決策見つけてるかも知れないけど
こういうのは配列やコレクションで解決できるよ
配列使う場合は2次元配列で、コレクションならクラス使って
条件,値,条件,値,…と交互に入れるのではなく、「条件,値」をセットで格納すると良い
890デフォルトの名無しさん:2011/09/20(火) 10:23:20.25
>>888
Int(数値/5)*5
WorksheetFunction.Floorを使うようでは素人。
891888:2011/09/20(火) 10:52:00.34
>>890
出来ました!
御回答有難う御座いました!
892デフォルトの名無しさん:2011/09/20(火) 10:52:45.98
(数値\5)*5
FloorやIntやRoundDownを使うようでは素人。


つーか、これって小学校算数の質問だよね?
計算方法が解ってる上で、VBAで整数商を求める演算子や切り捨てを行う関数名が解らないと言うならまだしも
計算方法、解の求め方を聞いているようでは、素人以前、小学校低学年以下。
893デフォルトの名無しさん:2011/09/20(火) 10:59:59.48
>>892
おっしゃるとおり
\演算子をすっかり忘れてたよ。
894デフォルトの名無しさん:2011/09/20(火) 11:04:12.06
ちなみに整数じゃなく実数で4.9とかを0にするにはInt(数値/5)*5だからね。
895デフォルトの名無しさん:2011/09/20(火) 11:25:50.28
それは実数での質問が来たときに言ってやれ
今回は整数限定での質問なんだから関係ない話だ
896デフォルトの名無しさん:2011/09/20(火) 11:57:27.90
予想通りの反応だな。
だめだこいつ。
897デフォルトの名無しさん:2011/09/20(火) 12:11:35.22
>>889
元の質問まで辿ると、それで解決できる問題じゃないな
898デフォルトの名無しさん:2011/09/20(火) 13:42:37.03
>>896
負け惜しみ(・∀・)ミットモナイw
899デフォルトの名無しさん:2011/09/20(火) 13:46:28.44
>>897
なんで?
900デフォルトの名無しさん:2011/09/20(火) 14:11:59.83
>>898
はいはい、あんたが勝ち
901デフォルトの名無しさん:2011/09/20(火) 15:22:31.37
ソートについて教えてください。
セルに1桁から5桁の数字と名前が入っています。
例 123 佐藤、 54321 鈴木 等というように。
これを数字を除いて名前だけでソートするにはどのような方法がありますか?
ヒントを教えてください。お願いします。
902デフォルトの名無しさん:2011/09/20(火) 15:38:18.31
スペースでスプリットすればいいんじゃないの
903デフォルトの名無しさん:2011/09/20(火) 16:10:40.72
まずそういうデータは列を分けましょう。
区切り位置で区切り文字をスペースにすりゃ簡単に分けることができる。
904デフォルトの名無しさん:2011/09/20(火) 16:24:35.07
>>900
ボウヤ、一人で何と戦ってるの?

周りは、君に教えを授けたり諭したりしてるつもりはあっても
君と言い争ったり戦ってるつもりの奴なんていないよ

君は質問者じゃないにしろ、君が知らないこと、忘れていたことを
教えて貰ったんだから、感謝こそすれ、悪態付いたり質問とは全く
関係ない条件出して「俺のやり方だって正しいんだ」とごねたり
するなんて以ての外だぞ
905デフォルトの名無しさん:2011/09/20(火) 16:59:05.39
煽りは楽しいよなw
ファイヤー!
906デフォルトの名無しさん:2011/09/20(火) 17:06:43.70
質問です。
セルA1が数値かどうかを調べるにはどうしたらいいですか?
また数値のとき整数かどうかを調べる方法も教えてください。
907デフォルトの名無しさん:2011/09/20(火) 17:12:35.14
なぜ調べればすぐ見つかることを聞くのか
908デフォルトの名無しさん:2011/09/20(火) 17:17:29.90
>906
★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
   コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
   ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
909デフォルトの名無しさん:2011/09/20(火) 17:21:23.36
>>907
お馬鹿なんでしょ

遊ばれてる自覚のない彼と一緒でw
910デフォルトの名無しさん:2011/09/20(火) 17:31:26.38
>>907-908
整数かどうかはInt使ってなんとかできました。
数値かどうかを教えてください。
IsNumericだと空白もTrueになってしまいます。

>>909
馬鹿ですいません
911デフォルトの名無しさん:2011/09/20(火) 17:58:45.37
じゃぁLenで長さが <> 0 という条件を付け加えれば
912デフォルトの名無しさん:2011/09/20(火) 18:37:46.85
>>911
Andで両方判定してできました。
913デフォルトの名無しさん:2011/09/20(火) 20:45:31.64
for each を逆に進めるにはどうしたらいいですか?
914デフォルトの名無しさん:2011/09/20(火) 21:08:47.18
その発想はなかったわ
915デフォルトの名無しさん:2011/09/20(火) 21:15:25.57
For Step Next の -1で逆順する・・・か?
916デフォルトの名無しさん:2011/09/20(火) 21:31:21.87
Sub 逆順()
Dim a As Range
Dim b As New Collection
Dim c As Range
Dim i As Long

Set a = Range("A1:B5")
For i = a.Count To 1 Step -1
  b.Add a(i)
Next
For Each c In b
  MsgBox c.Value
Next
End Sub
もちろん回り道のネタ。
917デフォルトの名無しさん:2011/09/20(火) 23:07:34.14
for eachは逆する仕様は無いって事ですね。
ありがとうございます。

もう一つ教えて下さい。
CSVファイルの読み込みをググっていたのですが、
例として

'CSVファイル読込
i = 1
Do While Not EOF(1)
'1行読み込む
Line Input #ch, csvStr
'カンマ区切りで配列に格納
str = Split(csvStr, ",")
'セルのレンジを指定して、配列の値をセット
Range(Cells(i, 1), Cells(i, UBound(str) + 1)) = str
i = i + 1
Loop
みたいなコードがよく書かれているのですが、
Range(Cells(i, 1), Cells(i, UBound(str) + 1)) = str
の意味がよく分からないのです。
UBoundの意味は分かったのですが、何で此で
一気にセルに書き込み留のでしょうか
もしかして一気に書き込んでる訳ではないのでしょうか?
918882:2011/09/20(火) 23:08:16.46
>>883
レス遅くなり申し訳ありません
その方法でできました!ありがとうございました
919デフォルトの名無しさん:2011/09/20(火) 23:15:03.15
どうみても一気に書き込んでるでしょう
920デフォルトの名無しさん:2011/09/20(火) 23:21:12.53
何故、一気に書き込む事になるのかが分からないのです。
セルに書き込む時に列の指定をfor等でループさせるなら
分かるのですが、UBoundは「引数に指定した配列の、最も大きい要素番号を返す 」
のですよね。
何故、これ
Range(Cells(i, 1), Cells(i, UBound(str) + 1)) = str
で、i行目の1列からi行目のスプリットされた配列数の列まで
一気に記入されるのでしょうか?
そういうものだというのなら、それまでなんですが、
その説明はヘルプに載ってませんよね?
921デフォルトの名無しさん:2011/09/20(火) 23:25:56.48
昔は高速化のためにコピペとかしてたのに
いつからこんなことができるようになったのか
922920:2011/09/20(火) 23:26:15.92
読み返したら、何か噛みついてる文章みたいになってしまいました。
そんなつもりはありませんので、よろしく御願いします。
923デフォルトの名無しさん:2011/09/20(火) 23:29:09.49
range 配列 でググッてみればいいのに
924デフォルトの名無しさん:2011/09/20(火) 23:33:30.79
>>923
ありがとうございます。
配列=配列の考え方なんですな。
スゲー!スッキリしました。
925デフォルトの名無しさん:2011/09/20(火) 23:50:28.27
>>892は小学生だから許されるけどそれ以上の人間なら関数使うよ
名前のない計算より名前の付いた処理の方が保守性に優れるから
926デフォルトの名無しさん:2011/09/21(水) 00:02:23.07
そいつに構うな
基地外だからファビョ〜ンってなるぞw
927デフォルトの名無しさん:2011/09/21(水) 00:04:25.77
>>924
おれはなんかスッキリしないんだよね、昔から。
そんなもんだって覚えたけど。
928デフォルトの名無しさん:2011/09/21(水) 02:15:27.02
ちょっとまて
配列=配列
それは違うぞ!

>>927
VBAばっかやってないでperlとか他の言語やるといい
929デフォルトの名無しさん:2011/09/21(水) 08:25:46.25
>>928
> ちょっとまて
> 配列=配列
> それは違うぞ!

えっ!違うの?
930デフォルトの名無しさん:2011/09/21(水) 09:16:16.02
RangeはRangeだよ
これは特殊な例だね
個人的にはRange.Fill(arr)みたいな仕様の方が分かりやすかったかな
931デフォルトの名無しさん:2011/09/21(水) 09:21:58.13
訂正
RangeじゃなくてRange.Value
932デフォルトの名無しさん:2011/09/21(水) 10:13:34.40
VBA始めたばかりの初心者です。
上級者の道へとスキルアップするにはどうしたらいいですか?
とにかくVBAを毎日さわっていじくりまわりたい。

就職ではIT業界は経験が重要と言われるけど、それはもっともだと思う。
オレは理系で高学歴で頭がいいけど
毎日さわって経験を積まないとどうしようもないと思ってる。
でもさわろうと思ってもVBAでやるような作業がないからいつまでたっても経験は積めないまま。

本屋に並ぶ入門書のような解説じゃなくて
いろいろいじれることのできる教材、
例えばサンプルプログラムがいっぱい載ってるやつとか
http://www.amazon.co.jp/gp/product/4844326864/
の本のように実用面重視の自分の力でいろいろコードに改良を加えていけるような
そういう経験が積める教材はないですか?
933デフォルトの名無しさん:2011/09/21(水) 10:52:04.56
>>858
四日市は三重だぞ
934デフォルトの名無しさん:2011/09/21(水) 18:47:21.33
>>932
そんな事言ってる時点で一生無能のまま
なんで毎日触ってないの?
普通に生活してれば仕事じゃなくてもテキスト処理とかやるだろ
こんな簡単にguiできるツールないよ
935デフォルトの名無しさん:2011/09/21(水) 22:10:21.51
>>932
確かに有名だねその本。
VBAにしろ他のプログラムにしろみんな経験を基に作ってるんだよ
あんたは頭が良いんだろ?逆引きとか本読んでそんなサイトを
立ち上げろよ。
excelで処理せずすべてVBAで作ってみたら?
ピボット・グラフ・図形なんて全部覚えるだけで天才だわ。
理系で頭良いんだったらmougとかの質問にもチャレンジしたら?
経験無いんだったら擬似的に質問答えながら経験も積めるはず。

最後に本なんか人それぞれ価値観違いますねん。
リファレンス型・逆引き・プログラム作成型いろいろあるから
自分で買って実際見て考えろ!
その利口な頭脳で。
936デフォルトの名無しさん:2011/09/21(水) 22:30:25.83
>>932
>オレは理系で高学歴で頭がいいけど
>VBA始めたばかりの初心者です。
>上級者の道へとスキルアップするにはどうしたらいいですか?

こう並べると馬鹿極まりない文になるなw
内容も本人も馬鹿丸出しだが
937デフォルトの名無しさん:2011/09/21(水) 22:43:55.40
>>936
なんでもできると思ってるような勘違い君じゃないからいいんじゃね?
高学歴で頭がいいのはほんとかも知れないし。
得意分野以外は初心者と自覚するのは大事なことだ。
938デフォルトの名無しさん:2011/09/21(水) 23:06:12.19
>>937
頭がいいのと勉強が出来るのは別じゃね?
頭がいい奴は他人に勉強法なんか聞かんと思う
ごく身近に凄い出来る人間がいるとかならともかく、ネットは無いわ

まぁ勉強ができる奴がプログラミングに向いているかというと、
それはまた別の話だとも思うけど
939デフォルトの名無しさん:2011/09/21(水) 23:30:08.43
>>932
君のような強者を待ってたよ。
ここのスレで明日からルーキーとして質問に回答してくれいいい。

いい練習になるだろ
940デフォルトの名無しさん:2011/09/21(水) 23:44:33.83
>>938
おれも勉強ができても閃きの悪い奴はプログラミングには向いてないと思ってたが
最近は努力して覚えた知識だけでなんとかなること多いような気がする。
自分で編み出す力なんかなくてもなんとかなるし。
941デフォルトの名無しさん:2011/09/22(木) 00:04:18.61
>>940
まぁ実際何とかなるというか、要件は満たせる事は多いよね
でも自分でも「こんなんでいいのか…」と思う事も多い
さらにそれも数日もすれば「動きゃいいわ」に変遷していくがw
942デフォルトの名無しさん:2011/09/22(木) 00:57:14.47
Googleで回答に辿りつけるキーワードを思いつく能力
2chで回答がもらえるような質問の作成能力
要件を自分のスキルで出来るとこにもってく交渉力とか

ソフトウェア工学って職人が集まらなくてもある程度のものが出来あがるように
する方法論だよね。

3年で使い捨てていく業務システムなんかはそんな感じが求められてるのかも
943デフォルトの名無しさん:2011/09/22(木) 05:50:39.49
>>925
/で除算後、Intで切り捨てる>>890
\で整数除算し切り捨て不要にする>>892
WorksheetFunction.Floorを推す>>925

これで三つ巴か

なら俺は>>892を関数化した
function Floor(n as long) as long
  Floor = (n \ 5) * 5
end function
を推すぜ

WorksheetFunction.Floorか演算かは、端的にはどちらが良いとも言えないが、
演算の場合に>>890より>>892の方が優れているのは間違いない

で、
> 名前のない計算より名前の付いた処理の方が保守性に優れる
の指摘は間違ってないけど、三角関数などのメジャー所ならまだしも
プログラムに置いて"名前の付いた処理"ってのは、使うのではなく作るのが基本
なので、名前を付けて関数化してしまえば、その言語内での保守性の高さは
WorksheetFunction.Floorと変わらないし、他の言語にもそのまま移植できる
汎用性の高さは、更なる保守性の高さにも繋がる
944デフォルトの名無しさん:2011/09/22(木) 07:18:41.92
>>932
高学歴なあなたには無縁だろうけど中小零細企業で働いて事務や管理の仕事ぶりを覗いてみるとVBAでする事はいっぱい見つかるよ。この規模の会社だとエクセルまともに使える人なんてあんまりいないのが現実だし。
VLOOKUP&MACH使う人が神扱いされてる事務所見たことあるよ。
945デフォルトの名無しさん:2011/09/22(木) 07:27:38.72
>>940
自分で編み出したものなんていうのは大抵とっくの昔に誰かが解法を持っている。
基本はプログラミングの定石を勉強してそれをどのように応用するかだけ考えれば
殆どの場合は事足りると思う。

>>941
自分で使うだけの場合は動きゃいいでいいんだけど
業務でしかも皆で使うなんてことになると、そうはいかない。
自分以外の人間がメンテナンスすることもあるし。

そもそもトータルで手を抜きたいと思う人は「動きゃいい」なんて作りは絶対にしない。
946デフォルトの名無しさん:2011/09/22(木) 08:31:29.27
>>943
自分で使うなら何でもいいんだよ。
何でもいいっていってもWorksheetFunctionの呼び出しは格段に遅いから俺は使わんけど。
人に使わせるときはそのFunctionは引数は整数に限るとかコメントしとくんだな。
実数だとWorksheetFunction.Floorとは返す値が全然違うからな。
ワークシート関数と同じ仕様の関数にして速度を上げるには
Function Floor(ByVal n As Double) As Long
Floor = Int(n / 5) * 5
End Function
ということになる。
947デフォルトの名無しさん:2011/09/22(木) 08:38:02.70
引数に実数のDouble型を渡すとそもそも型の不一致になるか。
948デフォルトの名無しさん:2011/09/22(木) 08:46:48.44
あぁ>>946は間違ったわ。
5じゃなくてnな。
949デフォルトの名無しさん:2011/09/22(木) 09:04:34.96
ありゃまだ間違ってるわ。
引数が1個しかないよ...orz
つられて間違ったと言い訳しとく。
950デフォルトの名無しさん:2011/09/22(木) 19:14:44.30
前回も言い訳だらけ
今回も言い訳だらけ

この子、ダメだな
951デフォルトの名無しさん:2011/09/22(木) 20:49:15.18
と最初間違った基地外が申しておるが、実は間違いなんてたいしたことじゃないんだよな。
コードの間違いは直せばいいだけのことだが、基地外は治らん。
952デフォルトの名無しさん:2011/09/22(木) 20:55:59.12
セルに小さい順に任意の数値が入っています。
ある値を指定したときに、最も近い数字を探す方法として、
最短で探す方法を教えてください。

やはり配列に入れてループで比較ですか?
953デフォルトの名無しさん:2011/09/22(木) 21:06:17.65
>>952
そういうのは>>950が得意そうだな。
お手並み拝見と行きましょうかw
954952:2011/09/22(木) 21:06:45.01
と、思ったんですが、
配列の中央値と比較してから、
どちらかの方向に比較していけば、
半分ですみますね。

もっと良い方法あったら教えてください。
955デフォルトの名無しさん:2011/09/22(木) 21:17:36.50
>>954
> と、思ったんですが、
> 配列の中央値と比較してから、
> どちらかの方向に比較していけば、
> 半分ですみますね。
>

これを繰り返せばよいです、はい
956952:2011/09/22(木) 21:26:44.67
>>955
なるほど。ありがとうございます。
ちなみに、指定する値を比例して増幅させる
(任意の数値が0.0〜10000.0の範囲、指定値が0から5刻みで単調増加)
で結果を出したいのですが、更に短縮する方法を探しています。
感覚的には解法がありそうなのですが・・・ヒントあったら教えてください。
よろしくおねがいします。
957デフォルトの名無しさん:2011/09/22(木) 21:37:33.67
つ VLOOKUP
958デフォルトの名無しさん:2011/09/23(金) 01:01:18.21
>>956
キーワードを挙げると、>>954は"二分探索法"と言うアルゴリズムですね。
そこから発展して"バランス木"というデータ構造もあります。
リレーショナルデータベースには必要不可欠なものです。
959ベテラン高学歴イケメソ:2011/09/23(金) 06:44:31.56
一定の数ごとにそれを超えるのはどこかを最初に配列に入れとく
さらにそこから一定の数ごとに(ry

よっぽど膨大なデータじゃなければ普通にループ
960デフォルトの名無しさん:2011/09/23(金) 09:02:08.58
現行バージョンのExcelは最大行数が1048576
普通に二分探索でやると最悪19回の比較で答えが出るけど、もっと短縮したいってこと?

>>957の言うとおり、下手なこと考えるよりWorksheetFunctionが一番早かったりして
961デフォルトの名無しさん:2011/09/23(金) 10:21:15.71
ヘタなコード書いてバグ埋め込むよりはWorksheetFunctionの方がよっぽどいいよ
962デフォルトの名無しさん:2011/09/23(金) 10:24:28.53
そもそも近い数字って10に近いものが9と11だったらどっちが欲しいのよ?
検索する側とされる側のデータ量や間隔にもよるが、お互いにのぼり順のデータならそれなりのマッチングアルゴリズムが昔からあるだろう。
データによっては二分探索を使ってもいいだろうが、最初の中央値はそれまでに見つかった位置より後ろの中央にもっていかないとな。
常に同じ中央値では無駄だろう。
ってかこの質問した人っていつも暴れまわってるやつじゃねーのか?
963デフォルトの名無しさん:2011/09/23(金) 13:48:47.48
Excelのえのじも知らない者だが…

図and/or表ってなに?
Excelのなにかだということしかわからな
964デフォルトの名無しさん:2011/09/23(金) 14:37:18.28
「Excelのなにかだ」というのがそもそも間違い
つまりスレ違いなんですが・・・
965デフォルトの名無しさん:2011/09/23(金) 14:43:16.63
スレチのすの字も知らないらしい
966デフォルトの名無しさん:2011/09/23(金) 17:47:11.96
だなw
例えExcelのなにかだとしても、ここではなくBソフ板かPC初心者板のスレの方へ行くべき内容
スレ違い甚だしいにも程があるって話だw
967デフォルトの名無しさん:2011/09/23(金) 18:26:00.92
国語/論理学もあやしい
968デフォルトの名無しさん:2011/09/23(金) 23:41:25.06
Setって実体コピーでしょうか?

例えば
Dim selections as Range
Dim c as Range

selections = Selection
とやると、選択セルが変わったときに、cも一緒に新しい選択されたセルを見てしまいますか?
そして、
Set selections = Selection
とやると、今の選択範囲がselectionsにコピーされ、新しくどこか違う場所を選択してもselectionsに影響は無い、

と考えていいのですか?


それともSetはぜんぜん違う目的のものですか?
969デフォルトの名無しさん:2011/09/24(土) 00:10:16.28
strCell = "A1"
Set r = Range(strCell)
でrはA1を指してるとします。
ここでA1の”A”っていうのを文字列で取りたいです
”AX1”なら”AX”を取りたい

どうしたらいいですか?
970デフォルトの名無しさん:2011/09/24(土) 00:42:22.26
>>968
後者はRange.Selectしてもselectionsの範囲が変わることはないです
前者は仕様上できません

前者後者共に動かせばすぐ分かることでしょう?
なぜ動かさないで質問したんですか?
971デフォルトの名無しさん:2011/09/24(土) 00:45:52.08
>>968
実体のコピーではなく実体への参照
しかしSelectionはオブジェクトではなくRange型を返すプロパティなので
=Selectionによって参照代入されるのはSelectionそのものではなく
Selectionが返したRangeオブジェクト
よって、参照代入後に選択セルが変更されても、selections変数には影響ない

>>969
r.Row
972デフォルトの名無しさん:2011/09/24(土) 00:50:09.44
>>969
他にもやりようがあるかもだけど とりあえず
Adr_Str = r.Address(True, False)
Col_Str = Left(Adr_Str, InStr(Adr_Str, "$") - 1)

Debug.Print Col_Str
973デフォルトの名無しさん:2011/09/24(土) 01:26:22.04
>>970
ありがとうございます。
動かしてその結果だけで判断って危険じゃないですか?w
なので聞いてます。
前者は文法的にダメってことでこちらは失礼しました。
勘違いで出来ると思って書いちゃいました
974デフォルトの名無しさん:2011/09/24(土) 01:33:33.11
>>971
>=Selectionによって参照代入されるのはSelectionそのものではなく
>Selectionが返したRangeオブジェクト
それはちょっとちがう

オブジェクトに対して(Setなしの)=で代入、参照されるのはそれぞれの既定のプロパティの値
Rangeの規定のプロパティはちょっとややこしいが、この場合はValueだと思って良い

Dim c As Range
Set c = Sheet1.Range("A1")
Range("B1").Select
c = Selection 'これはc.Value = Selection.Value

これでB1セルのValueがA1セルのValueに代入されるが、cはずっとA1を指したまま
975デフォルトの名無しさん:2011/09/24(土) 01:51:20.97
>>973
前者も文法的には問題ないぞ。事実コンパイルは通るだろ

>>968でselections = Selection が実行時にエラーになるのは、
selectionsの既定のプロパティに値を代入しようとしたんだが、
selectionsは有効なRangeオブジェクトを指して無かったからだ

動かしてその結果から判断するのは、場合によっては必要だが
動かしてその結果「だけ」で判断するのは危険
976デフォルトの名無しさん:2011/09/24(土) 03:31:11.59
>>975
つまりDim selections as Range
ってやっただけではselectionsはC言語でいうところの、未初期化のポインタで、
 Range ** pRange = NULL;
 Range rng;
 *pRange = &rng;

みたいな事で、

Setを使うと
 Range ** pRange = NULL;
 Range rng;
 pRange = (Range *)malloc(sizeof(Range));
 *pRange = &rng;

みたいなことなんですかね。

977デフォルトの名無しさん:2011/09/24(土) 05:00:17.38
>>974
「代入」ではなく「参照代入」ってのはSetを付けた場合の話だから
「ちょっとちがう」というのは不適切

>>971は参照代入における正解で、>>974は代入における正解だから
「ちょっとちがう」という反論ではなく、「>>971は参照代入の話だが、代入の場合は〜」と
補足する形を取るのが本当の正解
978デフォルトの名無しさん:2011/09/24(土) 09:42:19.64
SelectとActivateの区別が付きません。
画面に表示するのがSelectで
オブジェクト操作の対象として選択することが
Activateなのでしょうか。
その両方を実現したい時はSelectした後Activate
する必要があるのでしょうか。
979デフォルトの名無しさん:2011/09/24(土) 12:49:27.30
>>977
参照代入って単語は初めて聞いた

VBA "参照代入" でぐぐると 約 791 件 (0.11 秒)
少なくともVBAでは一般的に通用する用語ではないと思われ
980デフォルトの名無しさん:2011/09/24(土) 13:06:25.45
山椒大夫なら知ってる。
981デフォルトの名無しさん:2011/09/24(土) 20:33:06.24
A1のセルに入力している最中の文字列を
リアルタイムにフォームのテキストボックスに表示する方法を教えて頂けないでしょうか?

使用環境は
エクセル2002
OS XP
です
982デフォルトの名無しさん:2011/09/24(土) 20:51:32.46
ワークシートチェンジ
983981:2011/09/24(土) 21:05:33.64
>>982
すみません
表現が間違っていたかもしれません
セルに値を入力してエンターを押して変更が確定した後ではなく
確定する前の現在入力中の文字列を取得して
テキストボックスに表示したいのです

APIなどを利用すれば可能なのかもしれませんが
具体的な方法がわからないのです
どなたかよろしくお願いします
984952:2011/09/24(土) 22:58:52.05
亀だすが、ありがとうございました。
試してみたいと思います。
985332:2011/09/25(日) 00:58:06.50
>>983
半角英数だけならgetasynckeystateでやればよくね
986デフォルトの名無しさん:2011/09/25(日) 00:58:37.80
名前ミスだから気にしなくて良いです
987デフォルトの名無しさん:2011/09/25(日) 09:04:17.94
入力をフックして取得するってのは、対象がExcelでも
ExcelVBAの分野ではないから、とりあえずスレ違いだね

まあ具体的な方法とか聴く前に、自分こそ具体的に何がしたくて
そういう動作を求めているのかを書けば、VBA分野で別な方法が
あるかもしれないけどね
988デフォルトの名無しさん:2011/09/25(日) 09:58:30.68
入力中ならフックするしかなくね
989デフォルトの名無しさん:2011/09/25(日) 10:10:10.58
セルが見えてるなら画面キャプチャーするという手も
普通はやらないけど
990デフォルトの名無しさん:2011/09/25(日) 15:13:31.96
次スレよろ
991デフォルトの名無しさん:2011/09/25(日) 15:21:28.35


次スレ案内


Excel VBA 質問スレ Part21
http://hibari.2ch.net/test/read.cgi/tech/1316931607/


992デフォルトの名無しさん:2011/09/25(日) 15:30:43.80
セルをコピーしてjpgで出力ってできないの?
993デフォルトの名無しさん:2011/09/25(日) 15:37:10.33
できないことない
994デフォルトの名無しさん:2011/09/25(日) 15:45:58.99
>>992
「図としてコピー」というコマンドで任意のセル範囲を図形としてコピーできる
あとはそのコピーされた図形を頑張ってjpg保存とかすればいいと思う
995デフォルトの名無しさん:2011/09/25(日) 15:52:36.53
>>991
おつ
996デフォルトの名無しさん:2011/09/25(日) 16:15:15.22
ここでいいかな?



  |:::::::::::::::   
      ∧_∧:::::::::::: 
 __   (´・ω・`) :::::::: すみません、ここでうんこしていいですか?
◎ー)  /     \:::::::::
 |  | (⌒) (⌒二 )::::::::::::
 ~~~ /⌒ヽ( ̄、  ヽ___ 
   /    Lヽ \ノ___
   ゙ー―――(__)---
997デフォルトの名無しさん:2011/09/25(日) 16:16:28.02
998デフォルトの名無しさん:2011/09/25(日) 16:16:49.18
梅干
999デフォルトの名無しさん:2011/09/25(日) 16:17:03.74
999
1000デフォルトの名無しさん:2011/09/25(日) 16:17:16.79
終わり
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。