●EXCEL・VBAの教えてスレ Part2●

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
・まじめにExcelの機能を追及してみようと思う奇特なひと
・スキルがないのに無理やりVBAの仕事を押し付けられた普通のひと
・VBAなんていまさらやりたくないのに業務で仕方なく使っているひと
・とにかく漏れにこんな仕事まわすなと怒っているひと
そんなM$大好きなひとからアンチM$なひとたちまで幅広くカバーするスレです

OOoのCalcの質問もOKです

前スレ
http://pc10.2ch.net/test/read.cgi/tech/1054356121/
2デフォルトの名無しさん:2007/01/09(火) 11:16:39

前スレの
http://pc10.2ch.net/test/read.cgi/tech/1054356121/942

>942 :デフォルトの名無しさん :2007/01/05(金) 11:14:02
>単発質問スレなのに、何故か質問スレと勘違いした奴等が迷い込んできてるだけ
>もうすぐ1000だし、単発質問駄スレの次スレを意気揚々と立てちゃうバカも居ないだろうから
>もうちょっとで消えるさ

に触発されたので勃てた。

今は反省している。
3デフォルトの名無しさん:2007/01/09(火) 12:32:18
          ヽ / /⌒\
         /ヽヽ|/⌒\ii|\
       / /ヾゞ///\\|
       |/   |;;;;;;|/ハ \|
             |;;;;//⌒ヽ
             |;/( ^ω^) >>1おっおっおっ乙枯ー
