1 名前:デフォルトの名無しさん mailto:sage [2009/07/14(火) 19:07:54 ] ExcelのVBAに関する質問スレです 前スレ pc12.2ch.net/test/read.cgi/tech/1241885130/ ★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。 ★2 ExcelのVBA以外の部分に関する質問はNGです。 但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。 ★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。 VBAとは、『Visual Basic for Application』の略で Application ├Workbooks |└Workbook | ├Worksheets | |└Worksheet というApplication以下のオブジェクトを、VB言語で操作するものを指します。 例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、 セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。 ★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。 ★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。 ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。 ★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)
62 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 13:10:45 ] >>60 3連休中に機能の追加は諦めました。orz 今の知識では無理なので、もう一度本を見ながら基礎から覚えていこうと思います。 >>60 は参考にさせていただきます。 ありがとうございました。 対応できたら報告します。;
63 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 14:21:33 ] >>62 >>対応できたら報告します。; 要りません。
64 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 15:05:54 ] 確かに要らないなw 半月も弄ってれば大抵誰でも出来るようになる処理だし
65 名前:37,44,46,58,61 mailto:sage [2009/07/19(日) 20:03:10 ] >62 ユーザーフォームとかコンボボックスとか扱ってるレベルならわかってもらえると思ったんだけど・・・ 自分はコンボボックスとかラジオボタンとかまだほとんど使ったことがないorz
66 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 21:14:58 ] つーか、やりたいことがいまいち見えんw エスパーさんまとめてくれ。
67 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 21:35:01 ] えっと・・・いつも携帯から見てるんで控え目に発言してるんですけど・・・ 大の月とかなんとか↑で話題になってるみたいですけど 月末日は「翌月」の「1日」から1を引けば簡単に出てくるものと思ってましたけど・・・ 的外れな発言してたらすいませんおじゃましました・・・
68 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 22:27:41 ] 普通はそうするわな〜
69 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 22:38:36 ] まあその方法もありなんだが、一行でやろうとすると debug.print DateSerial(2009,12,0) で11月の末日がでる。
70 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 22:45:03 ] >>69 うぁお そんな裏技が! あまりに裏技すぎても思わぬバグがこわいけどこれは大丈夫なのかな?
71 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 22:56:32 ] ようするに、(2009,m+1,0)で当月の末日が出るってこと。うるう年とかわざわざ考慮する必要がない。 0日が使えるのと同じで、0月とか13月も普通に「前月」「翌月」として使うことができる。 さらにマイナスも使える。-1月は前年の11月になる。
72 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 23:04:20 ] >>71 試してみたらワークシートのDATE関数でも使えるのな(2007で実験) さすがエロい人はいるもんだ
73 名前:37他 mailto:sage [2009/07/19(日) 23:06:20 ] >67 その方法は知ってます。「OpenOffice.org 総合相談所 6」の420は自分なんですが、 翌月の〜ということは12月のときは1月のことになり、ややこしくなるので ループ内は一番単純なこの方法をとりました。 >69 >DateSerial(yyyy,mm,0)という指定もアリなんですか? こちらもmmは翌月のこと なので上と同じ理由で避けました。
74 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 23:09:02 ] 後だしみっともないからやめろよ。
75 名前:37他 mailto:sage [2009/07/19(日) 23:09:17 ] >71 アップ前にリロードしてなかった。月の部分は1〜12限定じゃなかったんですか。
76 名前:62 [2009/07/19(日) 23:13:52 ] 説明が分かり難くて申し訳ないです。。 やりたかったことは、ユーザーフォームのテキストボックスに入力した日付を コマンドボタンをクリック後に、日付の月から12月分までを月だけ増やしてSheet4に書き出したかった。 コンボボックスの月が9月10日ならコマンドボタンをクリック後に、 C22→9月10日 C23→10月10日 C24→11月10日 C25→12月10日 といった感じです。 で、日が31日の場合、2月や4月はエラーになる問題がどうするか保留です。 現在は、日付をテキストボックスではなく、コンボボックスを2個用意して、月と日を別で 入力する仕様で検討中です。 諦めた理由は別件で問題があったからです。 ユーザーフォームを開いたときに、↑でシートに書き出したデータが現在の月であれば Sheet1にコピーする方法が分からずに諦めていましたが、買物から帰ってきて、 ぼーっと本を見ていたら解決しました。。。下記コードでなんとかなりそうです。 If Worksheets("sheet4").Range("c22") <> "" Then For hi = 22 To 1000 If Worksheets("sheet4").Cells(hi, 9).Value = Month(today) Then With Worksheets("sheet1") .Range("c65536").End(xlUp).Offset(1, 0) = Worksheets("sheet4").Cells(hi, 9).Offset(0, -6).Value End With End If Next hi End If (実際のデータは日付だけではありません) これで分かります?
77 名前:62 mailto:sage [2009/07/19(日) 23:15:19 ] あら?なんか出る幕なさそうですね。。
78 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 23:18:02 ] >74 excel vba dateserial でググると最初に出てくる「田中亨のVBA基礎セミナー」他 いくつかみてみたけど、通常の範囲外の値を指定する裏技は見ませんでした。 よろしければ、この裏技を紹介しているウェブサイトを紹介してもらえませんか?
79 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 23:24:30 ] ワロタ
80 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 23:28:40 ] >>78 > よろしければ、この裏技を紹介しているウェブサイトを紹介してもらえませんか? あなたが今いてるここですよ。 色んな知識を持って回答してる皆さんに失礼がないかもう一度このスレを最初からご覧になってはいかがです? 別に私はあなたを排除するつもりはないのでそれなりの礼節を(たかが2ちゃんだからたいしたことないです)わきまえて質問を続けて下されば嬉しいですけどね
81 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 01:08:24 ] >>78 つか、Webにある情報だけが全てじゃないしw 実地で学んだことをここで吐き出してあげてんだよ
82 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 01:50:23 ] >>73 > 12月のときは1月のことになり 除余(Mod)使えば良いだけじゃん DateSerial(y + m \ 12, m Mod 12 + 1, 0) なんでこんな簡単なことが解らないんだ? 除余(割り算の余り)や整数商なんて小学4年生くらいのレベルだろ? 向こうの回答もその部分にバグがある内容だし
83 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 02:22:56 ] あんまゆとりをいじめてやんなよ
84 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 03:02:46 ] >>82 ぶつくさいいながらも使いやすそうなコード教えてくれるおまい優しいなw
85 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 08:47:21 ] vbaを使ってこんな悪いことしちゃいました、ってのがあったら教えてください
86 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 09:05:55 ] スレ違い
87 名前:デフォルトの名無しさん [2009/07/20(月) 17:22:16 ] winXP,excel97 ユーザーフォームに6個のオプションボタンを配置し、3つまで選択可能にしたいです これは可能なのでしょうか? できるなら、方法を教えてください プロパティをいじってみたけど上手くいきませんでした
88 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 17:32:04 ] グループ化 でぐぐれ
89 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 17:39:13 ] ・グループネームを全部違うのにして全部選択可能にする ・押された時のイベントで全部のボタン調べて3つ以上チェック入ってたらキャンセル でどうだろう コードはわかんね
90 名前:デフォルトの名無しさん [2009/07/20(月) 17:43:06 ] >>87 普通はオプションボタンは、一つを押すと他の唯一あるTrueの奴が消えることになる。 たとえば、 ○○●●●○ のとき、 一番左のを押すとどれをFalseにすればいいかわからないから、根本的に無理のはず。 やりたいなら、チェックボックス6個に Trueにしたときに、 それをあわせてTrueが3つになったらなら 他のFalseなチェックボックスを選択不能にする。 Falseにしたときに、 他のチェックボックスを選択可能にする。 的なことを書けばいいと思う。
91 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 17:46:44 ] >>85 たとえば暇つぶしに作った業務システムが知らないうちに改修されてて、 コメントしたアニメセリフとかエロ話とか上司の悪口とかを書いてて、 しかもそれが削除されないまま全社配布されたとかそんなの?
92 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 17:48:09 ] オプションボタンを1フレームごとに配置するとかだな? フレームの非表示って出来たっけ
93 名前:デフォルトの名無しさん [2009/07/20(月) 18:03:36 ] >>49 これを使わせていただきます。 コードが1/3以下になりました。 他、レスしてくれた方もありがとうございました。
94 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 18:08:01 ] >>92 プロパティのvisibileをfalseにすれば良いんじゃね?
95 名前:87 mailto:sage [2009/07/20(月) 18:24:56 ] みなさんレスありがとうございます グループ化を試してみます 無理なら>>90 の案を試してみます
96 名前:デフォルトの名無しさん [2009/07/20(月) 20:58:53 ] Windows XP X64 Excel2003 を使用しております。 エクセルにボタンを追加して、 Sub Botton_Click() 'Book1を開く Workbooks.Open "C:\Book1.xls" 'Book2にあるSheet1をBook1のSheetにコピー Workbooks("Book2.xls").Worksheets("Sheet1").Copy _ After:=Workbooks("Book1.xls").Worksheets("Sheet1") End Sub といった感じにボタン押下時に別なブックにシートをコピーしたいのですが 「インデックスが有効範囲にありません」 というエラーが出てしまいます。 VBA初心者で初歩的な質問で申し訳ありませんが、どのようにすれば宜しいでしょうか?
97 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 21:10:08 ] コピー先のシートをactivateしてみるといんじゃね
98 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 21:28:31 ] >>97 アクティブにするのを見落としてました・・・ ありがとうございましたm(__)m
99 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 21:38:55 ] シートのコピーとか確かActiveでなくても普通にできた気がするから釈然としないけどそれで解決したんならいいのか・・・ Book2.xlsが開いててシート名も間違いなければそのままでなぜ駄目なのか?
100 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 21:47:43 ] Workbooks.Open "C:\Book1.xls" でBook2が非アクティブになったためか、 Workbooks("Book2.xls").Worksheets("Sheet1").Copy _ After:=Workbooks("Book1.xls").Worksheets("Sheet1") Sheet1が2つあるためか
101 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 23:37:54 ] 環境 ・WindowsXp ・Excel2003 sub 修正() On Error Resume Next Dim i as Integer For i 136 to 140 step 1 If Range("AT7").value=Range("C"&i) then Select Case Range("AT7").value Case "お菓子" Range("AT7").Activate Activecell.offset(-43,-4).Activate ←ここでB6がアクティブにならない Activecell.value="お菓子購入" End Select End If Next End sub 上記のコードで矢印の部分「Activecell.offset(-43,-4).Activate」でB6がアクティブにならず、 AT7がアクティブのまま「お菓子購入」が入力されてしまいます。何が原因でしょうか? すみませんがよろしくお願いします。
102 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 23:58:26 ] わからんがとりあえずOn Error Resume Next を外せばデバッグしやすいんじゃね
103 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 00:00:05 ] あーわかった Activecell.offset(-4,-43).Activat にしてみ
104 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 00:15:04 ] AT7からB6なら ActiveCell.Offset(-1, -44).Activate だな
105 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 00:17:38 ] >>102 参考書に書いてあったのでよく分からないままいつも使ってたんですが 初心者はあまり使わないほうがいいんでしょうか? >>103 >>104 ありがとうございます。RowとColumnを逆にしてたんですね。初歩的なミスで質問してしまってすみませんでした
106 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 00:26:19 ] vbに限らずgoto系は使わんほうがいいらしいぜ
107 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 01:20:19 ] >>105 もう見てないかもしれないけど「Activate〜Active」とか「Select〜Selection」が並んでいた場合は 1行にまとめて書けることが多い。 Range("AT7").Activate Activecell.Offset(-1, -44).Activate Activecell.Value = "お菓子購入" ↑この3行は1行にまとめられる。↓ Range("AT7").Offset(-1, -44).Value = "お菓子購入"
108 名前:デフォルトの名無しさん [2009/07/21(火) 13:36:15 ] 現在Excelでソルバーをマクロで操作するプログラムを作っています。 Sub ソルバーループ() With Worksheets("jack") For i = 1 To 10 With Worksheets("jack") Solverok setcell:="$E$1", MaxMinVal:=2, ByChange:="$A$2:$D$2" ‘目的セルをE1として、その最小値を求める。変数はA2:D2。 SolverAdd CellRef:="$F$1", Relation:=1, FormulaText:="$G$1" SolverSolve Userfinish:=True SolverFinish KeepFinal:=1 Worksheets("Sheet1").Cells(i + 0, 5) = Worksheets("jack").Cells(1, 5) Worksheets("Sheet1").Cells(i + 1, 1) = Worksheets("jack").Cells(2, 1) Worksheets("Sheet1").Cells(i + 1, 2) = Worksheets("jack").Cells(2, 2) Worksheets("Sheet1").Cells(i + 1, 3) = Worksheets("jack").Cells(2, 3) Worksheets("Sheet1").Cells(i + 1, 4) = Worksheets("jack").Cells(2, 4) End With Next End With このプログラムのなかの SolverAdd CellRef:="$F$1", Relation:=1, FormulaText:="$G$1" という制約条件で、$G$1 を $G$10 まで変化させていき、各制約条件ごとに一つずつ 結果をワークシートのsheet1に書き込んでいきたいのですが SolverAdd CellRef:="$F$1", Relation:=1, FormulaText:="$G$1"の部分に どのようにして i を組み込めばいいでしょうか? ほんの少しのヒントでも非常に有難いので、お力添えくだされば幸いです。 皆様お忙しいでしょうが、どうぞよろしくお願いいたします。。。
109 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 13:43:38 ] ア
110 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 15:27:22 ] Excelで選択したセルの端をドラッグすると切り取りと張り付けになると思うんですけど この機能自体を使用禁止にすることって出来ますか?
111 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 16:21:06 ] >>108 &
112 名前:デフォルトの名無しさん [2009/07/21(火) 17:13:53 ] すみません質問です。 C列に"abc"という文字列があった場合、その行全体を削除し 上に詰めるというマクロを組みたいのですが どなたか教えていただけますでしょうか。 尚、オートフィルタを使わないやり方でお願い致します。
113 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 17:23:40 ] 上? 左じゃなくて?
114 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 17:28:01 ] >>112 1.C列に文字列abcがあるなら行削除 2.配列に
115 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 17:30:25 ] とりあえず4000行見るマクロ Sub aaa() For a = 1 To 4000 If Cells(a, 3) = "abc" Then Rows(a).Delete shift:=xlUp Next End Sub
116 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 17:39:44 ] >>112 Sub a() For r = ActiveCell.SpecialCells(xlLastCell).Row To 1 Step -1 If Cells(r, 3) = "abc" Then Rows(r).Delete Next End Sub >>115 上からだとabcが連続していた時に消えない
117 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 17:41:30 ] >>115 これだと2行つづいて"abc"があった場合抜けてしまわない? オートフィルタを使った方法を教えて欲しい
118 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 17:47:51 ] オートフィルタはabcが隠れるだけで本当に消えるわけじゃないからなあ
119 名前:デフォルトの名無しさん [2009/07/21(火) 18:11:41 ] >>108 そんなの余裕だろうが。 SolverAdd CellRef:="$F$1", Relation:=1, FormulaText:="G(1+i)" で一発だ。
120 名前:108 [2009/07/21(火) 19:24:43 ] >>109 ,>>111 ヒントをどうもありがとうございます。 ただ、&の意味がわからないのですが、どういうことでしょうか? $だと固定だから&にしろということでしょうか・・・? 無知ですいません。
121 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 19:30:31 ] >>120 "$G$" & i &は文字列の結合
122 名前:108 [2009/07/21(火) 21:36:02 ] >>121 無事プログラムがうまく動きました! どうもありがとうございます!
123 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 21:38:52 ] Dim 日数 As Integer Dim 本日 As Date 本日 = Date 日数 = DateDiff("d", "2009/7/10", "本日") とやったところ、型が一致しませんとでます。 本日までの日数を求めたいのですがどうすればいいのでしょうか?
124 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 21:44:33 ] Excel立ち上げず書いてるからおかしかったら突っ込みよろしく >>117 sub オートフィルタを使った方法() Dim 元シート as WorkSheet,作業シート as WorkSheet Set 元シート=ActiveSheet 元シート.Copy Set 作業シート=ActiveSheet 作業シート.Range("C1").AutoFilter 1,"<>""*abc*""" 作業シート.Cells.SpecialCells(xlCellTypeVisible).Copy 元シート.Cells. 作業シート.Parent.Close False End sub
125 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 21:47:28 ] >>123 "本日" w
126 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 21:47:51 ] >>123 変数の本日にはダブルクォーテーションいらんよ 「本日」という文字列は計算できんじゃろ
127 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 22:08:31 ] 125に代わっていうと 日数 = DateDiff("d", "2009/7/10", "本日") は 日数 = DateDiff("d", "2009/7/10", Now) 日数 = DateDiff("d", "2009/7/10", Date)
128 名前:124 mailto:sage [2009/07/21(火) 22:12:34 ] あっコピー先の最後の「.」はいらんわな あとクライテリアの*abc*を囲う必要があったかなかったか自信ない
129 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 22:37:38 ] >>116 けつからやんのか。頭良いな。
130 名前:123 mailto:sage [2009/07/21(火) 22:40:21 ] レスありがとうございます。 無事できました。>>127 さんのようにしました。
131 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 00:02:50 ] >>129 基本中の基本。 君の頭が○○なだけです。
132 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 00:21:45 ] こんなんピボットでやれば一発だわwwwww
133 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 01:32:28 ] >>131 おまえにいってねえからwww
134 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 18:03:46 ] また堕ちるぞ
135 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 23:04:58 ] >>133 ワロスw
136 名前:デフォルトの名無しさん [2009/07/23(木) 00:42:00 ] 現在Excelで作ったxmlを特定のURLへ送信するプログラムを作成しています。 (Microsoft XML version2.0使用) Sub xml() Dim aaa As Integer aaa = "001" Dim bbb As String bbb = "001" Dim xmlDoc As MSXML.DOMDocument Dim xmlPI As IXMLDOMProcessingInstruction Dim node(3) As IXMLDOMNode Dim attr As MSXML.IXMLDOMAttribute Set xmlDoc = New MSXML.DOMDocument Set xmlPI = xmlDoc.appendChild(xmlDoc.createProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-8""")) Set node(1) = xmlDoc.appendChild(xmlDoc.createNode(NODE_ELEMENT, "TEST", "")) Set node(2) = node(1).appendChild(xmlDoc.createNode(NODE_ELEMENT, "test1", "")): node(2).Text = aaa Set node(2) = node(1).appendChild(xmlDoc.createNode(NODE_ELEMENT, "test2", "")): node(2).Text = bbb '作成されたxml確認用 xmlDoc.Save ("test.txt") End Sub @set nodeに入れたaaaとbbbですが、1と表示されてしまいます。001と表示するにはどうしたら良いのでしょうか。 A作成された値(xml)を特定のURLへ送信したいのですが、どのライブラリ?等を利用すれば宜しいでしょうか (値を送ると、<result>NG</result>といった値が返却される予定です) すみませんがお力添え頂けると幸いです。
137 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 02:07:25 ] >>136 Excel 2007 + MSXML3 (MSXML2がなかった)とVBScript 5.0 + MSXML2 (Officeがなかった)の2環境でやってみたが、 いずれもbbbのほうは001になったぞ。 それをHTTPで送りたいのなら、MSXML.XMLHTTPRequestを使えばいい。
138 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 03:52:34 ] 変数についてなんですが、 ----------------------------------- Dim 値 As Integer 値 = Range("A1") Range("A1").FomulaR1C1 = "COUNTA(R[1]C[1],R[1]C[10])" 'A行 Range("A1").Copy Range("A1").PasteSpecial (xlCellTypeValue) Range("B1").Activate Activecell,offeset(1,値).Select 'B行 --------------------------------------------------------- 上記のようなコードで実行するとA行で集計されたはずの数値がB行に来た段階で代入されていないようなのですが、 変数というのは、宣言の時点で代入される数値が決まっていないといけないのでしょうか?
139 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 06:29:56 ] Range("A1").FomulaR1C1 = "=COUNTA(R[1]C[1],R[1]C[10])" 'A行 いこーるつけなさい
140 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 07:47:58 ] >>138 エスパーするとやりたいのはこういうこと? Dim 値 As Integer 値 = WorksheetFnction.CountA(Range("B2:K2")) Range("B1").Offeset(1,値).Select 質問に直接答えれば宣言はいつしてもいいけど変数の使い方がおかしい Integer→Rangeに変えてSet 値 = Range("A1") 最後の行をActiveCell..Offeset(1,値.Value).Select
141 名前:デフォルトの名無しさん [2009/07/23(木) 18:06:57 ] >>138 Activecell,offeset(1,値).Select 'B行 ↑ 点の種類間違ってる 最後の行はたぶんoffeset→offset クライマックスの2行まとめて Cells(2,2+値).Select 'ともかけるます >>140 変数の使い方はあってない? Range("A1") を取得すると Range("A1").Value を返すしIntegerで足りるし 値.Copy とかやるでもないし
142 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 18:36:20 ] Excel2007です。 赤丸(背景色は透明)を作りたいのですが、背景色を透明にできません。 Shape.Line.BackColorの編集でできそうなのですが、検索方法が悪いのか見つかりません。(この予測は間違いですか?) Dim myShape As Shape With ThisWorkbook.Worksheets("Sheet1") Set addCell = .Cells(intRow, intCol) Set myShape = .Shapes.AddShape(msoShapeOval, addCell.Left, addCell.Top, addCell.Width, addCell.Height) myShape.Line.ForeColor.RGB = RGB(255, 0, 0) myShape.Line.Weight = 2 End With よろしくお願いいたします。
143 名前:デフォルトの名無しさん [2009/07/23(木) 18:48:15 ] >>142 myShape.Fill.Visible = msoFalse
144 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 19:52:54 ] >>143 無事、透明になりました。ありがとうございます。
145 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 22:14:47 ] >>141 あっ、そういう風に見れば 間違ってるのは変数「値」にA1の値を代入するタイミングだな
146 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 23:31:01 ] >>137 ありがとうございます!
147 名前:デフォルトの名無しさん [2009/07/25(土) 12:07:00 ] エクセル2000を使用しています。 コンボボックス2個、テキストボックス1個、コマンドボタンのユーザーフォームで シートに以下の図のようにデータがあります。 コンボボックス1にA列の値、コンボボックス2にB列の値を入れて、 コマンドボタンを実行すると、該当するC列の値をテキストボックスに表示する にはどうすればいいですか? A B C 1 ああ カカ 100 2 ああ キキ 200 3 ああ クク 300 4 いい ケケ 400 5 いい ココ 500 コンボボックス1に「ああ」、コンボボックス2に「クク」なら テキストボックスは「300」になるようにしたいです。 よろしくお願いします。
148 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 12:24:06 ] 曖昧だな
149 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 12:35:45 ] 1とA、2とBの合致をANDでもいいから組み合わせて、そのセルを変数に格納して、テキストボックス=セル(変数、3).バリューすればいいかも!
150 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 12:44:08 ] vbaが体系的に勉強できるサイトや本でおすすめあれば教えてください。
151 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 12:48:49 ] >>150 ここでROMがお奨め(;゚д゚)ァ
152 名前:デフォルトの名無しさん [2009/07/25(土) 13:27:13 ] 項目1, 項目2, 項目3, 項目4, 項目n・・・(最大:n=255) あああ, ううう, えええ, くくく, ・・・ いいい, , おおお, けけけ, ・・・ , , かかか, , ・・・ , , ききき, , ・・・ (最大:行=65535) とあった場合、 項目1, 項目2, 項目3, 項目4・・・ あああ, ううう, えええ, くくく いいい, ううう, おおお, くくく あああ, ううう, かかか, くくく いいい, ううう, ききき, くくく あああ, ううう, えええ, けけけ いいい, ううう, おおお, けけけ あああ, ううう, かかか, けけけ いいい, ううう, ききき, けけけ ・ ・ ・ のように、データを詰めて別のシートの同じ位置(例:A1)から出力したいです。 ※行・列は可変データです。
153 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 13:29:47 ] >>150 151もおすすめだけど「体系的」ではないわなw 確かスレ違いだったと思うから紹介はしないが適当にググればいくつか出てくるからサイトさがしはそんなに難しくない 本買うなら最初はあまり分厚いのでなくて初心者向けの簡単な入門書やってみれば 自分が身につけたいことが見えてきて次に本買うときは自分の好みに合った本選びできる
154 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 13:37:24 ] >150 excel vba 入門 に一致する日本語のページ 約 183,000 件中 1 - 10 件目 (0.35 秒)
155 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 13:39:59 ] >>152 これって 丸投げというか、依頼じゃね 何がわからないか書かないと答えられないだろ
156 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 13:45:47 ] >>152 nhngdおk
157 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 13:59:52 ] >152 この例だとfor〜nextループ4重で行数は2×1×4×2=16行。 組み合わせの問題で項目数が不定ということは再帰処理ができるとわかりやすいんだろうけど・・・・ 「excel vba 再帰」でググったら再帰プログラムができるらしい。 ひとつ間違えると無限ループになるし、項目数最大256個が大丈夫なのか、やってみないと なんともいえない。
158 名前:157 mailto:sage [2009/07/25(土) 17:28:56 ] >152 行基準(再帰処理)でやろうとしたら、こんがらがってしまい中断。列基準だとなんかできそう。 先に列数(4)と、列毎の行数を調べ、配列に設定。この際添え字は0〜列数+1とし、 配列(0)と配列(列数+1)の内容は1にしておく。 その結果、配列(0)=1、配列(1)=2、配列(2)=1、配列(3)=4、配列(4)=2、配列(5)=1 となる。 左端列(A列:列番号1)は当該列の要素("あああ"、"いいい"の2種類をそれぞれ左側の組み合 わせ数1回繰り返したものを右側の組み合わせ数(1×4×2=)8回出力する。 →あああ、いいい を8回 B列(列番号2)は当該列の要素("ううう")の1種類をそれぞれ左側の組み合わせ数2回繰り返した ものを、右側の組み合わせ数(1×4×2=)8回出力する。 →ううう、ううう を8回 C列(列番号3)は当該列の要素("えええ"、"おおお"、"かかか"、"ききき")の4種類をそれぞれ 左側の組み合わせ数2回繰り返したものを、右側の組み合わせ数2回出力する。 →(えええ を2回、おおお を2回、かかか を2回、ききき を2回)を2回 D列(列番号4)は当該列の要素("くくく"、"けけけ")の2種類をそれぞれ左側の組み合わせ数 8回繰り返したものを、右側の組み合わせ数1回出力する。 →くくく を8回、けけけ を8回 列数がNで、n列目の出力を考えた場合、 要素数は 配列(n) 左側の組み合わせ数は 配列(0)×配列(1)×・・・×配列(n−1) A列の場合も配列(0)=1があるので計算に支障なし 右側の組み合わせ数は 配列(n+1)×・・・配列(N−1)×配列(N) 最右列の場合も配列(N+1)=1があるので計算に支障なし
159 名前:157 mailto:sage [2009/07/25(土) 17:35:38 ] >158の続き >152の例だと「項目3」が えええ、おおお、かかか、ききき、えええ、・・・という 順番だけど、えええ、えええ、おおお、おおお、かかか、かかか、ききき、ききき・・・の 並びの方が組み合わせ順としては自然だと思う。項目4も同様に同じものが8回ずつ繰り返す ことになります。 >152 ここまで示したらできますか?
160 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 18:55:00 ] よくわからないけど、列ごとにソートしたいのか? 格納用の配列(65534、254)を用意 ソート用の配列(65534、0)を用意 列をカウントする変数iを用意 for i=0to254 ソート用の配列に列データを格納、ソート 格納用の配列(65534、i)にソートしたデータを格納 最後にシートに格納した配列を流し込む
161 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 20:12:03 ] >>152 死ぬほど遅いけどこういうことか? Sub test() For Each c In Range(Cells(1, 1), Cells(65535, 255)) If (c.Value = Empty And c.Rows > 1) Then c.Value = c.Offset(-1, 0).Value End If Next End Sub
162 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 21:10:28 ] >>152 1.まず、項目1...nの要素を数える 2.数えた要素を掛け算、K1xK2x...xKn 3.2.で得られた数値が必要な行数なので、 各項目ごとに各要素で必要行数だけ埋める