VBA総合質問スレッド

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
VisualBasic for Application専用の質問スレッドです。
ビジネスsoftあたりにある各Office製品の専用スレッドで質問した方が解答早いような
気もしないでもないですが気軽に利用してください。

質問にあたっては、MS-Officeのバージョンと製品名を明記した方が答える方も楽で
相互に利益があると思いますけど、そもそも環境を書かないような奴は>>1なんて
読まないから意味ないよね。

関連スッドレ
VBプログラマ質問スレ(6.0以前) Part48
http://pc8.2ch.net/test/read.cgi/tech/1146678926/

Excel総合相談所 46
http://pc8.2ch.net/test/read.cgi/bsoft/1150639357/

Word(ワード)総合相談所 Part12
http://pc8.2ch.net/test/read.cgi/bsoft/1144207197/

ACCESS総合相談所 その15
http://pc8.2ch.net/test/read.cgi/bsoft/1142586697/

PowerPoint(パワーポイント)総合相談所 Part3
http://pc8.2ch.net/test/read.cgi/bsoft/1132333532/

Outlook総合相談所 Part6
http://pc8.2ch.net/test/read.cgi/bsoft/1131763385/
2デフォルトの名無しさん:2006/06/27(火) 22:33:12
即死しそうだな
3デフォルトの名無しさん:2006/06/27(火) 22:35:58
閑古踊りをおどろう
4デフォルトの名無しさん:2006/06/27(火) 22:52:11
あるセルが名前付けされている場合、名前を調べるにはどうすばいいんでしょうか?

Sheet.Cells(x,y).???
5デフォルトの名無しさん:2006/06/27(火) 23:05:23
6デフォルトの名無しさん:2006/06/27(火) 23:14:16
>>5
ありがとうです
7デフォルトの名無しさん:2006/06/27(火) 23:14:49
Windows XP、Excel2003です。
シートを並べ替えるようにしたいのですが
例えば、6月1日と6月12日というシートがあると6月12日のシートが先に来ます。
6月1日を先に持ってくるにはどのように直せばいいでしょうか?

Sub シートを並び替える()
  Dim i As Long, j As Long, cut As Long
  Dim buf() As String, swap As String

  cut = Application.Worksheets.Count

  ReDim buf(cut)
  For i = 1 To cut
    buf(i) = Worksheets(i).Name
  Next i

  For i = 1 To cut
    For j = cut To i Step -1
      If buf(i) > buf(j) Then
        swap = buf(i)
        buf(i) = buf(j)
        buf(j) = swap
      End If
    Next j
  Next i

  For i = 2 To cut
    Worksheets(buf(i)).Move after:=Worksheets(i - 1)
  Next i
End Sub
8デフォルトの名無しさん:2006/06/28(水) 08:39:39
cdateでも使えば?
あと、シート並べ替えでbuf(1)を処理してない事も問題だと思う。
9デフォルトの名無しさん:2006/06/28(水) 19:30:40
普通の文字と日付の場合と分けねばならんのかな?(・・;)
10デフォルトの名無しさん:2006/06/28(水) 19:40:36
>>7
私はこんな感じのを作って使ってます。

Sub 並べ替え()
Dim i As Integer
Dim j As Integer
Dim mycnt As Integer
Dim hi As String

mycnt = Worksheets.Count

For j = 1 To mycnt
For i = 1 To mycnt
Cells(i, 26).Value = Worksheets(i).Name
Next

Range("z:z").Select
Selection.Sort Range("z1")

hi = Format$(Cells(j, 26).Value, "m月d日")
Range("z:z").ClearContents
Worksheets(hi).Move after:=Worksheets(mycnt)
Next

End Sub

一旦ワークシートのデータに差し障りの無い列(今回はZ列)に
シート名を書き出して昇順に並べ替えて、シートに反映させてます。
書き出したり削除したりがマヌケな感じなのですが、ソートが楽なので・・・。
117:2006/06/28(水) 19:52:32
>>10
レスありがとうございます。
なるほど…これは(・∀・)イイ!!
いただきます。
12デフォルトの名無しさん:2006/06/29(木) 00:00:30
(゚д゚)
13デフォルトの名無しさん:2006/06/29(木) 11:29:38
繰り返し文の実行中にSelect Caseを使っているのですが
Case1,Case2…Case Elseっていう風に条件を当ていき、
Case Elseに条件が当てはまった時にCase Elseの
処理を実行してからEnd Selectに行かないで
その数字でまたSelect Caseをやり直す方法ってありますか?
初歩的な質問ですみません、どなたか教えてください
14デフォルトの名無しさん:2006/06/29(木) 15:10:51
>>13
なんでわからないのに「初歩的な」なんて勝手に決めつけるんだ?

ちなみに、質問にはSelect文を「Do Until」「Do while」「For loop」なんかで囲んで
条件を満たすまで回せばいいと思う。
15デフォルトの名無しさん:2006/06/29(木) 17:22:32
なんで繰り返し処理(繰り返し文の実行中にSelect Caseを使っているのですが)をやってるのに
繰り返し処理(またSelect Caseをやり直す)の方法がわからないなんて質問するんだ?
激しく疑問だ。
16デフォルトの名無しさん:2006/06/29(木) 17:27:17
俺に言わせりゃ、「疑問に思うことが疑問」とか言い出す奴がいることの方が疑問だ。
17デフォルトの名無しさん:2006/06/29(木) 19:59:10
それをやる必要が本当にあるのなら自分なら迷わずGoToを使うかな
18デフォルトの名無しさん:2006/06/30(金) 10:04:00
関数の意味どうやって調べるですか?
19デフォルトの名無しさん:2006/06/30(金) 10:14:50
すみません、自己解決したです。
20デフォルトの名無しさん:2006/06/30(金) 17:09:49
( ゚д゚ )・・・。
21デフォルトの名無しさん:2006/06/30(金) 19:10:14
( ´∀`)σ)´Д`)
22デフォルトの名無しさん:2006/06/30(金) 20:56:05
>>1
>そもそも環境を書かないような奴は>>1なんて
>読まないから意味ないよね。
INTERCALのドキュメントみたいなこと書くなよw
23デフォルトの名無しさん:2006/07/02(日) 07:19:24
コーディングの質問じゃなくてもいいのかな?ダメならスルーして^^;

ぶっちゃけ、VBAプログラミングだけで職にありつけますかね?
24デフォルトの名無しさん:2006/07/02(日) 09:04:35
>>23
そりゃあんた、英語喋れるけど通訳で喰えますか? って聞くようなもんだよ。
25デフォルトの名無しさん:2006/07/02(日) 09:36:59
>>23
私の知る限りではあつけません
2623:2006/07/02(日) 22:09:34
レスありがとうございます。参考になりました。
27デフォルトの名無しさん:2006/07/03(月) 07:42:22
VBAからメールを送るフリーの関数を提供するソフト
DZAMTP.DLLというソフトを探しています。
以前はインターネットからダウンロードできたのですが
今はできなくなっております。
もしどなたか所持されていたら二次配布とかしていただけないでしょうか?

VBAの質問とは少し違いますし、いきなりこのようなお願いをして申し訳ありません。
28デフォルトの名無しさん:2006/07/03(月) 11:37:35
参考書『Excel VBAによるWin32 APIプログラミング入門』
3000円でどなたか譲って頂けませんか?

[email protected]
29デフォルトの名無しさん:2006/07/03(月) 12:42:20
30デフォルトの名無しさん:2006/07/03(月) 17:11:18
>>27
DZAMTP.DLLは持ってないけどここなんてどう?

VBA応用:CDOでメール送信
ttp://www.asahi-net.or.jp/%7Eef2o-inue/vba_o/sub05_800_080.html
31デフォルトの名無しさん:2006/07/03(月) 22:02:56
WinXP Excel2003 です
For...NextやDo...Loopを使うとき、整数型の変数はよく「i」とか「j」を使いますよね?
同じプロシージャの中で何度もFor...NextやDo...Loopを使うとき「i」とか「j」を
使い回しているんですけど、何か後半に重くなっていくような気がするんですが
こういう使い方はよくないのでしょうか?
一つ一つのFor...NextやDo...Loopには別の変数を割り当てるほうがよいのでしょうか?
それとも、自分でわかりさえすれば問題ないのでしょうか?
32デフォルトの名無しさん:2006/07/03(月) 23:15:38
>>30
ありがとうございます。
大変助かりました。
是非参考にさせていただきます。

あと今更気づいた自分の恥ずかしい間違い
DZAMTP.DLLじゃなくてDZSMTP.DLLでした
33デフォルトの名無しさん:2006/07/03(月) 23:42:22
>>31
大丈夫
34デフォルトの名無しさん:2006/07/04(火) 00:51:13
>>33
ありがとうございます
たまにプロシージャの最後の方で
変数 = Nothing
とかやってますよね?
アレってやった方がいいんですか?
35デフォルトの名無しさん:2006/07/04(火) 01:11:47
好みの問題でいえばやった方がいい。オイラならする。
でも、必ずしも必要というわけではない。

もっと言えばなぜそうしてるか理由を理解するのがいい。
3632:2006/07/04(火) 13:21:47
>>35
変数 = Nothing
ってゆうのはどうゆう操作なんですか?
変数を初期化してメモリを開放するってことですか?
変数は型によって2バイトとか16バイトとかって本に書いてましたが
実際2バイトとか16バイトとかが何に影響するのか分かりません
最近のパソコンはメモリもGBクラスですがそれでも何かに影響ありますか?
質問ずくめですいません
37デフォルトの名無しさん:2006/07/04(火) 17:19:31
Integerなんかの「変数」なら関係ない。
言ってる通り数バイトしかメモリを使用しないし、メモリの解放も自動でしてくれる
だから「変数 = Nothing」はしなくても良い。#つーかやろうとしたらエラーになるでしょ

Object型のサブクラスの「オブジェクト変数」ならしたほうがいい
「変数 = Nothing」することで参照回数が1回減る。
オブジェクト変数が指しているオブジェクトが持っている参照回数が0になると自動的に
オブジェクトの終了処理とメモリ解放処理を実行してくれる。
またこの変数がnothingになっているので間違えて使おうとした場合、確実に
エラーになるのでミスが速く見つかるメリットがある。

オイラの場合、こちら側のメリットが大きいと思うのでオブジェクト変数の場合
「変数 = Nothing」
をしている
3832:2006/07/04(火) 17:53:28
>>37
イメージで言うと
「変数 = Nothing」は
「変数 = ""」
ではなく、
「この変数はこのプロシージャではもう使わないから削除してください」
って意味で、「Nothing」以降は同一プロシージャでその変数は使えなくなるってことですか?

Object型って事は、「As Worksheet」とか「As Range」等と宣言した変数って事ですよね?

何度もすいません、よろしくお願いします
39デフォルトの名無しさん:2006/07/04(火) 19:10:03
そーです

正確に言えば
>「この変数はこのプロシージャではもう使わないから削除してください」
ではなく
「この変数はオブジェクト変数が指していたオブジェクトとはもう関係ありません」
「この変数はもうどのオブジェクトとも関係ありません」かな?

>「Nothing」以降は同一プロシージャでその変数は使えなくなるってことですか?
再びSetすればその変数は使えます。ただし、新しくセットオブジェクトに対しての処理になりますが。

>Object型って事は、「As Worksheet」とか「As Range」等と宣言した変数って事ですよね?
そうです。プロパティとかメソッドがある奴のことと考えておいて間違いはないと思う
40デフォルトの名無しさん:2006/07/04(火) 20:59:01
参照切ればガベコレが回収してくれるから

と説明できれば楽なんだが
4132:2006/07/04(火) 21:15:29
>>39
返事が遅れてすいません、非常によく分かりました
本当に参考になりました。ありがとうございました

>>40
ガベコレは分かりませんが、ググってみます
ありがとうございました
42デフォルトの名無しさん:2006/07/05(水) 02:22:38
VBA 勉強中の者です.初歩的な質問だと思いますが,morg 等で
調べてもこれというのが見つからなかったので教えて下さい.

やりたい内容としては,1 つの book にある複数のシートを
(例えば sheet1,sheet2,sheet3 でそれぞれのシートの一部のセルには
式が入ってます)sheet1.xls,sheet2.xls,sheet3.xls として保存する,
ということです.

マクロの記録でいろいろ試した結果,

Sheets("sheet1").Copy
ActiveWorkbook.SaveAs "C:\sheet1.xls"
ActiveWorkbook.Close

を繰り返せばおおむね望む結果は得られるのですが,
画面がちらつくのと,本当にこの方法がベストなのか疑問に
思ってます.
あと,上の方法でコピーをすると書式までコピーされてしまい
sheet1.xls を開くとリンク先との連携を毎回聞かれてしまうため,
値だけを sheel1.xls に保存する方法を取りたいです.
43デフォルトの名無しさん:2006/07/05(水) 02:59:07
>>42
>画面がちらつく
ぐぐれば答えが得られるんでないかな。要は、一時的に再描画を止めてしまえばいい。
#ついでに再計算も止めると処理も速くなってなおよし。

>値だけを sheel1.xls に
マクロ記録でコピー→値だけペーストをやってみれば判るんで内科医?
44デフォルトの名無しさん:2006/07/05(水) 03:23:25
>>43
馬鹿
45デフォルトの名無しさん:2006/07/06(木) 00:45:04
>>44
(゚д゚)?
46デフォルトの名無しさん:2006/07/06(木) 23:29:48
>>42
画面がチラつくに関しては、画面の表示更新を一時的に固定する。
Application.screenupdating=FALSE

リンクなどを聞いてくるメッセージを出さないよいにするのは
Application.Displayalarts=FALSE
47質問:2006/07/06(木) 23:53:23
初歩的な質問ですみません…
使う言語はVBA5.0です。

Commandをクリックしたら文を書いてあるウィンドウを表示させるプログラムってどう書いたらいいんですか?
48デフォルトの名無しさん:2006/07/07(金) 00:25:20
メッセージってメッセージボックスかな?それなら、
Private Sub Command1_Click()

Msgbox "〜"

End Sub

みたいな感じかな?
オブジェクトとかなら

Private Sub Command1_Click()

Dim ObjectName As Object
Set ObjectName = New Object

ObjectName.Show



Set ObjectName = Nothing
End Sub

とかかな?
携帯でコード書くの疲れる。
49デフォルトの名無しさん:2006/07/07(金) 00:28:14
>>48
メッセージというか文を書いてあるウィンドウか…
50デフォルトの名無しさん:2006/07/07(金) 03:39:24
質問です。

VBAでは計算に時間がかかりすぎるためにVBで計算しようとおもうのですが、
VBにはそもそもエクセルファイルのSheet1のように数値データをのせるシートがないような気がします。
どうやって計算するのでしょうか?
51デフォルトの名無しさん:2006/07/07(金) 11:50:11
計算する数値データを配列にでもつっこめば?
2次元配列ならシートに見立てるのも簡単でしょ?
52デフォルトの名無しさん:2006/07/07(金) 15:43:37
つフレキシブルグリッド
53デフォルトの名無しさん:2006/07/07(金) 15:50:27
VBAよりVBの方が計算早いんですか?
54デフォルトの名無しさん:2006/07/07(金) 21:27:36
>>51
配列ってなんですか?
55デフォルトの名無しさん:2006/07/07(金) 22:55:50
>>53
VBシリーズ(.NET以前)の計算速度比較
VB(exe) >>>>> VB(デバッグ実行) = VBA >>>>> VBS
5642:2006/07/08(土) 01:09:26
>>43,46
どうも回答ありがとうございました.

> Application.screenupdating=FALSE

についてはおかげさまで画面がチャカチャカ動くのは抑止
できたのですが,まだ,最小化するところのバー(なんて
言うのでしょうか?)が忙しそうに動きます.
完全にバックグラウンドで実行するのは無理なんでしょうか?

>>値だけを sheel1.xls に
>マクロ記録でコピー→値だけペーストをやってみれば判るんで内科医?

説明が足りなかったんですが,"見えている値" を書式なしで
コピーしたい,ということなんです.たとえば,セルに today()
が入っていたとして,コピーしたいのは,2006/7/8 ですが,値で
貼り付けると 38906 というシリアル(?)が入力されてしまいます.

> リンクなどを聞いてくるメッセージを出さないよいにするのは
> Application.Displayalarts=FALSE

ActiveWorkbook.SaveAs "C:\sheet1.xls" の時点で sheet1.xls
にこの属性を持たせることが可能でしょうか?
57デフォルトの名無しさん:2006/07/08(土) 01:18:17
>>56
SaveAsでは出来ないが、どうしてもというなら、CreateObjectを使えば
完全にバックグラウンドで動作可能。
やり方は、CreateObject Excel.Applicationでググってくれ。
5853:2006/07/08(土) 01:37:17
>>55
ありがとうございました。
59デフォルトの名無しさん:2006/07/08(土) 03:12:57
>>42
リンクはされなくていいんだよね?
シートをコピーするのではなく、セル範囲でコピーするのはどう?

Workbooks.Add
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats
で貼り付ければ見た目だけがコピーされます。
60デフォルトの名無しさん:2006/07/08(土) 05:38:58
>>42
Sheets("sheet1").Copy
ActiveWorkbook.SaveAs "C:\sheet1.xls"
ActiveWorkbook.BreakLink Name:="リンク先の名前", Type:=xlExcelLinks
ActiveWorkbook.Close True

これだとリンクが切れるので、リンク更新のメッセージ出ないし
値のみ(見た目だけ)がコピーされますよ。リンク以外の数式はコピーされます。
シートの設定を変えているのでCloseの後にTrueを指定してください。
でないと「変更を保存しますか?」のメッセージが出ますので。
61デフォルトの名無しさん:2006/07/08(土) 06:38:31
フレキシブルグリッド。。。
聞き慣れないなーと思ってググったらVB5から使える利口物なんだね。
学生時代に買ったVB4アカデミックしか持ってないから知らなかったよorz
一つ賢くなりますた。
62デフォルトの名無しさん:2006/07/08(土) 08:53:54
office2007でもVBAは不変?
仕様変更はしなくていいから、
エディタのホイールスクロールだけ有効にしてください_| ̄|○
63デフォルトの名無しさん:2006/07/08(土) 15:25:45
β落とせば?
漏れはOS、XPぢゃないから諦めたorz
64デフォルトの名無しさん:2006/07/08(土) 16:24:24
お時間のある方どうかお付き合いお願いします
まずやりたい事ですが、

http://www.omegachart.org/faq.htmlの

「データの取得」の第7項目の「データをインポートしたい」です

製作途中のExcelファイルをアップしていますので参考にして頂ければ幸いです

http://gt2-.hp.infoseek.co.jp/cgi-bin/img/8734.zip

データを作成する段階までは出来たのですが、バイナリファイルとして保存する方法が分かりません
今の段階で出来ているのは"2462現段階"ファイルです
アップしたファイル中のExcelファイルに"2462現段階"を出力したコードを添付しています
マクロを含んでいるので開くときに警告が出ると思いますが、決して怪しいものではありません
このExcelファイルのSheet1にデータのフォーマットを解説してあります
バイナリファイルに詳しい方なら"2462完成目標"と"2462現段階"ファイルをバイナリエディタで
開いて頂ければダメなところがお分かりになると思うのですが…
目的はアップしたファイル中の"2462完成目標"形式のファイルをExcelで出力することです
どうかよろしくお願いします
6564:2006/07/08(土) 16:33:10
すいません、データフォーマットの解説を添付する前のファイルをアップしてしまいましたので
こちらで解説させて頂きます

シート2462の1行目を例にして説明します。レコードはH列までです。
20051208672000772000572000772000708124

8桁(4バイト)の16進数に変換
0131F508000A4100000BC7A00008BA60000BC7A0000ACE1C0000000000000000

後ろから2桁(1バイト)ずつ逆順に連結
08F5310100410A00A0C70B0060BA0800A0C70B001CCE0A000000000000000000

A列からH列を連結した値が1日分32バイトのデータです。
08F5310100410A00A0C70B0060BA0800A0C70B001CCE0A000000000000000000
6664:2006/07/08(土) 16:36:55
書き込んでみると全く分からないのでデータの区切りに"■"を挿入します

シート2462の1行目を例にして説明します。レコードはH列までです。
20051208■672000■772000■572000■772000■708124■(空白セル)■(空白セル)

8桁(4バイト)の16進数に変換
0131F508■000A4100■000BC7A0■0008BA60■000BC7A0■000ACE1C■00000000■00000000

後ろから2桁(1バイト)ずつ逆順に連結
08F53101■00410A00■A0C70B00■60BA0800■A0C70B00■1CCE0A00■00000000■00000000

A列からH列を連結した値が1日分32バイトのデータです。
08F5310100410A00A0C70B0060BA0800A0C70B001CCE0A000000000000000000
67デフォルトの名無しさん:2006/07/08(土) 16:52:09
えーと、なんだか良くわかんないけど、次のコードを実行して結果を観察し、
ヘルプなどを読んでみて下さい。
Sub foo()
Dim a(32) As Long
a(0) = 1
For i = 0 To 31
a(i) = i
Next
Open "test.dat" For Binary Access Write As #1
Put #1, , a
Close #1
End Sub
6867:2006/07/08(土) 16:53:43
ちなみに、Windowsでは、4バイトの1という数値をバイナリで保存すると
01 00 00 00
になります。
6964:2006/07/08(土) 17:11:10
>>68
早速のお返事ありがとうございます
試してみて自分のコードと比較してみます
後ほど結果、疑問点など報告させていただきます
7064:2006/07/08(土) 17:31:20
>>68
出来ましたー、出来ましたよっ!
配列変数をValiantからLongにして、Binar AsをBinary Access Write Asにして
訳の分からない16進数への変換を削除したら出来ました
本当にありがとうございます、かれこれ1週間ほど答えを探してました
何か言葉だけで感謝し足りないぐらい感謝してますよー!
本っ当にありがとうございました
7167:2006/07/08(土) 17:44:31
いえいえ、どういたしまして。
7242:2006/07/09(日) 02:03:19
>>57,59,60
回答ありがとうございます.
>>60 さんの方法でやりたいことが実現できました.
ありがとうございました!

完全にバックグラウンドでやる方法は下のページなど見て
いろいろ試してみたのですが,勉強不足もありうまくいき
ませんでした.

ttp://www.accessclub.jp/vbakaisetu/50.html
ttp://www.happy2-island.com/vbs/cafe02/capter00406.shtml

もうちょっと勉強して出直してきたいと思います.
73デフォルトの名無しさん:2006/07/09(日) 02:22:43
Excel2000でマクロ組んでるんですが、最近、実行速度の遅さが気になって・・・
open officeってExcelより速いですか?
74デフォルトの名無しさん:2006/07/09(日) 02:25:18
画面更新を止めれば速くなるかと
もうやってるならアルゴリズムを見直すとか

openofficeは試してみれば?
75デフォルトの名無しさん:2006/07/09(日) 10:05:20
OpenOfficeのマクロはJavaベースでしょ。
互換性ないんでないの?
76デフォルトの名無しさん:2006/07/09(日) 20:19:03
こんばんわ、よろしくお願いします
エクセルでWebのテーブルをダウンロードする時、

ActiveSheet.QueryTables.Add〜(以下略

ってコード書きますよね?
これだとActiveSheetの指定セルに指定したテーブルを取り込む事になると思いますが、
これをシートに落とさず配列変数に落とすような事は出来ないのでしょうか?
イメージで言うと、

Dim DwnStr as Valiant
DwnStr.QueryTables.Add〜(中略)〜, Destination:=DwnStr(0,0)

みたいなカンジです
それともやはり、Webからのダウンロードは一旦シートに落とさなければいけないでしょうか?
77デフォルトの名無しさん:2006/07/10(月) 07:31:06
Excelの機能を使うなら、シートに落とさないとダメ。
それがイヤなら自分で実装すればいいだけ。

シートに落とすならVBAの話だけど、そうでないならVB6の話だね。
7876:2006/07/10(月) 09:47:47
>>77
やっぱりそうですか
QueryTables.Addで出来ないってわかっただけでも収穫ありました
APIにMSXML2.XMLHTTPってゆうのがありますね
使えるように勉強してみます、ありがとうございました
79 ◆MutsukiYtk :2006/07/10(月) 21:43:17
開発そのものやExcelは初心者って程ではないんだけど
今度依頼されたのが、ネットから情報を取得して出力された情報を
Excelに表示するようなマクロ。
こういうのは初めてで、なおかつ覚えるなら完璧に覚えたいので、自腹で本買って作業に入る前に勉強したいです。
何かその辺の記述が詳しいオススメの本があれば誰か教えてください。
一応Excelマクロは何度か作っていて、今の会社でも稼働管理システムに関わってるので、ある程度難しい本でも理解できると思います。
80 ◆MutsukiYtk :2006/07/10(月) 21:45:01
補足
資料として欲しいのは
・該当Webの入力フォームにセルの値(ID等)をセットして検索
・検索結果をExcelに取り込む

厳密に言えば1つ目だけでもいいんですが…(2つ目は外部データの取り込みをマクロ保存して少し変えればできるイメージなので…)
↑考え甘いですか?
81デフォルトの名無しさん:2006/07/11(火) 03:21:35
>・検索結果をExcelに取り込む
メニュー ツール(T) マクロ(M) 新しいマクロの記録(R)
メニュー データ(D) 外部データの取り込み(D) 新しいWebクエリ(W)

本買うまでもない

>・該当Webの入力フォームにセルの値(ID等)をセットして検索
たいていのサイトは、
http://www.google.co.jp/search?hl=ja&q=TEST&lr=
みたいに、?パラメータでいけるけど
できなければ直接Excelに取り込めないので、IEオブジェクト作ってPOSTしたりして
必要なデータのみをExcelのシートに書き込むしかないかもね(初心者には難しいかも)
82 ◆MutsukiYtk :2006/07/11(火) 05:09:50
>>81さん
レスどうもです、それとごめんなさい。家ではネット繋いでないので、示していただいたリンクは見れませんでした。
ただ、IEオブジェクト〜からの流れが、自分の引き出しにまだなくて、色々探してみたんですが、詳細を記載したページを見つけられませんでした。
自分は応用力はあるつもりなんですが、基礎を覚えるのに人一倍時間がかかる子なので、
コレを機にみっちり覚えようと思ってます。
EXCELでネットワーク関連の制御を詳しく書いた本があれば是非教えて下さい。多少難しくても本気で覚えますので。
83デフォルトの名無しさん:2006/07/11(火) 06:25:12
> EXCELでネットワーク関連の制御を詳しく書いた本があれば是非教えて下さい。
無い。だって解説する必要無いもん。
なぜなら、その辺は普通のVisual Basicと被るから。
Excelのブックやシート、またはシート上のグラフや図形などのオブジェクト操作はExcel VBAの分野だが
ネットワーク関連なんてのは>>81が教えてくれたような機能使うのでなければExcel VBAでもVisual Basicでもやること一緒。

だからぶっちゃけて言えば、VB言語について勉強しなさいってこった。
VB6の解説本、VB6の解説サイトなら、ネット関連について解説してる物が腐るほどあるし
その方法はほぼ例外なくVBAで使える。
84 ◆MutsukiYtk :2006/07/11(火) 06:35:16
>>83
ハナっからVBAの機能と絞って考えてたんで、VB関係の本はスルーしてました。
よく考えたらそうですよね。
今日辺り書店をさまよってみます。
>>81さん、>>83さんありがとうございました。
85デフォルトの名無しさん:2006/07/11(火) 17:03:16
>>82
>IEオブジェクト〜からの流れが、自分の引き出しにまだなくて
先ずは、
メニュー ツール(T) マクロ(M) Visual Basic Editor(V)
メニュー ツール(T) 参照設定(R)
で、Microsoft Internet Controls をチェックしてOKする

メニュー 挿入(I) 標準モジュール(M)
で、新規モジュールを作成して、下記のサンプルをコピペして応用してみてはいかが?

Option Explicit
Declare Sub Sleep Lib "Kernel32" (ByVal dwMilliseconds As Long)
Sub test()
Dim ie As SHDocVw.InternetExplorer
Dim SettingTxt
Set ie = New InternetExplorer
'ie.Visible = True
ie.Navigate "http://pc8.2ch.net/tech/SETTING.TXT"
While ie.Busy
Sleep 100
DoEvents
Wend
While ie.ReadyState <> READYSTATE_COMPLETE
DoEvents
Wend
SettingTxt = ie.Document.Body.outerText
n = InStr(1, SettingTxt, vbNewLine) - 1
Debug.Print "Board ID=" & VBA.Left(SettingTxt, n)
Debug.Print "Date=" & ie.Document.LastModified
ie.Quit
Set ie = Nothing
End Sub
8685:2006/07/11(火) 17:05:31
&quot;はダブルクオーテションです
87デフォルトの名無しさん:2006/07/11(火) 17:12:49
> Microsoft Internet Controls
> Microsoft Internet Controls
> Microsoft Internet Controls
> Microsoft Internet Controls
> Microsoft Internet Controls

この用途でMicrosoft Internet Controlsですか、そうですかw
88助けて:2006/07/11(火) 17:25:42
学校で提出しないといけない問題があって分からずに手つけてない問題があるので教えてください!!

エクセルを立ち上げて、Sheet1のセルA1〜A50に数字を1から50までを入力し、セルD4に1から50の合計、D5にその平均を求める。VBAからエクセルの関数を呼び出すときには、Worksheetfunktionというオブジェクトを使用する。セルC4に「合計」、セルC5に「平均」と入れる。
89 ◆MutsukiYtk :2006/07/11(火) 17:42:21
>>85
ソース解説ありがとうございます。もしかしたら>>87さんの言うように、
今回の自分の用途とは異なるかもしれませんが、試してみたいと思います。
自分には珍しく、今かなり色々覚えてみたい気力に溢れてるのでw
90デフォルトの名無しさん:2006/07/11(火) 17:50:37
福岡女学院さんマルチ質問駄目だゾ
91デフォルトの名無しさん:2006/07/11(火) 19:57:22
>>87
>この用途でMicrosoft Internet Controlsですか、そうですかw

>IEオブジェクト〜からの流れが、自分の引き出しにまだなくて >>82

※注) >>79-80 に対するレスではない
92デフォルトの名無しさん:2006/07/11(火) 23:05:56
>>88
自分で解かないと意味無いでしょ。
93デフォルトの名無しさん:2006/07/12(水) 06:39:26
ワードを開いたらユーザフォームが勝手に現れるようにするにはどこにshowをかけばいいんでしょうか?
94デフォルトの名無しさん:2006/07/12(水) 09:59:38
Wordは開く物ではなく起動させるもの。開くのは文書ファイル。
95デフォルトの名無しさん:2006/07/12(水) 10:09:33
>>94
なにコイツ?
96デフォルトの名無しさん:2006/07/12(水) 10:32:39
WINWORD.EXE起動時の話か、文書.docオープン時の話かハッキリしろってことだろ
確かにそのどちらなのかで方法が違うから、「ハッキリしろ」というのは同意だが、94もハッキリ言ってやれよ
回りくどく言っても93や95みたいな初心者には伝わらないぞ
97デフォルトの名無しさん:2006/07/13(木) 00:48:16
エクセルのマクロによりパワーポイントを新規作成させたいのですが、エラーになってしまいます。
本を見ながら書いたものなのですがどうしてエラーになるのかわかりません。。

sub createppt()
dim ppoint as object
dim ppres as object
dim pslide as object
Set ppoint = CreateObject("powerpoint.application")
Set ppres = ppoint.presentations.Add
Set pslide = ppres.slides.Add   'ここでエラー
end sub

使用ソフトはoffice xpです。解決方法が解る方宜しくお願いします。
98デフォルトの名無しさん:2006/07/13(木) 01:17:27
初心者の特徴:
言語に拠らず、エラーが起きてもエラーメッセージを書かない。
9997:2006/07/13(木) 01:37:07
失礼しました。
実行時エラー450
引数の数が一致していません。または不正なプロパティを指定しています。
です。
100 ◆MutsukiYtk :2006/07/13(木) 06:00:22
>>79-80に関しては、結構苦戦しましたが解決しました。
と言っても実際のツールを作る参考になる程度の初歩的なものですが…
その先は、作ったものを応用して頑張ってみます
色々ご回答いただきありがとうございました。
101デフォルトの名無しさん:2006/07/13(木) 11:09:29
初心者の特徴:
エラーに対して、その意味を調べたり考えたりしようとせず
「エラーが出た、どうにかしてくれ。」と丸投げで他人を頼る。

「引数の数が一致してない」可能性と、「不正なプロパティ(メソッド)を指定してる」可能性は、
完全に否定出来るのか?なら、それをきちんと書け。
否定しきれないなら、まだまだ自分で出来ることは有るはずだ。
102デフォルトの名無しさん:2006/07/13(木) 12:40:38
「ComboBox」が1〜10まであって、それぞれ「ComboBox1」〜「ComboBox10」
って名前です。

ComboBox1.AddItem "A"

これを「ComboBox1」〜「ComboBox10」までやるのにFor Next構文は使えないのですか?
使えるとしたらどう記述するのですか?
103デフォルトの名無しさん:2006/07/13(木) 12:49:10
>>102
そこでコントロールを配列にするんですよ
104デフォルトの名無しさん:2006/07/13(木) 13:09:21
>>103
VBならね。

でもVBAではコントロール配列は使えないので、
コントロールコレクションを利用するか、
クラスを使って疑似コントロール配列を実装するんですよ。
105デフォルトの名無しさん:2006/07/13(木) 16:21:18
VBSでは、
Dim aryLine
aryLine = Split(string, ":")
とやれば、スプリット後の各文字列が配列に代入されますが、
VBAでは、
Dim aryLine As String
aryLine = Split(string, ":")
とやってもできないようです。
どのようにすればいいのでしょうか。
106デフォルトの名無しさん:2006/07/13(木) 17:06:18
↑事故解決
Stringじゃなくて、Variantで宣言しないといけなかったようです。
107デフォルトの名無しさん:2006/07/13(木) 17:20:23
ホントはVariant型じゃダメなんだけどね。Variant型は何でもアリだから、
「Variant型で宣言しなくてはならない」、「Variant型が正しい」ということは無い。
誤魔化しの手法として、Variant型に逃げる道があるだけ。

Dim aryLine() As String
aryLine = Split(string, ":")
108 ◆MutsukiYtk :2006/07/13(木) 20:26:49
>>102
For IntX = 1 To 10 Step 1
Me.Controls("ComboBox" & IntX).AddItem "A"
Next

携帯から書いてるからスペル違うかも。
109 ◆MutsukiYtk :2006/07/14(金) 00:07:05
標準モジュールでシート名を定数定義して、
セットをWorkBook_Open時に行ったところ、エラーになりました。
イミディエイトウィンドウで確認すると、定数には値が入っていません。
WorkBook_Open時は元々標準モジュールは見ていないんでしょうか?
もしそうだとしたら、標準モジュールでの定義が反映されるタイミングを知りたいです。
110 ◆MutsukiYtk :2006/07/14(金) 00:13:28
>>109は忘れて下さい
Const→Public Constに変えるだけで解決しました
アホや俺…orz
111デフォルトの名無しさん:2006/07/15(土) 18:23:32
教えてくだいさい。
1、VBAプログラミングのバイブル的な本ってありますか?
2、文法書、コマンド解説書(できたらプログラム例つき)で定番は何でしょうか。?
112デフォルトの名無しさん:2006/07/15(土) 18:34:20
>>111
お答えします。
1、あります。
2、Excel VBA ヘルプ(←電子書籍だが超定番)