.           |{ ∪  ∪
             |;;ヾ.,____,ノ
             |;;; |
             |;;;;;|
             |;;;;;|
4どうかご慈悲を:2007/01/09(火) 17:29:47
dσv/dx +4(kσvtanφ+Cw)/D=γω^2*(Ro+x)

変数はxとσvでこれらをExcelVBAによって倍精度ルンゲクッタ法で解くプログラムはどのようにしたらいいですか?以下の修正部分を教えてください。お願いします。物性値の依存性は無視してプログラムとしてどう修正すればよいか教えてください。
Sub 円筒部()
'Diff. Eq: F(X,Y)= ω^2*(Ro+X)*649.96*Y^0.0959-0.1*(1.1*(1-SIN(38.727*Y^(-0.0204)))*Y *TAN(28.638* Y ^(-0.04))+0.239* Y ^0.5389)
'READ INITAIAL CONDITIONS
X = Cells(4, 1).Value: Y = Cells(4, 2).Value
H = Cells(4, 3).Value: N = Cells(4, 4).Value
L = Cells(4, 5).Value: ω = Cells(4, 6).Value
Ro = Cells(4, 7).Value '
For I = 0 To N
Cells(I + 7, 2).Value = X
Cells(I + 7, 3).Value = Y
K1 = H * (ω ^ 2 * (Ro + X) * 649.96 * Y ^ 0.0959 - 0.1 * (1.1 * (1 - Sin(38.727 * Y ^ (-0.0204))) * Y * Tan(28.638 * Y ^ (-0.04)) + 0.239 * Y ^ 0.5389))
K2 = H * (ω ^ 2 * (Ro + X) * 649.96 * (Y + K1 / 2) ^ 0.0959 - 0.1 * (1.1 * (1 - Sin(38.727 * (Y + K1 / 2) ^ (-0.0204))) * (Y + K1 / 2) * Tan(28.638 * (Y + K1 / 2) ^ (-0.04)) + 0.239 * (Y + K1 / 2) ^ 0.5389))
K3 = H * (ω ^ 2 * (Ro + X) * 649.96 * (Y + K2 / 2) ^ 0.0959 - 0.1 * (1.1 * (1 - Sin(38.727 * (Y + K2 / 2) ^ (-0.0204))) * (Y + K2 / 2) * Tan(28.638 * (Y + K2 / 2) ^ (-0.04)) + 0.239 * (Y + K2 / 2) ^ 0.5389))
K4 = H * (ω ^ 2 * (Ro + X) * 649.96 * (Y + K3) ^ 0.0959 - 0.1 * (1.1 * (1 - Sin(38.727 * (Y + K3) ^ (-0.0204))) * (Y + K3) * Tan(28.638 * (Y + K3) ^ (-0.04)) + 0.239 * (Y + K3) ^ 0.5389))

X = X + H
Y = Y + (K1 + 2 * (K2 + K3) + K4) / 6
Next I

End Sub
5どうかご慈悲を:2007/01/09(火) 17:31:35

dσv/d(x−L) +2(Kσvtanα+2Cw)/{D-2(x−L)tanα}=γω^2*(Ro+x)
同様にこちらでは上に準じてどうすればよいでしょうか?
6デフォルトの名無しさん:2007/01/09(火) 20:27:08
WordVBAに関する質問です(WordにはVBAスレが無いようなので)

ExcelとWordの両方でファイルを開く・新規作成時に
ある処理hogeを行うようにしたいと考えています。
Excelではアドインファイル(xls)として保存し、XLStartフォルダに置いとけばOKでした。

WORDではテンプレートファイル(dot)を作成し、Startupにおいて試行錯誤してみましたが
起動・ドキュメントを開く・新規作成するのイベントが拾えませんでした。
作成手順等のご指導お願いします。


以下は、Excelのコードです。
Private WithEvents m_App As Application

Private Sub Workbook_Open()
Set m_App = Application
End Sub

Private Sub m_App_NewWorkbook(ByVal Wb As Workbook)
call hoge()
End Sub

Private Sub m_App_WorkbookOpen(ByVal Wb As Workbook)
call hoge()
End Sub
7デフォルトの名無しさん:2007/01/10(水) 00:13:05
関数全部載ってる本ない?

よくあるだろ、「よく使う関数だけしか載ってない」のが。


そうじゃないんだよ、俺がほしいのは辞書のごとき参考書なの!!


勝手に取捨選択するな、使える関数や命令全部見せろっつの!!
ショー・ミーダ・関数
だっつうの!!!!!!
8デフォルトの名無しさん:2007/01/10(水) 04:10:45
っ MSDN
9デフォルトの名無しさん:2007/01/10(水) 14:42:25
>>7
付属ヘルプに全部載ってるよ。
10名無し:2007/01/10(水) 15:56:07
すみません、excelのVBAでマクロを作っているのですが

まず、数値の入った表があります

その表の行を組み替えてできる表をみつけるマクロを作っているのですがまったくできる気配がありません

申し訳ないのですが助けていただけませんか??



1 0
0 1

の場合で2行2列の表を見つける

1 0  1 0  0 1  0 1
1 0  0 1  1 0  0 1

の4つできます

この例では1行目は10、2行目は01で出来ているのでこれの組み替えでできるのは4つになります
11名無し:2007/01/10(水) 15:57:34
先ほどの例

1 0
0 1

の場合で3行2列の表を見つける

1 0  1 0  1 0  0 1  1 0  0 1  0 1  0 1
1 0  1 0  0 1  1 0  0 1  1 0  0 1  0 1
1 0  0 1  1 0  1 0  0 1  0 1  1 0  0 1

のようになります

わかりにくい説明なのですがよろしくお願いします
12デフォルトの名無しさん:2007/01/11(木) 07:25:18
silver-mealをvbaで書きたいのですが
プログラムができません。
どなたか教えてください!!!!
よろしくお願いします。

Compute
Calclulate THC(k) which is the actual comulative inventory-holding cost for the first k period if d(k) is ordered at the beginning of the first period.
Compute TC(k)=THC(k)+C0.
Find k*=min{k:TH(k)/k ≦ TC(k+1)/(k+1)}.
Renumber the period numbers and repeat from 1 until all N periods are covered.
Total Cost =$1260

week 1 2 3 4 5 6 7 8
demand 20 20 30 40 140 360 500 540
order 70 0 0 180 0 360 500 540
ending inbentory 50 30 0 40 0 0 0 0
13デフォルトの名無しさん:2007/01/11(木) 12:34:40
シート開いた瞬間に文字入力ボックスを自動で発生させたいときはどうすればいいのですか


普通にやると、どこかのセルをダボークリッキンとかすることがトリガーになるじゃないですか
そういうことを何もせずとも出したい。
14デフォルトの名無しさん:2007/01/11(木) 18:04:39



Excel VBAに関する質問はここで↓

Excel総合相談所 52
http://pc10.2ch.net/test/read.cgi/bsoft/1167923180/





VBAとして実行するとしても、Excelの操作に関係ない場合はここで↓

VBプログラマ質問スレ(6.0以前) Part50
http://pc10.2ch.net/test/read.cgi/tech/1161517193/





回答が要らないネタの場合はここで↓

●EXCEL・VBAの教えてスレ Part2●
http://pc10.2ch.net/test/read.cgi/tech/1168308855/


15どうかご慈悲を:2007/01/11(木) 18:27:01
dσv/dx +4(kσvtanφ+Cw)/D=γω^2*(Ro+x)
dσv/d(x−L) +2(Kσvtanα+2Cw)/{D-2(x−L)tanα}=γω^2*(Ro+x)
解析的には解けないのでルンゲクッタ法で解きます。
初期条件は(1)がx=0、σv=σ₀、γ=γ₀
     (2)のσv、γはx=Lにおける(1)の解
これのEXCEL VBAプログラムをお願いします。
正直時間がないのでどうか今週中にお願いできませんでしょうか。自分ではにっちもさっちも行きません。
この先に進めないと本当に危ないんです。
16デフォルトの名無しさん:2007/01/11(木) 19:59:28
>>15
学校の宿題?
17デフォルトの名無しさん:2007/01/11(木) 22:17:56
おまえがそんな問題も解けずにそのまま先に進んでしまう方が危ないと思う
18デフォルトの名無しさん:2007/01/11(木) 22:24:07
Excelの命令集 -> ヘルプで完璧

OpenOffice Calcの命令集


は?
19デフォルトの名無しさん:2007/01/12(金) 05:38:03
>>18
OpenOffice Calcの命令集 -> ソース見れば細かい仕様まで確認できて超完璧
20デフォルトの名無しさん:2007/01/13(土) 03:25:55
C#出来たらVBいらん気がする
VBAもC#のどっちか選択で書ければいいのに・・・・
21デフォルトの名無しさん:2007/01/13(土) 22:49:19
ヤフーのサイトを使って
セルに名入力された名称から株や証券のコードを検索、取得したい
データ取得のwebクエリ使うとなぜか関係ないコードを取得してしまう
vbaを使ってhtmlをexcelで開いてそこからコードを引っ張ろうと思う
shift-jis→url文字列(euc)の変換は上手くいってるのだが
Workbooks.Open FileName:=f_name
の形式で開くと文字化けしてしまう(urlに渡している文字列が)
楽天はOKだったけどミツウロコはミツウ・然ってなっちまう

f_nameの文字列をコピーして
ブラウザのアドレスバーに入力すると
正常に検索結果画面が得られる

助けて〜
2221:2007/01/13(土) 23:35:12
age

ttp://quote.yahoo.co.jp/l?s=名称
でその名称を含んだコードが取得できる

webクエリの方法かopenする方法
ご存知の方、教えてください
23デフォルトの名無しさん:2007/01/14(日) 00:53:01
excel VBAでシート上のテキストボックスを全部取得したいのですけど、
worksheets.shapes(i).textboxes
で i で ループさせるとどうしてもあるインデックスだけ
エラーになってしまいます。

何が考えられますか?
24デフォルトの名無しさん:2007/01/14(日) 02:25:28
HasTextFrameプロパティ?
25デフォルトの名無しさん:2007/01/14(日) 12:56:30
こんにちわ。
for文なんですが、たとえば
for i = 2 to 3 and 5
for j = 1 to 3
strAns(j)= cells(1,i).value
next
next
で、2,3,5がA,B,Cだとして、strAnsにA+B+Cを表示させたいのですが出来ないんです
2,3,5が数値なら出来るのですが、どなたか助けてください。
26デフォルトの名無しさん:2007/01/14(日) 14:01:32
cells(1,1)
range("A1")
range(cells(1,1))

は同じセルを指す
27デフォルトの名無しさん:2007/01/14(日) 14:37:04
>25
文字列を連結するときには”+”じゃなく”&”を使うって事は理解できてるのかな。
28デフォルトの名無しさん:2007/01/14(日) 17:29:22
>>25
はい。+1は。
表示させたいのは”ABC"なんです。
29デフォルトの名無しさん:2007/01/14(日) 17:31:44
>>25
書き込みまちがえました
&を理解してませんでした。
30デフォルトの名無しさん:2007/01/14(日) 17:49:15
&を使ったら表示できた

安堵する

by 安藤

と思ったらアンドゥしてしまいました

ヌあんだと
31デフォルトの名無しさん:2007/01/15(月) 01:22:31
>24
ありがとう。そんなのがあったんですね。
チェックせずに回してた。
32デフォルトの名無しさん:2007/01/15(月) 20:31:23
>>31
excelにはない罠
33デフォルトの名無しさん:2007/01/16(火) 00:50:35
0から10までの偶数の合計を表示させるには
どうしたらいいかわかる人いますか?


Sub 合計()
Dim intcount As Integer
Dim inttotal As Integer
For intcount = 0 To 10 Step 2
MsgBox intcount

Next
End Sub

これだと0から10までの偶数が並べられるだけで足されません。
34デフォルトの名無しさん:2007/01/16(火) 04:25:46
Sub 合計()
  Dim lngCount As Long
  Dim lngTotal As Long

  For lngCount = 0 To 10
    If (lngCount Mod 2) = 0 Then
      lngTotal = lngTotal + lngCount
    End If
  Next lngCount
  MsgBox lngTotal
End Sub
35デフォルトの名無しさん:2007/01/16(火) 10:05:07
こんにちは。質問させてぐださい。
アンマネージのC++で作成したDLLを呼び出したいのですが、
VBAでプロトタイプ 宣言する時に、DLLのパスを指定しますよね。
普通、絶対パスか環境変数でPATHの通っているところにDLLを置きますが、
このパスをエクセルファイルを基準に相対パスで指定したいのですがなかなか上手くいきません…。
そもそもこれって可能なのでしょうか?
あともう一つ、VBAの参照設定に参照したいDLLを登録しても、結局絶対パスにしなければいけないのは変わらないですよね…。

やりたいことを要すると、
エクセルファイルと同じディレクトリにDLLを置いていれば、
どこにそれらを置いても動作してくれるようにしたいのです。

VBAを動作させる環境はEXCEL2000です。
変なこと言ってるかもしれませんがよろしくお願いします…。
36デフォルトの名無しさん:2007/01/16(火) 10:20:35
ブックのパスを取得する方法も知らないの?
3735:2007/01/16(火) 10:35:20
>>36
回答ありがとうございマッスル
VBAのコードを実行させたときにブックのパスを取得する方法はわかるんですが、
プロトタイプ宣言時にブックのパスって取得できるんでしょうか?
38デフォルトの名無しさん:2007/01/16(火) 10:54:07
うん
まぁがんばれ
3935:2007/01/16(火) 11:34:41
Private Declare Function TestSub(ByVal InputPath As String) Lib "Test.dll" As Integer

で、TestSubを呼び出す前に

ChDrive ActiveWorkbook.Path
ChDir ActiveWorkbook.Path

をして

TestSub("test")

で行けました。
ありがとうございました。
40デフォルトの名無しさん:2007/01/16(火) 19:17:49
For i to 〜〜 Next で、1つの行のセルの値をひとつずつ取得して変数に代入したいのですが、
Forで使っている i をセルの位置を指定する数字として使用するにはどうすればいいのでしょうか?

(変数)=Range("A"i).Value や
(変数)=Cells(i , 2).Value と試してみたのですがダメでした。
41デフォルトの名無しさん:2007/01/16(火) 19:29:40
> (変数)=Range("A"i).Value
は文法的に間違ってるから当然ダメだが、
> (変数)=Cells(i , 2).Value
はB列のi行を取得できるはずだが。

ダメならちゃんとブック、シートも指定してみろ。
それらを表略した場合の動作は、コードを書いたモジュールによって異なるからな。
4240:2007/01/16(火) 19:45:06
>>41
レスありがとうございます。
やはり Cells(i,2).Value でもエラーが出ました。一応プログラムを載せてみます。
Sub count256()

Dim i As Integer
Dim a As Integer
Dim b As Integer
Dim c As Integer

c = 0
For i = 2 To 1883
a = Cells(i, 3).Value
b = Cells(i, 4).Value
If a >= 256 Then
If b >= 256 Then
c = c + 1
End If
End If
Next i

Cells(7, 1).Fomula = c

End Sub

ブックとシートの指定はどこでやればいいのでしょうか?
4340:2007/01/16(火) 20:07:03
すいません、ただたんに変数宣言でInteger と Double を間違えているだけのようです。
エラーがセル指定のところだったので勘違いしていました・・・
44デフォルトの名無しさん:2007/01/16(火) 22:15:17
VBEをVBAから弄るためにはどうすればいいですか?
4545:2007/01/17(水) 16:33:10
EXCEL-VBAのマクロでソルバーを起動、計算させるコードを書こうと思っています。
(Microsoft Excel 2000)
「参照設定」で「solver.xls」を読み込んだ後、プロジェクトウィンドウ欄に「solver.xla」
が出てきたのでダブルクリックしたのですが、「パスワードを入力してください」というメッセージが
出てきてコードを表示できません。
もともとここをいじらずにVBAプロジェクト上でソルバー起動のコードを書くのでしょうか?
教えてください。

46デフォルトの名無しさん:2007/01/17(水) 16:47:52
標準で付いてくるソルバーはワークシート上で使うものであって
VBAで使うものじゃないからな。当然コードは非公開。
4745:2007/01/17(水) 19:05:33
>>45
なるほど
プロジェクト上でフツーにコード書いたらソルバー動かせました。
ありがとうございました。
48デフォルトの名無しさん:2007/01/19(金) 15:50:11
どなたかバブルソートのプログラムを教えて頂けないでしょうか?
(例えば5つの数字を小さい順に並べ替えるというもの)
49デフォルトの名無しさん:2007/01/19(金) 16:06:29
>>48
Web上にサンプルコードが転がってるだろ
50デフォルトの名無しさん:2007/01/19(金) 16:18:56
Visual Basicで出力結果をExcelで表示させるプログラムを教えて下さい。
51デフォルトの名無しさん:2007/01/19(金) 16:21:57
>>50
VBプログラマ質問スレ(6.0以前) Part50
http://pc10.2ch.net/test/read.cgi/tech/1161517193/
52デフォルトの名無しさん:2007/01/20(土) 12:32:43
どっかの宿題スレで見たぞ
マルチじゃないのか?
53デフォルトの名無しさん:2007/01/21(日) 23:18:46
コンボボックスに複数のセル範囲の値をリスト表示させるには
どうしたらいいの?
ListFillRangeプロパティに指定しても受け付けてくれない。
54デフォルトの名無しさん:2007/01/21(日) 23:37:48
>>53
AddItemで入れてきゃいいじゃん。
コンボボックスってのは元々コードでアイテムを設定するものだから。
55エクセル楽しい♪:2007/01/22(月) 01:22:42
ExcelVBAでWindowsMediaPlayer9を制御したいのですが、命令がわかりません。
おわかりになる方はお教えいただければ幸いです。

◆やりたいこと
ユーザーフォームのテキストボックスにテキストを入力して、
「画像表示」ボタンを押すと、テキストに対応する動画像が表示される
ようにしたい。

◆困っていること
ユーザーフォーム上でテキストを入力して、「画像表示」ボタンを押した後、
さらに、同じくユーザーフォーム上のWindowsMediaPlayerの画面の「再生」
ボタンを押さないと再生できない。
「画像表示」ボタンを押せば再生できるようにしたい。

◆状態
ユーザーフォーム上に、「ツール」→「その他のコントロール」で
WindowsMediaPlayerを埋め込んでいます。
そして、フォームのコードを下記のように書いています。
Private Sub cbGazouhyouji_Click()
  〜中略〜
With main.WindowsMediaPlayer
.URL = "C:\XXXXXX\" & XXXX & ".MOV" ←ここまでは正常に動く
'.status = "再生中"        ←ここが違っているようです
End With
  中略
End Sub

◆条件
ExcelVBAだけでできることが希望です。他にツールや高度な技術が必要な
場合は、できないということで結構です。
56デフォルトの名無しさん:2007/01/22(月) 03:39:32
無限ループになったらどうすればいいですか?
タスクマネージャで終了させたらコードが全部
57デフォルトの名無しさん:2007/01/22(月) 03:45:55
無限ループさせなきゃいいだべさ
保存してから実行すればいいだべさ
58デフォルトの名無しさん:2007/01/22(月) 04:25:20
Escキー押してみるといいだよ
59デフォルトの名無しさん:2007/01/22(月) 04:49:47
Ctrl+Break
60デフォルトの名無しさん:2007/01/22(月) 16:33:48
ボンボボックスってなんですか。
61デフォルトの名無しさん:2007/01/22(月) 17:07:51
>>55
スレ違い
62デフォルトの名無しさん:2007/01/23(火) 08:53:19
すいません画像の色情報に関して質問なんですが

今はApplication.CommandBars("Picture").Controls.Item(12).Executeを出して
手動で透明にしてから
色情報 = Selection.ShapeRange.PictureFormat.TransparencyColor
を出しています。

これを自動で透明にしたいのですがどうやればいいのでしょうか?
63デフォルトの名無しさん:2007/01/23(火) 09:26:33
>>62
普通に
64デフォルトの名無しさん:2007/01/23(火) 18:46:06
>>63
Win32APIのGetPixelで解決しました。ありがとうございました。
65デフォルトの名無しさん:2007/01/24(水) 01:02:18
初心者すぎる質問ですが;
セルの数値を +1 するようなマクロを、マクロボタンに登録して、マクロボタンをクリック
する度に、セルの数値を増加させるというようなマクロってどう書けばいいの?
66デフォルトの名無しさん:2007/01/24(水) 01:11:42
>>65
マクロボタン作って

Private Sub CommandButton1_Click()

Cells(1, 1) = Cells(1, 1) + 1

End Sub

でおk
67デフォルトの名無しさん:2007/01/24(水) 01:20:06
できました
ありがd
68デフォルトの名無しさん:2007/01/24(水) 11:49:50
ExcelVBAで、TextBoxの中にある文字列をShift+Enterで改行した時、
TextBox内の上の行と下の行との間隔を設定する方法、ご存じの方おられませんか?
69デフォルトの名無しさん:2007/01/24(水) 11:56:52
>>68
それはTextBoxの領分ではなくRichTextBoxの領分だ
ちゃんと目的にあったコントロールを使おう
70デフォルトの名無しさん:2007/01/24(水) 13:48:02
>>69
解答ありがとうございます。
早速調べてみたのですが、現在の環境WinXP・Excel2000(VBA6)では
Microsoft Rich Text Box Controlが無いようです(参照設定の中にありませんでした)

何か他の方法ないでしょうか?
お手数お掛けします
71デフォルトの名無しさん:2007/01/24(水) 14:13:15
>>70
「参照設定」ではなく「その他のコントロール」だぞ
いったい何を調べてるんだか┐(´ー`)┌

そこにも無ければ導入すればいいだけの話
72デフォルトの名無しさん:2007/01/24(水) 14:49:55
>>71
何度もすみません・・・orz

「その他のコントロール」が押せません
何か間違ってますか?
73デフォルトの名無しさん:2007/01/24(水) 14:54:18
当然ツールボックスを表示した状態じゃないと押せないけど
74デフォルトの名無しさん:2007/01/24(水) 15:00:18
なんか次は

RichTextBoxでの行間設定はどうやるんですか?

とか言い出しそうだな
先に言っておくが、そのくらい調べられない奴はVBA使うな
75デフォルトの名無しさん:2007/01/24(水) 15:01:18
>>73
フォームをわざと挿入し、ツールボックスを表示したところ
無事その他のコントロールが触れるようになり、RichTextBoxコントロールの追加に成功しました。

本当にありがとうございました!
76デフォルトの名無しさん:2007/01/24(水) 15:01:58
>>74
行間設定もきっちりできました、ありがとうございました
77デフォルトの名無しさん:2007/01/25(木) 20:44:26
すげー!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


今まで
「エクソーメァクーロ(英語は発音大事)なんか組めてもC++にゃかなわねえんだよ」
と思ってたわけだが、
マクロ組んでやると存外にも仕事場での受けがよい。
78デフォルトの名無しさん:2007/01/25(木) 20:47:40
=(A1,A2)
とかするじゃない

こげなもんば、大したことなかったい。
が、見てみい。
「ほー!!!!!!!!!!!!!!!!!!!!!!!!!! 便利なもんさ!!!!!!!!!!!!!!!!!」

とか喜んでくれよる。
こらすごか。
79デフォルトの名無しさん:2007/01/26(金) 06:41:08
数百個のチェックボックスを一列に配置したとき
for i= 〜to 〜文の中で「i」番目のチェックボックスの値を取得するのは
どうしたらいいんでしょうか?
例えば
for i = 1 to 300
if = 「i」番目のcheckbox= true then
cells(i,2).value=cells(i,2).value+1
end if
next i
というようにしたいんですが
ヘルプやらググルやら見てみたんですが
分かりませんでした
80デフォルトの名無しさん:2007/01/26(金) 07:47:17
>>79
VBならコントロール配列使うところだが、VBAのコントロールではコントロール配列に出来ないので、
連番名(標準のCheckBox1, CheckBox2, …で良い)にしておいてControlsコレクションを使う
Controls("CheckBox" & i)
イベントも取りたい場合はクラスで疑似コントロール配列を実装する

つーか、何百個ものチェックボックスを配置するインターフェイスを見直した方がいいと思うけどね
予測するに、ListBoxを
ListBox.MultiSelect = fmMultiSelectMulti
ListBox.ListStyle = fmListStyleOption
と、「複数選択可 & チェックボックス有り」で使えば済む話なんじゃないの?
ListBox.Selected(i)でチェック状況取得できるし
81デフォルトの名無しさん:2007/01/26(金) 23:26:09
テキストを読み込みたいんです。

123 123 123 123
123 123 123 133

みたいなのは Line #で読めたんですけど

123 123 132 123 123↑123 123 132 123 123↑・・・

こういうデータは読み込めません。↑は何なのか、わかりません。
改行されてないデータはどうしたら読み込めるんでしょう?

検索しようにも↑の記号の読み方がわかりません。お手上げです。
82デフォルトの名無しさん:2007/01/26(金) 23:40:22
>>81
> ↑は何なのか、わかりません。
お前は解るはずだ。というか調べる手段があるはずだ。
それが何なのかはバイナリエディタで見れば一目瞭然だからな

逆にこっちがわかんねーっつうの。
文字としての↑(81 AA)だってならわかるが、Line #で読めないってことは 81 AA では無いわけで
特殊文字の表現記号ならエディタによって表示が異なるので、お手上げです。
83デフォルトの名無しさん:2007/01/26(金) 23:45:40
↑は本当はもっと横につぶれたような形をしており

コピーしてペーストすると消えてしまう謎の文字です。

バイナリエディター・・・?

調べてみます。
8479:2007/01/27(土) 11:00:26
>>80
さっそくの回答ありがとうございます
ですがcontrols("checkbox"&i)ではエラーになりました(subまたはfunctionが見つかりません)
もしかしてワークシート上に直接配置したcheckboxだとダメですか?

実際には900行×20列の表(900人分顧客データみたいなもの)
から今回対象になる人を範囲でえらび(100番目から200番目等)
さらにその中から対象から外したい人を最左列に配置したチェックボックス
で選択して残った対象者だけで別の表を作成するというようなプログラムを組みたかった
のですが、リストボックスの方法だとちと選びづらいです
>>つーか、何百個ものチェックボックスを配置するインターフェイスを見直した方がいいと思うけどね
 おっしゃる通りですね(´・ω・`)

素直に左端に1か0を入力することで判別する方がいいかもです
チェックボックス900個も置いたらめちゃくちゃ重くなったし
 
 


85デフォルトの名無しさん:2007/01/27(土) 11:50:41
>>84
シート上ならOLEObjectsコレクションだ
objSheet.OLEObjects("CheckBox" & i).Object.Value

Shapesコレクションからも辿れるけどね
objSheet.Shapes("CheckBox" & i).OLEFormat.Object.Object.Value

> 素直に左端に1か0を入力することで判別する方がいいかもです
の方法でも、表示形式を [=0]"";[=1]"●" とかにすれば解りやすいし

' A列をダブルクリックしたらチェック反転
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  If Target.Column <> 1 Then Exit Sub
  Target.Value = 1 - Target.Value
  Cancel = True
End Sub

' A列を含む範囲を右クリックしたら、その範囲全てのチェック状態を、選択範囲の一番上を基準に反転
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
  If Target.Column <> 1 Then Exit Sub
  Target.Resize(, 1).Value = 1 - Target.Cells(1).Value
  Cancel = True
End Sub

などを使えば、マウスでチェック状態の切替が出来る
●の変わりに☐☑を使うことも可能
Range("A:A").NumberFormat = "[=0]""" & ChrW(9744) & """;[=1]""" & ChrW(9745) & """"
86デフォルトの名無しさん:2007/01/27(土) 15:05:41
>>81
何らかの制御コードだろ。そのテキストを作った香具師に聞けば?
#なんとなく、改行コードの問題な希ガス。
87デフォルトの名無しさん:2007/01/27(土) 16:18:50
VBAの命令の意味と
記述方法が書いてある辞典的なページってありませんか?

88デフォルトの名無しさん:2007/01/27(土) 16:43:58
>>87
付属のVBAヘルプ
89デフォルトの名無しさん:2007/01/28(日) 02:19:41
do Until xxxx <> vbnullstring
のときの
<>っていうのはどういういみですか

=とは違うの?
90デフォルトの名無しさん:2007/01/28(日) 02:23:31
>>89
91デフォルトの名無しさん:2007/01/28(日) 02:50:28
>>89
=とは逆の意味
92デフォルトの名無しさん:2007/01/28(日) 09:27:17
excelのVBEを開こうとすると、VBEを開けるどころかexcelそのものが閉じてしまいます。
ウィルススキャンをしたところウィルスに感染はしていませんでした。

OS:Windows2000でexcelはexcel2000です。ちなみにwordのVBEは普通に開けます。

どうすれば正常にVBEが開けるようになれば良いのか、よろしくお願いします。
93デフォルトの名無しさん:2007/01/28(日) 09:30:28

do Until xxxx <> vbnullstring

do While xxxx = vbnullstring

同じ意味と考えてもいいですか?
94デフォルトの名無しさん:2007/01/28(日) 09:51:59
>>92
とりあえずブックを全て閉じた状態で試していないならブックを全て閉じてからVBEを立ち上げろ
同じく、アドインも全て外した状態で試してないなら一度全て外せ
それでダメならExcel(Office)の再インストール
上書きインストールではなく一度アンインストールしてから再インストールね
それでもダメならOS再インストール

まさかこの板に来る奴が再インストール出来ないとか面倒とかは言わないだろ

>>93
結果は同じだけど意味は違う
9592:2007/01/28(日) 10:01:56
>>94
ご返信ありがとうございます!

一応Officeの再インストールは既に行いましたが、駄目でした。

ちなみにVBEのみの起動はどうすればよいのでしょうか?

やっぱりOSの再インストールしかないんでしょうかねぇ。。。
96デフォルトの名無しさん:2007/01/28(日) 11:28:10
>>95
まぁがんばれ
97デフォルトの名無しさん:2007/01/28(日) 14:31:36
EXCEL2000で
イベントプロージャー「テキストボックス名_Change」を作成したいのですが

図形作成→テキストボックスで
テキストボックスを作成したのですが

右クリックしてもコードの表示は出ません。(本には書いてあるのですが)
2000だと他の方法にしないといけないのですか


結果として
Private Sub TextBox1_Change()
をかくようにしたいのですが
98デフォルトの名無しさん:2007/01/28(日) 14:36:44
>>97
今2000で試したけど、ちゃんと出たよ。
99デフォルトの名無しさん:2007/01/28(日) 15:04:36
コントロールツールの方だと「プロパティ・コードの表示」がある
フォームコントロールの方だと「マクロの登録・コントロールの書式設定」がある

イベントが使えるのはコントロールツールの方
右クリックして「マクロの登録・コントロールの書式設定」が出るなら、間違った物使ってるだけ
「プロパティ・コードの表示」も「マクロの登録・コントロールの書式設定」も出ないならPCを窓から投(ry
100デフォルトの名無しさん:2007/01/28(日) 15:05:38
できましたあああ。ありがとうございます!
ですが最終的にこっちの方法を採用させていただきました。
>表示形式を [=0]"";[=1]"●" とかにすれば解りやすいし

> A列をダブルクリックしたらチェック反転
>Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
>  If Target.Column <> 1 Then Exit Sub
>  Target.Value = 1 - Target.Value
>  Cancel = True
>End Sub

大変有益なご教示大感謝です
10179:2007/01/28(日) 15:06:46
ミスッタ_| ̄|〇
上の100は>>85さんへのレスです
102デフォルトの名無しさん:2007/01/28(日) 15:10:48
>>98
>>99
できました
フォームコントロールの方で書いてましt
103102:2007/01/28(日) 15:11:19
ありがとうございました
104デフォルトの名無しさん:2007/01/28(日) 18:28:12
10583:2007/01/28(日) 19:38:04
矢印の正体はLFってやつでした。chr(10)とやらなんやら

なるほど・・・CR+LFじゃないとダメ・・・

まだ読み込めないけど、手がかりはつかめたんで頑張ってみます。
106デフォルトの名無しさん:2007/01/28(日) 21:47:19
2007ってデフォルトフォーマットではマクロは保存できないんだな、店頭デモ機で試してみたんだが
VBAは後方互換で残ってるだけなの?
107デフォルトの名無しさん:2007/01/29(月) 00:23:36
>>106
オプションで開発タブをリボンに表示するにチェックを入れると使えるよ
108デフォルトの名無しさん:2007/01/29(月) 15:41:15
べき算って
2の2乗=4
3の3乗=27ってことですか?
109デフォルトの名無しさん:2007/01/29(月) 16:32:45
冪乗とはいうけど冪算とは余り言わない希ガス。
110デフォルトの名無しさん:2007/01/29(月) 21:56:03
今ExcelのマクロはほとんどVBAになっちゃってるけど、ブックにシートを追加するときに
Excel4.0のマクロシートが残ってることがわかる。やってみたいけど、誰かマスターする
方法おしえてくれないかな?解説書は売り切れてるしネットでも見当たらない。せっかく
残ってる機能だから眠らせておくのは惜しい。
111デフォルトの名無しさん:2007/01/29(月) 22:29:47
2列のセルの文字列を一つにすることは可能?

セルA  セルB
桃     太郎    =桃太郎
112デフォルトの名無しさん:2007/01/29(月) 22:54:34
>>111
可能だ。=CONCATENATE("桃","太郎")とすればいい。
セルA=桃、セルB=太郎なら、=CONCATENATE(セルA,セルB)でもいい。
セルが3つ以上でもやり方は同じだ。
113デフォルトの名無しさん:2007/01/30(火) 00:00:45
>>112
それのどこがVBA?
このスレ的にはVBAで応えるべきなんじゃないのか?
114デフォルトの名無しさん:2007/01/30(火) 00:51:21
Word/VBAの教えてスレはどこ?
115デフォルトの名無しさん:2007/01/30(火) 00:53:40
ありがとうございます

116デフォルトの名無しさん:2007/01/30(火) 16:21:57
すみません、ちょっと教えて下さい

マクロで、指定したセルにチェックボックスを作ったり、削除したりするには
どう書けば良いのでしょう?
VBA駆け出しで、全く分かりませんorz
117デフォルトの名無しさん:2007/01/30(火) 18:12:08
>>116
マクロの記録を録ってみろ

その記録されたコードを見てわからなければお前にはまだ早い
精進して出直せってことで
118デフォルトの名無しさん:2007/01/30(火) 22:59:22
>>116
表示→ツールバー→VISUAL BASIX
出ないことを祈る
119デフォルトの名無しさん:2007/01/30(火) 23:05:19
>>111
>>112を転用で、
Application.WorksheetFunction.CONCATENATE(セルA,セルB)

VBA的に
セルA.value & セルB.value 又は セルA.value + セルB.value
&だと文字列+数値が可。+だと不可
CStr(数値) + 文字列だと文字列として結合

>116
作るのは>>117の言うとおり。
ぐぐるなら[OLEObject]もしくは[Shape]
削除はデザインモードじゃないときにやるとエクセルが壊れる。
デザインモードでなら.Deleteとか.Cutで消える。

中途半端だがかんべん。
120デフォルトの名無しさん:2007/01/30(火) 23:55:15
はじめまして、早速一つお聞きしたいことがあります。
Function関数において最終的に表示される文字列を、
「その関数を使ったセルとは別のセル」に表示させたいのですが
どのような式を打ち込めばよいでしょう?
121デフォルトの名無しさん:2007/01/31(水) 00:09:06
>>120
Sub abc()
Dim str As String
str = test
Worksheets("Sheet2").Range("A1").Value = str
End Sub

Function test() As String
test = "返り血"
End Function

こういうこと?
122デフォルトの名無しさん:2007/01/31(水) 00:37:35
ありがとうございます。まさかこんな早くに答えていただけるとは思いませんでしたので驚きました。
よろしければもう一つだけお聞きしたいのですが、任意のセルをそのつど入力し
そのセルに表示させたい場合はどうしたらよいでしょう?
123デフォルトの名無しさん:2007/01/31(水) 00:56:22
>>122
よくわからんのだけども、
任意のセル(入力するセル)の指定方法:
@クリック→任意のWorkSheetのマクロを開いて、マクロ書くスペースの左上にある
ちっちゃいコンボボックス的なやつの値を[WorkSheet]に設定、そのとなりのボックスの値を
[SelectionChange]に設定(ディフォルト)
したら、
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

End Sub
ができるから、ここに
Target.value = "返り血"
Targetは引数ね。ちなみにThisWorkBookのまくろで同じの作るとすべてのシートに適応される。
Aセルの値→
上と同じ感じで、左[WorkSheet]右[Change]に設定
Private Sub Worksheet_Change(ByVal Target As Range)

End Sub
ができるからここに、
If Target.Row = 1 And Target.Column = 1 Then
Range(Target.Value).Value = "返り血"
End If
A1のセルの値にB2とか入れるとそのセルに返り血って入る
弱点はセル以外の値を入れるとエラーになる。克服はできるはず、考えないけど。
Bユーザーフォーム→
ぐぐってちょ。

こんなもんで。
124デフォルトの名無しさん:2007/01/31(水) 01:01:51
いただいたヒントのおかげで何とかなりそうです。
稚拙な説明にもかかわらず丁寧に答えてくださり本当にありがとうございます。
125デフォルトの名無しさん:2007/01/31(水) 10:03:27
excelのvbaで松井証券へ自動ログインするプログラムを組んでいるのですが
下のプログラムの最後の objIE.document.frames("CT").document.All("kidouButton").Click で
たまにエラーが出ます。エラーの原因は何かわかりますでしょうか。
下記のプログラムは、松井証券へログインし、松井証券の会員ページから
ネットストックハイスピードというソフトウェアを起動するためのものです。

Declare Sub Sleep Lib "KERNEL32" (ByVal dwMilliseconds As Long)
sub 時間待ち()  'ページの読込が終わるまで待機するための処理。
Do Until objIE.Busy = False
Sleep (200) 'CPU負荷軽減のために0.2秒間隔でIEオブジェクトをチェック。
Loop
End sub

(つづく)
126デフォルトの名無しさん:2007/01/31(水) 10:05:56
(続き)

Sub netstock()
Set objIE = CreateObject("InternetExplorer.application")
objIE.Visible = True
objIE.Navigate "https://www.deal.matsui.co.jp/ITS/login/MemberLogin.jsp"
call 時間待ち

'松井証券サイトのフォームへ、ワークシートに書かれたIDやパスなどのデータを流し込む
  objIE.document.forms("form").clientCD.Value = Worksheets("松井証券へ自動ログイン").Range("C2").Value
objIE.document.forms("form").passwd.Value = Worksheets("松井証券へ自動ログイン").Range("C3").Value
objIE.document.forms("form").easyTradeFlg(0).Checked = True
objIE.document.forms("form").submit
call 時間待ち

'松井証券ログイン後、会員ページからソフトウェアを起動するためのページへ移動
   Set objFDOC = objIE.document.frames("LM").document
For n = 0 To objFDOC.Links.Length - 1
If objFDOC.Links(n).outerText = "ネットストック・ハイスピード" Then
objFDOC.Links(n).Click
Exit For
End If
Next n

  call 時間待ち

'ボタンを押してネットストックハイスピードを起動する
objIE.document.frames("CT").document.All("kidouButton").Click

End Sub
127デフォルトの名無しさん:2007/01/31(水) 14:47:31
セルAに入力した

Taka Toshi

という文字列を

taka_toshi

というように
小文字化と半角空白にアンダーバーを挿入して変換するようにしたいのですが
どうすればいいですか?
128デフォルトの名無しさん:2007/01/31(水) 15:21:21
Replaceで半角スペースを_に置換して
LCaseで小文字化すればいいだけじゃん
このくらいならワークシート関数でも出来るし
129デフォルトの名無しさん:2007/02/01(木) 22:29:54
>>125
理由はわからなそうだけども、
なんていうエラーがでてるのかはとても知りたいのでお願いします。

でも、もしかしたらもしかしたら、

Navigateで読み込み→
読み込みはじめるより先に Do Untilの条件へ行ってしまい
Sleepしない→
読み込まれる前にクリック

かも。
ループの前にSleepを入れてみてはいかかでしょう?

適当で申し訳ない。
130デフォルトの名無しさん:2007/02/01(木) 22:30:48
さらにごめん。

Navigateで読み込みじゃなくて、
クリックで画面変更だ。
131デフォルトの名無しさん:2007/02/01(木) 22:55:40
今日初めてExcelでマクロを作ろうとしてみました。

引数を2つ取る関数を作りたいのですが意味不明のエラーが出て
動きませんでした。

Public Sub Test()
Test2 (1, 2)
End Sub

Sub Test2(a As Integer, b As Integer)
MsgBox (a + b)
End Sub

引数を1つにすると動きます。
どこがおかしいのでしょうか?
132デフォルトの名無しさん:2007/02/01(木) 23:27:48
>>131
VBAは自分で作った関数を使う際、
引数にかっこをつけてはいかんのです。
ので、
Test2 1, 2
で。
133デフォルトの名無しさん:2007/02/01(木) 23:48:14
call
134デフォルトの名無しさん:2007/02/01(木) 23:53:32
こんばんわ。
質問です。

1  ○○  0:00     
2  ○○  1:00
3  ○○  2:00
4  ○○  3:00
5  ○○  4:00
6  ○○  5:00



25 ○○  0:00


49 ○○  0:00

73 ○○  0:00

という、一時間ピッチのデーターがあります。一年分くらい。
それを、毎正時だけ欲しいのです。2〜24、26〜48の行を白紙の行に
したいのですが、この説明で分かってくれるかたいますか?
ご指導ください。


135デフォルトの名無しさん:2007/02/02(金) 00:03:20
>>134
出力するシート名は?
136デフォルトの名無しさん:2007/02/02(金) 00:10:24
> VBAは自分で作った関数を使う際、
> 引数にかっこをつけてはいかんのです。
ハズレ

自作関数の場合ではなく、基本的にSub、Functionプロシージャ(メソッド)を呼ぶ場合、
戻り値を取る場合とCallで呼ぶ場合以外は()を付けない。MsgBox関数の場合だとこんな感じで使う。
[1] MsgBox "test", vbOkOnly
[2] Call MsgBox("test", vbOkOnly)
[3] ret = MsgBox("test", vbOKCancel)

自作関数の場合でも戻り値を取る場合とCallで呼ぶ場合は()付けなきゃダメだし
自作関数じゃなくても、[1]のように使うときは()付けてはいかんのです。
ややこしいのは、引数一つの関数の場合。
[4] Inc hoge
[5] Inc (hoge)
Sub Inc(Value As Long)
  Value = Value + 1
End Sub
[4]の方だと変数hogeが+1され、[5]の方だと変化しない。
引数一つの関数をCallを省略し引数に()を付けて呼ぶと、引数は値渡しになる。
基本的に参照渡し値渡しは呼び出される側で指定するので、[5]は殆ど使われない。
意味も知らずに間違って使ってる奴は居そうだけどな。
137デフォルトの名無しさん:2007/02/02(金) 00:13:03
>>135
潮位というシートで作業しています。
138デフォルトの名無しさん:2007/02/02(金) 00:21:04
>>136
サンクス。職場では恥かかんよう気をつけるよー。

>>137
Option Explicit
Option Base 1

Sub testTwo()
Dim rng As Range
Dim outRng As Range
Dim data() As Variant
Dim cnt As Long
Dim outCnt As Long
Set rng = ActiveSheet.Range("B1")
cnt = 1
Do While rng.Row <= 10
If rng.Value = "0:00" Then
ReDim Preserve data(cnt)
data(cnt) = rng.Offset(0, -1).Value
cnt = cnt + 1
End If
Set rng = rng.Offset(1)
Loop
Set outRng = ActiveWorkbook.Worksheets("潮位").Range("D1")
For outCnt = 1 To cnt - 1
outRng.Value = data(outCnt)
Set outRng = outRng.Offset(1)
Next
End Sub

とりあえずD列に出してみた。
別シートに出力の際は潮位のところをそのシート名に変更すればよし、あとそのとなりをA1にするとA列にでる。
139デフォルトの名無しさん:2007/02/02(金) 00:25:16
ごめん。

Do While rng.Row <= 10

Do While rng.Row <= 65500
あたりに変えといて。
ちなみに検索する行の最大数。

あと、なにも出力されないようなら、
if rng Value = "0:00" Then

0:00 の部分をセルに表示されてる値ではなくて、
その右上らへんにある本当の値に変えてみて。
140デフォルトの名無しさん:2007/02/02(金) 00:29:36
っていうか、
VBAの勉強中だからついVBAで答えてしまったけれども・・・。

セルB1をクリック(選択)
データ→フィルタ→オートフィルタ
B1に三角がでるのでクリック
0:00を選択

orz...
141デフォルトの名無しさん:2007/02/02(金) 00:37:36
>>140
ありがとうございます。
オートフィルにすると、行が詰まってしまうので、
行間は白紙のまま置いておきたいのですよ。

>0:00 の部分をセルに表示されてる値ではなくて、
その右上らへんにある本当の値に変えてみて。
VBAでは出力されないのですが、もう少し教えてもらえますか。
142デフォルトの名無しさん:2007/02/02(金) 00:39:30
ここで無限ループ使った回答したら、素人にはブラクラ並の攻撃かもしれない

と、ふと思った
143デフォルトの名無しさん:2007/02/02(金) 00:47:28
こっちのほうが安全じゃない?
my_Row= Range("a65536").End(xlUp).Row
for i = 1 to my_row
処理
next i
144デフォルトの名無しさん:2007/02/02(金) 00:48:48
そのままなら、こっちか。
my_Row= Range("a65536").End(xlUp).Row
Do While rng.Row <= my_row
145デフォルトの名無しさん:2007/02/02(金) 00:52:51
>>141
Option Explicit
Option Base 1

Sub testTwo()
'変数定義
Dim row As Long
row = 1
'正午のデータだけ取得
Do While row < 65500
If row Mod 24 <> 1 Then
ActiveSheet.Range(Cells(row, 1), Cells(row, 2)).ClearContents
End If
row = row + 1
Loop
End Sub

正午以外を消して空白を残す。
24行ごとに値があること前提だけども…。

手抜きでスマソ、そろそろ寝ようかと…。
146デフォルトの名無しさん:2007/02/02(金) 00:59:56
>141
追記。
一瞬止まるけども、処理が遅いだけなので。
>>143)方式で、
Do While row < 65500

Dim myRow as Long
myRow = Range("a65536").End(xlUp).Row
Do While row < myRow

にすると早くなりまする。

>>143
>>145
まったくその通りですな。
まだまだ良いやり方のテンプレみたいなのがぱっと浮かんでこないのよなぁ…。

>142
自分のテストでは無限ループしたいほうだいだけどね。


すみません放置します。
おやすみなさい。
147デフォルトの名無しさん:2007/02/02(金) 01:03:55
どうもでした。ペコリ。
148デフォルトの名無しさん:2007/02/02(金) 01:08:35
成功しました。重ねてペコリ。
これで寝れそうです。
149125-126:2007/02/02(金) 07:20:11
>>129-130
レスどうもです。
出ているエラーの件は、たまにしかエラーが出ないので
エラーの内容を良く覚えてないのですが
「サポートされてない」みたいなエラーだったと思います。

do until構文を使う前にもsleepしてみて
エラーが出るかどうか、しばらく様子を見てみます。
150デフォルトの名無しさん:2007/02/03(土) 01:28:07
ちょっと暇だったのでVisualBasicのヘルプ全部印刷してみた(両面)

ヘルプ最高だな
高い金出してリファレンス買うぐらいならヘルプ印刷しといたほうが幸せだと気付いた
つうか手元のリファレンス見たらヘルプ丸写しがあって萎えた
151デフォルトの名無しさん:2007/02/03(土) 22:06:07
そうか〜?
現実問題、リファレンスで一番重要なのは索引なのだけども
オブジェクト名やメソッド名とかは印刷したものをアルファベット順に並べればいいとしても・・・
その他は・・・
152デフォルトの名無しさん:2007/02/03(土) 23:11:21
すみません。Vista/Excel2007で
Application.Speech.Speak "日本語"
をやると、英語なら何の設定もせずに読み上げるんですが、
日本語は読み上げません。
2003では設定すれば「ツール」→「音声」→「[読み上げ]ツールバー」ででたツールバーも
表示させる方法もわからないのですが、
どなたか、お教えいだけないでしょうか。
153デフォルトの名無しさん:2007/02/04(日) 00:19:46
新しいものにすぐ飛びつく早漏の癖に
情報的な基盤の無いものを自力で使いこなしていく
スキルも無い奴ってのは一番厄介だな

初心者ならシェアが広がるまで我慢汁垂らしながら待ってろよ
154デフォルトの名無しさん:2007/02/04(日) 00:21:56
>>150
両面印刷コストが20円として、100ページで2000円になる。
1000ページなら2万だし買った方が安くないか?
155デフォルトの名無しさん:2007/02/04(日) 01:22:42
コンピュータを用いた授業をしようと思うんですが、
VBAを用いて中学校数学の何か面白い教材を作ることできないかな??
156デフォルトの名無しさん:2007/02/04(日) 01:31:07
>>155
あるセルに好きな数字を入れると別なセルに数字が自動的に表示されて
その計算方法を推理させるとか。
もちろん数字を変えていくことで推理可能な計算式を考えんといかんよ。
数字じゃなくて論理式でも面白い、ある言葉を入れると別な言葉に置き換えられるとか。
あなたのVBA習熟度がどのくらいか知らないけど。
157デフォルトの名無しさん:2007/02/04(日) 01:31:45
>>155
「面白い教材」を考えるのは教員の仕事。
お前が思いつけないなら、お前はその程度の教師ってことだ。

考えついた「面白い教材」の実現方法なら手助けしないこともないが
何が悲しくて教員でもないのにガキの嗜好に頭捻らにゃならんのだ?
158156:2007/02/04(日) 01:34:02
>>157
正直スマンかった・・・
159デフォルトの名無しさん:2007/02/04(日) 01:46:55
いや、そういう返答は無視でw
160156:2007/02/04(日) 01:55:35
いや、>>157は言い方はあれだけど正論
写真屋スレで「キャラ絵描くんだけどどんなキャラがいい?」って聞く奴はおかしいのと同じ

161デフォルトの名無しさん:2007/02/04(日) 02:13:03
言ってしまえば
> 「面白い教材」の実現方法
だって教師の仕事なのに、それなら手助けしてやるって
言ってる時点で十二分に親切だな。
162デフォルトの名無しさん:2007/02/04(日) 02:16:26
Excel2007ってVBAの基本的言語仕様は変わってないんでしょうか?

例えばVB6.0のIntegerが16Bitなのが
VS2005のVBだとIntegerが32Bitになってるみたいな
163155:2007/02/04(日) 02:45:37
私は数学教師ですが、VBAは全くといっていいほどの初心者です。
データから平均を出したり、総合得点を出して表示させるぐらいしか
できません。
実現方法よりもどういったことができるかがよくわかっていないのです。
VBAにかなり詳しい方々が集まっているようなので、ご意見を参考に
させていただきたかったのですが、予習をしてから出直してきます。
すいませんでした。





164デフォルトの名無しさん:2007/02/04(日) 03:08:23
>>163
藻前は本当に教師なのか?
数学の分からない厨房は数学をイメージできない
数値なんて表示させても糞の意味もない
パソコンで学習させるなら、イメージを表示させてやる方がいい
つまり、関数グラフとか図形を使いこなして表示させろってこった
165デフォルトの名無しさん:2007/02/04(日) 03:12:32
166デフォルトの名無しさん:2007/02/04(日) 04:52:17
>>163
エクセルVBAで色々できるよ。外部アプリケーション、例えばインターネットエクスプローラーの制御も出来るよ。
工夫すれば、それなりにエクセルVBAでゲームを作ることもできて
エクセルVBAで作られたゲームのサンプルプログラム集とかも発売されてるよ。
167デフォルトの名無しさん:2007/02/04(日) 04:59:10
つうかさ、パソコン関係って何が出来るかって聞いていたら全然先に進めんぞ
自分は何がしたいって目的が最初であって、それを実現するにはVBAを選択するとか
他のモノを選択するとかすべき
168デフォルトの名無しさん:2007/02/04(日) 11:04:19
パソコンクラブでも作ってマニアな中学生に教えてもらえ
学習曲線は残念だけど物好きな中学生には勝てん
先生側は「教育の技術」で中学生と勝負しろよ

ExcelVBAは開発環境と実行環境の距離が近くていい材料だと思うけどね
169デフォルトの名無しさん:2007/02/04(日) 11:47:54
>>163
子供が見て分かりやすいのは物理シミュレーション
やはり目で見て動くと分かりやすい。
普通に教科書レベルの加速度とか落下だけでも結構面白い物が作れる

ExcelでもShapeやUserFromの座標を指定できるわけで

日本のApple本社に学校の旅行で行った時に、
なんてソフトか忘れたけどBasic風の記述言語で

「初期値を設定してボール(カエルだったかも)をジャンプさせて、落ちてきたて跳ねる」

ってプログラムが課題だった
ついでに速度や高さも表示する

設定値を間違えると果てまで飛んで行ったりして面白かったが。

数学なら幾何系とか確率系とかも分かりやすいかも
170デフォルトの名無しさん:2007/02/04(日) 11:50:05
計算問題を自動で作って答えあわせをするコードとか
100マス計算とかできるんじゃない?
でもそういうなのはネットを探せばいくらでも出てくるような気がする。
171デフォルトの名無しさん:2007/02/04(日) 12:30:10
>>170
数学を図式化して理解しやすくするのは良いが

それは駄目だろ、餓鬼に頃は紙に文字を書いて計算しないと馬鹿になるぞ
172デフォルトの名無しさん:2007/02/04(日) 12:31:00
173デフォルトの名無しさん:2007/02/04(日) 14:19:00
あるExcelファイルを日付が変わったら自動起動させるようにするには、
どんな感じで実現したらよいのでしょうか・・?

日の定型処理をしているのですが、
忘れてしまう事が多々あるので自動化したいです。
174デフォルトの名無しさん:2007/02/04(日) 14:53:15
>>173
そんな曖昧な条件でどうしろと?
「あるExcelファイルを日付が変わったら自動起動」という条件だけなら
OnTimeで0:00にブックを開くプロシージャを呼ぶだけだが、実際にはOnTimeが使える
状況では無いだろうし、ブックを開くのも「日付が変わったら=0:00」では困るのでは?

条件はエスパー以外の第三者にも伝わるように、日本語できちんと書こう。
175デフォルトの名無しさん:2007/02/04(日) 15:00:57
多分タスクでOK。つまり、VBA云々ではなくWindowsの使い方の問題。
176デフォルトの名無しさん:2007/02/04(日) 16:00:52
excel4.0専用のスレが見当たらないのでここで失礼します。
excel4.0のマクロって最近のexcelでも当時と同じように記述できるの?
なくなったマクロ関数や文法の変更なんかはないのかな?

たとえば『=select(シート名!R[1]C[1])』と記述して実行すると、
目的のシートのアクティブセルではなくマクロシートのselect関数が
記述してあるセルから1行下で1列右のセルを選択してしまう。
これはexcel側の仕様変更によるものじゃないよね?
もし記述の間違いによるものだったら正しい書き方を教えて。
177173:2007/02/04(日) 19:26:01
>>174
すいません。今週末から勉強を始めたので理解が足りないかもしれません。
Webクエリを用いてあるHPの表データを取得し統計処理をしています。
統計処理はそのExcelファイルを起動すれば実行できるよう実装済。

そのHPの表データは00:10頃に日々更新されているので毎日実行したいです。
そこでこの時間がきたら自動的にExcelファイルを起動する方法は、
どうやるのかなと質問してみました。
よくウイルス等で特定の時間が来たら挙動するようなものもあるし、
出来ない事はないなだろうと。

実行条件は時間以外にも色々ありますがFlagや分岐をつけたりすれば、
何とかできるだろうという事で今回は質問しませんでした。

Googleで「VBA 自動起動」等と検索しても条件が悪いらしく、
上手く引っかからないのでキーワードだけでももらえればと思いました。
これ以上は上手く説明できません。ごめんなさい。

>>175
あっありがとうございます。
VBAではなくそんな方法だったんですね。
書き込み後の検索中にAccessで似たような質問にヒットした時、
APIでスケジュラーに・・なんて記述があったので、
関係あるのかと思っちゃいました。
178デフォルトの名無しさん:2007/02/04(日) 21:35:03
>>177
スタートボタンから、ヘルプとサポートをクリック、テキストボックスに at っていれてみ。
出てくるから
スレ違いな話になってしまうんでこれでやめるけど。
179デフォルトの名無しさん:2007/02/04(日) 22:14:27
誰か教えてください。
仕事で ある一定の条件を満たすレコードを足していくプログラムをかいたのですが、数字がおかしくなります。
例えば、足す数字が15.1 80.6 30.4となると出た数字が126.100015239みたいな数字になります。
これはなんでなんでしょうか?
180デフォルトの名無しさん:2007/02/04(日) 22:43:27
小数点の演算というのは、CPUの仕組み上誤差が出るものなのだ。

仕組みや理由についてはは、「浮動小数点 誤差」とかでググるとそれっぽい解説のされてるとこがでるのでそこで確認してください。


Excelのシート上で、その見た目をどうにかしたければ、セル書式の設定で小数桁数1桁だかなんだかにすればよいです。
181デフォルトの名無しさん:2007/02/04(日) 23:35:39
浮動小数点演算をIF文なんかで条件処理する場合
=つかっちゃ駄目なんだよなぁ
182デフォルトの名無しさん:2007/02/05(月) 01:29:53
基本的に割り算もだめですね
183デフォルトの名無しさん:2007/02/05(月) 08:09:20
整数値の割り算の場合は/でなく
¥(商) Mod(余り)を使えばなんとかなる
184デフォルトの名無しさん:2007/02/05(月) 10:48:46
いま正規表現の検索フォームを作ってます
検索対象をusedrangeで取得してfor eachでまわしてます。
これで動作は問題ないのですが、対象が多いと時間がかかってしまいます。

そこで、rng=usedrangeと配列に代入して高速化しようとして問題にぶちあたりました。

配列に代入されるのがValueっぽいので、
セルに10:00の様に時間や日付が入っている場合
longになるので検索文字が10などと一致しません。

usedrang.textとして代入すると空になってしまいます。
配列に代入された文字の表示形式を調べて変換することも考えたのですが、
現状と大差ない感じがします。

シート上に表示されている値をまとめて配列に代入する方法か代替案がありましたら
ご教授おねがいします。
185デフォルトの名無しさん:2007/02/05(月) 10:53:50
クエリー
186デフォルトの名無しさん:2007/02/05(月) 11:05:11
txt→CSV変換でなにか、いいサンプルコードないですか?

入力ファイル:oder.txt
出力ファイル:任意.csv
csvに出力する時、元のtxtから不要データの排除と任意条件での集計

VBAかVBSで出来そうと思いいろいろ本読んで見たけど
いかんせんCobolerなので、よくわかっとりません
187デフォルトの名無しさん:2007/02/05(月) 11:09:25
元のテキストファイルのフォーマットはどのようなものですか?
固定長?
188デフォルトの名無しさん:2007/02/05(月) 11:36:51
Public Sub TextToCSV(ByVal pInPath As String, ByVal pOutPath As String)
Const C_DELIM As String = "," '区切り文字
Dim s As String:Dim s2 As String:Dim ss() As String
Dim fnoIn As Long: Dim fnoOut As Long

'ファイル開く
fnoIn = FreeFile: Open pInPath For Input As #fnoIn
fnoOut = FreeFile: Open pOutPath For Output As #fnoOut

'ファイル終了まで繰り返し
Do While (EOF(fnoIn))
'1行読み出し
Line Input #fnoIn, s
'特定のバイト位置に区切り文字を入れた文字列を作成する。
'イメージ000001111122222⇒00000,11111,22222
s2 = Mid(s, 1, 5) & "," & Mid(s, 6, 5) & "," & Mid(s, 11, 5)
'区切り文字が入った文字列をSplitで配列に出力
ss = Split(s2)
'各要素のチェックをする
If ss(0) = "99999" Then GoTo LOOP_NEXT
'ここまで来たら大丈夫のようなのでカンマ入り文字列(s2)CSVに出力する
Print #fnoOut, s2
LOOP_NEXT:
Loop
Close #fnoIn: Close #fnoOut
End Sub
189デフォルトの名無しさん:2007/02/05(月) 11:37:36
あータブとか消されてしまうのか。見づらいな。
190186:2007/02/05(月) 15:09:56
>>187
固定で102byteです。
得意先がいい加減で、仕様も手探り状態なもので(泣

>>188
ありがとうございます。
このコードを参考にして、試行錯誤してみます。

191デフォルトの名無しさん:2007/02/05(月) 17:01:11
>>190
得意先に仕様書無いと作れないと言えばいいじゃん。
192186:2007/02/05(月) 18:04:31
>>191
言ったよ゚・(つД`)・゚・
普段もらっている受注データとは別のもので。。。
特殊なパターンで、これしか渡せないと言われた。
txtデータと口頭で言われた項目(どこまでが**で**byteで、とか)だけ。
結局、自分たちで解析するしかなくて。。。
ホストのマスターに落とす必要ないのでVBSかAccessの類で出来ないか
考えてたんです。

ちなみに得意先はホ●ダ技研鈴鹿工場です
バイクも車もホ●ダだが、こういう体質は好かん!
193デフォルトの名無しさん:2007/02/05(月) 18:10:10
大丈夫、他も似たようなもんだ。
194デフォルトの名無しさん:2007/02/05(月) 20:11:48
>>180>>181>>182>>183
激しく感謝です。やっぱだめなんですね・・・^^;
195デフォルトの名無しさん:2007/02/05(月) 21:04:29
>>194
つか<、>で範囲チェックすりゃいいじゃん
196デフォルトの名無しさん:2007/02/05(月) 21:09:03
>>195
それはやっちゃダメ
結果的に同じでもコード的に意味が違ってしまう
つまり可読性を損なう
197デフォルトの名無しさん:2007/02/05(月) 21:18:55
>>196
どうしても出来ないときは
いいじゃんコメント書いとけばいいんだから

全部そんなプログラム組んじゃいけないけど
198デフォルトの名無しさん:2007/02/05(月) 21:20:09
後は10とか100でかけて整数値にするかだな
199184:2007/02/05(月) 21:59:21
>>185
俺にたいするレスと受け取っていいんですよね?

色々検索して
ttp://www.microsoft.com/japan/technet/scriptcenter/resources/officetips/jun05/tips0607.mspx
を参考にしてテストしてみたんですが、
やっぱり時間とかはきちんと取得できないんですけど、
(セルに10:00といれておくと0.5になる)
これじゃないんでしょうか?

申し訳ないんですが、検索キーワードなど教えていただけると
助かります。

いや、助けてください
200デフォルトの名無しさん:2007/02/05(月) 22:41:49
Dim tm As Date
Dim buf As String
tm = Cells(0, 0)
buf = Format(tm, hh:mm")

これで普通の文字列になるがな
201デフォルトの名無しさん:2007/02/05(月) 22:42:29
buf = Format(tm," hh:mm")
202デフォルトの名無しさん:2007/02/05(月) 22:45:10
更にtmだけでも応用すりゃ検索もできる
203デフォルトの名無しさん:2007/02/05(月) 23:08:56
>>200-202
おまえ、バカだろ。文字列にする方法なんてこの際問題じゃない。そんなの簡単に解る。
君のやり方で文字列化するなら、その前にその値が元々どういう表示形式で表示されていたか判断しなきゃならないんだよ。

そして>>184
> 配列に代入された文字の表示形式を調べて変換することも考えたのですが、
とあるから、君の考えた方法は既に変わりきってる上で、表示形式をいちいち調べて文字列に変換してたら
ValueではなくTextプロパティをループで読むのと大差ないってこった。
204デフォルトの名無しさん:2007/02/05(月) 23:14:58
>>203
いや
>>10:00といれておくと0.5
と言う単なるヒントだ、そのまま使ったら馬鹿だが
205デフォルトの名無しさん:2007/02/06(火) 00:15:27
10:00といれておくと0.5になるなら
逆に検索値を時間の場合10:00なら0.5にすりゃいんじゃねぇ?
206デフォルトの名無しさん:2007/02/06(火) 00:35:33
それだと時間じゃない0.5もヒットするわけで
207デフォルトの名無しさん:2007/02/06(火) 01:07:40
データベース使っても結局Value値がセットされると・・・
0.5でヒットしたらセル見にいって属性しらべたら?
少しはマシかも、0.5とかいっぱいあったら終わりだけど
208デフォルトの名無しさん:2007/02/06(火) 01:23:47
Findじゃ遅いの?
209デフォルトの名無しさん:2007/02/06(火) 01:27:24
findじゃだめなんだよ
210デフォルトの名無しさん:2007/02/06(火) 01:32:58
あとはクエリ使って、ここで答えでないんなら
データベース関係のスレで聞いてみたら?
211184:2007/02/06(火) 01:35:12
色々なレスありがとうございます。
最初の書き込みが携帯からで、内容をはしょりすぎて誤解があるようなので再度書き込みます。

A列)日付 B列)曜日 C列)作業名 D列)開始時刻 E列)終了時刻 F列)処理時間 G列)備考
が入っている複数のシートから正規表現で検索をしたいと思っています。

今の簡単なコードを書くと

Set reg = CreateObject("VBScript.RegExp")
With reg
.Pattern = strPattern
.IgnoreCase = True
.Global = True
end with
For Each sh in Thisworkbook.Sheets
For Each rng in sh.UsedRange
If reg.test(rng.Text) Then
検索文字列が見つかったときの処理
Debug.? "[address]" & rng.Address & " [text]" & rng.Text & " [Formula]" & rng.Formula
End If
Next
Next

といった流れなのですが、検索対象が大量にあり処理に時間がかかってしまいます。(対象30万件で5分くらい)
そこでFor Each rng in sh.UsedRangeをやめて、rng = sh.UsedRangeのように
配列にして、検索しようとしたところ、日付や時間(表示形式は[h]:mm)がLong型になるため
srtPattern = "10" などに10:00などが該当しなくなります。
rng = sh.UsedRange.Formulaは代入がうまくいくのですが、rng = sh.UsedRange.Textはできないようです。

列ごとに時間や日付が入っているなら、そこだけ変換すりゃいーだろ、と言われそうですが
列がずれた場合や新たに項目が増えた場合を考えて、決め打ちで変換するのは出来れば避けたいと考えています。
説明下手ですいませんが、高速に処理する方法がありましたらご教授お願いします。
212デフォルトの名無しさん:2007/02/06(火) 01:39:00
件数多いなぁ、確実にデータベース使った方が良いと思うよ
漏れはやり方わからんが
213デフォルトの名無しさん:2007/02/06(火) 01:42:57
>>列がずれた場合や新たに項目が増えた場合を考えて
列のセルに名前付けりゃいいんじゃないの?
214デフォルトの名無しさん:2007/02/06(火) 01:56:50
> 列がずれた場合や新たに項目が増えた場合を考えて、
2行目(実データの1行目)の表示形式に合わせるって手もある
30万回表示形式取得したら相当遅くなるだろうが、列数分(現状7回)だけなら殆ど気にならないだろ
215たのんます:2007/02/06(火) 02:00:54
エクセルに関する質問なんですが
統計数字データをグラフに変換して、統計データによるグラフを作成する際に
統計データの始点と終点を同じにして、重ねて比べられるようなグラフにしたいのですが
統計データの量が、比較したいAとBでは異なるため、
始点終点を同じにして、重ねて比べることができません。
何か関数とかその他の方法で、
違うデータ量のものを重ねて比較する方法はないでしょうか?
216184:2007/02/06(火) 02:08:44
書き忘れましたが、正規表現を使いたい理由は作業名が入力者により、まちまちなのでまとめて検索したいからです。
誤)日付はDate型ですね。すいません。
  0.5は12:00でした。すいません。

いま>>199のリンク先のコードを改良してテストしてみたら、
10:00とかはちゃんと取れますね(表示10:00→取得値10:00:00でした)
ただ24時間を越えるとダメみたいです(表示28:00→取得値1900/01/01 4:00:00でした)
日付も表示が1月1日でも2007/01/01でした。
何か指定する方法があるのかもしれませんが…

>>208
Findって正規表現使えましたっけ?調べてみます

>>210
なにぶんADOとか初めてなんでもう少し
ttp://support.microsoft.com/?kbid=257819
とかを見て勉強してみます。

>>212
俺もそう思います

>>213
名前を定義なども考えましたが、名前=範囲な訳で新規に項目が増えた場合にはコードを追加し
範囲別にコードを書かなければいけないので、試してません。
条件分岐で範囲(名前)別にコードを書く必要もないかもしれませんが、
ただでさえ件数が多く時間がかかるので、極力条件分岐などの処理をいれたくないので。

>>214
それは考えつきませんでした。試して見たいと思います。

色々ありがとうございました。自分でも試行錯誤してみようと思います。
217デフォルトの名無しさん:2007/02/06(火) 02:16:11
>>216

Date型 は日付と時間一緒ですよ(小数点以下が時間)

>名前を定義
範囲で名前付けるんじゃなく、1行目の1セルに名前付けて
呼び出せば行位置と列位置が分かる 列位置分かればなんの行か分かるでしょ
218デフォルトの名無しさん:2007/02/06(火) 02:19:39
>>217

>名前を定義
と書いていて複数シートじゃ駄目だね・・・
219デフォルトの名無しさん:2007/02/06(火) 02:20:11
>>215
あるけどマルチしたので教えません
220たのんます:2007/02/06(火) 02:49:33
すいません マルチの意味がわかりました、、、
してはいけないことと知りませんでした。
ただものすごく困っています。
色々調べても方法がなくて、、、
ご存知でしたら、何卒お教えいただけませんでしょうか?
以後こんな事をしてしまわないように気をつけます。
221デフォルトの名無しさん:2007/02/06(火) 02:59:27
今回のが教訓だ。ここで教えちゃったら教訓にならない。
「マルチしても謝れば教えてもらえる」程度に思っちゃうだろう。

今回マルチをしてしまった責は、今回答えてもらえないということで負い
以後気を付けることで、以後の質問では突き放されることはなくなる。

まぁマルチをしても、2chで仮初めの礼を言われることくらいしか楽しみのない
哀れな教えたがり君が答えてくれることもあるけどね。
222デフォルトの名無しさん:2007/02/06(火) 13:58:34
VBAでTerminateメソッドって使えないんでしょうか?
VBAから起動しているアプリを終了したいんですが

Set WshShell = CreateObject("WScript.Shell")
WshShell.Terminate ("ファイルパス")
と打ち込んでもエラーになっていまいます。

Set WshShell = CreateObject("WScript.Shell")
WshShell.exec ("ファイルパス")
で起動はできるようですが。

VBAを使って、windows上で起動しているアプリを終了させるには
どうしたらいいんでしょうか?
223デフォルトの名無しさん:2007/02/06(火) 14:25:54
>>222
Win32API使うかWMI使うかだな
つーか全然VBAの質問じゃないし
224222:2007/02/06(火) 14:34:30
え、これVBAの質問じゃないんですか?
すいません。
これはAPIのスレに行けばいいんですかね?
225デフォルトの名無しさん:2007/02/06(火) 15:09:04
VB言語でApplicationオブジェクト(ExcelやWord)を操作するからVisual Basic for Application、略してVBA。
Applicationオブジェクト(Excelではブック、シート、セルなどを含む)を操作しなかったら
例えExcelやWord付属のVBEで実行しようと、VBAの分野の話じゃ無い。

開発環境の方のVisual Basicでやるべき事を、ExcelやWord付属のVBEに持ってきてるだけだ。
VBAはあくまでもマクロ言語なのに、開発環境に匹敵するほど強力過ぎる故にその辺の区別が出来ない奴が多くて困る。
「VBAで」の部分を「VB6.0で」に置換しても通用しちゃうような話は、全部開発環境分野の話だと思ってくれ。

因みに君のレベルならWin32APIよりはWMIの方がいいと思うぞ。
でもどっちにしろスレで質問することばかり考えてないで自分で調べることを考えよう。
どうせWin32APIスレでは言語限定での丸投げ(コード書いてクレクレ)なんて聞いちゃくれないし。
226デフォルトの名無しさん:2007/02/07(水) 10:38:35
ADOを使用してエクセルのシートをデータベースにセットする場合
各セル毎のデータ形式でなく、全て文字列形式にしてセットする方法があるんでしょうか?
(セルを全て文字列形式にするという方法は除いて)
もしあるのなら、教えてください。
227デフォルトの名無しさん:2007/02/07(水) 14:47:01
>>221
何をエラそうに講釈たれてんだよ、バーカ。何も教えないくせに態度ばっかしデカいんだよ。
228デフォルトの名無しさん:2007/02/07(水) 14:56:05
( ゚д゚)ポカーン
229デフォルトの名無しさん:2007/02/08(木) 00:50:04
マルチがなぜダメなのかを知っていればあんなに高飛車に
偉そうなことは言わないというのは間違いのない話であるよな。
230デフォルトの名無しさん:2007/02/08(木) 01:01:14
つうか

>>226
の質問はスルーか
231デフォルトの名無しさん:2007/02/08(木) 03:03:30
if

Do While
 *********
Loop

end if

こんな感じのプログラムのDoLoopを1秒たったら繰り返すような感じに出来ますか?
232デフォルトの名無しさん:2007/02/08(木) 03:36:24
>>231
Application.WaitなりWin32APIのSleepなりお好きなように
233デフォルトの名無しさん:2007/02/08(木) 17:02:10
234デフォルトの名無しさん:2007/02/08(木) 20:05:16


const aretsul = 1

DATA = "データファイル" Cells(row, aretsul).Text
Cellsに「222123,」見たいな感じにデータが入ってるんですが、最後のコンマを消したいんです
最後の一文字を読み込まないようにするにはどうすればいいでしょうか?
235デフォルトの名無しさん:2007/02/08(木) 20:31:13
> 最後の一文字を読み込まないようにする
Value値にも因るが、基本的に不可能。

読み込んだ後で、末尾の1文字を消すなら文字列操作関数でどうにでもなるけどね。
236デフォルトの名無しさん:2007/02/08(木) 21:21:27
>>234
left(cells(セルA,セルB), len(cells(セルA,セルB)) - 1)

こんなんどう?(未テスト。やりたいことは伝わるかと)

っていうか上の2行は?
237デフォルトの名無しさん:2007/02/08(木) 21:40:45
238デフォルトの名無しさん:2007/02/08(木) 21:58:30
ごめん、ビジネスsoft板のExcel総合スレで聞いたんだけど、こっちの方がよさげなので、
すみませんがマルチさせていただきます。
以下、コピペですが、エラーを防ぐ原因と方法を知ってる方いたら教えてください。

すみません、VBAのことで質問です。
リンク先のプログラムで、コマンドボタンを押した後に表示されるフォーム(モーダレス)の
コマンドボタンを押して処理を実行中にシートをダブルクリックしたりすとエラーで落ちちゃう
んですが、これを防ぐにはフォームをモーダルでshowするしかないですかね?

http://555.sytes.net/up/img/375.zip
239デフォルトの名無しさん:2007/02/08(木) 22:35:29
>>238
原因不明なのですが、試してみてくれませんでしょうか?

ループの前に
Application.ScreenUpdating = false
ループの後に
Application.ScreenUpdating = true

スペルミスあったらごめんなさい。
240238:2007/02/08(木) 22:46:43
>>239
ありがとうございますm(_ _)m

教えていただいた通りにしたらエラーがでなくなりました。

Application.ScreenUpdating = false で画面の更新を一時的に止めてやるんですね。

Formをmodalで表示しなくてもこの方法ならいけそうです!

241デフォルトの名無しさん:2007/02/09(金) 01:38:11
242デフォルトの名無しさん:2007/02/09(金) 01:45:38
243デフォルトの名無しさん:2007/02/12(月) 10:41:46
すみませんが質問です。
ユーザーフォームにテキストボックス若しくはラベルを作り、
そこに文字を電光掲示板のように文字をスクロールさせる事は可能ですか?
244デフォルトの名無しさん:2007/02/12(月) 10:49:33
タイマー作って文字列を更新しろ
245デフォルトの名無しさん:2007/02/12(月) 11:39:55
Alt + PrintScreenで、画面のハードコピーをとって、
エクセルシートに貼り付ける時に、
そのハードコピーの拡大率は100%ですよね。
これを80%の拡大率で貼り付けたい時はどうすればよいのでしょうか?
貼り付けた後に、拡大率を変更するのは面倒なので。
(エクセルシート自体は100%のままで)
246デフォルトの名無しさん:2007/02/12(月) 12:22:16
sub 貼りつけ
const ZOOM_RATE AS SINGLE = 0.8

ActiveSheet.Paste
Selection.ShapeRange.LockAspectRatio = msoTrue
Selection.ShapeRange.Height = Selection.ShapeRange.Height * ZOOM_RATE
Selection.ShapeRange.Width = Selection.ShapeRange.Width * ZOOM_RATE

end sub


どのプロパティ実現できるか分からないときは、マクロの記録を活用すると良いですよ。
247243:2007/02/12(月) 17:24:50
>>244
なめらかに文字を流したいのですが・・・
248デフォルトの名無しさん:2007/02/12(月) 17:27:26
>>247
ラベルの位置を微調整するとか、自前で文字描画するとか、まぁ頑張って。
249243:2007/02/12(月) 17:31:17
>>248
簡単にできる方法ってないんですね・・・
何とかがんばってみます!
250デフォルトの名無しさん:2007/02/12(月) 18:06:55
いや、簡単だろ
251デフォルトの名無しさん:2007/02/12(月) 18:12:42
質問です。
Office2007 Excelでマクロの記録機能で、テキストボックスを表示して、テキストボックス内に文字を表示するといったマクロを記録しましたが、テキストボックスに関するマクロが一切記録されません。
何か個別に設定が必要なのでしょうか?
252デフォルトの名無しさん:2007/02/13(火) 15:53:09
そのテキストボックス自分で実装したなら無理じゃね?
253デフォルトの名無しさん:2007/02/13(火) 19:25:13
質問があります。

たとえばA1:D50までの表がありその中に3桁の数値が入っているのですが、
そのなかに指定した1桁の数値(H1に入力した数値)が(3桁のいずれかに)含まれるセルに色をつけたいのです。
また、関係ないかもしれないですが、表には空欄がある場合があります。

どうしたらいいでしょか。
お力をお貸しください。
254デフォルトの名無しさん:2007/02/13(火) 20:07:08
>>253
条件付き書式でも出来るが、VBAでやりたいなら単にループ回してInStrあたりでその数字が含まれてるかどうか調べればいいだけじゃん。
第二第三引数は数値渡しても自動で文字列化されるし、戻り値をそのまま条件に出来る。
255デフォルトの名無しさん:2007/02/14(水) 15:53:03
教えてください!
VBAからマクロの記録を終了させたり開始させたりする事って
出来るのでしょうか?

Application.CommandBars("Stop Recording").Visible = True
strTempBuff = CommandBars("Stop Recording").Controls(1).Caption
If Not strTempBuff = "新しいマクロの記録(&R)..." Then
'記録中なら停止したい。
xlApp.Application.CommandBars("Stop Recording").Controls(1).Execute '同じErr
xlApp.Application.CommandBars("Stop Recording").Controls("記録終了(&R)").Execute '同じErr
End If

上記コードで実行すると、マクロ記録中の場合
オートメーションエラーが発生してしまいます。
既にマクロが走っているからでしょうか?

256デフォルトの名無しさん:2007/02/14(水) 23:16:03
すみませぬが質問です。フォームにラベルを作り、そのラベルにランダムの行数のセルを表示させ、
ちょっと時間をおいてその隣のセルを表示させる、というプログラムを作りましたが
上手いこといきません。アドバイス下さいませ。

Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'メイン
Private Sub userform_initialize()
Call 表示
End Sub
'表示
Sub 表示()
'乱数発生
Randomize
Dim 行番号 As Long
Dim 乱数 As Long
行番号 = Worksheets("sheet1").Range("a65536").End(xlUp).Row
乱数 = Int(Rnd * 行番号) + 1
Label1.Caption = Cells(乱数, 1).Value
Sleep (1000)
Label1.Caption = Cells(乱数, 2).Value
End Sub
257デフォルトの名無しさん:2007/02/15(木) 00:01:44
>>256
なにが上手いこといかないのか良く分からないんですが、
きっとエラーになるのではなくて、いきなり表示がCells(乱数,2)の値に
なると仮定してレス

Private Sub userform_initialize()
はFormが表示されるまえに起こるイベントなんで、
表示されたときにはCells(乱数,2)が表示されてしまうと思います。

あとは、

Label1.Caption = Cells(乱数, 1).Value
'追加↓
DoEvents
Sleep (1000)
Label1.Caption = Cells(乱数, 2).Value

と、DoEventsを入れないと
Sub 表示()の処理がすべて終わるまで
表示が更新されないと思いますよ。
258デフォルトの名無しさん:2007/02/15(木) 00:30:37
アクティブセルに色付けするとき、どう指定するんでしょうか?
range("A1").interior.colorindex=36
などという例は見たのですが、特定のセルじゃなく、アクティブなセルとして指定する場合を教えてください。
259デフォルトの名無しさん:2007/02/15(木) 00:43:08
range("A1")の変わりにActiveCellって書けばいいだけじゃん。
何でそんなことも調べられないの?
「アクティブなセル」でヘルプ検索したらすぐ出てくるのに。
260デフォルトの名無しさん:2007/02/15(木) 00:50:17
カーソル移動したセルの色変えたいなら
イベントと組み合わせて使えばよい
261258:2007/02/15(木) 00:59:28
>>259
それも試しにやってみたのですが、色が変わらないので間違っているのかと。

ちなみにユーザー定義関数内でやろうとしていて以下のようにしてもoutputはでますが、
色が出ないんです。指定がおかしいのでしょうか?

Function color(work)

ActiveCell.Interior.ColorIndex = 36

color = "color" & work

End Function
262デフォルトの名無しさん:2007/02/15(木) 01:18:30
>>261
普通にできてしまったのですが…。

Function test()
ActiveCell.Interior.ColorIndex = 36
End Function

同じですよね、多分?
263デフォルトの名無しさん:2007/02/15(木) 01:25:42
>>262
たびたびすみません。同じだと思うのですが・・・。

やろうとしていることは、
・ユーザー定義関数を作ろうとしていて(ここでいうcolorという関数)
・計算結果がある値をとればセルの色を変える
というもので、上述のcolorという関数はそれをおもいっきり簡略化したものです。

やっぱり上手くいかないです・・・
もしかして根本的にわたしが勘違いしているのかもしれません。ユーザー定義関数とマクロは別物ということでしょうか?
264デフォルトの名無しさん:2007/02/15(木) 01:27:47
263補足

>>262さんのを登録後、エクセル上で=test()と任意のセルに入力しても
ゼロと表示されるだけで色は変わりませんでした・・・
265デフォルトの名無しさん:2007/02/15(木) 01:29:16
引数のworkには何が入る予定なの?
266デフォルトの名無しさん:2007/02/15(木) 01:30:49
あー、分かった。
セルでセル関数のようにはマクロのユーザー関数は使えないよ。
ツールメニュー→マクロ→color(自分で作ったユーザ関数)を選らんで、
その時点で使うわけ。
267デフォルトの名無しさん:2007/02/15(木) 01:30:54
>>265
ただの文字列です。
268デフォルトの名無しさん:2007/02/15(木) 01:34:30
「セルの計算結果」って言ってるのは、
=SUM(R[-3]C:R[-1]C) ←こういう奴の話を言ってるんだよね?
で、このイコールのところに自分で作った関数を入れたいってことよね?
結論から言えば、できないんじゃないかなあ。
269268:2007/02/15(木) 01:37:15
ごめん!
ウソ言ってた。
できたよ。
270デフォルトの名無しさん:2007/02/15(木) 01:37:24
>>261
> ユーザー定義関数内でやろうとしていて
先に書けよ。

ユーザー定義関数ってのは引数を計算して、式を入れたセルに値を返す物で
書式設定だのなんだのというシート上の操作を行うものじゃないぞ。
だからアクティブセルを取得することは出来るが操作は出来ない。それがユーザー定義関数ってものだ。
指定がおかしいんじゃなくて、やろうとしている事に対してユーザー定義関数を使おうとしているのがおかしい。
取得が出来てることはDebug.Print ActiveCell.Address(0, 0)を入れればわかるだろう。
操作がしたいならイベントを使え。
271デフォルトの名無しさん:2007/02/15(木) 01:38:10
272デフォルトの名無しさん:2007/02/15(木) 01:48:01
>>268
そういうやつですね。
文字列の長さからいろいろと計算させる予定でした。
結果的にダメっぽいですね。
いろいろとありがとうございました。

>>270
イベントでやるしかないのですね。
>それがユーザー定義関数ってものだ。
名言の匂いがしますね。使わせて頂きます。

>>271
参考になりました。
273デフォルトの名無しさん:2007/02/15(木) 01:48:02
265+266+268+269
あとはがんばって〜。寝るわ。
274デフォルトの名無しさん:2007/02/15(木) 03:47:04
Const a = 1
Const b = 2
Const c = 3
Sub main()
a1 = 1
b1 = 1
c1 = 1
cells_a = 0
cells_b = 0
cells_c = 0
Do While cells(a1, a).Text <> ""
a1 = a1 + 1
cells_a = cells_a + 1
Loop
Do While cells(b1, b).Text <> ""
b1 = b1 + 1
cells_b = cells_b + 1
Loop
Do While cells(c1, c).Text <> ""
c1 = c1 + 1
cells_c = cells_c + 1
Loop
cells(1, 5).Value = cells_a
cells(2, 5).Value = cells_b
cells(3, 5).Value = cells_c
End Sub

このプログラムを短くできませんか?
275デフォルトの名無しさん:2007/02/15(木) 04:39:47
配列使うと1/3近くには出来るかも知れないが
速度は落ちるんじゃないかな
276デフォルトの名無しさん:2007/02/15(木) 10:09:42
>>274
Const a = 1
Const b = 2
Const c = 3
Sub main()
a1 = 1:b1 = 1:c1 = 1

With Application.WorksheetFunction
cells(1, 5).Value = .Count(Range(Cells(a1,a),Cells(a1,a).End(xlDown)))
cells(2, 5).Value = .count(Range(Cells(b1,b),Cells(b1,b).End(xlDown)))
cells(3, 5).Value = .count(Range(Cells(c1,c),Cells(c1,c).End(xlDown)))
End With
End Sub

試してないけど、とかじゃダメなのか?

277256:2007/02/15(木) 10:51:13
>>257
お答えありがとうございます。説明不足ですみませんでした。
御推察のとおり、1つ目のセルは表示されずに2つ目が表示されてしまっていました。
で、>>257様の誤解を参考にして色々試したのですが、どうにもうまくいきません。
もう少しだけヒント頂けないでしょうか?
278sage:2007/02/15(木) 13:13:37
>>277
何を試してどうだめだったのか書かないと…

とりあえず自分の環境では普通に動く

フォームを表示したときに表示したければ
UserForm_Activaue()内で
Callしてみれば?

とりあえず、F8でステップインしながら
動きを確認してみることをお勧めするよ
後はDebug.Printするとか。

ローカルウィンドウで
変数に期待通りの値が
はいってるか確認する方法もあるし。

なんにしても情報が少なすぎだと思いますよ
279デフォルトの名無しさん:2007/02/15(木) 13:18:21
うはぁ
あげちった…

携帯からレスするもんじゃないな…
280デフォルトの名無しさん:2007/02/15(木) 14:18:22
他人事ながら

×UserForm_Activaue()
○UserForm_Activate()

横レス失礼
281256:2007/02/15(木) 16:06:37
>>278,>>280
またまた説明足らずで申し訳ありませんでした。
で、ご指摘の方法でちゃんと出来ました!
自分の持ってるVBAの本が初心者用のものだったため、
UserForm_Active()とか全然載ってなくて方法が分かりませんでした。
今回はどうもありがとうございました!
282デフォルトの名無しさん:2007/02/15(木) 16:27:59
VBに高階関数とかってないの?関数に関数を引数として渡したいだけなんだけど。
283デフォルトの名無しさん:2007/02/15(木) 16:49:21
>>282
AddressOf
284デフォルトの名無しさん:2007/02/15(木) 19:07:28
>>283
おお、サンクス
285デフォルトの名無しさん:2007/02/15(木) 19:31:06
ダイアログボックスで入力された年・月にしたがってカレンダーを表示するマクロを作っています。
年・月は文字列として取得、それを日付型にデータ変換して日付型の変数に代入しているのですが、
そこで「実行時エラー'11': 0で除算しました。」とのエラーが出ます。
DateValue関数を使う、日付型の変数を Variant型に変える、を試してみましたが、
結果は同じでした。
文字型の変数を Variant型に変えると、最初に1回エラーが出たあとその後は出なくなりましたが、
カレンダー表示の処理のところで日付を誤認してしまいます。
現在は On Error Resume Next でエラーを抑制して動かしており、
本来の目的であるカレンダー表示はそれで問題なくできておりますが、
可能であればエラー自体出ないようにしたいと思っています。
どこが悪いのかアドバイスをお願いします。

テストコード
Sub test()
Dim strInput As String
Dim datDay As Date
strInput = InputBox("年と月を入力してください。(例)「2007 2」")
datDay = CDate(strInput)
MsgBox datDay
End Sub

環境
Mac OS X 10.4.8
Excel 2004 for Mac ver. 11.3(060914)

以上よろしくお願いします。
286デフォルトの名無しさん:2007/02/15(木) 20:46:35
VBAのソースで右側に長くなって見づら苦なってきたのでソースの内容はそのままで改行することってできませんか?
普通に改行するとエラーが出てしまいます。
287デフォルトの名無しさん:2007/02/15(木) 21:01:35
MsgBox _
 "VBAのソースで右側に長くなって" & vbCrLf & _
 "見づら苦なってきたので" & vbCrLf & _
 "ソースの内容はそのままで" & vbCrLf & _
 "改行することってできませんか?" & vbCrLf & _
 vbCrLf & _
 "普通に改行するとエラーが出てしまいます。"
288デフォルトの名無しさん:2007/02/15(木) 21:30:38
>>287
Chr(10)じゃだめ?
289デフォルトの名無しさん:2007/02/15(木) 21:51:40
>>285
テストコードが問題なく実行できてしまったのですが…。
カレンダーに変換してるところのエラーでは?
290デフォルトの名無しさん:2007/02/15(木) 22:43:59
たぶんロケール絡みだろう。
同じバージョンのWindows&Excelだって、ロケールが違うとCDateやIsDateの動作が変わってくるからな。
とりあえずInputBoxとCDateの間に
If strInput = "" Then MsgBox "空文字 or キャンセル": Exit Sub
If Not IsDate(strInput) Then MsgBox "日付変換不可": Exit Sub
って入れてみな。「2007 2」で"日付変換不可"が出るようなら、ロケールの問題でビンゴだ。
その場合は文字列切り出しで年と月を取得しよう。
"日付変換不可"が出ないにしても、文字列切り出しで解決出来るならそれでいいし。
291286:2007/02/16(金) 00:53:59
_←これだけで改行できた思い出させてくれてありがとう
292デフォルトの名無しさん:2007/02/16(金) 01:11:48
ListBoxに値をいれるとClickやChangeが発生しますが、
クリック中に値を変更したい場合とかどうしてますか?

フラグもって立ってたら処理しないというやり方で回避してるんだけど
なにかほかにいい方法がありますでしょうかね。
293285:2007/02/16(金) 01:38:32
>>289, 290
レスをいただきありがとうございます。
テストコードのほうですが、>>290さんのコードを加えて実行してみたところ、
1回目は「実行が終了しました」とのエラーメッセージが表示され、
2回目は「オーバーフローしました」とのエラーメッセージが表示され、
3回目以降は「2007.2.1」と普通に表示されました。
念のため本来のマクロを On Error Resume Next をコメントアウトして再度実行してみたところ、
1回目は「オーバーフローしました」とのエラーメッセージが表示され、
2回目も「オーバーフローしました」とのエラーメッセージが表示され、
3回目は正常にマクロが実行され、
4回目で「0で除算しました」とのエラーメッセージが表示されました…
こちらに書き込む前に何回もテストし、そのときは「0で除算しました」というエラーメッセージのみ
繰り返し出ていたのですが、実行のタイミングによってまるで結果が違ってきているようでもあり、
とまどっています。
>>290さんのおっしゃっている「文字列切り出し」という方法は、文字列から年と月をそれぞれ別々に取得する
ということですね?
がんばってコードを書いて試してみます。
どうもありがとうございました。
294デフォルトの名無しさん:2007/02/16(金) 10:37:50
a = Int(9 * Rnd + 1)
b = Int(9 * Rnd + 1)
c = a + b

これでcの中にaの中に7 bの中に8 が入ってるとして 15じゃなく 78と表示することはできますか?
295デフォルトの名無しさん:2007/02/16(金) 11:59:19
>>294
つなげたいなら、&
296デフォルトの名無しさん:2007/02/16(金) 12:20:14
ちょwwVB以前の問題だろw
a*10+bも思いつかんのか
297デフォルトの名無しさん:2007/02/16(金) 22:23:14
初歩的な質問でホントにすいません;

エクセルのシート上にファイル等から画像を挿入したとします。

その画像を文字列の背面に持っていく方法がわかりません;

背景に設定する等とは違います;
(ちなみに背景も小さい画像で設定すると
ビッチリ並んで出てきますが、好きな場所に1個だけ、
とかは出来るんでしょうか?)

よろしくお願いします;
298デフォルトの名無しさん:2007/02/16(金) 22:25:14
すいません;スレ違いでした;
299デフォルトの名無しさん:2007/02/18(日) 12:04:32
100行まで三行間隔で文字列が入っていて間違って打ってないか確認したいです。

B列、100行までの間の3の倍数のセルに"もげ"って入っていたら次の3の倍数のセルへ
間違っているか、空欄だったらセルを選択した状態で終えてください。
という処理をしたいのですが
相対セルと三の倍数選択する部分の表現でつまづいてしまいました。

一つずつチェックしてこなすにも5000行以上で当て上げ状態です
どなたかヒントかVBAのソースを教えていただけないでしょうか
よろしくおねがいします
300デフォルトの名無しさん:2007/02/18(日) 12:13:16
当て上げ?
で、そのチェックはVBAでやるようなことなのか?
301デフォルトの名無しさん:2007/02/18(日) 12:54:44
B列を削除して割り振りなおした方が簡単じゃないの?
302デフォルトの名無しさん:2007/02/18(日) 12:55:01
> ソースを教えていただけないでしょうか
ソースが欲しいならそういうところに頼めよ
ここは丸投げ依頼所じゃないぜ
自分で書こうって気がある奴がヒントを貰いに来る場だ
303デフォルトの名無しさん:2007/02/18(日) 12:57:28
step 3 じゃだめ?
304デフォルトの名無しさん:2007/02/18(日) 13:19:21
>>299
100行まで?

Sub moge()
  Dim i As Integer
  For i = 3 To 100 Step 3
    If Cells(i, 2).Value = "" Then
      MsgBox "B" & i & "は空白ですよ。"
    ElseIf Cells(i, 2).Value <> "もげ" Then
      MsgBox "B" & i & "に「もげ」でない文字が入っています。"
    End If
  Next i
End Sub
305デフォルトの名無しさん:2007/02/18(日) 13:41:13
dim giy as integer

a=4937870
b=1.05
s=387
u=100

giy = WorksheetFunction.RoundDown(((a * b) / (s*u)), -1)


上のを実行するとなんでかオーバーフローするんですけど。
306デフォルトの名無しさん:2007/02/18(日) 13:47:01
しませんでしたけど…
念のためLongにしといたらどーですか?
307299:2007/02/18(日) 13:51:43
>>304
まさにこれです
変数とかCellsとかforとかすごい勉強なります。
ありがとうございます

>>303 
最初なんのことだろうと思いましたが、304みてわかりました。step 3。
ありがとうございます。
308デフォルトの名無しさん:2007/02/18(日) 13:56:43
デバッグしてa*bのところにマウスをもってくると、5184763.26454401
という数字が出ます。小数点以下の数字が原因かと思うんですけど。
309デフォルトの名無しさん:2007/02/18(日) 14:11:26
>>308
それのどこがオーバフロー?
310デフォルトの名無しさん:2007/02/18(日) 14:14:16
もしかして:
単精度で計算していて精度がでていないという落ち?
311デフォルトの名無しさん:2007/02/18(日) 14:25:55
aとbがVariantならdoubleと同じ精度で扱えると思うんだが…
312デフォルトの名無しさん:2007/02/18(日) 21:49:04
フォームのテキストボックスを全部いっぺんに空白にする方法はありますか?
313デフォルトの名無しさん:2007/02/18(日) 22:40:09
>>312
順番に空白にすればよい
314312:2007/02/18(日) 22:44:54
いや、そりゃもちろんそうなんですが、
一行で一気に全部いっぺんに空白にしてしまうような命令とかはないかなぁと思いまして・・・
315デフォルトの名無しさん:2007/02/18(日) 22:55:43
>>314
そんなことしてどーするの?
見た目には変わらないのに?
316デフォルトの名無しさん:2007/02/18(日) 23:10:11
Me.Controlsに対してFor Eachループ回して
If TypeName(objControl) = "TextBox" Then objControl.Text = ""
とか
317デフォルトの名無しさん:2007/02/18(日) 23:29:42
そういう処理をするプロシージャを用意しておいて、そいつを呼べばいい。
318312:2007/02/19(月) 10:43:01
>>315
自分の作成したフォームのテキストボックスが20個くらいありまして、
それをクリアするのにプログラムが長くなってしまうので
短く簡単にすませる方法はないかなぁと思いまして。
>>316、317
ありがとうございます。それで試してみます!
319デフォルトの名無しさん:2007/02/20(火) 00:41:14
EXCELで

コマンドボタンをクリックすると、Sheet3のA1:A10の内容を、Sheet1のA1:A10にコピーする

こんなモノを作りたいのですが


Private Sub CommandButton1_Click()
Range("A1:A10").Select
Selection.Copy
Sheets("Sheet1").Select
Range("A1:A10").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End Sub

こうすると、「Range クラスの Select メソッドが失敗しました」となってしまいます
どうすればいいか教えて下さい

「マクロの記録」を使ってしか、マクロ扱った事無いのに
調子に乗って仕事請けてしまって困ってます・・・
320デフォルトの名無しさん:2007/02/20(火) 00:58:33
>>319
これだけでいいんでない?

Private Sub CommandButton1_Click()
  Worksheets("Sheet3").Range("A1:A10").Copy
  Worksheets("Sheet1").Range("A1:A10").PasteSpecial Paste:=xlPasteValues
End Sub

最後に
Worksheets("Sheet1").Activate
にしてもいいと思うけど…
321319:2007/02/20(火) 01:15:25
解決しました有難うございます

範囲指定の時は

Worksheets("Sheet3").Range("A1:A10")

としなければいけないのですね
322デフォルトの名無しさん:2007/02/20(火) 01:18:36
>>321
シート名を指定していないのでSelectが失敗したのではないでしょうか?
範囲指定とは関係ないです。
そういや
Worksheets("Sheet1").Range("A1").PasteSpecial Paste:=xlPasteValues
でOKでもOKでした。
323デフォルトの名無しさん:2007/02/20(火) 01:40:09
どうでもいいけど、
シート名変更されると危なっかしいから、
シートのオブジェクト名でやった方が無難。
Sheet1.Range〜以下略
意味が分からんならVBA画面でシートを選択してF4押せ。
324デフォルトの名無しさん:2007/02/20(火) 01:50:00
ユーザーがSHIFT+クリックで複数のセルを選択するように
プログラム上で選択中のセルをさらに動的に増やしたいのですが
どうすればいいでしょうか。
325デフォルトの名無しさん:2007/02/20(火) 01:51:53
どういう風に増やしたいのか詳しく。
Offsetとかでいいならそれで。
326デフォルトの名無しさん:2007/02/20(火) 02:12:18
OffsetではなくResizeの方が良いのでは?
327デフォルトの名無しさん:2007/02/20(火) 03:12:28
飛び地で選択できるじゃないですか?
あんな感じで。

2点間を選択してもらって、その間の特定キーワードを含む
セルを自動的に選択する機能を作りたいのですよ。

328デフォルトの名無しさん:2007/02/20(火) 07:49:42
>>327
マクロの記録でctrlキーを押しながら
A1とA3を選択。
これで、離れたセルの指定方法は分かるだろ?

後は、定範囲内をFor Eachとかでまわして
該当セルのaddressとるなりして
同じように選択するだけ。
329デフォルトの名無しさん:2007/02/20(火) 11:06:07
Type MyTestType
ID As Integer
Name As String
End Type

Sub test()
Dim a(3) As MyTestType
'中略
i = TypeTest(a)
End Sub

Function TypeTest(a As Variant) As Integer
'省略
End Function

とコードを組むと、コンパイルエラーが出ます。
Functionの引数の型宣言で、配列を使うこともできませんが、
どのようにしたら、aをFunctionに渡すことができるでしょうか?

よろしくお願いします。
330デフォルトの名無しさん:2007/02/20(火) 11:24:55
VBAでどうやってコンパイルエラーを出したのか知りたいのだが。
331デフォルトの名無しさん:2007/02/20(火) 11:39:42
>>329
クラスを使え


>>330
メニュー > デバッグ > VBAProjectのコンパイル
も知らんのか?

>>329なら普通に実行したってコンパイルエラー出るし。
もしかしてexe吐くことがコンパイルだと思ってるのかな?
332デフォルトの名無しさん:2007/02/20(火) 12:08:03
>>331
クラスってどうつかえばいいのですか?
プロジェクトで挿入からクラスモジュールを挿入して、
Type文を打ち込めばよろしいのでしょうか?

それと、ここはsage推奨ですか?
333デフォルトの名無しさん:2007/02/20(火) 12:16:50
>>332
===== MyTestClass As クラスモジュール =====
Public ID As Integer
Public Name As String
===== EOM =====

===== Module1 As 標準モジュール =====
Sub test()
  Dim a(3) As New MyTestClass
  a(0).Name = "hoge"
  a(0).ID = 10
  i = TypeTest(a)
End Sub

Function TypeTest(a() As MyTestClass) As Integer
  Debug.Print a(0).Name
  Debug.Print a(0).ID
End Function
===== EOM =====

こんな感じで。
クラスモジュールの名前がAs 〜で使う宣言型になる点に注意。

> それと、ここはsage推奨ですか?
別に。回答者はageる必要が無いから慣例的にsageてるだけ。
334デフォルトの名無しさん:2007/02/20(火) 13:40:38
>>333
どうもです。
335327:2007/02/21(水) 02:04:24
マクロで記録したら文字列で指定してたからどうしたもんかと
思いましたが、addressでセル位置の座標を取れるからこれ使えばいいのかな。

問題は解決したけども、なんかほかにスマートな方法があるなら教えてくだされ。
336デフォルトの名無しさん:2007/02/21(水) 15:31:21
GetOpenFilename で「ファイルを開く」 ダイアログ
で左側のデスクトップやマイドキュメントが選べません。どうしてでしょうか?
参照設定で、Microsoft Runtime Scriptingは選択しています。
Office2003, XP Proです。
337デフォルトの名無しさん:2007/02/21(水) 15:49:59
> どうしてでしょうか?
環境が壊れてるからじゃねーの?
とりあえずOSとOfficeを再インストールしてみな。

それとGetOpenFilenameはApplicationオブジェクトのメンバなんで参照設定は不要だし、
Microsoft Runtime Scriptingではなく
Microsoft Scripting Runtimeだろ。これはFSOやDictionaryだからな。
338デフォルトの名無しさん:2007/02/22(木) 15:30:03
  row = 1
For Each a In IEobj.Document.body.getElementsByTagName("A")
If InStr(a.href, "http://xxx.com/") <> 0 Then
x = a.href
Worksheets(1).Cells(row, 1).Value = x
row = row + 1
End If
Next a
こんな感じのURLなのですが、同じアドレスは二度書き込まない風にできますか?
339338:2007/02/22(木) 18:01:47
処理重くなるだけかな
少しぐらい重なってもいいか・・・・
340デフォルトの名無しさん:2007/02/22(木) 19:58:29
>>338
普通に重複チェックして条件分岐すれば良いだけでしょ。
重複チェックにはいろんな手法があるのでお好きなもので。
341デフォルトの名無しさん:2007/02/23(金) 22:15:30
Dim myValue As Single
myValue = 1.0
Charts(1).Name = "Ver. " & myValue

としてエクセルのグラフのタイトルに、 Ver. 1.0 と入力したいのですが、Ver. 1 となります。
こういう場合は、どうすれば "1" を "1.0" と少数点付きにできますか?
342デフォルトの名無しさん:2007/02/23(金) 22:27:30
As String にするか
"Ver." & Format(MyValue, "0.0")で
343デフォルトの名無しさん:2007/02/23(金) 22:52:10
>>342
ありがとう!!!
できた〜!!!!!

ちなみにStringはダメでした。

ほんとにありがとう。
344デフォルトの名無しさん:2007/02/23(金) 23:15:34
ああ、"1.0"にしないと駄目だろうねw
345デフォルトの名無しさん:2007/02/24(土) 01:29:23
Win2000 SP4ではちゃんと動いていたのにXP SP2に持っていったらエラーにはならないんですけどまともに動いてくれません
主に使っている機能はActiveXのInetです。WEBを取り込んで検索して加工した文字列をエクセルに貼り付けてるだけです。

参照設定は正規表現というやつを使いたくて、MSVBScriptRegulerExpresion1.0と5.5を二つ入れました。
1.0と5.5は両方チェック入れたらまずいんでしょうか?本にはMSVBScriptを参照設定しろと書いてあっただけなので不明です。

あとMS Internet Transfer Control 6.0とMS Internet Controls も参照設定してあります。

Win2000 SP4はVB6.0、WinXP SP2はVB6.0ランタイムが入ってます。

最初から2行あったOption Explicit ?ともう一行は文の意味がわからなかったので消しました。

XPのファイアーウォールははずしてあります。

なぜXPだけで不安定になるのか原因わかりますでしょうか?
346デフォルトの名無しさん:2007/02/24(土) 01:33:32
うん、わかる
347デフォルトの名無しさん:2007/02/24(土) 01:37:51
ありがとうございます。試してみます。
348デフォルトの名無しさん:2007/02/24(土) 14:27:41
エラーの時にデバッグを選んだ後停止ボタンを押すと、フォームがひらくのですが、コード画面のままで維持できないのでしょうか?
その度にいちいちコード画面を選び編集したいコードの行を探さないといけないのはつらいです。
349デフォルトの名無しさん:2007/02/24(土) 15:09:31
'初心者です。


Sub なんでだろう@()
Dim あ As Long
あ = Worksheets("Sheet1").Cells(1, 1)
If あ > 3 Then
Worksheets("Sheet1").Rows("1:5").Select
End If
End Sub

'だと動くのに

Sub なんでだろうA()
Dim あ As Long
あ = Worksheets("Sheet1").Cells(1, 1)
If あ > 3 Then
Worksheets("Sheet1").Rows("1:あ").Select
End If
End Sub

'だと動きません。なんでだろう。。。
'親切な方教えてください。
350デフォルトの名無しさん:2007/02/24(土) 15:37:02
range("1:" & あ)では?
351デフォルトの名無しさん:2007/02/24(土) 15:48:27
>>349
×Worksheets("Sheet1").Rows("1:あ").Select
○Worksheets("Sheet1").Rows("1:" & あ).Select
○Worksheets("Sheet1").Range("1:" & あ).Select
○Worksheets("Sheet1").Rows(1).Resize(あ).Select

>>350
このコードを書いているモジュールによってはシートを省略しちゃうと正しく動作しないよ。
「Worksheets("Sheet1")」も書くか、「Rows以降を」と添えよう。
352349:2007/02/24(土) 15:49:50
>>350
ほえ〜。動きました。
なぜだか分からないけど、とにかくこれでやってみます!
ありがとうございました!
353デフォルトの名無しさん:2007/02/24(土) 16:05:06
>>351
あ、RowsのつもりがRangeって打っちゃったよ
354349:2007/02/24(土) 16:09:47
>>351
とにかくいろいろやり方があるんですね!
どうもでした。m( )m

モジュールって何?っていう段階なので、すべてがサッパリ妖精なのですが、
とにかく理解もせずに突き進んでみることにして見ます。。。
355デフォルトの名無しさん:2007/02/24(土) 19:58:05
エクセルのグラフの軸の書式設定にある
Y/数値軸目盛の最大値のところに初期入力してある値を取得する方法ってありませんか?
356デフォルトの名無しさん:2007/02/24(土) 20:22:45
初期値は自動じゃないのか?
まぁ、マクロ記録で変更してみりゃプロパティの名前がわかるだろ。
357デフォルトの名無しさん:2007/02/24(土) 20:35:27
>>356
自動です。
自動で入る初期値がほしいんですが、これに関しては
マクロ記録でいろいろ試してみましがはわかりませんでした。
358デフォルトの名無しさん:2007/02/24(土) 20:53:07
>>357
初期値変更するの記録すればわかると思うけど
ActiveChart.Axes(xlValue).MaximumScale
じゃない?
359デフォルトの名無しさん:2007/02/24(土) 21:14:35
>>358
ありがとうございます。
値の取得ができました。
初期値変更するの記録したつもりだったけど、わからなかったw
360デフォルトの名無しさん:2007/02/25(日) 14:25:00
あぁ〜ん、ユーザーフォームがうまく作れないよぉ〜〜〜ん!!

参考書ばかりが増えていく…
361デフォルトの名無しさん:2007/02/25(日) 14:29:14
わざわざユーザーフォーム作る香具師って馬鹿じゃね?
プログラミング能力の無さをさらけ出してるだけだよ。
362デフォルトの名無しさん:2007/02/25(日) 16:08:29
馬鹿が馬鹿を笑う、ここはそんなスレでつw
363デフォルトの名無しさん:2007/02/25(日) 17:30:50
>>361
kwsk
364デフォルトの名無しさん:2007/02/25(日) 22:30:07
ユーザーフォームを×ボタンをクリックして閉じるときに、
それと同時に上書き保存をしたいのですが
何か良い方法はありますか?
365デフォルトの名無しさん:2007/02/25(日) 22:33:26
>>364
UserForm_QueryCloseイベントに上書き保存のコードを書く
366デフォルトの名無しさん:2007/02/26(月) 02:57:29
動作しないユーザーフォームなら1分もかからずにちゃんと作れるよな。
これすらできないのは才能ないというかなんか根本的におかしい。
367デフォルトの名無しさん:2007/02/26(月) 04:05:54
>>361
の言ってる意味は全然変わらんが

>>366
なら分かる
368デフォルトの名無しさん:2007/02/26(月) 04:55:40
じゃ、>361はこう訂正してみよう。
>わざわざユーザーフォーム作る香具師って馬鹿じゃね?
→ユーザーフォーム作るのに苦労する香具師って馬鹿じゃね?
369デフォルトの名無しさん:2007/02/26(月) 05:03:58
>>368
納得した
ユーザーフォーム使う使わないは用途によるからな
370364:2007/02/26(月) 10:09:54
>>365
ありがとうございます!できました!
>>361
仕入・納品・在庫調べ等々、自分の仕事では
ユーザーフォームないと非常に入力がめんどくさいです。
なので自力で作成しました。
まあ、「市販のソフト買えよ!」と言われればそれまでですが。
371デフォルトの名無しさん:2007/02/26(月) 10:34:35
>>360がやろうとしてることと、>>361,>>366,>>368が指摘してることに遥かなる距離感を感じるのはなぜだろう。

>動作しないユーザーフォームなら

わざわざ動作しないフォームを作る暇人っているんだな。
372デフォルトの名無しさん:2007/02/26(月) 11:47:50
>>370
まさかそれをアクセスでなくエクセルでやってるとか・・・
373デフォルトの名無しさん:2007/02/26(月) 11:58:21
Excelが伝票というケースもあるだろ。Accessの仕事しかやったことないのか
374デフォルトの名無しさん:2007/02/26(月) 20:15:30
Cellの中に文字列があって、その文字列の長さを取得するにはどうすればいいか教えてください。
文字変数の長さの取得方法がわかりません。
375デフォルトの名無しさん:2007/02/26(月) 20:27:35
>>374
Len

文字変数の長さって何?
376デフォルトの名無しさん:2007/02/26(月) 20:40:36
>>375
説明がまずかったですね
たとえば、
a As String
b As Integer

a = "ABC" または a = Range("A1").Valueとして、このA1セルに"ABC"が入っているとします。
それで、 b をこの a の中に入っている文字列の長さの値を入れたいわけです。この場合は3になるわけですが
どうすれば b = 3 とすることが出来るかがわかりません。
377デフォルトの名無しさん:2007/02/26(月) 20:46:05
>>376
答え書いてあるやん
378デフォルトの名無しさん:2007/02/26(月) 20:55:51
b = Len( a )

まあいろいろ期待どおりに動作しない場合も多いがね。
b = LenB(a )

内部がEUCなのでバイトカウントでも(ry
379デフォルトの名無しさん:2007/02/26(月) 20:55:59
>>377
すいません。見落としていました。
>>375
ありがとう
はぁ、なんか疲れてるみたい・・・
380デフォルトの名無しさん:2007/02/26(月) 21:02:18
「文字列の長さ」を「文字変数の長さ」と言い換えたのは
意味があるのかと…思ったわけです。
深く考えすぎたか_| ̄|○
381デフォルトの名無しさん:2007/02/28(水) 15:39:38
マルチすみません。
情報が少ないですが以下の現象で困っております。
環境 WindowsXP Excel2003

エクセルのVisual Basic Editorで社内作成のコントロール(VB6にて)
をはりつけ、その後エクセルを終了すると必ずメモリがReadに・・・
のエラーがでてしまい困っています。あと2時間ほどで調べないといけない
のですが。。。誰かご教授お願いします。
382デフォルトの名無しさん:2007/02/28(水) 15:49:07
> 社内作成のコントロール
の問題を聞かれても、どうにもならんわな。

聞きたいなら最低限そのコントロールのソースを晒せ。
それが出来ないなら自社内で解決しろ。
383デフォルトの名無しさん:2007/02/28(水) 16:00:10
社内掲示板で2ちゃんねる使ってるなんてユニークな会社ですねー
384デフォルトの名無しさん:2007/02/28(水) 17:21:49
dim page as long
URL="http:xxx.com/&page="+cells(x,x)+"&main=
だとエラーは出ないんですが
URL="http:xxx.com/&page="+1+"&main=

URL="http:xxx.com/&page="+page+"&main=
だと型が一致しません13Errorとでるのですが、なぜでしょうか
385デフォルトの名無しさん:2007/02/28(水) 17:27:54
URL="http:xxx.com/&page=" & 1 & "&main="
URL="http:xxx.com/&page=" & page & "&main="
386デフォルトの名無しさん:2007/03/02(金) 02:08:55
objIE.document.forms.Item(0).ID.Value = "ID"
objIE.document.forms.Item(0).PASS.Value = "PASS"
objIE.document.forms.Item(0).submit().Click
これで自動ログインさせたいのですが、ログインするこそはするんですが、
objIE.document.forms.Item(0).submit().Click
の行をデバックで過ぎると

オブジェクトが必要です。(Error 424)
と言うエラーが出てしまうのですが、なにか解決方法はありませんか
387デフォルトの名無しさん:2007/03/02(金) 02:12:50
すみません、書き込んでから気づきました。().Clickが不要だったんですね('A`)
スレ汚しすみませんでした
388デフォルトの名無しさん:2007/03/02(金) 06:55:43
毎日入力するデータを別シートに自動保存して
何日か溜まったら分析したいのですが

例)

3月2日に "Sheet1" の A10 〜 A20 に整数のデータを入力する

コマンドボタンをクリックすると
そのデータが "Sheet3" の 3月2日の列 ( AH10 〜 AH20 ) にコピーされる

翌日、3月3日に "Sheet1" の A10 〜 A20 に整数のデータを入力する

コマンドボタンをクリックすると
そのデータが "Sheet3" の 3月3日の列 ( AI10 〜 AI20 ) にコピーされる

また翌日・・・

という感じに、Sheet1の同じ範囲のデータをSheet3に、日にちごとにずらしてコピーしたいのですが
どうすれば良いのでしょうか?教えて下さい
389デフォルトの名無しさん:2007/03/02(金) 20:58:53
>>388
本日の日付を検索してその列にペーストするように
すれば?
3月2日とかを日付型にしておくとやりやすい。
390デフォルトの名無しさん:2007/03/02(金) 21:06:30
388じゃないですが、388のニーズを想像してマクロ作ってみました。マクロからだと動くのですが、
コマンドボタンをシート1につくってその中へもろもろコピーしてボタンを押すと
Cells(1, i).Select部分が黄色くなって rangeクラスのselectオブジェクトが失敗しました と出てしまうのです。
この部分をどう書き換えたらよかったのでしょうか教えてください。よろしくおねがいします。

Sub Macro1()

Dim i As Integer
i = 1

Do Until Sheet3.Cells(1, i).Value = ""
'シート3の左端から空欄でなかったら一列プラスして繰り返します

i = i + 1
Loop

'空欄だったらシート1のA10〜A20をシート3のi列の10〜20へコピペします

Sheets("Sheet1").Select
Range("A10:A20").Select
Selection.Copy

Sheets("Sheet3").Select
Cells(10, i).Select
ActiveSheet.Paste

Sheets("Sheet3").Select
Application.CutCopyMode = False

End Sub
391デフォルトの名無しさん:2007/03/02(金) 21:18:26
>>390
Cells(1, i).Selectってどこに出てくるの?
別にエラーにはなりませんでしたよ。

このやり方だと1列目にあらかじめ日付が入力されていると
変なところへコピーされますね。
392デフォルトの名無しさん:2007/03/02(金) 21:25:09
>>390
Selectいらなくね?
後、iが256越えたら普通にエラーになると思われ。
393デフォルトの名無しさん:2007/03/02(金) 21:37:03
>>391
388を読んで当初A1:A20で直して貼り付けて未修正ですいませんでした。
黄色部分は、→箇所になります。

  Sheets("Sheet3").Select
→ Cells(10, i).Select
  ActiveSheet.Paste
394デフォルトの名無しさん:2007/03/02(金) 21:40:23
>>392 
なんで256なのかわからないんですが解決したら256回やって調べてみます。
レスありがとうございます。

395デフォルトの名無しさん:2007/03/02(金) 21:44:46
>>394
列が256しかないから。
396デフォルトの名無しさん:2007/03/02(金) 21:47:47
>>395見て早速 IVまで数えたら256列でした。勉強なりました。


参考になるかわからないのですが
この画像は、シート1でボタンを押した後、エラーが出てる画面です。
http://www.imgup.org/iup341303.png.html
397392:2007/03/02(金) 21:48:47
>>394
書き方悪かったスマン
俺のExcelのバージョンだと
列数は256なんだけど、
200から列数って大幅に増えたんだっけ?

つまり終端を越えたらエラーになると言いたかった
398デフォルトの名無しさん:2007/03/02(金) 21:50:21
>>397
了解しました。
399デフォルトの名無しさん:2007/03/02(金) 22:22:44
Do Until Sheet3.Cells(1, i).Value = "" の「Sheet3」
という書き方と
Sheets("Sheet3").Selectの「Sheets("Sheet3")」は
なぜ違う書き方をしてるの?

400デフォルトの名無しさん:2007/03/02(金) 22:23:31
>>396
たぶんSheetがActiveになってないからSelectできない
Sheets("Sheet1").Select → Sheets("Sheet1").Activate
にすれば動かない?

てか
Private Sub CommandButton1_Click()
Dim i As Integer
i = 1
Do Until Sheet3.Cells(1, i).Value = ""
i = i + 1
Loop

Sheets("Sheet1").Range("A10:A20").Copy Sheets("Sheet3").Cells(10, i)
End Sub

とかでいいような気が。。。検証してないけど。。。
401デフォルトの名無しさん:2007/03/02(金) 23:04:57
>>396
おかしいな。
エラーにならなかった。
402388:2007/03/03(土) 01:35:10
遅レスになりまして申し訳ありません

皆さん、有難うございます

>>390さんのマクロを拝借させていただこうと思います
403デフォルトの名無しさん:2007/03/03(土) 02:26:39
すみません。
別名で保存(ThisWorkbook.SaveAs filename:=Fname)すると、
シート名の頭にファイル名が [ ] 書きで付いてしまいます。
付かないようにする方法は無いのでしょうか?
404403:2007/03/03(土) 02:36:42
すみません
ファイル名の先頭に [ ] をつけていたのが異状の原因ですた。
405デフォルトの名無しさん:2007/03/03(土) 03:21:00

簡単にお金稼ぎ!!!

以下の手順でやれば、無料でお金稼ぎができます。
企業も広告の宣伝になるから、お金をくれるわけです。
最初の1日目で 2000 円〜3000 円 は確実に稼げます。
実際の作業は数十分程度、1時間はかかりません。

(1) http://getrich.lxl.jp/
   ↑このアドレスからサイトに行く。
(2) ゲットマネー登録サイトに移動するので、
 そこで無料会員登録をする。
 ※フリーメールアドレスでもOK。
(3)ポイントを稼ぎます。
 懸賞の応募や無料会員登録をすればするほど、
 ポイントが貰えます。
 他にも沢山種類があるので、1日目で
 約 20000 ポイントは GET できます。
(4) 10000 ポイントから、現金に交換できます。
(5)キャッシュバックという所がありますので、
 そこから交換をしましょう。

これで現金を稼ぐといいですよ!!!

無料会員登録はこちらから↓
http://getrich.lxl.jp/
406デフォルトの名無しさん:2007/03/03(土) 11:50:51
材料
textbox ボタン

ボタンを押すと対応した数字がテキストに羅列して行くようにしたいんですがどうかけばいいですか( ´・ω・` )

ex ボタン1 1回目 →textの表示1
        2回目 →textの表示11
407デフォルトの名無しさん:2007/03/03(土) 11:56:44
ヒント:a = a & "1"
408406:2007/03/03(土) 12:23:05
出来たと思ったら6回ぐらい押したらオーバーフローとかいうのいになりました orz

Dim mema As Integer


Private Sub Bot1_Click()

mema = mema & 1

  Text1.Text = mema


End Sub

これじゃダメなんですかねorz
409デフォルトの名無しさん:2007/03/03(土) 12:26:01
string形式にしたらいけました、どうもすんませんn
410デフォルトの名無しさん:2007/03/03(土) 16:41:25
ブックを閉じる時上書き保存するわけですが
同時にバックアップを取りたい場合、どいうコードになるのでしょうか?
便宜上"c:\BackUp"に保存したいと仮定してお願いします。
411デフォルトの名無しさん:2007/03/03(土) 19:07:31
ThisWorkbook の Workbook_BeforeClose
でSaveAs メソッドを使って、そのフォルダに保存すれば?
412デフォルトの名無しさん:2007/03/03(土) 20:20:16
>>411
レスありがとうございます。はじめそれでやってたんですが
なんか閉じるたびに実行するのもうっとうしいので、
色々こねくりまわしてできました。
ただ、先にCtrl+Sなどで上書きしていた場合はバックアップが
更新されないのがネックです。かといって閉じるたびに実行されるのも
うっとうしいので、ここいらで妥協しなければならないのでしょうか?

Sub Auto_Close()
  Dim fName As String

  fName = "C:\BackUp\HogeBackUp.xls"

  If Not ThisWorkbook.Saved Then
    ThisWorkbook.Save
    If Dir(fName) <> "" Then
      Kill (fName)
      ThisWorkbook.SaveAs "C:\BackUp\HogeBackUp.xls"
    Else
      ThisWorkbook.SaveAs "C:\BackUp\HogeBackUp.xls"
    End If
  End If
End Sub
413デフォルトの名無しさん:2007/03/03(土) 23:22:05
BeforeSaveでSaveCopyAsとか
414デフォルトの名無しさん:2007/03/04(日) 17:02:14
>>413
レス有難うございます。イベントはあまり使わないので知らなかったんですが、
BeforeSaveとSaveCopyAsでやりたいことが実現できましたm(_ _)m
上書きも間単にできますね。

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  Dim fName As String
  fName = "C:\BackUp\hogeBukup.xls"
  ThisWorkbook.SaveCopyAs FileName:=fName
End Sub
415デフォルトの名無しさん:2007/03/04(日) 19:13:48
各セルに複数の情報を持たせたいんですが、
セルにユーザ定義のオブジェクトを関連付けることって可能ですか?
単純に
Cells(1,1).Value=オブジェクト
は無理でした・・orz
背景色やら、ハッチパターンに強引に埋め込んでますが、なんか汚くて・・
416デフォルトの名無しさん:2007/03/04(日) 19:23:34
複数シートにすればいいじゃん
邪魔なら非表示にすればいいし
417デフォルトの名無しさん:2007/03/04(日) 19:27:21
何をやろうとしてるのか知らないが、そういうことをやりたければ
オブジェクトに関連付けた値(key)をセルに入れておくのが良いだろう。

そのセルに入れられたkeyから、そのkeyに関連付けられたオブジェクトを呼べるので
結果的にセルとオブジェクトが関連付けられたことになる。
418デフォルトの名無しさん:2007/03/04(日) 19:40:10
なるほど。やはり直接は無理ですか。
お二方のご提案、参考にさせて頂きます。ありがとうございました。
419デフォルトの名無しさん:2007/03/04(日) 22:36:39
シート上にコンボボックスが存在するかしないかをbooleamで返す
方法はありませんか?
420デフォルトの名無しさん:2007/03/04(日) 22:46:27
シート上のコントロールコレクション内に
TypeName()="ComboBox"に一致する物が有るか否かを
booleam型で返す関数でも作ればいいと思いますが。
421419:2007/03/04(日) 23:46:16
ありがとうございます。
こんなのを作ってみたのですが、オブジェクトが必要です、と
出てしまうんですが...

Function Comboexist(name) As Boolean
Dim MyControl As Control
For Each MyControl In Controls
If MyControl.name = name Then
Comboexist = True
Exit For
Else
Comboexist = False
End If
Next
End Function
422デフォルトの名無しさん:2007/03/05(月) 00:23:47
そりゃオブジェクトは必要ですよ
423デフォルトの名無しさん:2007/03/05(月) 01:02:48
419 名前:デフォルトの名無しさん[] 投稿日:2007/03/04(日) 22:36:39
シート上にコンボボックスが存在するかしないかをbooleamで返す
方法はありませんか?

420 名前:デフォルトの名無しさん[sage] 投稿日:2007/03/04(日) 22:46:27
シート上のコントロールコレクション内に
TypeName()="ComboBox"に一致する物が有るか否かを
booleam型で返す関数でも作ればいいと思いますが。

booleam? 二人だけの世界なのか?
424デフォルトの名無しさん:2007/03/05(月) 01:07:34
ユーザー定義型なんでしょ
だから420もそのユーザー定義型で返せばいいって言ってるだけじゃん

組込み型以外は世界のの常識外なのか?
425デフォルトの名無しさん:2007/03/05(月) 03:28:30
質問です。
アクセスで出力したレポートをエクセルかワードに読み込んで
それにパスワードをつけてメールを作成、添付したいのですが
この一連の流れをマクロで出来ますか?
どのようにすれば良いでしょうか?
ご教授お願いします。
426デフォルトの名無しさん:2007/03/05(月) 06:54:59
ADOでアクセスに接続して

データをエクセルに取り込んで、

メール(OUTLOOK辺り?)に添付して

送信する

と言った流れに分解してそれぞれを組んでいけばいいかと思うが、ネボケ眼でできることじゃない w
427デフォルトの名無しさん:2007/03/05(月) 18:40:13
すみません、教えて下さい
あるセル範囲に名前を付けて居て、マウスでセルを一つ選択、または複数選択された時に
選択された場所が、名前付きのセル範囲の中なのかどうかを、判断するにはどうすれば
良いのでしょうか?

4隅の座標の中に有るかどうかを、全てIF文で見なくてはダメですか?
428デフォルトの名無しさん:2007/03/05(月) 19:07:40
フォルダに入っている複数のcsvのファイルを、一枚のエクセルファイルにワークシートでまとめ直したいんですが、この手のスクリプトを配付しているところをお知りではありませんでしょうか?

自分で組もうとしたんですが、力果てました><

よろしくお願いします!
429デフォルトの名無しさん:2007/03/05(月) 19:11:18
まあ無理でしょ
左上と右下のCells(r,c)の数字で範囲チェックすれば簡単だと思う
430デフォルトの名無しさん:2007/03/05(月) 19:12:44
>>429>>427のレスね

431デフォルトの名無しさん:2007/03/05(月) 19:21:22
>>428
直接既存のブックにcsvファイルを読み込んでいく方式ではなく
csvをブックとして開いて、csvシートをまとめ用ブックに移していくという方式だと簡単だよ。
csvをブックとして開くのも、シートを別ブックに移すのもマクロの記録で録れるから。
432デフォルトの名無しさん:2007/03/05(月) 21:32:53
>>427
Application.Intersectを使って結果がNothingかどうかで判定すればいい。
一部は中で一部は外の場合の真偽をどうするかによって
やり方は若干違ってくるけど。
433428:2007/03/05(月) 22:13:33
>>431
レスありがとうございます。
たすかります。

すいません。もしその方法でやろうとすると
もしファイルネームが変わった場合ってどう動かせばいいんでしょうか;;

ファイル名が連番ではなく、
たとえば日付とかでファイル名をつけたときとか、
規則性がない場合とか。

楽にできる方法があれば、複数あるとありがたいのかなあ、って。

ちょっと人から頼まれたものなので、
一つの方法でわかっていただけるかなあ、て、
ちょっと心配で。

自分でもちょっとほかの方法でやってみてるんですが・・・うまくいかなくて。
434428:2007/03/05(月) 22:20:59
自分が今やってみている方法はこんな感じなんですが、
(あんまりきれいな組み方じゃないんですが;;)

Sub 複数のファイルを一つに()

Workbooks.OpenText FileName:="C:\Documents and Settings\name\デスクトップ\複数ファイル\csv.xls"

Dim myFile As Variant
Dim mySheet As Variant

myFile = Dir("C:\Documents and Settings\name\デスクトップ\複数ファイル\*.csv")
Workbooks.OpenText FileName:="C:\Documents and Settings\name\デスクトップ\複数ファイル\" & myFile


Do While myFile <> ""
mySheet = ActiveSheet.Name
Sheets(mySheet).Move After:=Workbooks("csv.xls").Sheets(1)
myFile = Dir()
Loop

Worksheets("Sheet1").Delete
Worksheets("Sheet2").Delete
Worksheets("Sheet3").Delete
ActiveWorkbook.SaveAs FileName:=Format(Date, "mm月dd日") & ".xls"
End Sub

435428:2007/03/05(月) 22:22:07
ここまですすんだものの、ファイル名がうまく取得できてなくて、
一枚のファイルしか読み込めない(泣)

すいませんが、もうちょっとだけお力添えをいただけるとありがたいです。

これが動いたら、ダイアログでフォルダ指定して〜とか
いろいろつけたしていこうかな、とおもっているんですが、
まずはベースが動かないと、どうしようもならない;;
436デフォルトの名無しさん:2007/03/05(月) 22:35:27
あのさ、こんなところで聞かなきゃ答えられない程度のレベルなら
カッコ付けずに「ごめんね、解らないから他の人に聞いて」って相手に言えよ。
最悪どうしても必要なら、有料でそういうアドインとか作ってくれるところもあるから
お前が答えなきゃどうしても困るってことは無いだろ。
437デフォルトの名無しさん:2007/03/05(月) 22:48:28
Workbooks.OpenTextを1回しか実行してないんだから、開くファイルが一つなのは当然だろ
複数開きたければWorkbooks.OpenTextをループの中に入れてやれよ

なんでファイル名を取得する処理をループ内に書いてるのに、
取得したファイルを開く処理をループ内に入れないのかねぇ
438デフォルトの名無しさん:2007/03/05(月) 22:51:21
ファイル検索結果のコレクションをfor each ... in ... でぐるぐる回すといいと思うよ
439デフォルトの名無しさん:2007/03/05(月) 23:04:20
> ファイル検索結果のコレクション
って何?
検索結果(フィルタを掛けた状態)をコレクションで返す関数なんてVBAにあったっけ?
まさか、こんなことに外部COM使えとか言わないよね。
440デフォルトの名無しさん:2007/03/05(月) 23:14:54
あれ?Application.FileSearchの
.FoundFilesってやつだけど
ヘルプ見たらコレクションじゃなくてオブジェクトになってるな
441デフォルトの名無しさん:2007/03/05(月) 23:22:29
それのことかよ(゚听)
442デフォルトの名無しさん:2007/03/05(月) 23:57:16
csvくっつけるだけなら、こんな感じでいんじゃね?
後は、開きなおしてxlsで保存しなおすとか。
もちろん例外処理はしてない。

Sub mergeCSV()
'csvファイルが入ってるフォルダのパス
csvFolder = "C:\CSV"
Set fso = CreateObject("Scripting.FileSystemObject")
Set mergeFile = fso.CreateTextFile(csvFolder & "\hoge.csv", True)
For Each f In fso.getFolder(csvFolder).Files
If LCase(Right(f.Name, 3)) = "csv" Then
mergeFile.Write fso.OpenTextFile(f.Path).readAll
End If
Next
mergeFile.Close
End Sub

コードで意味のわからない部分はググれ。

やっつけ仕事のコードを貼っといてなんだけど
概ね>>436に同意。
人から頼まれたんなら、例外処理とかもしないとダメだろうし。
443デフォルトの名無しさん:2007/03/07(水) 03:35:20
エクセルVBAでつくったソフトって、外部DLL化ってできるんですか?
なんでもデベロッパーを使うとできるみたいな話をチラッと聞いたんですけど、
エクセルのシート上で動かすようなマクロでもDLL化できるんでしょうか。
それとも、やっぱユーザーフォームを使ってエクセルシートとは別個の窓に
しないとだめなんでしょうか。
ご存知の方いたら、教えていただけると助かります。
よろしくお願いします。
444デフォルトの名無しさん:2007/03/07(水) 11:57:52
>>443
COMアドインのことかな。

作りたければこれDeveloperバージョンか↓を買ってね。
ttp://www.amazon.co.jp/Visual-Studio-Tools-Office-2005/dp/B000CSRIZA

一般的なProfessionalとかStandardではCOMアドインは作れないよ。
高い物にはそれなりの理由があるってこった。あとは高い金出してでもCOMアドイン作りたいか
そんな金出すくらいなら作るの諦めるか、君の好きにすればいい。

まあ、言語と簡易さに拘らなければ、無料の開発環境で作れないことも無いけどね。>>COMアドイン
C++とかでも作れるわけだが、さすがにそうなるとスレ違いなので、あとは自分で調べよう。
445デフォルトの名無しさん:2007/03/07(水) 13:35:24
Excelスレから誘導されて参りました。マルチになって申し訳ないです。

【1 OSの種類         .】 Mac8.6
【2 Excelのバージョン   】 Excel2001
【3 VBAが使えるか    .】 少し
【4 VBAでの回答の可否】 可
【5 検索キーワード    】 マクロ PC名 取得 GetComputerName Environ
【6 検索サイト    】 すぐマク

質問させて頂きます。
ネットワークに繋がった共有スペースにブックを置いて使用する場合
最終的にどのPCで更新されたかをシート上に表示したいのです。

 セルの文字列をPC名に変更→上書き保存

というのを書きたいのですが、PC名を取得する記述が判りません。

ご存知の方いらっしゃいましたら、ご教示宜しくお願い致します。
446デフォルトの名無しさん:2007/03/07(水) 13:43:00
>>445
誰もここへの誘導なんてしてないし、ここでもスレ違いだよ。
とりあえずMac板行こうな。
447デフォルトの名無しさん:2007/03/07(水) 14:09:49
>>443
VBAが強力過ぎて逆に厄介だな
そんな事するなら別の言語で組めと言いたい
448デフォルトの名無しさん:2007/03/07(水) 21:27:04
>>445
移動前のスレッドで「UserNameじゃだめなの?」っていう
レスがついていたのですがお読みになりましたか?
たぶんこういうことかなと思うのですが
Sub UserName()
Dim strUserName As String
strUserName = Application.UserName
MsgBox strUserName
End Sub
449デフォルトの名無しさん:2007/03/08(木) 10:32:46
>>444
>>447
できるにはできるけど、コストかけてVBAにこだわる理由はあるのか、
ってところでしょうか。
自分の場合、単なる食わず嫌いだと思うので、
別の言語取得した方がよさそうですね。
レスありがとうございました。
450デフォルトの名無しさん:2007/03/08(木) 12:43:04
>>449
取得しても、習得しないと無理じゃね?
#修得でもいいけど。
451デフォルトの名無しさん:2007/03/08(木) 22:45:10
エクセルVBAを独学するのに良い教材を教えてください。
452デフォルトの名無しさん:2007/03/08(木) 22:56:34
↑ネットで調べるのがいいんじゃないの
色々情報でてくるし、質問もできる最高の教材じゃないか
453デフォルトの名無しさん:2007/03/08(木) 23:10:23
実物とヘルプとマクロ記録があればなんとかなるさ
454デフォルトの名無しさん:2007/03/09(金) 04:27:58
>>451
本屋いけ
455デフォルトの名無しさん:2007/03/09(金) 06:52:20
>>451
VBAマクロのサイトで基本的なことをやりながら、頭に入れておく。

エクセルで複数の動作を単体で録画して、動作を組み合わせる

ソースの値や色などを変えてみる

範囲設定や繰り返し、分岐などを組み込んでみる。

ここや質問スレのマクロをROMったり実行してみる

上のスレで出た質問でわかるところはマクロ組んで答えてみる。

継続してやってみる。
456デフォルトの名無しさん:2007/03/09(金) 08:55:47
>>450
ラジャーwwww
457デフォルトの名無しさん:2007/03/09(金) 11:07:24
生粋の初心者です。教えて下さい!

エクセルのマクロで、FOR−NEXTを使って平行線を引くとき

座標値をセル参照したいんですけど、

Addline(100,Range("sheet2!A1"),200,Range("sheet2!A1"))

の A1 を A1,A2,A3 の様に使うには、どの様に書けばいいのですか?

言いたいことが判りづらかったらすみません。

宜しくお願いします。
458デフォルトの名無しさん :2007/03/09(金) 13:16:47
>>457

>A1 を A1,A2,A3 の様に使うには
非常に分かりにくい表現の仕方だね。
例えば、Sheet2のA1〜A3のセルに
A1=100
A2=110
A3=120
とかはいったりするわけね。
このA1〜A3の値を変数(IDX)にして平行線を引けばいいってことだよね。
平行線はSheet2に引いちゃうからね。

Dim IDX As Integer
Sheet2.Select 'Sheet2をActiveにしないなら必要なし
For IDX = 1 To 3
Worksheets("Sheet2").Shapes.AddLine(100, Range("sheet2!A" & IDX).Value, 200, Range("sheet2!A" & IDX).Value).Select
    '.Valueなしでも動く
Next IDX

このあたりで勉強してみたら?
http://www.asahi-net.or.jp/~ef2o-inue/top01.html
459デフォルトの名無しさん:2007/03/09(金) 14:13:24
>>458
ありがとうございます。
助かりました!

460デフォルトの名無しさん:2007/03/09(金) 17:20:22
ホイールマウスでスクロールできません

VBAプロジェクトの窓はスクロールできるのですが
コードを記述するところがスクロールしなくなりました。
今はスクロールバーをクリックしてスクロールしてます。

教えてちゃんですみませんが教えてください。
461デフォルトの名無しさん:2007/03/09(金) 23:11:59
>>460
⊃ どこでもホイール

これインストしれ!
462457:2007/03/12(月) 16:44:31
すみません・・もう一つ教えて下さい。
引いた線に名前を付けたいんですが、

 ActiveSheet.Shapes.AddLine(X1,Y1,X2,Y2).select.name = "sen"

だと、”オブジェクトが必要です”とエラーになります。
どう書けばいいのですか? 色々調べたけどわかりません・・

463デフォルトの名無しさん:2007/03/12(月) 17:12:37
何を調べてそのコードになったのか。。。
464457:2007/03/12(月) 17:53:37
馬鹿な奴だとお思いでしょうが、HELP機能も
インストールされて無くて、手探りでやってるんです。

どうか、この馬鹿に教えてやって下さい!
465デフォルトの名無しさん:2007/03/12(月) 19:21:13
selectがいらない

466デフォルトの名無しさん:2007/03/12(月) 19:56:44
ご助言をお願いします

こんな感じで、複数有るシートをマクロで保護していますが
以下の処理が実行される時に、シートがパラパラと表示してしまいます
これを回避して、常にトップのシートだけをアクティブな状態で出来ないでしょうか?

For Each ws In Worksheets
ws.Protect Password:=PW, DrawingObjects:=True, _
contents:=True, UserInterfaceOnly:=True
Next
467デフォルトの名無しさん:2007/03/12(月) 22:36:48
for文で繰り返しの最中、一定の条件を満たした場合にその途中で繰り返しを抜ける方法はないのでしょうか?
というかC言語で言うbreak文的なものVBAにはないのでしょうか?
468467:2007/03/12(月) 22:40:54
一個レス上の467です。自分で答え見つけることできました(-_-;)
469デフォルトの名無しさん :2007/03/12(月) 22:50:12
>>457
今後もVBAやる気があるならHELPはいれておけ!

>>465
これでちらつかないはずだが?

Application.ScreenUpdating = False
For Each ws In Worksheets
   ws.Protect Password:=PW, DrawingObjects:=True, _
   contents:=True, UserInterfaceOnly:=True
Next
Application.ScreenUpdating = True
470466:2007/03/12(月) 23:00:54
>>469

ありがとうございました
表示の更新を押さえるのは、気が付きませんでした
m(__)m
471457:2007/03/13(火) 07:12:05
>>465,469
ありがとう!
頑張って使えるように努力します。
472デフォルトの名無しさん:2007/03/13(火) 14:55:13
質問です。

If Sheet1.Cells(1, 1) = "あ゙" And Sheet1.Cells(1, 2) = "い" And Sheet1.Cells(1, 3) = "き" And Sheet1.Cells(1, 4) = "い" And Sheet1.Cells(1, 5) = "わ"
And Sheet1.Cells(1, 6) = "そ" And Sheet1.Cells(1, 7) = "い" And Sheet1.Cells(1, 8) = "い" And Sheet1.Cells(1, 9) = "い" And Sheet1.Cells(1, 10) = "よ" Then
処理
end if

このような色々な条件が重なった場合のみ処理を行ないたいのですが
if文がとても長くソースが見づらいです。(※2ch上も長くて書き込めないので改行しました。)
ソース上で改行などして見やすくする事は出来ませんか?
もしくはもっと便利なやり方はありませんか?

宜しくお願い致します。
473デフォルトの名無しさん:2007/03/13(火) 15:35:51
>>472
Andの後ろに半角で「 _」と入れて
改行すれば大丈夫。
474デフォルトの名無しさん:2007/03/13(火) 15:52:23
> もっと便利なやり方
の方がいいと思うけど
475デフォルトの名無しさん:2007/03/13(火) 16:34:23
>>472
cell.valueを連結して、文字列と較べればいいんでない?
476デフォルトの名無しさん:2007/03/13(火) 18:25:29
セルの中に丸印や、レ点などを打てば、そのセルの行すべてが別の
エクセルファイルにコピーされる方法ってありますか?
ちなみにコピーされたあと、コピー元の行の中身は空白にしたいです。
477デフォルトの名無しさん:2007/03/13(火) 18:47:20
いや、有るか無いかではなくそういう機構を作ればいいだけの話でしょ
それを作る上で解らない部分を具体的に聞くならまだ良いが
全然解らないから、一から十までコード書いてよこしやがれというなら、帰れ
478デフォルトの名無しさん:2007/03/14(水) 04:00:40
>>472

処理速度を考慮するとコレしかないだろ

With Sheet1
If .Cells(1, 1) = "あ゙" Then
If .Cells(1, 2) = "い" Then
If .Cells(1, 3) = "き" Then
If .Cells(1, 4) = "い" Then
If .Cells(1, 5) = "わ" Then
If .Cells(1, 6) = "そ" Then
If .Cells(1, 7) = "い" Then
If .Cells(1, 8) = "い" Then
If .Cells(1, 9) = "い" Then
If .Cells(1, 10) = "よ" Then
処理
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End With
479デフォルトの名無しさん:2007/03/14(水) 05:40:14
毎日指定時刻に関数を実行する方法はないですか?
Application.OnTimeだと、指定時間に、一回しか実行されません。
480479:2007/03/14(水) 05:40:45
マシンを立ち上げっぱなしで実行したいと考えています。
481デフォルトの名無しさん:2007/03/14(水) 05:45:23
指定した時刻に何秒間隔(またはランダム)で何回繰り返すとかもっと具体的に書いてない。
書いた後、自分なりに作ったソースをもってこないと答えをもらうのが難しいスレです。
482デフォルトの名無しさん:2007/03/14(水) 06:53:07
>>479
OnTimeで実行するマクロにOnTimeを書く
483デフォルトの名無しさん:2007/03/15(木) 02:58:35
<form action="test.test" method=post>
<input type=hidden name=submit value=confirm>
<input type="hidden" name="test_a" value="123456789">
<td><input type=submit value=" Yes "></td>
</form>
というフォームがあるんですが<input type=submit value=" Yes ">をクリックするにはどうすればいいでしょうか?
IEobj.document.forms(0).getElementsByTagName("input")(2).Click や
IEobj.document.forms.Item(0, 0).submit など試したのですがうまく行きません
484デフォルトの名無しさん:2007/03/15(木) 07:36:04
>>483
スレ違い(>>225)
485デフォルトの名無しさん:2007/03/15(木) 08:48:16
<form action="test.test" method=post>
<input type=hidden name=submit value=confirm>
<input type="hidden" name="test_a" value="123456789">
<td><input type=submit value=" Yes "></td>
</form>
というフォームがあるんですが<input type=submit value=" Yes ">をクリックするにはどうすればいいでしょうか?
IEobj.document.forms(0).getElementsByTagName("input")(2).Click や
IEobj.document.forms.Item(0, 0).submit など試したのですがうまく行きません
VBAの板で質問したのですが、スレ違いということでコチラに書き込みました。
486デフォルトの名無しさん:2007/03/15(木) 08:50:48
書き込みし間違えたようです、すみません
487デフォルトの名無しさん:2007/03/15(木) 09:04:32
何この嫌がらせw
488デフォルトの名無しさん:2007/03/15(木) 15:03:46
教えて下さい
bookからbookへセル内容をコピーしたいんですが

Workbooks("DF.xls").WorkSheets("Dc").Range("A4").Copy
Workbooks("AF.xls").WorkSheets("データシート").Range("A9").Pastespecial paste:=xlpasteValues

で、”オブジェクトはこのプロパティまたはメソッドをサポートしていません”
のエラーが2行目で出ます。
何がいけないんでしょう?

489488:2007/03/15(木) 15:42:52
すみません、自己解決しました。
ただのスペルミスでした orz
疲れてるみたいです…。
490デフォルトの名無しさん:2007/03/15(木) 19:27:38
お疲れ様

 _,,..i'"':,
|\`、: i'、
.\\`_',..-i
  .\|_,..-┘
491デフォルトの名無しさん:2007/03/16(金) 08:26:36
Excel2000のマクロで午前8時00から午後15時10分まで10秒置きに実行したいと考えております。
“色表示”というマクロで5秒ほどで計算できるものです。

Sub OnTimeSamp1()

Dim runtime As Integer
runtime = Second(10)
Do
Application.Ontime EarliestTime:=TimeValue("8:00:00") + runtime _
, Procedure:="色表示", LatestTime:=TimeValue("15:10:00")

runtime = runtime + Second(120)

Loop

End Sub

と書いたのですが、120秒おきにしてもメモリ不足と言われ、かなりCPUに負荷をかけているようです。
解決法を教えてください。
492デフォルトの名無しさん:2007/03/16(金) 11:07:13
色々使い方がまちがっとる。
まずはググレてApplication.Ontimeの使い方を理解しろ
あと、DOLOOPはいらん。
493デフォルトの名無しさん:2007/03/16(金) 11:17:20
最初に全予定時刻実行予約するより
(これがメモリ不足の原因だな)
実行時に次の実行予約すればいい
494デフォルトの名無しさん :2007/03/16(金) 15:07:33
>>491
さてDO LOOPはいったいいつ終了するでしょうか?
まさか15時10分なんていわないよな?

コーディングしっぱなしで、デバックとか全くしてないだろ?
こんなひどい作りかけを直す気にはならないな。
ヘルプとかでOnTimeの使い方みて、サンプル動かしたんかい?
一番シンプルな形で動かしてみりゃ、どんな挙動するか分かるだろ?

8時00から15時10分まで
10秒置きに全て展開したっていいくらいだ。
7時間10分=430分=430×60秒=25800秒
10秒置きだから2580パターンになるかな。
まあメモリ不足になることを承知のうえでだが・・・。

Application.Ontime EarliestTime:=TimeValue("7:59:50") + TimeValue("0:00:10") , Procedure:="色表示"
Application.Ontime EarliestTime:=TimeValue("8:00:00") + TimeValue("0:00:10") , Procedure:="色表示"
(略)
Application.Ontime EarliestTime:=TimeValue("15::09:50") + TimeValue("0:00:10") , Procedure:="色表示"

あとはどうやったらメモリを節約できるか考えてみな。
495デフォルトの名無しさん:2007/03/16(金) 17:58:20
一応、Loopが終わるように書き直してみました。
runtimeがIntegerでないことは承知なのですが、Secondを使うとエラーがでてしまうので。
これでも、メモリ節約はできませんかね。


Sub OnTimeSamp1()

Dim runtime As Integer
runtime = Second(10)
Do
Application.Ontime EarliestTime:=TimeValue("8:00:00") + runtime, Procedure:="色表示"

runtime = runtime + Second(10)

Loop While runtime = Second(2220)

End Sub
496デフォルトの名無しさん:2007/03/16(金) 18:06:58
まあそれで動くならいいんじゃない?
497デフォルトの名無しさん:2007/03/16(金) 18:39:11
こんにちは。現在プログラムをしているのですが、難しくててこずっています。
そこで、知恵を貸していただきたいと思い、書き込んでいます。

以下はExcelでできるでしょうか?

A=x*exp(-u*B)+y*exp(-v*B)+z*B^(-(w+1))
という関数があり、x,y,z,u,v,wは未知数で
AとBはExcelのA列とB列にそれぞれデータが600与えられていて、
test.csvとして保存しています。

このx,y,z,u,v,wの未知数6個を上式の関数とA,Bの配列(?)を用いて,
収束させることによって求めたいと思っています。

ご教授お願いします。
498デフォルトの名無しさん:2007/03/16(金) 19:14:19
マイクロソウトノページ  ttp://support.microsoft.com/kb/151503/ja
もみつけたのですが、
8時から15時10分まで10秒おきに色表示を起動させる場合

Dim icount as Integer, inumberofcalls As Integer
Sub StartOnTime()
icount = 1
inumberofcalls = 2220

' Format the selected cells as time.
Selection.NumberFormat = "h:mm:ss AM/PM

Call OnTimeMacro
End Sub
Sub OnTimeMacro()
If icount <= inumberofcalls Then
Application.OnTime ("8:00")+ TimeValue("00:00:10"), _
"色表示"
icount = icount + 1
Else
Exit Sub
End If
End Sub
Sub 色表示()
'省略
Call OnTimeMacro
End Sub

Selection.NumberFormat = "h:mm:ss AM/PM がわかりません。よろしくお願いいたします。

499デフォルトの名無しさん:2007/03/16(金) 19:22:59
へlp見ろや
500デフォルトの名無しさん:2007/03/16(金) 19:28:48
>>497
まずはどこまで出来てるのか書こう。当然、正しく動かない物でも良いから。
501デフォルトの名無しさん:2007/03/17(土) 01:04:47
とりあえず、10秒おきに静かに動き出せました。
ありがとうございました。
502デフォルトの名無しさん:2007/03/17(土) 04:50:37
FunctionとかSubにコントロールを渡したいわけだが
実行するとエラーがでる
たとえば

Private Sub Convert(lb as ListBox)

ってやつにリストボックスの参照を渡したいわけだがエラーだ
手法が間違ってるのかVBAでは無理なのかどっちなのかすらわからんといふ
503デフォルトの名無しさん:2007/03/17(土) 07:02:50
渡すことは可能だし、その受け取る側の定義自体も間違ってはいないよ
おそらく渡す部分か、受け取った後のところで変なことしてるんだろう
情報隠してるから実際に何処が悪いのかはわからないが
504デフォルトの名無しさん:2007/03/17(土) 08:22:23
>>502
Private Sub Convert(lb as MSForms.ListBox)
505デフォルトの名無しさん:2007/03/17(土) 12:05:29
>>504
それにしたらできた
とんくす
506デフォルトの名無しさん:2007/03/17(土) 15:40:42
Sheet1〜Sheet24のC1にある数値をSheet100のA1〜A24にコピーしたいのですが、2行目でオブジェクトがありませんとエラーが出てしまいます。
他にもいろいろ試したのですが、解決策が見つかりません。
よろしくお願いいたします。

Sub 証券コードコピー()
'
'
Sheets("Sheet1").Select
Cells(1.3).Value.Select
Selection.Copy
Sheets("Sheet100").Select
RANGE("A1").Select
ActiveSheet.Paste

Dim NUMBER As Integer
NUMBER = 2

Do
Sheets("Sheet & NUMBER").Select
Cells(1.3).Value.Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Sheet100").Select
RANGE("A & NUMBER").Select
ActiveSheet.Paste
NUMBER = NUMBER + 1
Loop While NUBER = 23

End Sub
507デフォルトの名無しさん:2007/03/17(土) 15:55:33
>>506
×Cells(1.3)
○Cells(1, 3)
ぢゃね?
508デフォルトの名無しさん:2007/03/17(土) 16:09:13
>>507
アドバイスありがとうございます。
直してみましたが、いまだに、オブジェクトが必要ですというエラーが出てしまいます。
Sheets("Sheet1"). Cells(1, 3).Value.Selectなども試したのですが、、。
509デフォルトの名無しさん:2007/03/17(土) 16:14:05
>>508
Sheet1.Cells(〜じゃまいか
あと、クリップボード使わなくてもコピーはできる。
Sheet1.Cells(1,1).Copy Destination:=Sheet2.Cells(1,1) とか。たぶん。
510デフォルトの名無しさん:2007/03/17(土) 16:29:42
>>506
50万円だねww

株式で追い出されてきた人だね
こいつ礼儀知らないからね
「プログラム動けばこっちのものだ」なんていってボロクソ言ってたしな
511デフォルトの名無しさん:2007/03/17(土) 16:30:24
Dim i As Long
For i = 1 To 24
  Sheets("Sheet100").Cells(i, 1).Value = Sheets("Sheet" & i).Range("C1").Value
Next

だけで良いのでは?
512デフォルトの名無しさん:2007/03/17(土) 16:30:49
>506
2行目、Selectするなら.Valueつけない。
1〜6行目は、
Sheets("Sheet1").cells(1,3).copy destination:=sheets("Sheet100").range("A1")
で書き換えできる。Select使うと処理が遅くなるので、必要ないときは使わない方が良いと思う。
Do Loopのところも同じ処理でできると思うけど、
Sheets("Sheet & NUMBER").Select これは間違い。
Sheets("Sheet" & cstr(NUMBER)).select にする。
あと、Loop While NUBER = 23
まずNUBERが誤字。
Whileだと"NUMBERが23である間中"になるので、untilにすべき。
あくまで初心者なんで、このレスにも突っ込み多いと思うけど、
下記で十分なんじゃないかと。

Sub TEST()

Dim SheetNum As Integer

For SheetNum = 1 To 24
Sheets("Sheet" & CStr(SheetNum)).Range("C1").Copy _
Sheets("Sheet100").Cells(SheetNum, 1)
Next

'処理完了後、シート100のA1をセレクト
Sheets("Sheet100").range("A1").select

End Sub
513512:2007/03/17(土) 16:35:23
うあ、リロードしとくべきだったw
514デフォルトの名無しさん:2007/03/17(土) 16:40:01
>>511
できました。。
ただ、自分で解決してないので、もどかしさはありますが。
ありがとうございます。
もうひとつくらい、作ってみます。

>>512
アドバイスありがとうございます。
勉強になりました。
515デフォルトの名無しさん:2007/03/17(土) 22:46:37
>>512
>Sheets("Sheet100").Range("A1").Select

Worksheets("Sheet100").Select
Range("A1").Select

もしくは、

Application.Goto Worksheets("Sheet100").Range("A1"), True
516512:2007/03/18(日) 11:19:44
>515
あれ、この前もそのミスやっちゃったんだよね。
指摘thx
517デフォルトの名無しさん:2007/03/18(日) 15:00:05
Sub 株価取得()

For i = 1 To 24
Sheets("Sheet" & i).Columns("A:A").Select
Selection.Insert Shift:=xlToRight
'銘柄コード指定------------------------------------------------------------
meino = Sheets("Sheet100").Cells(i, 1).Value
' 取得日の指定

Call 取得準備
'==================================================================================
Sub 取得準備()
 'URLと日付指定
Call 取得
End Sub
'=================================================================================
Sub 取得()
With ActiveSheet.QueryTables.Add(Connection:=urlweb _
,’略 iを用いる。
End With
 NEXT
End Sub
End Sub

ForとNextの間が長くてエラーになってしまうのですが、解決法はないでしょうか?
518デフォルトの名無しさん:2007/03/18(日) 16:12:48
>>517
FOR-NEXTの中にSUBはおけないよ。

最初から勉強しなおした方がいい
519デフォルトの名無しさん:2007/03/18(日) 16:44:47
>>518
SUBをおかないでかきなおしてみました。
For 1 to 24 のとき
Sheets("Sheet" & i).Columns("A:A").Select
Selection.Insert Shift:=xlToRight
で、コラムが選択できないのですが、他に書き方があるのでしょうか?
520デフォルトの名無しさん:2007/03/18(日) 16:48:12
1,2冊VBAの本を読んで(理解して)から質問しろと言いたいのは漏れだけですか…
521デフォルトの名無しさん:2007/03/18(日) 17:04:07
一応読みましたが、あまり理解していないので、ここでお聞きしています。
522デフォルトの名無しさん:2007/03/18(日) 17:17:08
>>520
俺も。ついでに、最低限デバッグは出来るようになってからコード書き始めろと言いたい。

解決方法が解らないならまだしも、「エラーになります」「うごきません」とか言うだけで
原因部分すら解ってない奴が多すぎ。車を公道で運転する前に、交通規則や運転技術を身に付けるように
プログラムにもコードを書き始める前に最低限覚えるべきことってのがある。デバッグはその尤もたるもの。

>>521
一応ではなく、理解できるまでしっかり読め。
本に書いてあることすら理解する気がないという奴に、ここで教えても意味無いし
本に書いてあることを理解したなら解決方法も解るはずだから教える必要ないし。
ということで、ここで教えるべき事は何もないってこった。
523デフォルトの名無しさん:2007/03/18(日) 17:29:07
>>522
だからあなたはここには必要ないんです。
理解できないひとが来る場所だから。
524デフォルトの名無しさん:2007/03/18(日) 17:35:42
理解できてなくてもいいから、理解しようとして最終的には理解できる人がいいなぁ。
つーか、(どうやっても)理解できない人なんて存在価値そのものが無いでしょ。
525デフォルトの名無しさん:2007/03/18(日) 17:42:45
> 理解できないひとが来る場所だから。
ちがいますよ
526512:2007/03/18(日) 17:43:38
519=506ですよね?
違うなら、>512から読み直してみればわかると思うよ。
俺も同じミスしてるし。
527デフォルトの名無しさん:2007/03/18(日) 17:44:24
>>523
俺は>>522じゃないけど、質問するあんたがそんな感じでは
誰も回答くれないと思うよ。

>>522程言うつもりはないけど、もうちょっと理解してしないと説明してもしがいがないしねぇ
528デフォルトの名無しさん:2007/03/18(日) 17:45:03
>>523
その発言、矛盾してることに気づいてる?
理解できない人だけで物事が解決するわけないでしょ。
529デフォルトの名無しさん:2007/03/18(日) 17:51:21
確かに523の発言は問題あったと思っています。反省しています。
ただ、明日の前場までにプログラム完成したくて、ちょっと気持ちが焦っていたんです。。
申し訳ありませんでした。

コラムにしろ、シートにしろ、セルにしろ、選択の方法がいまいち理解できてないみたいです。。
申し訳ありません。。
530デフォルトの名無しさん:2007/03/18(日) 17:59:18
素人は使う日程を決めてから作るなよ。
できてからのんびりいつから使うか判断するべきだ。
531デフォルトの名無しさん:2007/03/18(日) 18:02:25
一応、高値、安値、始値、終値から安値予想と終値予想を出して、楽天証券のRSSも利用して安値予想よりも低くなったら、色変換してビープ音をならす、高値予想よりも高くなったらまた音楽をならすというプログラムはできたんです。

ただ、そもそもの4本値が楽天証券のマケスピからコピーアンドペーストしなければならなく、面倒だったので、Yahoo!から4本値をダウンロードするプログラムを作ってるんです。

519のご回答、どうかよろしくお願いいたします。
532デフォルトの名無しさん:2007/03/18(日) 18:05:58
応援するぞ。がんがれ
533デフォルトの名無しさん:2007/03/18(日) 21:03:10
>>531
冒頭でいきなり
For i = 1 To 24

って出てくるけど、これ何?というか、どういう仕様で作ろうとしているのさ?
>>519で書き直したって行ってるけどどういうコードになってどういうエラーがどこで
出てくるのかもはっきりしろよ
534デフォルトの名無しさん:2007/03/18(日) 21:25:43
>>531

sheet1〜sheet24に24銘柄、4本値とそこから計算した安値、高値が求められています。
そして、sheet100のA1〜A24には、それぞれの銘柄の銘柄コードが記されています。

sheet1の先頭には楽天証券のRSSで作った株価ボードがあります。

Const URLYAHOO As String = "URL;http://table.yahoo.co.jp/"
Dim urlweb As String 'Web接続先
Dim meino As String '銘柄コード
Dim 始年月日 As Date
Dim 年 As String
Dim 月 As String
Dim 日 As String
Dim 終年月日 As Date
Dim 年2 As String
Dim 月2 As String
Dim 日2 As String
Dim i As Long

は、改行多すぎとなるので略しました。
ファイルにアクセスできませんでした。とエラーがでます。最近Yahoo!ファイナンス仕様が変わったみたいでうまくデータを取り込めないでいます。
535デフォルトの名無しさん:2007/03/18(日) 21:32:20
ttp://www2s.biglobe.ne.jp/~iryo/kabu/  の

★ 解析ツール関連VBAの解説
 (1)-1Webから株価データ取得マクロ(Yahoo)
が参照プログラムです。
ただ、私自身のプログラムではSUBは1つにしました。

536デフォルトの名無しさん:2007/03/20(火) 02:38:44
B列に入ってる文字を(B1 a B2 b B3 c)C列の一番上に
(abc)みたいに入れたいのですがうまく動いてくれないです。
どういう風に変えればいいでしょうか
  rw = 1
Do While Cells(rw, 2) = ""
Cells(1, 3) = Cells(rw, 2) & Cells(rw + 1, 2)
rw = rw + 1
Loop
537デフォルトの名無しさん:2007/03/20(火) 03:22:17
想定した動作と、どう違ったかも書かないとよう解らんよ
または、エラーが出たならどんなエラーかもね
538デフォルトの名無しさん:2007/03/20(火) 04:12:22
536
b列c列
a
b
c

b列c列
a abc
b
c
となる予定だったのですが、プログラムを起動してもcの1が空白のまま
エラーなどは何も出ません、何処を変えれば良いのか教えてください、
よろしくお願いします。
539デフォルトの名無しさん:2007/03/20(火) 05:27:37
すみません、たぶん自己解決しましたDo Whileのとこ=じゃなく<>っぽいですね
こんな感じになりました。もっと短く出来るかも?
rw = 1
Do While Cells(rw, 2) <> ""
rl = Cells(rw, 2) & "・" & Cells(rw + 1, 2)
Cells(1, 3) = Cells(1, 3) & rl
rw = rw + 1
Loop
540デフォルトの名無しさん:2007/03/20(火) 05:50:37
まだ修正箇所あったけどなんか完成した。無駄レスしてごめんなさい
541デフォルトの名無しさん:2007/03/20(火) 22:39:28
コラムには誰も突っ込まないの?
542デフォルトの名無しさん:2007/03/20(火) 23:38:40
英語の教科書にカタカナで読み振ってるおバカさんな中学生レベルの発想だな。

日本ではコラムを囲み記事、カラムを縦列だと思ってる人も多いようだが
スペルも発音も実は一緒だし、正確に言うと発音的にはカラムでもコラムでも間違いだが
縦列のことをカラムと書いて通るなら、それをコラムと書いたって間違いとは言えない。
逆も然り。というか英語のカタカナ表記に正確性を求めること自体がナンセンス。

因みにATOKの英単語「かな読み→英スペル」変換辞書では、
デフォルトで「からむ」も「こらむ」も「column」に変換される。
543デフォルトの名無しさん:2007/03/21(水) 12:39:07
>>542
やぱりAtokいいよな。関係ないけど。
544デフォルトの名無しさん:2007/03/21(水) 13:54:44
関係ないけどMS-IMEだってカタカナ語英語辞書を使えば
カラムでもコラムでもcolumnを候補に出す。
545デフォルトの名無しさん:2007/03/21(水) 14:45:08
コラムとも読めることをここで初めてしった漏れがきましたよ
ま〜相手に伝わればどっちでもいいと思うぜ
546デフォルトの名無しさん:2007/03/21(水) 14:49:16
>>545
素朴な疑問だけど、新聞のコラムは何だと思ってたの?
車のコラムシフトとか。
547デフォルトの名無しさん:2007/03/21(水) 21:14:56
考えたこともなかったぜ〜
知らなくても死ぬわけじゃないしな〜
カラムと書いてある参考書のほうが多いしな〜
548デフォルトの名無しさん:2007/03/21(水) 21:37:41
> カラムと書いてある参考書のほうが多いしな〜
うん、その通り
でもコラムでも間違いではないってことを知らないと
541みたいに恥をかくことになるのでご注意を
2chでならまだいいけど、リアルでやっちゃうとかなり痛いので
549デフォルトの名無しさん:2007/03/23(金) 10:37:16
擬似コントロール配列使ってる奴いる?
550デフォルトの名無しさん:2007/03/23(金) 10:38:12
居るよ
551デフォルトの名無しさん:2007/03/23(金) 11:30:05
エクセルのフッターにページ番号+セルの結果を表示するにはどうしたらいいですか?
A1に3が入っているとしたら、1ページ目には4と印刷させたいのですが…。
552デフォルトの名無しさん:2007/03/23(金) 11:46:26
>>551
そういうコードを書けばいいと思うよ

躓いているなら、どこまで書いて、どこで躓いてるのかきちんと書こうね
553デフォルトの名無しさん:2007/03/23(金) 12:12:08
>>551
マルチは止めようね。
554デフォルトの名無しさん:2007/03/24(土) 09:54:13
ちょっと教えて下さい。

ActiveSheet.Shapes.AddLine((dr(i) - 1) * 26.25 + 106.5, (draw(i, j) - yy) * (-9) + 338.25, (dr(i + 1) - 1) * 26.25 + 106.5, (draw(ee, j) - yy) * (-9) + 338.25).Name = "senx" & ct

非常に見難くて申し訳ないんですが、上のコードで線は描画できるんですが、
”書き込みできません”というエラーがでます。
線が引けるんだから、Name= に問題があるんだと思って Name の部分を削除したら
この行で、コンパイルエラーになりました orz

昨日までは動いてたのに何故?

考えられる原因は何でしょう 教えて下さい。
555デフォルトの名無しさん:2007/03/24(土) 09:59:28
カスタムイベント使ってる奴いる?
556デフォルトの名無しさん:2007/03/24(土) 10:43:15
>>554
コード読むの面倒なんて、昨日まで動いてたというなら
とりあえずOSとExcelを再インストールしてもう一度動かしてみな。
それでダメだったらまたおいで。
先に言っておくが質問する側が「面倒」とか言わないでね。

>>555
RaiseEventで発生させるやつでしょ。バリバリ使ってるよ、得にアドインで。
557デフォルトの名無しさん:2007/03/24(土) 11:46:20
教えてください

vba内で生成した文字列をセルに代入した時、
文字列内の改行コードごとに、セルも一つ下に
移動して、改行コード後の文字列をセットして
いくにはどのようにしたらよいでしょうか?

現状

Dim str As String
str = "一行目" & vbCrLf & "二行目"
Cells(1, 1) = str

一つのセルに全ての文字(改行コード含む)が
セットされてしまいます。
558デフォルトの名無しさん:2007/03/24(土) 12:47:56
>>557

str = "一行目" & vbCrLf & "二行目"

のところは
実際のコードじゃホントに最後VbCrLfは付かないんだね?
559デフォルトの名無しさん:2007/03/24(土) 17:44:14
普通に
cellsの引数に変数を指定して
for....next とか do...loop で変数を回せば良いだけ
560デフォルトの名無しさん:2007/03/24(土) 18:04:02
質問します
ブックをThisWorkbook .IsAddin=True でアドインとして実行した後、
Workbooks.Add で新しいブックを開いて
その新しく開いたブックのイベントをアドインとして開いたブックで取得して
プロシージャを実行するにはどうすればいいのか教えていただけませんか?
561デフォルトの名無しさん:2007/03/24(土) 18:32:01
そのブックのオブジェクトをアドイン側でWithEvents定義すれば良いだけのことでしょ。
その方法すら解らないと言うなら、こういうことは君にはまだ早いってこった。
もう少し精進してから出直そう。
562デフォルトの名無しさん:2007/03/25(日) 10:38:18
すいません、Excelの #VALUE! ってどうやって参照というか、条件に加えればいいんですか?
セルの中身が #VALUE! の時に0を代入してやりたいのですが・・・。
563デフォルトの名無しさん:2007/03/25(日) 11:07:36
ERROR.TYPE
564デフォルトの名無しさん:2007/03/25(日) 11:31:51
>>563

ありがとう!解決しました。
565デフォルトの名無しさん:2007/03/25(日) 16:19:47
質問です。Select caseで条件が1〜4まである時
 caseが1か2の時は処理1を
 caseが3か4の時は処理2を
というふうに処理をしたいのですがこのような処理の方法は可能でしょうか?
それとも素直に
 caseが1の時、処理1を
 caseが2の時、処理1を
 caseが3の時、処理2を
 caseが4の時、処理2を
と記述すべき?
566デフォルトの名無しさん:2007/03/25(日) 16:46:00
>>565
Case 1, 2
Case 3, 4

つーかヘルプのSelect Caseの解説くらい読めよ
他にもいろんな条件指定の仕方が載ってるから
567466:2007/03/25(日) 16:46:58
568565:2007/03/25(日) 17:12:01
レスサンクス!無事解決!!
ヘルプ見るという事は忘れてました、灯台下暗しっ(-_-;)
参考書にも乗ってなかったからorとか使って分けわかんないことしてましたよ
569デフォルトの名無しさん:2007/03/25(日) 17:34:09
最近基本を学ばずに、いきなり実用編に行く奴が多いよね
570デフォルトの名無しさん:2007/03/25(日) 18:13:38
勉強のためにVBAを学ぶんじゃなくて、仕事等で必要があって使からいきなり実践はありだろう。
そのとき参考書を買って読むやつと読まない、2通りの人間がいるだけ。
571デフォルトの名無しさん:2007/03/25(日) 18:24:47
本を買っても実用例や基本過ぎることばかりで文法書がない
ヘルプで目的の情報を引き出せる所までスキルもあがってない
572デフォルトの名無しさん:2007/03/25(日) 19:41:47
> 仕事等で必要があって使からいきなり実践はありだろう。
基本も知らない奴がVBAで業務データを操作するなんて危なっかしいことが
罷り通ってるのは三流未満の企業だけでっせ。
573デフォルトの名無しさん:2007/03/25(日) 19:49:10
VBAでなんとかならない?と聞いてくる上長とかよくいるが
依頼した下っ端が1流だか3流かなんて判断できるとは思えんし
危なっかしいという意識もないどうでもいい情報なんではなかろうか
574デフォルトの名無しさん:2007/03/25(日) 20:08:32
できれば一流であろうが三流であろうが何でもいいってこった
575デフォルトの名無しさん:2007/03/25(日) 20:36:59
なんか勘違いしてる?
576デフォルトの名無しさん:2007/03/25(日) 22:12:17
一年中勘違いしてる
577デフォルトの名無しさん:2007/03/26(月) 01:40:23
Sheets(ActiveSheet.Name).Name = ListBox1.List(ListBox1.ListIndex - 1, 0)
で何でアクティブなシートの名前をリストボックスの項目に変更できないの?
578デフォルトの名無しさん:2007/03/26(月) 01:48:30
>>577
( ゚д゚)、ペッ
エラーメッセージぐらい書け!
579デフォルトの名無しさん:2007/03/26(月) 01:57:44
>>578

いいツンデレだなおいw
580デフォルトの名無しさん:2007/03/26(月) 02:08:29
実行時エラー '1004':

シートまたはグラフの名前が正しくありません。次のいずれかを行ってください。

? 入力した名前が半角で 31 文字以内であることを確認します。
? 入力した名前に次の文字が含まれていないことを確認します : コロン ( : )、円記号(\)、スラッシュ(/)

となってます。
581デフォルトの名無しさん:2007/03/26(月) 07:08:12
>>580
んで、そん時のListBox1.List(ListBox1.ListIndex - 1, 0)の値は?
582デフォルトの名無しさん:2007/03/26(月) 18:32:04
そんなの自分でどーにかしろ
そこからだろ
583デフォルトの名無しさん:2007/03/27(火) 01:45:47
すいません
自己解決しました。理由は吐き出されたエラーどうり、「:」が含まれていました。
眠い中やっていて気づかなかったみたいです。お手数かけてすいませんでした
584デフォルトの名無しさん:2007/03/27(火) 11:10:46
解決してよかたね
585デフォルトの名無しさん:2007/03/27(火) 17:17:28
すいません、教えてください
エクセルからリンク等でブラウザを開きリンク先を観覧する場合
タブブラウザとしては開けないのでしょうか?

IE7をインスコしてみて開いてみるもタブの追加ではなく新規ウインド(新規ブラウザ?)として窓がドンドン増えていってしまいます
これはエクセル側ではなくブラウザ側の設定でしょうか?

教えて頂けないでしょうか 宜しくお願い致します
586デフォルトの名無しさん:2007/03/27(火) 17:27:24
どっちかって言うとブラウザ側だな。
587デフォルトの名無しさん:2007/03/27(火) 17:33:56
ちなみにIE7で表示されてるリンククリックするとどうなるの?
問題の切り分けしないで聞いてるってことはない?
588デフォルトの名無しさん:2007/03/27(火) 17:44:09
>>586
ほー ちなみにルナでもスレイプニルでも通常使用するに設定してもひらかずにIEで開きやがります

>>587
新しくに設定されているのは新しいタブで開くし
そのままの場合はそのまま開くようです

問題の切り分けとは?
589デフォルトの名無しさん:2007/03/27(火) 17:48:29
それで切り分けできてると思うけど
想像するにIEを起動してURLを開くような記述になってるのでは
590デフォルトの名無しさん:2007/03/27(火) 18:02:48
>>589
そのとおりです
VBAで現在開いているブラウザでURLを指定して開きたいわけなんですが
ブラウザをドンドン開いちゃうわけです
591デフォルトの名無しさん:2007/03/27(火) 18:06:52
>>590
まずは自分が書いたコードを貼ってみな。
> (新規)ブラウザをドンドン開いちゃう
というコードでいいから。
592デフォルトの名無しさん:2007/03/27(火) 18:18:16
すいません 仕事場で質問していたのですが追い出されてしまいました
レスが明日になってしまいます申し訳ないです
593デフォルトの名無しさん:2007/03/27(火) 18:53:38
VBA初心者ですみませんが教えてください。
リストボックスにAdditemで項目を複数追加した後、
そのリストボックスを昇順でソートしたいのですが、
プログラムでループなどを駆使してソートさせなければいけないのでしょうか?
それとも、関数やリストボックスのプロパティで、簡単にソートできる命令が
あるのでしょうか?
単純な質問で申し訳ありませんが、よろしくお願い致します。
594デフォルトの名無しさん:2007/03/27(火) 19:21:08
VBのリストボックスならSortedプロパティがあるしリストビューもソート機能を備えてるが、
VBAのリストボックスはソート機能は備えてないね。それに普通はAddItemしてからソートするんじゃなくて、
配列に取ってソートしてからAddItemするのが普通だろ。

とにかくVBAのリストボックスでソートしたいなら、自前で実装してくれってことでよろしく。
595デフォルトの名無しさん:2007/03/27(火) 19:42:10
まあデータをシートに張り付けてソートすればいいんじゃねってことで
596デフォルトの名無しさん:2007/03/27(火) 19:52:59
そうでもないか
597593:2007/03/27(火) 19:53:12
>>594 , >>595
早速のご返答、ありがとうございました!
やはり出来ないのですか。
自前の実装はちょっと面倒だし、
最終的にシートにデータを落とす予定なので、
シート上での自動ソートを使うことにします。
ありがとうございました!
598デフォルトの名無しさん:2007/03/27(火) 23:51:20
いまさら「やさしくわかるExcel VBAプログラミング」を買いました。
頑張ります!

…と思ったらもうサンプルファイルがDL出来ない
(´;ω;`)
頑張ります…
599デフォルトの名無しさん:2007/03/28(水) 00:04:58
できる大事典 Excel VBA
の方が良かったな
600デフォルトの名無しさん:2007/03/28(水) 00:37:30
できる大事典いいね。
これ一冊でOKとは言わないが、必要最低限はすべて網羅してあるし。
初めの内は頻繁に参考してたよ。
601デフォルトの名無しさん:2007/03/28(水) 01:45:52
すみませんが教えてください!

私は楽天証券の株取引をやっているんですが、
「リアルタイムスプレッドシート(RSS)」というプログラムが使えます。
これは、EXCEL上でリアルタイムに自動的に現在の株価が更新されます。
手で入力することなく、セルがどんどん自動変更されていきます。

これを利用して、株価が動いたら(株価の表示されてるセルが変更されたら)、
VBAのプログラムを動かすような仕組みにしたいのですが、
「EXCELシートの特定セルの数値が変わった場合にのみ、
動作するVBAのイベント」というのは出来ますでしょうか?

申し訳ありませんが、どなたかよろしくお願い致します。
602デフォルトの名無しさん:2007/03/28(水) 08:51:50
Worksheet_Chengeで渡される引数が変更箇所
それで判断しる
603585:2007/03/28(水) 11:48:54
>>591
すいません遅くなりました
こんな感じです
Sub Link()
'
'
'
Dim ad As String
ad = ActiveCell.Offset(0, 15).Range("A1")
Dim objIE As Object

Set objIE = CreateObject("InternetExplorer.application")

objIE.navigate (URL & ad)

objIE.Visible = True

Do While objIE.Busy = True
DoEvents
Loop

AppActivate "Microsoft Internet Explorer"

'SendKeys "^{END}", True


Do While objIE.Busy = True
DoEvents
Loop

AppActivate "Microsoft Internet Explorer"
'SendKeys "^{END}", True
604デフォルトの名無しさん:2007/03/28(水) 14:08:12
>>603
おい、からかってるのか?
605デフォルトの名無しさん:2007/03/28(水) 14:39:11
>>604
まったく そんな気は無いですが 変ですか?
606デフォルトの名無しさん:2007/03/28(水) 20:10:41
正直その発想はなかったな
607デフォルトの名無しさん:2007/03/28(水) 20:14:11
さすがにネタだろ
608デフォルトの名無しさん:2007/03/28(水) 20:29:58
>>603
FollowHyperlinkでどうでしょう?
609デフォルトの名無しさん:2007/03/28(水) 23:31:50
ユーザーフォームにスタートボタンとストップボタンをつけました。
スタートボタンを押した後VBA実行中にストップボタンを押すとマクロ開始前
というか初期状態というか、スタートボタンを押す前に戻りたいのですが、
どうすればストップボタンを押して中断させられるようになりますか?

宜しく御願い致します。
610601:2007/03/28(水) 23:35:20
>>602
ありがとうございます!
早速チャレンジしてみます!
611デフォルトの名無しさん:2007/03/28(水) 23:58:15
>>609
現在出来ている部分のコードを貼るか、ブックのうpをよろしく。
612デフォルトの名無しさん:2007/03/29(木) 00:31:00
どうせModalなんだろうな。。。
613デフォルトの名無しさん:2007/03/29(木) 00:31:18
もうだるいよぅ
614デフォルトの名無しさん:2007/03/29(木) 09:10:14
>>606-607
かなりマジです
特殊な作業なのは分かってるんですが
簡略化できたりしますか?

>>608
やってみまつ
615デフォルトの名無しさん:2007/03/30(金) 11:32:43
Yahoo!ファイナンスからの株価取得、今日、調子悪くありませんか??
616デフォルトの名無しさん:2007/03/30(金) 11:55:57
それで?
617デフォルトの名無しさん:2007/03/30(金) 12:58:15
>>615
ふ〜ん。そうなんだ。
618デフォルトの名無しさん:2007/03/30(金) 14:05:35
ちょっとお知恵拝借

1つのセルに4行ぐらいの文字列を設定して
特定の文字のフォントサイズ変えたり太字にしたりするシートを作っています
規模は最大10列×20行
処理の順番は行毎に左から右

で、実行すると列数が増えると遅くなるんで調べてみたら
最初の列の方だと0.3秒で10列目あたりだと1秒以上かかっていました
そこで、一度先頭列で作ってから本来の列にコピーするようにしたら改善しました

なのでアルゴリズムの問題ではないようなんですが
一体何が原因なのでしょう?とりあえず動き的には問題ないのですが
設定で回避する方法をご存じであれば教えて下さい
619デフォルトの名無しさん:2007/03/30(金) 14:16:53
まさか、表示の更新を止めてないとかって落ち?
620デフォルトの名無しさん:2007/03/30(金) 14:58:16
"アルゴリズム"なんて言い出しちゃう奴が、そんなショボいミスするわけないじゃん
621デフォルトの名無しさん:2007/03/30(金) 15:06:59
>>618は止めてるときの時間です
割合が変わるだけで後ろの列が遅くなるのは多分一緒ですね
622デフォルトの名無しさん:2007/03/30(金) 15:31:04
>>618
右から左に処理したらどう?
623デフォルトの名無しさん:2007/03/30(金) 15:41:06
>>618
セルを配列に入れて処理して、後からかシートに書き出して見れば。
メモリ上ならはやいよん
624デフォルトの名無しさん:2007/03/30(金) 16:59:01
>>622
後でやってみます

>>623
基本的にそういう作りにしてます
セル内フォント設定が全て同じなら問題ないんですが
例えば2行目の1文字目のサイズだけを大きくしたい場合
セルに入れてから変更するしかないと思います
マクロ記録したのを元につくったんですが、
その方法以外のやり方があったら教えて下さい
625デフォルトの名無しさん:2007/03/30(金) 22:21:44
オプションボタンを動的に作成する方法はありますか?
ユーザフォーム上でもシート上でも良いです。

やりたいこととしては、セルのデータの行数の分だけオプションボタンを作成することです。

以下のやり方がわかればできるかな?と思っています。
http://sunrise2001.dip.jp/coo/ctlOptionButton.html
626デフォルトの名無しさん:2007/03/30(金) 23:52:01
>>615
正常終了
627デフォルトの名無しさん:2007/03/31(土) 00:02:48
リンク先にマクロとしてあるじゃねぇか
あとはマクロを自分で読め
628625:2007/03/31(土) 00:18:29
>>627
「ロックされています」と表示されて確認できなかったので質問させていただきました。
629質問:2007/03/31(土) 09:16:18
EXCELでは無く、ACCESS2002のVBAで質問があるのですが、
よろしいでしょうか?

以下のコードを標準モジュールに入れて、
外部ファイル(ACCESS2002のファイル)のテーブルを
インポートしたいのですが、
外部ファイルにはパスワードが設定されているため、
パスワード入力画面で止まってしまいます。

そこで質問ですが、
他のACCESSファイルのテーブルをインポートする時に、
パスワードも指定するには、どうしたらいいでしょうか
630629:2007/03/31(土) 09:21:57
すいません。現状のVBAの記述を忘れていました。
実際には以下のコードをマクロのautoexecに登録し、
バッチでこのコードが埋め込まれたファイルを実行しています。

=========
Attribute VB_Name = "TableBackup()"
Option Compare Database
Option Explicit
Function TableBackup()
DoCmd.TransferDatabase acImport, "Microsoft Access", _
"C:\Documents and Settings\テーブル名.mdb", acTable, "テーブル名", "テーブル名"
End Function
631デフォルトの名無しさん:2007/03/31(土) 15:15:33
だったら、自分でマクロを記録してみ?
632デフォルトの名無しさん:2007/03/31(土) 15:31:03
未だにexcel97を使っているんですが・・・
csvファイルを開いて、上書き保存を選択しているにもかかわらず、
ダイアログが出て保存先指定を毎回聞かれます。
最新のexcelでは何も聞かれず上書き保存されますか?
633デフォルトの名無しさん:2007/03/31(土) 16:13:44
>>632
Application.DisplayAlerts = False
634デフォルトの名無しさん:2007/03/31(土) 16:14:28
ああそういうことじゃないのねスマソ
635629:2007/03/31(土) 20:41:10
すいません。解決しました。
629,630は無視してください。
636デフォルトの名無しさん:2007/03/31(土) 22:04:27
Dim i As Long
Dim j As Long
Dim k As Long
Dim l As Long
For i = 1 To 21
k = Sheets("Sheet100").Cells(i, 1).Value
l = 3
For j = 5 To 8
Sheets("Sheet1").Cells(j, l).Select
Selection.Replace What:="1332", Replacement:=k, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Next
l = l + 1
Next

For i = 22 To 42
k = Sheets("Sheet100").Cells(i, 1).Value
l = 3
For j = 9 To 12
Sheets("Sheet1").Cells(j, l).Select
Selection.Replace What:="1332", Replacement:=k, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Next
l = l + 1
Next



Sheet100のA列にある数値を1〜21、21〜42と横にも置換させたいのですが、縦のSheet1のセルCしか変換してくれません。
どのようにすればよういのでしょうか?
637デフォルトの名無しさん:2007/03/31(土) 22:21:08
>>636

l = l + 1
の後の
Next

For i = 1 To 21
k = Sheets("Sheet100").Cells(i, 1).Value
へ戻った後に
l = 3
があるからぢゃないのか?
638デフォルトの名無しさん:2007/03/31(土) 22:28:04
>>637
ほんとですね。。
初歩的なミスでした。ご指摘ありがとうございます。
639デフォルトの名無しさん:2007/03/31(土) 23:01:14
そもそもReplaceメソッドの使い方が…

まいっか。
640デフォルトの名無しさん:2007/03/31(土) 23:16:49
>>625
UserForm1.Controls.Add ("Forms.OptionButton.1")
641デフォルトの名無しさん:2007/03/31(土) 23:51:47
さきほどの応用なのですが、
Sheet100のA列にある数字を
Sheet1のC〜Y列の23列でそれぞれ4行あるセルが何セルかあって、それぞれ置換していきたいのですが、
まったく動かずです。今度は数列入れてみました。よろしくお願いいたします。

Sub Macro1()
'
' Macro1 Macro
'
Dim i As Long
Dim j As Long
Dim k As Long
Dim l As Long
Dim m As Long
m = 1
For m = 1 To m = 42
l = 3
For i = 23 * m - 22 To 23 * m
k = Sheets("Sheet100").Cells(i, 1).Value
For j = 4 * m + 1 To j = 4 * m + 4
Sheets("Sheet1").Cells(j, l).Select
Selection.Replace What:="1332", Replacement:=k, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Next
l = l + 1
Next
m = m + 1
Next
End Sub
642デフォルトの名無しさん:2007/04/01(日) 00:27:13
>>641

> For m = 1 To m = 42
なぜm=が2回?

> For j = 4 * m + 1 To j = 4 * m + 4
なぜj=が2回?

> Selection.Replace What:="1332", Replacement:=k, LookAt:=xlPart, _
> SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
> ReplaceFormat:=False

Replace メソッド(Helpより)

>>expression.Replace(What, Replacement, LookAt, SearchOrder, MatchCase, MatchByte)

意図する通りかは解らないが、この辺りを弄ったら取り敢えず変換はするみたいだ・・・。
643デフォルトの名無しさん:2007/04/01(日) 00:42:16
縦のセル、4セル起きに置換されていくようになったんですけど、数式に問題ありますかね??
644デフォルトの名無しさん:2007/04/01(日) 00:53:44
l=l+1の位置がおかしいのでしょうか??
645デフォルトの名無しさん:2007/04/01(日) 00:54:02
>>643
j=4*m+1・・・・・でmを4倍してるから4列飛びで置換すると思うけど?
646デフォルトの名無しさん:2007/04/01(日) 00:54:40
>>645
×4列飛び
○4行飛び
647デフォルトの名無しさん:2007/04/01(日) 01:00:12
5〜8行、 9〜12行、・・・・・と数列で分けているので、
mが1のとき5で 4 * m + 4 のとき8で、
次mが2で9行目を置換してはくれないんですかね?
648デフォルトの名無しさん:2007/04/01(日) 01:19:40
シートの構成も今ひとつわからんから的を得ないかもしれないけど…

m = m + 1
これ必要なの?
649デフォルトの名無しさん:2007/04/01(日) 01:28:21
×的を得ない
○的を射ない
×的を射らない
○当を失している
×当を得ない
650デフォルトの名無しさん:2007/04/01(日) 01:30:29
>>648
まったくその通りです。
これがあるから、4行置きになっていたんだと思います。

ありがとうございました。
うまく起動しました。。
651デフォルトの名無しさん:2007/04/01(日) 01:33:35
>>649
ご指摘ありがとさんw

>>650
良かったね
652デフォルトの名無しさん:2007/04/01(日) 02:10:02
当を得ない:道理にかなっていない
当を失する:当てはまっていない
653デフォルトの名無しさん:2007/04/01(日) 08:04:10
この程度ならステップ単位で止めてデバッグしろよ
654デフォルトの名無しさん:2007/04/01(日) 13:44:22
インデントくらいしる
655デフォルトの名無しさん:2007/04/02(月) 05:56:52
>>654
やれるモンならやってみろw
656デフォルトの名無しさん:2007/04/02(月) 14:03:45
変数に格納されている数字の大小を比較して、
いずれか大きい方をmsgboxで表示させようと考えています。
if〜を使えば、

sub 大小比較
a=1
b=5
if a<b then
msgbox b
else
msgbox a
end if
end sub

となるのですが、if〜end ifまでの記述を、
msgbox(aとbのいずれ大きい方)
てな具合に、簡潔にまとめる方法は無いでしょうか。
657デフォルトの名無しさん:2007/04/02(月) 14:14:28
bよりaが大きければaに格納
aを表示

だけどあんまりここで聞くことでもないぞ
658デフォルトの名無しさん:2007/04/02(月) 14:15:18
aよりbが〜の間違いスマソ
659デフォルトの名無しさん:2007/04/02(月) 14:24:07
>>656
MsgBox iif(a<b, b, a)
660656:2007/04/02(月) 14:39:04
>>659
iifという関数知りませんでした。
ありがとうございますた。
661デフォルトの名無しさん:2007/04/02(月) 23:15:04
OLEObjects.Addを使うと変数がどうにかなってしまうのでしょうか?

publicでhogeを宣言して、
プロシージャの中で
hoge=3
ActiveSheet.OLEObjects.Add(ClassType:="Forms.OptionButton.1", Link:=False, DisplayAsIcon:=False, Left:=111, Top:=111, Width:=111, Height:=111).Select
msgbox(hoge)
とやると"3"と表示されるのですが、
別のところでhogeを参照しようとしても空っぽになってしまっています。
OLEObjects.Add
がなければ正常に参照できるのですが。
662デフォルトの名無しさん:2007/04/02(月) 23:36:39
VBAは正直よくわかりませんので、質問させて下さい。

関数の外で、配列を初期化する方法はありますか? Cでいうところの、
グローバル変数の配列のような宣言がしたいのです。

char _test[][]={"123", "234", "abc", "def"};


Sub の中でarray()を使えば配列を初期化できることはわかったのですが、
該当するマクロを起動するたびに配列の初期化が行われるのはかったるい、と
思いますので。
663デフォルトの名無しさん:2007/04/02(月) 23:45:54
Sub Workbook_open() に記述すれば、
ファイルを開いたときに1回だけ実行される。
664デフォルトの名無しさん:2007/04/03(火) 03:46:51
すいません、教えてください。

例えば、
セルA1に「携帯電話 鈴木」と入力規則で作成したドロップダウンリストで選択
           ↓
その同じ A1 セルに 「090-***-****」 と 置換される

とは できませんか?要するに、選択した文字列を、そのセルに数字で置換
、変換は無理ですか?別表をシート内に設け、LOOKUP関数でやっても循環
エラーがでます。
665662:2007/04/03(火) 05:43:20
>>663 レスありがとうございます。

詰まるところ、VBAでは配列の初期化を伴う宣言はできない、という意味でよろしいでしょうか。
666デフォルトの名無しさん:2007/04/03(火) 09:49:21
>>664
関数では無理
667デフォルトの名無しさん:2007/04/03(火) 13:10:45
規模が大きいマクロの場合Variant型は使わない方がいいってヘルプにありますが
Collection使うとVariantになっちゃうと思うんだけど

そういう理由でVariant使ってない人ってCollection使ってます?

あと相互参照してるクラスってそのリファレンスを
明示的にNothingしないとプロシジャ抜けても残っちゃうね
668デフォルトの名無しさん:2007/04/03(火) 18:28:36
複数の.xlsファイル内のあるひとつのシートをCSV形式で保存するため、以下のようなVBScriptを作成しています。
下記エラー箇所にてファイルの保存が失敗してしまいます。
おそらくCSV形式では複数シートを含むブックを保存できないためエラーが出ていると思うのですが
このエラーを避け該当シートのみをCSV形式で保存するにはどうしたらいいでしょうか。
ご指南よろしくお願いいたします。
【エラー内容】
---------------------------
Windows Script Host
---------------------------
スクリプト: SheetsSaveAsCSV.vbs
行: 12
文字: 9
エラー: Worksheet クラスの SaveAs メソッドが失敗しました。
コード: 800A03EC
ソース: Microsoft Excel
---------------------------
OK
---------------------------
【スクリプト本体】
''' SheetsSaveAsCSV.vbs
Dim xlObject, fName, fOutName
Const xlCSVWindows = 23
For Each fName In WSH.Arguments
  Set xlObject = GetObject(fName)
  With xlObject.WorkSheets("<CSV保存対象のシート名>")
    fOutName = Replace(fName, ".xls", ".csv", 1, -1, vbTextCompare)
    Call .SaveAs(fOutName, xlCSVWindows) ''' ← エラー箇所
  End With
  Set xlObject = Nothing
Next
669デフォルトの名無しさん:2007/04/03(火) 18:35:31
切り出せばいい
670デフォルトの名無しさん:2007/04/03(火) 19:24:51
>>669
それしかないかと思い、試しに保存対象のシート以外は削除して見たんですが、
シートひとつにしても保存時にCSV形式の場合には変換の確認が入るようで
SaveAsメソッドが失敗してしまうようです。

地道に手作業で.csv形式に変換していこうと思います。
回答ありがとうございました。
671デフォルトの名無しさん:2007/04/03(火) 20:38:35
Application.DisplayAlertも駄目なんだっけ
672デフォルトの名無しさん:2007/04/04(水) 01:07:57
アルファーチャートから株価をcsvファイルに落としてエクセルで
売買戦略の検証をしようと思っているのですが、
3000から4000の各銘柄で、一銘柄10年分あります。
一銘柄1シートにすると、3000シート以上必要になりますが・・・

皆さんはデータの保持をどのように行っているのでしょう?
673デフォルトの名無しさん:2007/04/04(水) 05:39:29
任意の大きさのVariant の2次元配列があったとして、この行数と列数を
知る方法はありますか?

配列をアクセスするループ中でエラーをキャッチするのでしょうか。
674デフォルトの名無しさん:2007/04/04(水) 06:42:09
UBound
675デフォルトの名無しさん:2007/04/04(水) 09:03:41
>>672
スレ違い
676デフォルトの名無しさん:2007/04/04(水) 09:06:07
このスレの質問の96%ぐらいは
ヘルプみるだけで解決できんじゃねーか
677デフォルトの名無しさん:2007/04/04(水) 17:38:54
ヘルプのみで解決できるのは
一部の頭のいいアマチュアとプロの2種類しかいないだろ
678デフォルトの名無しさん:2007/04/04(水) 17:51:52
このスレの質問の98%ぐらいは
入門書(できる大辞典がオススメ)読んだ上で、必要に応じてヘルプみるだけで解決できる
(一部のオツムの弱い子は除く)
679デフォルトの名無しさん:2007/04/04(水) 19:34:41
質問です。シート上にコントロールのオプションボタンを配置しています。
オプションボタンが押されているか確認する際、
msgbox(OptionButton.value)
とすると正常にtrueかfalseを表示してくれるのですが、
i=1
msgbox(OLEObjects("OptionButton" & i).Value)
とすると
実行時エラー'438':
オブジェクトは、このプロパティまたはメソッドをサポートしていません。
と表示されてしまいます。
上記方法で.valueではなく.nameなら正常に表示されるのですが。
原因と解決方法を教えてください。
680679:2007/04/04(水) 19:36:37
訂正
×msgbox(OptionButton.value)
○msgbox(OptionButton1.value)
実際は、オプションボタンは複数(OptionButton1〜xまで)あります。
681デフォルトの名無しさん:2007/04/04(水) 19:59:47
>>679
OLEObjects("OptionButton" & i).Object.Value
682デフォルトの名無しさん:2007/04/04(水) 20:17:55
>>674 レスサンクス
683679:2007/04/04(水) 20:25:44
>>681
ありがとうございました。
初歩的なミスだったんですね・・・
684デフォルトの名無しさん:2007/04/06(金) 06:56:19
すみませんが教えてください

VBAでセルに計算式が含まれているかどうかを判定したいんですが、
どのプロパティを参照すればいいのかわかりません。
685デフォルトの名無しさん:2007/04/06(金) 11:31:37
シート関数のisformula()使えないのかな?
686デフォルトの名無しさん:2007/04/06(金) 14:56:07
>>684
HasFormula
687デフォルトの名無しさん:2007/04/06(金) 18:39:57
時間が計れんのだ。代替案求む。

Sub foo()
Dim sTime As Date
Dim eTime As Date
sTime = Time
For I = 1 To 1000
SendKeys ("a~")
Next
eTime = Time
Range("B1") = (eTime - sTime) * 24 * 60 * 60 & "秒"
End Sub
688デフォルトの名無しさん:2007/04/06(金) 21:45:58
計れてないんじゃなくて、本当に0秒で終わってるんじゃねえ?
689デフォルトの名無しさん:2007/04/06(金) 22:03:32
きちんと動いてるな。
for nextをしたのに書き換えて
Application.Wait Now + TimeValue("00:00:03")

ラウンドで丸めとけ
Range("a1") = Round((eTime - sTime) * 24 * 60 * 60, 0) & "秒"
690デフォルトの名無しさん:2007/04/07(土) 02:02:25
セキュリティ設定を高にしてxlaをコンパイルしないで保存すると
ファイルサイズが小さくなるけど、これってよく知られた方法ですか?

691デフォルトの名無しさん:2007/04/07(土) 08:11:33
>>690
マニアにはよく知られた方法

>セキュリティ設定を高にして
じゃなくて、正確にはマクロ無効で開いて保存すると
692デフォルトの名無しさん:2007/04/07(土) 11:27:01
>>691
なんでファイルサイズ小さくなるの?
693デフォルトの名無しさん:2007/04/07(土) 22:48:25
シリアル通信用のMSComm.ocxとかバーコード用のMSBCode.ocxとかって
普通のMS-Officeがプリインストールされてるパソコン(Accessなしver)にも入ってるものなの?
入っていない場合、これら使ってたら使えないんだよ、な?
どーすんだろ、こんな場合
694デフォルトの名無しさん:2007/04/07(土) 23:27:53
ocxをそのPCに持っていって
regsvr32で登録すればいいんじゃないのかな。
695デフォルトの名無しさん:2007/04/07(土) 23:44:40
>>694 だと厳密にはライセンス違反になるから
Developerを買って合法的に再配布すれば?
相手がAccessすら持っていなくてもOKになるし。

ちなみにMSComm.ocxはVectorのVB6のランタイムに入ってたはずだけど、
これも実際はVB6で作ったプログラムを使うため以外の配布はライセンス違反だったり。
696デフォルトの名無しさん:2007/04/08(日) 10:00:33
サンクス
MSCommのほうはシリアル通信なんてマニアックな分野だし、
ランタイムの無料配布もあるみたいだし、「ランタイムをインストールしる!」でなんとかしても
MSBCodeのほうはどーすっかなぁ・・・
Developerなんて買えないし、「Access買え」なんていえる場面&&相手じゃないし
もうすこしdllでなんとかならないか調べてみるわ、ありがと
697デフォルトの名無しさん:2007/04/08(日) 10:10:07
無料配布ってライセンス的に大丈夫なものがあるの?


おつむの弱い子の巣窟ですね。
698デフォルトの名無しさん:2007/04/08(日) 10:14:40
たとえば、ここで配布してるやつなんか駄目なの?
ttp://www.vector.co.jp/vpack/filearea/win/util/runtime/

”VB6のランタイムをインストーラーで簡単にセットアップ(XP対応)”
こんなの書いてあるんだけど???
699デフォルトの名無しさん:2007/04/08(日) 12:18:29
ダメだよ。VBランタイムは無料だけどフリー(自由)じゃない。ライセンス的には3段階。

再配布権のあるVisual Basic所持者→ランタイムの単体配布、同梱配布、自分の環境での自由な使用が許可される
再配布権のないVisual Basic所持者→自分の環境での自由な使用が許可される
Visual Basic非所持者→VB製アプリのみでの使用が許可される

このように、VB持ってる人だけが、VB以外(VBAやその他ActiveXが使える言語)からの使用を許可され
それ以外の人は、VB製のアプリでしか使うことを許可されない。VBを持っていてもVBランタイムを使うExcelブックを作って
ランタイムを同梱したり、自分で落としてくれというようなことは許されない。

VBでフリーソフトを作ろうとした場合、実行に必須なランタイムが有料では事実上フリーソフトの制作が不可能になるから
無料で使えるようにはなってるけど、VBランタイムはあくまでも有料ソフトの付属品であり、VB開発環境の価格の一端を担っているものだから。
Accessランタイムも同じ。再配布権を持ってる人が無料で配布してくれれば無料で使えるが、それを落としてきてExcelVBAで使おうってのはライセンス違反。

とにかく、金使ってランタイムの再配布権を手に入れて楽するか、金使わずにランタイムに頼らないコードを書く労を費やすか
どちらを選んでも良いが、金は使いたくないしWin32API使ってコードをごりごり書くのも嫌なんて我が侭は無しの方向で。
あ、キッパリ作るの諦めるって道もあるか。
700デフォルトの名無しさん:2007/04/08(日) 14:13:29
Office関連のコードサンプルとか宝箱は無いですかね?
どの製品で開発すれば満足しますか?
701デフォルトの名無しさん:2007/04/08(日) 14:32:29
ほう、そうなのか
それならWin32API使って書くか、MSCommは使わない方向で
タイマーと組み合わせればできるでしょ、イベントドリブンの方が好きだけど

後はバーコードだな
こっちはリーダも買わなきゃいけないしな
どれが使いやすいんだろ?Excelとの相性がいいやつがいいな
702デフォルトの名無しさん:2007/04/09(月) 14:24:17
Vectorのライブラリにちらほら
703デフォルトの名無しさん:2007/04/10(火) 02:10:01
初心者なもので、恥ずかしいくらいに初歩的な質問ですみません(汗

EXCELのシート2つ、フォーム3つ、標準モジュール1つの
VBAプロジェクトを作成しました。
これをコンパイルして実行した時に、
1番目のフォームからスタートするようにしたいのです。
ただ、1番目のフォームからのスタートのみならず、
コンパイルしてオブジェクトを作成する方法さえもわかりません。

VBAの「デバッグ」の中に「VBAプロジェクトのコンパイル」という
項目があり、これを実行しても、何も変化がなく、
その項目が選択できなくなるだけです。

本当に申し訳ありませんが、
1)コンパイルの方法
2)1番目のフォームからスタートする方法
上記の2点を教えてください。
よろしくお願い致します。
704デフォルトの名無しさん:2007/04/10(火) 08:16:45
実際にオブジェクトが作成されるかは知らん
ファイルオープンの時にフォーム表示すればいいのでは?
705デフォルトの名無しさん:2007/04/10(火) 10:36:07
根本的に勘違いしてるんだろう
コンパイルすれば実行ファイル形式のモノができるとでも思ってるんじゃね?
706デフォルトの名無しさん:2007/04/10(火) 14:02:45
●質問

連結したセルから値を取り出すのに

ThisWorkbook.sheets(1).Range("A1:C1").Value(1, 1)

みたいなことをやっています
("A1:C1" のあたりは本当は Const になっていて容易には手を出せない)。
この .Value(1, 1) は Excel 2000 では通るのだが、2003 では通らない様子。
コンパチな書き方を教えてたもれ。


>> 703
ThisWorkbook というオブジェクトに
Private Sub workbook_open() というのを作って、
そこにフォームを表示するようなコードを書く。
おそらく フォーム名.Show だと思うが自分でヘルプ調べてくれ。
707デフォルトの名無しさん:2007/04/10(火) 14:51:13
>>704,>>705
VBではコンパイルしてオブジェクトができていたと思ったのですが、
VBAではEXE形式のオブジェクトにはならないんですね。
すみません、勘違いしてました。。。
>>706
ありがとうございます!
早速試してみますね!
708デフォルトの名無しさん:2007/04/10(火) 22:25:54
>>707
VBAプロジェクトのコンパイルは文法上の誤りを見つけるものと思いなはれ(俺も一体何の為にこれが
あるんだ?と以前思った w
709706:2007/04/11(水) 09:55:26
>>706

自己解決しました。

ThisWorkbook.sheets(1).Range("A1:C1").Value(1, 1)

ThisWorkbook.sheets(1).Range("A1:C1").Cells(1, 1).Value
710デフォルトの名無しさん:2007/04/11(水) 15:31:20
>>709
Range("A1:C1")(1, 1).Value
Range("A1:C1")(1).Value
Range("A1:C1").Cells(1).Value
Range("A1:C1").Range("A1").Value
711デフォルトの名無しさん:2007/04/12(木) 00:26:01
>460
IDEでマウスホイール使えないのは仕様かと思って数年・・・バグだったのね。
対策アドイン入れたら一発解決。
ttp://support.microsoft.com/kb/837910/ja
712デフォルトの名無しさん:2007/04/12(木) 01:57:23
>>711
そのアドインってウィンドウの無いグレーのところで転がすと
ウィンドウがどこかえすっ飛んで全部消えちゃうバグなかったっけ?
713デフォルトの名無しさん:2007/04/12(木) 11:22:34
一応大丈夫みたいよ。
714706:2007/04/13(金) 09:40:36
>>710
d
いろいろ書きようがあるんだね。
VB の仕様は体質に合わないとか言って逃げていたのですが
そうもいってられないので気合入れて勉強してみるダス
715デフォルトの名無しさん:2007/04/13(金) 12:43:43
AとBという二つのブックがありまして、
Aの標準モジュールには、
Public Const y="あいうえお"
と書いてあります。
これをB側のブックから、yを参照したい場合はどんなコードにすればよいのでしょうか??
716デフォルトの名無しさん:2007/04/13(金) 14:59:15
>>715
参照設定すればいいだけ
717デフォルトの名無しさん:2007/04/13(金) 16:23:54
クラスモジュールを作ったけど、ユーザ定義型は定義されていませんとコンパイルエラーが出ます。
定義はしており、定義を有効にするための方法はどうしたら良いのでしょうか?
718デフォルトの名無しさん:2007/04/13(金) 17:01:13
> 定義はしており
本人はしてるつもりでも、きちんと出来てないというのが定番
もう一度見直してミスを見つけられなかったらブックをうpしよう
719デフォルトの名無しさん:2007/04/13(金) 17:53:04
>>717
昔自分もはまった。
おそらくA.xlsのクラスモジュールを、B.xlsで使おうとしているんだと思われ。
B.xlsには存在しないから、定義されていないと出る。
これを動作させるには、コピーかインポート/エクスポートしか手段はありません。
解説サイトやその辺のサンプルを見ても分かると思うが、誰も2つのxls間で呼び出しておらず、1つのxlsで呼び出している。
720デフォルトの名無しさん:2007/04/13(金) 18:10:41
> これを動作させるには、コピーかインポート/エクスポートしか手段はありません。
嘘を書くな。それとも知らないだけか?
721デフォルトの名無しさん:2007/04/13(金) 22:38:31
金を払うなら教えてやらんこともない
722デフォルトの名無しさん:2007/04/13(金) 23:26:59

スレタイすら読めない厨房はレベルが低いのー。
プププ。
723デフォルトの名無しさん:2007/04/14(土) 02:04:37
知らないんだろうな
実際は出来るよ
724デフォルトの名無しさん:2007/04/14(土) 08:14:08
もったいぶるほどのもんかね
クラス定義の外部参照なんて出来たところで意味ないし
725デフォルトの名無しさん:2007/04/14(土) 12:00:43
xlsから別のxls呼び出して何かしたいときは
Worksheetのメソッドやプロパティでやってる。
Worksheetも広い目で見ればVB的には静的なクラスだしね。

ただクラスなだけにPublicなConstは書けないからプロパティ使う必要があるけど
726デフォルトの名無しさん:2007/04/14(土) 17:52:16
ちょっとスレ違いかもしれませんが、どなたか教えてください。
VBスクリプトでWshShell.Runを使って、エクセルブックを開きました。
そのエクセルブックにはVBAで「Workbook_open」プロシージャに、
あるフォームを開く宣言をしており、
手でそのエクセルを開くと、最初にそのフォームが出てきます。
ところが、Wshを使ってスクリプトからエクセルブックを自動で開こうとすると
どうやらWorkbook_openプロシージャを実行しないようなのです。
ネットを調べて「標準モジュールにAuto_Openを宣言する」という方法も
あると知って試してみましたが、これもまた実行してくれませんでした。

これを解決するには、どういった方法がありますでしょうか?
727デフォルトの名無しさん:2007/04/14(土) 20:16:40
>>725
広い目で見んでも普通にクラスだと…
728デフォルトの名無しさん:2007/04/15(日) 17:40:05
>>727
Excelの各ワークシートが
Worksheet型を継承したstaticなクラスと言った方が良いかも

ただ、インスタンス作れないし(staticだから当然だ)
Worksheet型からの継承後のクラス名が存在しないから
引数で渡すときに苦労するけど。
Worksheet型で渡せば当然Worksheet型のメソッド/プロパティ以外は弾かれるので
結局、実行時名前解決のお世話に…
729726:2007/04/16(月) 01:09:33
また追加で質問させてください。
VBAで、CSVファイルの最終データから先頭に向かって
逆に読み込むにはどうすればよろしいでしょうか?
または、テキストファイルの最終レコードから先頭レコードへ
逆に読み込むにはどうすればよろしいでしょうか?

ネットで検索してもどうしてもわからなかったもので・・・
何度も質問して申し訳ありませんが、よろしくお願い致します。
730デフォルトの名無しさん:2007/04/16(月) 01:53:01
お前無視されてるの気付けよ
731デフォルトの名無しさん:2007/04/16(月) 01:59:19
>>729
先頭から順にセルに放り込んでソートで逆順にする。
732726:2007/04/16(月) 02:25:59
>>731
なるほど、一度ファイルを全部読み込む必要があるのですね。
教えていただいてありがとうございます。

733デフォルトの名無しさん:2007/04/16(月) 08:23:17
mjsk
734デフォルトの名無しさん:2007/04/18(水) 19:45:42
数式を文字列で渡すと、その値を返すような関数ってないんでしょうか。

たとえば、
ans = f("=2*5+10")
とするとansに20が返るようなfです。

目的は、ユーザーフォーム内のテキストボックスに数値を入力するとき、
単に数値だけでなく、ちょっとした式を与えても評価できるような
仕様にしたい、というものです。
735デフォルトの名無しさん:2007/04/18(水) 20:22:28
適当なセルのFormulaにぶちこんでからValueで参照するとか
736734:2007/04/18(水) 20:39:08
>>735
ちょうどさっき、同じことを思いついたので、とりあえずそうしてみました。
一応何とかなりました。
セルに書き込み&読み込みする際、一瞬フォームがちらつくのが少し気になりますが、
簡易計算機がついたみたいな感じで、だいぶ便利になりました。

インタプリタ式の言語なので、文字列を式として評価するような関数は
わりと簡単に実装できるように思うのですが、本当に無いんでしょうかね。
それとも誰かが既に、同様のモジュール作ってたりとか。



737デフォルトの名無しさん:2007/04/18(水) 20:39:32
作れ
てかセル使ってやればいいじゃん
738デフォルトの名無しさん:2007/04/18(水) 20:40:24
あひゃ、終わってたか
739デフォルトの名無しさん:2007/04/18(水) 20:51:38
> それとも誰かが既に、同様のモジュール作ってたりとか。
作ってあるよ、MSが。しかもWindows(98以降かな)に標準で入ってる。
VBAの言語自体には直接組み込まれてないけど、VBAからすぐ利用できる状態になってる。
740734:2007/04/18(水) 21:07:35
>>739
あッー
ひょっとして"EVALUATE" ?
ワークシート関数を呼び出すやり方で使えるかも!
たぶん解決しそうです。

741デフォルトの名無しさん:2007/04/20(金) 14:36:21
>>739
興味あるので詳しく
スクリプティングホストかなんかか?
742デフォルトの名無しさん:2007/04/20(金) 15:40:06
すみません。
アドオンの作り方を詳しく説いたサイトとか書籍はありませんか?
VC++,VB問いません。
743デフォルトの名無しさん:2007/04/20(金) 16:10:48
ExcelのアドインをVBAで作る話ではなく、
VBEアドインをVC++,VBで作る話か?
だとしたらスレ違いっぽいな。
744デフォルトの名無しさん:2007/04/20(金) 22:19:51
あげ
745デフォルトの名無しさん:2007/04/20(金) 22:21:39
>>744 はハゲ。
746デフォルトの名無しさん:2007/04/20(金) 22:29:07
>>745は基地外。

そして↓も。
747デフォルトの名無しさん:2007/04/20(金) 23:11:26
えっ、何も発言してないのに
748デフォルトの名無しさん:2007/04/21(土) 05:01:05
>>747
そんなこと言うから……
749デフォルトの名無しさん:2007/04/21(土) 14:09:39
>>747
自覚してるから、わざわざそのタイミングで書き込んだんだろ?
750デフォルトの名無しさん:2007/04/21(土) 20:22:01
CreateObject("ScriptControl")
751デフォルトの名無しさん:2007/04/22(日) 12:51:13
Function,Subで2次元、3次元などの配列を引数とすることはできますか。
ちょっと試しにやってみたレベルではだめでした。
752デフォルトの名無しさん:2007/04/22(日) 14:15:38
多次元配列を引数で渡すことも、戻り値で返すことも出来ますよ。
「ちょっと試しに」ではなく「真面目にきちんと」やってみましょう。
753デフォルトの名無しさん:2007/04/22(日) 15:14:30
エクセルのVBAからパソコンの電源を落としたいのです。
いろいろ調べて、書いてみたんですが↓

Dim WSH
Set WSH = CreateObject("Shell.Application")
WSH.shutdownwindows

Application.Wait Now + TimeValue("0:0:5")

SendKeys "u"

電源を切るウインドウは開くのですが、
そこで止まります。
キャンセルボタンを押すと、プロシージャに「u」て入る… orz
お手数をおかけしますが、なにとぞご教示ください
754デフォルトの名無しさん:2007/04/22(日) 17:24:59
シャットダウンの権限を取得してシャットダウンを行うようなAPIをつかってはどうか?
755デフォルトの名無しさん:2007/04/22(日) 17:33:19
ans=Application.ExecuteExcel4Macro("2*5+10")
756デフォルトの名無しさん:2007/04/22(日) 18:16:40
Shell "shutdown.exe"
757デフォルトの名無しさん:2007/04/22(日) 18:45:14
SendKeys "u",True
758一般人:2007/04/22(日) 19:53:34
   A     B     C    D
1 八百屋  100  りんご  
2 スーパー 200  みかん
3 八百屋  350  ばなな
4 八百屋  460  りんご

例えば上のような状態のとき、A列の中から"八百屋"という文字列を検索し、
検索された"八百屋"という文字列がある行(上記の場合1と3)のC列にある
"りんご"という文字列の数を検索し、その結果をセルD1に表示させる関数
って存在しますか?

=IF(A1:A4,"八百屋",[COUNTIF=(C1:C4,"りんご")])

これが限界で・・・
759デフォルトの名無しさん:2007/04/22(日) 20:11:41
どうなればいいのかよくわからんが
セルの関数だけでは複雑すぎるような
760デフォルトの名無しさん:2007/04/22(日) 20:16:10
単純にA列には「八百屋」、C列に「りんご」と入った時だけカウントする
っていう意味と違う?
761一般人:2007/04/22(日) 20:26:02
デフォルトの名無しさん

おっしゃる通りです・・・大変申し訳ありません。。。
そういったことは可能でしょうか?
762デフォルトの名無しさん:2007/04/22(日) 20:39:12
>>758
D1=SUMPRODUCT((A1:A4="八百屋")*(C1:C4="りんご"))
763デフォルトの名無しさん:2007/04/22(日) 20:45:38
そういや、ここVBAのスレじゃないの?
764デフォルトの名無しさん:2007/04/22(日) 20:51:11
WordやPowerpointじゃVBAの活用ポイント思いつかんからなぁ
765デフォルトの名無しさん:2007/04/22(日) 20:59:52
んー関数の質問ならありかと思ってる
766デフォルトの名無しさん:2007/04/23(月) 00:02:46
まぁ
EXCEL や VBA の教えてスレ

と捉えれば>>765に賛成できるおれが登場
767デフォルトの名無しさん:2007/04/23(月) 02:17:17
VBAスレなんでいちおw
標準モジュールに以下を追加してくれれば
=CIF2(A1:A4,C1:C4,$A$1,$C$1)
のような形式でカウント出来るけど駄目ならスルーしてください

Function CIF2(rg1 As Range, rg2 As Range, str1 As String, str2 As String)
Dim n As Long, i As Long, j As Long
Application.ScreenUpdating = False
If Not (rg1.Columns.Count = 1 And rg2.Columns.Count = 1) Then
CIF2 = "ERROR"
Exit Function
End If
j = 0
If rg1.Rows.Count - rg1.Row - 1 > rg2.Rows.Count - rg2.Row - 1 Then
n = rg1.Rows.Count - rg1.Row - 1
Else
n = rg2.Rows.Count - rg2.Row - 1
End If

n = Range("A65536").End(xlUp).Row
For i = 1 To n
If Cells(i, rg1.Column) = str1 And Cells(i, rg2.Column) = str2 Then
j = j + 1
End If
Next
CIF2 = j
Application.ScreenUpdating = True
End Function
768デフォルトの名無しさん:2007/04/23(月) 02:22:34
スマソ、真中のところ以下に置き換え願います・・
If n = rg1.Row + rg1.Rows.Count - 1 > n = rg2.Row + rg2.Rows.Count - 1 Then
n = rg1.Row + rg1.Rows.Count - 1
Else
n = rg2.Row + rg2.Rows.Count - 1
End If
769デフォルトの名無しさん:2007/04/23(月) 09:22:32
>>758
あっしならピボットテーブル使う方向で考えるだす
770デフォルトの名無しさん:2007/04/23(月) 23:57:06
>>769
そこをあえてVBAでやるのが静かなブーム
771デフォルトの名無しさん:2007/04/24(火) 11:48:01
>>762
768じゃないけど感動。
SUMIFの代わりに最適だ。

そんなイカした兄貴に質問があるっす。

A1に、[ブック名]
B1に、シート名!
C1に、A2:F5000
と入力されているときに
SUMIFとかの範囲指定で、
=SUMIF(A1&B1&C1,"=hoge",F2:F5000)
とするとウマク動きません。

シート名をセルから参照する方法を教えてくださいーっ
調べてもわからないから自作したんだけど
遅すぎて話にならないです
772771:2007/04/24(火) 12:37:56
事故解決。
INDIRECTでおk
VBAでWorkSheetFunction使ってたのがアホらし。
次からは良く調べます
773デフォルトの名無しさん:2007/04/27(金) 09:03:45
特定の文字列以外のセルを
全部消去
774デフォルトの名無しさん:2007/04/28(土) 00:45:32
リストボックスについて質問です。

リストボックスに表示される文字列の右側を表示したいのですが、
リストボックス以上の文字列の長さを設定すると、右寄せにならずに途切れてしまいます。

そこで、ColumnWidthsをいじって水平スクロールバーを出して全体を表示させたのですが、
これだと、自動でスクロールバーを動かさない限り右寄せで表示されません。

スクロールバーを表示させない状態で文字列の右側表示が可能なのか?
または、VBA側でスクロールバーを右側に設定できるものなのでしょうか?
775デフォルトの名無しさん:2007/04/28(土) 08:44:51
>>774
つ ListViewコントロール
776デフォルトの名無しさん:2007/04/28(土) 10:56:15
>>775
ListViewって.Netでしか使用できないコントロールですか?
Excel2003 VBAでも使用できるものでしょうか?
777デフォルトの名無しさん:2007/04/28(土) 13:28:25
> ListViewって.Netでしか使用できないコントロールですか?
いいえ

> Excel2003 VBAでも使用できるものでしょうか?
使用出来るように出来ますよ
778デフォルトの名無しさん:2007/04/29(日) 01:46:48
横槍入れると
CommonRuntime のコントロールを追加する

でよかったけ?
779デフォルトの名無しさん:2007/04/29(日) 12:49:07
大変初歩的な質問で申し訳ないのですが、
VLOOKUP関数で得られた数値をSUMで合計しようとした場合、
全てのVLOOKUP関数で数値が得られないと「#NA」のエラーが
でてしまいます。
VLOOKUPで得るセルの個数は場合によって違うので、
SUMでは、「=SUM($A$1:$A$500)のようにしているのですが、
たとえば、VLOOKUPのセルが200個くらいでもキチンと合計を出してくれる
方法はないでしょうか?

またスレ違いでしたら該当スレへの誘導をお願いします。
780デフォルトの名無しさん:2007/04/29(日) 13:36:38
sumif(...,">=0")でどう?
781デフォルトの名無しさん:2007/04/29(日) 13:39:43
自己解決しました。
すみませんでした。
782デフォルトの名無しさん:2007/04/29(日) 13:41:29
>>780
ありがとうございます。
まさに、その方法で解決できました。
今はVLOOKUPで任意の文字数だけ一致しているのを
判定するにはどうすればいいか勉強中です。
783デフォルトの名無しさん:2007/04/29(日) 14:59:06
A1に記入した日付の3ヶ月後の末日をA2に自動的に
記入するにはどういう関数がよろしいでしょうか?
末日が土日祝日の場合は平日最後の日を記入したいんですが
784デフォルトの名無しさん:2007/04/29(日) 15:05:41
>>783
アドインの中の「分析ツール」にチェック入れて
「EDATE関数」と「WEEKDAY関数」を組み合わせて使うがヨロシ。
785デフォルトの名無しさん:2007/04/29(日) 21:28:43
どのみち祝日判定の関数がないから関数つくらないとだめだね
786デフォルトの名無しさん:2007/04/29(日) 21:49:06
>>785
「exel 祝日 計算」で、ちょっとググると出てきたなwwww
http://www.h3.dion.ne.jp/~sakatsu/ktfunc_main.htm
787デフォルトの名無しさん:2007/04/30(月) 14:04:32
はじめまして。質問させてください。
VBA を始めて 1週間の初心者です。

Q1.
Excel VBA で
 Rows("1:10").Copy Destination:=Range("A11")
のように、行まるごとのコピーを行いたいのですが、
行の指定(上記サンプルで "1:10"部分)を VBA の変数で動的に変更するには
どうするのがスマートでしょうか?
("1:10" 形式の文字列を生成して与えるしかないのでしょうか?)

(補足)
行全体をコピーしたいのは、行の高さもコピーしたいからです。
セル単体なら Cells(r, c).Address で行 r, 列 c を A1 形式に変換できるので、
行全体についても同様のスマートな方法があることを期待しています。

Q2.
Excel VBA で、コピー元にボタンが含まれるとき、ボタンはコピーせずにすませたいのですが
どうするのがいいんでしょ?
788デフォルトの名無しさん:2007/04/30(月) 18:06:23
A1 Resizeするなり、Range内でRows使うなりお好きなように。
A2 普通にやればいいじゃん。普通のやり方はググってね。
789787:2007/04/30(月) 19:23:09
>>788
回答ありがとうございます。
Q1については EntireRow プロパティーを使って次のようにしてみました。
Dim r1, r2 As Long
r1 = 1
r2 = 10
Range(Cells(r1, 1), Cells(r2, 1)).EntireRow.Copy Destination:=Range("A11")

Q2がちょっとわかりません。キーワード等、いまひとつヒントをいただけるとありがたいのですが。
790デフォルトの名無しさん:2007/04/30(月) 20:43:38
形式を選択して貼り付け→値を選択して張り付けたらボタンはコピーされんかったけど
それをマクロにしても駄目なん?
791787:2007/04/30(月) 21:07:03
お騒がせしてすみません、なんとなく自己解決できた模様。
[フォーム] ツールバーでワークシートに貼り付けたボタンはセルと一緒にコピーされてしまいますが、
[コントロールツールボックス] ツールバーで貼り付けたボタンはコピーされないようです。
後者のボタンを使うことで、目的が達成できました。
両者の違いはこれから勉強します…が、常識ですかそうですか_| ̄|○|||

>>790
質問が舌足らずでお手間をとらせてしまい申し訳ありません。
実は >787 の Q2 は、Q1 でやりたかったことと関係してまして、
行まるごとコピーしたとき、その行に含まれてるボタンまで
コピーされてしまうので、それを防ぎたいということだったのです。
「形式を選択して貼り付け」ですと、行の高さがコピーされませんよね。
792デフォルトの名無しさん:2007/04/30(月) 23:40:35
>>789
r1がVariant型になってるよ
793デフォルトの名無しさん:2007/05/01(火) 08:21:09
>>792
dクス。そうでした(ていうか素で >789 な宣言でいいと思ってた)_| ̄|○|||
794デフォルトの名無しさん:2007/05/01(火) 09:36:41
質問
会社からVBAを覚えろ
って言われたのだが
PC知識がまだまだ未熟な俺どうやって覚えればいい?
初心者はこれを勉強しろ
って物や
覚える順序を
教えてほしいのだが
795デフォルトの名無しさん:2007/05/01(火) 09:56:19
マクロ記録とヘルプ
796デフォルトの名無しさん:2007/05/01(火) 13:09:50
>>795
把握した
とりあえずやってみる
797デフォルトの名無しさん:2007/05/01(火) 13:27:22
>>794
キーボードが打ててマウスが使えりゃPC知識はどうでもいい。
"VBA 講座"でGoogle検索してサイトをじっくり覗いてみて、
理解できる文章が0というなら本でも買えボケ。
 Access VBAプログラミング開発工房 入門・基礎編 - 緒方典子
 かんたんプログラミング Excel2003 VBA 基礎編 - 大村あつし
この辺り、Amazon検索すりゃすぐ出る。出来るなら立読みして読み比べた方が良いぞ。

解からないことがあったら辞書引くだろ?
同じようにPCならヘルプを見るかググれ、ヘルプの見方は使って覚えれ。
798デフォルトの名無しさん:2007/05/01(火) 13:34:37
俺も関数辞典かわないとな
799デフォルトの名無しさん:2007/05/01(火) 13:52:11
質問よいかしら。
Button1_Click() → Sub1 → Sub2 → Sub3
というふうに、サブルーチン(関数でもいいが)の中からサブルーチンを呼んだとします。
その先から一気に Button1_Click() を終了させる手段ってあります?
イメージとしては、Perl の die 関数みたいに、(エラー)メッセージを表示して、
手軽に終了するルーチンが作りたい or 欲しい。
800デフォルトの名無しさん:2007/05/01(火) 13:59:54
dao360を使ってMDBに接続してdbの内容をセルに表示しているのだが
vistaではうまく表示できない場合があるらしい その環境が手元にないので
検証できないのだが 自分のVISTAの環境では正常動作していた。
vistaというかofficeのバージョンのような気もする。不具合は2007で発生。
具具って見たもののいまいちなので質問させていただきます。
801デフォルトの名無しさん:2007/05/01(火) 14:56:16
>>799
自己レス。
いろいろググって
Sub die(msg As String)
  MsgBox msg
  Call Err.Raise(Number:=vbObjectError + 9999)
End Sub
という方法を見つけたけどこれはダサい。
もっとましな方法(せめて、Raise したとき出るダイアログボックスに msg を出させるとか)ないですかね…
die 呼び出し元のソースファイル行が表示できれば完璧なのですが…
802デフォルトの名無しさん:2007/05/01(火) 15:25:56
まあデバッガで呼出元すらたどれないぐらいだから
803800:2007/05/01(火) 15:35:25
>>800
オイラも自己レス ADOバージョンを作ることにします。

>>799
戻り値をbooleanにした関数にするっていうのは?
グローバル変数をサブルーチンで書替えて知らせるというのは?
ちらっと思ってみただけだからあてはまるかどうかわかりませぬ

では
804デフォルトの名無しさん:2007/05/01(火) 15:53:09
>>803
>戻り値をbooleanにした関数にするっていうのは?
>グローバル変数をサブルーチンで書替えて知らせるというのは?
これらの方法も、他に手段が無い場合は大いにアリかとは思いますが、
呼び出し元での IF 文は極力無くしたいのです。

一番スマートなのは die() の中で例外をスローすることかもしれんが、
VB.NET ではできて VBA ではできないっぽいorz
805デフォルトの名無しさん:2007/05/01(火) 16:00:19
Endコマンドと変わらんやん
806799:2007/05/01(火) 16:12:00
>>805
うわホンマや!停止に関しては、End で無問題ですね(汗
ありがとうございます。
恥ヅ〜(|||´ω`;

>>802
とりあえず行番号はあきらめます、、
807デフォルトの名無しさん:2007/05/01(火) 18:13:29
誰か教えてください....
エクセル表で空欄がある場合に、エラー表示を出して先に進めなくする方法ってありますか?
調べてもわからないのです。。。
808デフォルトの名無しさん:2007/05/01(火) 18:21:47
表が完成してないなら空欄があるに決まってるから
そこから先に進めないと永遠に完成しないぞw
809デフォルトの名無しさん:2007/05/01(火) 18:30:00
エクセルで作成したあるフォームが用意されていまして、
それに対する解答の入力漏れを防ぐために関数か入力規則などを
使用してカーソルを先に進めなくする方法があるものかと思いまして。。。
810デフォルトの名無しさん:2007/05/01(火) 18:36:22
適当にIF文でセルの文字チェックすればいいんじゃね?
811デフォルトの名無しさん:2007/05/01(火) 18:51:26
エクセルのセルだと抜けるときが感知できないから
コントロールのテキストボックス使わないとできないな
入力漏れを防ぐ目的なら条件付書式で空欄ならバックを赤くするとかでいいと
思うけど
812デフォルトの名無しさん:2007/05/01(火) 18:51:31
>>809
SelectionChangeイベント拾って判定すれば?
813デフォルトの名無しさん:2007/05/01(火) 18:52:52
あフォームか。失礼
814デフォルトの名無しさん:2007/05/01(火) 19:00:21
質問者 >809 が、「(ユーザー)フォーム」というマイクロソフト用語を正確に使ってるかどうか。
「エクセルで作ったフォーム」じゃ、ワークシートのつもりで言ってる可能性がある。
ていうか、「セル」と言ってる時点で多分後者っぽいので、>812 で正解な希ガス
815814:2007/05/01(火) 20:39:03
>807 から質問者の意図を汲んで嬉しげにサンプルなど書いてみる。

VBE のプロジェクトブラウザで、[Microsoft Exce Objects]→[Sheet1] をダブルクリックし、
そこに下記コードをコピペする。(※インデントの全角スペースは半角に変換してください)
すると、Sheet1 の中では、選択中のセルが空白である限り、他のセルを選択できなくなります。
---<コードここから>---
Option Explicit
Private rLastRange As Range
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 If rLastRange Is Nothing Then rLastRange = Target
 If IsEmpty(rLastRange.Value) Then
  rLastRange.Select
 Else
  Set rLastRange = Target
 End If
End Sub
---<コードここまで>---
Worksheet_SelectionChange() というのが、>812 で出てきたイベントハンドラ。
これで、どすかね。
816814:2007/05/01(火) 20:56:14
失礼、日本語の読み落としが多いな漏れ、、
>815 のコードは、「空欄がある場合に、先に進めなくする」だけでエラー表示しません。
「空欄がある場合に、エラー表示を出して先に進めなくする」
には、コードの上から 6 行目“rLastRange.Select”
の直下にエラー表示のコードを追加するといいと思います。
適宜改良してください。
817デフォルトの名無しさん:2007/05/01(火) 22:06:07
807です。レスが遅くなりスミマセン。。
質問のご解答をいただいた皆々さま、アドバイスありがとうございました。
自分でこれから色々試してみます。助かりました〜。

818814:2007/05/02(水) 14:07:40
重ね重ねすまない、、
>815 のコード4行目
誤:If rLastRange Is Nothing Then rLastRange = Target
正;If rLastRange Is Nothing Then Set rLastRange = Target
シート開いて一発目しか通らない部分なので発見しそびれたorz
819デフォルトの名無しさん:2007/05/07(月) 10:09:02
質問です

マクロで計算したデータをシート(セル)に入れないで直接印刷したいのですが
どうすればいいのでしょうか?
820デフォルトの名無しさん:2007/05/07(月) 11:06:52
>>819
スレ違いです。VBAとはVB言語でApplication(Excel)を操作するからVBA。
Excel付属のVBE使っても、Excel自体の操作以外はVBAではなくVB6の分野。
821デフォルトの名無しさん:2007/05/07(月) 13:42:57
>>819
プリンタに直接データを送る方法も知ってるけど、
そんな質問をしてしまうあなたには
「印刷用のシートを作ってそれを印刷してそのシートを消す」
って方法をオススメしましょう。
822デフォルトの名無しさん:2007/05/07(月) 15:11:03
>>820
また恥かくからやめとけ
823デフォルトの名無しさん:2007/05/07(月) 15:18:08
>>822
退屈だから語らせてみようぜ?
824デフォルトの名無しさん:2007/05/07(月) 16:35:31
>>822m9(^Д^)プギャー
825819:2007/05/08(火) 05:34:07
>>820
VB6でやった方が簡単なのはわかるのですが
会社でプログラムをいじれない(VB6を入れれない)ので
エクセルVBAで処理してます。エクセルならどのPCにも入ってるので

>>821
印刷用のシート作ったほうが簡単そうですね。
プリンタにデータ送るのは、シーケンシャル出力ですか?
826デフォルトの名無しさん:2007/05/08(火) 07:57:02
Excel2007にはVBAついてないって本当なの?
なんでもいじろうと思ったら、ヴィジュアルスタジオツールキットっていう馬鹿高いソフトが別途必要とか。
VB.NETもしくはC#が使えるそうです。
827デフォルトの名無しさん:2007/05/08(火) 08:59:58
>>826
普通にVBA使えるよ。
828デフォルトの名無しさん:2007/05/08(火) 09:36:56
>>825
APIでPrintDlgかCreateDCで hDCを取得して GDI で描画したいって事?
829デフォルトの名無しさん:2007/05/08(火) 12:10:51
>>826
むしろその情報が何処から出てきたのかkwsk
830819:2007/05/08(火) 15:41:32
>>828
ただの数値データなんでふつーに印字できればいい程度です
ちょっとAPIでやってみます
831デフォルトの名無しさん:2007/05/08(火) 19:24:30
"100"ごとに桁をかえないで、"60"ごとに次の桁へかえられるようにグラフ設定をすることは可能ですか??
時計と同じく60進数で。。。

857、858、859、900、901、902ってな感じでグラフを作りたいのですが。。。
832デフォルトの名無しさん:2007/05/08(火) 20:58:14
実際に使って試してみるとよい。
Office2007 試用版 (60日限定で製品版とほぼ同じ)
http://office.microsoft.com/ja-jp/products/HA101741481041.aspx

こっちは VB, VC++, VC# と 英語版VJ#
Visual Studio Express (無料)
http://www.microsoft.com/japan/msdn/vstudio/express/
833デフォルトの名無しさん:2007/05/08(火) 21:05:35
>831 マルチかな?
834デフォルトの名無しさん:2007/05/09(水) 01:09:27
>>833
831は表現が中学生だもんな
十分ありえる
835デフォルトの名無しさん:2007/05/09(水) 09:12:35
>>834
ぼくすっごいどういだよっ?

60しんすうくらいじぶんでなんでかけないんだろ
しょうがくせいいかののうみそのやつはしねよ
836デフォルトの名無しさん:2007/05/09(水) 21:59:14
あるRangeオブジェクトが、他のRangeオブジェクトに含まれているかどうかは、
どうやって判定したら良いのでしょうか?

例えば
Set rng1 = Range("A1")
Set rng2 = Range("A1:A2")
Set rng3 = Range("b1")
Set rng0 = Range("A:A,C:C")

rng1とrng2はrng0に含まれて、rng3はrng0に含まれないということの区別をしたいのですが・・・


よろしくお願いします。
837デフォルトの名無しさん:2007/05/09(水) 22:36:33
>>836
Set rng = Intersect(rng1, rng0)

じゃいかんの?
重複部分のRangeが戻るから後はお好きに。
てかそれ系のオブジェクト操作はmougが秀逸だよ。
838デフォルトの名無しさん:2007/05/10(木) 00:46:24
プログラムなど学んだ事のない初心者です。
VBAを使えるようになりたいのですが、初心者にお勧めの
学習用の本ってどんなのがありますでしょうか?
839デフォルトの名無しさん:2007/05/10(木) 01:25:21
>>837
教えて下さってありがとうございます。

>てかそれ系のオブジェクト操作はmougが秀逸だよ。

モーグを見てもrangeオブジェクト操作関連らしいの分からなくて、、、(汗
840デフォルトの名無しさん:2007/05/10(木) 06:19:29
>>838

大き目の本屋に行って何冊か立ち読みして気に入ったモンを買う。
それぐらいの手間はかけろ
841デフォルトの名無しさん:2007/05/11(金) 22:28:34
VBAでIF(OR(A1={1,5,10}),"yes","no")と同じような記述の仕方があったら教えて下さい。
842デフォルトの名無しさん:2007/05/11(金) 22:41:25
varA1 = Range("A1").Value
If varA1 = 1 Or varA1 = 5 Or varA1 = 10 Then
Range("B1").Value = "yes"
Else
Range("B1").Value = "no"
End If

とか
843デフォルトの名無しさん:2007/05/11(金) 22:48:54
VBAでは1行で済ませられないでしょうか?
844デフォルトの名無しさん:2007/05/11(金) 23:27:15
varA1 = Range("A1").Value :If varA1 = 1 Or varA1 = 5 Or varA1 = 10 Then :Range("B1").Value = "yes" :Else :Range("B1").Value = "no" :End If
とか
845デフォルトの名無しさん:2007/05/12(土) 00:35:57
文字列中に、特定の語句があればA、無ければBの処理をしたい時に、

aaa="ABCDEFGHIJK"
if Application.WorksheetFunction.Search("検索文字列",aaa, 1)=""
then 処理A
else 処理B
end if

のようにやると、うまく判別できません。Searchで検索文字が無い場合をif文で
判別するにはどうすればよいのでしょうか?
あるいは、他にもっとよい方法がありますか。
(繰り返し処理なので、できればセルに文字列を入れないで処理したいのですが)
846デフォルトの名無しさん :2007/05/12(土) 01:53:55
>>845
まず
if文が違う もし、検索結果があった場合に返ってくるのは整数だろ?それを
文字列で指定してたら型違いになる。そして、検索結果がなければエラーになる
ということを考えてない。

てゆうか、WorkSheetFunctionを使わないといけない理由は?
Instrじゃいけないの?
Instr(aaa、"検索文字列")で検索文字列がaaaに含まれていなければ0を
返すし、含まれていればSearch関数と同じ数値を返す。
だから
if Instr(aaa,"検索文字列") > 0 then 処理A else 処理B
でいいんじゃ?
847デフォルトの名無しさん:2007/05/12(土) 02:12:23
>>844
もっと短くして
848デフォルトの名無しさん:2007/05/12(土) 03:37:30
varA1 = Range("A1").Value :Range("B1").Value = Array("yes","no")(varA1 = 1 Or varA1 = 5 Or varA1 = 10)
とか
849デフォルトの名無しさん:2007/05/12(土) 03:38:59
((varA1 = 1 Or varA1 = 5 Or varA1 = 10) +1)
850デフォルトの名無しさん:2007/05/12(土) 04:49:21
>557
AddLineと名前の変更を分離した方がいいは思う。
851デフォルトの名無しさん:2007/05/12(土) 10:28:47
短くなるもんだなw
852デフォルトの名無しさん:2007/05/12(土) 16:22:04
VBAのソース保護のため色々調べてみましたが
標準のパスワードロックでは簡単に破られるので
もう少しセキュリティの高い物を探しています。

そこでこんなものを見つけてみたのですが
http://passmaster.fujigoma.com/?target=http://passmaster.fujigoma.com/passmas/index.htm
どんなものでしょうか?実際、DEMOのファイルを見てみると
普通の解除ツールでは無理っぽいのですが、このロックも簡単にクリアできるのでしょうか?
853デフォルトの名無しさん:2007/05/12(土) 18:15:13
VBAのソースなんて保護する値打ちないだろ
854デフォルトの名無しさん:2007/05/12(土) 18:43:28
>>852
VBAには、不用意な改変を防ぐ保護機能はあるけど
ソースを隠す為の機能は無いよ。

MSは、ソースを完全に隠せるようにすることよりも
万が一パスワードを紛失しても強制解除出来るようにしておくことで
ソースを紛失することを避ける道を選んだのだから。

ぶっちゃけ、>>852のリンク先のをやっても結構簡単に解除出来る。
どうしてもソースを隠したいなら、
ttp://www.amazon.co.jp/Visual-Studio-Tools-Office-2005/dp/B000CSRIZA
などを買って下さい。ちょっと高いけどね。
そこまでして隠す必要はないというなら、諦めるか解除可能な保護で納得してください。
855852:2007/05/12(土) 19:05:32
>853
時と場合にもよりますが、それなら最初からVBAでつくるなって話ですよね。

>854
http://passmaster.fujigoma.com/?target=http://passmaster.fujigoma.com/passmas/index.htmの
「パスワード保護ツール」でロックをかけたファイルをVector等にある
総当たりツールで試してみましたが、このツールで作ったものだけ
普通に手に入るツールでは解析にも入れませんでした。

先にも述べたとおり、確実に保護するのであれば無論VBやVCで組めばいいのですが
今回ちょっと詳しい普通の人が、解除できなければOKと言うものです。
どのようにすれば、「パスワード保護ツール」は解除できるでしょう?
その手順等がわかれば、今回ソースを見せたくない対象のスキルはわかっているので
判断がつくかと思います。
856852:2007/05/12(土) 19:19:01
追記です。

http://passmaster.fujigoma.com/?target=http://passmaster.fujigoma.com/passmas/index.htmの
「パスワード保護ツール」での保護が簡単に解除できるものかどうか知りたいというのが主旨です。
普通の人に解除できそうでなければ、これを使おうと考えていますが
ここの住民の皆さんに、これってどうよ?簡単に解除できちゃう?
ってのを聞きたい分けです。
解除できるのであれば、どのようにすればできるのかを含めて、見ていただけると
うれしいです。

857デフォルトの名無しさん:2007/05/12(土) 19:22:58
強制解除されたときに自分のソースを消すようにプログラム書いておくことは可能?
858デフォルトの名無しさん:2007/05/12(土) 20:52:59
854じゃないけど、仮にVBAのパスワード保護が有効に働いたとしても
エディタ等で開けばそれなりにソース見えちゃうからね。
たまにパスワードが平文で埋まってたりするけど。
余計な世話だったらスマン。

>>857
つコピー・マクロ無効
859デフォルトの名無しさん:2007/05/13(日) 01:18:35
いい問題集とかない?
860デフォルトの名無しさん:2007/05/13(日) 01:44:52
テキスト形式で数十万行になるファイルから、そのテキスト内の特定のキーワードから決まった相対位置にある
数字を抜き出すにはどうしたらいいでしょう?
861デフォルトの名無しさん :2007/05/13(日) 01:56:23
>>860
Instr関数を繰り返し使ったらいけないの?

てゆうか、数十万行になるテキスト形式ファイルってEXCELで読めないんじゃないか?
862デフォルトの名無しさん:2007/05/13(日) 02:29:14
Excel2007は行数制限が緩和されてまふよ。
863デフォルトの名無しさん:2007/05/13(日) 09:01:45
>>861
分割して読み込むテクニックはある(みたい w)
これは拾ったもので俺自身は試していないし、860の依頼に叶うものかどうか
も知らんけど

ttp://kasamatu.o0o0.jp/pochi/src/hajime13979.txt.html pass excel
864デフォルトの名無しさん:2007/05/13(日) 09:17:19
糞でかいファイルは素直に2007使え
処理速度とか上がってるし快適だぞ
865デフォルトの名無しさん:2007/05/13(日) 14:13:37
2007すごいよな。UIのなれは必要だけど、
100M超えても平気で動くし、ファイルも小さく圧縮がかかる。
正直戻れません。
866デフォルトの名無しさん:2007/05/13(日) 14:27:39
>>864
処理速度上がってるか?
テストしたら全面的に遅くなってるが。
867デフォルトの名無しさん:2007/05/13(日) 14:30:37
同一環境で2003で作ったマクロ。
2003の場合、10秒
2007の場合、13秒(2007形式に変換)
処理速度は多少遅くなってる。
それより大量のデータを扱っても壊れないほうが大事
868http://dhcp180-87.tamatele.ne.jp.2ch.net/:2007/05/13(日) 18:11:54
guest
869デフォルトの名無しさん:2007/05/14(月) 03:39:05
なんで唐突に節穴ってるんだw
870デフォルトの名無しさん:2007/05/14(月) 12:54:48
エクセルについての質問です。
A1:A5などの複数セルのなかで、
特定の文字列が含まれている(例セルがABCで、Aが含まれてる)セルを調べるにはどのようにすればよいでしょうか?

COUNTIFをつかうと=でしか調べられません…。

どなたかご教授願います。
871デフォルトの名無しさん:2007/05/14(月) 13:18:34
>>870
ここはプログラム板です。
VBAでやりたいのなら質問をどうぞ。
そのセルを調べてどうしたいの?
872デフォルトの名無しさん:2007/05/14(月) 20:44:43
うるせえな、聞かれた事に答えろよ。
答えられないなら黙ってろ。
873デフォルトの名無しさん:2007/05/14(月) 20:58:23
ヒ宴g:●□△ド◎▼ド
874デフォルトの名無しさん:2007/05/14(月) 21:02:16
関数の質問はありだと思うな
俺の知識ではVBAでやれとしか胃炎
875デフォルトの名無しさん:2007/05/14(月) 22:05:07
>>870 ピント外れかも試練が・・・。
B1=IF(ISNUMBER(SEARCHB($C$1,A1,1)),ADDRESS(ROW(A1),COLUMN(A1),4),"")
C1=探す文字
探す文字が含まれたセルの隣にセルのアドレスが表示される。
876デフォルトの名無しさん:2007/05/14(月) 22:24:55
>>870
Sub test()
  Dim status As Variant
  Dim Adr As String

  Set status = Range("A1:A5").Find(What:="A", LookAt:=xlPart)

  If Not status Is Nothing Then
    Adr = status.Address
    Do
      status.Select
      MsgBox "これだよ!"
      Set status = Range("A1:A5").FindNext(status)
    Loop While status.Address <> Adr
  Else
    MsgBox "ないんやけど…"
  End If
  MsgBox "おしまい"
End Sub
877デフォルトの名無しさん:2007/05/16(水) 03:55:04
>>870
検索条件の文字列をマスク文字で囲んで使う
*A*
878デフォルトの名無しさん:2007/05/16(水) 20:35:04
根本的な事を教えてください。

標準モジュールを呼び出すにはどうすればよいのでしょうか?


標準モジュールに
----------------------------
Sub test()

MsgBox "TEST"

End Sub
----------------------------

そしてコントロールボックスなどでボタンを配置して
クリックしたら
---------------------------
Sub onclick_B01()


End Sub
---------------------------
というのを考えています。
879デフォルトの名無しさん:2007/05/16(水) 20:38:28
Call test
とか
Call onclick_B01
ってこと???
880デフォルトの名無しさん:2007/05/16(水) 20:40:58
もしかして・・・

Sub onclick_B01()
 call test
End Sub

これか??
881デフォルトの名無しさん:2007/05/16(水) 20:47:41
Callでいいんですね。

根っからのシステム管理やネットワークがメインで
単純な関数しか作らなくて標準モジュールを使った無かったもので。
今までは同じ関数を使う場合、同じソースをコピペしてました。

これでADとExchangeのデータをODBCでひっぱってきて表示することができそうです。
今は毎回標準モジュールのソース開いて実行でテーブルを作成していました。

ありがとうございました。
882デフォルトの名無しさん:2007/05/16(水) 20:55:59
いや・・・
>>879
で言いたい事が今一歩わからなかったんエスパーレスしてみただけなんだが・・・

>そしてコントロールボックスなどでボタンを配置して
>クリックしたら
>---------------------------
>Sub onclick_B01()
>End Sub
>---------------------------
>というのを考えています。

例えばこれだけど クリックしたらこの関数を呼ぶって事?
それだったとしたら、ボタン貼り付けて、デザイン時にそれをダブルクリックすればその関数にいけるんだけども・・・・
ちょっとピンポイントでこれだ!!っていう理解が難しい文章だったもんで・・・
883デフォルトの名無しさん:2007/05/16(水) 21:07:52
確かにエスパーてきな質問でした。

真ん中に標準モジュールの関数を書けばよかったです。

実際

Sub onclick_B01()
Test()
End Sub

と書いた動かなかったもので。はじめからこう書けばよかったです。
884デフォルトの名無しさん:2007/05/16(水) 21:14:20
>>883
onclick_B01
とかってなったっけ?

ボタンがB01でクリックした時に呼ばれるなら
sub B01_Click()
test
end sub

になると思うんだが・・・
885デフォルトの名無しさん:2007/05/16(水) 21:55:42
俺もクラスモジュールはともかく
標準モジュールの概念がさっぱりわからんかった
ヘルプにも満足に書いてないし。This Workbookと何が違うねん
ま、今でもわからんが
886デフォルトの名無しさん:2007/05/16(水) 22:03:06
つまり全部標準モジュールに書いておいたほうがよくね?
887デフォルトの名無しさん:2007/05/16(水) 22:05:21
基本的に使いまわす関数をモジュールにまとめちゃおうって概念じゃね?

本当はスコープレベルがWorkBookとかだと
Private Hoge
モジュールだと
Public Hogehoge()

てな感じに分けて使うもんだとは思うんだが・・・
ぶっちゃけWorkBookもインスタンス化されたクラスだから モジュールと同じようにかけちゃうけどさ
888デフォルトの名無しさん:2007/05/16(水) 22:11:03
標準モジュールが標準なの
でもフォーム、シート、ワークシートのコードモジュールだとmeとか
便利なオブジェクトが使えるしね
標準モジュールでできないのは基本イベント関係ぐらいだろう
889デフォルトの名無しさん:2007/05/16(水) 22:13:13
あと、インスタンス化できないくらいかな?
890デフォルトの名無しさん:2007/05/17(木) 08:53:14
実は出来ないこともないんだけどね
ただ、インスタンス化したかったらクラス使えばいいだけなので、
誰も面倒なことまでして標準モジュールのインスタンス化なんてしないだろうけど
891デフォルトの名無しさん:2007/05/17(木) 09:20:12
まぁモジュールって特殊なクラスだからね
あながちインスタンス化できない(つうか、モジュールはしない するならクラスにするだろう)つうのも間違いじゃないと思う
892デフォルトの名無しさん:2007/05/17(木) 09:54:53
Worksheet_Calculateを設定していると動作が極端に重くなるので
一時的に Worksheet_Calculate停止し、処理の重いマクロを実行し、
その後、再び Worksheet_Calculateを再開したいのですが

それは可能でしょうか?
893デフォルトの名無しさん:2007/05/17(木) 10:30:11
マクロ実行判定フラグで以降の処理に行かないようにすれば?
894デフォルトの名無しさん:2007/05/17(木) 10:37:01
話が噛み合っていない希ガス。
895デフォルトの名無しさん:2007/05/17(木) 11:22:38
896デフォルトの名無しさん:2007/05/17(木) 11:44:27
>>894
できないと思ったから次善策書いたんだが的外れ?
897デフォルトの名無しさん:2007/05/17(木) 11:48:30
EnableCalculation=false
マクロ実行
EnableCalculation=true

でいい気ガス
898デフォルトの名無しさん:2007/05/17(木) 12:00:24
>>897
これでokでした
ありがとうございました
899デフォルトの名無しさん:2007/05/17(木) 19:23:47
セルに文字列9012345678が入っています
09012345678
に変換したいのですがどうしたらいい?
900デフォルトの名無しさん:2007/05/17(木) 19:31:01
表示形式を00000000000に

表示形式を文字列にしてから"09012345678"を代入

"'09012345678"をValueに代入

"=""09012345678"""をFormulaに代入


どれでもお好きなように
901デフォルトの名無しさん:2007/05/17(木) 20:08:46
>>900サンクス
>>表示形式を00000000000にって
どうやったらできますの?
902デフォルトの名無しさん:2007/05/17(木) 20:20:32
変数宣言と同時に初期化できますか?
903デフォルトの名無しさん:2007/05/17(木) 20:45:58
>>901
ユーザー定義
>>902
無理だろ
904デフォルトの名無しさん :2007/05/18(金) 00:21:42
>>901
セルの書式設定のユーザ定義で。
>>902
VB.NETならできるけど、VB6ベースのVBAは無理。

てことで903と同じ答えだった…
905902:2007/05/18(金) 00:33:24
>>903
>>904
thanks
906デフォルトの名無しさん:2007/05/18(金) 11:46:37
>>900
地雷踏んだな
907デフォルトの名無しさん:2007/05/18(金) 17:13:04
同時は無理だけど、同行は可能
Dim x : x=1
908デフォルトの名無しさん:2007/05/18(金) 19:52:42
>>906
909デフォルトの名無しさん:2007/05/18(金) 20:13:39
誘導されてきました、VBAです。
よろしくお願いします。

環境:エクセル2000 WIN2000

「質問内容」
 目的:「エクセルのセルの中身が、変更したらVBAの処理が起動するようにしたい」

     ・セル1+セル2=セル3

     このような状態で「セル3が変更したら、VBAの処理を起動させる」ようにしたい。
      セル1・2は、サーバーとの自動連携により勝手に値が変わる。
      セル3には、「=セル1+セル2」の式を入れてます。

      この状態だと、Worksheet_Changeが起動しません。
      セル1もセル2も、自動連携の為、値が変わっても「値が変わってる」と判断しません。
      セル3も数式が入れてあるので、値が変わっても「値が変わってる」と判断されません。

      このような状態で、値が変わったら、VBAを動かす方法はありますでしょうか?
      何か良い方法がありましたら教えてください。
910デフォルトの名無しさん:2007/05/18(金) 20:35:50
>>909
OnTime再帰で監視

これでわからなければ君がこれに手を出すのはまだ早い
解るようになるまで精進してから出直そう
911デフォルトの名無しさん:2007/05/18(金) 21:24:33
>>910
わかりました。
やっぱりそれしかないですねorz

912デフォルトの名無しさん:2007/05/18(金) 21:25:37
>>909
連携って何のことかわからないけどアクセスとかで
xlsファイル変更してるのなら変わらなくて当然だよ
ole経由なら変更されると思うが
913デフォルトの名無しさん:2007/05/18(金) 21:33:38
>>912
こう言う場合、ontime以外に何か良い方法はあるんでしょうか?
できればリアルタイム(値が変わったらすぐ)、処理させたいので。

914デフォルトの名無しさん:2007/05/18(金) 21:34:31
>>909-913
Worksheet_Calculate()でできるが
引数にTargetがないから工夫がいるよ。
915デフォルトの名無しさん:2007/05/18(金) 21:37:41
>>913
こういう場合ってどういう場合だよ
916デフォルトの名無しさん:2007/05/18(金) 21:42:00
回答に対するレスに orz とか使う奴ってどうよ?
これって「お前の回答には失望した」って意味じゃん。例えそのつもりが無くても、実際はそう受け取られるし。
たとえ望み通りの回答じゃなかったとしても、こういうの使わないのがマナーだよな。
917デフォルトの名無しさん:2007/05/18(金) 21:44:03
ms単位で監視したいならDoEventsかSleepでも回してイベント作れば?
何がしたいのかわからん。
918909:2007/05/18(金) 21:45:20
>>914
>引数にTargetがないから工夫がいるよ。
すいません、具体的に工夫したらいいのか、分りません orz
HPでもいいんで教えてください。

>>915
値が変更しても、変更された事にならない場合(この場合、アクセスと同じケース?)です。
919デフォルトの名無しさん:2007/05/18(金) 21:46:53
一回関数に渡したらどうよ?value()とか
920909:2007/05/18(金) 21:49:07
>>916
すいません、そう言う意味ではなくて
「私の力が及ばなくてすいません or 私の実力が足りなくて分らない」って意味です。


921デフォルトの名無しさん:2007/05/18(金) 22:10:16
>>918
アクセスなら無理
まあアクセスもVBA使えるから回りまわればできるけど
アクセスとエクセルで連携とか言ってる意味がわからない
922914:2007/05/18(金) 22:25:22
>>918
>     ・セル1+セル2=セル3
>     このような状態で「セル3が変更したら、VBAの処理を起動させる」ようにしたい。
>     セル1・2は、サーバーとの自動連携により勝手に値が変わる。
>     セル3には、「=セル1+セル2」の式を入れてます。

「サーバーとの自動連携」が何を意味してるのか分からないが
結局やりたいのは↑の2行目なんでしょ。
ならWorksheet_Calculate()でできるよ。
ただ、
1)Targetが引数にないため、どのセルが変更されたかが分からない
 (関係ないセルが変更されても呼ばれる)。
