ヽ / /⌒\
/ヽヽ|/⌒\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) 同様にこちらでは上に準じてどうすればよいでしょうか?
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
関数全部載ってる本ない? よくあるだろ、「よく使う関数だけしか載ってない」のが。 そうじゃないんだよ、俺がほしいのは辞書のごとき参考書なの!! 勝手に取捨選択するな、使える関数や命令全部見せろっつの!! ショー・ミーダ・関数 だっつうの!!!!!!
っ MSDN
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
シート開いた瞬間に文字入力ボックスを自動で発生させたいときはどうすればいいのですか 普通にやると、どこかのセルをダボークリッキンとかすることがトリガーになるじゃないですか そういうことを何もせずとも出したい。
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
おまえがそんな問題も解けずにそのまま先に進んでしまう方が危ないと思う
18 :
デフォルトの名無しさん :2007/01/11(木) 22:24:07
Excelの命令集 -> ヘルプで完璧 OpenOffice Calcの命令集 は?
>>18 OpenOffice Calcの命令集 -> ソース見れば細かい仕様まで確認できて超完璧
C#出来たらVBいらん気がする VBAもC#のどっちか選択で書ければいいのに・・・・
ヤフーのサイトを使って セルに名入力された名称から株や証券のコードを検索、取得したい データ取得のwebクエリ使うとなぜか関係ないコードを取得してしまう vbaを使ってhtmlをexcelで開いてそこからコードを引っ張ろうと思う shift-jis→url文字列(euc)の変換は上手くいってるのだが Workbooks.Open FileName:=f_name の形式で開くと文字化けしてしまう(urlに渡している文字列が) 楽天はOKだったけどミツウロコはミツウ・然ってなっちまう f_nameの文字列をコピーして ブラウザのアドレスバーに入力すると 正常に検索結果画面が得られる 助けて〜
22 :
21 :2007/01/13(土) 23:35:12
excel VBAでシート上のテキストボックスを全部取得したいのですけど、 worksheets.shapes(i).textboxes で i で ループさせるとどうしてもあるインデックスだけ エラーになってしまいます。 何が考えられますか?
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が数値なら出来るのですが、どなたか助けてください。
cells(1,1) range("A1") range(cells(1,1)) は同じセルを指す
>25 文字列を連結するときには”+”じゃなく”&”を使うって事は理解できてるのかな。
>>25 はい。+1は。
表示させたいのは”ABC"なんです。
>>25 書き込みまちがえました
&を理解してませんでした。
30 :
デフォルトの名無しさん :2007/01/14(日) 17:49:15
&を使ったら表示できた ↓ 安堵する ↓ by 安藤 ↓ と思ったらアンドゥしてしまいました ↓ ヌあんだと
>24 ありがとう。そんなのがあったんですね。 チェックせずに回してた。
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までの偶数が並べられるだけで足されません。
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です。 変なこと言ってるかもしれませんがよろしくお願いします…。
ブックのパスを取得する方法も知らないの?
37 :
35 :2007/01/16(火) 10:35:20
>>36 回答ありがとうございマッスル
VBAのコードを実行させたときにブックのパスを取得する方法はわかるんですが、
プロトタイプ宣言時にブックのパスって取得できるんでしょうか?
うん まぁがんばれ
39 :
35 :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") で行けました。 ありがとうございました。
For i to 〜〜 Next で、1つの行のセルの値をひとつずつ取得して変数に代入したいのですが、 Forで使っている i をセルの位置を指定する数字として使用するにはどうすればいいのでしょうか? (変数)=Range("A"i).Value や (変数)=Cells(i , 2).Value と試してみたのですがダメでした。
> (変数)=Range("A"i).Value は文法的に間違ってるから当然ダメだが、 > (変数)=Cells(i , 2).Value はB列のi行を取得できるはずだが。 ダメならちゃんとブック、シートも指定してみろ。 それらを表略した場合の動作は、コードを書いたモジュールによって異なるからな。
42 :
40 :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
ブックとシートの指定はどこでやればいいのでしょうか?
43 :
40 :2007/01/16(火) 20:07:03
すいません、ただたんに変数宣言でInteger と Double を間違えているだけのようです。 エラーがセル指定のところだったので勘違いしていました・・・
44 :
デフォルトの名無しさん :2007/01/16(火) 22:15:17
VBEをVBAから弄るためにはどうすればいいですか?
45 :
45 :2007/01/17(水) 16:33:10
EXCEL-VBAのマクロでソルバーを起動、計算させるコードを書こうと思っています。 (Microsoft Excel 2000) 「参照設定」で「solver.xls」を読み込んだ後、プロジェクトウィンドウ欄に「solver.xla」 が出てきたのでダブルクリックしたのですが、「パスワードを入力してください」というメッセージが 出てきてコードを表示できません。 もともとここをいじらずにVBAプロジェクト上でソルバー起動のコードを書くのでしょうか? 教えてください。
標準で付いてくるソルバーはワークシート上で使うものであって VBAで使うものじゃないからな。当然コードは非公開。
47 :
45 :2007/01/17(水) 19:05:33
>>45 なるほど
プロジェクト上でフツーにコード書いたらソルバー動かせました。
ありがとうございました。
48 :
デフォルトの名無しさん :2007/01/19(金) 15:50:11
どなたかバブルソートのプログラムを教えて頂けないでしょうか? (例えば5つの数字を小さい順に並べ替えるというもの)
>>48 Web上にサンプルコードが転がってるだろ
50 :
デフォルトの名無しさん :2007/01/19(金) 16:18:56
Visual Basicで出力結果をExcelで表示させるプログラムを教えて下さい。
どっかの宿題スレで見たぞ マルチじゃないのか?
コンボボックスに複数のセル範囲の値をリスト表示させるには どうしたらいいの? ListFillRangeプロパティに指定しても受け付けてくれない。
>>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だけでできることが希望です。他にツールや高度な技術が必要な 場合は、できないということで結構です。
無限ループになったらどうすればいいですか? タスクマネージャで終了させたらコードが全部
無限ループさせなきゃいいだべさ 保存してから実行すればいいだべさ
Escキー押してみるといいだよ
Ctrl+Break
60 :
デフォルトの名無しさん :2007/01/22(月) 16:33:48
ボンボボックスってなんですか。
62 :
デフォルトの名無しさん :2007/01/23(火) 08:53:19
すいません画像の色情報に関して質問なんですが 今はApplication.CommandBars("Picture").Controls.Item(12).Executeを出して 手動で透明にしてから 色情報 = Selection.ShapeRange.PictureFormat.TransparencyColor を出しています。 これを自動で透明にしたいのですがどうやればいいのでしょうか?
>>63 Win32APIのGetPixelで解決しました。ありがとうございました。
初心者すぎる質問ですが; セルの数値を +1 するようなマクロを、マクロボタンに登録して、マクロボタンをクリック する度に、セルの数値を増加させるというようなマクロってどう書けばいいの?
>>65 マクロボタン作って
Private Sub CommandButton1_Click()
Cells(1, 1) = Cells(1, 1) + 1
End Sub
でおk
できました ありがd
ExcelVBAで、TextBoxの中にある文字列をShift+Enterで改行した時、 TextBox内の上の行と下の行との間隔を設定する方法、ご存じの方おられませんか?
>>68 それはTextBoxの領分ではなくRichTextBoxの領分だ
ちゃんと目的にあったコントロールを使おう
>>69 解答ありがとうございます。
早速調べてみたのですが、現在の環境WinXP・Excel2000(VBA6)では
Microsoft Rich Text Box Controlが無いようです(参照設定の中にありませんでした)
何か他の方法ないでしょうか?
お手数お掛けします
>>70 「参照設定」ではなく「その他のコントロール」だぞ
いったい何を調べてるんだか┐(´ー`)┌
そこにも無ければ導入すればいいだけの話
>>71 何度もすみません・・・orz
「その他のコントロール」が押せません
何か間違ってますか?
当然ツールボックスを表示した状態じゃないと押せないけど
なんか次は RichTextBoxでの行間設定はどうやるんですか? とか言い出しそうだな 先に言っておくが、そのくらい調べられない奴はVBA使うな
>>73 フォームをわざと挿入し、ツールボックスを表示したところ
無事その他のコントロールが触れるようになり、RichTextBoxコントロールの追加に成功しました。
本当にありがとうございました!
>>74 行間設定もきっちりできました、ありがとうございました
77 :
デフォルトの名無しさん :2007/01/25(木) 20:44:26
すげー!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 今まで 「エクソーメァクーロ(英語は発音大事)なんか組めてもC++にゃかなわねえんだよ」 と思ってたわけだが、 マクロ組んでやると存外にも仕事場での受けがよい。
78 :
デフォルトの名無しさん :2007/01/25(木) 20:47:40
=(A1,A2) とかするじゃない こげなもんば、大したことなかったい。 が、見てみい。 「ほー!!!!!!!!!!!!!!!!!!!!!!!!!! 便利なもんさ!!!!!!!!!!!!!!!!!」 とか喜んでくれよる。 こらすごか。
数百個のチェックボックスを一列に配置したとき 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 というようにしたいんですが ヘルプやらググルやら見てみたんですが 分かりませんでした
>>79 VBならコントロール配列使うところだが、VBAのコントロールではコントロール配列に出来ないので、
連番名(標準のCheckBox1, CheckBox2, …で良い)にしておいてControlsコレクションを使う
Controls("CheckBox" & i)
イベントも取りたい場合はクラスで疑似コントロール配列を実装する
つーか、何百個ものチェックボックスを配置するインターフェイスを見直した方がいいと思うけどね
予測するに、ListBoxを
ListBox.MultiSelect = fmMultiSelectMulti
ListBox.ListStyle = fmListStyleOption
と、「複数選択可 & チェックボックス有り」で使えば済む話なんじゃないの?
ListBox.Selected(i)でチェック状況取得できるし
テキストを読み込みたいんです。 123 123 123 123 123 123 123 133 みたいなのは Line #で読めたんですけど 123 123 132 123 123↑123 123 132 123 123↑・・・ こういうデータは読み込めません。↑は何なのか、わかりません。 改行されてないデータはどうしたら読み込めるんでしょう? 検索しようにも↑の記号の読み方がわかりません。お手上げです。
>>81 > ↑は何なのか、わかりません。
お前は解るはずだ。というか調べる手段があるはずだ。
それが何なのかはバイナリエディタで見れば一目瞭然だからな
逆にこっちがわかんねーっつうの。
文字としての↑(81 AA)だってならわかるが、Line #で読めないってことは 81 AA では無いわけで
特殊文字の表現記号ならエディタによって表示が異なるので、お手上げです。
↑は本当はもっと横につぶれたような形をしており コピーしてペーストすると消えてしまう謎の文字です。 バイナリエディター・・・? 調べてみます。
84 :
79 :2007/01/27(土) 11:00:26
>>80 さっそくの回答ありがとうございます
ですがcontrols("checkbox"&i)ではエラーになりました(subまたはfunctionが見つかりません)
もしかしてワークシート上に直接配置したcheckboxだとダメですか?
実際には900行×20列の表(900人分顧客データみたいなもの)
から今回対象になる人を範囲でえらび(100番目から200番目等)
さらにその中から対象から外したい人を最左列に配置したチェックボックス
で選択して残った対象者だけで別の表を作成するというようなプログラムを組みたかった
のですが、リストボックスの方法だとちと選びづらいです
>>つーか、何百個ものチェックボックスを配置するインターフェイスを見直した方がいいと思うけどね
おっしゃる通りですね(´・ω・`)
素直に左端に1か0を入力することで判別する方がいいかもです
チェックボックス900個も置いたらめちゃくちゃ重くなったし
>>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) & """"
>>81 何らかの制御コードだろ。そのテキストを作った香具師に聞けば?
#なんとなく、改行コードの問題な希ガス。
VBAの命令の意味と 記述方法が書いてある辞典的なページってありませんか?
do Until xxxx <> vbnullstring のときの <>っていうのはどういういみですか =とは違うの?
92 :
デフォルトの名無しさん :2007/01/28(日) 09:27:17
excelのVBEを開こうとすると、VBEを開けるどころかexcelそのものが閉じてしまいます。 ウィルススキャンをしたところウィルスに感染はしていませんでした。 OS:Windows2000でexcelはexcel2000です。ちなみにwordのVBEは普通に開けます。 どうすれば正常にVBEが開けるようになれば良いのか、よろしくお願いします。
do Until xxxx <> vbnullstring do While xxxx = vbnullstring 同じ意味と考えてもいいですか?
>>92 とりあえずブックを全て閉じた状態で試していないならブックを全て閉じてからVBEを立ち上げろ
同じく、アドインも全て外した状態で試してないなら一度全て外せ
それでダメならExcel(Office)の再インストール
上書きインストールではなく一度アンインストールしてから再インストールね
それでもダメならOS再インストール
まさかこの板に来る奴が再インストール出来ないとか面倒とかは言わないだろ
>>93 結果は同じだけど意味は違う
95 :
92 :2007/01/28(日) 10:01:56
>>94 ご返信ありがとうございます!
一応Officeの再インストールは既に行いましたが、駄目でした。
ちなみにVBEのみの起動はどうすればよいのでしょうか?
やっぱりOSの再インストールしかないんでしょうかねぇ。。。
EXCEL2000で イベントプロージャー「テキストボックス名_Change」を作成したいのですが 図形作成→テキストボックスで テキストボックスを作成したのですが 右クリックしてもコードの表示は出ません。(本には書いてあるのですが) 2000だと他の方法にしないといけないのですか 結果として Private Sub TextBox1_Change() をかくようにしたいのですが
>>97 今2000で試したけど、ちゃんと出たよ。
コントロールツールの方だと「プロパティ・コードの表示」がある フォームコントロールの方だと「マクロの登録・コントロールの書式設定」がある イベントが使えるのはコントロールツールの方 右クリックして「マクロの登録・コントロールの書式設定」が出るなら、間違った物使ってるだけ 「プロパティ・コードの表示」も「マクロの登録・コントロールの書式設定」も出ないならPCを窓から投(ry
できましたあああ。ありがとうございます! ですが最終的にこっちの方法を採用させていただきました。 >表示形式を [=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 大変有益なご教示大感謝です
101 :
79 :2007/01/28(日) 15:06:46
ミスッタ_| ̄|〇
上の100は
>>85 さんへのレスです
103 :
102 :2007/01/28(日) 15:11:19
ありがとうございました 。
105 :
83 :2007/01/28(日) 19:38:04
矢印の正体はLFってやつでした。chr(10)とやらなんやら なるほど・・・CR+LFじゃないとダメ・・・ まだ読み込めないけど、手がかりはつかめたんで頑張ってみます。
106 :
デフォルトの名無しさん :2007/01/28(日) 21:47:19
2007ってデフォルトフォーマットではマクロは保存できないんだな、店頭デモ機で試してみたんだが VBAは後方互換で残ってるだけなの?
>>106 オプションで開発タブをリボンに表示するにチェックを入れると使えるよ
べき算って 2の2乗=4 3の3乗=27ってことですか?
冪乗とはいうけど冪算とは余り言わない希ガス。
110 :
デフォルトの名無しさん :2007/01/29(月) 21:56:03
今ExcelのマクロはほとんどVBAになっちゃってるけど、ブックにシートを追加するときに Excel4.0のマクロシートが残ってることがわかる。やってみたいけど、誰かマスターする 方法おしえてくれないかな?解説書は売り切れてるしネットでも見当たらない。せっかく 残ってる機能だから眠らせておくのは惜しい。
2列のセルの文字列を一つにすることは可能? セルA セルB 桃 太郎 =桃太郎
112 :
デフォルトの名無しさん :2007/01/29(月) 22:54:34
>>111 可能だ。=CONCATENATE("桃","太郎")とすればいい。
セルA=桃、セルB=太郎なら、=CONCATENATE(セルA,セルB)でもいい。
セルが3つ以上でもやり方は同じだ。
>>112 それのどこがVBA?
このスレ的にはVBAで応えるべきなんじゃないのか?
Word/VBAの教えてスレはどこ?
ありがとうございます
すみません、ちょっと教えて下さい マクロで、指定したセルにチェックボックスを作ったり、削除したりするには どう書けば良いのでしょう? VBA駆け出しで、全く分かりませんorz
>>116 マクロの記録を録ってみろ
その記録されたコードを見てわからなければお前にはまだ早い
精進して出直せってことで
>>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で消える。
中途半端だがかんべん。
はじめまして、早速一つお聞きしたいことがあります。 Function関数において最終的に表示される文字列を、 「その関数を使ったセルとは別のセル」に表示させたいのですが どのような式を打ち込めばよいでしょう?
>>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 よくわからんのだけども、
任意のセル(入力するセル)の指定方法:
@クリック→任意の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ユーザーフォーム→
ぐぐってちょ。
こんなもんで。
いただいたヒントのおかげで何とかなりそうです。 稚拙な説明にもかかわらず丁寧に答えてくださり本当にありがとうございます。
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 (つづく)
(続き)
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
セルAに入力した Taka Toshi という文字列を taka_toshi というように 小文字化と半角空白にアンダーバーを挿入して変換するようにしたいのですが どうすればいいですか?
Replaceで半角スペースを_に置換して LCaseで小文字化すればいいだけじゃん このくらいならワークシート関数でも出来るし
>>125 理由はわからなそうだけども、
なんていうエラーがでてるのかはとても知りたいのでお願いします。
でも、もしかしたらもしかしたら、
Navigateで読み込み→
読み込みはじめるより先に Do Untilの条件へ行ってしまい
Sleepしない→
読み込まれる前にクリック
かも。
ループの前にSleepを入れてみてはいかかでしょう?
適当で申し訳ない。
さらにごめん。 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つにすると動きます。 どこがおかしいのでしょうか?
>>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の行を白紙の行に したいのですが、この説明で分かってくれるかたいますか? ご指導ください。
> 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
>>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列にでる。
ごめん。 Do While rng.Row <= 10 を Do While rng.Row <= 65500 あたりに変えといて。 ちなみに検索する行の最大数。 あと、なにも出力されないようなら、 if rng Value = "0:00" Then の 0:00 の部分をセルに表示されてる値ではなくて、 その右上らへんにある本当の値に変えてみて。
っていうか、 VBAの勉強中だからついVBAで答えてしまったけれども・・・。 セルB1をクリック(選択) データ→フィルタ→オートフィルタ B1に三角がでるのでクリック 0:00を選択 orz...
141 :
デフォルトの名無しさん :2007/02/02(金) 00:37:36
>>140 ありがとうございます。
オートフィルにすると、行が詰まってしまうので、
行間は白紙のまま置いておきたいのですよ。
>0:00 の部分をセルに表示されてる値ではなくて、
その右上らへんにある本当の値に変えてみて。
VBAでは出力されないのですが、もう少し教えてもらえますか。
ここで無限ループ使った回答したら、素人にはブラクラ並の攻撃かもしれない と、ふと思った
こっちのほうが安全じゃない? my_Row= Range("a65536").End(xlUp).Row for i = 1 to my_row 処理 next i
そのままなら、こっちか。 my_Row= Range("a65536").End(xlUp).Row Do While rng.Row <= my_row
>>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行ごとに値があること前提だけども…。
手抜きでスマソ、そろそろ寝ようかと…。
>141
追記。
一瞬止まるけども、処理が遅いだけなので。
(
>>143 )方式で、
Do While row < 65500
を
Dim myRow as Long
myRow = Range("a65536").End(xlUp).Row
Do While row < myRow
にすると早くなりまする。
>>143 >>145 まったくその通りですな。
まだまだ良いやり方のテンプレみたいなのがぱっと浮かんでこないのよなぁ…。
>142
自分のテストでは無限ループしたいほうだいだけどね。
すみません放置します。
おやすみなさい。
どうもでした。ペコリ。
成功しました。重ねてペコリ。 これで寝れそうです。
>>129-130 レスどうもです。
出ているエラーの件は、たまにしかエラーが出ないので
エラーの内容を良く覚えてないのですが
「サポートされてない」みたいなエラーだったと思います。
do until構文を使う前にもsleepしてみて
エラーが出るかどうか、しばらく様子を見てみます。
150 :
デフォルトの名無しさん :2007/02/03(土) 01:28:07
ちょっと暇だったのでVisualBasicのヘルプ全部印刷してみた(両面) ヘルプ最高だな 高い金出してリファレンス買うぐらいならヘルプ印刷しといたほうが幸せだと気付いた つうか手元のリファレンス見たらヘルプ丸写しがあって萎えた
そうか〜? 現実問題、リファレンスで一番重要なのは索引なのだけども オブジェクト名やメソッド名とかは印刷したものをアルファベット順に並べればいいとしても・・・ その他は・・・
152 :
デフォルトの名無しさん :2007/02/03(土) 23:11:21
すみません。Vista/Excel2007で Application.Speech.Speak "日本語" をやると、英語なら何の設定もせずに読み上げるんですが、 日本語は読み上げません。 2003では設定すれば「ツール」→「音声」→「[読み上げ]ツールバー」ででたツールバーも 表示させる方法もわからないのですが、 どなたか、お教えいだけないでしょうか。
新しいものにすぐ飛びつく早漏の癖に 情報的な基盤の無いものを自力で使いこなしていく スキルも無い奴ってのは一番厄介だな 初心者ならシェアが広がるまで我慢汁垂らしながら待ってろよ
>>150 両面印刷コストが20円として、100ページで2000円になる。
1000ページなら2万だし買った方が安くないか?
155 :
デフォルトの名無しさん :2007/02/04(日) 01:22:42
コンピュータを用いた授業をしようと思うんですが、 VBAを用いて中学校数学の何か面白い教材を作ることできないかな??
>>155 あるセルに好きな数字を入れると別なセルに数字が自動的に表示されて
その計算方法を推理させるとか。
もちろん数字を変えていくことで推理可能な計算式を考えんといかんよ。
数字じゃなくて論理式でも面白い、ある言葉を入れると別な言葉に置き換えられるとか。
あなたのVBA習熟度がどのくらいか知らないけど。
>>155 「面白い教材」を考えるのは教員の仕事。
お前が思いつけないなら、お前はその程度の教師ってことだ。
考えついた「面白い教材」の実現方法なら手助けしないこともないが
何が悲しくて教員でもないのにガキの嗜好に頭捻らにゃならんのだ?
158 :
156 :2007/02/04(日) 01:34:02
いや、そういう返答は無視でw
160 :
156 :2007/02/04(日) 01:55:35
いや、
>>157 は言い方はあれだけど正論
写真屋スレで「キャラ絵描くんだけどどんなキャラがいい?」って聞く奴はおかしいのと同じ
言ってしまえば > 「面白い教材」の実現方法 だって教師の仕事なのに、それなら手助けしてやるって 言ってる時点で十二分に親切だな。
Excel2007ってVBAの基本的言語仕様は変わってないんでしょうか? 例えばVB6.0のIntegerが16Bitなのが VS2005のVBだとIntegerが32Bitになってるみたいな
163 :
155 :2007/02/04(日) 02:45:37
私は数学教師ですが、VBAは全くといっていいほどの初心者です。 データから平均を出したり、総合得点を出して表示させるぐらいしか できません。 実現方法よりもどういったことができるかがよくわかっていないのです。 VBAにかなり詳しい方々が集まっているようなので、ご意見を参考に させていただきたかったのですが、予習をしてから出直してきます。 すいませんでした。
>>163 藻前は本当に教師なのか?
数学の分からない厨房は数学をイメージできない
数値なんて表示させても糞の意味もない
パソコンで学習させるなら、イメージを表示させてやる方がいい
つまり、関数グラフとか図形を使いこなして表示させろってこった
>>163 エクセルVBAで色々できるよ。外部アプリケーション、例えばインターネットエクスプローラーの制御も出来るよ。
工夫すれば、それなりにエクセルVBAでゲームを作ることもできて
エクセルVBAで作られたゲームのサンプルプログラム集とかも発売されてるよ。
つうかさ、パソコン関係って何が出来るかって聞いていたら全然先に進めんぞ 自分は何がしたいって目的が最初であって、それを実現するにはVBAを選択するとか 他のモノを選択するとかすべき
168 :
デフォルトの名無しさん :2007/02/04(日) 11:04:19
パソコンクラブでも作ってマニアな中学生に教えてもらえ 学習曲線は残念だけど物好きな中学生には勝てん 先生側は「教育の技術」で中学生と勝負しろよ ExcelVBAは開発環境と実行環境の距離が近くていい材料だと思うけどね
>>163 子供が見て分かりやすいのは物理シミュレーション
やはり目で見て動くと分かりやすい。
普通に教科書レベルの加速度とか落下だけでも結構面白い物が作れる
ExcelでもShapeやUserFromの座標を指定できるわけで
日本のApple本社に学校の旅行で行った時に、
なんてソフトか忘れたけどBasic風の記述言語で
「初期値を設定してボール(カエルだったかも)をジャンプさせて、落ちてきたて跳ねる」
ってプログラムが課題だった
ついでに速度や高さも表示する
設定値を間違えると果てまで飛んで行ったりして面白かったが。
数学なら幾何系とか確率系とかも分かりやすいかも
計算問題を自動で作って答えあわせをするコードとか 100マス計算とかできるんじゃない? でもそういうなのはネットを探せばいくらでも出てくるような気がする。
>>170 数学を図式化して理解しやすくするのは良いが
それは駄目だろ、餓鬼に頃は紙に文字を書いて計算しないと馬鹿になるぞ
173 :
デフォルトの名無しさん :2007/02/04(日) 14:19:00
あるExcelファイルを日付が変わったら自動起動させるようにするには、 どんな感じで実現したらよいのでしょうか・・? 日の定型処理をしているのですが、 忘れてしまう事が多々あるので自動化したいです。
>>173 そんな曖昧な条件でどうしろと?
「あるExcelファイルを日付が変わったら自動起動」という条件だけなら
OnTimeで0:00にブックを開くプロシージャを呼ぶだけだが、実際にはOnTimeが使える
状況では無いだろうし、ブックを開くのも「日付が変わったら=0:00」では困るのでは?
条件はエスパー以外の第三者にも伝わるように、日本語できちんと書こう。
多分タスクでOK。つまり、VBA云々ではなくWindowsの使い方の問題。
176 :
デフォルトの名無しさん :2007/02/04(日) 16:00:52
excel4.0専用のスレが見当たらないのでここで失礼します。 excel4.0のマクロって最近のexcelでも当時と同じように記述できるの? なくなったマクロ関数や文法の変更なんかはないのかな? たとえば『=select(シート名!R[1]C[1])』と記述して実行すると、 目的のシートのアクティブセルではなくマクロシートのselect関数が 記述してあるセルから1行下で1列右のセルを選択してしまう。 これはexcel側の仕様変更によるものじゃないよね? もし記述の間違いによるものだったら正しい書き方を教えて。
177 :
173 :2007/02/04(日) 19:26:01
>>174 すいません。今週末から勉強を始めたので理解が足りないかもしれません。
Webクエリを用いてあるHPの表データを取得し統計処理をしています。
統計処理はそのExcelファイルを起動すれば実行できるよう実装済。
そのHPの表データは00:10頃に日々更新されているので毎日実行したいです。
そこでこの時間がきたら自動的にExcelファイルを起動する方法は、
どうやるのかなと質問してみました。
よくウイルス等で特定の時間が来たら挙動するようなものもあるし、
出来ない事はないなだろうと。
実行条件は時間以外にも色々ありますがFlagや分岐をつけたりすれば、
何とかできるだろうという事で今回は質問しませんでした。
Googleで「VBA 自動起動」等と検索しても条件が悪いらしく、
上手く引っかからないのでキーワードだけでももらえればと思いました。
これ以上は上手く説明できません。ごめんなさい。
>>175 あっありがとうございます。
VBAではなくそんな方法だったんですね。
書き込み後の検索中にAccessで似たような質問にヒットした時、
APIでスケジュラーに・・なんて記述があったので、
関係あるのかと思っちゃいました。
>>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桁だかなんだかにすればよいです。
浮動小数点演算をIF文なんかで条件処理する場合 =つかっちゃ駄目なんだよなぁ
基本的に割り算もだめですね
整数値の割り算の場合は/でなく ¥(商) Mod(余り)を使えばなんとかなる
いま正規表現の検索フォームを作ってます 検索対象をusedrangeで取得してfor eachでまわしてます。 これで動作は問題ないのですが、対象が多いと時間がかかってしまいます。 そこで、rng=usedrangeと配列に代入して高速化しようとして問題にぶちあたりました。 配列に代入されるのがValueっぽいので、 セルに10:00の様に時間や日付が入っている場合 longになるので検索文字が10などと一致しません。 usedrang.textとして代入すると空になってしまいます。 配列に代入された文字の表示形式を調べて変換することも考えたのですが、 現状と大差ない感じがします。 シート上に表示されている値をまとめて配列に代入する方法か代替案がありましたら ご教授おねがいします。
クエリー
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
あータブとか消されてしまうのか。見づらいな。
190 :
186 :2007/02/05(月) 15:09:56
>>187 固定で102byteです。
得意先がいい加減で、仕様も手探り状態なもので(泣
>>188 ありがとうございます。
このコードを参考にして、試行錯誤してみます。
>>190 得意先に仕様書無いと作れないと言えばいいじゃん。
192 :
186 :2007/02/05(月) 18:04:31
>>191 言ったよ゚・(つД`)・゚・
普段もらっている受注データとは別のもので。。。
特殊なパターンで、これしか渡せないと言われた。
txtデータと口頭で言われた項目(どこまでが**で**byteで、とか)だけ。
結局、自分たちで解析するしかなくて。。。
ホストのマスターに落とす必要ないのでVBSかAccessの類で出来ないか
考えてたんです。
ちなみに得意先はホ●ダ技研鈴鹿工場です
バイクも車もホ●ダだが、こういう体質は好かん!
大丈夫、他も似たようなもんだ。
194 :
デフォルトの名無しさん :2007/02/05(月) 20:11:48
>>194 つか<、>で範囲チェックすりゃいいじゃん
>>195 それはやっちゃダメ
結果的に同じでもコード的に意味が違ってしまう
つまり可読性を損なう
>>196 どうしても出来ないときは
いいじゃんコメント書いとけばいいんだから
全部そんなプログラム組んじゃいけないけど
後は10とか100でかけて整数値にするかだな
199 :
184 :2007/02/05(月) 21:59:21
Dim tm As Date Dim buf As String tm = Cells(0, 0) buf = Format(tm, hh:mm") これで普通の文字列になるがな
buf = Format(tm," hh:mm")
更にtmだけでも応用すりゃ検索もできる
>>200-202 おまえ、バカだろ。文字列にする方法なんてこの際問題じゃない。そんなの簡単に解る。
君のやり方で文字列化するなら、その前にその値が元々どういう表示形式で表示されていたか判断しなきゃならないんだよ。
そして
>>184 に
> 配列に代入された文字の表示形式を調べて変換することも考えたのですが、
とあるから、君の考えた方法は既に変わりきってる上で、表示形式をいちいち調べて文字列に変換してたら
ValueではなくTextプロパティをループで読むのと大差ないってこった。
>>203 いや
>>10 :00といれておくと0.5
と言う単なるヒントだ、そのまま使ったら馬鹿だが
205 :
デフォルトの名無しさん :2007/02/06(火) 00:15:27
10:00といれておくと0.5になるなら 逆に検索値を時間の場合10:00なら0.5にすりゃいんじゃねぇ?
それだと時間じゃない0.5もヒットするわけで
207 :
デフォルトの名無しさん :2007/02/06(火) 01:07:40
データベース使っても結局Value値がセットされると・・・ 0.5でヒットしたらセル見にいって属性しらべたら? 少しはマシかも、0.5とかいっぱいあったら終わりだけど
Findじゃ遅いの?
findじゃだめなんだよ
あとはクエリ使って、ここで答えでないんなら データベース関係のスレで聞いてみたら?
211 :
184 :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はできないようです。 列ごとに時間や日付が入っているなら、そこだけ変換すりゃいーだろ、と言われそうですが 列がずれた場合や新たに項目が増えた場合を考えて、決め打ちで変換するのは出来れば避けたいと考えています。 説明下手ですいませんが、高速に処理する方法がありましたらご教授お願いします。
件数多いなぁ、確実にデータベース使った方が良いと思うよ 漏れはやり方わからんが
>>列がずれた場合や新たに項目が増えた場合を考えて 列のセルに名前付けりゃいいんじゃないの?
> 列がずれた場合や新たに項目が増えた場合を考えて、 2行目(実データの1行目)の表示形式に合わせるって手もある 30万回表示形式取得したら相当遅くなるだろうが、列数分(現状7回)だけなら殆ど気にならないだろ
215 :
たのんます :2007/02/06(火) 02:00:54
エクセルに関する質問なんですが 統計数字データをグラフに変換して、統計データによるグラフを作成する際に 統計データの始点と終点を同じにして、重ねて比べられるようなグラフにしたいのですが 統計データの量が、比較したいAとBでは異なるため、 始点終点を同じにして、重ねて比べることができません。 何か関数とかその他の方法で、 違うデータ量のものを重ねて比較する方法はないでしょうか?
216 :
184 :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 それは考えつきませんでした。試して見たいと思います。
色々ありがとうございました。自分でも試行錯誤してみようと思います。
>>216 Date型 は日付と時間一緒ですよ(小数点以下が時間)
>名前を定義
範囲で名前付けるんじゃなく、1行目の1セルに名前付けて
呼び出せば行位置と列位置が分かる 列位置分かればなんの行か分かるでしょ
>>217 >名前を定義
と書いていて複数シートじゃ駄目だね・・・
220 :
たのんます :2007/02/06(火) 02:49:33
すいません マルチの意味がわかりました、、、 してはいけないことと知りませんでした。 ただものすごく困っています。 色々調べても方法がなくて、、、 ご存知でしたら、何卒お教えいただけませんでしょうか? 以後こんな事をしてしまわないように気をつけます。
今回のが教訓だ。ここで教えちゃったら教訓にならない。 「マルチしても謝れば教えてもらえる」程度に思っちゃうだろう。 今回マルチをしてしまった責は、今回答えてもらえないということで負い 以後気を付けることで、以後の質問では突き放されることはなくなる。 まぁマルチをしても、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上で起動しているアプリを終了させるには どうしたらいいんでしょうか?
>>222 Win32API使うかWMI使うかだな
つーか全然VBAの質問じゃないし
224 :
222 :2007/02/06(火) 14:34:30
え、これVBAの質問じゃないんですか? すいません。 これはAPIのスレに行けばいいんですかね?
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スレでは言語限定での丸投げ(コード書いてクレクレ)なんて聞いちゃくれないし。
ADOを使用してエクセルのシートをデータベースにセットする場合 各セル毎のデータ形式でなく、全て文字列形式にしてセットする方法があるんでしょうか? (セルを全て文字列形式にするという方法は除いて) もしあるのなら、教えてください。
227 :
デフォルトの名無しさん :2007/02/07(水) 14:47:01
>>221 何をエラそうに講釈たれてんだよ、バーカ。何も教えないくせに態度ばっかしデカいんだよ。
( ゚д゚)ポカーン
マルチがなぜダメなのかを知っていればあんなに高飛車に 偉そうなことは言わないというのは間違いのない話であるよな。
if Do While ********* Loop end if こんな感じのプログラムのDoLoopを1秒たったら繰り返すような感じに出来ますか?
>>231 Application.WaitなりWin32APIのSleepなりお好きなように
234 :
デフォルトの名無しさん :2007/02/08(木) 20:05:16
const aretsul = 1 DATA = "データファイル" Cells(row, aretsul).Text Cellsに「222123,」見たいな感じにデータが入ってるんですが、最後のコンマを消したいんです 最後の一文字を読み込まないようにするにはどうすればいいでしょうか?
> 最後の一文字を読み込まないようにする Value値にも因るが、基本的に不可能。 読み込んだ後で、末尾の1文字を消すなら文字列操作関数でどうにでもなるけどね。
>>234 left(cells(セルA,セルB), len(cells(セルA,セルB)) - 1)
こんなんどう?(未テスト。やりたいことは伝わるかと)
っていうか上の2行は?
238 :
デフォルトの名無しさん :2007/02/08(木) 21:58:30
ごめん、ビジネスsoft板のExcel総合スレで聞いたんだけど、こっちの方がよさげなので、
すみませんがマルチさせていただきます。
以下、コピペですが、エラーを防ぐ原因と方法を知ってる方いたら教えてください。
すみません、VBAのことで質問です。
リンク先のプログラムで、コマンドボタンを押した後に表示されるフォーム(モーダレス)の
コマンドボタンを押して処理を実行中にシートをダブルクリックしたりすとエラーで落ちちゃう
んですが、これを防ぐにはフォームをモーダルでshowするしかないですかね?
http://555.sytes.net/up/img/375.zip
>>238 原因不明なのですが、試してみてくれませんでしょうか?
ループの前に
Application.ScreenUpdating = false
ループの後に
Application.ScreenUpdating = true
スペルミスあったらごめんなさい。
240 :
238 :2007/02/08(木) 22:46:43
>>239 ありがとうございますm(_ _)m
教えていただいた通りにしたらエラーがでなくなりました。
Application.ScreenUpdating = false で画面の更新を一時的に止めてやるんですね。
Formをmodalで表示しなくてもこの方法ならいけそうです!
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 どのプロパティ実現できるか分からないときは、マクロの記録を活用すると良いですよ。
247 :
243 :2007/02/12(月) 17:24:50
>>244 なめらかに文字を流したいのですが・・・
>>247 ラベルの位置を微調整するとか、自前で文字描画するとか、まぁ頑張って。
249 :
243 :2007/02/12(月) 17:31:17
>>248 簡単にできる方法ってないんですね・・・
何とかがんばってみます!
いや、簡単だろ
251 :
デフォルトの名無しさん :2007/02/12(月) 18:12:42
質問です。 Office2007 Excelでマクロの記録機能で、テキストボックスを表示して、テキストボックス内に文字を表示するといったマクロを記録しましたが、テキストボックスに関するマクロが一切記録されません。 何か個別に設定が必要なのでしょうか?
そのテキストボックス自分で実装したなら無理じゃね?
253 :
デフォルトの名無しさん :2007/02/13(火) 19:25:13
質問があります。 たとえばA1:D50までの表がありその中に3桁の数値が入っているのですが、 そのなかに指定した1桁の数値(H1に入力した数値)が(3桁のいずれかに)含まれるセルに色をつけたいのです。 また、関係ないかもしれないですが、表には空欄がある場合があります。 どうしたらいいでしょか。 お力をお貸しください。
>>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 上記コードで実行すると、マクロ記録中の場合 オートメーションエラーが発生してしまいます。 既にマクロが走っているからでしょうか?
すみませぬが質問です。フォームにラベルを作り、そのラベルにランダムの行数のセルを表示させ、 ちょっと時間をおいてその隣のセルを表示させる、というプログラムを作りましたが 上手いこといきません。アドバイス下さいませ。 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
>>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 などという例は見たのですが、特定のセルじゃなく、アクティブなセルとして指定する場合を教えてください。
range("A1")の変わりにActiveCellって書けばいいだけじゃん。 何でそんなことも調べられないの? 「アクティブなセル」でヘルプ検索したらすぐ出てくるのに。
カーソル移動したセルの色変えたいなら イベントと組み合わせて使えばよい
261 :
258 :2007/02/15(木) 00:59:28
>>259 それも試しにやってみたのですが、色が変わらないので間違っているのかと。
ちなみにユーザー定義関数内でやろうとしていて以下のようにしてもoutputはでますが、
色が出ないんです。指定がおかしいのでしょうか?
Function color(work)
ActiveCell.Interior.ColorIndex = 36
color = "color" & work
End Function
>>261 普通にできてしまったのですが…。
Function test()
ActiveCell.Interior.ColorIndex = 36
End Function
同じですよね、多分?
>>262 たびたびすみません。同じだと思うのですが・・・。
やろうとしていることは、
・ユーザー定義関数を作ろうとしていて(ここでいうcolorという関数)
・計算結果がある値をとればセルの色を変える
というもので、上述のcolorという関数はそれをおもいっきり簡略化したものです。
やっぱり上手くいかないです・・・
もしかして根本的にわたしが勘違いしているのかもしれません。ユーザー定義関数とマクロは別物ということでしょうか?
263補足
>>262 さんのを登録後、エクセル上で=test()と任意のセルに入力しても
ゼロと表示されるだけで色は変わりませんでした・・・
引数のworkには何が入る予定なの?
あー、分かった。 セルでセル関数のようにはマクロのユーザー関数は使えないよ。 ツールメニュー→マクロ→color(自分で作ったユーザ関数)を選らんで、 その時点で使うわけ。
「セルの計算結果」って言ってるのは、 =SUM(R[-3]C:R[-1]C) ←こういう奴の話を言ってるんだよね? で、このイコールのところに自分で作った関数を入れたいってことよね? 結論から言えば、できないんじゃないかなあ。
269 :
268 :2007/02/15(木) 01:37:15
ごめん! ウソ言ってた。 できたよ。
>>261 > ユーザー定義関数内でやろうとしていて
先に書けよ。
ユーザー定義関数ってのは引数を計算して、式を入れたセルに値を返す物で
書式設定だのなんだのというシート上の操作を行うものじゃないぞ。
だからアクティブセルを取得することは出来るが操作は出来ない。それがユーザー定義関数ってものだ。
指定がおかしいんじゃなくて、やろうとしている事に対してユーザー定義関数を使おうとしているのがおかしい。
取得が出来てることはDebug.Print ActiveCell.Address(0, 0)を入れればわかるだろう。
操作がしたいならイベントを使え。
>>268 そういうやつですね。
文字列の長さからいろいろと計算させる予定でした。
結果的にダメっぽいですね。
いろいろとありがとうございました。
>>270 イベントでやるしかないのですね。
>それがユーザー定義関数ってものだ。
名言の匂いがしますね。使わせて頂きます。
>>271 参考になりました。
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 このプログラムを短くできませんか?
配列使うと1/3近くには出来るかも知れないが 速度は落ちるんじゃないかな
>>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
試してないけど、とかじゃダメなのか?
277 :
256 :2007/02/15(木) 10:51:13
>>257 お答えありがとうございます。説明不足ですみませんでした。
御推察のとおり、1つ目のセルは表示されずに2つ目が表示されてしまっていました。
で、
>>257 様の誤解を参考にして色々試したのですが、どうにもうまくいきません。
もう少しだけヒント頂けないでしょうか?
278 :
sage :2007/02/15(木) 13:13:37
>>277 何を試してどうだめだったのか書かないと…
とりあえず自分の環境では普通に動く
フォームを表示したときに表示したければ
UserForm_Activaue()内で
Callしてみれば?
とりあえず、F8でステップインしながら
動きを確認してみることをお勧めするよ
後はDebug.Printするとか。
ローカルウィンドウで
変数に期待通りの値が
はいってるか確認する方法もあるし。
なんにしても情報が少なすぎだと思いますよ
うはぁ あげちった… 携帯からレスするもんじゃないな…
他人事ながら ×UserForm_Activaue() ○UserForm_Activate() 横レス失礼
281 :
256 :2007/02/15(木) 16:06:37
>>278 ,
>>280 またまた説明足らずで申し訳ありませんでした。
で、ご指摘の方法でちゃんと出来ました!
自分の持ってるVBAの本が初心者用のものだったため、
UserForm_Active()とか全然載ってなくて方法が分かりませんでした。
今回はどうもありがとうございました!
VBに高階関数とかってないの?関数に関数を引数として渡したいだけなんだけど。
ダイアログボックスで入力された年・月にしたがってカレンダーを表示するマクロを作っています。 年・月は文字列として取得、それを日付型にデータ変換して日付型の変数に代入しているのですが、 そこで「実行時エラー'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のソースで右側に長くなって見づら苦なってきたのでソースの内容はそのままで改行することってできませんか? 普通に改行するとエラーが出てしまいます。
MsgBox _ "VBAのソースで右側に長くなって" & vbCrLf & _ "見づら苦なってきたので" & vbCrLf & _ "ソースの内容はそのままで" & vbCrLf & _ "改行することってできませんか?" & vbCrLf & _ vbCrLf & _ "普通に改行するとエラーが出てしまいます。"
>>285 テストコードが問題なく実行できてしまったのですが…。
カレンダーに変換してるところのエラーでは?
たぶんロケール絡みだろう。 同じバージョンのWindows&Excelだって、ロケールが違うとCDateやIsDateの動作が変わってくるからな。 とりあえずInputBoxとCDateの間に If strInput = "" Then MsgBox "空文字 or キャンセル": Exit Sub If Not IsDate(strInput) Then MsgBox "日付変換不可": Exit Sub って入れてみな。「2007 2」で"日付変換不可"が出るようなら、ロケールの問題でビンゴだ。 その場合は文字列切り出しで年と月を取得しよう。 "日付変換不可"が出ないにしても、文字列切り出しで解決出来るならそれでいいし。
291 :
286 :2007/02/16(金) 00:53:59
_←これだけで改行できた思い出させてくれてありがとう
ListBoxに値をいれるとClickやChangeが発生しますが、 クリック中に値を変更したい場合とかどうしてますか? フラグもって立ってたら処理しないというやり方で回避してるんだけど なにかほかにいい方法がありますでしょうかね。
293 :
285 :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 さんのおっしゃっている「文字列切り出し」という方法は、文字列から年と月をそれぞれ別々に取得する
ということですね?
がんばってコードを書いて試してみます。
どうもありがとうございました。
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
ちょwwVB以前の問題だろw a*10+bも思いつかんのか
297 :
デフォルトの名無しさん :2007/02/16(金) 22:23:14
初歩的な質問でホントにすいません; エクセルのシート上にファイル等から画像を挿入したとします。 ↓ その画像を文字列の背面に持っていく方法がわかりません; 背景に設定する等とは違います; (ちなみに背景も小さい画像で設定すると ビッチリ並んで出てきますが、好きな場所に1個だけ、 とかは出来るんでしょうか?) よろしくお願いします;
298 :
デフォルトの名無しさん :2007/02/16(金) 22:25:14
すいません;スレ違いでした;
100行まで三行間隔で文字列が入っていて間違って打ってないか確認したいです。 B列、100行までの間の3の倍数のセルに"もげ"って入っていたら次の3の倍数のセルへ 間違っているか、空欄だったらセルを選択した状態で終えてください。 という処理をしたいのですが 相対セルと三の倍数選択する部分の表現でつまづいてしまいました。 一つずつチェックしてこなすにも5000行以上で当て上げ状態です どなたかヒントかVBAのソースを教えていただけないでしょうか よろしくおねがいします
当て上げ? で、そのチェックはVBAでやるようなことなのか?
B列を削除して割り振りなおした方が簡単じゃないの?
> ソースを教えていただけないでしょうか ソースが欲しいならそういうところに頼めよ ここは丸投げ依頼所じゃないぜ 自分で書こうって気がある奴がヒントを貰いに来る場だ
step 3 じゃだめ?
>>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) 上のを実行するとなんでかオーバーフローするんですけど。
しませんでしたけど… 念のためLongにしといたらどーですか?
307 :
299 :2007/02/18(日) 13:51:43
>>304 まさにこれです
変数とかCellsとかforとかすごい勉強なります。
ありがとうございます
>>303 最初なんのことだろうと思いましたが、304みてわかりました。step 3。
ありがとうございます。
308 :
デフォルトの名無しさん :2007/02/18(日) 13:56:43
デバッグしてa*bのところにマウスをもってくると、5184763.26454401 という数字が出ます。小数点以下の数字が原因かと思うんですけど。
もしかして: 単精度で計算していて精度がでていないという落ち?
aとbがVariantならdoubleと同じ精度で扱えると思うんだが…
フォームのテキストボックスを全部いっぺんに空白にする方法はありますか?
314 :
312 :2007/02/18(日) 22:44:54
いや、そりゃもちろんそうなんですが、 一行で一気に全部いっぺんに空白にしてしまうような命令とかはないかなぁと思いまして・・・
>>314 そんなことしてどーするの?
見た目には変わらないのに?
Me.Controlsに対してFor Eachループ回して If TypeName(objControl) = "TextBox" Then objControl.Text = "" とか
そういう処理をするプロシージャを用意しておいて、そいつを呼べばいい。
318 :
312 :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 メソッドが失敗しました」となってしまいます どうすればいいか教えて下さい 「マクロの記録」を使ってしか、マクロ扱った事無いのに 調子に乗って仕事請けてしまって困ってます・・・
>>319 これだけでいいんでない?
Private Sub CommandButton1_Click()
Worksheets("Sheet3").Range("A1:A10").Copy
Worksheets("Sheet1").Range("A1:A10").PasteSpecial Paste:=xlPasteValues
End Sub
最後に
Worksheets("Sheet1").Activate
にしてもいいと思うけど…
321 :
319 :2007/02/20(火) 01:15:25
解決しました有難うございます 範囲指定の時は Worksheets("Sheet3").Range("A1:A10") としなければいけないのですね
>>321 シート名を指定していないのでSelectが失敗したのではないでしょうか?
範囲指定とは関係ないです。
そういや
Worksheets("Sheet1").Range("A1").PasteSpecial Paste:=xlPasteValues
でOKでもOKでした。
どうでもいいけど、 シート名変更されると危なっかしいから、 シートのオブジェクト名でやった方が無難。 Sheet1.Range〜以下略 意味が分からんならVBA画面でシートを選択してF4押せ。
ユーザーがSHIFT+クリックで複数のセルを選択するように プログラム上で選択中のセルをさらに動的に増やしたいのですが どうすればいいでしょうか。
どういう風に増やしたいのか詳しく。 Offsetとかでいいならそれで。
OffsetではなくResizeの方が良いのでは?
飛び地で選択できるじゃないですか? あんな感じで。 2点間を選択してもらって、その間の特定キーワードを含む セルを自動的に選択する機能を作りたいのですよ。
>>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に渡すことができるでしょうか? よろしくお願いします。
VBAでどうやってコンパイルエラーを出したのか知りたいのだが。
>>329 クラスを使え
>>330 メニュー > デバッグ > VBAProjectのコンパイル
も知らんのか?
>>329 なら普通に実行したってコンパイルエラー出るし。
もしかしてexe吐くことがコンパイルだと思ってるのかな?
>>331 クラスってどうつかえばいいのですか?
プロジェクトで挿入からクラスモジュールを挿入して、
Type文を打ち込めばよろしいのでしょうか?
それと、ここはsage推奨ですか?
>>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てるだけ。
335 :
327 :2007/02/21(水) 02:04:24
マクロで記録したら文字列で指定してたからどうしたもんかと 思いましたが、addressでセル位置の座標を取れるからこれ使えばいいのかな。 問題は解決したけども、なんかほかにスマートな方法があるなら教えてくだされ。
336 :
デフォルトの名無しさん :2007/02/21(水) 15:31:21
GetOpenFilename で「ファイルを開く」 ダイアログ で左側のデスクトップやマイドキュメントが選べません。どうしてでしょうか? 参照設定で、Microsoft Runtime Scriptingは選択しています。 Office2003, XP Proです。
> どうしてでしょうか? 環境が壊れてるからじゃねーの? とりあえず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なのですが、同じアドレスは二度書き込まない風にできますか?
339 :
338 :2007/02/22(木) 18:01:47
処理重くなるだけかな 少しぐらい重なってもいいか・・・・
>>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" と少数点付きにできますか?
As String にするか "Ver." & Format(MyValue, "0.0")で
343 :
デフォルトの名無しさん :2007/02/23(金) 22:52:10
>>342 ありがとう!!!
できた〜!!!!!
ちなみにStringはダメでした。
ほんとにありがとう。
ああ、"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だけで不安定になるのか原因わかりますでしょうか?
うん、わかる
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 'だと動きません。なんでだろう。。。 '親切な方教えてください。
range("1:" & あ)では?
>>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以降を」と添えよう。
352 :
349 :2007/02/24(土) 15:49:50
>>350 ほえ〜。動きました。
なぜだか分からないけど、とにかくこれでやってみます!
ありがとうございました!
>>351 あ、RowsのつもりがRangeって打っちゃったよ
354 :
349 :2007/02/24(土) 16:09:47
>>351 とにかくいろいろやり方があるんですね!
どうもでした。m( )m
モジュールって何?っていう段階なので、すべてがサッパリ妖精なのですが、
とにかく理解もせずに突き進んでみることにして見ます。。。
355 :
デフォルトの名無しさん :2007/02/24(土) 19:58:05
エクセルのグラフの軸の書式設定にある Y/数値軸目盛の最大値のところに初期入力してある値を取得する方法ってありませんか?
初期値は自動じゃないのか? まぁ、マクロ記録で変更してみりゃプロパティの名前がわかるだろ。
357 :
デフォルトの名無しさん :2007/02/24(土) 20:35:27
>>356 自動です。
自動で入る初期値がほしいんですが、これに関しては
マクロ記録でいろいろ試してみましがはわかりませんでした。
>>357 初期値変更するの記録すればわかると思うけど
ActiveChart.Axes(xlValue).MaximumScale
じゃない?
359 :
デフォルトの名無しさん :2007/02/24(土) 21:14:35
>>358 ありがとうございます。
値の取得ができました。
初期値変更するの記録したつもりだったけど、わからなかったw
360 :
デフォルトの名無しさん :2007/02/25(日) 14:25:00
あぁ〜ん、ユーザーフォームがうまく作れないよぉ〜〜〜ん!! 参考書ばかりが増えていく…
わざわざユーザーフォーム作る香具師って馬鹿じゃね? プログラミング能力の無さをさらけ出してるだけだよ。
362 :
デフォルトの名無しさん :2007/02/25(日) 16:08:29
馬鹿が馬鹿を笑う、ここはそんなスレでつw
ユーザーフォームを×ボタンをクリックして閉じるときに、 それと同時に上書き保存をしたいのですが 何か良い方法はありますか?
>>364 UserForm_QueryCloseイベントに上書き保存のコードを書く
動作しないユーザーフォームなら1分もかからずにちゃんと作れるよな。 これすらできないのは才能ないというかなんか根本的におかしい。
367 :
デフォルトの名無しさん :2007/02/26(月) 04:05:54
じゃ、>361はこう訂正してみよう。 >わざわざユーザーフォーム作る香具師って馬鹿じゃね? →ユーザーフォーム作るのに苦労する香具師って馬鹿じゃね?
369 :
デフォルトの名無しさん :2007/02/26(月) 05:03:58
>>368 納得した
ユーザーフォーム使う使わないは用途によるからな
370 :
364 :2007/02/26(月) 10:09:54
>>365 ありがとうございます!できました!
>>361 仕入・納品・在庫調べ等々、自分の仕事では
ユーザーフォームないと非常に入力がめんどくさいです。
なので自力で作成しました。
まあ、「市販のソフト買えよ!」と言われればそれまでですが。
>>360 がやろうとしてることと、
>>361 ,
>>366 ,
>>368 が指摘してることに遥かなる距離感を感じるのはなぜだろう。
>動作しないユーザーフォームなら
わざわざ動作しないフォームを作る暇人っているんだな。
372 :
デフォルトの名無しさん :2007/02/26(月) 11:47:50
>>370 まさかそれをアクセスでなくエクセルでやってるとか・・・
Excelが伝票というケースもあるだろ。Accessの仕事しかやったことないのか
374 :
デフォルトの名無しさん :2007/02/26(月) 20:15:30
Cellの中に文字列があって、その文字列の長さを取得するにはどうすればいいか教えてください。 文字変数の長さの取得方法がわかりません。
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 とすることが出来るかがわかりません。
b = Len( a ) まあいろいろ期待どおりに動作しない場合も多いがね。 b = LenB(a ) 内部がEUCなのでバイトカウントでも(ry
379 :
デフォルトの名無しさん :2007/02/26(月) 20:55:59
>>377 すいません。見落としていました。
>>375 ありがとう
はぁ、なんか疲れてるみたい・・・
「文字列の長さ」を「文字変数の長さ」と言い換えたのは 意味があるのかと…思ったわけです。 深く考えすぎたか_| ̄|○
381 :
デフォルトの名無しさん :2007/02/28(水) 15:39:38
マルチすみません。 情報が少ないですが以下の現象で困っております。 環境 WindowsXP Excel2003 エクセルのVisual Basic Editorで社内作成のコントロール(VB6にて) をはりつけ、その後エクセルを終了すると必ずメモリがReadに・・・ のエラーがでてしまい困っています。あと2時間ほどで調べないといけない のですが。。。誰かご教授お願いします。
> 社内作成のコントロール の問題を聞かれても、どうにもならんわな。 聞きたいなら最低限そのコントロールのソースを晒せ。 それが出来ないなら自社内で解決しろ。
社内掲示板で2ちゃんねる使ってるなんてユニークな会社ですねー
384 :
デフォルトの名無しさん :2007/02/28(水) 17:21:49
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に、日にちごとにずらしてコピーしたいのですが どうすれば良いのでしょうか?教えて下さい
>>388 本日の日付を検索してその列にペーストするように
すれば?
3月2日とかを日付型にしておくとやりやすい。
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
>>390 Cells(1, i).Selectってどこに出てくるの?
別にエラーにはなりませんでしたよ。
このやり方だと1列目にあらかじめ日付が入力されていると
変なところへコピーされますね。
>>390 Selectいらなくね?
後、iが256越えたら普通にエラーになると思われ。
>>391 388を読んで当初A1:A20で直して貼り付けて未修正ですいませんでした。
黄色部分は、→箇所になります。
Sheets("Sheet3").Select
→ Cells(10, i).Select
ActiveSheet.Paste
>>392 なんで256なのかわからないんですが解決したら256回やって調べてみます。
レスありがとうございます。
397 :
392 :2007/03/02(金) 21:48:47
>>394 書き方悪かったスマン
俺のExcelのバージョンだと
列数は256なんだけど、
200から列数って大幅に増えたんだっけ?
つまり終端を越えたらエラーになると言いたかった
Do Until Sheet3.Cells(1, i).Value = "" の「Sheet3」 という書き方と Sheets("Sheet3").Selectの「Sheets("Sheet3")」は なぜ違う書き方をしてるの?
>>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
とかでいいような気が。。。検証してないけど。。。
402 :
388 :2007/03/03(土) 01:35:10
遅レスになりまして申し訳ありません
皆さん、有難うございます
>>390 さんのマクロを拝借させていただこうと思います
403 :
デフォルトの名無しさん :2007/03/03(土) 02:26:39
すみません。 別名で保存(ThisWorkbook.SaveAs filename:=Fname)すると、 シート名の頭にファイル名が [ ] 書きで付いてしまいます。 付かないようにする方法は無いのでしょうか?
404 :
403 :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
ヒント:a = a & "1"
408 :
406 :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
string形式にしたらいけました、どうもすんませんn
ブックを閉じる時上書き保存するわけですが 同時にバックアップを取りたい場合、どいうコードになるのでしょうか? 便宜上"c:\BackUp"に保存したいと仮定してお願いします。
ThisWorkbook の Workbook_BeforeClose でSaveAs メソッドを使って、そのフォルダに保存すれば?
>>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
BeforeSaveでSaveCopyAsとか
>>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
各セルに複数の情報を持たせたいんですが、 セルにユーザ定義のオブジェクトを関連付けることって可能ですか? 単純に Cells(1,1).Value=オブジェクト は無理でした・・orz 背景色やら、ハッチパターンに強引に埋め込んでますが、なんか汚くて・・
複数シートにすればいいじゃん 邪魔なら非表示にすればいいし
何をやろうとしてるのか知らないが、そういうことをやりたければ オブジェクトに関連付けた値(key)をセルに入れておくのが良いだろう。 そのセルに入れられたkeyから、そのkeyに関連付けられたオブジェクトを呼べるので 結果的にセルとオブジェクトが関連付けられたことになる。
なるほど。やはり直接は無理ですか。 お二方のご提案、参考にさせて頂きます。ありがとうございました。
419 :
デフォルトの名無しさん :2007/03/04(日) 22:36:39
シート上にコンボボックスが存在するかしないかをbooleamで返す 方法はありませんか?
シート上のコントロールコレクション内に TypeName()="ComboBox"に一致する物が有るか否かを booleam型で返す関数でも作ればいいと思いますが。
421 :
419 :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
そりゃオブジェクトは必要ですよ
419 名前:デフォルトの名無しさん[] 投稿日:2007/03/04(日) 22:36:39 シート上にコンボボックスが存在するかしないかをbooleamで返す 方法はありませんか? 420 名前:デフォルトの名無しさん[sage] 投稿日:2007/03/04(日) 22:46:27 シート上のコントロールコレクション内に TypeName()="ComboBox"に一致する物が有るか否かを booleam型で返す関数でも作ればいいと思いますが。 booleam? 二人だけの世界なのか?
ユーザー定義型なんでしょ だから420もそのユーザー定義型で返せばいいって言ってるだけじゃん 組込み型以外は世界のの常識外なのか?
質問です。 アクセスで出力したレポートをエクセルかワードに読み込んで それにパスワードをつけてメールを作成、添付したいのですが この一連の流れをマクロで出来ますか? どのようにすれば良いでしょうか? ご教授お願いします。
ADOでアクセスに接続して データをエクセルに取り込んで、 メール(OUTLOOK辺り?)に添付して 送信する と言った流れに分解してそれぞれを組んでいけばいいかと思うが、ネボケ眼でできることじゃない w
すみません、教えて下さい あるセル範囲に名前を付けて居て、マウスでセルを一つ選択、または複数選択された時に 選択された場所が、名前付きのセル範囲の中なのかどうかを、判断するにはどうすれば 良いのでしょうか? 4隅の座標の中に有るかどうかを、全てIF文で見なくてはダメですか?
428 :
デフォルトの名無しさん :2007/03/05(月) 19:07:40
フォルダに入っている複数のcsvのファイルを、一枚のエクセルファイルにワークシートでまとめ直したいんですが、この手のスクリプトを配付しているところをお知りではありませんでしょうか? 自分で組もうとしたんですが、力果てました>< よろしくお願いします!
まあ無理でしょ 左上と右下のCells(r,c)の数字で範囲チェックすれば簡単だと思う
>>428 直接既存のブックにcsvファイルを読み込んでいく方式ではなく
csvをブックとして開いて、csvシートをまとめ用ブックに移していくという方式だと簡単だよ。
csvをブックとして開くのも、シートを別ブックに移すのもマクロの記録で録れるから。
>>427 Application.Intersectを使って結果がNothingかどうかで判定すればいい。
一部は中で一部は外の場合の真偽をどうするかによって
やり方は若干違ってくるけど。
433 :
428 :2007/03/05(月) 22:13:33
>>431 レスありがとうございます。
たすかります。
すいません。もしその方法でやろうとすると
もしファイルネームが変わった場合ってどう動かせばいいんでしょうか;;
ファイル名が連番ではなく、
たとえば日付とかでファイル名をつけたときとか、
規則性がない場合とか。
楽にできる方法があれば、複数あるとありがたいのかなあ、って。
ちょっと人から頼まれたものなので、
一つの方法でわかっていただけるかなあ、て、
ちょっと心配で。
自分でもちょっとほかの方法でやってみてるんですが・・・うまくいかなくて。
434 :
428 :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
435 :
428 :2007/03/05(月) 22:22:07
ここまですすんだものの、ファイル名がうまく取得できてなくて、 一枚のファイルしか読み込めない(泣) すいませんが、もうちょっとだけお力添えをいただけるとありがたいです。 これが動いたら、ダイアログでフォルダ指定して〜とか いろいろつけたしていこうかな、とおもっているんですが、 まずはベースが動かないと、どうしようもならない;;
あのさ、こんなところで聞かなきゃ答えられない程度のレベルなら カッコ付けずに「ごめんね、解らないから他の人に聞いて」って相手に言えよ。 最悪どうしても必要なら、有料でそういうアドインとか作ってくれるところもあるから お前が答えなきゃどうしても困るってことは無いだろ。
Workbooks.OpenTextを1回しか実行してないんだから、開くファイルが一つなのは当然だろ 複数開きたければWorkbooks.OpenTextをループの中に入れてやれよ なんでファイル名を取得する処理をループ内に書いてるのに、 取得したファイルを開く処理をループ内に入れないのかねぇ
ファイル検索結果のコレクションをfor each ... in ... でぐるぐる回すといいと思うよ
> ファイル検索結果のコレクション って何? 検索結果(フィルタを掛けた状態)をコレクションで返す関数なんてVBAにあったっけ? まさか、こんなことに外部COM使えとか言わないよね。
あれ?Application.FileSearchの .FoundFilesってやつだけど ヘルプ見たらコレクションじゃなくてオブジェクトになってるな
それのことかよ(゚听)
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 に同意。
人から頼まれたんなら、例外処理とかもしないとダメだろうし。
エクセルVBAでつくったソフトって、外部DLL化ってできるんですか? なんでもデベロッパーを使うとできるみたいな話をチラッと聞いたんですけど、 エクセルのシート上で動かすようなマクロでもDLL化できるんでしょうか。 それとも、やっぱユーザーフォームを使ってエクセルシートとは別個の窓に しないとだめなんでしょうか。 ご存知の方いたら、教えていただけると助かります。 よろしくお願いします。
Excelスレから誘導されて参りました。マルチになって申し訳ないです。 【1 OSの種類 .】 Mac8.6 【2 Excelのバージョン 】 Excel2001 【3 VBAが使えるか .】 少し 【4 VBAでの回答の可否】 可 【5 検索キーワード 】 マクロ PC名 取得 GetComputerName Environ 【6 検索サイト 】 すぐマク 質問させて頂きます。 ネットワークに繋がった共有スペースにブックを置いて使用する場合 最終的にどのPCで更新されたかをシート上に表示したいのです。 セルの文字列をPC名に変更→上書き保存 というのを書きたいのですが、PC名を取得する記述が判りません。 ご存知の方いらっしゃいましたら、ご教示宜しくお願い致します。
>>445 誰もここへの誘導なんてしてないし、ここでもスレ違いだよ。
とりあえずMac板行こうな。
447 :
デフォルトの名無しさん :2007/03/07(水) 14:09:49
>>443 VBAが強力過ぎて逆に厄介だな
そんな事するなら別の言語で組めと言いたい
>>445 移動前のスレッドで「UserNameじゃだめなの?」っていう
レスがついていたのですがお読みになりましたか?
たぶんこういうことかなと思うのですが
Sub UserName()
Dim strUserName As String
strUserName = Application.UserName
MsgBox strUserName
End Sub
>>444 >>447 できるにはできるけど、コストかけてVBAにこだわる理由はあるのか、
ってところでしょうか。
自分の場合、単なる食わず嫌いだと思うので、
別の言語取得した方がよさそうですね。
レスありがとうございました。
>>449 取得しても、習得しないと無理じゃね?
#修得でもいいけど。
451 :
デフォルトの名無しさん :2007/03/08(木) 22:45:10
エクセルVBAを独学するのに良い教材を教えてください。
452 :
デフォルトの名無しさん :2007/03/08(木) 22:56:34
↑ネットで調べるのがいいんじゃないの 色々情報でてくるし、質問もできる最高の教材じゃないか
実物とヘルプとマクロ記録があればなんとかなるさ
454 :
デフォルトの名無しさん :2007/03/09(金) 04:27:58
>>451 VBAマクロのサイトで基本的なことをやりながら、頭に入れておく。
↓
エクセルで複数の動作を単体で録画して、動作を組み合わせる
↓
ソースの値や色などを変えてみる
↓
範囲設定や繰り返し、分岐などを組み込んでみる。
↓
ここや質問スレのマクロをROMったり実行してみる
↓
上のスレで出た質問でわかるところはマクロ組んで答えてみる。
継続してやってみる。
457 :
デフォルトの名無しさん :2007/03/09(金) 11:07:24
生粋の初心者です。教えて下さい! エクセルのマクロで、FOR−NEXTを使って平行線を引くとき 座標値をセル参照したいんですけど、 Addline(100,Range("sheet2!A1"),200,Range("sheet2!A1")) の A1 を A1,A2,A3 の様に使うには、どの様に書けばいいのですか? 言いたいことが判りづらかったらすみません。 宜しくお願いします。
>>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
>>458 ありがとうございます。
助かりました!
460 :
デフォルトの名無しさん :2007/03/09(金) 17:20:22
ホイールマウスでスクロールできません VBAプロジェクトの窓はスクロールできるのですが コードを記述するところがスクロールしなくなりました。 今はスクロールバーをクリックしてスクロールしてます。 教えてちゃんですみませんが教えてください。
>>460 ⊃ どこでもホイール
これインストしれ!
462 :
457 :2007/03/12(月) 16:44:31
すみません・・もう一つ教えて下さい。 引いた線に名前を付けたいんですが、 ActiveSheet.Shapes.AddLine(X1,Y1,X2,Y2).select.name = "sen" だと、”オブジェクトが必要です”とエラーになります。 どう書けばいいのですか? 色々調べたけどわかりません・・
何を調べてそのコードになったのか。。。
464 :
457 :2007/03/12(月) 17:53:37
馬鹿な奴だとお思いでしょうが、HELP機能も インストールされて無くて、手探りでやってるんです。 どうか、この馬鹿に教えてやって下さい!
selectがいらない
ご助言をお願いします こんな感じで、複数有るシートをマクロで保護していますが 以下の処理が実行される時に、シートがパラパラと表示してしまいます これを回避して、常にトップのシートだけをアクティブな状態で出来ないでしょうか? 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にはないのでしょうか?
468 :
467 :2007/03/12(月) 22:40:54
一個レス上の467です。自分で答え見つけることできました(-_-;)
>>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
470 :
466 :2007/03/12(月) 23:00:54
>>469 ありがとうございました
表示の更新を押さえるのは、気が付きませんでした
m(__)m
471 :
457 :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上も長くて書き込めないので改行しました。) ソース上で改行などして見やすくする事は出来ませんか? もしくはもっと便利なやり方はありませんか? 宜しくお願い致します。
>>472 Andの後ろに半角で「 _」と入れて
改行すれば大丈夫。
> もっと便利なやり方 の方がいいと思うけど
>>472 cell.valueを連結して、文字列と較べればいいんでない?
476 :
デフォルトの名無しさん :2007/03/13(火) 18:25:29
セルの中に丸印や、レ点などを打てば、そのセルの行すべてが別の エクセルファイルにコピーされる方法ってありますか? ちなみにコピーされたあと、コピー元の行の中身は空白にしたいです。
いや、有るか無いかではなくそういう機構を作ればいいだけの話でしょ それを作る上で解らない部分を具体的に聞くならまだ良いが 全然解らないから、一から十までコード書いてよこしやがれというなら、帰れ
>>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だと、指定時間に、一回しか実行されません。
480 :
479 :2007/03/14(水) 05:40:45
マシンを立ち上げっぱなしで実行したいと考えています。
指定した時刻に何秒間隔(またはランダム)で何回繰り返すとかもっと具体的に書いてない。 書いた後、自分なりに作ったソースをもってこないと答えをもらうのが難しいスレです。
>>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 など試したのですがうまく行きません
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
書き込みし間違えたようです、すみません
何この嫌がらせ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行目で出ます。 何がいけないんでしょう?
489 :
488 :2007/03/15(木) 15:42:52
すみません、自己解決しました。 ただのスペルミスでした orz 疲れてるみたいです…。
お疲れ様 _,,..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に負荷をかけているようです。 解決法を教えてください。
色々使い方がまちがっとる。 まずはググレてApplication.Ontimeの使い方を理解しろ あと、DOLOOPはいらん。
最初に全予定時刻実行予約するより (これがメモリ不足の原因だな) 実行時に次の実行予約すればいい
>>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
まあそれで動くならいいんじゃない?
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 がわかりません。よろしくお願いいたします。
へlp見ろや
>>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では無理なのかどっちなのかすらわからんといふ
渡すことは可能だし、その受け取る側の定義自体も間違ってはいないよ おそらく渡す部分か、受け取った後のところで変なことしてるんだろう 情報隠してるから実際に何処が悪いのかはわからないが
>>502 Private Sub Convert(lb as MSForms.ListBox)
505 :
デフォルトの名無しさん :2007/03/17(土) 12:05:29
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
>>506 ×Cells(1.3)
○Cells(1, 3)
ぢゃね?
508 :
デフォルトの名無しさん :2007/03/17(土) 16:09:13
>>507 アドバイスありがとうございます。
直してみましたが、いまだに、オブジェクトが必要ですというエラーが出てしまいます。
Sheets("Sheet1"). Cells(1, 3).Value.Selectなども試したのですが、、。
>>508 Sheet1.Cells(〜じゃまいか
あと、クリップボード使わなくてもコピーはできる。
Sheet1.Cells(1,1).Copy Destination:=Sheet2.Cells(1,1) とか。たぶん。
>>506 50万円だねww
株式で追い出されてきた人だね
こいつ礼儀知らないからね
「プログラム動けばこっちのものだ」なんていってボロクソ言ってたしな
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
513 :
512 :2007/03/17(土) 16:35:23
うあ、リロードしとくべきだったw
514 :
デフォルトの名無しさん :2007/03/17(土) 16:40:01
>>511 できました。。
ただ、自分で解決してないので、もどかしさはありますが。
ありがとうございます。
もうひとつくらい、作ってみます。
>>512 アドバイスありがとうございます。
勉強になりました。
>>512 >Sheets("Sheet100").Range("A1").Select
Worksheets("Sheet100").Select
Range("A1").Select
もしくは、
Application.Goto Worksheets("Sheet100").Range("A1"), True
516 :
512 :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の間が長くてエラーになってしまうのですが、解決法はないでしょうか?
>>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
で、コラムが選択できないのですが、他に書き方があるのでしょうか?
1,2冊VBAの本を読んで(理解して)から質問しろと言いたいのは漏れだけですか…
521 :
デフォルトの名無しさん :2007/03/18(日) 17:04:07
一応読みましたが、あまり理解していないので、ここでお聞きしています。
>>520 俺も。ついでに、最低限デバッグは出来るようになってからコード書き始めろと言いたい。
解決方法が解らないならまだしも、「エラーになります」「うごきません」とか言うだけで
原因部分すら解ってない奴が多すぎ。車を公道で運転する前に、交通規則や運転技術を身に付けるように
プログラムにもコードを書き始める前に最低限覚えるべきことってのがある。デバッグはその尤もたるもの。
>>521 一応ではなく、理解できるまでしっかり読め。
本に書いてあることすら理解する気がないという奴に、ここで教えても意味無いし
本に書いてあることを理解したなら解決方法も解るはずだから教える必要ないし。
ということで、ここで教えるべき事は何もないってこった。
523 :
デフォルトの名無しさん :2007/03/18(日) 17:29:07
>>522 だからあなたはここには必要ないんです。
理解できないひとが来る場所だから。
理解できてなくてもいいから、理解しようとして最終的には理解できる人がいいなぁ。 つーか、(どうやっても)理解できない人なんて存在価値そのものが無いでしょ。
> 理解できないひとが来る場所だから。 ちがいますよ
526 :
512 :2007/03/18(日) 17:43:38
519=506ですよね? 違うなら、>512から読み直してみればわかると思うよ。 俺も同じミスしてるし。
>>523 俺は
>>522 じゃないけど、質問するあんたがそんな感じでは
誰も回答くれないと思うよ。
>>522 程言うつもりはないけど、もうちょっと理解してしないと説明してもしがいがないしねぇ
>>523 その発言、矛盾してることに気づいてる?
理解できない人だけで物事が解決するわけないでしょ。
529 :
デフォルトの名無しさん :2007/03/18(日) 17:51:21
確かに523の発言は問題あったと思っています。反省しています。 ただ、明日の前場までにプログラム完成したくて、ちょっと気持ちが焦っていたんです。。 申し訳ありませんでした。 コラムにしろ、シートにしろ、セルにしろ、選択の方法がいまいち理解できてないみたいです。。 申し訳ありません。。
素人は使う日程を決めてから作るなよ。 できてからのんびりいつから使うか判断するべきだ。
531 :
デフォルトの名無しさん :2007/03/18(日) 18:02:25
一応、高値、安値、始値、終値から安値予想と終値予想を出して、楽天証券のRSSも利用して安値予想よりも低くなったら、色変換してビープ音をならす、高値予想よりも高くなったらまた音楽をならすというプログラムはできたんです。 ただ、そもそもの4本値が楽天証券のマケスピからコピーアンドペーストしなければならなく、面倒だったので、Yahoo!から4本値をダウンロードするプログラムを作ってるんです。 519のご回答、どうかよろしくお願いいたします。
応援するぞ。がんがれ
>>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
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
想定した動作と、どう違ったかも書かないとよう解らんよ または、エラーが出たならどんなエラーかもね
536 b列c列 a b c が b列c列 a abc b c となる予定だったのですが、プログラムを起動してもcの1が空白のまま エラーなどは何も出ません、何処を変えれば良いのか教えてください、 よろしくお願いします。
すみません、たぶん自己解決しました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
まだ修正箇所あったけどなんか完成した。無駄レスしてごめんなさい
コラムには誰も突っ込まないの?
英語の教科書にカタカナで読み振ってるおバカさんな中学生レベルの発想だな。 日本ではコラムを囲み記事、カラムを縦列だと思ってる人も多いようだが スペルも発音も実は一緒だし、正確に言うと発音的にはカラムでもコラムでも間違いだが 縦列のことをカラムと書いて通るなら、それをコラムと書いたって間違いとは言えない。 逆も然り。というか英語のカタカナ表記に正確性を求めること自体がナンセンス。 因みにATOKの英単語「かな読み→英スペル」変換辞書では、 デフォルトで「からむ」も「こらむ」も「column」に変換される。
>>542 やぱりAtokいいよな。関係ないけど。
関係ないけどMS-IMEだってカタカナ語英語辞書を使えば カラムでもコラムでもcolumnを候補に出す。
545 :
デフォルトの名無しさん :2007/03/21(水) 14:45:08
コラムとも読めることをここで初めてしった漏れがきましたよ ま〜相手に伝わればどっちでもいいと思うぜ
>>545 素朴な疑問だけど、新聞のコラムは何だと思ってたの?
車のコラムシフトとか。
547 :
デフォルトの名無しさん :2007/03/21(水) 21:14:56
考えたこともなかったぜ〜 知らなくても死ぬわけじゃないしな〜 カラムと書いてある参考書のほうが多いしな〜
> カラムと書いてある参考書のほうが多いしな〜 うん、その通り でもコラムでも間違いではないってことを知らないと 541みたいに恥をかくことになるのでご注意を 2chでならまだいいけど、リアルでやっちゃうとかなり痛いので
549 :
デフォルトの名無しさん :2007/03/23(金) 10:37:16
擬似コントロール配列使ってる奴いる?
居るよ
551 :
デフォルトの名無しさん :2007/03/23(金) 11:30:05
エクセルのフッターにページ番号+セルの結果を表示するにはどうしたらいいですか? A1に3が入っているとしたら、1ページ目には4と印刷させたいのですが…。
>>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
カスタムイベント使ってる奴いる?
>>554 コード読むの面倒なんて、昨日まで動いてたというなら
とりあえずOSとExcelを再インストールしてもう一度動かしてみな。
それでダメだったらまたおいで。
先に言っておくが質問する側が「面倒」とか言わないでね。
>>555 RaiseEventで発生させるやつでしょ。バリバリ使ってるよ、得にアドインで。
557 :
デフォルトの名無しさん :2007/03/24(土) 11:46:20
教えてください vba内で生成した文字列をセルに代入した時、 文字列内の改行コードごとに、セルも一つ下に 移動して、改行コード後の文字列をセットして いくにはどのようにしたらよいでしょうか? 現状 Dim str As String str = "一行目" & vbCrLf & "二行目" Cells(1, 1) = str 一つのセルに全ての文字(改行コード含む)が セットされてしまいます。
>>557 str = "一行目" & vbCrLf & "二行目"
のところは
実際のコードじゃホントに最後VbCrLfは付かないんだね?
559 :
デフォルトの名無しさん :2007/03/24(土) 17:44:14
普通に cellsの引数に変数を指定して for....next とか do...loop で変数を回せば良いだけ
質問します ブックをThisWorkbook .IsAddin=True でアドインとして実行した後、 Workbooks.Add で新しいブックを開いて その新しく開いたブックのイベントをアドインとして開いたブックで取得して プロシージャを実行するにはどうすればいいのか教えていただけませんか?
そのブックのオブジェクトをアドイン側でWithEvents定義すれば良いだけのことでしょ。 その方法すら解らないと言うなら、こういうことは君にはまだ早いってこった。 もう少し精進してから出直そう。
562 :
デフォルトの名無しさん :2007/03/25(日) 10:38:18
すいません、Excelの #VALUE! ってどうやって参照というか、条件に加えればいいんですか? セルの中身が #VALUE! の時に0を代入してやりたいのですが・・・。
ERROR.TYPE
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を と記述すべき?
>>565 Case 1, 2
Case 3, 4
つーかヘルプのSelect Caseの解説くらい読めよ
他にもいろんな条件指定の仕方が載ってるから
567 :
466 :2007/03/25(日) 16:46:58
568 :
565 :2007/03/25(日) 17:12:01
レスサンクス!無事解決!! ヘルプ見るという事は忘れてました、灯台下暗しっ(-_-;) 参考書にも乗ってなかったからorとか使って分けわかんないことしてましたよ
最近基本を学ばずに、いきなり実用編に行く奴が多いよね
勉強のためにVBAを学ぶんじゃなくて、仕事等で必要があって使からいきなり実践はありだろう。 そのとき参考書を買って読むやつと読まない、2通りの人間がいるだけ。
本を買っても実用例や基本過ぎることばかりで文法書がない ヘルプで目的の情報を引き出せる所までスキルもあがってない
> 仕事等で必要があって使からいきなり実践はありだろう。 基本も知らない奴がVBAで業務データを操作するなんて危なっかしいことが 罷り通ってるのは三流未満の企業だけでっせ。
573 :
デフォルトの名無しさん :2007/03/25(日) 19:49:10
VBAでなんとかならない?と聞いてくる上長とかよくいるが 依頼した下っ端が1流だか3流かなんて判断できるとは思えんし 危なっかしいという意識もないどうでもいい情報なんではなかろうか
できれば一流であろうが三流であろうが何でもいいってこった
なんか勘違いしてる?
一年中勘違いしてる
Sheets(ActiveSheet.Name).Name = ListBox1.List(ListBox1.ListIndex - 1, 0) で何でアクティブなシートの名前をリストボックスの項目に変更できないの?
>>577 ( ゚д゚)、ペッ
エラーメッセージぐらい書け!
実行時エラー '1004': シートまたはグラフの名前が正しくありません。次のいずれかを行ってください。 ? 入力した名前が半角で 31 文字以内であることを確認します。 ? 入力した名前に次の文字が含まれていないことを確認します : コロン ( : )、円記号(\)、スラッシュ(/) となってます。
>>580 んで、そん時のListBox1.List(ListBox1.ListIndex - 1, 0)の値は?
582 :
デフォルトの名無しさん :2007/03/26(月) 18:32:04
そんなの自分でどーにかしろ そこからだろ
すいません 自己解決しました。理由は吐き出されたエラーどうり、「:」が含まれていました。 眠い中やっていて気づかなかったみたいです。お手数かけてすいませんでした
解決してよかたね
すいません、教えてください エクセルからリンク等でブラウザを開きリンク先を観覧する場合 タブブラウザとしては開けないのでしょうか? IE7をインスコしてみて開いてみるもタブの追加ではなく新規ウインド(新規ブラウザ?)として窓がドンドン増えていってしまいます これはエクセル側ではなくブラウザ側の設定でしょうか? 教えて頂けないでしょうか 宜しくお願い致します
どっちかって言うとブラウザ側だな。
ちなみにIE7で表示されてるリンククリックするとどうなるの? 問題の切り分けしないで聞いてるってことはない?
>>586 ほー ちなみにルナでもスレイプニルでも通常使用するに設定してもひらかずにIEで開きやがります
>>587 新しくに設定されているのは新しいタブで開くし
そのままの場合はそのまま開くようです
問題の切り分けとは?
それで切り分けできてると思うけど 想像するにIEを起動してURLを開くような記述になってるのでは
>>589 そのとおりです
VBAで現在開いているブラウザでURLを指定して開きたいわけなんですが
ブラウザをドンドン開いちゃうわけです
>>590 まずは自分が書いたコードを貼ってみな。
> (新規)ブラウザをドンドン開いちゃう
というコードでいいから。
すいません 仕事場で質問していたのですが追い出されてしまいました レスが明日になってしまいます申し訳ないです
593 :
デフォルトの名無しさん :2007/03/27(火) 18:53:38
VBA初心者ですみませんが教えてください。 リストボックスにAdditemで項目を複数追加した後、 そのリストボックスを昇順でソートしたいのですが、 プログラムでループなどを駆使してソートさせなければいけないのでしょうか? それとも、関数やリストボックスのプロパティで、簡単にソートできる命令が あるのでしょうか? 単純な質問で申し訳ありませんが、よろしくお願い致します。
VBのリストボックスならSortedプロパティがあるしリストビューもソート機能を備えてるが、 VBAのリストボックスはソート機能は備えてないね。それに普通はAddItemしてからソートするんじゃなくて、 配列に取ってソートしてからAddItemするのが普通だろ。 とにかくVBAのリストボックスでソートしたいなら、自前で実装してくれってことでよろしく。
まあデータをシートに張り付けてソートすればいいんじゃねってことで
そうでもないか
597 :
593 :2007/03/27(火) 19:53:12
>>594 ,
>>595 早速のご返答、ありがとうございました!
やはり出来ないのですか。
自前の実装はちょっと面倒だし、
最終的にシートにデータを落とす予定なので、
シート上での自動ソートを使うことにします。
ありがとうございました!
いまさら「やさしくわかるExcel VBAプログラミング」を買いました。 頑張ります! …と思ったらもうサンプルファイルがDL出来ない (´;ω;`) 頑張ります…
できる大事典 Excel VBA の方が良かったな
できる大事典いいね。 これ一冊でOKとは言わないが、必要最低限はすべて網羅してあるし。 初めの内は頻繁に参考してたよ。
601 :
デフォルトの名無しさん :2007/03/28(水) 01:45:52
すみませんが教えてください! 私は楽天証券の株取引をやっているんですが、 「リアルタイムスプレッドシート(RSS)」というプログラムが使えます。 これは、EXCEL上でリアルタイムに自動的に現在の株価が更新されます。 手で入力することなく、セルがどんどん自動変更されていきます。 これを利用して、株価が動いたら(株価の表示されてるセルが変更されたら)、 VBAのプログラムを動かすような仕組みにしたいのですが、 「EXCELシートの特定セルの数値が変わった場合にのみ、 動作するVBAのイベント」というのは出来ますでしょうか? 申し訳ありませんが、どなたかよろしくお願い致します。
Worksheet_Chengeで渡される引数が変更箇所 それで判断しる
603 :
585 :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 まったく そんな気は無いですが 変ですか?
正直その発想はなかったな
さすがにネタだろ
>>603 FollowHyperlinkでどうでしょう?
609 :
デフォルトの名無しさん :2007/03/28(水) 23:31:50
ユーザーフォームにスタートボタンとストップボタンをつけました。 スタートボタンを押した後VBA実行中にストップボタンを押すとマクロ開始前 というか初期状態というか、スタートボタンを押す前に戻りたいのですが、 どうすればストップボタンを押して中断させられるようになりますか? 宜しく御願い致します。
610 :
601 :2007/03/28(水) 23:35:20
>>602 ありがとうございます!
早速チャレンジしてみます!
>>609 現在出来ている部分のコードを貼るか、ブックのうpをよろしく。
どうせModalなんだろうな。。。
もうだるいよぅ
615 :
デフォルトの名無しさん :2007/03/30(金) 11:32:43
Yahoo!ファイナンスからの株価取得、今日、調子悪くありませんか??
それで?
ちょっとお知恵拝借 1つのセルに4行ぐらいの文字列を設定して 特定の文字のフォントサイズ変えたり太字にしたりするシートを作っています 規模は最大10列×20行 処理の順番は行毎に左から右 で、実行すると列数が増えると遅くなるんで調べてみたら 最初の列の方だと0.3秒で10列目あたりだと1秒以上かかっていました そこで、一度先頭列で作ってから本来の列にコピーするようにしたら改善しました なのでアルゴリズムの問題ではないようなんですが 一体何が原因なのでしょう?とりあえず動き的には問題ないのですが 設定で回避する方法をご存じであれば教えて下さい
まさか、表示の更新を止めてないとかって落ち?
"アルゴリズム"なんて言い出しちゃう奴が、そんなショボいミスするわけないじゃん
>>618 は止めてるときの時間です
割合が変わるだけで後ろの列が遅くなるのは多分一緒ですね
>>618 セルを配列に入れて処理して、後からかシートに書き出して見れば。
メモリ上ならはやいよん
>>622 後でやってみます
>>623 基本的にそういう作りにしてます
セル内フォント設定が全て同じなら問題ないんですが
例えば2行目の1文字目のサイズだけを大きくしたい場合
セルに入れてから変更するしかないと思います
マクロ記録したのを元につくったんですが、
その方法以外のやり方があったら教えて下さい
627 :
デフォルトの名無しさん :2007/03/31(土) 00:02:48
リンク先にマクロとしてあるじゃねぇか あとはマクロを自分で読め
628 :
625 :2007/03/31(土) 00:18:29
>>627 「ロックされています」と表示されて確認できなかったので質問させていただきました。
629 :
質問 :2007/03/31(土) 09:16:18
EXCELでは無く、ACCESS2002のVBAで質問があるのですが、 よろしいでしょうか? 以下のコードを標準モジュールに入れて、 外部ファイル(ACCESS2002のファイル)のテーブルを インポートしたいのですが、 外部ファイルにはパスワードが設定されているため、 パスワード入力画面で止まってしまいます。 そこで質問ですが、 他のACCESSファイルのテーブルをインポートする時に、 パスワードも指定するには、どうしたらいいでしょうか
630 :
629 :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
だったら、自分でマクロを記録してみ?
未だにexcel97を使っているんですが・・・ csvファイルを開いて、上書き保存を選択しているにもかかわらず、 ダイアログが出て保存先指定を毎回聞かれます。 最新のexcelでは何も聞かれず上書き保存されますか?
>>632 Application.DisplayAlerts = False
ああそういうことじゃないのねスマソ
635 :
629 :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しか変換してくれません。 どのようにすればよういのでしょうか?
>>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 ほんとですね。。
初歩的なミスでした。ご指摘ありがとうございます。
そもそもReplaceメソッドの使い方が… まいっか。
>>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
>>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の位置がおかしいのでしょうか??
>>643 j=4*m+1・・・・・でmを4倍してるから4列飛びで置換すると思うけど?
646 :
デフォルトの名無しさん :2007/04/01(日) 00:54:40
647 :
デフォルトの名無しさん :2007/04/01(日) 01:00:12
5〜8行、 9〜12行、・・・・・と数列で分けているので、 mが1のとき5で 4 * m + 4 のとき8で、 次mが2で9行目を置換してはくれないんですかね?
シートの構成も今ひとつわからんから的を得ないかもしれないけど… m = m + 1 これ必要なの?
×的を得ない ○的を射ない ×的を射らない ○当を失している ×当を得ない
650 :
デフォルトの名無しさん :2007/04/01(日) 01:30:29
>>648 まったくその通りです。
これがあるから、4行置きになっていたんだと思います。
ありがとうございました。
うまく起動しました。。
当を得ない:道理にかなっていない 当を失する:当てはまっていない
この程度ならステップ単位で止めてデバッグしろよ
インデントくらいしる
変数に格納されている数字の大小を比較して、 いずれか大きい方を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のいずれ大きい方) てな具合に、簡潔にまとめる方法は無いでしょうか。
bよりaが大きければaに格納 aを表示 だけどあんまりここで聞くことでもないぞ
aよりbが〜の間違いスマソ
>>656 MsgBox iif(a<b, b, a)
660 :
656 :2007/04/02(月) 14:39:04
>>659 iifという関数知りませんでした。
ありがとうございますた。
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()を使えば配列を初期化できることはわかったのですが、 該当するマクロを起動するたびに配列の初期化が行われるのはかったるい、と 思いますので。
Sub Workbook_open() に記述すれば、 ファイルを開いたときに1回だけ実行される。
すいません、教えてください。 例えば、 セルA1に「携帯電話 鈴木」と入力規則で作成したドロップダウンリストで選択 ↓ その同じ A1 セルに 「090-***-****」 と 置換される とは できませんか?要するに、選択した文字列を、そのセルに数字で置換 、変換は無理ですか?別表をシート内に設け、LOOKUP関数でやっても循環 エラーがでます。
665 :
662 :2007/04/03(火) 05:43:20
>>663 レスありがとうございます。
詰まるところ、VBAでは配列の初期化を伴う宣言はできない、という意味でよろしいでしょうか。
規模が大きいマクロの場合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 それしかないかと思い、試しに保存対象のシート以外は削除して見たんですが、
シートひとつにしても保存時にCSV形式の場合には変換の確認が入るようで
SaveAsメソッドが失敗してしまうようです。
地道に手作業で.csv形式に変換していこうと思います。
回答ありがとうございました。
Application.DisplayAlertも駄目なんだっけ
672 :
デフォルトの名無しさん :2007/04/04(水) 01:07:57
アルファーチャートから株価をcsvファイルに落としてエクセルで 売買戦略の検証をしようと思っているのですが、 3000から4000の各銘柄で、一銘柄10年分あります。 一銘柄1シートにすると、3000シート以上必要になりますが・・・ 皆さんはデータの保持をどのように行っているのでしょう?
任意の大きさのVariant の2次元配列があったとして、この行数と列数を 知る方法はありますか? 配列をアクセスするループ中でエラーをキャッチするのでしょうか。
UBound
このスレの質問の96%ぐらいは ヘルプみるだけで解決できんじゃねーか
ヘルプのみで解決できるのは 一部の頭のいいアマチュアとプロの2種類しかいないだろ
このスレの質問の98%ぐらいは 入門書(できる大辞典がオススメ)読んだ上で、必要に応じてヘルプみるだけで解決できる (一部のオツムの弱い子は除く)
質問です。シート上にコントロールのオプションボタンを配置しています。 オプションボタンが押されているか確認する際、 msgbox(OptionButton.value) とすると正常にtrueかfalseを表示してくれるのですが、 i=1 msgbox(OLEObjects("OptionButton" & i).Value) とすると 実行時エラー'438': オブジェクトは、このプロパティまたはメソッドをサポートしていません。 と表示されてしまいます。 上記方法で.valueではなく.nameなら正常に表示されるのですが。 原因と解決方法を教えてください。
680 :
679 :2007/04/04(水) 19:36:37
訂正 ×msgbox(OptionButton.value) ○msgbox(OptionButton1.value) 実際は、オプションボタンは複数(OptionButton1〜xまで)あります。
>>679 OLEObjects("OptionButton" & i).Object.Value
683 :
679 :2007/04/04(水) 20:25:44
>>681 ありがとうございました。
初歩的なミスだったんですね・・・
684 :
デフォルトの名無しさん :2007/04/06(金) 06:56:19
すみませんが教えてください VBAでセルに計算式が含まれているかどうかを判定したいんですが、 どのプロパティを参照すればいいのかわかりません。
シート関数のisformula()使えないのかな?
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秒で終わってるんじゃねえ?
きちんと動いてるな。 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をコンパイルしないで保存すると ファイルサイズが小さくなるけど、これってよく知られた方法ですか?
>>690 マニアにはよく知られた方法
>セキュリティ設定を高にして
じゃなくて、正確にはマクロ無効で開いて保存すると
693 :
デフォルトの名無しさん :2007/04/07(土) 22:48:25
シリアル通信用のMSComm.ocxとかバーコード用のMSBCode.ocxとかって 普通のMS-Officeがプリインストールされてるパソコン(Accessなしver)にも入ってるものなの? 入っていない場合、これら使ってたら使えないんだよ、な? どーすんだろ、こんな場合
ocxをそのPCに持っていって regsvr32で登録すればいいんじゃないのかな。
>>694 だと厳密にはライセンス違反になるから
Developerを買って合法的に再配布すれば?
相手がAccessすら持っていなくてもOKになるし。
ちなみにMSComm.ocxはVectorのVB6のランタイムに入ってたはずだけど、
これも実際はVB6で作ったプログラムを使うため以外の配布はライセンス違反だったり。
696 :
デフォルトの名無しさん :2007/04/08(日) 10:00:33
サンクス MSCommのほうはシリアル通信なんてマニアックな分野だし、 ランタイムの無料配布もあるみたいだし、「ランタイムをインストールしる!」でなんとかしても MSBCodeのほうはどーすっかなぁ・・・ Developerなんて買えないし、「Access買え」なんていえる場面&&相手じゃないし もうすこしdllでなんとかならないか調べてみるわ、ありがと
無料配布ってライセンス的に大丈夫なものがあるの? おつむの弱い子の巣窟ですね。
698 :
デフォルトの名無しさん :2007/04/08(日) 10:14:40
ダメだよ。VBランタイムは無料だけどフリー(自由)じゃない。ライセンス的には3段階。 再配布権のあるVisual Basic所持者→ランタイムの単体配布、同梱配布、自分の環境での自由な使用が許可される 再配布権のないVisual Basic所持者→自分の環境での自由な使用が許可される Visual Basic非所持者→VB製アプリのみでの使用が許可される このように、VB持ってる人だけが、VB以外(VBAやその他ActiveXが使える言語)からの使用を許可され それ以外の人は、VB製のアプリでしか使うことを許可されない。VBを持っていてもVBランタイムを使うExcelブックを作って ランタイムを同梱したり、自分で落としてくれというようなことは許されない。 VBでフリーソフトを作ろうとした場合、実行に必須なランタイムが有料では事実上フリーソフトの制作が不可能になるから 無料で使えるようにはなってるけど、VBランタイムはあくまでも有料ソフトの付属品であり、VB開発環境の価格の一端を担っているものだから。 Accessランタイムも同じ。再配布権を持ってる人が無料で配布してくれれば無料で使えるが、それを落としてきてExcelVBAで使おうってのはライセンス違反。 とにかく、金使ってランタイムの再配布権を手に入れて楽するか、金使わずにランタイムに頼らないコードを書く労を費やすか どちらを選んでも良いが、金は使いたくないしWin32API使ってコードをごりごり書くのも嫌なんて我が侭は無しの方向で。 あ、キッパリ作るの諦めるって道もあるか。
Office関連のコードサンプルとか宝箱は無いですかね? どの製品で開発すれば満足しますか?
701 :
デフォルトの名無しさん :2007/04/08(日) 14:32:29
ほう、そうなのか それならWin32API使って書くか、MSCommは使わない方向で タイマーと組み合わせればできるでしょ、イベントドリブンの方が好きだけど 後はバーコードだな こっちはリーダも買わなきゃいけないしな どれが使いやすいんだろ?Excelとの相性がいいやつがいいな
Vectorのライブラリにちらほら
703 :
デフォルトの名無しさん :2007/04/10(火) 02:10:01
初心者なもので、恥ずかしいくらいに初歩的な質問ですみません(汗 EXCELのシート2つ、フォーム3つ、標準モジュール1つの VBAプロジェクトを作成しました。 これをコンパイルして実行した時に、 1番目のフォームからスタートするようにしたいのです。 ただ、1番目のフォームからのスタートのみならず、 コンパイルしてオブジェクトを作成する方法さえもわかりません。 VBAの「デバッグ」の中に「VBAプロジェクトのコンパイル」という 項目があり、これを実行しても、何も変化がなく、 その項目が選択できなくなるだけです。 本当に申し訳ありませんが、 1)コンパイルの方法 2)1番目のフォームからスタートする方法 上記の2点を教えてください。 よろしくお願い致します。
実際にオブジェクトが作成されるかは知らん ファイルオープンの時にフォーム表示すればいいのでは?
根本的に勘違いしてるんだろう コンパイルすれば実行ファイル形式のモノができるとでも思ってるんじゃね?
●質問 連結したセルから値を取り出すのに 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 ありがとうございます!
早速試してみますね!
>>707 VBAプロジェクトのコンパイルは文法上の誤りを見つけるものと思いなはれ(俺も一体何の為にこれが
あるんだ?と以前思った w
709 :
706 :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
>>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
>>711 そのアドインってウィンドウの無いグレーのところで転がすと
ウィンドウがどこかえすっ飛んで全部消えちゃうバグなかったっけ?
一応大丈夫みたいよ。
714 :
706 :2007/04/13(金) 09:40:36
>>710 d
いろいろ書きようがあるんだね。
VB の仕様は体質に合わないとか言って逃げていたのですが
そうもいってられないので気合入れて勉強してみるダス
715 :
デフォルトの名無しさん :2007/04/13(金) 12:43:43
AとBという二つのブックがありまして、 Aの標準モジュールには、 Public Const y="あいうえお" と書いてあります。 これをB側のブックから、yを参照したい場合はどんなコードにすればよいのでしょうか??
717 :
デフォルトの名無しさん :2007/04/13(金) 16:23:54
クラスモジュールを作ったけど、ユーザ定義型は定義されていませんとコンパイルエラーが出ます。 定義はしており、定義を有効にするための方法はどうしたら良いのでしょうか?
> 定義はしており 本人はしてるつもりでも、きちんと出来てないというのが定番 もう一度見直してミスを見つけられなかったらブックをうpしよう
719 :
デフォルトの名無しさん :2007/04/13(金) 17:53:04
>>717 昔自分もはまった。
おそらくA.xlsのクラスモジュールを、B.xlsで使おうとしているんだと思われ。
B.xlsには存在しないから、定義されていないと出る。
これを動作させるには、コピーかインポート/エクスポートしか手段はありません。
解説サイトやその辺のサンプルを見ても分かると思うが、誰も2つのxls間で呼び出しておらず、1つのxlsで呼び出している。
> これを動作させるには、コピーかインポート/エクスポートしか手段はありません。 嘘を書くな。それとも知らないだけか?
721 :
デフォルトの名無しさん :2007/04/13(金) 22:38:31
金を払うなら教えてやらんこともない
722 :
デフォルトの名無しさん :2007/04/13(金) 23:26:59
↑ スレタイすら読めない厨房はレベルが低いのー。 プププ。
知らないんだろうな 実際は出来るよ
もったいぶるほどのもんかね クラス定義の外部参照なんて出来たところで意味ないし
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 Excelの各ワークシートが
Worksheet型を継承したstaticなクラスと言った方が良いかも
ただ、インスタンス作れないし(staticだから当然だ)
Worksheet型からの継承後のクラス名が存在しないから
引数で渡すときに苦労するけど。
Worksheet型で渡せば当然Worksheet型のメソッド/プロパティ以外は弾かれるので
結局、実行時名前解決のお世話に…
729 :
726 :2007/04/16(月) 01:09:33
また追加で質問させてください。 VBAで、CSVファイルの最終データから先頭に向かって 逆に読み込むにはどうすればよろしいでしょうか? または、テキストファイルの最終レコードから先頭レコードへ 逆に読み込むにはどうすればよろしいでしょうか? ネットで検索してもどうしてもわからなかったもので・・・ 何度も質問して申し訳ありませんが、よろしくお願い致します。
お前無視されてるの気付けよ
>>729 先頭から順にセルに放り込んでソートで逆順にする。
732 :
726 :2007/04/16(月) 02:25:59
>>731 なるほど、一度ファイルを全部読み込む必要があるのですね。
教えていただいてありがとうございます。
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で参照するとか
736 :
734 :2007/04/18(水) 20:39:08
>>735 ちょうどさっき、同じことを思いついたので、とりあえずそうしてみました。
一応何とかなりました。
セルに書き込み&読み込みする際、一瞬フォームがちらつくのが少し気になりますが、
簡易計算機がついたみたいな感じで、だいぶ便利になりました。
インタプリタ式の言語なので、文字列を式として評価するような関数は
わりと簡単に実装できるように思うのですが、本当に無いんでしょうかね。
それとも誰かが既に、同様のモジュール作ってたりとか。
作れ てかセル使ってやればいいじゃん
あひゃ、終わってたか
> それとも誰かが既に、同様のモジュール作ってたりとか。 作ってあるよ、MSが。しかもWindows(98以降かな)に標準で入ってる。 VBAの言語自体には直接組み込まれてないけど、VBAからすぐ利用できる状態になってる。
740 :
734 :2007/04/18(水) 21:07:35
>>739 あッー
ひょっとして"EVALUATE" ?
ワークシート関数を呼び出すやり方で使えるかも!
たぶん解決しそうです。
741 :
デフォルトの名無しさん :2007/04/20(金) 14:36:21
>>739 興味あるので詳しく
スクリプティングホストかなんかか?
すみません。 アドオンの作り方を詳しく説いたサイトとか書籍はありませんか? VC++,VB問いません。
ExcelのアドインをVBAで作る話ではなく、 VBEアドインをVC++,VBで作る話か? だとしたらスレ違いっぽいな。
744 :
デフォルトの名無しさん :2007/04/20(金) 22:19:51
あげ
746 :
デフォルトの名無しさん :2007/04/20(金) 22:29:07
えっ、何も発言してないのに
>>747 自覚してるから、わざわざそのタイミングで書き込んだんだろ?
CreateObject("ScriptControl")
751 :
デフォルトの名無しさん :2007/04/22(日) 12:51:13
Function,Subで2次元、3次元などの配列を引数とすることはできますか。 ちょっと試しにやってみたレベルではだめでした。
多次元配列を引数で渡すことも、戻り値で返すことも出来ますよ。 「ちょっと試しに」ではなく「真面目にきちんと」やってみましょう。
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 お手数をおかけしますが、なにとぞご教示ください
シャットダウンの権限を取得してシャットダウンを行うようなAPIをつかってはどうか?
ans=Application.ExecuteExcel4Macro("2*5+10")
Shell "shutdown.exe"
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,"りんご")]) これが限界で・・・
どうなればいいのかよくわからんが セルの関数だけでは複雑すぎるような
単純にA列には「八百屋」、C列に「りんご」と入った時だけカウントする っていう意味と違う?
761 :
一般人 :2007/04/22(日) 20:26:02
デフォルトの名無しさん おっしゃる通りです・・・大変申し訳ありません。。。 そういったことは可能でしょうか?
>>758 D1=SUMPRODUCT((A1:A4="八百屋")*(C1:C4="りんご"))
そういや、ここVBAのスレじゃないの?
WordやPowerpointじゃVBAの活用ポイント思いつかんからなぁ
んー関数の質問ならありかと思ってる
まぁ
EXCEL や VBA の教えてスレ
と捉えれば
>>765 に賛成できるおれが登場
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
スマソ、真中のところ以下に置き換え願います・・ 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
>>758 あっしならピボットテーブル使う方向で考えるだす
>>769 そこをあえてVBAでやるのが静かなブーム
>>762 768じゃないけど感動。
SUMIFの代わりに最適だ。
そんなイカした兄貴に質問があるっす。
A1に、[ブック名]
B1に、シート名!
C1に、A2:F5000
と入力されているときに
SUMIFとかの範囲指定で、
=SUMIF(A1&B1&C1,"=hoge",F2:F5000)
とするとウマク動きません。
シート名をセルから参照する方法を教えてくださいーっ
調べてもわからないから自作したんだけど
遅すぎて話にならないです
772 :
771 :2007/04/24(火) 12:37:56
事故解決。 INDIRECTでおk VBAでWorkSheetFunction使ってたのがアホらし。 次からは良く調べます
特定の文字列以外のセルを 全部消去
リストボックスについて質問です。 リストボックスに表示される文字列の右側を表示したいのですが、 リストボックス以上の文字列の長さを設定すると、右寄せにならずに途切れてしまいます。 そこで、ColumnWidthsをいじって水平スクロールバーを出して全体を表示させたのですが、 これだと、自動でスクロールバーを動かさない限り右寄せで表示されません。 スクロールバーを表示させない状態で文字列の右側表示が可能なのか? または、VBA側でスクロールバーを右側に設定できるものなのでしょうか?
>>775 ListViewって.Netでしか使用できないコントロールですか?
Excel2003 VBAでも使用できるものでしょうか?
> ListViewって.Netでしか使用できないコントロールですか? いいえ > Excel2003 VBAでも使用できるものでしょうか? 使用出来るように出来ますよ
横槍入れると CommonRuntime のコントロールを追加する でよかったけ?
大変初歩的な質問で申し訳ないのですが、 VLOOKUP関数で得られた数値をSUMで合計しようとした場合、 全てのVLOOKUP関数で数値が得られないと「#NA」のエラーが でてしまいます。 VLOOKUPで得るセルの個数は場合によって違うので、 SUMでは、「=SUM($A$1:$A$500)のようにしているのですが、 たとえば、VLOOKUPのセルが200個くらいでもキチンと合計を出してくれる 方法はないでしょうか? またスレ違いでしたら該当スレへの誘導をお願いします。
sumif(...,">=0")でどう?
自己解決しました。 すみませんでした。
>>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
はじめまして。質問させてください。 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 で、コピー元にボタンが含まれるとき、ボタンはコピーせずにすませたいのですが どうするのがいいんでしょ?
A1 Resizeするなり、Range内でRows使うなりお好きなように。 A2 普通にやればいいじゃん。普通のやり方はググってね。
789 :
787 :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がちょっとわかりません。キーワード等、いまひとつヒントをいただけるとありがたいのですが。
形式を選択して貼り付け→値を選択して張り付けたらボタンはコピーされんかったけど それをマクロにしても駄目なん?
791 :
787 :2007/04/30(月) 21:07:03
お騒がせしてすみません、なんとなく自己解決できた模様。
[フォーム] ツールバーでワークシートに貼り付けたボタンはセルと一緒にコピーされてしまいますが、
[コントロールツールボックス] ツールバーで貼り付けたボタンはコピーされないようです。
後者のボタンを使うことで、目的が達成できました。
両者の違いはこれから勉強します…が、常識ですかそうですか_| ̄|○|||
>>790 質問が舌足らずでお手間をとらせてしまい申し訳ありません。
実は >787 の Q2 は、Q1 でやりたかったことと関係してまして、
行まるごとコピーしたとき、その行に含まれてるボタンまで
コピーされてしまうので、それを防ぎたいということだったのです。
「形式を選択して貼り付け」ですと、行の高さがコピーされませんよね。
>>792 dクス。そうでした(ていうか素で >789 な宣言でいいと思ってた)_| ̄|○|||
質問 会社からVBAを覚えろ って言われたのだが PC知識がまだまだ未熟な俺どうやって覚えればいい? 初心者はこれを勉強しろ って物や 覚える順序を 教えてほしいのだが
マクロ記録とヘルプ
796 :
デフォルトの名無しさん :2007/05/01(火) 13:09:50
>>794 キーボードが打ててマウスが使えりゃPC知識はどうでもいい。
"VBA 講座"でGoogle検索してサイトをじっくり覗いてみて、
理解できる文章が0というなら本でも買えボケ。
Access VBAプログラミング開発工房 入門・基礎編 - 緒方典子
かんたんプログラミング Excel2003 VBA 基礎編 - 大村あつし
この辺り、Amazon検索すりゃすぐ出る。出来るなら立読みして読み比べた方が良いぞ。
解からないことがあったら辞書引くだろ?
同じようにPCならヘルプを見るかググれ、ヘルプの見方は使って覚えれ。
俺も関数辞典かわないとな
質問よいかしら。 Button1_Click() → Sub1 → Sub2 → Sub3 というふうに、サブルーチン(関数でもいいが)の中からサブルーチンを呼んだとします。 その先から一気に Button1_Click() を終了させる手段ってあります? イメージとしては、Perl の die 関数みたいに、(エラー)メッセージを表示して、 手軽に終了するルーチンが作りたい or 欲しい。
dao360を使ってMDBに接続してdbの内容をセルに表示しているのだが vistaではうまく表示できない場合があるらしい その環境が手元にないので 検証できないのだが 自分のVISTAの環境では正常動作していた。 vistaというかofficeのバージョンのような気もする。不具合は2007で発生。 具具って見たもののいまいちなので質問させていただきます。
>>799 自己レス。
いろいろググって
Sub die(msg As String)
MsgBox msg
Call Err.Raise(Number:=vbObjectError + 9999)
End Sub
という方法を見つけたけどこれはダサい。
もっとましな方法(せめて、Raise したとき出るダイアログボックスに msg を出させるとか)ないですかね…
die 呼び出し元のソースファイル行が表示できれば完璧なのですが…
まあデバッガで呼出元すらたどれないぐらいだから
803 :
800 :2007/05/01(火) 15:35:25
>>800 オイラも自己レス ADOバージョンを作ることにします。
>>799 戻り値をbooleanにした関数にするっていうのは?
グローバル変数をサブルーチンで書替えて知らせるというのは?
ちらっと思ってみただけだからあてはまるかどうかわかりませぬ
では
>>803 >戻り値をbooleanにした関数にするっていうのは?
>グローバル変数をサブルーチンで書替えて知らせるというのは?
これらの方法も、他に手段が無い場合は大いにアリかとは思いますが、
呼び出し元での IF 文は極力無くしたいのです。
一番スマートなのは die() の中で例外をスローすることかもしれんが、
VB.NET ではできて VBA ではできないっぽいorz
805 :
デフォルトの名無しさん :2007/05/01(火) 16:00:19
Endコマンドと変わらんやん
806 :
799 :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
エクセルで作成したあるフォームが用意されていまして、 それに対する解答の入力漏れを防ぐために関数か入力規則などを 使用してカーソルを先に進めなくする方法があるものかと思いまして。。。
適当にIF文でセルの文字チェックすればいいんじゃね?
811 :
デフォルトの名無しさん :2007/05/01(火) 18:51:26
エクセルのセルだと抜けるときが感知できないから コントロールのテキストボックス使わないとできないな 入力漏れを防ぐ目的なら条件付書式で空欄ならバックを赤くするとかでいいと 思うけど
>>809 SelectionChangeイベント拾って判定すれば?
あフォームか。失礼
質問者 >809 が、「(ユーザー)フォーム」というマイクロソフト用語を正確に使ってるかどうか。 「エクセルで作ったフォーム」じゃ、ワークシートのつもりで言ってる可能性がある。 ていうか、「セル」と言ってる時点で多分後者っぽいので、>812 で正解な希ガス
815 :
814 :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 で出てきたイベントハンドラ。 これで、どすかね。
816 :
814 :2007/05/01(火) 20:56:14
失礼、日本語の読み落としが多いな漏れ、、 >815 のコードは、「空欄がある場合に、先に進めなくする」だけでエラー表示しません。 「空欄がある場合に、エラー表示を出して先に進めなくする」 には、コードの上から 6 行目“rLastRange.Select” の直下にエラー表示のコードを追加するといいと思います。 適宜改良してください。
817 :
デフォルトの名無しさん :2007/05/01(火) 22:06:07
807です。レスが遅くなりスミマセン。。 質問のご解答をいただいた皆々さま、アドバイスありがとうございました。 自分でこれから色々試してみます。助かりました〜。
818 :
814 :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 スレ違いです。VBAとはVB言語でApplication(Excel)を操作するからVBA。
Excel付属のVBE使っても、Excel自体の操作以外はVBAではなくVB6の分野。
>>819 プリンタに直接データを送る方法も知ってるけど、
そんな質問をしてしまうあなたには
「印刷用のシートを作ってそれを印刷してそのシートを消す」
って方法をオススメしましょう。
825 :
819 :2007/05/08(火) 05:34:07
>>820 VB6でやった方が簡単なのはわかるのですが
会社でプログラムをいじれない(VB6を入れれない)ので
エクセルVBAで処理してます。エクセルならどのPCにも入ってるので
>>821 印刷用のシート作ったほうが簡単そうですね。
プリンタにデータ送るのは、シーケンシャル出力ですか?
826 :
デフォルトの名無しさん :2007/05/08(火) 07:57:02
Excel2007にはVBAついてないって本当なの? なんでもいじろうと思ったら、ヴィジュアルスタジオツールキットっていう馬鹿高いソフトが別途必要とか。 VB.NETもしくはC#が使えるそうです。
>>825 APIでPrintDlgかCreateDCで hDCを取得して GDI で描画したいって事?
>>826 むしろその情報が何処から出てきたのかkwsk
830 :
819 :2007/05/08(火) 15:41:32
>>828 ただの数値データなんでふつーに印字できればいい程度です
ちょっとAPIでやってみます
831 :
デフォルトの名無しさん :2007/05/08(火) 19:24:30
"100"ごとに桁をかえないで、"60"ごとに次の桁へかえられるようにグラフ設定をすることは可能ですか?? 時計と同じく60進数で。。。 857、858、859、900、901、902ってな感じでグラフを作りたいのですが。。。
>831 マルチかな?
>>833 831は表現が中学生だもんな
十分ありえる
835 :
デフォルトの名無しさん :2007/05/09(水) 09:12:35
>>834 ぼくすっごいどういだよっ?
60しんすうくらいじぶんでなんでかけないんだろ
しょうがくせいいかののうみそのやつはしねよ
ある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に含まれないということの区別をしたいのですが・・・ よろしくお願いします。
>>836 Set rng = Intersect(rng1, rng0)
じゃいかんの?
重複部分のRangeが戻るから後はお好きに。
てかそれ系のオブジェクト操作はmougが秀逸だよ。
プログラムなど学んだ事のない初心者です。 VBAを使えるようになりたいのですが、初心者にお勧めの 学習用の本ってどんなのがありますでしょうか?
>>837 教えて下さってありがとうございます。
>てかそれ系のオブジェクト操作はmougが秀逸だよ。
モーグを見てもrangeオブジェクト操作関連らしいの分からなくて、、、(汗
>>838 大き目の本屋に行って何冊か立ち読みして気に入ったモンを買う。
それぐらいの手間はかけろ
VBAでIF(OR(A1={1,5,10}),"yes","no")と同じような記述の仕方があったら教えて下さい。
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 とか
VBAでは1行で済ませられないでしょうか?
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 とか
文字列中に、特定の語句があれば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
でいいんじゃ?
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) とか
((varA1 = 1 Or varA1 = 5 Or varA1 = 10) +1)
>557 AddLineと名前の変更を分離した方がいいは思う。
短くなるもんだなw
852 :
デフォルトの名無しさん :2007/05/12(土) 16:22:04
VBAのソースなんて保護する値打ちないだろ
855 :
852 :2007/05/12(土) 19:05:32
856 :
852 :2007/05/12(土) 19:19:01
強制解除されたときに自分のソースを消すようにプログラム書いておくことは可能?
854じゃないけど、仮にVBAのパスワード保護が有効に働いたとしても
エディタ等で開けばそれなりにソース見えちゃうからね。
たまにパスワードが平文で埋まってたりするけど。
余計な世話だったらスマン。
>>857 つコピー・マクロ無効
いい問題集とかない?
テキスト形式で数十万行になるファイルから、そのテキスト内の特定のキーワードから決まった相対位置にある 数字を抜き出すにはどうしたらいいでしょう?
861 :
デフォルトの名無しさん :2007/05/13(日) 01:56:23
>>860 Instr関数を繰り返し使ったらいけないの?
てゆうか、数十万行になるテキスト形式ファイルってEXCELで読めないんじゃないか?
Excel2007は行数制限が緩和されてまふよ。
糞でかいファイルは素直に2007使え 処理速度とか上がってるし快適だぞ
2007すごいよな。UIのなれは必要だけど、 100M超えても平気で動くし、ファイルも小さく圧縮がかかる。 正直戻れません。
866 :
デフォルトの名無しさん :2007/05/13(日) 14:27:39
>>864 処理速度上がってるか?
テストしたら全面的に遅くなってるが。
同一環境で2003で作ったマクロ。 2003の場合、10秒 2007の場合、13秒(2007形式に変換) 処理速度は多少遅くなってる。 それより大量のデータを扱っても壊れないほうが大事
868 :
http://dhcp180-87.tamatele.ne.jp.2ch.net/ :2007/05/13(日) 18:11:54
guest
なんで唐突に節穴ってるんだw
870 :
デフォルトの名無しさん :2007/05/14(月) 12:54:48
エクセルについての質問です。 A1:A5などの複数セルのなかで、 特定の文字列が含まれている(例セルがABCで、Aが含まれてる)セルを調べるにはどのようにすればよいでしょうか? COUNTIFをつかうと=でしか調べられません…。 どなたかご教授願います。
>>870 ここはプログラム板です。
VBAでやりたいのなら質問をどうぞ。
そのセルを調べてどうしたいの?
うるせえな、聞かれた事に答えろよ。 答えられないなら黙ってろ。
ヒ宴g:●□△ド◎▼ド
関数の質問はありだと思うな 俺の知識ではVBAでやれとしか胃炎
>>870 ピント外れかも試練が・・・。
B1=IF(ISNUMBER(SEARCHB($C$1,A1,1)),ADDRESS(ROW(A1),COLUMN(A1),4),"")
C1=探す文字
探す文字が含まれたセルの隣にセルのアドレスが表示される。
>>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
>>870 検索条件の文字列をマスク文字で囲んで使う
*A*
根本的な事を教えてください。 標準モジュールを呼び出すにはどうすればよいのでしょうか? 標準モジュールに ---------------------------- Sub test() MsgBox "TEST" End Sub ---------------------------- そしてコントロールボックスなどでボタンを配置して クリックしたら --------------------------- Sub onclick_B01() End Sub --------------------------- というのを考えています。
879 :
デフォルトの名無しさん :2007/05/16(水) 20:38:28
Call test とか Call onclick_B01 ってこと???
もしかして・・・ Sub onclick_B01() call test End Sub これか??
Callでいいんですね。 根っからのシステム管理やネットワークがメインで 単純な関数しか作らなくて標準モジュールを使った無かったもので。 今までは同じ関数を使う場合、同じソースをコピペしてました。 これでADとExchangeのデータをODBCでひっぱってきて表示することができそうです。 今は毎回標準モジュールのソース開いて実行でテーブルを作成していました。 ありがとうございました。
882 :
デフォルトの名無しさん :2007/05/16(水) 20:55:59
いや・・・
>>879 で言いたい事が今一歩わからなかったんエスパーレスしてみただけなんだが・・・
>そしてコントロールボックスなどでボタンを配置して
>クリックしたら
>---------------------------
>Sub onclick_B01()
>End Sub
>---------------------------
>というのを考えています。
例えばこれだけど クリックしたらこの関数を呼ぶって事?
それだったとしたら、ボタン貼り付けて、デザイン時にそれをダブルクリックすればその関数にいけるんだけども・・・・
ちょっとピンポイントでこれだ!!っていう理解が難しい文章だったもんで・・・
確かにエスパーてきな質問でした。 真ん中に標準モジュールの関数を書けばよかったです。 実際 Sub onclick_B01() Test() End Sub と書いた動かなかったもので。はじめからこう書けばよかったです。
884 :
デフォルトの名無しさん :2007/05/16(水) 21:14:20
>>883 onclick_B01
とかってなったっけ?
ボタンがB01でクリックした時に呼ばれるなら
sub B01_Click()
test
end sub
になると思うんだが・・・
俺もクラスモジュールはともかく 標準モジュールの概念がさっぱりわからんかった ヘルプにも満足に書いてないし。This Workbookと何が違うねん ま、今でもわからんが
つまり全部標準モジュールに書いておいたほうがよくね?
基本的に使いまわす関数をモジュールにまとめちゃおうって概念じゃね? 本当はスコープレベルがWorkBookとかだと Private Hoge モジュールだと Public Hogehoge() てな感じに分けて使うもんだとは思うんだが・・・ ぶっちゃけWorkBookもインスタンス化されたクラスだから モジュールと同じようにかけちゃうけどさ
標準モジュールが標準なの でもフォーム、シート、ワークシートのコードモジュールだとmeとか 便利なオブジェクトが使えるしね 標準モジュールでできないのは基本イベント関係ぐらいだろう
あと、インスタンス化できないくらいかな?
実は出来ないこともないんだけどね ただ、インスタンス化したかったらクラス使えばいいだけなので、 誰も面倒なことまでして標準モジュールのインスタンス化なんてしないだろうけど
まぁモジュールって特殊なクラスだからね あながちインスタンス化できない(つうか、モジュールはしない するならクラスにするだろう)つうのも間違いじゃないと思う
Worksheet_Calculateを設定していると動作が極端に重くなるので 一時的に Worksheet_Calculate停止し、処理の重いマクロを実行し、 その後、再び Worksheet_Calculateを再開したいのですが それは可能でしょうか?
マクロ実行判定フラグで以降の処理に行かないようにすれば?
話が噛み合っていない希ガス。
>>894 できないと思ったから次善策書いたんだが的外れ?
EnableCalculation=false マクロ実行 EnableCalculation=true でいい気ガス
>>897 これでokでした
ありがとうございました
セルに文字列9012345678が入っています 09012345678 に変換したいのですがどうしたらいい?
表示形式を00000000000に 表示形式を文字列にしてから"09012345678"を代入 "'09012345678"をValueに代入 "=""09012345678"""をFormulaに代入 どれでもお好きなように
>>900 サンクス
>>表示形式を00000000000にって
どうやったらできますの?
変数宣言と同時に初期化できますか?
904 :
デフォルトの名無しさん :2007/05/18(金) 00:21:42
>>901 セルの書式設定のユーザ定義で。
>>902 VB.NETならできるけど、VB6ベースのVBAは無理。
てことで903と同じ答えだった…
905 :
902 :2007/05/18(金) 00:33:24
同時は無理だけど、同行は可能 Dim x : x=1
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を動かす方法はありますでしょうか? 何か良い方法がありましたら教えてください。
>>909 OnTime再帰で監視
これでわからなければ君がこれに手を出すのはまだ早い
解るようになるまで精進してから出直そう
911 :
デフォルトの名無しさん :2007/05/18(金) 21:24:33
>>910 わかりました。
やっぱりそれしかないですねorz
>>909 連携って何のことかわからないけどアクセスとかで
xlsファイル変更してるのなら変わらなくて当然だよ
ole経由なら変更されると思うが
913 :
デフォルトの名無しさん :2007/05/18(金) 21:33:38
>>912 こう言う場合、ontime以外に何か良い方法はあるんでしょうか?
できればリアルタイム(値が変わったらすぐ)、処理させたいので。
>>909-913 Worksheet_Calculate()でできるが
引数にTargetがないから工夫がいるよ。
回答に対するレスに orz とか使う奴ってどうよ? これって「お前の回答には失望した」って意味じゃん。例えそのつもりが無くても、実際はそう受け取られるし。 たとえ望み通りの回答じゃなかったとしても、こういうの使わないのがマナーだよな。
ms単位で監視したいならDoEventsかSleepでも回してイベント作れば? 何がしたいのかわからん。
918 :
909 :2007/05/18(金) 21:45:20
>>914 >引数にTargetがないから工夫がいるよ。
すいません、具体的に工夫したらいいのか、分りません orz
HPでもいいんで教えてください。
>>915 値が変更しても、変更された事にならない場合(この場合、アクセスと同じケース?)です。
一回関数に渡したらどうよ?value()とか
920 :
909 :2007/05/18(金) 21:49:07
>>916 すいません、そう言う意味ではなくて
「私の力が及ばなくてすいません or 私の実力が足りなくて分らない」って意味です。
>>918 アクセスなら無理
まあアクセスもVBA使えるから回りまわればできるけど
アクセスとエクセルで連携とか言ってる意味がわからない
922 :
914 :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で切り替える。
で対処できる。
他にも問題があるかもしれないが、それはやってみないとなぁ
複数のApplication.OnTime TimeValue(指定時刻)と Application.OnTime nextTime って同居可能ですか?
924 :
デフォルトの名無しさん :2007/05/18(金) 23:57:03
教えて。 自宅のPCが2003対応なんだが VBA2002の緑本とかピンク本のCDは ワークするの?
まあ全然動かないってことはない
926 :
デフォルトの名無しさん :2007/05/19(土) 02:19:15
>>925 多少、動きがおかしいのでしょうか。
試験対策を上記条件で立てるのは厳しいですかね?
2002から2003への変更点について調べて、それを承知の上で使う。
928 :
デフォルトの名無しさん :2007/05/19(土) 12:21:15
ありがとう
929 :
デフォルトの名無しさん :2007/05/19(土) 22:29:20
VBAで色を自由に変更することはできないんでしょうか? というのもどのサイトを見ても色の指定がColorIndexだけのようなので ほかの色が設定(RGBとかで自由に)できないのかな?とおもいまして・・・・
ColorIndex知ってるならColorだって出てくるだろ。。。
colorプロパティってなくなってるの?
>>929 RGB(red, green, blue)
で0〜255を指定する。
詳しくはHELP引いてくらはい。
>>931 >>932 遅くなりました
いけました〜!!
ARGBが使えないのはちょっとあれですが・・・
目的は達成できました!
ありがとうございます!!
934 :
デフォルトの名無しさん :2007/05/20(日) 13:37:38
すみません、知っているかたがおられました教えてください。 いま、フォームにテキストボックスコントロールがあるとします。 そのとき、引数としてテキストボックスコントロールを渡したいのですが、 それをやるとエラーになります。 つまり、 Sub setObject(pObj as TextBox) End Sub といったプロシージャーに、 setObj textBoxControl のようなコールをすると、型が一致しないとのエラーに なります。 型指定しなければ大丈夫みたいなんですが・・・ すみません、よろしくお願いします。
まさに渡している物の型を間違えてるんじゃないかと
936 :
デフォルトの名無しさん :2007/05/20(日) 15:30:49
>>935 それが、pObj as TextBoxにFormに張ったテキストボックス
コントロールを渡しているんですが。
もしかして、テキストボックスコントロールってTextBoxでない?
937 :
934 :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関数で、数値か文字か判断して、 文字だったら入力やりなおしで、 数値だったら型変換すればいいんじゃないかな〜
そういうの考えるのが面白いと思うんだがなあ いろんなやり方あるけど 俺なら前回までに入力した文字列に今回入力した文字をくっつけて その値が数字かどうか判定するやりかたかな
同じご意見の方がいらっしゃいましたorz
キー入力式ならそれでもでいいが、コマンドボタン式なら 小数点ボタンにInStrとかで既に入力した物に "."が含まれているかいるか否かを判断する機構を組み込んだ方がいいな
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つ出る。 重複を許さないとなると、見つかった語句を配列に入れて、重複がないか 調べてからセルに表示とかになるかな。
単純な問題だけど、美しい方法はどうだろな。 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使うのがお手軽。
950 :
947 :2007/05/23(水) 20:49:30
あ〜、Collection使えばいいのか。参考になったわ。 でもVariantか〜。VB.NETを使ってるとそんな便利(?)なもの消えてるからなぁ。
951 :
デフォルトの名無しさん :2007/05/23(水) 20:51:25
Collectionもいいが重複考えるならMicrosoftScriptingRuntime参照してDictionary使うとスマートじゃね?
952 :
949 :2007/05/23(水) 21:10:19
あ、これだと重複したら myClc.Add myVar, myVar でエラーになるか。 On Error Resume Nextする位ならDictionaryにしてExists使った方がスマートだね。 .NETかぁ、VBAはこの先どうなるのだろうね。
このままであって欲しい気もするし、.Netとの違いが拡大するのもなんだかなという気もするし。
フレームワークをも取り込んでしまうかもしれないよなぁ…・ VB6のVBAも残しつつ.NETのVisualBasic名前空間の一部を取り込んでそう
955 :
945 :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文字ずつの入力にするといいんじゃないでしょうかねえ。
960 :
945 :2007/05/24(木) 00:49:45
できました。 ありがとうございました。幸せです
文字列に " を含ませたい場合どう書けばいいのでしょうか。 MsgBox(" " ")←エラー
>>962 もう一つ"を重ねる。
ダブルクウォーテーション内のダブルクウォーテーションの表記は""
つまり、msgbox(" "" ")でおk
Excelのオブジェクトの絶対座標(画面の左上からの座標)をとる方法ってないでしょうか? Excelの基点と画面の左上の差が取れればTop、Leftでなんとかできそうな気がするんですがよくわかりません…
966 :
デフォルトの名無しさん :2007/05/25(金) 11:40:13
age
Excel.Application.Left Excel.Application.ActiveWindow.Left Excel.Application.UsableWidth 下や右にツールバーやステータスバー置いてなければ、この3つで出る
>>967 回答ありがとうございます。
Excel.Application.Left
がExcel本体の横位置で
Excel.Application.ActiveWindow.Left
がExcel内のファイルのウィンドウ位置で
Excel.Application.UsableWidth
がExcelの作業領域の幅
というのはわかりました。
ためしに最大化状態で見てみたらマイナスの値がかえってきました。
最大化だと0じゃない?
あと高さはメニューバーの分の差分はどうやって取れば良いでしょうか。
>>968 最大化だとMDIウインドウ枠が表示されないから、その分がマイナスになる
メニューバー等の分は、それを出すためにUsableWidthを使う
下や右にツールバーやステータスバー置いてなければ、Usableは
右下基準でのサイズになるから、逆算すれば右上位置が出せる
>>967 の時点で「下や右にツールバーやステータスバー置いてなければ」と書いたのに
それに対しては反応しなかったので、下や右に何か置いてるという情報後出しは却下ね
>>969 ツールバーやステータスバーを消すことで出来るなら消してしまおうと思いましたw
画面の横幅 - Excel.Application.UsableWidthでA1セルの左端のx座標になると考えていいんでしょうか?
他シートの参照方法についての質問です。 例えばG列にそのワークブックすべてのシート名一覧を作ったとします。 その一覧を用いて他シートを参照する方法を教えて下さい。 例として G1にワークシート名"AlphaSheet"があるとします。 そのAlphaSheetの$A$1を参照するとき 「='G1'!$A$1」のようにしてAlphaSheetの$A$1を参照することはできないのでしょうか? 直接「='AlphaSheet'!$A$1」と打つしかないのでしょうか? どうぞよろしくおねがいします。
タイプが面倒なら 逆にしたらどう シート名がGで一覧にAlphaSheetとか 最終的にシート名変えたら 自動で式のシート名も変わる シート名変更マクロ作ったら頻繁に変更することもできる
>>972 回答ありがとうございます。
それが、シート名が100を超える非常に膨大な量で、
シート名を簡単にしても、とてもじゃないけど手打ちができないのです。
それにひとつのシートから参照すべきデータが非常に多く、困っております。
そのため、シート名一覧を取得するマクロを作成し、
一覧を作るまではできたのですが、
そこから止まっています。
何とかできないものでしょうか?
>>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。 こういうことじゃなくて?
976 :
971 :2007/05/26(土) 04:59:46
977 :
デフォルトの名無しさん :2007/05/26(土) 09:22:44
>>976 975じゃ参考にならなかったかな?求められてるのがVBAなのか、こういうエクセル関数はないでしょうか、という
のかが分からないな。
でもサンプルシート見ただけでも、いろいろやってるのが分かるけど。
ワークシートの一覧をとるマクロ組めてるんだから、VBAでいいのなら、やれると思うけどな。
>>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氏を参考に。。。。。
979 :
975 :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
980 :
975 :2007/05/26(土) 10:02:30
これならシートの数が下に100個あってもいける。 具体的なことが分からないからなんとも言えないけど、関数でいけるところは 関数で、難しければVBAでというのを使い分けるといいよ。
982 :
デフォルトの名無しさん :2007/05/26(土) 10:24:39
983 :
975 :2007/05/26(土) 10:33:39
>>981 ,982
いや、あえてやるならということでやっただけ。
WorksheetFunctionも普通は使わないけど、説明のため。
もっとわかりやすい方法があれば、こっちが教えて欲しい。
>>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を使うか の違いだけであまりすることは変わってない。
>>985 さん
>984です。レスありがとです。
数える方法はワークシート関数しか判らないのです・・・。
Do〜LoopやFor〜Nextを使わない方法とか、もっと楽に出来る方法が在るんでしょうか?
987 :
デフォルトの名無しさん :2007/05/26(土) 11:57:44
VBAのスレでワークシート間巣を教えろとな!
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やメソッドは確実な動作が保証出来る使い方なら別に良いと思う。
>>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さん ほか判る方、お願いします。
>>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だと止まらずに結果が書き込まれます。
使えねえやつらだと思いつつ 捨てゼリフ残して去るほど厨房でもないので フェードアウトしたんだろう
995 :
992 :2007/05/26(土) 13:28:01
>>993 979の
Dim sheetCount As Integer 'ワークシートの総数。代入は省略
↑を見落としてるんだろ。
だから、試しに動かすのなら、SheetCount=3を入れてあげなきゃ。
そしたら動くよ。
まあ、989がベストアンサーか。
979は、汎用性を考えてH4〜H6に限らず、H7以降にもシート名が入っていることを
前提に作ったということかな。
>>995 さん
> Dim sheetCount As Integer 'ワークシートの総数。代入は省略
> ↑を見落としてるんだろ。
コメントに気付いてませんでした。。。
SheetCount=3
を追加したらサクッと動きました!!
勉強になりました。ありがとうございます。
でもなんでわざわざシート名の一覧を取得したりしてるんだ 単に全部のシ−トを処理したいならSheetsコレクションにFor Eachとか使えばいいのに 動作目的とかがよくわからん
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
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。