以上。
条件後出し(具体的な名前出せとか、紙面書籍限定とか)は却下。
113デフォルトの名無しさん:2006/07/15(土) 19:24:57
本って聞かれてヘルプも本だっていうのは112だけ
114デフォルトの名無しさん:2006/07/15(土) 19:27:40
まあ電子書籍とは言わんね普通
115 ◆MutsukiYtk :2006/07/15(土) 20:14:25
>>111
ん〜、バイブル的なものはないと思う。
ただ『初めての○○』『×日で覚える○○』的な本は多分バイブルにはならないと思うよ。
パラパラ読んでみて、「あ〜、これちょっと難しいなぁ…」っていう本の方が、長く使える、ある意味の『バイブル』になるんじゃないかな。
つか俺の愛用本書こうと思ったけど、どのVBAか記述がないので。俺Excelのしかないけどいいのかな?
一応某VBA掲示板(多分モーグでググると出る)で質問に普通に答えれるくらいの知識は身に付いたよ。
 
>>112
まぁ、なんつ〜か意地悪じゃね?
116 ◆MutsukiYtk :2006/07/15(土) 20:17:28
上で偉そうな事を書いた分、>>109-110の書き込みがすげぇ恥ずかしい。超初歩ミスだし。
>>115は名無しで書けばよかったよ…orz
117デフォルトの名無しさん:2006/07/15(土) 20:24:09
>>112
マイクロソフトのヘルプは「わかったあとで、やっと何を説明してたか判る。」ことで有名なしろもの。
構文説明や使用例で、マイクロソフト特有の抽象的概念用語持ち出す(手抜きの例でしかない。)から,結局、具体的
には何のことだかわからないよ。これは、vbaに限らず、他のマイクロソフトのプロ倉ミング言語のヘルプ全般
で、殆どのプログラマーが言うこと。cとか言語などのプログラミングで十年以上も経験のあるプロでも異口同音
に共通していう。「マイクロシフトのヘルプ、マニュアルはわかり難い。」ってね。

例えば、ヘルプで"タイマー”でググルと、"On Timeメソッド"って出てくる。
で、以下の説明が出てくる
構文
expression.OnTime(EarliestTime, Procedure, LatestTime, Schedule)
expression 必ず指定します。対象となる Application オブジェクトを表すオブジェクト式を指定します。

"expression"って何だ。”Application オブジェクト"っていう抽象的概念説明になってる。
こんなに一つの要素を説明するのにコロコロと概念用語で変えただけの説明なら、わかるものでも
無理矢理わからなくしてるのと同じだよ。

OnTime メソッドの使用例
次の使用例は、現在から 15 秒後に my_Procedure を実行します。
Application.OnTime Now + TimeValue("00:00:15"), "my_Procedure"

「対象」を見ると、vbヘルプに飛ぶ。もうメチャクチャだよ。でも、見ると。
Application オブジェクト
"Excel アプリケーション全体を表します。Application オブジェクトには、次のものが含まれます。"

ってさ。↑は、もはや日本語として完全に矛盾してるだろ。ヘルプは、このようにメチャクチャな混乱句の集合体でしかない。
118デフォルトの名無しさん:2006/07/15(土) 20:46:12
Application.OnTime Now + TimeValue("00:00:15"), "my_Procedure"

というように「使用例」まで具体的要素(機能)の名称(例えばセル名等なら「セル名等、プロジェクトで使われてる
オブジェクトの識別名」と、ファイル名なら「ファイル名」と具体的に明示する。)ことなく曖昧にしたまま、
その要素の具体的固有名称も明らかにしないのでは、あくまで抽象的概念用語の説明のままでは、
「ヘルプ」じゃなく手抜による「混乱させるもの」でしかないよ。上の例だって、更には、"my_Procedure"
って何だ。ファンクション名(sub ルーティン名)なのかそれとも、sheet名なのか、それともプロジェクト名
なのか判らない。
119デフォルトの名無しさん:2006/07/15(土) 21:53:44
>>117
おばかさんは大変だねぇw
120 ◆MutsukiYtk :2006/07/15(土) 22:31:09
とりあえず>>111を置いてけぼりにして喧嘩をするのはやめません?
別に巻き込めって意味じゃないですよ、論点が変わってると。
 
>>111
ちなみに俺の愛用本は翔泳社の『Excel2003VBA辞典』です。
CD-ROMなしで2000円越えしますけど、あまりCDに頼ると覚えるのに時間かかると思ったんで…。この本とは結構長い付き合いです。
121デフォルトの名無しさん:2006/07/15(土) 23:20:25
>>111
バイブルと言う訳ではないですが資格板のVBAスレで
何冊か本の名前が挙がってますよ。
資格取得に関しての書籍だしちょっと趣旨が違うかな?
基礎を学ぶ為の物が多かったような気がします。
122 ◆MutsukiYtk :2006/07/15(土) 23:57:12
あと、別に>>117-118>>119の喧嘩に加わる気はないけど、
>>117の言ってる事は正しいと思うよ。少なくとも>>112よりは。
初めて触る人間が『IF』『SELECT』辺りの複数選択肢が出るヘルプを検索した時とか苦労するだろうな、って思うもん。
つかヘルプ見てれば全てが解決するなら本だってこんなに発行されないし、このスレも不要でしょ。
…何か余計な火種増やしただけだったらごめん>ROMってる人他色々
123デフォルトの名無しさん:2006/07/16(日) 00:16:24
>>117
expressionはようするにhogeの如くそれ自体に意味はない。
Application オブジェクトと書いてあるのは、Applicationというクラス(型)のオブジェクトと思え。
(VBは型が緩いから意識しないとだめ。オブジェクトと言う言葉が嫌なら変数とでも読み替えろ)
ただし、(Applicationクラスの)Applicationという名前のオブジェクト(言わばグローバル変数)が存在するのがややこしいけど。

VBAのヘルプはわかりにくいとは思うけど、そこまでひどくないと俺は思うよ。
124デフォルトの名無しさん:2006/07/16(日) 00:33:48
いや、ひどいよ。
Excel固有部分は特にひどい。
125デフォルトの名無しさん:2006/07/16(日) 07:08:42
だいたいへルプ自体がバグだらけ。マイクソソフト
126デフォルトの名無しさん:2006/07/16(日) 07:49:45
ところで、・・・
タイムシェアリングのモードで動作する関数(メソッドか)はないの。
(つまりは、マルチタスクモードでインターバル動作するやつ)
ユーザーのプロシジャー内で専属でループ、ウェイト動作するんじゃなく、
少なくともvb系なら、vbのタイマーみたいに、バックグラウンドでタイムカウント
して、指定した時間間隔ごとに割込動作で、こっちが作ったプロシージャをコールして
くるっていうのはないの?。
それがないとシーケンシャル動作で(結局はシングルタスクで)タイムカウント中は
一つのマクロにcpuが独占されっぱなしになって、カウント中にどこかのセルでキー入力
するとか、データを変更するとか、とにかくマルチタスク動作できない。
それができなきゃアプリ用言語として使いものにならないんじゃねーの。
127デフォルトの名無しさん:2006/07/16(日) 08:06:06
だいたい、マイクロソフトはvbだって、スタック領域が軟弱、っつーか、
曖昧でブラックボックスだから、怖くて頭からプログラムする気が起きない。
相手が素人だと思って馬鹿にしてるのか「簡単」とか「便利」とかっていう
謳い文句にかこつけて「手抜き」なんだよ。いつオーバーフロー起こすか
判らないし、どの程度でスタックが動いてるのかも判らないから実際の業務ソフト
としては使えない。スタック領域が曖昧なプログラミング言語なんか、まったく
「遊び」でしかつかえない。これだけメモリが大きくなってる時代に
配列が使えないなんて・・・
128デフォルトの名無しさん:2006/07/16(日) 08:16:15
>>126
OnTimerもどき作れば?
SetTimer使えば簡単に出来ると思うが
129デフォルトの名無しさん:2006/07/16(日) 08:50:43
> 少なくともvb系なら、vbのタイマーみたいに、バックグラウンドでタイムカウント
> して、指定した時間間隔ごとに割込動作で、こっちが作ったプロシージャをコールして
> くるっていうのはないの?。
マルチスレッドというならまだしも、その程度ならいくらでも出来るだろ。
使いものにならないのは言語ではなくオマエの頭だw
ちなみにマルチスレッドはVBAの本家最終版であるVisual Basic 6.0 Professionalですら非対応だからね。
130デフォルトの名無しさん:2006/07/16(日) 08:55:32
VBA2000、2002、2003で結構互換性無いよね。
IDEは進歩無くほぼ同じなんだがw
131デフォルトの名無しさん:2006/07/16(日) 08:58:53
>>127
VBの配列ってヒープからとってくるんじゃないの?
132デフォルトの名無しさん:2006/07/16(日) 09:13:16
配列領域はいろいろだよ。
パラメータになってるときはスタック
プロシージャ内で定義されたときも、スタックじゃないの。
133デフォルトの名無しさん:2006/07/16(日) 09:21:51
>>128
http://www.vbalab.net/vbaqa/data/excel/log/tree_566.htm

Excel(VBA)は非同期で呼び出されるコールバック関数は使用することができません。
(VBをIDE環境で実行していても同じですね)AddressOfは同期実行されるAPI(Enum系等)用に
用意されています。VBであればネイティブにコンパイルされている状態でしたら、
特定の条件化であれば非同期で呼び出されるもの(SetTimer, CreateThread等)も使えることが
ありますが、エクセルを含むVBA環境ではまず使えません。
134デフォルトの名無しさん:2006/07/16(日) 09:23:55
>>129
マイクソソフトのマニュアルと同じく、おまえは「能書だけ」だ。
135デフォルトの名無しさん:2006/07/16(日) 09:39:40
134
136デフォルトの名無しさん:2006/07/16(日) 10:12:29
マクロ内でどうこうするっていうより、マクロ自体の起動を時間の次元で設定できる環境変数があればで話は早いんだが。
要は、マクロ自体をインターバル動作できれば話は早いわけでね。(自動保存みたいにね。)
マクロの環境がそうなっていないというのは、基本設計からして、そういうふうな設計思想ではなかったからだと思うんだが。

137デフォルトの名無しさん:2006/07/16(日) 10:19:34
ま、そうなるとVBAの次元でなく、その上のEXCELとかの話で、スレ違いになるか。
138デフォルトの名無しさん:2006/07/16(日) 11:11:02
VB5初心者です...
一応ネットで検索してみましたがよくわからなかったのでご教授お願いしますm(__)m