2)イベント処理の中で他のセルを変更して再計算されると何度も呼ばれてしまう
 (再帰ループになってフリーズすることもあり得る)。

1)はセル3の値を保持する変数でも用意しておいて、それと比較する。
2)は処理の前後でApplication.EnableEventsで切り替える。
で対処できる。
他にも問題があるかもしれないが、それはやってみないとなぁ
923デフォルトの名無しさん:2007/05/18(金) 22:33:22
複数のApplication.OnTime TimeValue(指定時刻)と Application.OnTime nextTime
って同居可能ですか?
924デフォルトの名無しさん:2007/05/18(金) 23:57:03
教えて。

自宅のPCが2003対応なんだが
VBA2002の緑本とかピンク本のCDは
ワークするの?
925デフォルトの名無しさん:2007/05/19(土) 00:15:43
まあ全然動かないってことはない
926デフォルトの名無しさん:2007/05/19(土) 02:19:15
>>925
多少、動きがおかしいのでしょうか。
試験対策を上記条件で立てるのは厳しいですかね?
927デフォルトの名無しさん:2007/05/19(土) 08:29:18
2002から2003への変更点について調べて、それを承知の上で使う。
928デフォルトの名無しさん:2007/05/19(土) 12:21:15
ありがとう
929デフォルトの名無しさん:2007/05/19(土) 22:29:20
VBAで色を自由に変更することはできないんでしょうか?

というのもどのサイトを見ても色の指定がColorIndexだけのようなので

ほかの色が設定(RGBとかで自由に)できないのかな?とおもいまして・・・・
930デフォルトの名無しさん:2007/05/19(土) 22:38:34
ColorIndex知ってるならColorだって出てくるだろ。。。
931デフォルトの名無しさん:2007/05/19(土) 22:38:48
colorプロパティってなくなってるの?
932デフォルトの名無しさん:2007/05/19(土) 22:39:56
>>929
RGB(red, green, blue)
で0〜255を指定する。

詳しくはHELP引いてくらはい。
933デフォルトの名無しさん:2007/05/20(日) 03:56:20
>>931>>932
遅くなりました
いけました〜!!
ARGBが使えないのはちょっとあれですが・・・
目的は達成できました!
ありがとうございます!!
934デフォルトの名無しさん:2007/05/20(日) 13:37:38
すみません、知っているかたがおられました教えてください。
いま、フォームにテキストボックスコントロールがあるとします。
そのとき、引数としてテキストボックスコントロールを渡したいのですが、
それをやるとエラーになります。
つまり、

Sub setObject(pObj as TextBox)
End Sub

といったプロシージャーに、

setObj textBoxControl

のようなコールをすると、型が一致しないとのエラーに
なります。
型指定しなければ大丈夫みたいなんですが・・・