VB5で"開く"をテキスト見ながら練習していました
そして実行で"開く"をクリックしたら"実行時エラー426" 複数のMDIフォームは使用できませんと出て先に進めません...(^-^;
対処方を教えて頂きたいです.お願いしますm(__)m
139デフォルトの名無しさん:2006/07/16(日) 11:42:50
ここ、開発環境Visual Basic(VB4,VB5,VB6)のスレではなく
MS Officeファミリー マクロ言語Visual Basic for Application(VBA)のスレね。
140デフォルトの名無しさん:2006/07/21(金) 17:00:16
Access のレポートでラベル作ってるんですが、
普通はラベルの横幅はルーラーで調整しますよね?
これをコードから変更したいのですが、うまくいきません。

レポートを開くとき、イベントプロシージャで
Me.Width = 5670
というように書いてみるんですが、印刷プレビューにまったく反映されてないのです。
ページ設定→レイアウトのサイズの項目にある幅というところはちゃんと10cmとなっているのに、です。
どうしたらよいでしょうか? ご教授お願いいたします。
141デフォルトの名無しさん:2006/07/24(月) 18:10:37
エクセルVBAでセルの値をテキストファイルの決められた場所へ出力するようなライブラリってありますか。
テキストファイルはテンプレートになっていて、例えば、テキストファイルの$A1とあるところに
セルのA1の値を出力するという感じです。
Javaでvelocityってのがあるみたいですけど、もっと手軽なものを探しています。
Excel2000です。
142デフォルトの名無しさん:2006/07/24(月) 18:16:43
そんなもん自分で作れ>>141
文字列の置き換えで済むんじゃねーの?
143デフォルトの名無しさん:2006/07/24(月) 18:18:01
>>142
ダメプログラマの見本
144140:2006/07/24(月) 18:19:23
自己解決しました
145デフォルトの名無しさん:2006/07/24(月) 21:12:04
シートの上に立方体ぽくてボタン?みたいなやつを作ってクリックすると
マクロが実行されるようにしたいんですけど、どうやったら作れますか?
146デフォルトの名無しさん:2006/07/24(月) 21:47:34
>>145
[表示]→[フォーム]→[ボタン]
ボタンにマクロを登録
147デフォルトの名無しさん:2006/07/24(月) 23:12:51
現在100シート近くあって動作が重くなってきた場合
どのような対策が考えられますか?
148デフォルトの名無しさん:2006/07/24(月) 23:16:28
>>147
1ブックで100シート?
ブックを分割して必要なときに開くようにしたら?
149デフォルトの名無しさん:2006/07/25(火) 06:51:53
>>147
構成に因って対策方法は異なる。
構成の詳細内容を文章で聞くのは面倒なので、
アドバイス欲しければブックをうpしろ。
150デフォルトの名無しさん:2006/07/25(火) 11:45:41
エクセルでセルの右隅をダブルクリックすると
下方向に連続コピーできますが、

これを右方向にするにはどうしたらいいですか?
151 ◆MutsukiYtk :2006/07/25(火) 18:18:42
>>147
一度の作業には100シートも使わないなら
>>148の言うように、複数Bookに分割したシートを作業によって必要数OPEN
 
一度に100シート使う(もしくは50シート以上使う為あまり分割しても意味なし)場合
そもそもそれだけのシートを使用する必要があるか考え直す。
例えば何シート使うかわからないから最大数として100シート持ってると言うのなら
必要時にWorkSheets.Addさせた方が絶対効率的。
 
つか正直1Book100シートも使用するツール?現実的に役に立つように思えないので、
一度見直してみてはどうだろう。
>>150
オートフィルの事を言うてる?ここはVBAすよ。
152デフォルトの名無しさん:2006/07/25(火) 20:57:05
エクセル相談所スレで書き込んだんですが、土曜日以来レスが無いんでこちらに書き込ませていただきます

例えばセルとか他のアプリとかでも良いんですけど、右クリックで貼り付けとかって呼び出せるじゃないで
すか。あれをフォーム上のテキストボックスでマウスの右クリックからも呼び出せはしないんですかね。

OS:XP Pro
Excel 2002
です。
153デフォルトの名無しさん:2006/07/25(火) 21:31:39
スレ違い
2〜3日書き込まれない程度で(ry
154デフォルトの名無しさん:2006/07/25(火) 22:03:09
質問です。
エクセルVBAからコマンドボタンをクリックしたいのですができますか?
UserForm1.CommandButton1.click() みたいなことがしたいのですが。
あるいは Sub CommandButton1_click() を外部から呼べればいいのですが、
できません。
どなたかよろしくお願いします。
155デフォルトの名無しさん:2006/07/25(火) 22:13:14
Sub aaa()
CommandButton1_click
End Sub
156154:2006/07/25(火) 23:23:32
>>155
CommandButton1_clickはフォーム内で定義されています
これを標準モジュールから呼びたいのです
Sub aaa()はどこで定義すればよいですか?
フォーム内で定義すると結局Sub aaaが見えません。
157 ◆MutsukiYtk :2006/07/26(水) 00:56:16
>>152
TextBox_MouseDownイベントを使ってみたらどうだろう
>>154
コマンドボタンを押した時の命令を別Subにして
クリックしたい時にその別SubをCallすればいいんじゃないかな。
158デフォルトの名無しさん:2006/07/26(水) 03:41:14
>>156
モジュール名とコードを貼れ
159デフォルトの名無しさん:2006/07/26(水) 07:14:53
>>157
ヒント有難うございます

Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If Button = 2 Then
MsgBox "右クリックされた"
End If

ここの部分にクリップボードから貼り付ける処理を書いて見ます。どうもm(__)m
160デフォルトの名無しさん:2006/07/26(水) 14:37:36
ロロロロロロロロム落としたたら逮捕されますか?
161デフォルトの名無しさん:2006/07/28(金) 00:37:21
>>28-29
ヤフオクに出品されてるよぅ!
ってもう読んでないか。
162デフォルトの名無しさん:2006/07/28(金) 05:41:24
98専用らしく、XPで動かないVBのソフトあるのですが、手作業で書き換える事は可能?
163 ◆MutsukiYtk :2006/07/28(金) 07:21:13
>>162
入力ミスじゃなければ、このスレのタイトルを見て、VBとVBAの違いをネットで調べてから
もう一度質問してくださいな
164デフォルトの名無しさん:2006/07/28(金) 16:12:02
質問です
ユーザーフォームにtextbox1,2とcommandbutton1の3つのコントロールを
配置して
textbox1に下記のコードを記入しました

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If TextBox1 > 99 Then
CommandButton1.SetFocus
Else
TextBox2.SetFocus
End If
End Sub

ステップインで実行して
100以上の数値を入力した時に同じトコを2度通ってるのですが理由が解りません
どなたか原因の解る方いますか?
165デフォルトの名無しさん:2006/07/28(金) 16:41:39
>164
タブオーダーの順序通りにフォーカスを移そうとしている最中に、
タブオーダーの順序が違うコントロールにフォーカスを移しているから。
166165:2006/07/28(金) 16:50:49
タブオーダーは関係ないですね、すみません
TextBox1のExitイベントが発生した時にフォーカスを持っている
コントロール以外にフォーカスを移しているから
167デフォルトの名無しさん:2006/07/28(金) 17:08:02
中の人がWM_ACTIVATEを2回呼ぶからじゃネーの?
1回目はExitしたときで2回目はSetForcusを呼ぶことで発生してるんじゃねーの、多分

たぶん、この現象が起きるときはTextBox1に99以上をいれて、1回目のExitを発生させるときに
TextBox2にフォーカスを移してるでしょ?この場合、
TextBox1 -> TextBox2 で一回目のExit発生、ただし、発生した段階でActiveなのはTextBox1
TextBox2 -> CommandButton1 で2回目のExit発生、activeなのはTextBox1なのでTextBox1_Exitが再度呼ばれる

このExit発生ってのがWM_ACTIVATEのメッセージ処理だからじゃない、かな?

TextBox2の代わりにif文の判断と同じコントロールに移す場合、2回目は同じコントロールへの移動ってなるから
Exitイベントが発生しないと思うがどうよ?
168デフォルトの名無しさん:2006/07/28(金) 22:41:46
記念パピコ。
169デフォルトの名無しさん:2006/07/28(金) 23:40:58
>>168
すげー!神!!
170デフォルトの名無しさん:2006/07/29(土) 12:15:14
159の者です。ユーザーフォームにテキストボックスを1個作って以下のコードを入れたんですが、フォームを起動し
(当然テキストボックスは空の状態)マウスの右クリックでクリップボードからデータを入れた途端、 "テキストボックス
には既にデータが入っています"のメッセージが出てしまいます。

Private Sub TextBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Dim clipboardData As Variant
Dim aFmts, fmt As Variant
Dim MyData As DataObject
If Button = 2 Then
If TextBox1.Value <> vbNullString Then
MsgBox "テキストボックスには既にデータが入っています", vbOKOnly
Exit Sub
End If
clipboardData = Application.ClipboardFormats
If clipboardData(1) = -1 Then
MsgBox "クリップボードにデータが入っていません"
Exit Sub
End If
Set MyData = New DataObject
MyData.GetFromClipboard
TextBox1.Text = MyData.GetText(1)
Set MyData = Nothing
End If
End Sub

Private Sub UserForm_Initialize()
TextBox1.Value = vbNullString
End Sub

現象として>>167さんが言っておられる事のような気がするんですけど、対処方法はどうすれば良いんでしょうか?
171デフォルトの名無しさん:2006/07/29(土) 15:11:17
Sub TextBox1_MouseDownの中のコードを一行 msgbox "a" として実行すればわかるけど
右クリは無条件に2回呼ばれるようだ

どうしても右クリでやりたければ、1回目2回目を判断するしかないな
テキストボックスの横に貼り付けボタンとかでは駄目なのかな
172デフォルトの名無しさん:2006/07/29(土) 15:24:09
[ Xp-Pro + Excel 2003 ]です。
セルを横方向に結合しているとセルの高さの自動調整が行えないので、
改行(文字)回数を取得して調整を行うようにプロシージャを作成しました。

上手くできたと思ったのですが、
セルの書式設定で「折り返して全体を表示」に設定している箇所で
自動改行が行われている箇所の回数取得ができていませんでした。

セル内の自動改行回数を取得するイイ方法思いつかないですか??
173デフォルトの名無しさん:2006/07/29(土) 15:58:47
文字列の幅 / セル幅
174デフォルトの名無しさん:2006/07/29(土) 17:10:23
>>171
>テキストボックスの横に貼り付けボタンとかでは駄目なのかな

これで逃げるのが一番楽みたいですね(^^;。
不必要にコードをややこしくしても仕方が無いし、そうします。どうも有難う。
175デフォルトの名無しさん:2006/07/29(土) 18:24:06
質問です。
以下のコードを実行しても、結果が0にならないんですけど
どうしてなんでしょうか

Dim a As Double, b As Double, c As Double

a = -9.995
a = a * 100
b = 999.5
c = a + b
MsgBox c
176デフォルトの名無しさん:2006/07/29(土) 19:34:42
>>175
説明するの面倒なので「浮動小数点演算 誤差」でググれ。
177デフォルトの名無しさん:2006/07/29(土) 19:58:09
>>176
うわ、確かに説明するのが面倒そうなのが出てきました、
結構興味深いことが書いてありそうなのでじっくり見てみます。
ありがとうございました。
178デフォルトの名無しさん:2006/07/30(日) 02:21:31
配列をRangeに貼り付けようと以下のようなコードを書きました

Dim ary As Variant
ary = Array("a", "b", "c")
Worksheets("Sheet2").Range(Cells(1, 1), Cells(1, 3)).Value = ary

Sheet2がアクティブなときはエラーが出ないのですが
アクティブでないときは以下のエラーが出ます

実行時エラー'1004'
アプリケーション定義またはオブジェクト定義のエラーです。

Sheet2をアクティブにせずに解決する方法はあるでしょうか?
179デフォルトの名無しさん:2006/07/30(日) 02:28:22
>>178
Sheet2をアクティブにしちゃいけない理由でも?
もしアクティブシートを変更したくないのなら、現在のアクティブシート名を保存して戻してやればいいだろうし。
180デフォルトの名無しさん:2006/07/30(日) 06:40:25
>>178
CellsはRangeのプロパティで、Rangeを省略するとActiveSheetが対象となり、
その結果全体として矛盾した指定になるためエラーになってる。

Range(Cells, Cells)の形式で書きたいんだったら、CellsがどのRangeの
ものかを明記する必要がある。つまり、以下のように書く必要がある。

With Worksheets("Sheet2")
    .Range(.Cells(1, 1), .Cells(1, 3)).Value = ary
End With
181178:2006/07/30(日) 13:12:21
>>179
ほかのシートで作業中なので裏で動作させたかったんです

>>180
>.Range(.Cells(1, 1), .Cells(1, 3))
こんな書き方ができるんですねえ
うまくいきました
ありがとうございます!
182デフォルトの名無しさん:2006/07/30(日) 17:44:29
エクセル相談所スレで書き込んだのですがスレ違いみたいなのでこっちで質問さ
せてもらいます。


【1 OSの種類         .】 WindowsXP
【2 Excelのバージョン   】 Excel2000
【3 VBAが使えるか    .】 はい(中級くらいです)
【4 VBAでの回答の可否】 可
【5 検索キーワード 】 起動フォーム タイトルバーを非表示


目的はExcel起動時にフォームを表示し、そのフォームのタイトルバーを非表示にす
ることです。


起動フォームの設定はできます。
Sub Auto_Open()
 UserForm1.Show
End Sub
また、Excel起動後にシートからマクロを実行し、フォームを起動し、そのフォームの
タイトルバーを非表示にすることもできます。(この方法は書籍に書いてありました)
しかし、Excel起動時に起動するフォームのタイトルバーを非表示にする方法がわかり
ません。どこにどういったVBAを書けばよいのかわからないんです。

どうぞよろしくお願いします。
183デフォルトの名無しさん:2006/07/30(日) 17:46:47
> また、Excel起動後にシートからマクロを実行し、フォームを起動し、そのフォームの
> タイトルバーを非表示にすることもできます。
と同じ方法で。
184182:2006/07/30(日) 20:34:40
サンプルコードはExcelからマクロを実行します。
今回の目的は起動フォームのタイトルバーを非表示にすることです。サンプルコードを引用しておきます。
--------------モジュールのコードのVBAです。--------------
Private Const GWL_STYLE = (-16)
Private Const WS_CAPTION = &HC00000
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long,ByVal nIndex As Long,ByVal dwNewLong As Long) As Long
Private Declare Function GetActiveWindow Lib "user32" () As Long
Private Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long
Public Sub Hide()
Dim Ret As Long
Dim hWnd As Long
Dim Wnd_STYLE As Long
hWnd = GetActiveWindow()
Wnd_STYLE = GetWindowLong(hWnd, GWL_STYLE)
Wnd_STYLE = Wnd_STYLE And (Not WS_CAPTION)
Ret = SetWindowLong(hWnd, GWL_STYLE, Wnd_STYLE)
Ret = DrawMenuBar(hWnd)
End Sub
Sub Macro1()
 UserForm1.Show
End Sub
--------------フォームのコードのVBAです。--------------
Private Sub UserForm_Activate()
Hide
End Sub
Private Sub CommandButton1_Click()
Unload Me
End Sub
Excel起動後から表示するフォームはこのサンプルコードが使えます。起動フォームのタイトルバーを非表示にする方法がわからないんです。
どうぞよろしくお願いします。
185デフォルトの名無しさん:2006/08/01(火) 09:19:02
無断で引用・転載していいものなの?
186デフォルトの名無しさん:2006/08/01(火) 09:45:41
いきなり初心者質問で申し訳ありません。
excelワークシートの保護をマクロで実行し、その際にロックされた
セルを選択出来なくしたいのですが、一度実行した直後はうまくいく
のに、一度ブックを閉じてからまた開くと、保護はされていますが、
ロックされたセルが選択できてしまいます。
手動でシート保護を行った場合に同じ設定にすると、一旦ブックを閉じて
もまた設定どおりになっています。
マクロで実行しても同じように出来ないでしょうか?
187デフォルトの名無しさん:2006/08/01(火) 14:19:16
>>186
ヒント:マクロの記録
188デフォルトの名無しさん:2006/08/01(火) 15:44:44
>>186
ん?
マクロを晒せ!
189182:2006/08/01(火) 22:32:32
185>氏
サンプルコードをもとにすこしかえてあります。
このコードは誰が書いても同じようなものになるので転載で問題はならないかと。

>186氏
マクロを記録して保存。セキュリティレベルを低で実行。できますか?



起動フォームのタイトルバーを非表示にする方法がまだわからなくて困ってます。
どうぞよろしくお願いします。
190デフォルトの名無しさん:2006/08/01(火) 23:04:39
どなたか!!教えてください!
仕事で初めてVBA使ってみたのですが、良く分かりません・・orz


まず、ブックを開かせます
Dim OpenFileName As String
OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls")
If OpenFileName <> "False" Then
Workbooks.Open OpenFileName
End If
↑ここまでは動きます。

次に今開いたブックの指定セル番地のデータを、既存のブックの指定セル番地へ持ってきます。
Workbooks("OpenFileName").Worksheets("PG1").cell("1,1").Copy Workbooks("book1").Worksheets("TP1").Range("1,1")
↑ここで「インデックスが有効範囲にありません」というエラーが表示されてとまってしまいます。


最初に開いたブックを指定するにはどのようにすればよいか、どなたかご教授おねがいします。
191デフォルトの名無しさん:2006/08/01(火) 23:22:55
> Workbooks("OpenFileName")
Workbooksコレクションで指定するのは
ファイルパスではなくファイル名
192190:2006/08/01(火) 23:44:15
>>191
レス大変ありがたいのですが、サッパリわかりません・・・・・
193デフォルトの名無しさん:2006/08/01(火) 23:59:06
>>192
>Workbooks("OpenFileName").Worksheets("PG1").cell("1,1").Copy Workbooks("book1").Worksheets("TP1").Range("1,1")
これを
Workbooks(OpenFileName).Worksheets("PG1").cell("1,1").Copy Workbooks("book1").Worksheets("TP1").Range("1,1")
にするとよい。
194デフォルトの名無しさん:2006/08/02(水) 00:00:43
あ、ごめん、フルパスで入ってくるのか?
195デフォルトの名無しさん:2006/08/02(水) 00:01:40
>>186
セルの選択は出来てしまいますが、ロックはされてるので内容の変更は
出来ないようになってますよ。
これではダメなのでしょうか?
選択すら出来ない様にしたいという事ですか?
196190:2006/08/02(水) 00:07:38
>>193
試してみましたが無理でしたorz
197デフォルトの名無しさん:2006/08/02(水) 00:15:59
Set book = Workbooks.Open(OpenFileName)
しといて
book.Worksheets("PG1").cell("1,1").Copy Workbooks("book1").Worksheets("TP1").Range("1,1")

試してないけど。
198デフォルトの名無しさん:2006/08/02(水) 00:22:24
If OpenFileName <> "False" Then
Workbooks.Open OpenFileName
fname = ActiveWorkbook.Name
End If

Workbooks(fname).Worksheets("PG1").cell("1,1").Copy Workbooks("book1").Worksheets("TP1").Range("1,1")
199デフォルトの名無しさん:2006/08/02(水) 00:26:20
>>197>>198
レスありがとうございます!
さっそく試してみます
200190:2006/08/02(水) 00:43:13
>>197>>198
ダメでしたorz
201デフォルトの名無しさん:2006/08/02(水) 00:57:33
>>200
エラーのメッセージぐらい書け

たぶん、想像はつくが
202190:2006/08/02(水) 00:58:01
どれも、「インデックスが有効範囲にありません」でした
203デフォルトの名無しさん:2006/08/02(水) 01:00:55
cell("1,1") って何だよ
204デフォルトの名無しさん:2006/08/02(水) 01:02:44
>>202
ブック名のことかと思ったら、あんた根本的に理解できてないよ
205190:2006/08/02(水) 01:02:51
すいません、
つっこまれると思ってたんですけど、それ(A,1)です
206190:2006/08/02(水) 01:03:41
>>204
どの辺が理解出来ないのでしょうか?
207デフォルトの名無しさん:2006/08/02(水) 01:04:05
> Workbooks("OpenFileName").Worksheets("PG1").cell("1,1").Copy Workbooks("book1").Worksheets("TP1").Range("1,1")
めちゃくちゃ
208デフォルトの名無しさん:2006/08/02(水) 01:05:23
>>205
出直して来い
209190:2006/08/02(水) 01:10:08
>>207
これでも勉強したつもりなのですが。
出来ればどの辺りがオカシイか教授いただけませんか?
無理なら無理で結構ですので
210190:2006/08/02(水) 01:10:42
いや、勉強したつもりはオカシイ。勉強してる最中ですね。
211デフォルトの名無しさん:2006/08/02(水) 01:20:36
>>210
作業をさせたいところのみを早く調べたいのはわかるけど
ググれば初心者向けにVBA解説してるところとか、サンプルコードを載せて
くれてるところがあるはずだよ。
先に言われている通り、、かなり滅茶苦茶だから面倒臭がらずに調べて
みよう。
212デフォルトの名無しさん:2006/08/02(水) 01:22:52
そんなあなたに
やりたいことを
マクロに記録
して勉強しましょう
213デフォルトの名無しさん:2006/08/02(水) 01:57:55
セルの操作は基本中の基本だよ。
cell("1,1")もRange("1,1") もRange(A,1)も間違ってます。

>>212
マクロの自動記録は無駄が多いし、セル操作を学ぶには不向きだよ。
214デフォルトの名無しさん:2006/08/02(水) 02:03:47
誰も正解を書かない件について。

# やりたいことがわからないというレスは却下
215 ◆MutsukiYtk :2006/08/02(水) 02:11:01
>>213も言ってるけどさ、基本的な命令(予約語)ってExcelに入力すると頭文字が大文字になるのね。
それを踏まえて、さっきから貼ってる自分のソースを見てごらん。
それと自分が初心者だという自覚があるなら、コピーとペーストを命令分けて書いて
ステップ実行させなさい、そうすりゃどっちがおかしいかわかるから。
Range文の間違い、わからなければヘルプを。
明らかにヘルプを見る手間を省いた質問に、優しく答える人は少ないよ。
 
つ〜か指摘してるっぽい人達もなんでcell()に触れないのかわからん…
216デフォルトの名無しさん:2006/08/02(水) 02:15:21
>>215
ステップ実行って、あんたあれ1行だぞ
217デフォルトの名無しさん:2006/08/02(水) 02:16:36
> マクロの自動記録は無駄が多いし、セル操作を学ぶには不向きだよ。
セル操作を学ぶレベルには到底達していないのだが
それに無駄以前のレベル
間違いに気付ければ丸儲け
218190:2006/08/02(水) 02:22:21
グダグダ言わずに正解おしえろよ、クズども
219 ◆MutsukiYtk :2006/08/02(水) 02:22:59
>>216
コピーとペーストに分けて、って書いただろ
 
面倒だから書くわ
Workbooks("Book2.xls").WorkSheets("Sheet1").Cells(1,1).Copy _
(Workbooks("Book1.xls").WorkSheets("Sheet1").Range("A1"))
220デフォルトの名無しさん:2006/08/02(水) 02:27:23
>>577
> Sub HideColumns(xcolumns As String)
> Dim strColumns As String
> strColumns = xcolumns
> columns(strColumns).Select
> Selection.EntireColumn.Hidden = True
> End Sub

>>578
> Sub HideColumns(strCcolumns As String)
>  Columns(strColumns).EntireColumn.Hidden = True
> End Sub

上記は別スレの内容だけど
無駄であっても、
個々の内容が理解できていないと無理
そうでないと、ちょっと変えただけで???となるでしょ
最初のうちは、あえて無駄な行があってもいいと思うけどな
221 ◆MutsukiYtk :2006/08/02(水) 02:28:03
>>190
悪い事は言わん。手でコピペしとけ。
CellsとRangeも使えなくて出来るほど
VBAはガキのおもちゃじゃない。
これは君への皮肉じゃなく本心だ、>>213も同じように思って書いたんだと思うぞ
222デフォルトの名無しさん:2006/08/02(水) 02:31:15
>>221
ウザ
223デフォルトの名無しさん:2006/08/02(水) 04:02:23
◆MutsukiYtk
224213:2006/08/02(水) 07:00:20
「セル操作が出来ないと、Excelで何も出来ないな」と思って書きました。
どこが間違ってるか分からないと探しにくいだろうと思って
セル操作に関して間違っている箇所を上げておいただけなのですが…。
225190:2006/08/02(水) 13:12:51
>>221
Cellsでしたか。ありがとうございます
ガキではないですが、もう少し勉強してからここに来ることにします
226デフォルトの名無しさん:2006/08/02(水) 19:16:33
クイックソートを再帰を使わずに書きたいのですがよく分かりませんorz
A列の配列を並び替えたいのですが・・・
227デフォルトの名無しさん:2006/08/02(水) 20:07:28
>>226
逆に聞くけど、再帰使わない利点って何なの?
228182:2006/08/02(水) 20:30:08
レスください・・・・・・。
184でマクロさらしてます。
229デフォルトの名無しさん:2006/08/02(水) 20:54:42
>>226
よく解らないということは、全く解らないわけでは無いんだな。
んじゃ、丸投げしないで出来てる部分だけ晒せ。話はそれからだ。
というか、コードを書くことだけに走らないで、まずはクイックソートの
アルゴリズムをきちんと理解しろ。


>>227
高速化だろ。Subプロシージャの呼び出しって結構遅い。Functionはもっと遅いけど。
あと、配列要素の上下限算出を盛り込める。
一般的にクイックソートは「配列, 配列要素下限,配列要素上限」などと3つの引数を渡すが
再起使わず内部ループにすると、プロシージャの頭で上下限算出すればいいから配列変数だけポンと渡せる。


>>228
さようなら。
230デフォルトの名無しさん:2006/08/02(水) 21:18:01
>>228
たぶんVBAでは無理なのでWin32APIを呼ぶ
231226:2006/08/02(水) 21:52:30
>>227
大量のデータを処理する時は再帰だとできんとか言ってました。

>>229
内部ループのとこを詳しく教えて頂きたいのですが
232デフォルトの名無しさん:2006/08/02(水) 21:54:54
>>231
クイックソートでググればたくさんでてくるぞ

アルゴリズムが理解できないなら
VBのコードもあったからそれコピペすれば?
233226:2006/08/02(水) 21:56:03
>>232
どうもです。やってみます。
234デフォルトの名無しさん:2006/08/03(木) 02:19:55
学校の授業で VBAを使ってゲームを作る事になったんですが、VBAの事をほとんど何も教えてもらって無い状態で、作業が全く進みません

生徒もやる気が無いけど、それ以上に教師にやる気が無くて困っています
頑張って、本に書いてある通りにプログラムを打ち込み、シューティングゲームを作ったんですけど、ありえないぐらいクソゲーで、もう自分の力ではどうしようも無い、ということを悟りました

ですので、どこか いいプログラム置いてある場所知りませんか?
邪道かもしれませんが、それをコピーして貼り付けよう思います

どなたかお願いします
235デフォルトの名無しさん:2006/08/03(木) 13:13:55
>>234
お前は。
236デフォルトの名無しさん:2006/08/03(木) 19:42:10
俺か。
237デフォルトの名無しさん:2006/08/04(金) 09:09:28
学校に行ってるって事は、お金払って教えてもらってるんだよね。
「お金払ってるんだから、きっちり教えて下さい(義務を果たして下さい)」とか言ってみたらどう?
まぁなかなか言いづらいけどさ。
親が払ってるのか自分で払ってるのか分からないけど
汗水流して得たお金払ってちゃんと教えてもらえないなんて、腹立たない?
238デフォルトの名無しさん:2006/08/04(金) 09:30:55
【Excel 2003】
Workbooks.Add で新規作成したブックの
ThisWorkbook モジュールに、
Workbook_SheetChange 等のイベントを記述する方法を
どなたかご存じないでしょうか?
239デフォルトの名無しさん:2006/08/04(金) 10:31:15
>>238
ひんと:あたまをつかえ
240238:2006/08/04(金) 10:47:43
>>239
意外と簡単に実装できるってコトですか・・・?

まさか、
コードウインドウ開いて入力するとか、じゃないですよね?

Workbooks.Add したブックへ自動的にWorkbook_SheetChange 等のイベントを
挿入したいんですが・・・。

当たり前のことを聞いてたら申し訳ありません。
241デフォルトの名無しさん:2006/08/04(金) 11:56:17
>>239
わかった上で言ってるんなら是非とも教えて欲しい。
少なくとも簡単に実装できるものではないと思う
>>240
Addではなく、既にSheetchange等マクロが入ったファイルをコピーするのではダメか?
中のソースをいじらせる必要があるのか?
方法が思いつかないわけじゃないが、試した事がないからな。とりあえず>>239先生の回答を待ってみてくれ
242238:2006/08/04(金) 12:45:40
>>241
ファイルをコピーするのは思いついてはいるんですが、
一応、ブック単体での動作を予定しているので・・・。
VBとかみたいにリソースファイルを扱えるならよかったのですが・・・。
243デフォルトの名無しさん:2006/08/04(金) 12:46:35
>>238
それマクロウイルスの第一歩やん。
なんか設定変えれば使えるようになるはず↓
ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbext98/html/vaobjCodePane.asp

ただ、>>241さんの方法(ブックコピペ)が可能ならそれが一番よいと思う。
244238 :2006/08/04(金) 12:59:38
>>243
ウイルスか、
まぁ、確かにそうですよね。
限りなく実現不可能そうですね。
参考URLも見てもう一度検討してみようと思います。
245243:2006/08/04(金) 13:13:33
追加したブックのイベントを受け取るのが目的なら、
クラスモジュール使ってexcel全体のイベントをもらう事が事が可能なので
それを使ってみると言う手もあると思います。

実は私もこの作業を行おうと思っているところですんで詳しくは無いですが、
そう難しくも無いみたいですよ?
ttp://www.moug.net/skillup/opm/opm08-04.htm

ただ、追加したブックを「一人歩き」させたいならこの方法はダメですね。
246238:2006/08/04(金) 13:45:32
>>245
おお、その手がありましたか。
私のほうも追加したブックを独立させて動作する必要は無いので
参考になりそうです。
ありがとうございます!
247デフォルトの名無しさん:2006/08/05(土) 00:02:40
>>229
A列を並べ替えるならsortメソッドが最速じゃないか?
248デフォルトの名無しさん:2006/08/05(土) 01:53:08
今からVBA始めるって人にお勧めする参考書や教材って何かないかな?
249名無しさん@お腹いっぱい。:2006/08/05(土) 02:07:29
> A7:自分で実際に読んで(閲覧して)、自分のレベルに合っていて解りやすいと思うものを利用しましょう。
250デフォルトの名無しさん:2006/08/05(土) 06:25:07
>>248
VBAの本なんて星の数ほどあって
その中で自分の知ってる本はほんのわずか。
しかもどんどん新刊が出て入れ替わる。
とても特定の本をお薦めできる状態じゃないね。

一つの方法として、アマゾンのサイトで検索してみて
売れている純に表示させ、読者レビューを読んでみる
といいかも知れない。当てずっぽうで買うよりマシだろう。
251デフォルトの名無しさん:2006/08/05(土) 08:17:37
どうせ、1冊ですむはずも梨
252デフォルトの名無しさん:2006/08/05(土) 13:37:28
>>250
どんな言語でもそのような状況なのに、なぜお勧め本が存在するんだろう?
253デフォルトの名無しさん:2006/08/05(土) 14:36:52
まず1冊買う。
難しすぎると感じたら、易しそうな本を買う。
易しそうなら、その本の内容を理解しつくして、難しそうな本を買う。
ちょっとだけ難しいなと思ったら、その本がたぶん正解。理解するまでがんばる。
以下繰り返し。
254デフォルトの名無しさん:2006/08/05(土) 15:27:17
>>250
言ってる意味が良く分からない
255デフォルトの名無しさん:2006/08/05(土) 15:29:07
大村なんてらの本買っときゃ、まず間違いない。
256デフォルトの名無しさん:2006/08/05(土) 18:27:59
>>252
簡単に言うと「面倒臭いから」
257デフォルトの名無しさん:2006/08/06(日) 10:05:50
VBAでOLEは使えるのでしょうか?
258デフォルトの名無しさん:2006/08/06(日) 12:30:14
>>257 なぜ試そうとしない?
259デフォルトの名無しさん:2006/08/06(日) 13:07:58
       ____
     /⌒  ⌒\   ング ング
   / (●)  (●)\
  /::::::⌒(__人__)⌒:::: \  チュパチュパ
  |     (   \    |
  \_   ヽυ  ::\ /
         \  .:::\
260デフォルトの名無しさん:2006/08/06(日) 13:30:22
>>258
OLEのツールボックスの出し方さえわからないのです・・・orz
初心者プログラマにOLEは敷居がたかいのかな・・・
261デフォルトの名無しさん:2006/08/06(日) 13:31:38
君の跳躍力が一般人よりk
262デフォルトの名無しさん:2006/08/06(日) 15:03:53
マクロの記録で自動作成されたコードを読むことを繰り返しております。
263デフォルトの名無しさん:2006/08/06(日) 15:16:16
Range("A5").Select
ActiveCell.FormulaR1C1 = "nurupo"
もうあほかと。
264デフォルトの名無しさん:2006/08/06(日) 17:39:24
>>257
VBAでWordやExcelの操作をすることからしてOLEのおかげ。
265デフォルトの名無しさん:2006/08/06(日) 18:24:44
なんか勘違いしてたかも・・・
VBAとブラウザを連動させたかったのですが、
それはOLEで実現するのは間違いなのでしょうか?
エクセル2000でセルの書式で1を0001とか表示させてんのね。
そんでそれをCSVに出力すると1になっちゃうのを0001のまま出力するにゃどうすりゃいいの?
1の書式を文字列にして0001にしても同じじゃんよ?
読み込みはTextFileColumnDataTypesでできたんだけど出力さっぱりわからん
267デフォルトの名無しさん:2006/08/06(日) 19:07:19
そのブラウザがOLEに対応してるかどうかで変わってくるな。
つーか、VBA(VB言語でMS Office Applicationを操作)の話ではなく
普通のVisual Basic(VB言語で汎用的な処理)の分野の話なので本スレでどうぞ。
このへんのやり方は、VBAでやるにしてもVBとやり方変わらないし。
268デフォルトの名無しさん:2006/08/06(日) 19:33:11
>>266
それこそVBAの分野だろ。
ワークブックのメソッドを使ってCSV保存するのなんてVBA使ってるとは言わん。
マクロの記録そのままでもいけるからな。

VBA使ってセルのデータを取得し、テキストに書き出す部分を自前で実装してこそ
VBAを使ってると言える。これなら値の取得を.Valueではなく、.Textにすることで
セルの値ではなくセルの表示結果が取得できる。
269デフォルトの名無しさん:2006/08/06(日) 19:35:35
>>266
ん?俺のExcel2000は
ゼロ付きのままcsv保存されるよ
どうやって保存してんの?
がんばります
>>269
ホントだすげえびっくりした
脳が千切れそうです
273デフォルトの名無しさん:2006/08/07(月) 21:29:23
エクセルでファイルを開くと同時に、VBAを起動する為には
SUBとEND SUBの間にどう入力すればいいでしょうか。
274デフォルトの名無しさん:2006/08/07(月) 21:37:07
Workbook_Open()?
275デフォルトの名無しさん:2006/08/07(月) 21:53:48
Sub Auto_Open()
…………
End Sub
276デフォルトの名無しさん:2006/08/08(火) 00:34:25
Sub miko_test()
 Dim i As Integer, j As Integer, n As String, nn As String
 Application.ScreenUpdating = False
 i = Sheets.Count         
 n = ActiveWorkbook.Name    
  For j = 1 To i       
  Sheets(j).Copy       
 nn = ActiveSheet.Name    

   With ActiveWorkbook
   .SaveAs "C:\My Documents\" & nn
   .Close
  End With
 Next
 Application.ScreenUpdating = True
End Sub

すみません。これが動かないのはなぜですか?
277デフォルトの名無しさん:2006/08/08(火) 00:37:09
勘:Activeを使うとろくなことがない
278デフォルトの名無しさん:2006/08/08(火) 00:39:22
どーいうことですか?
はじめてVBAを使おうとしてます。。
明日会社で必要なの。だれか教えてください!
279デフォルトの名無しさん:2006/08/08(火) 00:50:58
>>278
nn = ActiveSheet.Name

nn = Sheets(j).Name
280デフォルトの名無しさん:2006/08/08(火) 01:13:05
うまくいかなかったにしても自分でやってみたこと(組んだ数式やコード)は書きましょう。
例えエラーになる式やコードでも、何をやりたいのかを的確に把握する手がかりになります。
その上で、どううまくいかないのかを具体的に書きましょう。
エラーが出るなら、何処でどういうエラーが出るのか、
想定外の結果が出るなら、条件と想定上の結果、実際の結果などを詳しく書いてください。
281デフォルトの名無しさん:2006/08/08(火) 01:17:31
>>276
パスがねえんだろ
おまいのマイドキュメントはホントにそこにあんのか?
282デフォルトの名無しさん:2006/08/08(火) 06:43:12
>>277
全くだな。
283デフォルトの名無しさん:2006/08/08(火) 08:28:29
ところで、n=ActiveWorkbook.Nameは必要なの?
284デフォルトの名無しさん:2006/08/08(火) 08:55:59
>>281
Win98ならそこだろ。
285デフォルトの名無しさん:2006/08/08(火) 12:25:42
Copyメソッドに何かが足らない
たぶんソレ

シート毎に分割して保存するならな
リストボックスで右寄せにすると一番右の字がスクロールバーに隠れちゃうのってデフォなん?
回避する方法ある?
287デフォルトの名無しさん:2006/08/08(火) 21:09:40
>>286
うぉぉぉおぉ本当だ!!今まで気づかなかった。
スクロールバーが無いときを基準に右寄せしてるっぽいね。
消極的にいくと..全ての値の後に空白入れるとか、ラベルとSpinbuttonで擬似的に作るか..
288287:2006/08/08(火) 21:22:10
案2(思いつき):ColumnCountを2にしてうまいこと調整する
値だと後ろに空白入れることできないんじゃん?できるのかな?
文字列にして後ろに入れればいいんかな?
290287:2006/08/08(火) 23:11:30
>>289
色々試してみたけど、やはり Column.Count=2 で二列目に空白データぶち込んで
ColumnWidth = (リストボックスの幅-15) ; (10) に指定すると中々よい感じ。
なんだが、スクロールバーが出ない少ない量になると不自然な空白が現れる。
あと、環境によってスクロールバーのデカさが変わってくると....
291デフォルトの名無しさん:2006/08/09(水) 01:48:09
Public Const WM_USER As Long = &H400
Public Const WM_CAP_START As Long = WM_USER
Public Const WM_CAP_FILE_SAVEDIBA = WM_CAP_START + 25
Private Declare Function SendMessageAsString Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long

Public Function capFileSaveDIB(ByVal hCapWnd As Long, ByVal FilePath As String) As Boolean
capFileSaveDIB = SendMessageAsString(hCapWnd, WM_CAP_FILE_SAVEDIBA, 0&, FilePath)
End Function

↑で、クリップボード中の画像をファイルにして保存したかったりするわけですが

FilePathを---\hoge.bmp にすると約800KBのファイルが出来ます
FilePathを---\hoge.jpg にしても約800KBのファイルが出来ます

これ、どうにかなりませんか
せめて1/5ぐらいのサイズになりませんか

どこかで見つけたDoodle2というDLL使うと
bmpとjpgではかなりサイズに差が出るんですけど、できればこのDoodle2使わずに。。。無理ですか?
292デフォルトの名無しさん:2006/08/09(水) 03:48:13
>>291
※文句は受け付けません。
Sub jpgsss()
Dim jaws As Chart
Set jaws = ThisWorkbook.Charts.Add
jaws.Paste
Debug.Print jaws.Export("c:\2ch.jpg", "jpg")
End Sub
293デフォルトの名無しさん:2006/08/09(水) 04:38:48
ありがとうございます
サイズは1/10ぐらいまで縮めることが出来ました

Debug.Print jaws.Export("c:\2ch.jpg", "jpg")

Debug.Print jaws.Export("c:\2ch.jpg", "jpeg")
ですよね
いや、そんなことはどうでもいいんですけど

このやり方は、まず貼りつけちゃうわけですよね
これってグラフ?
で、何というか、その。。。あ、いえ何でもないです
おやすみなさい
294292:2006/08/09(水) 04:52:33
>>293
まだしばらく起きてるので答えられる範疇だったら何でも答えますよ。
295デフォルトの名無しさん:2006/08/09(水) 13:24:14
質問です。
アクティブになっているシートからグラフを作りたいんですが
どのようにすればいいですか?
とりあえず、ここまで作ったんですが、よろしくお願いします!
  Charts.Add
ActiveChart.ChartType = xlXYScatterSmooth
ActiveChart.SetSourceData Source:=Sheets("sheet1").Range("A1:G4354"), _
PlotBy:=xlColumns

ActiveChart.SeriesCollection.NewSeries

ActiveChart.SeriesCollection(1).XValues = "=sheet1!R2C1:R4354C1"
ActiveChart.SeriesCollection(1).Values = "=sheet1!R2C2:R4354C2"

ActiveChart.SeriesCollection(1).name = "=""系列1"""

With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "HD"
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "xxxxx"
.Axes(xlValue, xlPrimary).HasTitle = True
.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "yyyyy"
End With
296デフォルトの名無しさん:2006/08/09(水) 13:58:58
>>295
つ マクロの記録
297295:2006/08/09(水) 14:22:29
マクロの記録を使ってもシート名が出てできないんです
助けてください
298デフォルトの名無しさん:2006/08/09(水) 14:26:06
>>297
マクロの記録ができないんだったら、それはマクロでは書けないという事じゃないかな。
299デフォルトの名無しさん:2006/08/09(水) 14:44:57
マクロの記録だと始めからアクティブになっているからできないんだよ
300292:2006/08/09(水) 14:58:07
一番最初にset なんちゃら =activesheet
にしてActiveChart.SetSourceData Source:=Sheets("sheet1").とかの
sheets("sheet1")の部分を「なんちゃら」に変えてやればよし。

しかしまず、「ActiveChart」という表現を使うのはやめたほうが吉だと思う
301295:2006/08/09(水) 15:25:39
ありがとうございます!

ActiveChart以外の作り方があったら教えてください!
302デフォルトの名無しさん:2006/08/09(水) 17:00:49
>>301
それくらい類推してくれ。「active」で苦しむのを身をもって体感したばかりだろ?
chartも同じように set どーたらこーたら = charts.add
としてあげて、あとは全部withブロックで囲むとか。
みんなスキルすげえなw
304デフォルトの名無しさん:2006/08/11(金) 12:13:45
>>303
>>286 どうなりましたか?
しょうがないので左に列を1個増やして0を入れたです
値が入ってない列入れてもその列無視された
306デフォルトの名無しさん:2006/08/11(金) 13:04:05
>>305 そうですか...根本的な解決は難しそうですね
307デフォルトの名無しさん:2006/08/11(金) 21:23:11
VBAでコントロールの仔細な動作を制御しようとするのがそもそも
308デフォルトの名無しさん:2006/08/12(土) 00:50:35
離れた列を VBA から Select して領域を指定したいのですが、
その領域の記述法をご教授いただけないでしょうか?

マクロの記録から、Range("B3:B11,D3:D11") のように、二つの列(例えばB列とD列)をコンマで区切れば
良いことはわかったのですが、これを「3 行から 11 行」のように固定ではなく、
変数Nを用いて「3 行から N 列」のように可変にしたいのです。
309308:2006/08/12(土) 00:56:34
「3 行から N 行」でした。
310デフォルトの名無しさん:2006/08/12(土) 01:00:50
"B3:B"&N&",D3:D"&N
311デフォルトの名無しさん:2006/08/12(土) 01:14:50
>>308
union(range, range)
312308:2006/08/12(土) 01:27:32
>>310-311
どちらの手法でもいけました。ありがとうございます!
313デフォルトの名無しさん:2006/08/12(土) 10:16:28
Excelvbaで組んだコードと同じ動作のものをvbでも組んで見たいと思うのですが
Microsoft Visual Basic 2005 Express Editionで参照にexcelを追加すれば簡単に行けそうですか?
自分はvbaは少し経験があります。vbaの参考書籍もあるので似たようなものなら挑戦してみたいのです。
314デフォルトの名無しさん:2006/08/12(土) 11:58:08
> Microsoft Visual Basic 2005 Express Editionで参照にexcelを追加すれば簡単に行けそうですか?
Excelオブジェクトのメソッドなどは使えるようになるが、
VBAと互換性のあるVB6以前と、VB.NET 2002〜2005は基本的な構文規則の部分が違うので
VB2005でVBAのコードそのままでは動かないことが多い。VBAのコードそのまま使いたければVisual Basic 6.0を買え。
完全互換ではないので構文的にVB6→VBAで動かない部分はあるが、VBA→VB6で動かない部分はほとんど無いだろ。
315デフォルトの名無しさん:2006/08/12(土) 18:20:57
>>314
難しいのですね。
vb6は手にはいらないと思うので2005でがんばります。
ありがとうございました。
316デフォルトの名無しさん:2006/08/12(土) 18:22:47
>>313
同じ動作のプログラムを作り直す気があるのならその組み合わせでも行けると思う。
但し、同じ動作の(似たようなロジックを持つ)別のプログラムになることは間違いない。
317デフォルトの名無しさん:2006/08/13(日) 16:47:07
リアルタイムスプレッドシートを使っています。
セルの値が刻々と自動で変化するようになっています。
一つのセルだけに注目して、そのセルの値が変わった時にだけ発生するイベントとかありませんか?
あるいはそれを実現する為の裏道とか知ってらっしゃる方がいたらお教え願います。
特定のセルの値が変わったらソースを実行したいと思っています。
他のセルの値も変化しますが、それにはひっかからないようにならないかと考えています。
よろしくお願いします。
318デフォルトの名無しさん:2006/08/13(日) 17:10:04
>>317
Worksheet_Change
  If Target

他のセルの値が変わってもイベントが発生すると言うかも知れないが、
何故このイベントにByVal Target As Rangeという引数があるのか考えてみよう。
もし、Worksheet_A1_Change〜Worksheet_IV65536_Changeなんて感じで
Changeだけで16777216個ものイベントが有ったらたまったものじゃないだろ。
しかも2007では更に・・・

それに例え16777216個のイベントを用意したとしても、
Worksheet_Changeイベントを起こしてから、Targetで条件分岐するか
条件分岐してからWorksheet_***_Changeを起こすかの違いで
対象以外のセルの値変更で内部イベントが起きることには変わりない。
ただそれが見えるか見えないかの違いだけ。

こういう引数のあるイベントってのは、ユーザーの見えない弄れないところで条件分岐させるより
ユーザーが見て弄れるところで条件分岐させた方が効率よいから、条件を引数にしてるだけであって
見えないからってその処理をしていないわけじゃないから、
見えなくなったから効率が良くなる処理が早くなるってわけじゃない。
つまり君の望むような物があったとしても、引っかからないのではなく引っかかってるのが見えないだけだ。
ClassでEvent、WithEventsなんかを使うようになると解ると思う。
319デフォルトの名無しさん:2006/08/13(日) 18:53:19
' INIに文字列情報を設定する関数(API)の定義
Public Declare Function WritePrivateProfileString Lib "kernel32" _
Alias "WritePrivateProfileStringA" _
(ByVal lpApplicationName As String, _
ByVal lpKeyName As Any, _
ByVal lpString As Any, _
ByVal lpFileName As String) As Long

iniファイルをあれこれいじるために調べていたらこういうのが見つかった
んですけど、ここでAsの後に出てくるAny というのは一体どういうものなん
でしょうか?
320デフォルトの名無しさん:2006/08/13(日) 19:17:06
VBA で複数のセルに内容を記入する際、For 文で回して
Sheet1.Cells(i,j) = 値
のようにしているのですが、データ数が数千に及ぶようになるとセルの記入に時間がかかってしまいます。
これを高速化する方法はないでしょうか?

例えば、データの配列を用意しておいて、それをFor 文で一つ一つ書き込むのではなく、
まとめて Cell に突っ込むような方法があれば、高速描画できそうな印象があるのですが、
そのような手法はないでしょうか?
321デフォルトの名無しさん:2006/08/13(日) 19:18:59
>>320
range = array
322デフォルトの名無しさん:2006/08/13(日) 19:20:01
もひとつ。
screenupdatingをfalseにして、描画後trueに。
323デフォルトの名無しさん:2006/08/13(日) 20:38:10
>>321-322
ありがとうございました。高速になりました。
324デフォルトの名無しさん:2006/08/13(日) 20:43:51
>>321
range(cells(1,5),cells(5,5)) = split("1,2,3,4,5",",")

としてもすべてのセルに1番目の要素が入ってしまうのですが、どうすればよいでしょう。
325321:2006/08/13(日) 21:09:13
>>324
ちょっとVBAから遠ざかっているので、回答ズバリのコードがか書けなくてすまん。

range = arrayの場合、双方とも二次元配列として捕らえられる。
arrayが一次元配列の場合は、横方向のrangeにはそのまま設定できるが、
縦方向のセルの場合は、arrayの最初の要素だけが設定される。
縦方向に繰り返し設定されるのは、range("A1:A5") = 10などとしたときに、
全てのセルに10が設定されるのと同じ理屈。

イミディエイトペインで
a = range("A1:C2").Value
range("B4:D5") = a
としてみると、お互い二次元であれば正しく動くことが確認できるはず。

ただし、俺はその「a」を、VBAでどう書くのかは忘れてしまった・・・。
なんか簡単に書けた気もするのだが・・・。
326デフォルトの名無しさん:2006/08/14(月) 00:42:57
板ちがいだったのでVBA総合スレッドで質問します。

【1 OSの種類】 WindowsXP
【2 Excelのバージョン】Excel2000

COMアドインでDLL作ったのですが、使い方がわかりません。
新規アドインの標準モジュールに
Sub hyouji()
Msgbox "メッセージボックス"
EndSub
のコードを書いてDLLを作りました。どうすればエクセルの別のブックか
ら「hyouji」を呼べるのでしょうか?

DLL作っただけです。設定とかも教えてください。よろしくお願いします。
327デフォルトの名無しさん:2006/08/14(月) 01:44:47
>>326

素のExcel2000でCOMアドインが作成できました?
Officeデベロッパーぢゃありませんでしたっけ。

まっ私は Officeデベロッパーを使った事が無いのでお手伝い出来ませんが。

328デフォルトの名無しさん:2006/08/14(月) 02:00:44
>>320
二次元配列をセルに転記するなら

Option Base 1
Dim mdate(4, 2) As Integer
Range(Cells(1, 1), Cells(4, 2)).Value = mdate

で、まとめて入力できるよ。
329デフォルトの名無しさん:2006/08/14(月) 11:57:41
>>318
とても興味深いレスありがとうございます。
一つづつ調べて頑張ってみます☆
330デフォルトの名無しさん:2006/08/16(水) 04:03:37
VBAでlzhのファイルをダウンロードする方法ないでしょうか?
331デフォルトの名無しさん:2006/08/16(水) 04:30:44
スレ違い
332デフォルトの名無しさん:2006/08/16(水) 04:38:42
>>330
WinInet

>>331
333デフォルトの名無しさん:2006/08/16(水) 06:38:30
>>332
ありがとうございます。
検索したらVBAによるTCP/IPプログラミング入門の本がありましたので勉強してみます。
サンプルがどこかにあれば参考にしたいなと思ったけどないですよね?
334デフォルトの名無しさん:2006/08/16(水) 08:20:55
>>333
WinInetはそんなTCP/IPの世界より高レベルだから、
直接的にその本が役に立つかは微妙。知っておいて損はないだろうけど。

WinInetくらいググればサンプルはきっと見つかると思う。
335デフォルトの名無しさん:2006/08/19(土) 19:26:34
保守
336デフォルトの名無しさん:2006/08/20(日) 19:13:47
空白のセルと、0を比べたらTrueが返ってくるんですけど
どうしてでしょうか?
337デフォルトの名無しさん:2006/08/20(日) 20:28:42
>>336
見入力判定はlenを使うと言いよ。
338デフォルトの名無しさん:2006/08/20(日) 20:43:30
>>336
一致するからだよ。
試しにワークシートで空セルを参照する式(=A1とか)書いてみな。0が返るから。
Excelの空セルは、厳密には""でも0でもないが、""にも0にも一致する。
339336:2006/08/20(日) 21:09:48
>>337
なるほど今度使ってみようと思います。

>>338
空セルは特別な扱いなんですね
なにか決定的な理由が欲しい・・
340デフォルトの名無しさん:2006/08/20(日) 21:11:54
>>339
A1 = 1
B1 = Empty
C1 = =A1+B1
341デフォルトの名無しさん:2006/08/21(月) 09:41:01
VBとVBAの互換性ってどのくらいありますか?
べつの言語と考えたほうがいいんでしょうか?

VBの本を買ってきてそのコードをExcelとかに付属の
VBE上で実行すると実行できちゃうもんですか?

たとえばカレンダーアプリみたいなもの。
342デフォルトの名無しさん:2006/08/21(月) 10:29:55
>336
厳密には違うけど、セルはVariant型の変数だと思って扱うといいよ。
得られる文字数に制限あるけど文字列として扱いたいなら.Textプロパティを使うとか‥‥
343デフォルトの名無しさん:2006/08/21(月) 10:42:41
>>341
VBには多機能なFormがあるけどExcelVBAには強力無比なスプレッドシートがある。
GUI周りは互換性がないが、演算だけならVBAへの移植は難しくない。
#同じ言語だが使い方が違うと思えばいい。例えばセールストークと演説は全然違う。
344デフォルトの名無しさん:2006/08/21(月) 21:45:54
UserFormでは不満ですか?
345デフォルトの名無しさん:2006/08/21(月) 21:51:17
単一ソフトのマクロフォームとしてはUserFormでも充分過ぎるが
VBに慣れてる人には、不満だらけだろうな。
346デフォルトの名無しさん:2006/08/21(月) 22:02:47
ドッチかというとVB自体に不満たらたらなんで気にならんかったw
347デフォルトの名無しさん:2006/08/21(月) 22:04:10
>例えばセールストークと演説は全然違う。

ジャパネットたかたと選挙演説の違いがよく分かりません。
348デフォルトの名無しさん:2006/08/22(火) 02:23:50
>>347
VB6で作ろうが、VBAで作ろうが、例えば簡易ストップウォッチならそっくりになるってこった。
349デフォルトの名無しさん:2006/08/22(火) 17:23:46
質問です
よろしくお願いします

cells(1, 2)には式が入っていて計算の結果に寄って#NUM!となってしまう場合があります
このときに
if cells(1, 2)>0 then
などとif文を使ったりするとエラーがでて止まってしまいます。
これを回避するために「cells(1, 2)が#NUM!の場合」というif文を入れたいのですが
なんて書けばいいのですか?
初歩的な事だと思うんですがわからないので教えてください。
350デフォルトの名無しさん:2006/08/22(火) 19:45:02
351名無しさん@そうだ選挙にいこう:2006/08/22(火) 21:01:14
ISERROR?
352デフォルトの名無しさん:2006/08/22(火) 23:22:24
>>349
普通にエラートラップではダメなの?
353349:2006/08/23(水) 10:13:58
>>350-352

どうもありがとうございます。
ISERRORって奴を知らなかったのでどうしていいか分かりませんでした。
助かりました。
354デフォルトの名無しさん:2006/08/23(水) 15:18:23
質問です。

エクセル上でCtrl+F≠ナ検索ウインドウが開きますが、
VBAで起動させる際は、subとEnd subの間になんと書き込めばいいでしょうか。

よろしくお願いいたします。
355デフォルトの名無しさん:2006/08/23(水) 16:17:07
SendKeys "^(f)"
356デフォルトの名無しさん:2006/08/24(木) 14:06:26
354です。

ありがとう御座います。
このVBAをコマンドボタンにて起動させ様ようと、
下記の通り作成しましたが、反応がありません。
想定出来る原因はわかりますでしょうか。
また、コマンドボタンで検索を実行させる模範例をご教授して頂ければ助かります。

Private Sub CommandButton1_Click()
SendKeys "^(f)"
End Sub
357デフォルトの名無しさん:2006/08/24(木) 15:44:29
>>356
原因:フォーカスがシート上に無いから。
358デフォルトの名無しさん:2006/08/24(木) 16:41:03
>>357
初心者ですいません、フォーカスが解りません。
具体的にどうすればよろしいでしょうか。

359デフォルトの名無しさん:2006/08/24(木) 17:21:32
エクセルでさ、セルに入力する時に
そのセルの上クリックしたら枠が太くなるじゃん

その状態を、シートのセルにフォーカスした、と言うんだと。
360デフォルトの名無しさん:2006/08/24(木) 17:33:44
>>358
ツールバーに検索ボタンを登録してみては?

ツール→ユーザー設定→コマンドタブ→編集→検索ボタンをツールバーにドラッグ
361デフォルトの名無しさん:2006/08/24(木) 18:03:48
>>357
>>359
ありがとうございます。理解しました。

VBAで検索機能をもたせたコマンドボタンを、エクセルシート上に保存して、
メール添付して相手に送りたいのです。
相手側で開いたときにうまく機能しないのですが対策が解りません。
362デフォルトの名無しさん:2006/08/24(木) 18:25:54
そりゃ、相手のセキュリティ意識が高いからじゃねぇの?
363デフォルトの名無しさん:2006/08/24(木) 19:01:16
>>362
相手に連絡をし、マクロのセキュリティレベルは「低」にしましたがダメでした。
364デフォルトの名無しさん:2006/08/24(木) 19:07:11
>>363
「低」って・・・

おまい、ひどいやつだな・・・
365355:2006/08/24(木) 19:10:32
355です。すまんかった。

フォーカスがセルにある状態で"Ctrl+F"出来ればいいんだろ?
いんちきくさいけどこれでできるかな?

Private Sub CommandButton1_Click()
ActiveCell.Activate
Application.Wait (Now + TimeValue("00:00:01"))
SendKeys "^(f)"
End Sub

VBA的に正しいかどうかは不明
366357:2006/08/24(木) 19:36:48
いっそユーザーフォームで検索ウインドウと似たような物を作って、
findメソッド使うって手はどうかな?
367デフォルトの名無しさん:2006/08/25(金) 02:36:27
自前で関数をつくりたいのですが、
Function kannsuu(N)
Worksheets("1").Cells(1, 2) = Worksheets("1").Cells(1, 1)
End Function
としても途中で処理が止まってしまいます。
止まる理由もわからず、したい事もできず困っています。
実現する方法を教えて下さい。
368デフォルトの名無しさん:2006/08/25(金) 03:12:47
シート名
369デフォルトの名無しさん:2006/08/25(金) 04:40:21
なんでSendkeysは普通のプロシージャだと動くのに
ユーザーフォームに登録すると動かないんだろう?
370デフォルトの名無しさん:2006/08/25(金) 07:53:10
Private Sub CommandButton1_Click()
Application.ScreenUpdating = False
Application.Wait (Now + TimeValue("00:00:01"))
Application.CommandBars(1).Controls(2).Execute
Application.CommandBars(1).Controls(2).Controls(14).SetFocus
SendKeys "{ENTER}", True
Application.ScreenUpdating = True
End Sub
371370:2006/08/25(金) 08:39:42
削ったら1行になった orz

Private Sub CommandButton1_Click()
Application.CommandBars(1).Controls(2).Controls(14).Execute
End Sub
372デフォルトの名無しさん:2006/08/25(金) 08:41:51
Application.Dialogs(64).Show
373デフォルトの名無しさん:2006/08/25(金) 08:59:13
Application.Dialogs(xlDialogFormulaFind).Show

XlBuiltInDialog のメンバ のものが ダイアログ表示のための定数
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vbaxl11/html/xlhowConstants.asp
オブジェクトブラウザからも探せますね
374デフォルトの名無しさん:2006/08/25(金) 09:36:05
>なんでSendkeysは普通のプロシージャだと動くのに
>ユーザーフォームに登録すると動かないんだろう?

動くんじゃね?ターゲットとなる対象が間違ってるんじゃね?

Private Sub CommandButton1_Click()
SendKeys "{TAB}"
End Sub
これならユーザーフォームではなくてCommandButton1に対してTABキーを送ってるのよ
375デフォルトの名無しさん:2006/08/25(金) 09:47:40
>Application.Dialogs(xlDialogFormulaFind).Show

これ実行した後だと"Ctrl+F"が実行できなくならない?なんでだろ
376デフォルトの名無しさん:2006/08/25(金) 09:59:35
質問です。

閲覧者が複数でひとつのアドレスを共有している場合、個別に閲覧確認する良い
方法はありませんでしょうか。

パソコン使えない方が多いので、個別にアドレスを設定する事が出来ません。

例えば添付ファイルにエクセル貼り付けて、VBA使用して個別の名前のコマンドボタンクリックすれば
閲覧情報が返って来る様なプログラムは出来るのでしょうか。
377370:2006/08/25(金) 10:00:27
>>374
369をみてユーザーフォームからSendKeysが効かないのであれこれしてただけなんで。
むりやりSendKeys "{ENTER}", Trueで効くじゃんと思ったが無駄だなぁと省いたら
Application.CommandBars(1).Controls(2).Controls(14).Executeだけに。
それなら
Application.Dialogs(xlDialogFormulaFind).Showでいいわけなので結果無意味だったかな
まぁ、SendKeysだけでフォームから動作できなかったわけだが。

これのSetFocusのあとだから効いたの?
Application.CommandBars(1).Controls(2).Controls(14).SetFocus
SendKeys "{ENTER}", True
378デフォルトの名無しさん:2006/08/25(金) 10:01:02
376です。

outlookを使用しています。
379370:2006/08/25(金) 10:27:06
>>375
おおおぉぉぉ なんで?
380デフォルトの名無しさん:2006/08/25(金) 20:41:03
>>368
シート名と言うと、上の例だと1ですよね。
色々変えてみたのですが、やはり処理が途中で止まってしまいます。

関数だと他のセルの操作ができないのかな〜

誰か助けて下さい〜
381デフォルトの名無しさん:2006/08/25(金) 20:53:14
SendKyesなどという過去の遺物は忘れ去るべし
382デフォルトの名無しさん:2006/08/25(金) 21:40:01
まぁExcelの中だけなら・・・
383デフォルトの名無しさん:2006/08/25(金) 21:52:44
>>380 根本的に勘違いしてると思うぞ。
>>367は関数じゃない。
384デフォルトの名無しさん:2006/08/25(金) 22:29:04
>>383
全然話についていけないのですが、関数では無いとはどう言う事でしょうか?
関数では無いからエラーになるまではわかるのですが、関数の定義と言うか、どこがおかしいのかがわかりません。
何がいけないのか教えてもらえないでしょうか。
385デフォルトの名無しさん:2006/08/25(金) 22:53:17
>>384
日本語が分からない人に日本史を教えるような難しいことはできん。
とりあえずまず、なぜ「自作関数」が必要なのか教えてくれ。
386デフォルトの名無しさん:2006/08/25(金) 23:34:35
>>384
まず何がしたいのかがよく分からない。
Functionは値を渡し、Function内で処理をして値を返す物です。
387デフォルトの名無しさん:2006/08/25(金) 23:38:47
>>385
刻々と値の変化するセルが300個ほどあります。
特定のセルが変化した時にだけ処理を行いたいと思っています。
それを実現するには自前の関数を作ればいいと教えてもらってのでやってみました。
ただ、その処理と言うのが他のセルに値を貼り付けるとまでは説明していませんでした。
関数では他のセルに値を貼り付ける事はできないようなので、素直にイベントでやってみます。
負荷を少しでも軽くする抜け道がないかと思ったのですが。
388デフォルトの名無しさん:2006/08/25(金) 23:44:23
>>386
なるほど。
関数の意味がわかりました。
ありがとうございます。
389デフォルトの名無しさん:2006/08/25(金) 23:53:27
なぜ「刻々と値が変化」してるのだ?
390デフォルトの名無しさん:2006/08/26(土) 00:00:25
>>387
5回読み返してやっと意味が6割くらい理解できた。
ワークシート関数から呼び出すからといって処理が軽くなるわけじゃないので、
イベントでやるのが正解(=後で処理しやすい)だと思う。
>>389
Webクエリとかじゃね?
391デフォルトの名無しさん:2006/08/26(土) 00:08:34
>>389
>>390
RSSだろ(知らんヤツにはわからん)
392デフォルトの名無しさん:2006/08/26(土) 00:09:54
>>389
証券会社から株価のデータをリアルタイムで受け取っています。
リアルタイムスプレッドシートって事くらいしかわかりません。
393デフォルトの名無しさん:2006/08/26(土) 00:10:01
なぜ変数に英数字使う人が圧倒的に多いのですか?

漢字やひらがなを使った方がコードが非常にわかりやすくなると思いますが。
途中で入力を切り替えなければいけない煩わしさを補って余りあると
思います。
394デフォルトの名無しさん:2006/08/26(土) 00:18:16
>>390
説明が下手ですいません。
株の取引上、最速が必要でした。
イベントだと1秒に100回は処理する事になるので。。。
395デフォルトの名無しさん:2006/08/26(土) 00:22:43
>>393
会社だと英語表示じゃないと困る事がある。
一つのシステムを複数の会社で作るとき自社だけ漢字を使うわけにはいかない。
396デフォルトの名無しさん:2006/08/26(土) 00:36:11
説明になってない件
397デフォルトの名無しさん:2006/08/26(土) 00:42:56
結局のところ、惰性でみんな英数字を使い続けるんだよ。

もっともらしいことを言えば、直接入力できない煩わしさの方が
利便性より上回ると多くの人が考えているのだろうとか、
英語はプログラマの共通語だと格好づけるなどといったところかな。
398デフォルトの名無しさん:2006/08/26(土) 00:55:18
日本語変数に慣れてしまうととVB以外の言語で困る、とか
VBやってる人は他の言語もできるので、その言語に合わせてるとか。
399デフォルトの名無しさん:2006/08/26(土) 00:56:01
>>396
なってんじゃねーか?
400デフォルトの名無しさん:2006/08/26(土) 01:03:01
おいらの場合、慣れの問題。VBに関しては
普段Cでもプログラム書いてるので英数で書くのが普通。
一度実験で日本語込みで書いた事あるけどコメントと区別がつかなくて読みにくかった(例:[txt問題番号]みたいな書き方の場合)
色でも区別を付けてるんだけど、やっぱり日本語はコメント文に見える。

あと、日本語で書くと色々うるさい奴がいる可能性があるので英数で書いておくのが無難ってのもある
VB,VBAはIDEが優秀だから日本語でもいいんだけどね、個人的には
401デフォルトの名無しさん:2006/08/26(土) 05:18:24
単純な話、漢字を変数に使い始めると誤変換やらかす馬鹿が出てくるって問題もあるがな。
「"貸方"をセルに代入しようとしているんですがエラーになっちゃいますぅ」
「あれだ、"貸し方"って変換してりゃぁそりゃエラーにもなるだろ」
402デフォルトの名無しさん:2006/08/26(土) 06:55:32
>>401
それはスペルミスと同じレベルの問題で漢字特有って程じゃない。
それに人為的ミスがあって不都合が発生するのは当然。
スペルミスも誤変換も、インテリセンスと変数宣言の強制という同じ方法で防げるし。
403デフォルトの名無しさん:2006/08/26(土) 09:03:32
>>402
確かになぁそうだな。「0」「o」「O」、「1」「l」で同じことが言えるかもしれないし。
ただ、やはり他人の書いたコードに2バイト文字の変数があると身構えてしまう。
404デフォルトの名無しさん:2006/08/26(土) 21:16:42
ふだんWebアプリをつくっているのですが、
このたびエクセルVBAをフロントに使った大きめのシステムをつくることになりました。
WebアプリではRubyのRailsやJavaのSpringなどフレームワークが流行ってますが
VBAではそういった開発に役立つようなフレームワークってありますか?
VBAunitは使ってみようと思っていますが。
405デフォルトの名無しさん:2006/08/27(日) 05:05:09
VBAという言語自体がフレームワークなんだが。
だからこそVB含めて、ここまで初心者の間に広まった。
406404:2006/08/27(日) 17:49:12
>> 405
> VBAという言語自体がフレームワークなんだが。
> だからこそVB含めて、ここまで初心者の間に広まった。

なるほど。
だけど複数人で開発とかになるとちょっとつらいですね。
407デフォルトの名無しさん:2006/08/27(日) 19:33:46
普通の開発はフレームワークに機能を追加していくかたちだろうが
Excelの場合多彩な機能を片っ端から無効化していく作業が必要だな。
408デフォルトの名無しさん:2006/08/27(日) 20:37:50
お願いだからVBAは止めてください
409デフォルトの名無しさん:2006/08/28(月) 15:37:24
>402
日本語使うと誤変換よりも送り仮名等でコードの内容を、口頭で伝えるときに不便なのかも‥
一人で開発するには問題ないけどね
410デフォルトの名無しさん:2006/08/31(木) 10:29:39
VisualBasic for Application専用の質問スレッドです。
411デフォルトの名無しさん:2006/09/01(金) 00:24:37
Excel2000ユーザーです。

FileDialogオブジェクトを使おうとしたら、「ユーザー定義型は定義されていません」
というコンパイルエラーになりました。
参照定義には、Microsoft Office 9.0 Object Libraryがちゃんとチェックされています。
FIleDialogを使うにはオブジェクトライブラリの10.0以上が必要なんでしょうか?
412デフォルトの名無しさん:2006/09/01(金) 00:47:23
>>411 自己レスです。
この方法はどうやらWindowsXPでなければ使えないということが分かりました。
http://www.microsoft.com/japan/technet/scriptcenter/resources/officetips/aug05/tips0825.mspx
413デフォルトの名無しさん:2006/09/01(金) 01:16:03
VBSでなく、VBAならWinAPIを呼べばいいと思うのだが。
414デフォルトの名無しさん:2006/09/04(月) 22:21:18
excel2000sp3を使用しています。
VBAにて計算処理をして、Ctrl+Vで変数の値を貼り付けれるようにできませんか?

よろしくお願いします。
415デフォルトの名無しさん:2006/09/04(月) 22:37:21
>>414
マクロをキーボードに割り当てればいいよw
416デフォルトの名無しさん:2006/09/04(月) 22:43:32
>>414
とりあえずドコカのセルにぶち込んでCUTするとかじゃだめ?
417414:2006/09/05(火) 18:47:09
レスありがとうございます。

変数の値を一度セルにいれてからコピーし、
Ctrl+Vで貼り付けするとコピー元の書式や属性も張り付いてしまいますよね。
値だけペーストしたいのです。

形式を選択して貼り付けで値だけ貼り付けが可能なのは存じております。
Ctrl+Vでそれをできないものかと思いまして。
418デフォルトの名無しさん:2006/09/05(火) 22:45:56
>>417
VBAで計算するのになぜCtrl+Vが出てくるのかが分からん。
何をしたいのかもっと詳しく。
419デフォルトの名無しさん:2006/09/06(水) 00:12:27
>>417
APIの話になってくるからVBスレで聞いたほうがいいかも?
420デフォルトの名無しさん:2006/09/06(水) 01:07:27
>>417
頭が固いんだよ
Ctrl+Vを頭から消せ!

マクロを右クリにでも割り当てろよ
421デフォルトの名無しさん:2006/09/06(水) 01:23:08
だからCtrl+Vに割り当てればいいじゃない
422デフォルトの名無しさん:2006/09/06(水) 01:30:52
>>417
418と同じ感想を持った。計算結果の変数:answerをそのまま、マクロで
目的のセルに代入すれば、Ctrl+Vは必要ない。 例:Range("A1").Value = answer

>Ctrl+Vで貼り付けするとコピー元の書式や属性も張り付いてしまいますよね。

コピー元が無設定のセルなら、書式、属性はコピー先が優先される。
Ctrl+Vも結果として、【形式を選択して貼り付けで値だけ貼り付け】と同じになる。
だから、計算結果の変数を無設定のセルに代入後、コピペすればいい。

VBAで求めた計算結果をそのまま、クリップボードに転送する簡単な命令はエクセルの
VBAにはない。代替方法として、APIを呼び出す方法やDataObject オブジェクトの
PutInClipboard メソッドを使う方法がある。しかし、416のようにセルを使い、
その操作をマクロで再現するのが、簡明である。

Ctrl+V の所作に関して。Ctrl+V にマクロを割り付けることは可能であるが、推奨しない。
標準の挙動を変えるとミスの元になるし、その操作になれると他のシートで勘違いを起こすから。
【形式を選択して貼り付けで値だけ貼り付け】をワンタッチでしたいなら、下記のマクロに
(キーは参考例)Ctrl+ALT+V を割り付ければいいだろう。

Sub Macro1()
ActiveCell.PasteSpecial Paste:=xlValues
End Sub
423デフォルトの名無しさん:2006/09/06(水) 01:36:57
フォームのエディットボックスからコピーすればテキスト形式でクリップボードに入るよ。
424414:2006/09/06(水) 19:22:07
レスありがとうございます。

仕事で私が使用している製品別計算処理のVBAの結果データ(数字)を使用したいと
職場のおじいさんにいわれたのですが
パソコン(エクセル)の扱いになれておらず、貼り付けたら書式設定が変になったから元に戻してくれといわれ
形式指定の貼り付けを教えても、間違えてしまい難しいといわれました。
おしいさんの使うエクセルのファイル名も貼り付けるセルの位置も不確定だったので
値だけコピーできれば単純に貼り付けでうまくいけないかと考えておりました。
Ctrl+Vにこだわったのは、この動作は右クリック貼り付けより使いやすいといわれたので・・・すみません。

私の方の処理結果を出力しているセルは固定なので、そこに値だけコピーできるボタンを作ってあげられればと思いました。


これからみなさんが教えてくださったことを調べて試してみます。
本当にありがとうございます。
425デフォルトの名無しさん:2006/09/06(水) 20:55:17
キーマクロってどうやってセットするの?

マイ関数作って、イベントかなんかで割り当てするの?

ExcelVBA中級くらいのスペックのつもり。
でもやったことないからわからん。

426デフォルトの名無しさん:2006/09/07(木) 00:08:49
中級者ならエクセルのマニュアルぐらい見たら?
マクロの割り当て方法がいろいろ書いてあるよ。
427デフォルトの名無しさん:2006/09/07(木) 00:28:31
> でもやったことないからわからん。
> でもやったことないからわからん。
> でもやったことないからわからん。
> でもやったことないからわからん。
> でもやったことないからわからん。
428デフォルトの名無しさん:2006/09/07(木) 01:09:09
>>425
実は初心者の方が一発で分かるって話だな。
とりあえず「マクロの記録」の画面出してみろ。
429デフォルトの名無しさん:2006/09/07(木) 05:24:33
>>425
疑問を持つことは悪くない。上級者だって知らないことはある。
俺だって数年前にオマエと同じ疑問を抱いた。しかし速攻で調べて速攻で自己解決出来た。

他の知識が豊富なら、キーマクロの割り当て方を知らずに中級者を名乗るのはいいとしても
キーマクロの割り当て方すら自分で調べられずに中級者を名乗るのは烏滸がましいにも程がある。

ヘルプに書いてあることを自分で調べられるようになって初めて初心者。
ヘルプに書いてないことを、応用で導き出せるようになると、そろそろ初心者も卒業。
そしてあとは、その導き出した物の出来で中級者以上へと昇格する。
初心者とは一人前の下っ端のことを指す。自分のケツも自分で拭けないうちは半人前で初心者以下。
つまり君はまだ初心者にも満たない「入門者」だな。早く門を潜り終えて、初心者の位置に立とう。
430デフォルトの名無しさん:2006/09/07(木) 12:06:02
他人に教えられるようになったら上級者で、
他人に説教するようになったらご隠居です。
431414:2006/09/07(木) 18:48:03
解決しました。みなさん本当にどうもありがとうございました。
下記のようにやりました。ユーザフォームは非表示でテキストボックスだけつけてあります。

form.TextBox.Value = Cells(x,y).Value
form.TextBox.SelStart = 0
form.TextBox.SelLength = form.TextBox.TextLength
form.TextBox.Copy
432デフォルトの名無しさん:2006/09/07(木) 21:45:59
>>430
ご隠居さん、こんにちは。
433デフォルトの名無しさん:2006/09/07(木) 23:13:07
>>431

Sub Macro1()

' Keyboard Shortcut: Ctrl+v
'
Dim x As Variant
x = Cells(1, 1).Value
ActiveCell.Value = x
End Sub

ツール→マクロ→オプション→ショートカットキーで

Ctrl+vに登録すれば良いと思う

違うとこで利用したい、クリップボードに取り込みたいなら

Private Sub Workbook_Open()
Dim n As Variant, CB As New DataObject
x = Cells(1, 1).Value
CB.SetText x
CB.PutInClipboard
End Sub

で出来ました。
参照設定でMicrosoft Forms 2.0 Object Libraryが必要です
userformを挿入すると自動的に参照設定されます
434デフォルトの名無しさん:2006/09/08(金) 13:09:54
グラフの元データの参照範囲を変えるマクロを書こうとしています。
そこで現在の参照範囲を取得するために自動記録してみたところ

ActiveChart.SeriesCollection(1).XValues = "A1:A5"
のようになっていましたので

aaa = ActiveChart.SeriesCollection(1).XValues
としたのですが、この後、
bbb = aaa.Address
としても「型が一致しません」と出て代入できません。
(この時、VBAE上でaaaにカーソルを合わせても何も表示されません)

XValuesの値を取得するにはどうすればよいのでしょうか。
よろしくお願いします。
435デフォルトの名無しさん:2006/09/08(金) 13:45:58
強引過ぎるなw
436414:2006/09/08(金) 19:15:58
>>433
初めてみる命令なので調べながら試させていただきます。
親切にどうもありがとうございます。
437デフォルトの名無しさん:2006/09/09(土) 19:15:16
>>434
aaaってRange型なの?
Range型なら、Setステートメント使わないとだよね?
Range型じゃないとしたら、Addressプロパティを使うのはおかしいよね??
438デフォルトの名無しさん:2006/09/10(日) 15:01:03
アクセスのVBAについて教えてください!

リンクしたテーブルを一時格納して別のテーブルに追加する方法を教えてください!

CurrentDb.Execute "DELETE * FROM テーブル;"

CurrentDb.Execute "SELECT aaa,bbb,ccc FROM リンクしたテーブル into Dim??"(ここが分からない)

CurrentDb.Execute "INSERT INTO テーブル (aaa,bbb,ccc) values('格納した数値','〃','〃')"


SELECTで抽出されるレコードは複数です。
複数一気に入れて、一気に別のテーブルに入れる方法を教えてください。
(形式・桁数を変えないといけないので、一時的に変数に格納します。)
439デフォルトの名無しさん:2006/09/10(日) 15:54:05
レコードセットにレコードを入れるところまでいけた
あとは、INSERT
どうすれば良い?
大至急
440デフォルトの名無しさん:2006/09/10(日) 17:40:48
INSERTのvalueに変数は使えないのですか?
441デフォルトの名無しさん:2006/09/11(月) 22:57:58
Jリーグ公式のデータベースから順位表を取ってきてグラフ表示をするマクロを作りました。
ほとんどマクロ登録で作ったので、何かの参考になればと思い晒します。
使い方は冒頭に書いたつもりです。
ブラウザで文字化けする時はエンコードをシフトJISにしてみてください。
http://ryoma3.hp.infoseek.co.jp/J2/Module1.txt

442デフォルトの名無しさん:2006/09/12(火) 09:45:30
冗長な処理が多すぎて話にならないな。
443デフォルトの名無しさん:2006/09/12(火) 12:19:15
>>442
詳しく
444442じゃないけど:2006/09/12(火) 15:24:27
>>443
.selectが一杯ナところとか、
Caseとかをchr()とかでまとめたりできる、ってのをいいたいんじゃないのかな?
あと、Sub Init()とかすごいし。
まぁ、でもマクロ登録で作ったって自分で言ってるんだから、ねぇ?
445デフォルトの名無しさん:2006/09/12(火) 15:52:56
すみません。初心者です。
使用OS:Windows XP、Excel2003です。

Sheet1の5行目以降1行おき1列目に値が入力されています。
Sheet2は伝票のフォーマットです。

Sheet1の値をSheet2のE10にコピーして、
それを各行の値ごとに新しいシート
(たとえばsheet1の5行目はsheet3に)
sheet1が空白行になるまで出力し続けたいと思っています。

以下のように書いたのですが、
実行時エラー1004:アプリケーション定義またはオブジェクト定義のエラーと出てきます。
どなたかお願いします。

Sub Format()
Dim NewWorkSheet As Worksheet
i = 0
k = i / 2 + 3
Do Until IsEmpty(Worksheets("Sheet1").Range("A9").Offset(i, 0).Value)
Set NewWorkSheet = Worksheets.Add()
NewWorkSheet.Name = "Sheet" & k
Worksheets("sheet2").Copy Destination:=Worksheets("Sheet" & k)
Worksheets("sheet1").Cells(i, 1).Copy Destination:=Worksheets("Sheet" & k).Range("E10")
i = i + 2
k = k + 1
Loop
End Sub
446デフォルトの名無しさん:2006/09/12(火) 16:04:09

Sheet1の5行目以降じゃなくて9行目でした。
447デフォルトの名無しさん:2006/09/12(火) 17:06:59
>>445
すげーイライラするコードだなw
見る気がしない。ただ、ザッと見たとこ
Worksheets("sheet1").Cells(i, 1).Copy Destination:=Worksheets("Sheet" & k).Range("E10")
これ一発目の時(0,1)参照しちゃってるんじゃないの?
448デフォルトの名無しさん:2006/09/12(火) 17:12:32
行の前に「’」を打つと、その行は無視するようになりますよね。
複数行無視する場合はどうすればいいでしょうか?
Cでいう{  }に該当する機能はないでしょうか?
449デフォルトの名無しさん:2006/09/12(火) 17:24:19
450デフォルトの名無しさん:2006/09/12(火) 17:26:46
>>448
VB関連の言語(VB4,5,6、VBA、VBS)は、
行コメントのみで囲みコメント記述は存在しない。
451445:2006/09/12(火) 17:28:21
>>447
ありがとうございます。
ご指摘の箇所、Worksheets("sheet1").Cells(i + 9, 1) と書き直してみました。

ただ、最初にエラーが発生するところが
Worksheets("sheet2").Copy Destination:=Worksheets("Sheet" & k)

なので、新しいシートの名前の定義が良くないのでしょうか?
452448:2006/09/12(火) 17:36:07
>>450
丁寧にどうもありがとうございますm(_ _)m
よくわかりました。
しかし、不便だなあ。
453みっにい:2006/09/12(火) 18:51:40
VBで組合せのパターンを全種類抽出したいんですけど出来ません。
誰か助けてもらえないでしょうか?('。`)/~
例:1と2と3なら1,2,3,12,13,23,123
454デフォルトの名無しさん:2006/09/12(火) 20:24:57
>>452
根本的な解決では無いですが、
「編集」ツールバーを表示させて、「コメントブロック」「非コメントブロック」
を使用すると、複数行のコメントの設定/解除が一発で可能です。
455447:2006/09/12(火) 20:40:20
>>451
おぉ、スマソ。
見落としてた。シートのCopyメソッドにはDestinationの引数は使えないっすよ。
複数のセルをコピーさせるのが一番早いかな?
方法は色々あるが、コードがきちゃなすぎてどこから手をつけていいか分からん。

>>453
助けを求めるなら自分でどこまでやったか書いてくれんと
答える側もどこから説明を始めたらいいのか困りますよ。
まぁ、顔文字付のふざけた質問に答える奴もいないだろうけど。
456447:2006/09/12(火) 21:09:57
多分>>445がしたい事
勝手に改造しちゃいました。

Sub Format()
i = 5
k = 3 'iと連動させたい?
Do Until IsEmpty(Worksheets("Sheet1").Cells(i, 1).Value)
Worksheets("Sheet2").Copy , Worksheets(Worksheets.Count)
With Worksheets(Worksheets.Count)
.Name = "Sheet" & k
.Range("E10") = Worksheets("sheet1").Cells(i, 1)
End With
i = i + 2
k = k + 1
Loop
End Sub
ちょっと強引過ぎますね。私も修行が足りません。
あと、プロシージャ名に予約語を使うとロクな事が無いので注意。
457デフォルトの名無しさん:2006/09/12(火) 23:34:40
>>448
キーボードメインでマウスを、あまり使用しないのであれば

http://www.officetanaka.net/excel/vba/tips/tips04.htm

ここにVBAコーディング時にコメントブロックをコンテキストメニューに
追加する方法が書いてある。
全然、楽になるんで一読してみるといいかも
458デフォルトの名無しさん:2006/09/13(水) 09:16:33
>>453
組み合わせパターン全種って、条件が単純そうに見えて、
結構細かい条件がいろいろあるんだよ。例えば
・全ての文字を1回ずつ使わなくてはならない(結果的に桁固定) → 123、132,213,231,312,321
・一つの文字を何度使っても良い(最大桁指定) → 11,222,333,1111,22222,…(最大5桁)
・一つの文字は1回しか使ってはいけない。(1桁〜文字の種類数の桁) → 1,2,3,11,12,13,21,22,23,31,32,33,123,…
他にもいろいろ。例を見る限り3番目の条件っぽいが、2番目の条件である可能性も捨てきれないし
もしかしたら、2桁以上では、必ず右より左が小さい数値でなくてはならないという条件があるのかもしれない。

そういうのを書いてくれなきゃアドバイスすら出来ないし、例え条件をきちんと書いても、丸投げなんて受け付けない。
自分で書いたコードを途中まででも間違っていてもいいから書け。
459445:2006/09/13(水) 11:35:04
451 さん、有り難うございました。
シート2をそのままコピーして新しいシートに貼り付けると、うまくいかない
(値と別のシートに出力されてしまう)ので、レンジを指定して同じシートに貼り付けるようにしました。
対処療法的ですが、何とか出来ました。

Sub Format()
Dim NewWorkSheet As Worksheet
i = 0
k = i / 2 + 3
Do Until IsEmpty(Worksheets("Sheet1").Range("A9").Offset(i, 0).Value)
Set NewWorkSheet = Worksheets.Add()
NewWorkSheet.Name = "Sheet" & k
Sheets("sheet2").Range("A:AC").Copy Sheets("Sheet" & k).Range("A:AC")
Sheets("sheet1").Cells(i + 9, 1).Copy Sheets("Sheet" & k).Range("E10")
i = i + 2
k = k + 1
Loop
End Sub
460デフォルトの名無しさん:2006/09/13(水) 11:51:05
>459
今は携帯からだから、コードは書いてやれんが、せめて字下げくらいしてくれ
読みにくいったらありゃしない
461デフォルトの名無しさん:2006/09/13(水) 12:58:42
>>458
>>453見りゃ、nCrのこと言ってるとしか読めないが
462デフォルトの名無しさん:2006/09/13(水) 12:59:21
>>460
2ch初心者ですか?
463デフォルトの名無しさん:2006/09/13(水) 14:49:34
  全角使えばいーじゃん
464デフォルトの名無しさん:2006/09/13(水) 14:53:47
>>463
2ch初心者ですか?
465デフォルトの名無しさん:2006/09/13(水) 15:07:38
>>458
> そういうのを書いてくれなきゃアドバイスすら出来ないし、例え条件をきちんと書いても、丸投げなんて受け付けない。

別に丸投げしてもいいじゃん。
気に食わないなら読み飛ばせよ。
466デフォルトの名無しさん:2006/09/13(水) 16:58:02
>>458
おまえレスしなくていいよ

でもウザイと思ってるのは俺だけだから気にするな
467デフォルトの名無しさん:2006/09/13(水) 17:08:13
正しいことを
書いていても
3行以上の
書き込みには
何故か過剰に
反応しだす子が
現れる。
468デフォルトの名無しさん:2006/09/13(水) 17:20:13
>>467
お前の日本語変だぞw
469デフォルトの名無しさん:2006/09/13(水) 17:42:02
いちいちウゼー
やってから聞けよ
470デフォルトの名無しさん:2006/09/13(水) 17:42:48
すんません、誤爆しますた
471デフォルトの名無しさん:2006/09/13(水) 18:08:27
468
なんでそんなに必死なの?
472デフォルトの名無しさん:2006/09/13(水) 18:19:42
>>467
>>458が正しいと言いたいのかなー



自演?
473デフォルトの名無しさん:2006/09/13(水) 18:24:53
下2行に反応したんだろうけど、
上の長文は適切なアドバイスだろ。
きっと目に入ってないんだろうけどw
474デフォルトの名無しさん:2006/09/13(水) 18:30:22
>>473
>>461

ちなみに、これコードごりごり書くしかないね。
入出力の仕様がわからないと書けないけど。
475デフォルトの名無しさん:2006/09/14(木) 09:39:00
>>471
「だす」の使い方じゃね?
476デフォルトの名無しさん:2006/09/14(木) 22:41:34
>>457
遅レスだがトンクス。
477デフォルトの名無しさん:2006/09/15(金) 00:15:23
VBAでWebBrowserを使っています。
WebBrowser上で表示されている↓
<a name="order" href="javascript:submitWeb3Form(document.fuConfirmForm)">
<img src="/webbroker3/46/pc/images/bt_sinkai_b.gif" alt="新規買発注" width="80" height="18" hspace="12" vspace="8" border="0"/></a>
をVBAでクリックするやりかたがわかりません。
誰かお教え願います。

478デフォルトの名無しさん:2006/09/15(金) 00:29:35
477です。
すいませんできました。
失礼しました。
479デフォルトの名無しさん:2006/09/15(金) 00:29:58
>>477
えーとVBAでの制御でリンクを辿る様にしたいという事かな?
言っている事が微妙に分からんぞ?
480デフォルトの名無しさん:2006/09/15(金) 02:20:18
>>479
厳密に言うとリンク辿るというよりボタンを押したいんだろ
同じようでちょっと違う
481デフォルトの名無しさん:2006/09/16(土) 11:50:20
こんにちは。ひとつ質問させてください。

「ファイルを開く」ダイアログを「A*.txt」のように
ファイル名の先頭と拡張子でフィルタリングして表示したいと思っています。
しかしGetOpenFileNameのFilterを「A*.txt」とすると「すべてのファイル(*.*)」
になってしまいます。

Application.Dialogs(xlDialogOpen).Show ("A*.txt")

であればフィルタはかけられるのですが、ファイル自体を開いてしまいます。
ファイル自体を開く行為は処理で記述したいのです。

何か方法はありませんでしょうか?
482デフォルトの名無しさん:2006/09/16(土) 14:14:17
>>481
"A*.txt"ではなく"Text File(A*.txt),A*.txt"ね。
これでちゃんと、名前の頭がAで拡張子がtxtのものをフィルタリング出来たよ。

ちなみにExcel.Application.GetOpenFilenameではなく
Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA"の方を使うこと。
VBA(Excel.Application)の話ではなくなるので、具体的な使い方はスレ違い。
483デフォルトの名無しさん:2006/09/16(土) 16:06:09
>>482
どうもありがとうございます。
APIを使うわけですね。
使い方などを調べてみます。
484デフォルトの名無しさん:2006/09/17(日) 04:40:02
"書式" → "セル" → "表示形式" が "日付" になっているセルに、
"2006/9/1" と入力します。
このセルを Excel VBA で検索しアクティブにしようと思っています。

Sub x001()
Cells.Find(what:="2006/9/1").Activate
End Sub

を実行すると下記のエラーが出てしまいます。

実行時エラー '91':
オブジェクト変数またはwithブロック変数が設定されていません。

セルの書式を"文字列"にするとうまくいきます。

VBAで日付を検索するにはどうすれば宜しいでしょうか?

環境は、WinXP Pro SP2、Excel2003 SP無しです。
485デフォルトの名無しさん:2006/09/17(日) 05:46:21
>>484
ここにサンプルがあります。ご覧ください。
★ Let's Excel VBA ★
ttp://www.sanynet.ne.jp/~awa/excelvba/stepup002.html
上記のNo.92 複数シートの日付検索
486デフォルトの名無しさん:2006/09/17(日) 05:55:53
> セルの書式を"文字列"にするとうまくいきます。
当然だな。日付ではなく文字列を検索しているんだから。

> VBAで日付を検索するにはどうすれば宜しいでしょうか?
文字列ではなく日付を検索すればいいだけでしょ。
""で囲ったら基本的に文字列だってのはわかるよね?
日付はどう書いてもいいし。

Cells.Find(DateSerial(2006, 9, 1)).Activate
Cells.Find(DateValue("2006/9/1")).Activate
Cells.Find(CDate("2006/9/1")).Activate
Cells.Find(#9/1/2006#).Activate

ちなみに文字列で直接書いても、日付形式で書けば日付を検索出来る。
Cells.Find("9/1/2006").Activate
Excelはアメリカ製のソフトなんで、日付の基本書式が日本人の感覚とは違うけどね。

ついでにエラーの原因は、"2006/9/1"なんてセルが存在しないため
FindメソッドがNothingを返しているのに、そのNothingに大してRangeオブジェクトのメンバである
Activateメソッドを使っているから、そのActivateメソッドが使えるオブジェクトが無いよという意味。
Findメソッドを使うときは、一度戻り値を変数に入れて、Is Nothingで検索結果の有無を判断した後で
処理に入るのが基本。
487484:2006/09/17(日) 07:04:00
>>485,486
早速のご回答ありがとうございます。
確認します。
488デフォルトの名無しさん:2006/09/17(日) 11:03:18
3行で済むものを
489デフォルトの名無しさん:2006/09/17(日) 12:02:35
>>488
どうしたの?
490デフォルトの名無しさん:2006/09/18(月) 19:04:32
FAQかもしれませんが・・
Private Sub test()
Dim i As Long
i = 256 * 256
End Sub
を実行すると
  実行時エラー'6':
  オーバーフローしました。
となるのですが、これは何がいけないのでしょうか。
excel2000(SR-1)
xp(sp1)
491デフォルトの名無しさん:2006/09/18(月) 19:17:58
>>490
VBAヘルプより
>整数型 (Integer) の変数は、16 ビット (2 バイト) の変数で、-32,768 〜 32,767 の範囲の値をとります。
492491:2006/09/18(月) 19:24:49
何を言ってるんだ俺は....スマソ
Clngで回避できるっぽいね..
493デフォルトの名無しさん:2006/09/18(月) 19:34:10
     ζ
    / ̄ ̄ ̄ ̄\
   /         \
  /\   \   /|
  |||||||   (・)  (・) |
  (6-------◯⌒つ|   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  |    _||||||||| |  < 真面目に議論しているフリをしおって!けしからん!
   \ / \_/ /    \________________
     \____/

494デフォルトの名無しさん:2006/09/18(月) 19:35:06
>>492
i = CLng(256 * 256)
としてみましたが、やはり同様のエラーが出ました。(vbaの仕様なんですかね?)
clngで引き続き調べてみます。
ありがとうございました。
495491:2006/09/18(月) 19:38:20
clng(256)*256でおkのはず
496デフォルトの名無しさん:2006/09/18(月) 20:29:33
>>495
おかげさまで出来ました!
なんでこうなのかが今ひとつ分りませんが・・
ありがとうでした。
497デフォルトの名無しさん:2006/09/18(月) 21:23:18
Outlook2002のVBAで下記を実行するとメモリー・リソース不足で
実行時エラーとなります。
Sub test()
Dim myOlSel As Outlook.Selection
Dim o
Set myOlSel = Application.ActiveExplorer.Selection
For Each o In myOlSel
    '何もしなくてもエラーになる
Next
End Sub
Selectionはメールアイテムですが、1000個だと大丈夫ですが、4000個
選ぶとすぐにエラーになります。回避する方法はないでしょうか。
ループの中でSet o=Nothing としても意味ありませんでした。
498デフォルトの名無しさん:2006/09/18(月) 22:40:51
>>497
メモリを増やす
499デフォルトの名無しさん:2006/09/19(火) 00:16:06
>>498
そりゃそうですが、ページファイルはぜんぜん増えないし、そういう
問題ではなさそうです。
ちなみにループしなくても同じでした。
Application.ActiveExplorer.Selection.cout
だけでも固まります。
500デフォルトの名無しさん:2006/09/19(火) 10:29:05
     ζ
    / ̄ ̄ ̄ ̄\
   /         \
  /\   \   /|
  |||||||   (・)  (・) |
  (6-------◯⌒つ|   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  |    _||||||||| |  < 真面目に議論しているフリをしおって!けしからん!
   \ / \_/ /    \________________
     \____/
501デフォルトの名無しさん:2006/09/19(火) 10:29:11
     ζ
    / ̄ ̄ ̄ ̄\
   /         \
  /\   \   /|
  |||||||   (・)  (・) |
  (6-------◯⌒つ|   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  |    _||||||||| |  < 真面目に議論しているフリをしおって!けしからん!
   \ / \_/ /    \________________
     \____/
502デフォルトの名無しさん:2006/09/19(火) 21:37:41
消えろ馬鹿
503デフォルトの名無しさん:2006/09/20(水) 03:37:20
VB厨だからしかたがない
504デフォルトの名無しさん:2006/09/20(水) 17:47:53
命令表が辞書みたいに載っているサイトはありませんでしょうか?
505デフォルトの名無しさん:2006/09/20(水) 18:12:23
>>504
素直にVBAヘルプつかっとけ。
506デフォルトの名無しさん:2006/09/20(水) 19:16:33
すまない、動画キャプチャソフトを作る時、参考になるようなソースって有るかな。
探してはみたつもりなんだが・・
そもそもVBが向いてないとかだったらスマン、無知なんだ('`)
其の場合は言語問わないので参考になるソース見つける際のキーワードとか教えて頂きたいです。

507デフォルトの名無しさん:2006/09/21(木) 01:47:21
Excel 2003 のVBAを使っています。
やりたい事は、変数"myDate月","myDate日" を二桁表示にする事です。

14-19行目をForとかArrayとか使わずに個別に書けば二桁の値が代入されるのですが、
下記の通りやると、18行目は2桁、21,22行目は1桁で表示されます。
Forステートメントの中で変数に値を代入するには、どうしたらよいでしょうか?

1 Sub test()
2
3 Dim myDate As Date
4 Dim myDate年 As String
5 Dim myDate月 As String
6 Dim myDate日 As String
7
8 myDate = "2006/9/1"
9
10 myDate年 = DatePart("yyyy", myDate)
11 myDate月 = DatePart("m", myDate)
12 myDate日 = DatePart("d", myDate)
13
14 For Each i In Array(myDate月, myDate日)
15 If i <= 9 Then
16 i = 0 & i
17 End If
18 MsgBox i
19 Next i
20
21 MsgBox myDate月
22 MsgBox myDate日
23
24 End Sub
508デフォルトの名無しさん:2006/09/21(木) 02:14:38
Dim myfutaketatuki as string

13行目以降に
myfutaketa = Format(myDate月, "00")
Msgbox myfutaketatuki

「日」の分も同じようにやってみて下さい。
509508:2006/09/21(木) 02:16:36
あー変数名間違えた。

myfutaketatuki=Format(myDate月,"00")

です。
510507:2006/09/21(木) 03:07:38
>> 508
出来ました! どもです。
511デフォルトの名無しさん:2006/09/21(木) 15:01:21
Excel2002を使っています。
VBで、Sheet2の値をSheet1にコピーしたのですが、値に計算式が入力
されていたため、計算式を拾ってしまって、値そのものを拾ってくれません。
Worksheets("sheet2").Range("A1").Copy Worksheets("sheet1").Cells(2, 2)

どうすれば値のみを拾ってくれるのでしょうか?
512デフォルトの名無しさん:2006/09/21(木) 16:53:41
>>511
= .value
513デフォルトの名無しさん:2006/09/21(木) 17:55:24
失礼します。質問があります。
例えばB1 N37 K7 L39・・・のようにばらばらに散らばったセルがあるとして、
それらの中のいくつかには背景色がついているとします。
背景色がついているセルの数がN(←いくつでもいいんですが)を超える場合、
ある数Aを1/2にする。っというブログラムはどうやって書けばいいんですか?
誰か教えてくれませんか?
514デフォルトの名無しさん:2006/09/21(木) 17:59:03
>>513
自分でどこまでやったんかを書きましょう。
基本です。
また、「ばらばらに散らばる」という抽象的な表現を使う場合、
ある範囲内に収まるのか(例えばA1〜Z250)か、それとも無制限に散らばっているのか。
その辺りも書くようにしましょう。
515デフォルトの名無しさん:2006/09/21(木) 18:22:48
>>514
説明不足ですみません。
ばらばらに散らばったというのは、ある範囲内に収まるものです。
今のところ次のような状態です。
1 Sub 背景色数()  
2 Dim 背景色の数 As integer
3  Dim 行番号 As integer
4  背景色の数=0
5  行番号=0  
6 For 行番号=1 to 50    
7 If cells(行番号,3).Interior.ColorIndex = 色番号 Then
8      背景色の数 = 背景色の数+1
9    End If
10  Next 行番号
11  If 背景色の数>5 Then
12 range("B1")=a*0.5 
13 End If
14 End Sub
なお、「背景色の数」というのは「背景色のついたセルの数」を
意味しています。さっきいった、ばらばらなセルの場合どのようにすれば
良いのかがわかりません。
516デフォルトの名無しさん:2006/09/21(木) 18:25:19
全部調べるんだよ。
517デフォルトの名無しさん:2006/09/21(木) 19:18:36
決まった位置のセルなら、
dim r, cell as range
set r = range("B1,N37,K7,L39")
for each cell in r
 'ここで背景色のチェックとカウントアップ
next

決まった位置じゃないなら、"B1,N37,K7,L39"の部分をなんとかして文字列で作るか、
rangeオブジェクトを何とかして作れ。
518デフォルトの名無しさん:2006/09/21(木) 19:21:21
背景色赤のセルを選択

Application.FindFormat.Interior.ColorIndex = 3
Cells.Find(What:="", SearchFormat:=True).Activate

コレをヒントにエラー処理して応用汁
519デフォルトの名無しさん:2006/09/21(木) 20:24:15
>>512
レスありがとうございます。
valueのくっつけ方がわからなかったので下のようにやって取得しました。
Worksheets("sheet2").Range("A1").Copy
Worksheets("sheet1").Cells(2, 2).PasteSpecial Paste:=xlPasteValues

今度はセルを別シートに入れると、罫線がくっついて来たり、セルのサイズが
大きくなってしまったりします。どうすればセルはデフォルトのままで値だけを
取得できるのでしょうか?お願いします。
520デフォルトの名無しさん:2006/09/21(木) 20:38:27
worksheets("sheet1").cells(2,2).value = worksheets("sheet2").range("a1").value
521デフォルトの名無しさん:2006/09/21(木) 21:03:15
vba初心者です。簡単な質問ですみません
セルの中で改行されているデータを改行で分けたい場合
どうすればいいですか?
522デフォルトの名無しさん:2006/09/21(木) 21:08:27
>>521
改行で分けた後、それぞれの文字列をどうしたいのだ。
523デフォルトの名無しさん:2006/09/21(木) 21:13:56
変数に入ってればいいです
524デフォルトの名無しさん:2006/09/21(木) 21:20:11
ary = split(range("a1").value, vblf)
for i = 0 to ubound(ary)
debug.print ary(i)
next
525デフォルトの名無しさん:2006/09/21(木) 21:23:26
ありがとうございます!
526デフォルトの名無しさん:2006/09/24(日) 22:12:48
EXCELの関数 =SUM(hogehoge)とかで計算した後に文字をつけたいんですが可能でしょうか?

=SUM(J13:J19)
上記式を入力したセルがあり、表示としては
合計金額####円みたいな感じで実現可能でしょうか?
527デフォルトの名無しさん:2006/09/24(日) 22:22:03
>>526
セルの書式設定の表示形式で、「合計金額 #,##0円」とかする。
528デフォルトの名無しさん:2006/09/24(日) 22:22:45
>>526

=TEXT(SUM(略),"########")&"円"
529デフォルトの名無しさん:2006/09/24(日) 22:30:58
>>528
それだと、合計の合計が取れなくなるけどね。
530デフォルトの名無しさん:2006/09/24(日) 22:44:54
VBA初心者です。
色々自分で検証やプログラムをやろうと思っているのですが、中々参考書も
なくて、困っています。

株で、銘柄を一定の条件を入れてスクリーニングし(例えば過去のPERが
ポートフォリオの中で低かった5%を常にリバランスしていく)、検証する
のって簡単にできそうでしょうか?

よろしくお願いいたします。
また、金融に活かせるプログラムの本や通信講座などありましたら
教えていただけるとありがたいです。

 よろしくお願いいたします!
531デフォルトの名無しさん:2006/09/24(日) 22:47:24
>>529
うむ分かる。が、>>526 の要求の1行目に基づいてみた。複数の解を比較できることになったかな。
532デフォルトの名無しさん:2006/09/24(日) 23:37:06
特定のセルを選択出来なくするには、VBAでどんな書き方をすればよいですか?
533デフォルトの名無しさん:2006/09/25(月) 00:13:47
>>532
SelectionChangeが起きたときに、はじけばいいんじゃね?
534デフォルトの名無しさん:2006/09/25(月) 00:24:09
>>532
シートの特定部分だけを選択できるようにするのが一般的だと思うけど、その逆だね。

with worksheet("sheet1")
.cells.locked = false
.range("B3:C5").locked = true
.protect
end with
535523:2006/09/25(月) 00:25:25
すみません、まだ触りはじめて間もないので「はじく」やりかたがわかりません。

面倒でなければA1のセルを選択不可にするロジックを書いていただけないでしょうか?
536デフォルトの名無しさん:2006/09/25(月) 00:30:35
"B3:C5" -> "A1"
537532:2006/09/25(月) 08:11:02
ありがとうございました。
lockですね?ソースを参考にもっと詳しく調べてみます。
538デフォルトの名無しさん:2006/09/25(月) 10:32:05
VBA からあるファイルを関連付けアプリで起動したく、
Shell("cmd.exe /c start filename", vbNormalFocus)
のような形で書いており、うまく動作しております。l

これを Win98 系でも動作するように、
Shell("%ComSpec% /c start filename", vbNormalFocus)
と書き換えたのですが、(%ComSpec% の部分で)「ファイルが見つかりません」という
エラーが出て動作しませんでした。

%ComSpec% という、環境変数は Shell 関数の中では使えないのでしょうか?
また、上記の動作を WinNT 系と Win98 系両方で実現するにはどのような方法が
ありますでしょうか?
539デフォルトの名無しさん:2006/09/25(月) 12:52:02
>>538
普通にAPI使えば、同じコードでどっちでもいけるだろ。
540デフォルトの名無しさん:2006/09/28(木) 18:15:58
すみません、煮詰まってしまったので質問させて下さい

2つの時間の時間差を格納したセルがあり、書式に"[hh]:mm:ss"を使用しています
この表示されている時間を文字列にしてMsgbox上で使いたいのですが、変換が思うように行きません

DatePartあたりで時・分・秒あたりを分割してから文字列として連結すれば良さそうなのですが
時の部分が24時間を越える事があるため上手く変換できません
上手い方法が何かあるでしょうか?

そのままmsgboxに流し込むと
28:31:29 が 1899/12/31 4:31:29 のようになるので

DatePart("d", time) - 30) * 24 + DatePart("h", interval(1)

と、やってみましたが、これは何か間違ってる気がしてなりません
時間の起点が1900/1/1/00:00:00なのかな……
541デフォルトの名無しさん:2006/09/28(木) 18:17:12
ああ、間違えた
DatePart("d", time) - 30) * 24 + DatePart("h", time)

こんな感じです
542デフォルトの名無しさん:2006/09/28(木) 18:29:00
>>540
表示幅が十分にあるなら(####にならないなら)、msgbox range("a1").text
543デフォルトの名無しさん:2006/09/28(木) 18:32:07
>>542
凄く……スマートです……

大感謝!
544デフォルトの名無しさん:2006/09/28(木) 22:03:35
くだらんw
545デフォルトの名無しさん:2006/09/28(木) 22:45:00
pdfファイルを直接に取り込むことは出来ませんか?
いろいろな方法を試してみたのですがわかりませんでした。

とりあえず現在は一度テキストファイルに変換して、それを
ワードで保存し直してエクセルで開くとなんとか取り込める
事が出来ます。
VBAのスキルが無いためワードでの保存までは手動でやってます。
何かほかに良い方法は無いでしょうか?
546デフォルトの名無しさん:2006/09/29(金) 01:18:01
俺の環境では、参照設定に、
Adobe Acrobat 7.0 Type Libaryというそれらしきものがあるんだ。
これ使えないかな?
547デフォルトの名無しさん:2006/09/29(金) 13:17:39
548デフォルトの名無しさん:2006/09/30(土) 11:27:05
Windows XP Pro でExcel2003を使用しています。
下記のことを行うのはVBAで可能でしょうか。

**シート1***
A1  A2  A3
aaa XXX ccc
abc YY efg
********
**シート2***
A1  A2
XXX YY
001 00
002 25
003 50
*****
とあって、シート1のXXX,YYをシート2から反映させ
テキストファイルにそれぞれ
test001
test002
・・・
と出力させる。
test001のテキストファイルの内容はaaa001ccc
abc01efg
となっている状態。
宜しくお願いします。
549デフォルトの名無しさん:2006/09/30(土) 11:32:26
>>548
可能。
550デフォルトの名無しさん:2006/09/30(土) 11:35:45
>>548
不明瞭な点は多いが、とりあえず可能だよ。

まさかそんな曖昧な情報しか出さずに丸投げなんてする気じゃないと思うが
とりあえず、自分で出来るところまでコードを書いて、それをここに貼り
その上で何処が解らないのかをはっきりさせよう。
551548:2006/09/30(土) 11:39:00
>>549,550
ありがとうございます。
とりあえず可能かしりたかったので。
またコードを記述してみて質問させてもらうかもしれませんが
宜しくお願いします。
イメージ的にはテキストファイルのある一定の文字列のみ置換した形で複数の
ファイル(ファイル名も異なる)を自動生成する感じです。
552549:2006/09/30(土) 11:42:09
別に丸投げしてもかまわないよ。
仕様がはっきりしてりゃ誰か解くかもしれないし、無視するかもしれない。
ただそれだけのこと。
553デフォルトの名無しさん:2006/09/30(土) 17:47:22
>>552
取りあえず解かないなら邪魔だから消えてくれ。
554549:2006/09/30(土) 21:10:52
誰かには当然俺も入っているのだが何か?
555デフォルトの名無しさん:2006/09/30(土) 21:29:23
丸投げでいいじゃん。下手なコード晒されても読めないし、全部自分で書いたほうが楽。
556デフォルトの名無しさん:2006/09/30(土) 22:28:31
その通り。
ここは学校じゃないんだからやりとりは短くして欲しい。
わけわかってない人が書いた拙劣なコードなんて貼るだけ無駄。
わかってる人が良いコードを示し、それを理解することが大事。
557デフォルトの名無しさん:2006/09/30(土) 23:07:03
それ言っちゃ元も子も無いな
じゃあおまえが全部やってやれや
558デフォルトの名無しさん:2006/09/30(土) 23:09:25
>>557
ハァ?
559デフォルトの名無しさん:2006/09/30(土) 23:14:51
>>556
コードかいてもらったほうが
何をしたいのかが分かるし、答える方が簡単
ここが間違ってるよって感じで
560デフォルトの名無しさん:2006/09/30(土) 23:17:19
>>559
お前がそうしたければ、そのように誘導しろ
561デフォルトの名無しさん:2006/09/30(土) 23:19:56
まあ大体はコードが出ても「で、何をしたいんですか」となるわけだが。
562548:2006/10/01(日) 00:03:02
WindowsXP pro Excel2003を使用しています548です。
シート1のB1の値をシート2のA2の値(A2から下の値)に入れ替えて
複数のファイルとしてファイル名を付けて保存したいのですが、
Stringへの値のいれかたがまずいのかエラー400が返ってきます。
ご教授宜しくお願いします。
563548:2006/10/01(日) 00:03:47
Sub ファイル自動生成()
Dim XXXGYO_1 As Long
Dim XXXCOL_1 As Long
Dim XXXGYO_2 As Long
Dim XXXCOL_2 As Long
Dim FILENAME As String ' 保存するファイル名
Dim FILENAME2 As String ' 保存するファイル名付与
Dim YYYGYO As Long ' FILENAME2に入るValueのセル位置
Dim YYYCOL As Long ' FILENAME2に入るValueのセル位置
Dim OWARI As Long ' ループ回数制御
564548:2006/10/01(日) 00:04:23

XXXGYO_1 = 1: XXXCOL_1 = 2 ' Sheet1XXXセル位置
XXXGYO_2 = 2: XXXCOL_2 = 1 ' Shttt2XXXセル位置
YYYGYO = 2
YYYCOL = 2
OWARI = 1
565548:2006/10/01(日) 00:04:56
Do While OWARI < 9

Sheets("Sheet2").Select
With Worksheets("Sheet2")
FILENAME2 = .Cells(YYYGYO, YYYCOL).Value
End With
566548:2006/10/01(日) 00:07:01

Sheets("Sheet2").Select
With Worksheets("Sheet2")

.Cells(XXXGYO_2, XXXCOL_2).Select
Selection.Copy

End With

Sheets("Sheet1").Select
With Worksheets("Sheet1")

.Cells(XXXGYO_1, XXXCOL_1).Select
ActiveSheet.Paste
Application.CutCopyMode = False ' コピーモード解除

End With

FILENAME = "C:\Documents and Settings\testUser\デスクトップ\自動生成\test_" + FILENAME2 + ".xls"

ActiveWorkbook.SaveAs FILENAME:= _
strFILENAME, FileFormat:= _
xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _
, CreateBackup:=False

XXXGYO_2 = XXXGYO_2 + 1
YYYGYO = YYYGYO + 1
OWARI = OWARI + 1
Loop
End Sub
567548:2006/10/01(日) 01:24:03
わかりにくいですね、すいません。
やりたいことは「新しいファイル名で保存する際、ファイル名(フルパス)を
変数にはいっている値を入れたい」ということです。
不安な点は下記になります。お願いします。
Dim FILENAME As String 'フルパスを格納
Dim FILENAME2 As String 'ファイル名に付与する変数
Dim XXXGYO_2 As Long 'FILENAME2に入れる値の位置格納
Dim XXXCOL_2 As Long 'FILENAME2に入れる値の位置格納
・・・
Sheets("Sheet2").Select
With Worksheets("Sheet2")
FILENAME2=Cells(XXXGYO_2,XXXCOL_2).Value
・・・
FILENAME="C:\DocumentAndSetting\・・・"+FILENAME2+".xls"
ActiveWorkbook.SaveAs FILENAME:= _
strFILENAME, FileFormat:= _
xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _
, CreateBackup:=False
568デフォルトの名無しさん:2006/10/01(日) 12:04:34
さてと・・・
何だかよくわからないけど、こんなサンプルコードを書いてみた。

Dim r1, r2 As Range
Dim i As Long

Set r1 = Range("Sheet1!A1")
Set r2 = Range("Sheet2!A1")

For i = 1 To r2.CurrentRegion.Rows.Count - 1
    Debug.Print r1.Value + r2.Offset(i, 0).Value + r1.Offset(0, 2).Value
    Debug.Print r1.Offset(1, 0).Value + r2.Offset(i, 1).Value + r1.Offset(1, 2).Value
Next
569デフォルトの名無しさん:2006/10/01(日) 12:07:20
>>559
何か言いたいことがあったらどうぞ。
570デフォルトの名無しさん:2006/10/01(日) 13:30:58
>>568
Dim r1, r2 As Rangeってのは
Dim r1 As Range,r2 As Rangeと同じ?
571デフォルトの名無しさん:2006/10/01(日) 13:33:55
r1はVariant扱いだね
572デフォルトの名無しさん:2006/10/01(日) 13:36:03
Dim r1 ってのはr1をvariant型の変数として定義ってこと?
As Variant は略せるってこと?
573デフォルトの名無しさん:2006/10/01(日) 13:49:01
オレ、零細企業の単なる事務員ながらVBAを一生懸命覚えてるけど、
ここで回答してる人たちってけっこう詳しくて関心してしまいます。
ここで回答してる人たちって、IT系の職種で仕事してるの?
574デフォルトの名無しさん:2006/10/01(日) 13:58:51
>>572
です

>>573
どうなんだろう?
時々凄い人も降臨するけど俺もあなたと似たようなもん
ワークシート関数で物足りなくなってVBAはじめたクチだよ
そんな感じの人も結構多いんじゃないかな
575デフォルトの名無しさん:2006/10/01(日) 14:02:40
>>574
ありがとうございます。
そういう豆知識でも覚えるとすごくうれしいです。

事務員やってると、いつ会社の都合で他の職種に回されるか
わからない不安があるので、できればIT系の職種にでも
つきたいな〜って思うのですが、難しいですかね?
576デフォルトの名無しさん:2006/10/01(日) 15:27:14
>>570
あー、そうだね忘れてた。
dim r1 as range
dim r2 as range
ってことで。
577デフォルトの名無しさん:2006/10/01(日) 15:58:09
>>575
> 事務員やってると、いつ会社の都合で他の職種に回されるか
> わからない不安があるので、できればIT系の職種にでも
> つきたいな〜って思うのですが、難しいですかね?

若くて(25歳以下)それなりの学歴(大卒以上)があれば、会社を選ばなければ転職できるでしょう。
どちらも無い場合は、卓越した業務知識か何らかの資格があれば、それを必要としている
ところにひっかかるかも。
いわゆる「イイトコ」にいきなり入るのはまず無理。
578デフォルトの名無しさん:2006/10/01(日) 18:16:05
やっぱり丸投げしてもらったほうがいいね。
579デフォルトの名無しさん:2006/10/01(日) 19:07:10
「凄い人」なんていたか?
580デフォルトの名無しさん:2006/10/02(月) 13:47:32
へんなやつばっかw
581構造体をプロシージャへ渡す:2006/10/03(火) 14:41:50
構造体を別プロシージャに渡したたいのですが、
下記のエラーメッセージがでます。

「パブリックオブジェクトモジュールで定義されたユーザー定義型に限り、
変数に割り当てることができ、実行時バインディングの関数を渡すことができます」

これは何が原因なんでしょう?
普通にグローバル変数を定義する感じでは
使えないんでしょうか?????

'構造体の宣言--------------------------
Public Type Record
  seibetu As String
  name As String
End Type

'呼び出し元------------------------------
Sub aa()
 Dim k_Record() As Record
 ReDim k_Record(1)
 k_Record(0).seibetu = "男"
 k_Record(0).name = "tamori"
 bb (k_Record)
 End Sub

'呼び出し先-------------------------------
Sub bb(k_Record)
    MsgBox k_Record.name
End Sub
582デフォルトの名無しさん:2006/10/03(火) 14:48:09
>>581
Class使え
583デフォルトの名無しさん:2006/10/03(火) 15:27:50
>581
変数をSubプロシージャの外で宣言して、モジュールレベルの変数として扱えばいいんじゃね?
584デフォルトの名無しさん:2006/10/03(火) 15:28:11
あんまりVBAわからないのに、急にやれと言われて困ってます。
マジで教えてください<(_ _)>

やりたいこと。
エクセルのワークシートの、1〜k(変数)行までを削除して、
k+1の行を 一番上にもってきたい。これをVBAで書きたい。
kはユーザーフォームのtextbox1に代入すると反映されるようにしたい。

で、初心者が作ってみた、VBAのコードなですけど、
どうか正しい書き方を教えてください。


Sub 日数変更()
UserForm1.Show
End Sub


Private Sub CommandButton1_Click()

Dim 行番号 As Integer
行番号 = TextBox1.Value

Rows("6:行番号").Select      ←「型が一致しません」とでます。
Selection.Delete Shift:=xlUp
End Sub


以上です。マジお願いします!
585デフォルトの名無しさん:2006/10/03(火) 15:41:05
Range(Rows(6), Rows(行番号)).Delete
Rows("6:" & 行番号).Delete
Rows(6).Resize(行番号 - 6 + 1).Delete
586デフォルトの名無しさん:2006/10/03(火) 15:50:56
すいません、584です。
実は、6行目からk行目までを削除して、k+1行目を6行目に
もってきたいんですけど、その場合はどうすればよいですか?

ちなみに、本当は、テキストボックスに1を入れると、6行目の1行が
テキストボックスに10を入れれば、6行目から15行目までが
消えるようにできれば、本望です。

たびたび、すいませんが、教えて下さい<(_ _)>
587デフォルトの名無しさん:2006/10/03(火) 15:53:10
584です。

>実は、6行目からk行目までを削除して、k+1行目を6行目に
もってきたいんですけど、その場合はどうすればよいですか?

ここは、無視して下さいw

先ほど指摘してもらった場合でやってみると、
テキストボックスに1など入れるとエラーになってしまいます。
588デフォルトの名無しさん:2006/10/03(火) 15:57:40
でキター!

ありがとうございました。できました!!!お世話になりました<(_ _)>


Private Sub CommandButton1_Click()

Dim 行番号 As Integer
行番号 = TextBox1.Value

Range(Rows(6), Rows(行番号)).Select
Selection.Delete Shift:=xlUp
End Sub
589デフォルトの名無しさん:2006/10/03(火) 17:39:16
>>588
Private Sub CommandButton1_Click()
Range("6:" & TextBox1.Value + 5).Delete
End Sub

ちゃんと書けば
Private Sub CommandButton1_Click()
If Val(TextBox1.Value) > 0 Then Range("6:" & Int(TextBox1.Value) + 5).Delete
End Sub
590デフォルトの名無しさん:2006/10/03(火) 21:09:07
>>588
selectしなくても出来ることは、selectせずにやった方がいいよ。
アクティブセルの位置が変わらないから。
591デフォルトの名無しさん:2006/10/03(火) 21:45:12
すいません、584です。みなさんいろいろありがとうございます!
申し訳ないですが、もう1つ見てもらいたいです<(_ _)>


Private Sub CommandButton1_Click()

Dim 日数 As Integer
日数 = TextBox1.Value
Dim f As CellFormat
Range(Cells(f, 日数)).Select  ←ここで『型が一致しません』がでます。
ActiveCell.FormulaR1C1 = "=(SUM(R[-日数+1]C[-1]:RC[-1])+RC[-1])/(日数+1)"
Range(Cells(f, 日数)).Select
Selection.AutoFill Destination:=Range(Cells(f, 日数), Cells(f, 750)), Type:=xlFillDefault
Range(Cells(f, 日数), Cells(f, 750)).Select
ActiveWindow.ScrollRow = 739
省略
ActiveWindow.ScrollRow = 1
Range("G26").Select
End Sub

FはワークシートのFとして使ったつもりが、変数を定義してくださいと
言われたので、dim F as cellformat にしました。だけど、
次の式で、型が一致しませんと出てしまい、よくわからない状態です。お願いします。
592デフォルトの名無しさん:2006/10/03(火) 23:02:59
>>591
>Dim f As CellFormat
Dim f As String
でやってみたら?ExcelのVBA知らんけど。
593デフォルトの名無しさん:2006/10/03(火) 23:06:18
>592
回答ありがとうございます。
それなんですが、自分もやってみたんですけど、同じように
エラーが出ちゃったんです・・・ orz
594デフォルトの名無しさん:2006/10/03(火) 23:41:08
>FはワークシートのF
の意味もわからんが、その上Cellsの行と列が反対なんじゃね?
595デフォルトの名無しさん:2006/10/03(火) 23:58:55
>>559
何か言いたいことがあったらどうぞ。
596デフォルトの名無しさん:2006/10/04(水) 00:06:07
>>591
やりたいこと(仕様)をきっちり書いてくれ。
597デフォルトの名無しさん:2006/10/04(水) 00:06:53
Dim 数値 As Integer
数値 = TextBox1.Value
Dim f As cellformat

で、(f行、数値)のセルを選択したいんです。

Range("f数値").Select じゃ、エラーになるので、
正しい方法わかる方、是非教えてください(>_<)
598デフォルトの名無しさん:2006/10/04(水) 00:10:42
「f行」とは何だ?
599エスパー登場:2006/10/04(水) 00:21:16
fを数字の6に置き換えて、行と列が正しいかチェックする。
600デフォルトの名無しさん:2006/10/04(水) 00:32:11
なんか書いてることわかりにくくてごめんなさい。
>598
セル(F数値)を選択したいのです。例えば、セル(F5)とかです。
601エスパー登場:2006/10/04(水) 00:38:28
AとかBとかFというのは「列」だ。
そしてセルを指定する時の()内は、(行, 列)で指定する。
F5なら(5, 6)だ。
602デフォルトの名無しさん:2006/10/04(水) 00:39:56
>>600
いや、君は謝る必要はない。
すべては >>559 の能力が足らないのが原因だ。
603デフォルトの名無しさん:2006/10/04(水) 00:42:06
日本語でやりたいことを書いて、丸投げしてくれよ・・・
604デフォルトの名無しさん:2006/10/04(水) 00:58:18
わかりました。丸投げさせていただきます(>_<)


エクセルの列Aに750行まで数値が入ってます。
(為替とかだと思ってください。)
そして、セル【B12】に、以下の式を打ちます。
=(sum(A1:A12)+A12)/13
この計算式を750行まで引っ張って完了です。

基本はこれなんですけど、ホントにやりたいことは
最初のセル(さっきは、B12)を、B20くらいにして
そこに打ちこむ式を
=(sum(A○:A20)+A20)/(20-○+1 +1 )   ※ ○は変数
こうしたいんです。
もし、○=10ならば
=(sum(A10:A20)+A20)/(20-10+1+1)
=(sum(A10:A20)+A20)/12
そして、これを750行まで引っ張れば完成です。

やりたいのはこれなんですけど、○を、
ユーザーフォームのテキストボックスを使って
代入できる形にしたいんです。

もしこんなん簡単だよって神様がいらっしゃったら
お手数ですが、なにとぞよろしくお願いします(>_<)
605デフォルトの名無しさん:2006/10/04(水) 01:19:57
丸投げしてないじゃん。ブックのうpはまだ?
丸投げってのは、ブックのうpを含めてだよ。
やりたいことも、それを実現したいブックも、全部投げてよこしてこそ丸投げ。
606デフォルトの名無しさん:2006/10/04(水) 01:40:44
>>604
○が10のときの「A20の20」は一体どこから出てくるのだ?
>=(sum(A1:A12)+A12)/13
と整合性がとれてないぞ。

ヒントは下のコード。
Cells(日数, 2).FormulaR1C1 = "=(SUM(R[" & -日数 + 1 & "]C[-1]:RC[-1])+RC[-1])/(" & 日数 + 1 & ")"
変数を計算した結果で文字列を組み立てて、それをformulaとして設定すればいい。
あとは仕様にあわせて修正すべし。
607デフォルトの名無しさん:2006/10/04(水) 01:51:00
あ、そうそう、複数セルにformulaを設定するのは、autofillを使わなくても
range(cells(1,2), cells(5,2)) = "=sum(..."
とかすればいいから。
608デフォルトの名無しさん:2006/10/04(水) 01:51:48
そもそも式の書き込みは本当に関数の式がいいのか?
どうせVBAで処理するならいっそのこと計算までして値を代入した方がいいんじゃないか?
まあ、既存のセルの値が変化しない事が前提だが
609デフォルトの名無しさん:2006/10/04(水) 01:52:23
間違えた。
range(cells(1,2), cells(5,2)).formular1c1 = "=sum(..."
610デフォルトの名無しさん:2006/10/04(水) 01:54:48
>>608
式じゃないといけない場合でも、動的に式を設定するのではなくて、
例えば全然関係ないH1とかにtextboxで入力した値を設定するという前提で、
"$H$1"を使った式をあらかじめ設定しておくという手もあるね。
611デフォルトの名無しさん:2006/10/04(水) 01:58:40
つまり、要求仕様(本当にやりたいこと)を説明しなさいってこったな。
612デフォルトの名無しさん:2006/10/04(水) 08:23:19
ユーザーフォームでテキストボックスとコマンドボタンを使ってdirの指定をしたいのですが、
よくアプリケーションをインストーすする際にdirの指定が参照ボタンを押すと出てきたりしますよね。
それを利用して、[参照]のコマンドボタンを押して、
場所を指定するとそれがテキストボックスに反映されるようにしたいのですが、
どなたか教えていただけませんか?
613デフォルトの名無しさん:2006/10/04(水) 09:29:06
Common DialogではなくBrowseForFolderの方か?
どっちにしても、上の語句でググればいくらでも情報ころがってるぞ。
Common Dialogの方ならExcel.Applicationからも呼べるし。
614デフォルトの名無しさん:2006/10/04(水) 10:06:08
Excel2002で次の文字列処理をするコーディングを教えて下さい。

あるセルに

>>ddd日

という文字列があるかどうか判定し、
あればdddだけを取り出す。dddは小数点を含む任意桁数の数字です。
615デフォルトの名無しさん:2006/10/04(水) 10:12:42
>>614
正規表現で m/(\d+\.?\d*)日/
616デフォルトの名無しさん:2006/10/04(水) 11:19:40
>>614
VBAでなくて関数だとこんなの。

IF(RIGHT(A1) = "日",LEFT(A3,LEN(A1)-1),A1)
617616:2006/10/04(水) 11:20:37
まちがったorz

IF(RIGHT(A1) = "日",LEFT(A1,LEN(A1)-1),A1)
618デフォルトの名無しさん:2006/10/04(水) 11:54:55
ここ、ExcelスレではなくてVBAスレ。ついでに言うと
A1=水曜日
で、「水曜」が返っちゃうので、条件を満たしてない。
> dddは小数点を含む任意桁数の数字

あ、別に直して書き込まなくていいからね。
619デフォルトの名無しさん:2006/10/04(水) 12:16:45
584です。
>606
マジありがとうございます。
Cells(日数, 2).FormulaR1C1 = "=(SUM(R[" & -日数 + 1 & "]C[-1]:RC[-1])+RC[-1])/(" & 日数 + 1 & ")"
のヒントで、かなり進みました!!ちょっといじって、変えてみます!
620612:2006/10/04(水) 12:26:09
>>613

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

もっと勉強して、出直してきます。
621デフォルトの名無しさん:2006/10/04(水) 14:15:33
>614
Right$(Range("A1").Text, 1) = "日" And IsNumeric(Left$(Range("A1").Text, Len(Range("A1").Text) - 1))
で判断。
処理内容によるが、変数に代入するなりすればスッキリするはず
622デフォルトの名無しさん:2006/10/04(水) 14:49:04
すんません、excelスレに行くべきか悩んだんですが……

・コマンドボタンをセル上に配置する
・配置したコマンドボタンは隣接したセルと一緒にソートされて配置が入れ替わる ←ここまでは出来た

ここから、ソートされて位置が常時変更になる特定セルの値をVBAから参照したいんですが
何か方法はありますでしょうか?

コマンドボタンにLinkedCellがあれば楽なんですが……
623622:2006/10/04(水) 14:58:46
すみません、一応自己解決しました

ワークシート上で固定の別セルから参照すれば、並べ替えても参照が切れないので
そっちをVBAから参照すればとりあえず解決できるようです

ただ、もし他の方法があればご指摘頂ければ幸いです
624デフォルトの名無しさん:2006/10/04(水) 15:12:26
>622
ActiveSheet.Shapes("Button 1").TopLeftCell.Column
ActiveSheet.Shapes("Button 1").TopLeftCell.Row
じゃダメ?
625622:2006/10/04(水) 15:24:03
>>624
ありがとうございます
ブレークポイント置いてローカル変数参照した所
確かにそこにボタン位置のセルの場所が格納されてました

今後別セルに参照を置けない場合もそれで大丈夫そうです
626デフォルトの名無しさん:2006/10/05(木) 13:35:17
ユーザー定義型で

Private Type typREC
CODE As String * 5 ' コード
MAKER As String * 10 ' メーカー
End Type

っていう記述を見つけたんですが、
ここで「 * 5」や「 * 10」は
なんの数値を宣言してるんでしょう??
627デフォルトの名無しさん:2006/10/05(木) 13:58:10
固定長テキストの文字数
628デフォルトの名無しさん:2006/10/05(木) 16:28:34
どなたか、教えてください。

ActiveSheet.Buttons.Add(XXX, YYY, HHH, VVV).Select

で、ボタンを追加するのですが、そのときに「Button 1」と名称がついているようですが、
その名称を取得もしくは、任意に名づけたいのですが、どう書けばいいのでしょうか?

Selection.Characters.Text = "HOGEHOGE"

と、テキストを変えるのではなく、ボタンそのもののオブジェクト名?を変えたいのですがわかりません。。。

お願いします。
629デフォルトの名無しさん:2006/10/05(木) 19:00:28
>>628
caption
630614:2006/10/05(木) 19:42:07
>>みなさん
ありがとうございます。

>>615
”日”の部分をセル参照にするには、どう書けば良いのでしょうか。
あと、正規表現をベタでセルに書いてOKなのでしょうか。
631デフォルトの名無しさん:2006/10/05(木) 19:54:34
XPsp1、Excel2002です。

ScreenUpdatingをFalseにして、
VBAの長時間処理をしている時にExcelにイベントを
発生させるような事象(※)を発生させると、ストールします。
有効な対策があれば教えて下さい。
処理の中ではWebクエリを使った外部データの取り込みも
しています。
※ ・スクリーンセイバーの起動
  ・他のAPのウィンドウを開く
  ・Excelのウィンドウ閉じるボタンの上にマウスを持って行く
   等

632デフォルトの名無しさん:2006/10/05(木) 19:58:29
>>630
> ”日”の部分をセル参照にするには、どう書けば良いのでしょうか。
普通に。

> あと、正規表現をベタでセルに書いてOKなのでしょうか。
OKなわけない。
VBAで正規表現を使う方法を調べて、それに従え。
633628:2006/10/06(金) 06:57:31
>>629
早速ありがとうございます。

captionですか...
captionを使うとすると、そのボタンをSelectしたいときは、どのようにしたらいいのでしょうか?

ActiveSheet.Shapes("Button 1").Select

ボタンの選択方法を↑しか知らないので、しつこいようですが教えてください。
634628:2006/10/06(金) 07:03:21
追記です。

ボタンはそのたびに追加されていくので、

ActiveSheet.Shapes("Button 1").Select

の"Button 1"は、常に変化します。
なので、Addされた時点で、名前を取得するか、定義したいのですが。。。
635デフォルトの名無しさん:2006/10/06(金) 08:21:07
VBAの
構文、データ型、演算子、命令、
オブジェクト・メソッド・プロパティ・関数等の一覧等を
体系的に説明した書籍があれば、教えて下さい。
636デフォルトの名無しさん:2006/10/06(金) 08:37:31
>>628,633-634
ActiveSheet.Buttons.Add(XXX, YYY, HHH, VVV).Select
が出来て、なんでオブジェクトの名前を取得・変更する方法が解らないのかが不思議だ。

このコードは
ActiveSheet.Buttons.Add(XXX, YYY, HHH, VVV)
が返したボタンオブジェクトに対して「Select」という命令を実行してるんだろ。だったら同じく
ActiveSheet.Buttons.Add(XXX, YYY, HHH, VVV)
が返したボタンオブジェクトに対して「= Nme」で名前を取得したり
「Name = "任意名"」で名前を変更すればいいだけの話じゃん。
Selectしたけりゃ、その後いくらでもShapes("任意名or取得名")をSelectすりゃいいしWithで処理しても構わない。
逆にSelectしてあるなら、「= Selection.Name」や「Selection.Name = "任意名"」で名前の取得・変更可能だし。


>>635
「VBAの」ということであれば、VB6の書籍や解説サイトを探せば事足りる。
「Excelオブジェクト(App,Book,Sheet,Shapes等)の」ということであれば、VBAヘルプを見れば事足りる。
637628:2006/10/06(金) 09:39:43
>>636

根本的なことを勉強せずに、上辺だけでVBAを使っているので、
しっかり勉強された方には、それがなぜわからないのかが理解できない。。。
ごもっともです。反省します。。。

「Selection.Name = "任意名"」

で、解決いたしました。
大変感謝いたします。ありがとうございました。
638デフォルトの名無しさん:2006/10/06(金) 16:17:22
A1:J1のデータを使って、B3:I18の領域に、折れ線グラフを書きたいの
ですが、実行時エラー91(オブジェクト変数またはWithブロック変数が
設定されていません。)になります。どこが不味いのでしょうか。
なお、判例と項目軸は非表示です。

Dim dataRg As Range
Set dataRg = Range("A1:J1")
Dim graphRg As Range
Set graphRg = Range("B3:I18")
Sheets("GWORK").Select
ActiveSheet.ChartObjects.Add graphRg.Left, graphRg.Top, graphRg.Width, graphRg.Height
With ActiveChart
.HasTitle = False
.Axes(xlCategory, xlPrimary).HasTitle = False
.Axes(xlValue, xlPrimary).HasTitle = False
End With
ActiveChart.SetSourceData dataRg, xlRows
ActiveChart.ChartType = xlLine
ActiveChart.Legend.Select
Selection.Delete
ActiveChart.Axes(xlCategory).Select
Selection.Delete
639デフォルトの名無しさん:2006/10/06(金) 23:33:37
すいません、初心者の質問に答えてください。

Range("A3:E3").Select
Selection.Copy
Range("G3").Select
ActiveSheet.Paste

これで、もしも、G3に値があったら、G3ではなくG4に、
さらに、もしG4にも値が入っていたら、G5に・・・G6、G7・・・
と言う感じで、貼り付けたいんですが
これってどのように書けばよいか教えてください(>_<)

640デフォルトの名無しさん:2006/10/07(土) 00:25:59
Range("G3").Select
 ↓
Range("G65536").End(xlUp).Offset(1).Select
641デフォルトの名無しさん:2006/10/07(土) 01:37:02
>640
ありがとうございました!!<(_ _)>
642デフォルトの名無しさん:2006/10/07(土) 03:54:51
>638
Activeうんちゃらはエラーの元というのは置いておき、動く書き方はこう。

Dim dataRg As Range, graphRg As Range

Set dataRg = ActiveSheet.Range("A1:J1")
Set graphRg = ActiveSheet.Range("B3:I18")

Sheets("GWORK").Select
With ActiveSheet.ChartObjects.Add(graphRg.Left, graphRg.Top, graphRg.Width, graphRg.Height).Chart
.SetSourceData Source:=dataRg, PlotBy:=xlRows
.ChartType = xlLine
.HasTitle = False
.Axes(xlCategory, xlPrimary).HasTitle = False
.Axes(xlValue, xlPrimary).HasTitle = False
.HasLegend = False
.HasAxis(xlCategory, xlPrimary) = False
End With

凡例とX軸は無いものとしてあるから念のため。
ちなみにデータのあるシートをアクティブにしてから実行しないと中身が出てこない。

で、元のソースでなぜうまくいかないかというと、
ChartObjects.Addメソッドでチャートがアクティブにならないから。
With ActiveChart
のところにブレークポイントを置いてみればわかるでしょ。
643デフォルトの名無しさん:2006/10/07(土) 04:36:34
テーブルやセルの
名前でアクセスするには、どうしたらよいでしょう?
Excel2007です
644デフォルトの名無しさん:2006/10/07(土) 05:25:11
>>643
ヘルプに書いてある。


つーか、質問スレでVistaだのOfice2007だのと恥ずかしげも無く
堂々と書いてる子を見ると思うわけよ、無知な上に恥知らずってのは怖いなぁ、とw
β版使っていながら他人に質問するなんて、普通は恥ずかしくて出来ない。
しかもその内容が、前バージョンと違いがある部分ですら無いなんて、、、
645638:2006/10/07(土) 07:36:46
>>642
どうもありがとうございました。
646デフォルトの名無しさん:2006/10/07(土) 10:46:25
シートにボタンを貼り付けて、クリック時の処理を記述したのですが
ボタンがクリックできる状態になりません。
ボタンの上にカーソルを持っていくと十字マーク(ボタン移動可能な
マーク)になります。
何か操作が足りないのだと思いますが、どうすれば良いのでしょうか。

647デフォルトの名無しさん:2006/10/07(土) 11:08:17
>>646
ボタンに割り当てたマクロを
ツール > マクロ > マクロ
から直接指定しましょう。
648646:2006/10/07(土) 11:16:12
>>647
ありがとうございます。
Bookのクローズ、オープンでクリックできるようになりました。
元の原因は分かりませんが。
649デフォルトの名無しさん:2006/10/07(土) 16:13:56
>>644
ヘルプに見てもわかんないんですよ。
hoge.moge
でアクセスできないんですよ。


あと、βだから質問できないなんて、どういう理論ですかい。
世の中で公開されているソフトの多く(9割り)は、β版、α版のソフトという統計はご存知?
恥ずかしいのはどっちでしょうかね?
650デフォルトの名無しさん:2006/10/07(土) 17:03:32
>>649
例えばrange("range_name").selectとかいう話?
651デフォルトの名無しさん:2006/10/07(土) 17:07:13
>>649
後半部分は、おまえさんの言うとおりだからもう煽るな。
652デフォルトの名無しさん:2006/10/07(土) 17:38:15
>>648
デザインモード
653デフォルトの名無しさん:2006/10/07(土) 20:01:43
αβは自己責任
安定版があるのにそれを使おうとしないなんて理解しかねる
どんな先進の機能がついててもそれを使えないようじゃ、不安定要因が増すだけ

でも、質問しちゃいけないとは思わないけどね
回答が帰って来る可能性が減るだけ、そこもやっぱり自己責任
654デフォルトの名無しさん:2006/10/07(土) 20:15:53
>>653
プログラマの発言とは思えんな。
655デフォルトの名無しさん:2006/10/07(土) 20:18:44
VBAなんだし本職でこれやってる人だけって事はないしょ
つかありえないし
656デフォルトの名無しさん:2006/10/07(土) 20:23:49
>>653
うざいぞ。質問する気も答える気もないなら、去れ。
658デフォルトの名無しさん:2006/10/07(土) 20:34:24
>>644
> つーか、質問スレでVistaだのOfice2007だのと恥ずかしげも無く
> 堂々と書いてる子を見ると思うわけよ、無知な上に恥知らずってのは怖いなぁ、とw
> β版使っていながら他人に質問するなんて、普通は恥ずかしくて出来ない。

恥ずかしげも無く、よくこんなこと書けるなぁwwwwww
659デフォルトの名無しさん:2006/10/07(土) 20:36:17
>>644 はアレだけどな
>>653 は業務で回してる人間ならこういう発想になると思うが

まぁ、何が言いたいかと言うと下らん論議はスレ違いだ、他所でやれ
660デフォルトの名無しさん:2006/10/07(土) 20:38:44
どのバージョンを使おうが人の勝手だ。
661デフォルトの名無しさん:2006/10/07(土) 20:42:37
>>660
この展開で敢えて墓穴を掘る君が大好きだ。
662デフォルトの名無しさん:2006/10/07(土) 20:44:10
どの展開だよ?
663デフォルトの名無しさん:2006/10/07(土) 20:47:53
>>644
もう頑張らなくていいからさ。
664デフォルトの名無しさん:2006/10/07(土) 21:48:31
いい加減粘着やめろ
665デフォルトの名無しさん:2006/10/07(土) 22:39:44
うぜー
666デフォルトの名無しさん:2006/10/07(土) 23:11:21
>643
騒いでいるときに悪いが、マジレス。
例えば教科の成績表のようなものを作ってみて、以下のコードを実行してみるとか。

Public Sub RangeNameSample()

Const orgRow As Long = 1, orgCol As Long = 1
Dim j As Long

ActiveSheet.Cells(orgRow, orgCol).CurrentRegion.Name = "成績表"

With ActiveSheet.Range("成績表")
For j = 1 To .Columns.Count
.Offset(0, j - 1).Resize(.Rows.Count, 1).Name = .Cells(1, j).Value
Next
ActiveSheet.Range("英語").Interior.ColorIndex = 34
.Sort Key1:=ActiveSheet.Range("英語"), Order1:=xlDescending, Header:=xlGuess
End With

End Sub

データベース的な扱いをするなら、ListObjectを作って操作すると、コードが読みやすくなる。
667デフォルトの名無しさん:2006/10/07(土) 23:17:35
668デフォルトの名無しさん:2006/10/07(土) 23:30:54
>667
レス無いから、コード書いてみたテスト。
669デフォルトの名無しさん:2006/10/08(日) 05:11:23
>>650
おお。それですね
670デフォルトの名無しさん:2006/10/08(日) 11:44:52
質問です。
strconv関数で全角文字を半角文字に変換するとき
ひらがな、カタカナだけ除外する方法はありますでしょうか。
(半角カナは濁点が一字になってしまうので…)

RegExpのreplaceとかで何とかならんかとも考えたのですが
どうやればいいか、よくわからんです。
671デフォルトの名無しさん:2006/10/08(日) 15:49:07
XpのExcel2003です。
変数・配列ののメモリを開放するには

動的配列は
Erase arr

オブジェクトは
set obj = Nothing

とかだと思いますが、
ユーザー定義配列の場合はどうすればよいでしょう??

672デフォルトの名無しさん:2006/10/08(日) 16:26:41
つーか、どっちも厳密には(ry
673デフォルトの名無しさん:2006/10/08(日) 17:04:41
>670
コード書いたんだけど、改行が多いって怒られてupできない。
かなとカナの範囲をExecuteメソッドでMatchCollectionに入れて、それをチェックしながら、それ以外の部分を半角に変換すればいいと思う。
674デフォルトの名無しさん:2006/10/08(日) 17:08:22
Public Sub HankakuHenkan()
Dim re As New RegExp, reMatch As MatchCollection
Dim strPattern As String, orgString As String
Dim r As Range, i As Long, k As Long, tarStrLen As Long

strPattern = "([ぁ-んァ-ンー、,。「」]+)"
With re
.IgnoreCase = False
.Global = True
For Each r In ActiveCell.CurrentRegion
.Pattern = strPattern
Set reMatch = .Execute(r.Value)
If reMatch Is Nothing Then
r.Value = StrConv(r.Value, vbNarrow)
Else
i = 1: orgStr = ""
tarStrLen = Len(r.Value)
For k = 1 To reMatch.Count
j = reMatch(k - 1).FirstIndex + 1
If i < j Then orgStr = orgStr & StrConv(Mid(r.Value, i, j - i), vbNarrow)
orgStr = orgStr & reMatch(k - 1).Value
i = j + reMatch(k - 1).Length
Next
r.Value = orgStr & StrConv(Right(r.Value, tarStrLen - i + 1), vbNarrow)
Set reMatch = Nothing
End If
Next
End With
Set re = Nothing
End Sub
675デフォルトの名無しさん:2006/10/08(日) 17:10:29
>674
upできた。見にくくてスマソ。
676デフォルトの名無しさん:2006/10/08(日) 17:14:20
分かってると思うけど、VBScript Regular Expressions 5.5をアーリーバインドしてね。
こういうのって、完璧にやろうとすると疲れるから、どっかで妥協しないといけないと思う。
677デフォルトの名無しさん:2006/10/08(日) 17:32:41
Dim objMatch As Object, strResult As String, objCell As Range

With CreateObject("VBScript.RegExp")
  .Global = True
  .Pattern = "([ぁ-んァ-ンー、,。「」]*)([^ぁ-んァ-ンー、,。「」]*)"

  For Each objCell In ActiveCell.CurrentRegion
    For Each objMatch In .Execute(objCell.Value)
      strResult = strResult & objMatch.SubMatches(0) & StrConv(objMatch.SubMatches(1), vbNarrow)
    Next objMatch

    objCell.Value = strResult
  Next
End With
678デフォルトの名無しさん:2006/10/08(日) 17:39:24
>>677
エッチなのはいけないと思います!!!
679デフォルトの名無しさん:2006/10/08(日) 17:42:32
>677
そうだよね。SubMatchesという手があるんだよね。勉強になりますた、ハイ。
680670:2006/10/08(日) 18:21:02
>>674, >>677

うまくいきました。
ありがとうございます。
681671:2006/10/08(日) 18:58:11
>>672
おめぇみてーな奴
オラでぇきれーだぁ
682デフォルトの名無しさん:2006/10/08(日) 20:13:03
元々ひらがなに半角なんて無いから(ry
683デフォルトの名無しさん:2006/10/08(日) 20:22:12
PC-6001には半角ひらがながあったぞ
684デフォルトの名無しさん:2006/10/08(日) 21:40:44
>682
のぞきたいっていってるんだからそれでいいぢゃないか。(;´Д`)ハアハア
685デフォルトの名無しさん:2006/10/08(日) 22:02:08
あれ、ひらがなも半角カナに変換されなかったっけ?

と思ったら、されないね。気のせいだったか。
686デフォルトの名無しさん:2006/10/08(日) 22:03:05
>>678
[ぁ-んァ-ヴー,、。「」]
くらいが実用的範囲か。ヴじゃなぁ、せっかくの雰囲気が…
687デフォルトの名無しさん:2006/10/09(月) 00:48:56
>>671
動的なら、Eraseすればとりあえず解放されているようには見える。中で何やってるかは知らない。
688デフォルトの名無しさん:2006/10/10(火) 22:40:24
環境:Winows XP
Accessバージョン:2003
OracleDBにリンクされたテーブル(odbc)の接続について質問です。
下記コードにてConnectの接続文字列の取得をしており、
OpenDatabaseのパラメータの箇所でエラー
(システムで予約しているエラー)が出てしまいます。
(OracleDBのリンク先がローカルであれば問題無いのですが、
サーバのOracleDBにリンクした場合にエラーが出てしまいます。)
ちなみに、Connectionは以下の内容です。
"ODBC;DRIVER={Oracle in OraDb10g_home1};SERVER=AAA;UID=test;PWD=test;DBQ=test;DBA=W;APA=T;EXC=F;XSM=Default;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;GDE=F;FRL=Lo;BAM=IfAllSuccessful;NUM=NLS;DPM=F;MTS=T;MDI=Me;CSR=F;FWC=F;FBS=60000;TLO=O;"

どうぞ、よろしくお願い致します。

689688:2006/10/10(火) 22:40:58
Private Sub Form_Open(Cancel As Integer)

Dim lstrConnect as string
Dim dbs As DAO.Database
Dim tdf As DAO.TableDef
Dim qu As DAO.QueryDef
Set dbs = Application.CurrentDb
For Each tdf In dbs.TableDefs
If CBool(tdf.Attributes And dbAttachedODBC) Then
Debug.Print tdf.Name; vbTab; tdf.sour; vbTab; tdf.Connect
lstrConnect = tdf.Connect
Rem If ... Then
Rem 接続しデータ検索を行う処理
Rem End If
End If
Next

Set dbs = OpenDatabase("", False, False, lstrConn)
Set qu = db.CreateQueryDef("", lstrSQL)
Set rs = qu.OpenRecordset(dbOpenDynamic)

Do While Not rs.EOF
〜〜〜〜略〜〜〜〜
End Sub
690デフォルトの名無しさん:2006/10/10(火) 22:48:03
そのODBCを他のソフトを使ってリモートのOracleにつなげることはできるのか?
691688:2006/10/10(火) 23:26:23
>>690
他のソフトでつなげたことはありません。
692デフォルトの名無しさん:2006/10/10(火) 23:31:34
VBAじゃなく、Accessの機能を使って、そのリモートのOracleにつなげることはできるのか?
693688:2006/10/11(水) 06:58:06
>>692
はい、テーブルのリンクで接続は可能です。
694デフォルトの名無しさん:2006/10/11(水) 11:40:35
Excel2007のVBAを弄っています。
プログラム経験はあるのですが、VBA自体に慣れていないので、苦戦中です。

Excelで、セルの値が変更されたら、処理を行う関数を作っているのですが、

Sub Worksheet_Change(ByVal Target As Range)
 ’処理いろいろ
End Sub

などと書いた後、中身を関数化しようと、

Sub Worksheet_Change(ByVal Target As Range)
  CalculateTable(Target)
End Sub


Public Sub CalculateTable(Target As Range)
 ' 処理いろいろ
End Sub

と書いたのですが、Excelでセルの内容を変更すると、
  CalculateTable(Target)
の行で、「オブジェクトが必要です。」というエラーがでます。
これは、どういうことなんでしょうか。
695694:2006/10/11(水) 11:48:21
わかりました!

 Call CalculateTable(Target)
か、もしくは、括弧をつけないで、
 CalculateTable Target
でいいのですね。

Functionも一緒に書いていたのですが、そちらは、
普通の関数のように(カッコをつけて、callもつけないで)呼べるので、
迷ってしまいました^^;

ステートメントと関数呼び出しの違いなのっだと思うのですが、
他言語使っているとハマりやすいと思うのですが、
この辺の文法的な説明ってどっかに記述ありますか?
696694:2006/10/11(水) 11:51:52
文法的な説明ではないですが、この辺が参考になりました。

Excel で VBA マクロを書くための早見表
http://www.uopmu.ees.osakafu-u.ac.jp/~yabu/soft/excel.html
697デフォルトの名無しさん:2006/10/11(水) 12:22:26
このスレはテディーベアみたいなもんだな
698デフォルトの名無しさん:2006/10/12(木) 14:38:41
教えてください!変数3つ。

Dim 日数 As Integer
Dim 日にち As Integer
Dim シグナル As Integer



For 日数 = 3 To 20
For 日にち = 5 To 30
For シグナル = 5 To 20

なんですけど、やりたいことは、
日数=3の時、日にち=5、6,7,8・・・30
日数=4の時、日にち=5,6,7,8・・・30
・・・・・
日数=20の時、日にち=5,6,7,8・・・30

さらに、
日にち=5の時、シグナル=5,6,7,8・・・20
日にち=6の時、シグナル=5,6,7,8・・・20
日にち=30の時、シグナル=5,6,7,8・・・20

と全通りやりたい場合は、どのように書けばいいのですか?
教えてくださいお願いします。
699デフォルトの名無しさん:2006/10/12(木) 14:57:13
すいません、普通にできましたw
700デフォルトの名無しさん:2006/10/12(木) 15:51:38
すいません、さっきの者ですが、
例えば、

dim 日数 as integer
for 日数 = 3 to 20

で、実際は、日数=3,5,8,101、3,15,18、20
だけをやりたい場合って、どうゆうふうに書けばいいのですか?
教えてください。
701デフォルトの名無しさん:2006/10/12(木) 19:50:04
for d = 3 to 20 step 3

つーかなんでヘルプ見ないの?
702デフォルトの名無しさん:2006/10/12(木) 19:57:08
よくみたら3の倍数じゃないのか

for each i in array(3, 5, 8, 10, 13, 15, 18, 20)
とか
for i = 1 to 8
 j = roundup(i * 2.5, 0)
とか適当に考えろ
703デフォルトの名無しさん:2006/10/12(木) 20:47:21
こんばんは、高速化について質問させて下さい。
現在、エクセルVBAで、CSVデータをエクセルに読み込むプログラムを作りました。
Open "TESTFILE" For Input As #1
Do While Not EOF(1)
Input #1, s
・・・
Loop
Close #1
このような感じで書いて正常稼動していますが、 いまいち遅いです。
Line Input #1, i のように1行ごとに読むと高速なるのはわかりましたが、
なにぶん、改行が不定でうまく読み込めません。
より高速化し、かつ旨く読み込めるアドバイスがあれば勉強になります。
ぜひご助言をお願い致します。
704デフォルトの名無しさん:2006/10/12(木) 20:58:01
>>703
Excelの機能で読む。
705デフォルトの名無しさん:2006/10/12(木) 21:13:54
>>698 >>700
が何なのか気になるのは漏れだけか。
706デフォルトの名無しさん:2006/10/12(木) 21:21:31
>>704
レスありがとうございます。
すんませんエクセルのどの機能を使うのでしょうか?
あまり詳しくないもんで、エクセルのオブジェクトを作成して読み込むってことでしょうか?
もう少しヒントを下さるとありがたいです。
707デフォルトの名無しさん:2006/10/12(木) 21:29:51
>>706
マクロの記録を開始してから、Excelのファイルメニューからcsvファイルを開け。
708デフォルトの名無しさん:2006/10/12(木) 22:03:12
>>703
データが膨大でないのなら全部読み込んでから処理したら。
Const fPath As String = "c:\hoge"
Dim fName As String
fName = "hoge.csv"
Workbooks.OpenText Filename:=fPath & "\" & fName, DataType:=xlDelimited, Comma:=True
(後はお好きなように)
709703,706:2006/10/13(金) 08:27:06
遅レスすみません。
>>707
理解できました。Workbooks.Open Filename:=・・・・ですね勉強になります。
>>708
Workbooks.OpenText Filename:=・・・
見本のコードありがとうございます。勉強になります。

皆さんが指摘されてるように、いったんWorkbooks.OpenやWorkbooks.OpenTextで開いて
その後、加工処理をする方法を試してやってみたいと思います。

レスくれた方々、ありがとうございました。
710デフォルトの名無しさん:2006/10/13(金) 17:56:58
使用OS:WindowsXP
使用ソフト:EXCEL2002

A列、B列、、、F列のそれぞれ2-51行について、共通部分があったら
H列に出力したいんですが、以下を書いたら
Withブロック変数が定義されていないと出てきました。
どうしたらよいでしょうか。

Sub AAA()
Worksheets("sheet1"),activate
Dim isect As Range
Set isect = Application.Intersect(Range("A2:A51"), Range("B2:B51"),
.Range("C2:C51"), Range("D2:D51"), Range("E2:E51"), Range("F2:F51"))
With isect
.Copy Destination:=Worksheets("sheet1").range("H:H")
End With
End Sub

711デフォルトの名無しさん:2006/10/13(金) 18:12:10
> Withブロック変数が定義されていないと出てきました。
そりゃそうだろう。
712デフォルトの名無しさん:2006/10/13(金) 19:20:20
XPsp1、Excel2002です。

(1)VBAで他のブックのマクロを実行することはできるの
   でしょうか。

(2)できる場合、
  a)その方法を教えて下さい。
  b)実行(処理)終了の待ち合わせ方法を教えて下さい。
  c)他のブックは別のPC(同一LANの)上のものでも良い
    のでしょうか。


713デフォルトの名無しさん:2006/10/13(金) 21:06:33
(1) できます
(2) a) オープンすれば呼べます
(2) b) 終わるまで戻らないので、待ち合わせる必要がありません
(2) c) よいです
714デフォルトの名無しさん:2006/10/13(金) 21:07:52
あ、それと、xlsでも参照設定をすれば呼べるかもしれません。
アドインとして保存すれば、参照設定をするだけで呼べます。
715デフォルトの名無しさん:2006/10/13(金) 21:18:01
と思ったんですが、オープンするだけじゃ呼べませんでした。
参照設定が必要。
716デフォルトの名無しさん:2006/10/13(金) 21:30:26
非同期で他Bookのマクロを実行したいって話じゃないのか?
717デフォルトの名無しさん:2006/10/13(金) 21:35:05
application.run "book_name!sub_name"
718デフォルトの名無しさん:2006/10/13(金) 22:48:41
>>710
Application.Intersectメソッドは、共通の(重なっている)セル範囲を抽出するメソッド。
値が同じセルを抽出するものではない。
どういう風に同じになるのか示してくれないと、話が先に進まない。
ちなみに、範囲内で値が全く同じ列を抽出するということであれば、それなりのコードを書く必要がある。
Excel VBAの練習にはいいと思う。
719712:2006/10/14(土) 09:23:11
>>みなさん
どうもありがとうございます。
追加質問です。宜しくお願いします。

(1)「参照設定」って何でしょうか。
   application.run "book_name!sub_name"と記述することでしょうか?
(2)「アドインとして保存する」ってどういうことでしょうか。
720デフォルトの名無しさん:2006/10/14(土) 10:21:30
イルカに聞けよ
721エスパー登場:2006/10/14(土) 12:48:11
>>710
Sub AAA()
Range("sheet1!H2:H51").FormulaR1C1 = "=IF(AND(RC[-7]=RC[-6],RC[-7]=RC[-5],RC[-7]=RC[-4],RC[-7]=RC[-3],RC[-7]=RC[-2],RC[-7]=RC[-1]),RC[-7],"""")"
End Sub
722デフォルトの名無しさん:2006/10/14(土) 17:51:10
>>719
当初の質問の答えは>>717 だから。
あとはググれば出てくる。
>>721
まさにエスパー。
723デフォルトの名無しさん:2006/10/14(土) 19:48:11
Excel 2003 VBAです。
まず、以下のようなテキストファイルを読み込み、
2006の前にある数字を取得しExcelのセルに貼り付けたいと考えています。
どう読み込んで良いか、というところからわかりませんので
お教えください。よろしくお願いします。

××××× 2 2006 △△△△△△
□□□ 4 2006 ○○○○○○○
●●●● 1 2006 ◎◎◎◎
724デフォルトの名無しさん:2006/10/14(土) 19:59:27
>>723
マクロの記録を開始してから、Excelのファイルメニューからtxt/csv/tsvファイルを開け。
725723:2006/10/14(土) 20:06:39
>>724
ファイルを開きたいわけではありません。
それとも、開かないとその後の作業ができないのでしょうか。
726デフォルトの名無しさん:2006/10/14(土) 20:19:24
>>725
注文が多いな。
openしてline inputしてsplitしろ。
727デフォルトの名無しさん:2006/10/14(土) 20:23:21
コードも書いとくか。(動かしてない)
sub foo()
dim s as string
dim ary() as string
dim r as range
dim i as long

set r = worksheets("sheet1").range("a1")

open "file_name" for input as #1
i = 0
do while not eof(1)
line input #1, s
ary = split(s, " ")
r.offset(i, 0).value = ary(1)
i = i + 1
loop

close #1
end sub
728デフォルトの名無しさん:2006/10/14(土) 20:27:12
お勧めの参考書教えてください
基本はある程度できます。エキスパート試験にむけて勉強しようと思っています。
誰かお願いします
729デフォルトの名無しさん:2006/10/14(土) 20:45:50
line inputしてinstrしてmidしてもいいか
730デフォルトの名無しさん:2006/10/14(土) 20:55:25
>>281

けど、唇でされるのもよくね?
731723:2006/10/14(土) 21:07:01
>>729
ありがとうございます。
instrしてmidの方が私のやりたいことに合っていると思います。
どういった関数があるのかが、わからないものですから
勉強になりました。
732デフォルトの名無しさん:2006/10/14(土) 21:24:42
>>728
さようなら
733デフォルトの名無しさん:2006/10/14(土) 23:42:12
一旦読んで処理するのも悪くないと思うが。

Const srcCol As Long = 2, tarCol As Long = 1

Dim fPath As String, fName As String
Dim wbTarget As Workbook, tarWsIdx As Integer

Set wbTarget = Application.ActiveWorkbook
tarWsIdx = Application.ActiveSheet.Index

fPath = "C:\hoge"
fName = "hoge.txt"

Application.ScreenUpdating = False
Workbooks.OpenText Filename:=fPath & "\" & fName, DataType:=xlDelimited, ConsecutiveDelimiter:=True, Space:=True
Columns(srcCol).Copy Destination:=wbTarget.Worksheets(tarWsIdx).Cells(tarCol)
ActiveWorkbook.Close Savechanges:=False
wbTarget.Worksheets(tarWsIdx).Activate
Application.ScreenUpdating = True
734デフォルトの名無しさん:2006/10/15(日) 00:35:50
dim w as workseet
set w = activesheet
...
w.activate
の方が好き。
735デフォルトの名無しさん:2006/10/15(日) 17:22:00
Excel2002です。

ヘルプの見方を教えて下さい。

Rows(x)、Range(y)のx、y部分の記述可能な形式を調べようとして
ヘルプを見たのですが、
オブジェクトのところでRowsもRangeも見つかりませんでした。

プロパティのところではValueが、メソッドのところではSelectが
見つかりません。どこを見れば載っているのでしょうか。
736デフォルトの名無しさん:2006/10/15(日) 18:19:24
Excel 2003だが、Rows, Range, Value全てプロパティにあったぞ。
Selectもメソッドの中にあった。
737735:2006/10/15(日) 19:30:39
>>736
レスありがとうございます。

VisualBasicのヘルプ→目次→ランゲージリファレンス→プロパテイで
出て来ないのですが、見方が違うのでしょうか。
738デフォルトの名無しさん:2006/10/15(日) 19:59:47
>>737
キーワードで検索してみそ。
739デフォルトの名無しさん:2006/10/15(日) 20:08:41
VisualBasicEditorのコード上でRowなりColumnなりの記述があるところに
カーソル合わせてF1でヘルプ開けば一発で出ないか?
740デフォルトの名無しさん:2006/10/15(日) 20:13:16
>>737
Excelのヘルプの目次からMicrosoft Excel Visual Basicリファレンスとかいう項目があると思う。その下。
2000でもそんな感じだったはずだから、2002でもそうだと思う。
741デフォルトの名無しさん:2006/10/16(月) 12:29:27
プロシージャへ渡す引数が省略されて実行された場合、
自動的に該当引数に値をセットしたいですが、
どうすればいいでしょう??

確か、引数の値or参照や型定義のときに
一緒にやったような気がするんですが・・・。
742デフォルトの名無しさん:2006/10/16(月) 12:48:50
Sub Test(Optional Arg As String = "省略したよ")
  MsgBox Arg
End Sub
743737:2006/10/16(月) 18:53:14
>>738、739、740
レスありがとうございました。
F1押したら「ヘルプがインストールされてない」と出てきました。
EXCELをインストールしなおします。
744デフォルトの名無しさん:2006/10/16(月) 21:45:17
>>743
2chだけじゃなくてまずは、VBA・初心者とかのキーワードでググりなさい
ヘルプのインストールの事等は基本だよ
745デフォルトの名無しさん:2006/10/17(火) 00:22:50
すみません
VBAでC++のMap型やvector型のような変数はありますか?

ちょっと検索してみたのですがないっぽい感じですよね?
代用できる変数見たいのでも構いませんので
ご存知の方よろしくお願いします
746デフォルトの名無しさん:2006/10/17(火) 00:39:07
>>745
variantかな・・
747デフォルトの名無しさん:2006/10/17(火) 00:47:26
dictionary
748デフォルトの名無しさん:2006/10/17(火) 09:02:51
シート上のグラフをVBAで全て削除するには
どうすれば良いのでしょうか
749デフォルトの名無しさん:2006/10/17(火) 09:45:13
>>748
ChartObjectsに対してFor Eachループ回してDelete
750デフォルトの名無しさん:2006/10/17(火) 10:25:38
EXCEL2000利用です
COLORINDEX=39の色のセルがどこかを
メッセージボックスに書き出すということに
取り組んでいます
ググッてみて、いろいろ出てきたのですが、
公開されているプログラムだと、条件付き書式でつけた色を認識せず
COLORINDEX=2と判断してしまいます
何か対処法はありませんか?
751デフォルトの名無しさん:2006/10/17(火) 10:36:39
まずはコードを晒せ
752750:2006/10/17(火) 11:13:11
>>751
そうですね。すみません。

色の識別をするのに、

Function CellColor(セル)
CellColor = セル.Interior.ColorIndex
End Function

というマクロを標準モジュールに書いて、

=CellColor(A1)

という式をセルに書いて色番号を書き出すというものです。
この一連の作業を行うと、指定したセルの色として、
COLORINDEX=2という風に出てきてしまいます。
753741:2006/10/17(火) 11:57:21
>>742
なるほどー。ありやんしたー!
754デフォルトの名無しさん:2006/10/17(火) 12:06:40
>>752
全く条件付き書式を考慮してないじゃん。
少しは条件付き書式で設定した色を取得するために
努力をした形跡が見られるコードを期待していたんだが、
形跡どころか欠片も見つからねぇw
君、やる気あるの?つーかこっちの教える気が無くなった。

努力せず丸投げで教えて貰おうって根性の奴には
丸投げ大好きピエロがいるからそいつに教わってくれ。
755デフォルトの名無しさん:2006/10/17(火) 12:31:33
>>749
If Not ActiveSheet.ChartObjects Is Nothing Then ActiveSheet.ChartObjects.Delete
756デフォルトの名無しさん:2006/10/17(火) 12:47:48
>>750
まずはヘルプをFormatConditionsで検索だ。
757デフォルトの名無しさん:2006/10/17(火) 18:08:23
>>745
VBGenericというものを聞いたことがある。
使ったことはないから使い心地はわからないが。
758デフォルトの名無しさん:2006/10/17(火) 23:32:03
質問です
VBAからtelnetでUNIXサーバに接続して、コマンドを実行する方法はありますか?
現状、Shellでバッチファイルを叩いてみましたが、うまくいきませんでした。
ご存じの方がいらっしゃったら、教えていただけないでしょうか?
759デフォルトの名無しさん:2006/10/17(火) 23:37:30
telnet.bat
760デフォルトの名無しさん:2006/10/17(火) 23:39:53
全然VBAの話じゃないじゃん。
VisualBasic for Applicationは、Application(Word、Excel、Accessなど)を操作して
始めてVBAだよ。それ以外はApplication(Word、Excel、Accessなど)付属の
VBE(Visual Basic Editor)を利用したとしても、通常のVB分野の話。
ということでVB6スレへどうぞ。
761デフォルトの名無しさん:2006/10/17(火) 23:42:51
=2chはVBAです。
762デフォルトの名無しさん:2006/10/17(火) 23:45:56
>telnetでUNIXサーバに接続して、コマンドを実行する方法
telnetの場合は、必ずユーザ名とパスワードの入力を要求される。
rshかsshを使うべし。
あと、VBAのShell関数は必ず「非同期」で実行されるから、
サーバからの出力を受け取る必要がある場合は、
コマンドの同期実行が可能なWSHのWScriptオブジェクトのShellメソッドを使うのが吉。
763デフォルトの名無しさん:2006/10/18(水) 03:53:20
プログラマーとも呼べない、底辺のヒスババア技術者が偉そうにできるスレはここですか?
764デフォルトの名無しさん:2006/10/18(水) 04:47:49
763は、何か嫌なことでもあったのかな?
765748:2006/10/18(水) 07:56:11
>>749
どうもありがとうございました。
766デフォルトの名無しさん:2006/10/18(水) 18:58:37
VBAもプログラミング言語の一種だよね?
767デフォルトの名無しさん:2006/10/18(水) 19:14:44
>>764
嫌な人生なんです。
768デフォルトの名無しさん:2006/10/18(水) 19:18:36
VBが日本語ならVBAは大阪弁ってところだ。
VBA自体は正確には言語そのものでは無い。
769デフォルトの名無しさん:2006/10/18(水) 22:56:34
エクセルVBAで、すでに起動されているプロセスのIDを取得するには
どうしたらよいのでしょうか。
ウインドウもでておらず、タスクトレイに表示されているだけのプロセスです。
770デフォルトの名無しさん:2006/10/19(木) 00:38:09
>>769
TaskList.VBS
でググる。
771769:2006/10/19(木) 02:10:19
>>770
とても参考になりました。ありがとうございます。
772デフォルトの名無しさん:2006/10/19(木) 07:55:49
EXCEL2002です。

セルをクリックした時に起動されるVBAマクロの記述の仕方と
クリックされたセルの位置(行、列)の入手方法を教えて下さい。
773デフォルトの名無しさん:2006/10/19(木) 08:15:29
>>772
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  MsgBox Target.Address(0, 0)
End Sub

但しこれはイベント名を見ても解るとおり、選択セルの変更で発生するイベントなので
マウスでセルをクリックして選択セルを変更した時だけではなく、キーボード操作の場合も発生する。
さらには現在の選択(アクティブ)セルを再度クリックしても発生しない。
Worksheet_Clickイベントは無いからそういうのが都合悪いなら、シート上にボタンを配置しな。
774デフォルトの名無しさん:2006/10/19(木) 11:21:36
ダブルクリックか右クリックならイベントあるから、それで代用できない?
775772:2006/10/19(木) 14:05:35
>>773、774
どうもありがとうございます。
776デフォルトの名無しさん:2006/10/21(土) 12:31:04
EXCEL VBAでテキストファイルから特定のキーワードを抜き出して
(つまりGrepのようなものです)
EXCELシートに抽出する処理を行いたいです。

単純にテキストファイルの全行をシートに抽出する処理の記述法は知っているのですが、
変数に格納した各行内で抽出キーワードに合致した部分だけを取り出す方法というのがわかりません。

どなたかご教授頂けないでしょうか?
777デフォルトの名無しさん:2006/10/21(土) 12:33:22
>>776
正規表現使え。
VBAでの正規表現の使い方はググれ。
778デフォルトの名無しさん:2006/10/21(土) 12:37:00
その程度で正規表現使うまでもないだろ
779デフォルトの名無しさん:2006/10/21(土) 12:52:44
ハズレ
使うまでもないから使わないってのは、余計なコストが掛かる場合の理論
コストが掛からないなら、使うまでもないところで使ったって何の問題もない
そして正規表現は、労力面、金銭面、導入面全てに置いてほとんどor全くコストが掛からない
780776:2006/10/21(土) 13:00:28
>>777
レスありがとうございます。
EXCEL VBAでの正規表現の使用法は自分で調べます。

もう1点質問なのですが、EXCEL VBAでファイル名(例えば「sakura.exe」という文字列)から
拡張子を除いた部分だけを切り出す方法はありますでしょうか?
LEFT、RIGHT、MID関数を組み合わせても上手く行きません。

よろしくお願いします。
781776:2006/10/21(土) 13:02:32
>>780の補足ですが「sakura.exe」を「sakura」のようにしたいということです。
「sakura.exe.bak」であれば「sakura.exe」として抽出したいです。

よろしくお願いします。
782デフォルトの名無しさん:2006/10/21(土) 13:04:21
>>781
LeftとLen使うべし
783776:2006/10/21(土) 13:12:06
>>782
すいません。まだよくわかりません。
例も良くなかったです。すいません。

拡張子の長さは3文字固定とは限らない前提です。
「sakura.exe.manifest」→「sakura.exe」
784776:2006/10/21(土) 13:49:55
InStrRev関数を使えばできることがわかりました。
どうもありがとうございました。

Dim 拡張子あり As String
Dim 拡張子なし As String

拡張子あり = "sakura.exe.manifest"
FileName = Dir(FullPath) 'フォルダ名を除いたファイル名を取得(=User32.dll)

If InStr(1, FileName, ".") > 0 Then
'拡張子がある場合は、拡張子を省く
拡張子なし = Left(File拡張子なしName, InStrRev(拡張子なし, ".") - 1)
End If
785776:2006/10/21(土) 13:51:27
間違えました。これです。

Dim 拡張子あり As String
Dim 拡張子なし As String

拡張子あり = "sakura.exe.manifest"

If InStr(1, 拡張子あり, ".") > 0 Then
'拡張子がある場合は、拡張子を省く
拡張子なし = Left(拡張子あり, InStrRev(拡張子あり, ".") - 1)
End If
786デフォルトの名無しさん:2006/10/21(土) 15:00:16
>>776
つ InStr関数
787デフォルトの名無しさん:2006/10/21(土) 15:23:27
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
GetTheBase = fso.GetBaseName(filespec)


導入コストはかからないからお勧め!!
788デフォルトの名無しさん:2006/10/21(土) 18:56:29
正規表現使うならそれでやってみるのもイイぞ。
789デフォルトの名無しさん:2006/10/22(日) 13:15:23
776みたいなサクラエディタの信者ってキモイなw
790デフォルトの名無しさん:2006/10/22(日) 15:28:37
Excel2003でVBA組んでるんですが。
ListBoxコントロールの背景色(ListBox.BackColor)を変更すると、
ListBoxの選択中の表示(背景色が強調されたり、選択枠で囲まれ
たり)が消えてしまうんですが、これをさせないようにするには、
どうしたらいいんでしょう。ListBox.ListIndexは、選択された値
がそのまま維持されているんですが。再設定してみても、選択さ
れないですし。(ListBox.ListBoxIndex を一度別の値に設定して、
再設定すると表示されるみたいですが、これもちょっと…)

初歩的な質問ですみません。
791デフォルトの名無しさん:2006/10/22(日) 20:49:33
選択中の行を 上へ移動(つまり上の行と入れ替える) 
もしくは、下へ移動したいんですけど、いい方法を教えてくだされ。
792デフォルトの名無しさん:2006/10/22(日) 21:13:19
>>791
Excelで手操作するのと同じ動作でしょ?
マクロ記録モードにして
マウスで行切り取りして
コピーした行を挿入ってやって
記録モード止めてからマクロを見ればいいじゃない
793デフォルトの名無しさん:2006/10/22(日) 21:26:31
天才現る
794デフォルトの名無しさん:2006/10/22(日) 21:38:20
と、思ったら
3行目のセルを切りとる → 2行目のセルに挿入 というコードになってしまいますた。(´・ω・`)ショボーン
上のセルに挿入というコードにしたいのですが、ご教授を('A`)
795デフォルトの名無しさん:2006/10/22(日) 21:47:50
初歩的な質問で申し訳ありません。
VBAはOffice製品で使えるプログラミング言語とありますが、
使い方や、データ型など、は変わらないのですか?
MySQLとSQL Server ではデータ型が違っていたりしますが・・。
796デフォルトの名無しさん:2006/10/22(日) 22:15:37
>>794
つ 相対

>>795
構文規則はたぶん100%互換
型もたぶん100%互換
組み込みの関数やステートメントは95%互換くらいかな
組み込みのグローバルオブジェクトは全然違う
ユーザーフォームも結構違う
797デフォルトの名無しさん:2006/10/22(日) 22:48:39
>>796
どうもありがとうございます。
参考になりました。
798デフォルトの名無しさん:2006/10/24(火) 00:24:21
>>790
色々やってみたが確かにうまくいかない。
唯一うまくいったのが下記。(動作確認はExcel 2000だが。)
myIndex = .ListIndex
.Selected(myIndex) = False' 一旦外す
.Selected(myIndex) = True

しかし何のために背景色を途中で変えるのだろう…
799デフォルトの名無しさん:2006/10/24(火) 06:45:04
処理上、後が優先されるだけのことでしょ
自己満足の処理はいらねぇよなぁ
800デフォルトの名無しさん:2006/10/24(火) 08:09:11
>>799の美しい解決策に請う御期待。
801デフォルトの名無しさん:2006/10/24(火) 23:00:10
配列a(9)をセルA1:J1にガバっとセットするヒントを教えてください。
802デフォルトの名無しさん:2006/10/24(火) 23:11:03
Range("A1:J1").Value = a
803デフォルトの名無しさん:2006/10/24(火) 23:37:16
>>802できちゃった、ありがとう。
804デフォルトの名無しさん:2006/10/25(水) 21:06:28
>>798
ありがとうございます。true→falseでもできますか。
そっちの方がいいかも。
背景色を変えたい理由は、今、テキストボックスのに
リストボックスから選択した内容を挿入しながら編集
するフォームを作っているですが、実際に使ってみる
と、タブとかで頻繁にリストボックス←→テキスト
ボックスを移動するんで、今どこにいるかわからなく
なるんです。で、みれば一発でわかるように現在Focus
がいるコントロールの背景色を変えたんですが…
805デフォルトの名無しさん:2006/10/26(木) 20:29:45
すんまそん。教えてください。

動的配列で格納した数字を全部足した場合はどうしたらいいんですか?
806805:2006/10/26(木) 20:36:34
書き忘れました。
XPのエクセル2003です。
807デフォルトの名無しさん:2006/10/26(木) 21:00:14
>>805
UBOUND?
808805:2006/10/26(木) 21:15:17
>>807ありがとうございます。

配列数ではなく、配列に格納した数字を全部足したいんです。

例えば
a(1)=126
a(2)=769
a(3)=321
であれば、単純にa(1)+a(2)+a(3)と出来るのですが・・・

配列数が未定なものはどうしたらいいんでしょうか?
809デフォルトの名無しさん:2006/10/26(木) 21:33:31
>>808
for 変数= Lbound(配列) to Ubound(配列)
じゃダメなの?状況をもう少しkwsk
810805:2006/10/26(木) 21:52:54
>>808すんまそん

仕事現場にプログラムを置いてあるんで、コードはうつせませんが、

例えば、静的配列で配列に格納した数字を全部足したい場合は
a(0)=126
a(1)=769
a(2)=321
NUM=a(0)+a(1)+a(2)
でできますが、

動的配列だと
a(0)
.
.
a(i)
NUM=a(0)+・・・・a(i)
となるとおもいます。
a(i)の最大配列数はUboundで出せて、おっしゃる通りfor〜toを使えますが、
いざ格納された数字を全部足そうと思うとどうやったらいいかわかんなくて。。
NUMの変数定義でstaticを使ってもダメそうで。。

811デフォルトの名無しさん:2006/10/26(木) 22:03:30
ダメだこりゃ。
812デフォルトの名無しさん:2006/10/26(木) 22:04:29
> NUM=a(0)+a(1)+a(2)
この時点で唖然とする。
813809:2006/10/26(木) 22:06:06
すみません、何が問題なのかすら分かりません。
他の人バトンタッチ....
814805:2006/10/26(木) 22:06:20
>>812
2日前にプログラム始めたばかりでして^^:
他に何かやり方があるんですか?
815デフォルトの名無しさん:2006/10/26(木) 22:14:58
ニュートン・ラフソン法と2次方程式の解法を組み合わせて、
3次方程式の解を求めるプログラミングはどのようにして作れば
いいんですか?
816デフォルトの名無しさん:2006/10/26(木) 22:15:54
>>814
ループを利用した加算を理解しる
817デフォルトの名無しさん:2006/10/26(木) 22:22:07
>>815
どうって・・ループと条件式でアルゴリズムを具体化してみそ
818805:2006/10/26(木) 22:24:07
>>816すみません。
ちょっとわかんないんで、コード教えていただけますか?

819デフォルトの名無しさん:2006/10/26(木) 22:27:20
>>818
for a=1 to 5
c=c+b(a)
next a
例えばこれを理解してみて
820809:2006/10/26(木) 22:28:05
for i=lbound(a) to ubound(a)
Sum = Sum + a(i)
next i

基本すぎてなんか自信ないよ。
821805:2006/10/26(木) 22:30:54
>>819
>>820
わかりました!!ありがとうございます!!
822819:2006/10/26(木) 22:42:15
ちなみにエクセルだと
b=WorksheetFunction.Sum(a)
とか一行でも書けるけどな
823デフォルトの名無しさん:2006/10/28(土) 08:16:37
動的配列ならFor each in使いたいな、なんとなく
824809:2006/10/28(土) 23:07:43
>>822
>>823
ダメダメですね、私。
特に>>822は勉強になりました。
825デフォルトの名無しさん:2006/10/29(日) 00:26:24
うーん、長い間PG組んでいるが、
For i=0 to UBound(buffer)-1
sum=sum+buf(i)
next
以外のパターンって使ってないな。
For each inとかlboundとか一度も使ったことないし。
While文ですらろくに使わない。Do Whileなんて、何それだしなぁ。
われながら、PG能力が低いな。
826デフォルトの名無しさん:2006/10/29(日) 01:47:51
うん。
827デフォルトの名無しさん:2006/10/29(日) 03:43:36
こんばんは。WindowsXP で Word2000 を使っています。
私は英訳等をする機会が多いのですが、
分からない単語が出てくるたびにマウスで単語を
辞書サイトにコピーペーストし、検索ボタンを押しています。
(もしくは単語コピー→Alt+Tabでブラウザ⇔Word切り替え→ペースト検索)


この作業をマクロを使う感じでショートカットキー一つで出来る、もしくは
コンテキストメニュー(右クリックメニュー?)に追加して労力を減らせれば
非常に便利だと思うのですが、マクロ化するようなことは出来ないのでしょうか?
以下に行いたい処理の流れをかきます。

1:実行中のWordで調べたい単語を選択している状態からスタート
2:マクロを実行すると、選択している単語をアルクの辞書サイトで検索
3:画面の表示をインターネットブラウザへ移して検索結果を表示

これに加えて、できれば一回一回開きなおすのでなく、一度以上検索を行っている場合には
その窓で検索を行うような形に・・・

参考になるアドレスや似たようなマクロ持っている方などおられましたら助けていただけないでしょうか?

尚、ここへ来る前にWord総合質問スレにて質問させていただきましたが、
畑違いかと思いましてこちらで質問させていただいています。

詳しい方いらっしゃいましたらよろしくお願いします。
828デフォルトの名無しさん:2006/10/29(日) 04:57:25
>>827
昔使ってた辞書ソフトとか翻訳ソフトに
画面上の英単語にマウスカーソルを当てるだけで
訳をウィンドウ表示する機能があったけど、
そーゆうのではダメですか?
829デフォルトの名無しさん:2006/10/29(日) 10:59:32
>>827
クリップボード監視してBookshelf(昔のオフィス付属の辞書ソフト)を引くプログラムを
VBで書いたことがあるので、ショートカットキーならもっと簡単だと思う。

Web上の辞書なら、あらかじめある単語を引いた結果画面の
アドレスのどこに選択した単語が含まれているかを調べて(&word=hogeみたいに)
その部分を置き換えたURIを作ってブラウザを開けば良いだけ。

>>828
代表的な物としては「ロボワード」とかね

最近だと「本格翻訳5」(開発NEC,販売ソースネクスト)の1980円の奴でもできるけど
ttp://www.sourcenext.com/titles/use/72400/
830827:2006/10/29(日) 11:41:30
>>828

ありがとうございます。辞書ソフトや、翻訳ソフトを所持していないので
ちょっと想像がつかないです・・・。もう少し調べてみます。

>>829

ありがとうございます。

>Web上の辞書なら、あらかじめある単語を引いた結果画面の
>アドレスのどこに選択した単語が含まれているかを調べて(&word=hogeみたいに)
>その部分を置き換えたURIを作ってブラウザを開けば良いだけ。
私もそういう動作をさせられればいいなと思っていました。Wordを実行中に
Wordのショートカットキーから作成したプログラム(プラグイン?)を動かす
ような動作が可能なのでしょうか?

マクロでこのような動作を行うのは難しく、プログラムを作成する必要がある、
と考えた方がよいのでしょうか?

本格翻訳5見てきました。ワードのプラグインとして使えて便利そうです。
831827:2006/10/29(日) 15:23:16
何度も申し訳ありません。アドバイスをヒントに色々と試しまして(彷徨いまして)、
以下のようなマクロにまとめてみました。コードを張ってよいものか分かりませんが
失礼します。

Sub 検索野郎男塾()
Dim word As String
Dim address1 As String
Dim address2 As String
Dim address3 As String

'選択中の文字列を取得
selectedword = Selection.Text

' address1:アドレス前半部 address2:アドレス後半部 address3:選択中の文字列と結合
webaddress1 = "http://www2.alc.co.jp/ejr/index.php?word_in="
webaddress2 = "&word_in2=なんてらかんてら&word_in3=なんてらかんてら"
webaddress3 = webaddress1 + selectedword + webaddress2

With CreateObject("InternetExplorer.Application")
.Navigate webaddress3
.Width = 1024
.Height = 768
.Top = 0
.Left = 0
.ToolBar = True
.MenuBar = True
While .Busy: Wend
While .Document.ReadyState <> "complete": Wend
.Visible = True
End With
End Sub
832827:2006/10/29(日) 15:31:59
それで、現在の動作が、

1.Word中で文字列を選択
2.Word中で上記マクロ実行
3.IEが起動し、希望のページの表示が行われる。

と、大体希望通りの動きをしています。
ただ、検索を2度3度と繰り返しますと当然かもしれませんがIE窓が2個3個・・・と
増えていってしまっています。
IEが開いているかどうかチェックして、開いていれば同じ窓で該当アドレスを開く、
といった動作にするためのヒントをご存知の方いらっしゃいましたらいただけないでしょうか?

漠然と、
「多分IEが開いてるかどうかを示すパラメータのような物があるだろうから、それを取得して分岐してやればいい」
と素人なりに考えてはみたのですが、ヒントや改善点などなどありましたら指摘していただけると助かります。
833デフォルトの名無しさん:2006/10/29(日) 15:42:14
>>825
動的配列だと、配列がa(4)からa(10)とか、極端な話飛び飛びに
なっていることもあるし。まあ、レアケースではあるけど。
834827:2006/10/29(日) 18:10:15
なんとかアドバイスと下記リンク等を元に解決できました。
ほとんどリンク先のソースの改変なのでマクロのコードは貼りません。
(ほんとは見て頂いて直していただければ最高なのですが・・・)

皆様どうもありがとうございました。

TypeNameとShell.Applicationを使い起動済みのIEを探す
ttp://www.ken3.org/vba/backno/vba156.html
835デフォルトの名無しさん:2006/10/29(日) 21:27:52
ちょっとお聞きしたいですが…

エクセルでコンボボックスを使ってデータ管理したいのですが

コンボボックスを同じ行で一つずつ作りたいんですが

設定する時に一つ一つしなければならないのでしょうか?

836デフォルトの名無しさん:2006/10/29(日) 21:52:03
日本語で

具体的に

無駄な行間開けずに

お願いします
837デフォルトの名無しさん:2006/10/29(日) 22:12:08
>>832
ShellExecuteでURL指定すれば、適当にIEのウィンドウを使いまわさなかったっけ?
838デフォルトの名無しさん:2006/10/31(火) 18:12:28
1.点数チェックボタンを押すと、自動的に「Sheet2」が作成される。
2.作成された「Sheet2」に表1がコピーされる。
3.コピーされた「Sheet2」で、点数が70点未満の者は、背景が赤色に変更される。
という問題で、シート2への転記はできた。
けど、70点未満の人間の背景を赤色に変更することができないんです><
一人ずつ点数を判別していくとなると、莫大な労力を要するので、どうにかなりませんかね?
839デフォルトの名無しさん:2006/10/31(火) 18:16:11
>>837
そうなるのは、インターネットオプションの詳細設定で、
「ショートカットの起動にウィンドウを再利用する」が設定されているときだけだと思う。
840デフォルトの名無しさん:2006/10/31(火) 19:20:22
>>838
履修不足
841デフォルトの名無しさん:2006/10/31(火) 19:36:47
>>838
自分で自分のレスを読み返してみろ。
その文で他人に状況が伝わるとでも?
842デフォルトの名無しさん:2006/10/31(火) 21:16:50
わかるだろ
843デフォルトの名無しさん:2006/10/31(火) 21:56:48
>>838
Sheet2って何?新規ワークシートの名前?
表1って何?どこにあるの?
70点未満の人間の背景を赤色ってどうやるんだ?できるならこっちが教えてほしいわ
70点未満の点数が表示されているセルの背景のことか?表1には名前と点数がセットになってるのか?
判別はループ内ですれ
844デフォルトの名無しさん:2006/10/31(火) 22:18:49
今酷い優しさを見た。
End sub
845デフォルトの名無しさん:2006/10/31(火) 22:47:16
>838
労力ってVBA書く労力か?一行でかけるぞ
846デフォルトの名無しさん:2006/10/31(火) 23:30:51
初心者の質問ですがよろしくお願いします。
一つの列について、特定の(複数の)文字があれば、その文字があるセルを色づけし、
特定の(複数の)文字がなければその行を削除する、というVBAを作りたいのですが
上手くいきません。

Sub tes()

Range("B3").Select

Do Until Selection.Value = "おわり"  ’おわりセルまでループさせる’
If Selection.Value = "#001" Or "#003" Or "#005" Then 
Selection.Interior.ColorIndex = 37 ’アクティブセルが#001か#003か#005であればセルの背景色を37に’

Else
Selection.EntireRow.Delete ’それ以外は行ごと削除’
End If

Selection.Offset(1, 0).Select
Loop

End sub

マクロが全く動かずに "#001" Or "#003" Or "#005"のところがエラーだと出てしまいます。
実際のところ、特定の文字列は1500個ほどあります。何とか上手くいく方法は無いでしょうか?
(もちろん実験のため3個の文字列でも実行しましたがエラーでした。1個だと上手くいきます)
847デフォルトの名無しさん:2006/10/31(火) 23:37:34
orは条件式(変な言葉だけど)をつなげるものだと思うよ
〜value="#001" or 〜value = "#002" or 〜value ="#003"
とかで試してみてください。
848デフォルトの名無しさん:2006/10/31(火) 23:39:21
>>846
or の使いかたがまずいと思う
めんどうだが全て式にしてor でくぎる
だが、実際1500あるならそれじゃ大変すぎ
849デフォルトの名無しさん:2006/10/31(火) 23:49:22
>847
少ないサンプルで実験したら、それで何とかできそうです!!
ありがとうございましたm(^^)m

>848
式はメンドイですけど、これもエクセルの&で乗り切ります・・
出来るかなぁ。。
850デフォルトの名無しさん:2006/10/31(火) 23:52:38
追記:
条件が1500個というのを見落としていました。
とりあえず簡単(分かりやすい)なのは
条件を入れる列を用意してあげて一個ずつ比較する事かな?


例えばD列に条件をずらーっと並べて(D1="#001",D2="#003"・・・D1300="#923")
int_row=3
Do while cells(int_row,2).value="尾張"
bln_check=false

for int_comp = 1 to 1500
   if cells(int_row,2) = cells(int_comp,4) then
      cells(int_row,2).interior.colorindex =37
      bln_check=true
      exit for
   end if
next int_comp
if not(bln_check) then cells(int_row,2).EntireRow.delete
int_row=int_row+1
Loop

こんなイメージ。
適当に書いただけ。
当然これだと条件に当てはまらなかったときに
条件の入った行まで消してしまうのでD列を別シートに移動する等しなくちゃいけない。
つづく?
851847,850:2006/10/31(火) 23:57:17
あ、ごめん。
バグだらけだ、コレ。
行消しちゃうと不具合が...
>if not(bln_check) then cells(int_row,2).EntireRow.delete
>int_row=int_row+1
一行飛ばしちゃうね。
しかし汚いコードだ..
852846:2006/11/01(水) 00:12:02
>851さん
解決したかと思ったのですが出来ませんでした・・・。Selection.Value = "#001”を横に並列
させようとしたんですが、30式ほどで横幅の限界まで直ぐに到達して無理に。
縦に縦列させたところ、
If Selection.Value = "#001"
Or Selection.Value = "T2531"
Or Selection.Value = "T2536"
Or Selection.Value = "T2536"
Or Selection.Value = "T2572"
Or Selection.Value = "T2576" Then

↑のように、上の文字列が赤くなりエラーがでてしまいました。
>850はD列に条件を入れて、そこを参照にさせるということですか???
自分にはちょっと無理そうなので、もう少し詳しく教えていただけませんか?
853デフォルトの名無しさん:2006/11/01(水) 00:18:58
文字のパターンのよるけど、1500個をひとつの文字列にして
WorksheetFunction.Findとかで検索して、
ヒットしたら色、エラーなら消しってのでもいけると思う
コードはめんどうだからカンベンw

何にしてもどこかのシートの列とかに特定文字を羅列したほうがいいよ。
コードにひとつひとつ書くのはやめれw
854847,850:2006/11/01(水) 00:21:13
>>852
俺にさらに恥を晒させる気ですか、そうですか。
D列に〜と書いたのはVBEで条件を1500個書くよりもシートに直接記述したほうが楽かな、
と思っただけです。

ちなみに縦に縦列させるのは
If Selection.Value = "#001" _
Or Selection.Value = "T2531" _
Or Selection.Value = "T2536" then
というように行の最期に「 _」をつければOKです。
855846:2006/11/01(水) 00:35:18
>854
なにとぞ願いできないでしょうか?
「 _ 」ですが、数十個でも『「 _ 」を使いすぎています』というエラーメッセージが
出てきて無理でした・・。
856デフォルトの名無しさん:2006/11/01(水) 00:43:21
>>855
おまいの1500個書こうという根性には感心したw
857847,850:2006/11/01(水) 00:46:44
下準備:
シート2のD列に条件を列挙
そして再びシート1を選択して以下のコードを実行

Sub test5()
Dim int_row, int_comp,bln_check '変数を定義する
int_row=3 '三行目から開始
Do while cells(int_row,2).value="おわり" '(int_row)行目の左から二個目のセル(B列)が"おわり"になるまで
bln_check=false 'チェック(フラグ,印)をリセット

for int_comp = 1 to 1500 'int_compを1から1500まで一個ずつ変動させる
   if cells(int_row,2) = Worksheets(2).cells(int_comp,4) then 'int_row行目のB列とシート2のint_comp行D列を比較
      cells(int_row,2).interior.colorindex =37
      bln_check=true '該当したものがあったらチェックする
      exit for
   end if
next int_comp 'ここまできたらint_compを1増やしてfor〜の次へループ


if bln_check=true then 'チェックしてあったら
int_row=int_row+1 'int_rowの値を1増やす(次の行を見る準備)
else 'ちぇっくが無かったら
cells(int_row,2).EntireRow.delete 'その行を消す(下の行が繰り上がるのでint_rowはそのまま)
end if
Loop '先頭にループ
end sub

できるだけ初心者っぽいコードに仕立ててみました(逃げ)
と、ここまで書いて不安になったんだが「変数って何ですか」ってレベルじゃないよね?
858847,850:2006/11/01(水) 01:12:32
>>857 を一応テスト...
動いたのは動いたが当然遅い..フリーズしたかと思った。
解決1:残った行は全て色が残るわけだから逆に色づけは最期にまとめて行う(△)
解決2:条件を一度配列にぶち込む(○)
解決3:データ行、条件行両方をソートしてからうまい事...(○)
解決4:条件に法則性があるならそれを利用して場合わけ。(◎)

これくらいかなぁ...
まぁ、どちらにせよ条件を1500個も打ち込む時間に比べたら屁みたいなもんだろうけど。
、という事でそろそろ恥さらしは終わりにします。スレ汚しスマソ
859デフォルトの名無しさん:2006/11/01(水) 03:40:27
何にせよ乙。
>>846
具体的にどういう文字列なのか晒せるなら晒してみて。
いくつかのレスにあるように、文字列に規則性があれば、簡単かつ高速になる可能性がある。
規則性があまりないなら、メインテナンス性を考えて、別のシートに1セル1文字列で入れておいたら。
文字の連接は、ある文字列(外れ)が他の文字列(当たり)の一部である場合に工夫が必要になる。
いくつか方法はあるが、お勧めはMatchだな。
860846:2006/11/01(水) 04:03:23
>847さん
ありがとうございます!!変数はまだ良く解りませんが、何とかできてる感じです。
深夜までお付き合いありがとうございますm(-_-)m

>859
T4031
T4041
T4042
T4043
T4044
T4046
T4047
T4061
T4062
T4063
T4064
T4078
T4088
T4091
T4092
T4095
T4097
T4099
T4100

上みたいな感じで規則性は皆無です。
861デフォルトの名無しさん:2006/11/01(水) 10:07:07
>>860
いや・・それ規則性あるほうだよ。

Sub test() 'match使用の一例
Dim ws1 As Worksheet: Set ws1 = ThisWorkbook.Worksheets(1)
Dim ws2 As Worksheet: Set ws2 = ThisWorkbook.Worksheets(2)
Dim y1 As Long: y1 = ws1.Cells(65536, 1).End(xlUp).Row
Dim y2 As Long: y2 = ws2.Cells(65536, 1).End(xlUp).Row
Dim rr1 As Range: Set rr1 = ws1.Range("A1:A" & y1)
Dim rr2 As Range: Set rr2 = ws2.Range("A1:A" & y2)
Dim r As Range, a As Long

On Error Resume Next
For Each r In rr1
a = 0
a = WorksheetFunction.Match(r.Value, rr2)
If a = 0 Then
ws1.Rows(r.Row).Clear
Else
ws1.Rows(r.Row).Interior.ColorIndex = 6
End If
Next r
ws1.Cells.Sort key1:=Range("A1")
End Sub
'Sheet1-A列-10,000件のデータ Sheet2-A列-1500個の特定文字をセット
'mypcで25秒、Application.ScreenUpdating = Falseで13秒くらいか一例にしてみて
862デフォルトの名無しさん:2006/11/01(水) 12:46:37
解決したようなので余計なことかも知れんが、そもそもの目的が「テーブルの中で特定の番号の
ものだけ残す」ということであれば、削るのではなくて抽出することを考えた方が先々泣きを見な
くて済むかも。マクロの間違いで消してしまって青ざめることも良くあるからな。
スキルの向上にもつながる。
863デフォルトの名無しさん:2006/11/01(水) 17:43:16
コマンドボタンとテキストボックスをつくり、
テキストボックスに文字を入力し、コマンドボタンを押すと、
A1にその入力した文字が出力されるようにしたいのです。
ただ、それだけなら、
Private Sub CommandButton1_Click()
If txtbox <> "" Then
If textbox <> IsNumeric(txtbox) Then
Cells(1, 1) = txtbox
Else
MsgBox "文字で入力して下さい", vbCritical
End If
Else
MsgBox "何か入力して下さい", vbCritical
End If
End Sub
と解答はできたのですが、テキストボックスに文字を新たに入力し、
A2,A3,A4…とA1以下のセルに順次新しく入力内容が表示されるようにしたいのですが、
どうしたらいいでしょうか?
864デフォルトの名無しさん:2006/11/01(水) 17:48:01
なんか、タブキーを使ってしまったため、かなり見づらくなってしまいました。
Private Sub CommandButton1_Click()
 If txtbox <> "" Then
  If textbox <> IsNumeric(txtbox) Then
   Cells(1, 1) = txtbox
  Else
   MsgBox "文字で入力して下さい", vbCritical
  End If
 Else
  MsgBox "何か入力して下さい", vbCritical
 End If
End Sub
865デフォルトの名無しさん:2006/11/01(水) 17:49:00
>>863 ここは宿題をやってもらうスレじゃないぞ。
>If textbox <> IsNumeric(txtbox) Then
そもそもココ大丈夫?
あとは>>846を応用すればおk
866デフォルトの名無しさん:2006/11/01(水) 17:59:09
>>865
スマセン、重要なヒントがすぐ上にありましたね。
なにぶんてんぱり過ぎてて、余裕がなかった。
ただ、VBA初心者向けのスレもないんで、
ここで宿題っぽい質問をしてしまうのは仕方ないとは思うんですが。
867デフォルトの名無しさん:2006/11/01(水) 18:49:18
パラメータ(アーギュメント)を持っているマクロを、Call文でなく、
キーボード操作(マクロ→実行のような)で、パラメータを指定して
実行する方法があれば、教えて下さい。
868デフォルトの名無しさん:2006/11/01(水) 19:06:02
sub aaa()
bbb inputbox()
end sub
869デフォルトの名無しさん:2006/11/01(水) 19:51:53
>>867
Call を使用したくないのは何故?
アーギュメントは一定なのか?
または、いつどこで決定される?
870デフォルトの名無しさん:2006/11/01(水) 23:43:11
割り込み質問スマソ
VBEのウォッチウインドウと実行中のフォームって一画面中に並べて表示させることって可能ですか?
フォーム実行中の変数の値を画面を切り替える事無く追いたいのです。
871デフォルトの名無しさん:2006/11/02(木) 01:22:43
アプリとVBEのウィンドウを小さくしとけばいーんじゃね?
872870:2006/11/02(木) 01:32:32
>>871 ありがとうございます! 考えも尽きませんでした。
873デフォルトの名無しさん:2006/11/02(木) 12:37:47
>>872
>考えも尽きませんでした。
思考の無限ループという感じがしてワロタ。
874870:2006/11/02(木) 14:08:44
>>873 オーバーフローしました
875デフォルトの名無しさん:2006/11/02(木) 21:51:48
再起動してください
876867:2006/11/03(金) 10:50:39
>>869
レスありがとうございます。

実行時にパラメータを与えたいためです。
マクロのソースを修正して実行すれば良いことですが、
できれば、実行指示の操作をキーボートから行う時に
パラメータで指定できればと思って、
質問しました。
877デフォルトの名無しさん:2006/11/03(金) 11:16:53
1/3しか質問に答えてないね。
ってことは放置でいいか。
878デフォルトの名無しさん:2006/11/03(金) 11:42:27
>>876
まあ、なんとなくわかった。
キーボードで、パラメータ入力→マクロショートカットキー実行
てな感じで実行したいわけかな?
単にマクロにinputboxでも仕込むとか、実行後にユーザーに問えば良い気がするけど
どんなマクロを想定してるのか
879デフォルトの名無しさん:2006/11/03(金) 22:01:27
マクロを修正したくないならもう一つマクロ作って
そこから呼び出せばよいのでは?

ちょっと強引だけど
空ユーザーフォーム作ってKeypressとかでキー受け取って。
880デフォルトの名無しさん:2006/11/04(土) 01:20:46
EXCEL2003で図を選択した状態で動かすマクロを作ったのですが
セルを選択した状態でこのマクロを動かすとエラーが出てしまいます。
マクロの頭に「もし図を選択しているなら」と条件をつけたいのですが、
どのように書けばいいのでしょうか?
881デフォルトの名無しさん:2006/11/04(土) 08:34:13
>>880
図は特定のものでしょうか?また、エラーが出るのは.selected等を使ってるから?
もう少し詳しく書いてくれたほうがうれしいです
882876:2006/11/04(土) 18:39:57
>>みなさん
レスありがとうございます。
キーボードからパラメータ与えるのはできないようですね。


883デフォルトの名無しさん:2006/11/04(土) 19:18:16
出来るけど、882は何か勘違いしてると思う。
884880:2006/11/04(土) 20:46:26
>>881
マクロスタート時に"図を選択していること"を前提にしているので、
マクロの頭は「ttt=Selection.Top」や「nnn=Selection.Name」など
選択している図の位置やサイズ・名前を取得するようなものから始まっています。

エラーは図ではなくセルを選択した状態でこのマクロを動かしたときに起こるもので、
「nnn=Selection.Name」と名前を取得しようとするところでエラーが出てしまいます。

なので、マクロの頭に「もし図を選択しているなら以下の動作を・・・」という条件をつけて
セルを選択した状態では動かないようにしたいと考えています。
885デフォルトの名無しさん :2006/11/04(土) 21:10:52
ACCESS総合でレスもらえなかったのでこちらに来ました

テーブルにフィールドを追加したんですが
フィールドリストにはでてるんですが、VBAではエラーになります
分かる方お願いします

886デフォルトの名無しさん:2006/11/04(土) 22:52:56
ビジュアルベーシック2003.NETと2005は互換性ありますか?
887デフォルトの名無しさん:2006/11/04(土) 23:31:12
スレ違い
ここはプログラム開発言語Visual Basic、Visual Basic.NETシリーズのスレではなく
Officeアプリケーションのマクロ言語VisualBasic for Applicationのスレ
888886:2006/11/05(日) 01:35:46
親切にありがとうございました。
889デフォルトの名無しさん:2006/11/05(日) 07:19:02
>>885
本当にその質問でわかる人がいると思ってるのか?w
あんたの言うフィールドリストとはなんぞや?
テーブルのデザイン画面?
それなら当然追加したから見えるわけだ。
つまり問題はVBAのコードに問題があるわけだが
そのコードはあんたにしか読めない。
清田君はもういないから無理です。
890デフォルトの名無しさん:2006/11/05(日) 10:22:22
>>885 です
原因は解りました
テーブルにフィールドを追加して、そのフィールドをフォームの
VBAで使用できますが、
サブフォーム付のフォームのVBAだと参照できません
回避する方法はあるのかもしれませんが
めんどくさいけど、新規で作り直します
891デフォルトの名無しさん:2006/11/05(日) 11:34:56
>>884
超テキトーな解法
エラーになることを逆手にとって
ShapeにあってRangeにないプロパティ/メソッドを使ってエラーの場合は終了

On Error ResumeNext
Selection.Shapeにしかないプロパティ/メソッド
If Err.Number <> 0 Then
exit sub
end if
on error goto 0

Selection.Top

とか
892デフォルトの名無しさん:2006/11/05(日) 11:37:13
× Selection.Top
○ ttt = Selection.Top
893デフォルトの名無しさん:2006/11/05(日) 12:10:18
>>884
>nnn=Selection.Name
こういうのはTypeNameを使う

If "Range" = TypeName(Selection) Then
 MsgBox "Range"
End If
894デフォルトの名無しさん:2006/11/06(月) 12:26:05
すいません質問をさせてください。
環境はXP、Office2003です。

一つのシートにA1〜N1までのセルに数値が入っていて、その中のの数値の文字を結合して
A1に出力する方法を考えているのですが、良い方法は無いでしょうか?
マクロの記録でしのごうと思ったのですが、うまくいきませんでした。
895デフォルトの名無しさん:2006/11/06(月) 13:30:08
sub AddCell()
Dim intCell as integer , strOut as string
For intCell = 1 to 14
 strOut = strOut & cells(1,intCell).value
Next intCell
cells(1,1).vallue=strOut
end sub
こういう事でいいのかな?
896デフォルトの名無しさん:2006/11/06(月) 14:58:29
ありがとうございます。
求められていた動作をしました。
897895:2006/11/06(月) 17:23:18
....よくよく考えてみたらワークシート上で済む問題じゃないのか?
898デフォルトの名無しさん:2006/11/06(月) 22:59:56
済まないでしょ。
計算対象になってるA1セルに出力すんだから。
899デフォルトの名無しさん:2006/11/07(火) 22:35:23
ExcelのVBAにおいて、A列にのみデータを持つ(sheet数は1枚の)ファイルを、text形式にて、両端に「"」をつけずに保存する方法を知りたいのですが、
何かよい方法はありませんか?

よろしくお願いします。
900デフォルトの名無しさん:2006/11/07(火) 22:44:33
ブックのメソッド使わないで、普通のテキスト出力を使って保存すればいい。
具体的なやり方はヘルプ見るなりググるなりして調べよう。
901デフォルトの名無しさん:2006/11/07(火) 22:52:23
和民氏ね
902899:2006/11/08(水) 00:15:36
>>900
調べた結果わかりました。

Write♯ステートメントを用いればよいのですね。
ありがとうございました。

しかし、openステートメントでファイルを開くので、ファイル名の一部に変数を参照して保存できないため、今度はそちらへの対処が必要となってしまいました。
どのような対処法があるでしょうか?
903デフォルトの名無しさん:2006/11/08(水) 00:17:33
>>902
open は変数使えるぞ?
904900:2006/11/08(水) 00:18:27
openステートメントでも、開くファイル名の一部に変数を参照することができました。
早とちりで書き込んでしまってすみません。

ありがとうございました。
905デフォルトの名無しさん:2006/11/08(水) 11:49:21
Word2003 のマクロ機能を網羅した書籍を紹介下さい。
906デフォルトの名無しさん:2006/11/08(水) 12:36:10
いっぱいあり過ぎて困っちゃうw
907905:2006/11/08(水) 12:59:48
>>906
読みやすさよりも情報量を優先して選んでクリスマス
908デフォルトの名無しさん:2006/11/08(水) 14:30:18
>>905
読みやすさより情報量という事なら
ttp://www.amazon.com/Learn-Word-2000-Document-Automation/dp/1556227515/
909905:2006/11/08(水) 14:56:58
>>908
ありがとう、でもできれば、和。
910デフォルトの名無しさん:2006/11/08(水) 17:43:23
>>909

情報後出しでは誰も答えてくれなくなるよ。
そういうヤツウザいので俺はパス。
911905:2006/11/08(水) 17:54:27
>>910
ごめんなさい。
912デフォルトの名無しさん:2006/11/08(水) 19:34:34
俺もパス
つーか情報の量を求めてるのに英語NGって何だよ。
自分から、扱える情報の量を減らしてるだけじゃんw
913デフォルトの名無しさん:2006/11/08(水) 21:35:07

UserForm1のImage1にビットマップを読み込んで,
座標ごとのRGBを調べることを考えてます。
Image1で,Pointが使えるなら,下のソースで
問題ないと思いますが,エクセルマクロでは
Pointが使えません。
何か,手がありましたら教えてください。

Image1.Picture = LoadPicture("aaa.bmp")

for i=1 to 100
for j=1 to 100
c = Image1.Point(i, j)
r = (c And &HFF)
g = (c And 65280) \ 256&
b = (c And &HFF0000) \ 65536
next j
next i
914905:2006/11/09(木) 09:55:04
>>912
なるほど、それはごもっともだと思いました。
それでは、和限定はなしでお願いします。

ほかによい本はございますか?
915905:2006/11/09(木) 10:01:44
916デフォルトの名無しさん:2006/11/09(木) 10:23:13
雑誌と比べりゃ高いけど、専門書としてはそれほど高くないだろ。
まあなんにしても、君自身が買う価値を見いだせなければ買わなければ良いだけだが
単に情報量だけではなく、君が納得する情報量で、君が納得できる価格の本を教えろとか言われても
そんな感覚的なことは他人にはわからないから、それなら自分で探せって話になるよ。

つまり、>>908で納得できるなら勝手に買え、納得できないとかワガママ言うなら
あとは自分で探せってことでこれ以上教えることは何もないってことになる。
917905:2006/11/09(木) 11:09:37
>>916
でもなぁ、中途半端なのかって、結局使えなかったら、
無駄だしなぁ。
918デフォルトの名無しさん:2006/11/09(木) 11:44:41
そう考えるのは自由だけど、何を紹介されたってその懸念は消えないよ。
紹介を信じて購入に踏み切れないなら、最初から他人の紹介など頼るなよ。
とにかくあとは自分で決定することだけなんだから、買うにしても買わないにしてもここで粘着する必要はないだろ。
919デフォルトの名無しさん:2006/11/09(木) 12:43:41
わかってねーな。
買ってみて使えなかったら次の買うだけだろ。
920905:2006/11/09(木) 12:49:15
>>919
金がねーんだよ、死ね死ね詐欺のさくらちゃんに寄付しちゃったから。
921905:2006/11/09(木) 12:49:47
>>918
で、あなたはどんなVBAの本を持っているの?
紹介しなくてもいいから、その本教えて。
922デフォルトの名無しさん:2006/11/09(木) 13:33:21
金ないんなら紹介しても買えないから意味無いな。
923デフォルトの名無しさん:2006/11/09(木) 13:34:22
意味無いのに教えても
無駄だしなぁ。
924デフォルトの名無しさん:2006/11/09(木) 16:52:20
(1)ページ番号を挿入し、(2)フッターを「1」から「第一部 1」に変更する、マクロを教えてください。
925デフォルトの名無しさん:2006/11/09(木) 19:33:01
>>924
基本だが、マクロの記録を覚えろ。そういう問題は全て解決する。
926デフォルトの名無しさん:2006/11/09(木) 22:03:53
>>924
黙って>>925に従え
エロエロ弄ってみれば、そのうち気持ちよくなってくるよ
そうやって覚えていくもんだから心配するな
927924:2006/11/10(金) 09:30:25
Selection.Sections(1).Footers(1).PageNumbers.Add PageNumberAlignment:= _
wdAlignPageNumberRight, FirstPage:=True

このね、(X)っていうのをどうにか取り除いた書式にしたいのです。
928デフォルトの名無しさん:2006/11/10(金) 09:34:59
すいません、マリオアドバンスが上手く動かないんですけど、
BIOSがないとやっぱダメなんでしょうか?
929デフォルトの名無しさん:2006/11/10(金) 10:58:02
>>927
何勘違いしてるの?
930924:2006/11/10(金) 14:15:10
>>929
勘違いとは・・?
931デフォルトの名無しさん:2006/11/10(金) 14:21:40
まあ気付いてないからこそ勘違いしてるんだろうし
932924:2006/11/10(金) 14:42:18
セクション区切りとか、フッターは複数存在し得るとかのこと?
933<sage>:2006/11/10(金) 14:52:28
みなさま、乙です。Outlook を VBA を使って、いろいろ試していますが、
分からないことがありますので、教えて下さい。

目的:
リッチエディト形式で来たメールを返信をする際に、元々の送り主が書いた
文書の書式やスタイルを崩さずに、自分が書いた文書を挿入する。

問題:
Body プロパティからメール本文を読み込んで、自分の返信内容をくっつけて、
Body にもどすと元々の本文に掛かっていた、書式がなくなってしまう。

コメント:
ようするに何をやろうとしているかというと、Outlook ではなく別のエディタ
で書いたメールの内容を返信に使いたいが、送り主の本文の書式を崩すこと
なく、Body を構成できないか?ということ


934デフォルトの名無しさん:2006/11/10(金) 15:54:31
おまえら、932に教えてやれば??
ググレいうのもわかるけど、せめて、ここ読んどけくらいのHP
みしてやってもいいんジャマイカ?
935デフォルトの名無しさん:2006/11/10(金) 16:25:39
>934
お前が教えてやれ。
俺?むしろ知りたい側だよ。
936934:2006/11/10(金) 17:00:52
>>935
早く教えてやれ!!っちゅーか、早く教えろ!
937デフォルトの名無しさん:2006/11/10(金) 19:50:07
>>927
ワードオブジェクトだな?ヘルプみるなり、省略して実行してみるなり、
してみたその結果が全てだ。
これでいいかかな?
938デフォルトの名無しさん:2006/11/12(日) 00:18:31
VBAのユーザーフォームで初期設定をした時に
デフォルトでクリップボードの文字を挿入したいのですが
下の通り打ち込むとエラー424オブジェクトが必要ですと出てしまいます。
始めたばかりのため、無智な質問で恐縮ですが
どこがどうおかしいのかどなたか御指摘頂けないでしょうか?
すみませんが宜しくお願い致します。

Private Sub UserForm_Initialize()

Dim ob
Set ob = New DataObject
ob.GetFromClipboard
MyClip = ob.GetText
UserForm.TextBox1.Value = MyClip
End Sub
939デフォルトの名無しさん:2006/11/12(日) 00:45:00
ユーザーフォームの名前を
UserForm に変更してるの?デフォでは
UserForm1 のはずだが。フォームモジュールに書く場合は、フォームオブジェクト省略出来るし。

つーか、このくらいなら知識なんか無くても普通にデバッグすれば、すぐに原因に行き着くだろ。
デバッグも出来ないのにコード書き始めるなんて、チェーンの付け方も知らずにノーマルタイヤで
雪国に乗り込むようなものだ。行き当たりばったりじゃなくて、最低限必要なことは先に覚えろ。

あと、それだとクリップボードにテキスト以外が入ってるとエラー出るから
GetFormatでテキストかどうか調べてからGetTextした方がいいな。
940デフォルトの名無しさん:2006/11/12(日) 16:50:14
>>939 ありがとうございます。 お陰さまで解決しました。
debug覚えてはいましたが、不注意で気づきませんでした。
941デフォルトの名無しさん:2006/11/13(月) 15:28:31
弊社の開発環境は、VC#2005EE Word2003 WindowsXPSp2です。
納品先の環境は、Word2000 WindowsXPSp2です。

弊社の環境で作成したWordオートメーションソフトウェアが、
納品先の環境で起動できません。

なぜでしょうか。
942デフォルトの名無しさん:2006/11/13(月) 17:06:52
Word2000とWord2003で、いろいろと非互換な部分があるからなあ。

ttp://www.projecta.co.jp/migration/download.html
でも読んでみたら。
943941:2006/11/13(月) 18:35:18
>>942
産休。
これは大変だ!
944デフォルトの名無しさん:2006/11/13(月) 19:10:45
Windows XP、Excel2002です。
A1:C5など、指定したセルの範囲内をダブルクリックしたときに、
入力フォームを表示するにはどうしたら良いのでしょうか?

A1などのセル単体の場合は
Private Sub Worksheet_BeforeDoubleClick(......
if Target.Address = "$A$1" Then
Form.show
Endif
End sub
とすれば良いのは分かるのですが、あるセルの範囲内であるかを
条件判断する方法が分かりません。

どなたか教えて下さい。お願いします。
945デフォルトの名無しさん:2006/11/13(月) 19:31:21
>>944
「範囲」が分散しているかどうかで話は変わるが、
文章を読むからに分散していないと仮定すると
if Target.Adress ...のところを
if 2<target.row or target.row<6
 if 3<target.column or target.column<9
   Form.Show
 end if
end if
ってな感じが一番分かりやすいかも
分散しているなら配列かな?
このスレの100レス以内に似ているものがあると思う。
946デフォルトの名無しさん:2006/11/13(月) 19:32:37
ちなみに上記の例だとC2:I6の間で反応するはずです
947デフォルトの名無しさん:2006/11/13(月) 20:07:55

If Not Intersect(Target, Range("A1:C5")) Is Nothing Then
  Form.show
End If

の方が解りやすいと思うが。
948デフォルトの名無しさん:2006/11/13(月) 20:13:01
>>947
素晴らしい
949944です:2006/11/13(月) 22:14:12
>>945
>>947
ありがとうございます!感激です!!
950デフォルトの名無しさん:2006/11/13(月) 22:17:46
>>947
パーフェクトだ,ウォルター。
だがこのコードはもう私のモノだ。私だけのモノだ。
951デフォルトの名無しさん:2006/11/14(火) 16:53:41
エクセルVBAでゲームつくる課題ができて○×ゲームやろうと思うんですが
みなさんならどんな点が重要だと思うか教えてくれませんか?

環境はWinXP Home Excel2003です。

個人的には、
4手目からは1手目から順に消えていく
とかできたら最高なんですが可能でしょうか?
952デフォルトの名無しさん:2006/11/14(火) 17:17:59
>>951
そのように組めば可
953デフォルトの名無しさん:2006/11/14(火) 21:21:54
>>951
バハムートラグーンなんかいいと思うんだ。
NTRも完備しているし。
954942:2006/11/16(木) 09:42:13
word2000とword2003の両方で一応は安全に作動するマクロの作成は、常套手段とかありますでしょうか。
955デフォルトの名無しさん:2006/11/16(木) 16:42:24
うん
956デフォルトの名無しさん:2006/11/16(木) 16:46:05
つうか納品先の環境に揃えて開発しようよ・・・
957デフォルトの名無しさん:2006/11/16(木) 17:02:11
>>954 word2003を買わせる。以上。
958デフォルトの名無しさん:2006/11/16(木) 20:44:13
出会ったな…この私に!
959デフォルトの名無しさん:2006/11/18(土) 12:41:10
セルが入力済みかどうかを調べるにはどうしたらいいでしょうか?
ただし読みやすさを考慮して、
以下のような最初に空白の場合のプログラムを書いて、後に入力済みの場合のプログラムを書く方法じゃなく
最初に入力済みの場合、後に空白の場合という順番で書きたい

if range(*).value = "" then
〜←ここが長いのでif節が長くなってしまい読みにくい


else
〜←ここは短い
end if
960デフォルトの名無しさん:2006/11/18(土) 12:52:48
>>959
?・・・
> if range(*).value = "" then

> if range(*).value <> "" then
・・・こう?
961デフォルトの名無しさん:2006/11/18(土) 14:36:43
>>960
すげぇ!できた マジサンクス!
不等号そーゆーふうに使えんだな
962デフォルトの名無しさん:2006/11/18(土) 16:28:40
ほかにもif not range(*).value = "" thenとかもすぐに思いつく。
963デフォルトの名無しさん:2006/11/18(土) 18:38:47
       ゲッターッ
    |┃三           `、 - 、_                 _,.  マ
    |┃三             `ヽ、~` - 、_  , -──、._,. - '  /
    |┃三               \    i' l´l l⌒l l`i   /
    |┃三                  \  |⊂⊃~⊂⊃|_ /    そんなことより石川賢が死んだんだが
    |┃三                  ⊂) ). ロ l⌒l ロ|)⊃
    |┃三                    ヽ.iコ `-´ ri/|  
    |┃三             , '⌒ ヽ_,. -/ヽ._,.旦,_ン. .|  , - 、
    |┃三          ,. - '~`ヽ      `ヽ、     :|, -~──'── 、_
    |┃三         >-─-、 |   , -─-、. `──── `       ヽ
    |┃三      ,  '    |::| |   |     |   ,───、 / ̄ ̄ヽ    i_.
964デフォルトの名無しさん:2006/11/18(土) 18:54:39
excel のvbaに関しての質問なんですが、
chdirステートメントによって、カレントフォルダをネットワーク内の他のPCのフォルダに設定したいのですがうまくいきません。
ChDir "\\PC名\・・・・・"
とやっているんですが。
上記が間違っているのでしょうか?それとも、この方法では仕様上不可能ということなんでしょうか?

ちなみに上記""内+ファイル名によって、openメソッドでファイルを開くことは出来ています。
965デフォルトの名無しさん:2006/11/18(土) 19:48:40
>>964
ネットワークだとできない気がした。APIのSetCurrentDirectoryあたり使うのが定番だったような・・
あいまいでスマンが
966デフォルトの名無しさん:2006/11/18(土) 19:51:45
>>962
notはそこにつけるのかorz
=の後につけて試してはみてた・・・

もう一個質問していいですか?

"〜.xls"という名前のファイルが開いてるかどうか調べるのはどうすればいいんでしょうか?
967デフォルトの名無しさん:2006/11/18(土) 20:02:45
>>966
一つの方法として、Application.Windowsコレクションをfor eachで
これでピンとこないなら調べれ。
コレクションをループさせるのはけっこう重要だから試行錯誤で身につけときな
968デフォルトの名無しさん:2006/11/18(土) 20:22:08
自己解決しました
>>967さん、早々とレスありがとうございました
やっぱfor eachでしたか

For Each wb In Workbooks
If wb.name = book2 Then
MsgBox "すでに" & book2 & "を開いてるよ!" & Chr(13) & _
"一旦閉じて!", _
vbExclamation
Exit Sub
Exit For
End If
Next wb
969デフォルトの名無しさん:2006/11/18(土) 21:30:09
>>965
その通りにしたら出来ました。
ありがとうございました。
970959:2006/11/20(月) 15:54:31
Wordに
FAFQR235GGT3GEGATAITII32T2AT
ATATWTATATATATAT23T23T23T2T2
2QWTHGQQPQOHYLKJSLGHIJIL4JTI
AFGAFGEWGAGAWEGA

このよう長い文字列があります。(実際もっと長いですが)
外部のファイルに書いてある数字のリストに沿って、この文字列の特定の位置を赤色なり青色なりで
装飾したいのです。
5
34
80

のように書いてあるファイルだとすると、5番目の文字から5文字を装飾、34番目の文字から5文字を
装飾していきたいのですがVBAだとどのように記述すればよいのでしょうか?
よろしくお願い致します。
971970:2006/11/20(月) 15:57:28
すみません。959ではありません。
972デフォルトの名無しさん:2006/11/20(月) 16:01:50
>>970
マクロの記録録ってちょこっと書き換えれば出来る。
973970:2006/11/20(月) 16:03:39
>>972
すみません。マクロの記録とは??
外部ファイルだと記録できないのでは?
974デフォルトの名無しさん:2006/11/20(月) 16:22:01
テキストの読込みくらいはいくらでもサンプルがあるから解るだろ。
記録を録るのは色付け部分。

読み込んだ値を変数に入れて置いて、記録を録ったものに被せればいい。
なんにしてもあーだこーだ言う前に、まずはやってみろ。
975デフォルトの名無しさん:2006/11/20(月) 16:59:18
excelに関しての質問です。

選択されているセルの列番号を数字でなくアルファベットで返す方法を探しています。
そのためにコードを書いてしまえばそれで終わりなのですが、すでに用意されているなら毎回それを書くのがすごく無意味なので・・・
エクセルVBAにそれが用意されているようなら教えていただけませんでしょうか。
976デフォルトの名無しさん:2006/11/20(月) 21:28:14
>>975
オリジナルな関数を用意するしかないと思うな。
列のアルファベットのみ知りたいの何故かな?
functionで書けば毎回まあそう手間はないが
977デフォルトの名無しさん:2006/11/20(月) 23:44:04
1からn行を全て選択したいんですが、

Rows("1:n").Select

としても型が一致しないっていうエラーが出てしまいます。
どうすれば選択できますか?
978デフォルトの名無しさん:2006/11/20(月) 23:49:23
文字列と変数を区別しろ
979デフォルトの名無しさん:2006/11/20(月) 23:58:52
例えば、A1〜A10に値が入っていてA11に値が入っていないとして、


Do until Cells(i,1).value = ""
 i = i + 1
Loop

とし、その後で

1からi行全て選択したいわけです。
どのように記述すればよいですか?
980デフォルトの名無しさん:2006/11/21(火) 00:01:30
文字列と変数を区別しろw
変数を""中に入れずに文字列としてくっつける。
981デフォルトの名無しさん:2006/11/21(火) 00:04:55
リテラル(?)を外すってことですか?

Rows(1:n)〜

にすると違うエラーが、、、(´つω;`)
982デフォルトの名無しさん:2006/11/21(火) 00:09:14
誰が文字列まで文字列扱いするなと言った?
区別しろと言ったんだ。文字列は文字列として、変数は変数として扱えと言ったんだ。
983デフォルトの名無しさん:2006/11/21(火) 00:14:11
う〜〜ん(´・ω・`)

Rows("1":n)も駄目ですよ、、、
Rows("1:11")ってのが出来るわけだから、
Rows("1":n")、、、?
こんな記述見たことねぇ(;´д`)
あぁ手元にPc無いのが残念です
984デフォルトの名無しさん:2006/11/21(火) 00:32:44
変数を文字列として扱うのが問題なんだから、
変数の内容を文字列に変えてから、外側の文字列と連結しろよ。

文字列の連結は知ってるか?

"文字列1" & "文字列2"ってヤツだ。

変数の内容を文字列にする関数は知ってるか。str(変数)だ

この関数、こういう使い方の時にはちょっと問題があって、
数値を文字列にするとき、先頭の一文字を符号用に予約してしまう。
負の数ならマイナス、正の数ならスペース(空白)だな。
だから、符号を除去する必要があるわけ。
文字列の先頭から2文字目以降を得る。には、mid関数を使え。

最終的には、

Rows("1:" & mid( str( n ), 2 ) ) かな。
985デフォルトの名無しさん:2006/11/21(火) 00:43:07
> この関数、こういう使い方の時にはちょっと問題があって、
問題ではなく利点だ。そういう仕様が不都合な場合はCStr関数使えば良い。
Str関数を使うのは、スペースが確保された方が都合が良いときだけなので
Str関数を使う上でスペースが入ることが問題になることはあり得ない。

それとVB・VBA言語は文字列型変数への代入や、&演算(連結)を行うと、自動で文字列変換を行う。
Debug.Print TypeName(1 & 1)
986デフォルトの名無しさん:2006/11/21(火) 07:44:25
>>984ー985さん

非常にわかりやすい説明ありがとうございました。
全く思いもよらない方法でした(´・ω・`)勉強しなおします
987デフォルトの名無しさん:2006/11/22(水) 19:46:21
A1セルに「あいうえお」
A2セルに「かきくけこ」と入力してあって、A1セルをクリックすると
B1セルに「あいうえお」
A2をクリックすると
B1セルに「かきくけこ」と入力するような
マクロを考えています

Excel2002使用しています

いまは、ダブるクリックすると起動する
プロシージャで対応していますが、
ワンクリックで行いたいのでよろしくお願いします
988デフォルトの名無しさん:2006/11/22(水) 20:22:21
989デフォルトの名無しさん:2006/11/22(水) 23:05:36
http://www.vector.co.jp/soft/win95/util/se072729.html
作者の方へ

VisualBasicの学習者たちのためにソース公開してください
(公式サイトが消滅しているようなので、ここにカキコします)
((((;゚Д゚)
すばらしいソフトなので、ぜひともお願いします

990デフォルトの名無しさん:2006/11/22(水) 23:20:44
スレ違いなうえにマルチで、しかも発言内容自体もマナーをわきまえてないとは
ある意味スゴイですねw
991デフォルトの名無しさん:2006/11/22(水) 23:50:33
>987
>988のリンク先 >773 に加えて、
表示直後にB1セルをアクティベート(セレクト)したら、
773中に書かれてる問題の半分が解決するんじゃね?
992デフォルトの名無しさん:2006/11/23(木) 00:13:13
ExcelのVBAでDOM使ってXML書き出すプログラムを作ってます。
で、標準の文字コードがUnicodeのため、XMLファイルもUnicodeで出力されてしまいます。
これをShift-JISで出力したいのですがどうすればよいのでしょうか?
DOMリファレンスで見た限りメソッドにもそれらしいものは見当たらなかったのですが。。
993デフォルトの名無しさん:2006/11/23(木) 00:30:02
994デフォルトの名無しさん:2006/11/23(木) 00:55:39
マルチ必死だな。
995992:2006/11/23(木) 01:18:28
ども。すんませんでした。
996デフォルトの名無しさん:2006/11/23(木) 03:56:24
単精度浮動小数点数型 Single型って何なんですか?
これで定義した配列に数値を入れてセルに書き出すと数値が変わるんですが。
試しに
20061122
20061121
20061120
20061117
20061116
20061115
20061114
っていう数値を配列に入れて何も処理をせずにセルに書き出すと
20061122
20061120
20061120
20061116
20061116
20061116
20061114
こうなって出てきます、これは一体何が起こってるんでしょうか? すごく困ってます。
997デフォルトの名無しさん:2006/11/23(木) 04:23:28
>>996
単精度の仮数部は10進数だと6桁ぐらいしかない。(2進数で23桁)
それ以上の桁は記録できない。
998デフォルトの名無しさん:2006/11/23(木) 05:20:54
@
999デフォルトの名無しさん :2006/11/23(木) 14:01:46
999
1000デフォルトの名無しさん :2006/11/23(木) 14:07:50
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。