すみません、よろしくお願いします。
935デフォルトの名無しさん:2007/05/20(日) 14:05:32
まさに渡している物の型を間違えてるんじゃないかと
936デフォルトの名無しさん:2007/05/20(日) 15:30:49
>>935
それが、pObj as TextBoxにFormに張ったテキストボックス
コントロールを渡しているんですが。
もしかして、テキストボックスコントロールってTextBoxでない?
937934:2007/05/20(日) 15:35:21
なんか、936であたりでした。
TextBoxをMSForms.TextBoxに変えたらできました。
938デフォルトの名無しさん:2007/05/22(火) 20:35:39
最近、ユーザーフォームでコマンドボタン式の電卓を作っているのですが、小数点
である"."を2回以上入力すると変数の型が一致せずエラーが発生し終了してしまいます。
小数点を1個以上入力できないようにする方法を教えて頂けないでしょうか?
よろしくお願いします。
939デフォルトの名無しさん:2007/05/22(火) 20:56:19
んー、変数の型を文字型にして、
IsNumeric関数で、数値か文字か判断して、
文字だったら入力やりなおしで、
数値だったら型変換すればいいんじゃないかな〜
940デフォルトの名無しさん:2007/05/22(火) 21:11:27
そういうの考えるのが面白いと思うんだがなあ
いろんなやり方あるけど
俺なら前回までに入力した文字列に今回入力した文字をくっつけて
その値が数字かどうか判定するやりかたかな
941デフォルトの名無しさん:2007/05/22(火) 21:12:18
同じご意見の方がいらっしゃいましたorz
942デフォルトの名無しさん:2007/05/22(火) 21:40:27
キー入力式ならそれでもでいいが、コマンドボタン式なら
小数点ボタンにInStrとかで既に入力した物に
"."が含まれているかいるか否かを判断する機構を組み込んだ方がいいな
943デフォルトの名無しさん:2007/05/22(火) 23:58:07
VBにあるMouseOverってないのでしょうか?
あるセルで半角と-(ハイフン)だけを入力させたいのですが、
普通の入力規制で設定するとコピーペーストされた時に
規制が消えてしまう為、MousrOverのようなものが使えればと思いました。
よろしくお願いします。
944デフォルトの名無しさん :2007/05/23(水) 00:09:54
>>938
IsNumericとかInStrとかの使い方を覚えるいいチャンスかも。
一番簡単なのは、小数点を一回押したら小数点のボタンのEnabledをFalseに
することだろうけど、見栄えがな…。
でもVBAで電卓作りって…。
945デフォルトの名無しさん:2007/05/23(水) 19:28:49
どなたか教えて下さい、よろしくお願いします。

 りんご
 みかん
 いちご
 めろん
 くり
 なし
 すいか

と、沢山のデータ(100個ほど)があり、

 私はきょうみかんとりんごを食べました
 いちごとみかんはビタミンCが豊富

とセルに文章が入っていて、それぞれ前述のデータが含まれていたら
隣以降の列にその複数のデータを返すことはできますか?

 私はきょうみかんとりんごを食べました  → みかん りんご  
 いちごとみかんはビタミンCが豊富    → いちご みかん

※一つの単語を返す方法はexcel初心者スレで教えていただきました。
その後複数のデータが含まれたら行き詰ってしまいました、
よろしくお願いします。
946デフォルトの名無しさん:2007/05/23(水) 19:45:05
For 文使えば幸せになれるかも知れんな

みかん や りんご などの単語一つ一つが文章に含まれているかどうかを検索して
それをどこかに保持しとけばいいんじゃないかな?
947デフォルトの名無しさん :2007/05/23(水) 20:17:50
なんか幸せそうだなww

ちょっとどういう形なのかが分からないけど、理解できる範囲で答えると、
セルA1〜A100にりんごなどのキーワードが入っているとして、
検索の文章がセルB1に、文章に入っているキーワードがC1から右のセルに
入っていくプログラムね。

Private Sub Search()
Dim keywordRange As Range
Dim r As Range 'For Eachで使う
Dim targetWord As String
Dim i As Integer
Dim j As Integer

Set keywordRange = Range("A1","A100")
targetWord = Range("B1").Text

j=0
For Each r In keywordRange
i = InStr(targetWord, r.Text)
If i > 0 Then '見つかった場合
Range("C1").Offset(0, j) = r.Text
j = j + 1
End If
Next
End Sub
948デフォルトの名無しさん :2007/05/23(水) 20:21:47
なお、これだと、「今日はみかんを食べました。みかんは好きです」
という文章の検索になると、「みかん」が2つ出る。
重複を許さないとなると、見つかった語句を配列に入れて、重複がないか
調べてからセルに表示とかになるかな。
949デフォルトの名無しさん:2007/05/23(水) 20:36:47
単純な問題だけど、美しい方法はどうだろな。

Dim myClc As New Collection
Dim myVar As Variant

For Each myVar In Range("A1","A100")
If InStr(Range("B1"), myVar) Then myClc.Add myVar, myVar
Next

For myVar = 1 To myClc.Count
Range("B1").Offset(0, myVar) = myClc(myVar)
Next

ハードコード&myVar使い回し過ぎで趣味悪いけど短くはなるね。
重複は破棄するだけならCollection使うのがお手軽。
950947:2007/05/23(水) 20:49:30
あ〜、Collection使えばいいのか。参考になったわ。

でもVariantか〜。VB.NETを使ってるとそんな便利(?)なもの消えてるからなぁ。
951デフォルトの名無しさん:2007/05/23(水) 20:51:25
Collectionもいいが重複考えるならMicrosoftScriptingRuntime参照してDictionary使うとスマートじゃね?
952949:2007/05/23(水) 21:10:19
あ、これだと重複したら myClc.Add myVar, myVar でエラーになるか。
On Error Resume Nextする位ならDictionaryにしてExists使った方がスマートだね。

.NETかぁ、VBAはこの先どうなるのだろうね。
953デフォルトの名無しさん:2007/05/23(水) 21:23:56
このままであって欲しい気もするし、.Netとの違いが拡大するのもなんだかなという気もするし。
954デフォルトの名無しさん:2007/05/23(水) 22:20:19
フレームワークをも取り込んでしまうかもしれないよなぁ…・
VB6のVBAも残しつつ.NETのVisualBasic名前空間の一部を取り込んでそう
955945:2007/05/23(水) 23:32:56
皆さん、ありがとうございます!
今やってみたのですが、>>947 >>949、ともに
B1の結果はC1〜に表示されるのですが、
B2以降の行それぞれに実行するにはどうしたらいいのでしょうか?
すみません、よろしくお願いします。
956デフォルトの名無しさん:2007/05/23(水) 23:41:45 BE:17913964-2BP(0)
初めまして。

ユーザフォームの中に、10行程度(何行でもいいのですが)の文章を入力した後、
マウスでクリックし、カーソルをIの形にした場所へ、ボタンを押すことで、所定の文字列を挿入したいのですが、
どのようなマクロで行えますかね・・・

よろしければ教えてください。
957デフォルトの名無しさん:2007/05/24(木) 00:06:51
前回までに入力した文字列に今回入力した文字をくっつけるようにして
(内部的には)1文字ずつの入力にするといいんじゃないでしょうかねえ。
958デフォルトの名無しさん:2007/05/24(木) 00:17:59
>>955
For....Nextとかでまわせ
959デフォルトの名無しさん:2007/05/24(木) 00:23:30
>>957

レスありがとうございます。
説明が悪かったですね。すみません。

すでに完成形のテキストが送られてきて、このうちURL部を、<a>タグで囲いたいのです。

http://***************



<a href="http://***************" target="_blank">http://****************</a>

といった感じですね。

http://というものを検出したら、replaceする案も思いついたのですが、後続の文字列を処理できないので・・・

ネックが、URLが不定長なんで、後ろの部分がどうしても流動的になってしまいまして。。。


固定長なら、

X="検出したURL"

Y= " <a href=""" & X & " target=""_blank"""> & X & "</a>"

といった感じで処理できそうなんですが・・・
960945:2007/05/24(木) 00:49:45
できました。
ありがとうございました。幸せです
961デフォルトの名無しさん:2007/05/24(木) 01:37:59
>>959
urlを選択するようにすれば簡単だろ
962デフォルトの名無しさん:2007/05/24(木) 06:37:58
文字列に " を含ませたい場合どう書けばいいのでしょうか。
MsgBox(" " ")←エラー
963デフォルトの名無しさん:2007/05/24(木) 06:43:56
>>962

もう一つ"を重ねる。
ダブルクウォーテーション内のダブルクウォーテーションの表記は""

つまり、msgbox(" "" ")でおk
964デフォルトの名無しさん:2007/05/24(木) 07:30:36
>>963
thanks
965デフォルトの名無しさん:2007/05/25(金) 11:39:01
Excelのオブジェクトの絶対座標(画面の左上からの座標)をとる方法ってないでしょうか?
Excelの基点と画面の左上の差が取れればTop、Leftでなんとかできそうな気がするんですがよくわかりません…
966デフォルトの名無しさん:2007/05/25(金) 11:40:13
age
967デフォルトの名無しさん:2007/05/25(金) 12:51:52
Excel.Application.Left
Excel.Application.ActiveWindow.Left
Excel.Application.UsableWidth
下や右にツールバーやステータスバー置いてなければ、この3つで出る
968デフォルトの名無しさん:2007/05/25(金) 14:48:25
>>967
回答ありがとうございます。

Excel.Application.Left
がExcel本体の横位置で

Excel.Application.ActiveWindow.Left
がExcel内のファイルのウィンドウ位置で

Excel.Application.UsableWidth
がExcelの作業領域の幅

というのはわかりました。
ためしに最大化状態で見てみたらマイナスの値がかえってきました。
最大化だと0じゃない?
あと高さはメニューバーの分の差分はどうやって取れば良いでしょうか。
969デフォルトの名無しさん:2007/05/25(金) 15:08:38
>>968
最大化だとMDIウインドウ枠が表示されないから、その分がマイナスになる

メニューバー等の分は、それを出すためにUsableWidthを使う
下や右にツールバーやステータスバー置いてなければ、Usableは
右下基準でのサイズになるから、逆算すれば右上位置が出せる

>>967の時点で「下や右にツールバーやステータスバー置いてなければ」と書いたのに
それに対しては反応しなかったので、下や右に何か置いてるという情報後出しは却下ね
970デフォルトの名無しさん:2007/05/25(金) 16:21:44
>>969
ツールバーやステータスバーを消すことで出来るなら消してしまおうと思いましたw

画面の横幅 - Excel.Application.UsableWidthでA1セルの左端のx座標になると考えていいんでしょうか?

971デフォルトの名無しさん:2007/05/25(金) 22:59:46
他シートの参照方法についての質問です。

例えばG列にそのワークブックすべてのシート名一覧を作ったとします。
その一覧を用いて他シートを参照する方法を教えて下さい。

例として
G1にワークシート名"AlphaSheet"があるとします。
そのAlphaSheetの$A$1を参照するとき


「='G1'!$A$1」のようにしてAlphaSheetの$A$1を参照することはできないのでしょうか?
直接「='AlphaSheet'!$A$1」と打つしかないのでしょうか?

どうぞよろしくおねがいします。
972デフォルトの名無しさん:2007/05/25(金) 23:14:39
タイプが面倒なら
逆にしたらどう
シート名がGで一覧にAlphaSheetとか
最終的にシート名変えたら
自動で式のシート名も変わる
シート名変更マクロ作ったら頻繁に変更することもできる
973デフォルトの名無しさん:2007/05/25(金) 23:35:45
>>972
回答ありがとうございます。
それが、シート名が100を超える非常に膨大な量で、
シート名を簡単にしても、とてもじゃないけど手打ちができないのです。
それにひとつのシートから参照すべきデータが非常に多く、困っております。

そのため、シート名一覧を取得するマクロを作成し、
一覧を作るまではできたのですが、
そこから止まっています。
何とかできないものでしょうか?
974デフォルトの名無しさん:2007/05/26(土) 00:31:55
>>973 こういう事かなぁ?違ってたらスマソ。

Sheet333のA1=Sheet1
(Sheet333のセルA1にSheet1というシート名が入ってる)
となってる場合
Sheet2のA1=INDIRECT(Sheet333!A1&"!A1")
と関数を入力すると
Sheet2のA1にはSheet1のA1の内容が表示される。
975デフォルトの名無しさん :2007/05/26(土) 00:40:58
ん?エクセル関数の話?VBAの話?
VBAなら、いったんマクロ記録してみて、どういうシート参照の構文作るか見てみたらいいのに。

>例として
>G1にワークシート名"AlphaSheet"があるとします。
>そのAlphaSheetの$A$1を参照するとき
>「='G1'!$A$1」のようにしてAlphaSheetの$A$1を参照することはできないのでしょうか?

例えば、ワークシート"AlphaSheet"のセルA1を参照するのは WorkSheets("AlphaSheet").Range("A1")
ってなるはず。
だから セルG1に入っているシート名のA1をメッセージボックスで出すには、
Dim str As String
str=Range("G1").Text
MsgBox WorkSheets(str).Range("A1")
でOK。

こういうことじゃなくて?
976971:2007/05/26(土) 04:59:46
>>974-975
ありがとうございます。
私の説明が不十分で混乱させてしまい、申し訳ありません。
サンプルでシートを作成しました。
このシートの右側にある外部シート参照テーブルで示されるシートを参照し、
その結果を左側の表にまとめて表示したいのです。

ttp://www.uploda.org/uporg823949.xls.html

どうぞよろしくおねがいします。
977デフォルトの名無しさん :2007/05/26(土) 09:22:44
>>976
975じゃ参考にならなかったかな?求められてるのがVBAなのか、こういうエクセル関数はないでしょうか、という
のかが分からないな。
でもサンプルシート見ただけでも、いろいろやってるのが分かるけど。
ワークシートの一覧をとるマクロ組めてるんだから、VBAでいいのなら、やれると思うけどな。
978デフォルトの名無しさん:2007/05/26(土) 09:36:00
>>976
関数なら
B5=INDIRECT(H5&"!A1")
B6=INDIRECT(H6&"!A1")

C5=COUNTIF(INDIRECT(H5&"!$C$4:$C$60"),"○")
C6=COUNTIF(INDIRECT(H6&"!$C$4:$C$60"),"○")

VBAなら>975氏を参考に。。。。。
979975:2007/05/26(土) 09:58:20
じゃあVBAバージョンも。
ワークシートの一覧をとれてるってことは数もわかるよな。その変数をsheetCountとするね。

Private Sub Sample()
Dim sheetCount As Integer 'ワークシートの総数。代入は省略
Dim rng As Range
Dim r As Range   'For Eachで使うための変数
Dim x As Range '検索対象のセルを格納
Dim j As Integer
j=1

Set rng=Range("H4",Range("H4").Cells(sheetCount,1))
For Each r In rng
 Range("B4").Cells(j,1)=Worksheets(r.Text).Range("A1") 'シート名取得
 Set x = Worksheets(r.Text).Range("C4","C60")
 Range("C5").Cells(j,1)=Application.WorksheetFunction.CountA(x,"○")
 j=j+1
Next
End Sub
980975:2007/05/26(土) 10:02:30
これならシートの数が下に100個あってもいける。
具体的なことが分からないからなんとも言えないけど、関数でいけるところは
関数で、難しければVBAでというのを使い分けるといいよ。
981デフォルトの名無しさん:2007/05/26(土) 10:11:32
>>979
をいをいw
982デフォルトの名無しさん:2007/05/26(土) 10:24:39
>>979
(・∀・)ニヤニヤ ちょwwwww
983975:2007/05/26(土) 10:33:39
>>981,982
いや、あえてやるならということでやっただけ。
WorksheetFunctionも普通は使わないけど、説明のため。

もっとわかりやすい方法があれば、こっちが教えて欲しい。
984デフォルトの名無しさん:2007/05/26(土) 11:13:51
>>976 VBAは初心者だけど作ってみた。
Option Explicit

Sub Kazoeru()
 Dim i As Long, ws1 As Worksheet
 i = 5
 Set ws1 = Worksheets("Sheet1")
 Do
  With Worksheets(ws1.Cells(i, 8).Value)
   ws1.Cells(i, 3).Value = Application.WorksheetFunction.CountIf(.Range(.Cells(4, 3), .Cells(60, 3)), "○")
  End With
  i = i + 1
 Loop Until ws1.Cells(i, 8).Value = ""
End Sub

旨いヒト添削よろしく♪
985デフォルトの名無しさん:2007/05/26(土) 11:32:15
979よりコードはすっきりしてるが、Do〜Loopを使うか、For〜Nextを使うか
の違いだけであまりすることは変わってない。
986デフォルトの名無しさん:2007/05/26(土) 11:45:43
>>985さん
>984です。レスありがとです。
数える方法はワークシート関数しか判らないのです・・・。
Do〜LoopやFor〜Nextを使わない方法とか、もっと楽に出来る方法が在るんでしょうか?
987デフォルトの名無しさん:2007/05/26(土) 11:57:44
>>986
981と982に聞いてくれ。
988デフォルトの名無しさん:2007/05/26(土) 12:27:10
VBAのスレでワークシート間巣を教えろとな!
989デフォルトの名無しさん:2007/05/26(土) 12:29:07
Sub Mijikaku()
Dim myRng As Range
For Each myRng In Range("H4:H6")
With Worksheets(myRng.Value)
Cells(myRng.Row, 2) = .Range("A1")
Cells(myRng.Row, 3) = WorksheetFunction.CountIf(.Range("C4:C60"), "○")
End With
Next
End Sub

984をすっきりさせるならこんなとこか。
対象範囲の指定方法は好みだけど、別の行にi=5とかはあまり得策とは言えないかな。

そもそもこんな要件になるようじゃ前段を見直したいけどね。
WorksheetFunctionやメソッドは確実な動作が保証出来る使い方なら別に良いと思う。
990デフォルトの名無しさん:2007/05/26(土) 12:30:26
>>987さん >984です。
そうですか・・・。ありがとうございました。

ところで>979さんのVBAをコピペして動かしてみたんですけど、
Range("B4").Cells(j, 1) = Worksheets(r.Text).Range("A1") 'シート名取得
で止まってしまいます。

実行時エラー'9':
インデックスが有効範囲にありません。

と出ます。
黄色くなった行にカーソルを当ててみると
Range("B4").Cells(j, 1) ="シート1"
j=1
r.Text="外部シート参照テーブル"
などとなっています。
これはExcel2000では使えない範囲を使ってるのでしょうか?

そして「Range("B4").Cells(j, 1)」が何処を指し示しているのか理解できないのですけど・・・。
>981さん >982さん ほか判る方、お願いします。
991デフォルトの名無しさん:2007/05/26(土) 12:41:23
>>989さん >984です。連投スイマセン。
コードサンプルありがとうございます。

For Each 〜 Nextの使い方(どう動くのか)が判らないので調べてみます。
そして、対象範囲の指定方法も研究してみます。

ありがとうございました。
992デフォルトの名無しさん:2007/05/26(土) 12:48:14
>>990
普通に動いたけどな…
セルH4にはちゃんと"Sheet1"が入ってるの?
「Range("B4").Cells(j, 1)」は、セルB4から下にさがっていくってことだろ。
 Range("B4").Cells(1,1)は、セル(B4)を、Range("B4").Cells(2,1)はセル(B5)を指す。
>Range("C5").Cells(j,1)=Application.WorksheetFunction.CountA(x,"○")
は、明らかに
Range("C4").Cells(j,1)=Application.WorksheetFunction.CountIf(x,"○")
の間違えだろうけどな。

しかし、そもそもの質問をした本人はどこに行った?
993デフォルトの名無しさん:2007/05/26(土) 13:12:19
>>992さん、解説ありがとうございます。
「Range("B4").Cells(j, 1)」が理解できました。

>セルH4にはちゃんと"Sheet1"が入ってるの?
ですが、Sheet1には
H3 外部シート参照テーブル
H4 Sheet1
H5 Sheet2
H6 Sheet3
と入っています。
>989さんのVBAだと止まらずに結果が書き込まれます。
994デフォルトの名無しさん:2007/05/26(土) 13:14:08
使えねえやつらだと思いつつ
捨てゼリフ残して去るほど厨房でもないので
フェードアウトしたんだろう
995992:2007/05/26(土) 13:28:01
>>993
979の
Dim sheetCount As Integer 'ワークシートの総数。代入は省略
↑を見落としてるんだろ。
だから、試しに動かすのなら、SheetCount=3を入れてあげなきゃ。
そしたら動くよ。
まあ、989がベストアンサーか。
979は、汎用性を考えてH4〜H6に限らず、H7以降にもシート名が入っていることを
前提に作ったということかな。
996デフォルトの名無しさん:2007/05/26(土) 13:36:11
>>995さん
> Dim sheetCount As Integer 'ワークシートの総数。代入は省略
> ↑を見落としてるんだろ。
コメントに気付いてませんでした。。。

SheetCount=3
を追加したらサクッと動きました!!
勉強になりました。ありがとうございます。
997デフォルトの名無しさん:2007/05/26(土) 17:49:42
でもなんでわざわざシート名の一覧を取得したりしてるんだ
単に全部のシ−トを処理したいならSheetsコレクションにFor Eachとか使えばいいのに
動作目的とかがよくわからん
998デフォルトの名無しさん:2007/05/26(土) 19:39:46
Sub 集計()
Dim ws As Worksheet
Const cellwstitle = "A1"
Const rangedata = "C4:C60"

i = 3
For Each ws In Worksheets
If ws.Name <> ActiveSheet.Name Then
Cells(i, 1) = "=" & ws.Name & "!" & cellwstitle
Cells(i, 2) = "=COUNTIF(" & ws.Name & "!" & coldata & rangedata & ",""○"")"
Cells(i, 5) = "=ws.Name"
i = i + 1
End If
Next

End Sub
999デフォルトの名無しさん:2007/05/26(土) 20:19:09
質問した本人は来ないであとの人たちで盛り上がってるな。
だれか次のスレ立ててくだされ。

>>998
>Cells(i, 2) = "=COUNTIF(" & ws.Name & "!" & coldata & rangedata & ",""○"")"
   coldataってなに?

>Cells(i, 5) = "=ws.Name"
   Cells(i, 5) = ws.Name   の間違いでしょ。
1000デフォルトの名無しさん:2007/05/26(土) 20:55:54
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。