ExcelのVBAに関する質問スレです ★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。 ★2 ExcelのVBA以外の部分に関する質問はNGです。 但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。 ★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。 VBAとは、『Visual Basic for Application』の略で Application ├Workbooks |└Workbook | ├Worksheets | |└Worksheet というApplication以下のオブジェクトを、VB言語で操作するものを指します。 例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、 セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。 ★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。 ★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。 ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。 ★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)
>1,2 乙
おっつ
5 :
デフォルトの名無しさん :2011/05/19(木) 16:40:20.76
Cells(1+i, 1) = "=COUNT(B1:H1)" のような形でfor文で回して各行の合計をそれぞれ表示させたいのですが B1:H1の部分を足していく(B2:H2、B3:H3…) のようにするにはどうすればいいのでしょうか?
Cells(1+i, 1) = "=COUNT(B" &1+i & ":H" & 1+i & ")"
そんなのに応えるなよw
8 :
デフォルトの名無しさん :2011/05/19(木) 18:39:40.63
vbaのコードをカラー印刷する方法ってある? MS XPS Document Writerを使っても白黒にしかならないんだけど。 VB2008ならMS XPS Document Writerでカラー印刷できるのに、 VBAはなんでカラー印刷にならないんだろうか?
9 :
初心者です :2011/05/19(木) 20:32:24.73
質問させてください A5からH1000程度のデータ表があります。 このプログラムを実行すると、構文エラーがでてきます。 Loop Until Cells(gyou, retu) = "" にカーソル位置が来て。LOOPに対応するDoがありませんと表示されます。 Sub サイコロ() Dim ymaru As Integer, imaru As Integer Dim gyou As Integer, retu As Integer ymaru = 0 imaru = 0 gyou = 6 retu = 8
10 :
初心者です :2011/05/19(木) 20:33:40.06
続きです。 Do If Cells(gyou, retu) = "○" Then ymaru = ymaru + 1 imaru = 0 If ymaru >= 3 Then Call 連同初買引売 Else ymaru = 0 imaru = imaru + 1 If imaru >= 3 Then Call 連同初売引買 End If gyou = gyou + 1 Loop Until Cells(gyou, retu) = "" End Sub
11 :
初心者です :2011/05/19(木) 20:34:00.92
続きです 'サイコロ 連日同一サイコロ 初値買い~当日引値売り Sub 連同初買引売() Cells(gyou, retu).Offset(0, -6).Copy Cells(gyou, retu).Offset(0, 7).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False End Sub Sub 連同初売引買() Cells(gyou, retu).Offset(0, -6).Copy Cells(gyou, retu).Offset(0, 8).Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False End Sub 一体、Donosysoriのどこが間違っているのでしょうか? あと、サブルーチンのcellsの使用法は間違っていませんか?
end IFの数を数えたことがあるか?
インデントとか適当なんだろうなあ
14 :
デフォルトの名無しさん :2011/05/19(木) 20:58:45.19
>>8 実は俺もコードをカラー印刷する方法を知りたい。
誰か教えて。
まず服を脱ぎます
ソースをVisualStudioにコピペして印刷
>>9 Ifが3つあるのにEnd Ifが1つしかない
変数gyouとretuの内容が下のSubに伝わっていない
18 :
8=14 実は同一人物ですw :2011/05/20(金) 09:59:30.88
>>16 うまくいきました。ありがとうございます。
16さんもやってますか?
しかし、XPS Document Writerは
いちいち上にパス名が表示されてうざいのですが、
これを全く表示しない方法ってある?
16さんのような使い手ならご存知かと。。。
【問題】以下は、コマンドボタンを押した時に選択されているセルの中央に横線を引くプロシージャである。①、②にあてはまるコードは何か書け。 Private Sub CommandButto1_Click() Dim myLeft1 as long Dim myTop1 as Long Dim myWidth1 as Long Dim Target1 as Range ① myLeft1 = Target1.Left myTop1 =Target1.Top + Target1.Height / 2 myWidth1 = Target1.Width + Target1.Left Set MyLine1 = ② End Sub
①set~ ②~addline~
なぁ、いつからここはVBAのドリルを解くスレになったんだ?なんて突っ込まないから、 もう少し解いて面白い問題出してくれよ。
ユーザーフォームのコマンドボタンの形を四角ではなく、矢印や丸などに変えたいのですが、どなたかやり方を教えて頂けないでしょうか? よろしくお願いします。
>>24 Excelの機能でボタンの形を変えるのは無理
丸とか矢印の画像をボタンかイメージか何かのコントロールに貼り付ける
ある特定範囲内の列の文字をSplit関数で文字分割したいんだが 区切り文字がないセルになるとエラーが出てそこで止まってしまう。解決方法あったら教えて下さい 例 A 1 1/2 2 1/3 3 1/4 4 5 5 1/6 Sub split() Dim i As Integer, tmp As Variant For i = 1 To 5 tmp = Split(Cells(i, 1), "/") Cells(i, 1) = hp(1) Next i End Sub この場合、i=4のところで処理が止まってしまいます。
セルの文字数が0以上判定 文字列内部に/があり、かつ前後に文字列が少なくとも1つあることを判定 条件達成で処理
>>29 ありがとう
ちなみに内部に"/"の判定だけでよくて、前後の文字は関係なかったです
31 :
修行の身 :2011/05/21(土) 20:31:24.67
誰かマクロを教えてくださいm(_ _)m ・シート1の『〔○曜日〕』から『 /他』まで、といった感じで各曜日の文章を1セルにまとめ、シート2に出力したい。ただし各週文章数はランダムのためそれに対応できるのが良いです。 ・A1の文字列から日付を抽出してシート2に出力したい。 -----シート1----- A 1 5月9日(月)~5月13日(金) 2 "〔月曜日〕" 3 "●文章1" 4 "●文章2" 5 "●文章3" 6 " /他" ・・・ ---------- シート1の情報をシート2に以下のように出力したいです。 -----シート2(別シート)----- A B 1 5/9 "〔月曜日〕●文章1●文章2●文章3 /他" 2 5/10 "〔火曜日〕●文章1●文章2 /他" ・・・ 5 5/13 "〔金曜日〕●文章1 /他" ----------
とりあえず
>>2 のテンプレ★5を読んでこい
やってみたなら
できたとこまででいいからコード晒しとけ
めっちゃ簡単だから、スレルール違反だろうと教えたがり君が喜々として語り出すかもw
34 :
デフォルトの名無しさん :2011/05/21(土) 21:20:34.80
英語のWeb辞書ページのHTMLからソースを抜き出して 複数の単語の意味を並べたHTMLを作ろうとしています。 ほぼできたのですが、ファイル出力すると発音記号が 「?」に変わってしまいます。 一旦単語ごとにセルに出力していますが、たとえばassureでは、 セルではきちん「əˈʃʊə」「əʃɔː」となっており、 そこからメモ帳に手動コピペしても「əˈʃʊə」「əʃɔː」となります。 しかしVBAで出力すると「????」です。 なにか対策はありますでしょうか。
>>36 ありがとうございます。できました。
発音記号に気づく前に改行が文字化けすることに気づいて、
削除したりいろいろしてましたが無駄でしたorz
今日はじめてVBA(というか組み込みC以外)のプログラムを触りましたが、
やれることも手段も多すぎて疲れました…面白いですがw
MSに文句言っとけ
>>34 ★1 OSとExcelのバージョンくらい書け
★2 VBA使わないExcelの質問禁止
★3 VBAでExcel本体を操作する用途以外はスレ違い
★4 同上
★5 丸投げお断り
★6 わからなければマクロの記録試せ
【問題】以下は、コマンドボタンを押した時に選択されているセルの中央に横線を引くプロシージャである。【①】【②】にあてはまるコードは何か書け。 Private Sub CommandButto1_Click() Dim myLeft1 as long Dim myTop1 as Long Dim myWidth1 as Long Dim Target1 as Range 【 ① 】 myLeft1 = Target1.Left myTop1 =Target1.Top + Target1.Height / 2 myWidth1 = Target1.Width + Target1.Left Set MyLine1 =【 ② 】 End Sub
①set~ ②~addline~
~ とは何だよ?正しく書きましょう
①set 以下略 ②前略 addline 以下略
略したとこがどうしてもわかりません。教えてください。ずっとわかりません
つーかさ、この問題文だと Set MyLine1 する必要無いよなw MyLine1の変数宣言がこのプロシージャ内に無いのを見ると モジュールレベルで宣言されていて別の処理で使うのだろうが 問題として適切じゃないねw
どうやったら早くプログラム組めるようになる? それともやっぱり早さよりも正確さの方が重要かな?
47 :
デフォルトの名無しさん :2011/05/22(日) 04:03:36.57
以下はセルに円を描画するマクロ ???に入る式を答えよ Sub en(tx, ty, hankei) '中心X 中心Y 半径 Dim a, b, c, d, e, f, g, z a = hankei ^ 2 b = hankei c = 0 Do If b > 0 Then d = -1 Else d = 1 End If If c > 0 Then e = 1 Else e = -1 End If f = Abs(b ^ 2 + (c + d) ^ 2 - a) g = ??? If f > g Then b = b + e Else c = c + d End If Cells(c + ty, b + tx).Interior.Color = 0 If c = 0 And e = 1 Then Exit Sub Loop End Sub
ヘボコード読むより、1から作った方が早くて速いんだが あえて答えるとbとc入れ替えてdをeに 因みに、正しくは「セルの塗りつぶしで円を表現する」な
49 :
デフォルトの名無しさん :2011/05/22(日) 09:03:41.76
エクセルのVBAでマクロを作ったのですが、2003で作って動作確認して、 2010で動かしてみようとしたのですが、最初の立ち上がった時にいろいろ仕込んだメッセージが出た後に、 画面が灰色になり強制終了されているようです。 理由が分かりません。誰か分かりませんか?
まずはうp
51 :
デフォルトの名無しさん :2011/05/22(日) 09:15:54.87
問題がおきるブック うpしたくないとか、うpできないとか言うなら、さようなら
問3 一からコード書いてセルの塗りつぶしで楕円を表現しなさい 26行以内 時間無制限
54 :
デフォルトの名無しさん :2011/05/22(日) 09:42:19.66
>>52 えーごめんなさい。会社のデータもちょっとかんでるのでうpできないです。
55 :
デフォルトの名無しさん :2011/05/22(日) 12:30:57.35
>>47 問題がおかしいけど、たぶん出題者の意図としては
g = Abs(c ^ 2 + (b + e) ^ 2 - a)
>>53 そもそも提示されたソースだけでは
>>47 が楕円になるし、いくらなんでも26行は長杉
>>56 > g = Abs(c ^ 2 + (b + e) ^ 2 - a)
その解答は、既に
>>48 が書いてるじゃん
f = Abs(b ^ 2 + (c + d) ^ 2 - a)
g = Abs(c ^ 2 + (b + e) ^ 2 - a)
> bとc入れ替えてdをeに
>>46 お前は早く作ると不正確なコードになるのか?
だとしたら意味ねー。
>>58 残念ながらちょっと複雑なコードになってくると
雑になるんだな。
やっぱ正確さは前提だよな。
じっくりすることにするわ
>>59 動作の精査が取れた使い回しの効く部分は、
部品化しておいて、機能やカテゴリごとに標準モジュールやクラスに纏めておくと、
その部分は速く正確に作れるよ。
特に同じ様なものを複数作る時はフォーマットになるスケルトンを先に作ってからやると最終的には速く作れるわさ。
61 :
16才♀ :2011/05/23(月) 07:41:28.04
16才♀ですが・・僭越ながら問題出しますっ!!>< 問題: セルに「さやか」と入力すると ・新規シート作成 ・そのシート以外の全てのシート削除 ・ブック保存 ・ブック閉じる 以上を警告メッセージなしで行うプロシージャを絶対作成しなさい><
ネコマタか……
面白いと思ってるのか?
そこまでしなくてもパソコンの電源OFFでいいじゃん
セルに「さだこ」と入力すると ・新規シート作成 ・ry
>>61 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If (Target.Cells = "さやか") Then
Application.DisplayAlerts = False
Worksheets.Add after:=Worksheets(Worksheets.Count)
For i = 1 To Worksheets.Count - 1
Worksheets(1).Delete
Next
ThisWorkbook.Save
ThisWorkbook.Close
End If
End Sub
>>68 シェアウェアの期限が切れたら自動的に消滅しますみたいなコードだよな
さらにパスつきで保存するとよい まあ簡単に破れるけどね
>>60 おk
つまりは今までのコードを見直して整理して
使いまわしできそうなものはガンガン使いまわしていくのが
早道ってことだな
がんばるぜぃ!!
VBAの標準モジュールやクラスモジュールを エクスポートして管理してる人って少なそう VB6始め、一般の言語では超基本的なことなのにな この間、VBEのプロジェクトエクスプローラに、D&Dでモジュールインポートしたら VBA10年以上使ってるっていう上司に驚かれて、それ知らないことにこっちが驚いた エクスポートだってD&Dで出来るのに、コピペでの使いまわしはしても D&Dどころか、メニューからのインポート、エクスポートすらしたこと無いとか言われたよ
モジュール削除しようとしたらエクスポートするか聞いてくるだろ 知らない人なんていないだろ10年もやってんなら
いやつかわんだろエクスポートとインポート
>>73 VBA10年の彼がエクスポートを知らなかったとは書いてないよ
彼が『知らなかった』のはD&Dでのエクスポート、インポート
普通のエクスポート、インポートは『やったこと無い』だけで知ってはいたよ
>>75 エクスポート/インポートしたことないんなら D&D でできること知らなくても
当たり前だと思うが。
> VB6始め、一般の言語では超基本的なことなのにな
そもそも VBA 以外の言語は大抵わざわざエクスポート/インポートせずに普通
に管理できる。もちろん VB6 も。
>>72 何を持って一般的な言語と定義するか分からないから何とも言えないけど、
VisualStudio系のは標準モジュールやクラスモジュールは作成した時にすでにファイルとして存在するから、
取り込む時には「新しい項目の追加」で「既存の項目」を選択して取り込むので、
インポート、エクスポート機能はむしろVBA特有の機能だと思ったけど。
JAVAとかは知らない。何か言語の問題って言うよりフレームワークの問題って気もするし。
基本的だと言ってるのは独立したファイルとして管理して使い回すことじゃないの?
そこは
>>72 がすっ飛ばして書いているからその通りなのか他の言語でもエクスポートするもんだと思って書いたのかは
伝わらない。
しかしすでに二人エクスポートするもんだと思って書いたと判断した人が出たのは確か。
> VBAの標準モジュールやクラスモジュールを > エクスポートして管理してる人って少なそう
一人
>>78 その通りです。
>>79 確かに書き方に不備があったかもしれませんね。
多くの言語で、逐一エクスポート的な操作をしなくてもファイルとして存在するのは周知の事実で
インポート的な操作手順や機能・項目名などの多少の違いくらい補完してくれるだろうと思って
端折りすぎてしまいました。
???の部分を察して埋めなさい(7点) Function irekae(a) Dim b(), c, d, e c = UBound(a, 1) d = UBound(a, 2) ??? For e = 0 To c For f = 0 To d b(f, e) = a(e, f) Next Next irekae = b End Function
Exit Sub
Redim b(d,c)って言いたいんだろうが変数fの宣言も抜けてる ちなみにExcel VBAじゃ1オリジンの配列もよく使う Transposeを使わないのは正解ではある
え?正解は Dim f だろ?
いい加減、ウザいよ 出題のレベルも低すぎな上に穴ありすぎだし
嫌だなみんな 出題者の意図は察して埋めろと言う事だから動く動かないより こんなしょぼいコードで偉そうに出題してすみません的なコメントが入るのが 一番しっくり来るだろ?
一行とは書いてない つまり、低劣なコードに見えてこれを破綻のない至上なるコードへと書き換えなければならないのだ
途中でexitで抜ければいいだけ
return false だろJK
94 :
デフォルトの名無しさん :2011/05/25(水) 00:12:20.44
maxCell = Range("A1").End(xlDown).Row でA列の一番の下の文字列の位置を取得しますが、 本当にそれより下の列には最後まで何も入力されていないかどうかをチェックするにはどうすればいいのでしょうか? if(maxCell == Range("A10000").End(xlUp).Row) という方法が思いつきますが、これがベターと言えるのでしょうか?
countaで。
>>94 1行目の式と比較すればベターだけどベストじゃない
最大行数はExcelのバージョンによって違うから、最終行はいちいち求めた方が汎用性が高い
maxCell = Range("A" & Rows.Count).End(xlUp).Row
ただしこれでも完璧じゃない
× maxCell = Range("A" & Rows.Count).End(xlUp).Row ○ maxCell = Cells(Rows.Count, 1).End(xlUp).Row
>>96 は俺じゃないが、どっちでも同じだよ。
アホかまったく。
前者はピリオド打った時入力候補が出るメリットがある。
かなり複雑な構成のブックで1億回ぐらい実行することを想定してるんだよ たぶん
後、End(xlUp).Rowを使うなら先に最終行に何も入っていない事を確認しないとね。
>>83 は
irekae = WorksheetFunction.Transpose(a):ExitFunctionとでも引っかけたつもりが、
>>85 にTransposeに言及されて黙ってしまったのか?
>>101 それもあるけど、それでもまだ完璧じゃない
完璧じゃない 完璧じゃない なんで口先だけで、コードを示さないの?
㋙㋪゚㋬゚㋢゙㋖㋤㋑ ●█▀█▄
オートフィルターでも考慮してるんだろ? フィルタリングされてるとすっ飛ばすからな。 いずれにしても完璧なコーディングできるやつなんて滅多にいねーよ。 掲示板の回答で細々と書くやつはアホだ。
1つもデータがない場合ってのもあるな xlUpの結果が1行目だった場合、先頭行にデータが入ってるかどうかも確認しないと
もっと簡単にできるけどなあ
>>108 先頭行にはタイトルがあるのが常識だからそれは考えなくていいだろ?
Findメソッドでもできるけど、一般的じゃねーな。
おおかた完璧じゃないって言ってるやつはFindメソッドのこと言ってるんだろうな。 オートフィルター対策でFindメソッドなんて、もともとフィルターがかかってるなら仕方がない部分もあるが VBAでオートフィルターはかけてはいかん。
>>112 は先頭行にタイトル書かないのか?
馬鹿じゃね?
112じゃないけど、人が見たり印刷したりするものには一番上にタイトル入れるけど VBAで読み書きするだけのデータシートにはタイトル書かないことも多い VBA側にタイトルに相当するもの(定数、列挙体)があれば完全に事足りるからな
先頭行の見出しは普通だが、A2からA列最終行までのときA2にデータがあるかどうかのチェックが必要なケースはあるよな。 For i = 2 To 最終行なんて下手な書き方なら偶々対策はされてるが。
xlUpの話だろ馬鹿か?
↑意味不明
どうしたの?ボク 彼女にふられたの?
120 :
デフォルトの名無しさん :2011/05/25(水) 12:15:31.94
122 :
デフォルトの名無しさん :2011/05/25(水) 12:23:24.22
もしもしは死ねよ
ヴァカの相手は程々にしないとな。
>>115 はxlUpの話だよなぁ。
㋙㋪゚㋬゚㋢゙㋖㋤㋑ ●█▀█▄
セルに入ってるのがタイトルかデータかなんて自動判別するのは不可能 ここで回答するのは無理 自分で作り分けるしかない
i=appliaation.rows.count do until cells(i,1)〈〉゙゙ i=i-1 loop みたいなのもう出た?
>>126 そういう話じゃないと思うなぁ。
A2以下にデータがないとき、Range("A65536")End(xlUp).Rowは1になるが
行番号1のA1が空白か空白じゃないかって話だろ?
見出し部分は別に無ければいけないもんじゃ無いし、 有ったとしても1行だけとは限らない。 どっちにしてもデータの最上部に対して何らかの仕組みを作っておかないと、 最上部に1件データが有ったとしても0件と見なしてみたり、 データ開始行より上の行をデータ最終行と見なしたりする。 だから考慮しなくていいと言うもんでもないと思う。
データ開始行より上の行をデータ最終行と見なしたりするのは
>>115 に出てるな。
この仕組みが何年たっても「大和の吊るし柿」でへたなりに固まってるやつ見るけどw
>>129 >最上部に1件データが有ったとしても0件と見なしてみたり、
>データ開始行より上の行をデータ最終行と見なしたりする。
下は俺もやっとわかったが、上がどうも想像がつかない。
たとえばどういうとき?
~問題~ いろいろとエスパーして???を埋めなさい(15点) Sub tyokusen(sx, sy, ex, ey) Dim a, b, c, d, e, f, g, z f = 1 If sx > ex Then f = -1 g = 1 If sy > ey Then g = -1 a = sx b = sy If Abs(ex - sx) < Abs(ey - sy) Then c = Abs((ex - sx) / (ey - sy)) d = 0.5 Do d = d + c If d > 1 Then d = d - 1 a = a + f End If b = b + g Cells(b, a).Interior.Color = 0 If b = ey Then Exit Sub Loop Else ??? End If End Sub
>>131 1行目からデータ部として使っている場合。
1行目にしかデータがない時、.End(xlUp).Rowで1が取得出来るけど、
全ての行に対してデータがなかった場合も1が取得される。
だからこのままではデータが0件なのか1件なのか見分けが付かない。
て言うか、散々前にそれ言ってる人がいるから今更こんな事言うと「だからそう言ってるじゃん!!」って
心の叫びが聞こえてくる様な気がするよ。
134 :
131 :2011/05/26(木) 08:43:26.93
>>133 そういうことなら
「最上部に1件データが有ったとしても0件と見なしてみたり」って言うより
「最上部にデータが無くても1件と見なしてみたり」じゃないの?
これなら俺でも分ったよ。
先頭行にタイトル入れないこともあるって人に聞きたいんだが、たとえばどういうものを作るときそのようになる? どうも想像力が弱いのか俺には思いつかん。
バイナリのダンプリストをバイト単位でセルごとに取り込んだり、列が項目として意味をなさない場合と、 シートをワーク用に使用した場合とか。ワーク用にシートを使う場合はどの項目に何が入っているのかは使用書に記述しておけばいいし、 それを見られたくないならVerryHiddenとかで非表示にしておけばいい。
なるほどデータベース的に使わない場合ね。
ワークシートを単なるデータ置き場として使う場合 タイトルってのは「人間がシートを直接見る」時に必要な物だから、 データの入出力をフォームやVBAだけでやる場合はタイトルなんか必要ない 実際、そういうアプリは世の中にたくさんある ここはVBAスレだから、そういうデータ置き場としての使い方は普通に良くあることとして話を進める
Excel本来の表計算ソフトとして使う場合はタイトルが必要ってことだな。 俺ならデータ置き場としてしか使わないならExcelなんか使わないな。 Excelでやる人はExcelに備わった機能を使いたいんだろうけど、大概のものは自作できるし。
>>141 Excelの機能を使うにはほとんどタイトルいるぞ?
むしろExcelの機能を使わない人がタイトルをつけないんだと思う。
>>142 そう言われればそうだけど、ソートとかWorksheetFunctionならタイトル要らないな。
でもソートとかWorksheetFunctionレベルならほとんど自作できるよなぁ。
データ置き場にする人がExcelの何を使いたいのか分らなくなったわ。
タイトルがないと使えないエクセルの機能なんかあったっけ?
>>144 ピボットとかオートフィルターとかフィルタオプションとか統合とかいろいろあるんじゃね?
オートフィルターは別にタイトルいらないんじゃない?
>>143 わざわざDBに接続しなくても、ブックを閉じて開いても値を残せる一番手っ取り早い場所だからな。
ファイルを複数にする必要もないし。
>>146 やってみたらたしかにそうみたいだけど、先頭行を空白にするくらいなら普通タイトルを入れるんじゃない?
>>148 え?
オートフィルター設定する時に項目から設定するかデータから設定するか選べない?
バージョンによって違うのだろうか・・・
>>149 Excel2007にはそういうのはないみたいだな。
もしかしてソートと勘違いしてない?
Excelはピボットを使うための道具なんだからタイトル入れるのはjsk
ここはVBAスレだったか。まぁいいか。
153 :
デフォルトの名無しさん :2011/05/26(木) 23:55:15.21
すみません、教えて下さい。 あるエクセルファイルに、別ブックからシートをコピーしたいのですが、 実行時エラー9と怒られてしまい、コピー出来ません。 Workbooks(OpenFileName).Worksheets("Sheet1").Copy のような形にしているのですが、何がいけないのがご教示いただけますでしょうか。
>>153 ブック名とシート名を確認
一番多いのがシート名の間違い
155 :
デフォルトの名無しさん :2011/05/27(金) 01:48:06.59
>>154 ご指摘ありがとうございます。
たびたび申し訳ありませんが、
マクロ起動ファイルとは、別のブック内のデータをソートしたいのですが、
どうやっても起動元が並び変わってしまいます。
別ブックをActivateにしても、Withを使ってもうまく動きません・・・
一時間以上悩んでいるのですが、さっぱりです。。
156 :
155 :2011/05/27(金) 02:26:02.46
すみません自己解決しました。
~ボーナス問題~ ???を察して埋めなさい Sub チンチロリン(s1, s2, s3) If ??? Then MsgBox "シゴロ" End Sub
158 :
デフォルトの名無しさん :2011/05/27(金) 09:53:19.54
ダイアログメッセージをループして各処理毎に変数の値を表示したいのですがどうすればいいのでしょうか? m = "iはインデックス" mes = i & m MsgBox "mes", vbOKOnly, "Err" ではエラーになります
159 :
デフォルトの名無しさん :2011/05/27(金) 09:58:36.32
同様に、シートも str1 = i & "月シート" Set ws1 = Worksheets(str1) のように変数str1をセットすると""を付けてもエラーになります 文字列+数値の変数を式の中に入れて処理させるにはどのようにすればいいのでしょうか?
>>157 IF s1 * s2 * s3 = 120 Then
'3つの出目をかけ合わせて120になるのは、4,5,6の組合せしか無い
>>158 それをそのままコピペして使ってみたが別にエラーにならなかったよ。
何かほかの部分でエラーが出てるのでは?
ちなみに、 MsgBox "mes", のダブルクォーテーションはいらんだろう。
>>159 こっちも別にエラーの起こる要素が無い。
別の理由でエラーが起こってるはずだ。
163 :
デフォルトの名無しさん :2011/05/27(金) 10:25:35.35
>>161-162 ごめんなさい、今までmesの部分でエラーが出ていたのですが、もしかしたらExcelのバージョン問題だったかもしれません
家のは95でして(苦笑)
ただ、シート部は出来ませんでした
shi = "月"
str = i & shi
Set ws1 = Worksheets(str)
ではインデックスが有効範囲にありませんと出てしまいます
164 :
163 :2011/05/27(金) 10:29:16.50
ごめんなさい、出来ました インデックスがおかしかったようです 皆さん、ごめいわくをおかけ致しました
初心者です エクセルに入力したテストの点数を 80以上を優 70-79を良 60-69を可 と表示したいのですが上手くいきません おかしいところがどこか教えてください Function 成績評価1(ten As Variant) Dim score As String Dim seiseki As Variant score(1) = "優": score(2) = "良": score(3) = "可": score(4) = "不可" ten = Left(ten, 4) If ten >= 80 Then seiseki: i = (1) If 70 <= ten And ten >= 79 Then seiseki: i = (2) If 60 <= ten And ten >= 69 Then seiseki: i (3) If 59 <= ten Then seiseki: i = (4) 成績評価1 = score(i) End Function
宣言 配列宣言 引数チェック 引数加工 入力値
>>166 俺宛でいいのかな
つまり基礎すら出来てないってことですか?
基礎がどうかは知らんけど、VBAではあんまり見掛けない構文だね 俺が似たようなコード書くならconstとかemumとか使うかも試煉
みんな優しいな…
ハッキリ言ってやれよ
おかしいのは
>>165 の知能だと!!
エキスパートのスタンダード終わったんだけど、これからプログラムを作成するにはどういう本がお勧めですか? 最初からそう教えてくれればいいのに!の2冊は読みました。 知識はあるけど、プログラムの作り方がいまいちわからない初級者です。
エンジニアなんとかとかスキルアップコレクションとかパフォーマンスなんちゃらとか そういうのじゃないんだよね
VBAの絵本
大きな本屋に行って自分で探せ、ヴォケ
>>最初からそう教えてくれればいいのに おー、こんな本あったのか。 VBAはExcelについてるヘルプとMSDNくらいしか見たことなかったが 読んでみるかな
>>170 実際にプログラムを作成しはじめれば、いいんじゃないか。
そうすれば、どういう勉強をすればいいか見えてくると思う。
とくに仕事で他の人が使うプログラムを作ると
ユーザーインターフェイスとか
いろいろな柔軟性とか
が大事だとよく分かる。
>>165 × If 70 <= ten And ten >= 79 Then seiseki: i = (2)
× If 60 <= ten And ten >= 69 Then seiseki: i (3)
○ If 70 <= ten And ten <= 79 Then seiseki: i = (2)
○ If 60 <= ten And ten <= 69 Then seiseki: i = (3)
テーブルの、ある行の適当なセルに文字をいれたら その行全体の色が変わるようにしたいんですが やり方がわかりません マクロを使わずにできるならその方法も教えてください よろしくお願いします
>>177 A1~Z1の色を変えたいなら
条件付き書式
=COUNTA(A1:Z1)>0
をA1~Z1に設定すれば、どこかにデータを入れると書式が反映される
>177 Private Sub Worksheet_Change(ByVal Target As Range) Target.EntireRow.Interior.ColorIndex = 7 End Sub とか
~問題~ 配列と数字Nを渡すとランダムにN個の要素を配列で返す関数を作りなさい
>>180 何で引数もランダムで作成する数もNなんだ?
引数意味ねーじゃん。
配列を返さないこともある、だろ。
引数が3なら要素数が3の配列を返すということだろ
おまいらファイト!w
俺は意味は分ったけど
>>180 も「重複なしで」を追加すればもう少し分り易かったかもね。
ようするに配列から重複なしでランダムにN個取り出せって話だな。
検索すれば玉石混淆でそこらへんにいっぱい転がってるけど。
>>190 質問に明記されてないのに、「重複なし」と決めつけるのはいかがなものか
プログラマなら想定して答えるべきだな SEならしらん
193 :
デフォルトの名無しさん :2011/05/28(土) 13:32:21.57
一つは A1に文字列 A2は空白 A3に文字列 ~ と歯抜けになっている もう一つは A1に文字列 A2は文字列 A3に文字列 ~ とすべてのセルに文字列が入力 とあった場合上から文字列のあるセル「だけ」を順番に見て行く方法とかって どうすればいいのでしょうか? 当然両方とも同じプログラムを使用する想定です。 たとえば 上から一行一行見て行って 文字列がある最後の列まで見て 空白行じゃなければ処理をする、空白行は無視するってやり方もあるのですが どうしてもパフォーマンスが悪くなるので
プログラマなら想定とか察してとか通用するからいいが、 仕様書を作る側の立場の人は誰が見ても分かるものを作るのが基本。 それが出来ないとSEにはなれない。
>>193 どうせ上から順番に見なければいけない処理ならデータの最終行までループしてやって空白の時だけ処理飛ばせばいいんじゃないの?
>>191 重複なしなら簡単すぎて問題にもならんよ。
SEとプログラマは違うのか?
構築・開発系とかなら、設計・仕様・コードレビューやQAとかするのがSEだろ コーディングや現場ドキュメント作成しかしない奴は底辺プログラマ 規模的に全部する(せざるを得ない)のが広義のプログラマ 部署も島も違うが、近くで見る限りはこんな感じだな
Range("A1:AR100")を選択してセルに入っている値が1よりも大きければ 色をつけるマクロを組みたいのですが If Range("A1:AR100").Value >= 1 Then Range("A1:AR100").Interior.ColorIndex = 37 End If これで実行したら「型が一致しません」とエラーが出ました。 手直しをお願いします。
当たり前だ
>>199 For Each c In Range("A1:AR100")
If c > 1 Then c.Interior.ColorIndex = 37
Next
>>200 答える気がないんなら
いちいちつまらん茶々を入れるな
>>202 答える気がないんなら
いちいちつまらん茶々を入れるな
205 :
デフォルトの名無しさん :2011/05/28(土) 22:04:29.40
206 :
デフォルトの名無しさん :2011/05/28(土) 22:09:05.40
>>205 ベスト?俺はベストなんて常にないと考えて作っているけど。
例えば今回のケースだと、ひょっとしたら配列数式とかを使えば空白を除いた表を
数式で隣に配置出来るかも知れないし、
それを使った方が効率いいかも知れない。そういった調べたり考えたりしてモアベターな方法を使って行くもんだと思ってるし、
どんな方法を使ってもそれよりいい方法がないとは言い切れない。
この方法がベストですなんておこがましい事は今までも言った事がないし、
これからも言うつもりもないよ。
とある編集用のシートを作っています、 文字列置換ダイアログの「検索する文字列」と「置換後の文字列」のリストに任意のリストを設定したいと思っています。 普段は過去に検索or置換した文字列がリストに入っていると思うのですが、そのリスト内容をvba側で操作したいのです。 技術的に可能であれば教えていただけないでしょうか。よろしくお願いします。
>>208 ユーザーフォームで検索ダイアログ作りましょう
そうすれば自由自在です
>>209 返答ありがとうございます。
やはりフォーム作成が一番手っ取り早いですか。。
後出しになってしまいますが、制約があり可能であればフォームを作成せずに行いたいのです。
>>210 やっぱりこう言った場合はAPIでダイアログからコールバックでセンドメッセージだなと
適当な文字の羅列を書いてみるが気にするな。
>>210 最初に画面が多少チカチカしてもいいんなら、
SendKeysで検索ダイアログを必要な回数だけ開いてやるって手がある
ただしこの方法だと項目の追加はできるけど削除はできない
213 :
問題マン :2011/05/29(日) 16:09:00.99
~スペシャル問題~ ???に入るベストな式を答えなさい(135点) Sub bezier2d(x1, y1, x2, y2, x3, y3) Dim a, b, c, d, e, f, g, h, i a = 2 ^ 10 b = a * a c = x1 * b d = y1 * b e = ??? f = ??? g = 2 * x3 - 4 * x2 + 2 * x1 h = 2 * y3 - 4 * y2 + 2 * y1 For i = 0 To a Cells(d / b, c / b).Interior.Color = 0 c = c + e d = d + f e = e + g f = f + h Next End Sub
214 :
デフォルトの名無しさん :2011/05/29(日) 16:50:18.59
JKの宿題スレときいて
>>213 あのね、問題ってのは
「何を読ませるか」「何を考えさせるか」「どう解かせるか」
ってのを考察出来ない人には作れないものなのよ
君が毎度出してるのは、問題でもなんでもない
そもそも、自分より上手、目上の奴に問題出そうてのが間違いだ
>>215 まったくだ。
>>213 のはいつも面白くない。
見たくもないオナニーを無理矢理見せ付けられてる感じだ。
>>213 VBAの宿題スレでも立てて一人で問題だしてろ
答えないと、「おまえら、解らないから言い訳代わりに叩いてるだけだろ」とか言ってきそうだけど 皆、そんな煽りに乗せられて答えるなよ。 答えたらつけ上がって、いつまでもくだらない問題もどきを投下してくる。 ここでまともな質問に回答している奴らが、このくらい難なく解けるのは皆解ってるから 一人くらい「おまえら解らないんだろ」とか勘違いして言ってくる奴が居ても放っておけってことで。
219 :
208 :2011/05/29(日) 21:51:45.68
>>211 sendmessageでそんな使い方もいけるんですね、ちょっと調べてみます。
>>212 後だしばかりになってしまいすみません、
リストは何パターンかあるのでリフレッシュできるのが望ましかったです。
お手数掛けました、ありがとうございます!
220 :
問題さん :2011/05/30(月) 02:33:09.84
おまいらパーフェクトな反応ごちそうさまです
悪意はないんで少し弁解させてください・・・><
>>215 >何を読ませるか どういう計算で二次ペジェ曲線を表現するプログラムか
>何を考えさせるか 曲線間を1024等分した時のx,yの最初の増減値
>どう解かせるか すでに分かっているg,hの式の形から
いや別に俺は下手で構わないんだが・・
なんでそんなに上手アピールしてんぢょwwぴょwww
>>216 1レスで済むようなプロシージャがオナニーに見えるのかい?
>>218 そんなに答えないことに布石打たなくても大丈夫だぜww
数学知らなくてもプレゼンハムでググればお前でも分かるよ
くだらない問題に上のほうで嬉々として反応してたように見えるが・・
そんなに嫌なら誰か答えたら終わりにするぜ!
ってかこれはいろんな人に知ってほしい
俺は先週これ知った時感動したぜ
>>220 >ってかこれはいろんな人に知ってほしい
チェーンメールならぬチェーン書き込み乙
ブログでも立てて独りでやれ
掲示板でやるな
>>220 悪意が無くて弁解も終わったならとっとと消えるべきだな。
ここは質問スレであって出された問題に答えるスレではない。
自分で問題スレ作ってそこでやれば興味のある奴は来てくれるだろう。
もっともそんなオナニー問題出してる様ではすぐに過疎スレになってDat落ちするだろうけどな。
予想通りの反応過ぎてワロタw この子、なんでこんな風になっちゃったんだろう? 余程ストレスやコンプレックスが強いのかな? つーか215にも見当違いなこと答えてるし 単純に頭が悪いのかな?
頭が悪いん云々以前にいわゆる基地街 知能じゃなくて知性に欠けているな
お前↑の馬頭には加わってなかったが、お前みたいな馬鹿相手に1回答えたことを反省。 そもそも答えても返事がなかったもんな。
名前見ても知性知能共に低いのが伺える 「問題マン」って、、、、、問題抱えた男ですかw それはそれで本質的には間違ってないんだが、それは周りが呼称する場合で 自ら名乗るなら、普通は「出題マン」とかだよな
227 :
デフォルトの名無しさん :2011/05/30(月) 10:22:18.68
質問させてください VBAというのはAuto_Open()ではなく、A1とA2の値が違った場合とか、 C1の値が変更された瞬間にマクロが作動して「値が変わりました」とかのダイアログが 表示されたりは出来ないのでしょうか? 自分でマクロを「実行」しなければいけないのでしょうか?
>>227 ユーザー定義関数
イベント
好きな方を使って下さい
> A1とA2の値が違った場合 A1、あるいはA2の値が変更された上でA1とA2の値が違う場合なら Worksheet_Changeイベントで可能 変更された上ではなく、ブックを開いた時点で違いが有ればということなら Auto_OpenやWorkbook_Openで確認すれば良い > C1の値が変更された瞬間 Worksheet_Change
はじめてここで質問させていただきます。 『ファイル名を指定して実行』ダイアログを開き PostMessage または SendMessageでフルパスを入力して プログラムを実行しようとしていますが、 キーが送られません。(名前の欄に文字が送られません) SendKeyではうまくいくのですが、 スクリーンロックを考えているので使えません。 何かいい方法があれば教えてください
233 :
デフォルトの名無しさん :2011/05/31(火) 00:49:22.73
.Cells(n, 1) = sh.Cells(i, "A") .Cells(n, 2) = sh.Cells(i, "B") .Cells(n, 3) = sh.Cells(i, "C") .......AX欄まで続く これをRangeでシンプルに書くとどうなるか、エスパーの方教えてください。 こんな風↓に考えたのですが、どうしても範囲が合わずエラーになってしまいます。 .Range("A" & n - x, "CQ" & n) = sh.Range("A2", "CQ" & x)
234 :
233 :2011/05/31(火) 00:54:20.85
誤 ".......AX欄まで続く" 正 ".......CQ欄まで続く"
235 :
問題マン :2011/05/31(火) 01:02:14.54
時間切れです><
あれ?おまいらあからさまな間違いにつっこまないとかあれ?
>>222 消えてほしい理由がわからんな~
答えて楽しめばいいじゃない^^
それとわかる範囲の問題に嬉々として反応してくれる人がいるみたいだぜ~?
あと俺スレ立てできない><
>>223 予想通りレスが予想通りwwwイライラすんなよww
ただベジェ曲線レベルの段階でこうなったのは実は想定外だったぜ><
>>226 つっこむとこそこかよww
>>230 遅いぜー 今言っても説得力が・・
~おまいらでもすぐわかるサービス問題~
???に入るできるだけ短い式を答えなさい
sub チンチロリン(s1,s2,s3)
if ??? then Msgbox "5です(ゾロ目じゃないぞ)"
End sub
>>233 sh.Range("A" & i & ":CQ" & i).Copy (.Cells(n, 1))
>>235 >消えてほしい理由がわからんな~
スレチな上にいつも問題が面白くない。
そっちこそVB6スレでもコマンドボックスとか_clicとかわけ分からない事かいて
フルボッコにされて追い出されたからって、
このスレに必死にしがみ付いている理由が分からないんだけども。
238 :
233 :2011/05/31(火) 06:59:54.24
〉〉236 ありがとうございます!
問題マンコはなんでこんなにみんなから嫌われてるのに自殺しないの?
>>231 ほらよ。
Option Explicit
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hParent As Long, ByVal hChildAfter As Long, ByVal lpszClass As String, ByVal lpszWindow As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Any) As Long
Sub hoge() 'Win7
Dim h As Long, i As Long, com As String
com = "c:\hoge\hogehoge"
Shell "rundll32 shell32.dll,#61"
h = FindWindowEx(0&, 0&, "#32770", "ファイル名を指定して実行")
h = FindWindowEx(h, 0&, "ComboBox", vbNullString)
h = FindWindowEx(h, 0&, "Edit", vbNullString)
For i = 1 To Len(com): SendMessage h, &H286, Asc(Mid$(com, i&, 1&)), 0&: Next
End Sub
でも何でShellとかShellExecuteでやらないの?
241 :
大門さん :2011/06/02(木) 00:30:18.23
1~9の4つの数字を四足演算で10にできるかどうか 判定できるマクロを作りたいのですが どうしたらいいでしょうか?
242 :
233 :2011/06/02(木) 00:49:18.50
以下はフォルダ内のデータを転記するためのマクロの一部なのですが、wbには開くためのパスワード"password"が設定されています。 ブックの"password"をマクロで入力し開くにはどうしたらよいか教えてください。 Dim fn, wb, myPath myPath = ThisWorkbook.Path & "\" fn = Dir(myPath & "*.xls") Set wb = Workbooks.Open(myPath & fn) ' ↓こんな感じかと考えながらもうまく動作しないです。。 Workbooks.Open Filename:=wb, Password:="password"
243 :
問題マン :2011/06/02(木) 03:21:24.09
おまいらテンション落ちすぎだぜ!
>>237 その人をよく知らないんだがたぶん
引数がランダムになるとか重複なし抽出のほうが速いとか言ってる人じゃね?
>>239 ありがとうございます^^
>>242 これはここの人は厳しいから教えてもらえないんじゃね?
答え見た悪意ある人がマクロから虱潰しでパス突破しようとするかも
>>242 Dim fn as String, myPath as String
Dim wb as Workbook
myPath = ThisWorkbook.Path & "\"
fn = Dir(myPath & "*.xls")
Set wb = Workbooks.Open(FileName:=myPath & fn, Password:="password")
245 :
233 :2011/06/02(木) 18:30:37.98
242 ありがとうございます! m(_ _)m
246 :
デフォルトの名無しさん :2011/06/02(木) 21:10:25.53
既存の検索機能では1種類の文字列での検索しか出来ない 2種類の文字列での検索がしたければ、既存の検索機能を2回まわすか 自前で検索機能を作るかだな 俺は正規表現で検索できるものを自作して使ってる 「2つの文字列」ではなく「2つの文字」なら、正規表現ではなくLike演算子でも可能
a or b
課金アイテム購入するニダ
テキストボックスを文字列に格納して二種類に分割しれば良いだけでは
252 :
問題マン :2011/06/03(金) 09:10:26.52
うわー
ググったらパスつきマクロの破り方まで簡単に出てきたわ・・
>>249 煽ってる暇あったらスキルの高い回答を書くんだチンカス!
とゆーかつい最近だろ別ブックのパス制御の話
254 :
246 :2011/06/03(金) 13:33:56.75
答えてくださった皆さんありがとうございます。 しかし、どの本もそうですがやりたいと思った事が書いてない ということがほとんどな気がします。 ネットが便利すぎるだけかもしれませんが 皆さんの書いたコード見てると凄いなーと感心しっきりです。
255 :
忍法帖【Lv=1,xxxP】 :2011/06/03(金) 20:00:22.46
置換について質問です Selection.Replace What:="1", Replacement:="99" "99"の部分を別シートのA1の値にすることはできますか? 環境はエクセル2000です
>>255 Replacement:=Worksheets("Sheet2").Range("A1").Value
257 :
ninja :2011/06/03(金) 22:26:17.24
258 :
デフォルトの名無しさん :2011/06/04(土) 10:28:39.89
VBではbeep音の周波数を変えられるそうですが VBAでは可能でしょうか?
VBでもWin32API使わないと周波数は変えられないし VBAでもWin32API使えば周波数は変えられる
260 :
デフォルトの名無しさん :2011/06/04(土) 22:26:44.82
セルの数字の最大値を記録していきたしのですが、 そのような関数orマクロはないでしょうか? 例えば、A1セルの値が 100→130→180→150→120 と変化した場合、180の値をどこかのセルで表示させたいのです。 宜しくお願い致します。
Worksheet_Changeで変化があるたびにどっか別のシートに記録しておいたものと 比較して大きければそれを保存しておくとか
循環参照上等で組んだらこうなったわさ。 第一引数にこの数式の入ったセル位置を、第二引数に対象のセル位置を設定して、 標準モジュールに以下の関数を書いて、ユーザー定義関数として使うわさ。 Option Explicit Function hoge(IN_KeepValueCell As Range, IN_vValue As Variant) As Variant Static vMaxValue As Variant Static bFirstFlg As Boolean つづく
>>262 の続き
If IN_KeepValueCell.Count <> 1 Then
hoge = "複数セルは選んで欲しくないべさ"
Exit Function
End If
If Not bFirstFlg Then
vMaxValue = IN_KeepValueCell.Value
bFirstFlg = True
End If
If IN_vValue <> vbNullString Then
If IsNumeric(IN_vValue) And IN_vValue > vMaxValue Then vMaxValue = IN_vValue
Else
vMaxValue = 0
End If
hoge = vMaxValue
End Function
だれか循環参照対応コテ入れして・・・orz
test.xlsと同じ層にある n KB以下のファイルを削除するにはどうしたらいいでしょうか?
>>264 FileLenかFileSystemObjectの.Sizeプロパティでブックのサイズ取得してループで回す
指定のサイズ以下なら削除
「コメントが無いセルにはコメント挿入、ある行には削除」 というマクロですが、以下で良いでしょうか? 一応自分の環境では動いていますが…時々矢印の表示が残ることがあります Sub Comment_Add_Clear() If ActiveCell.Comment Is Nothing Then ActiveCell.AddComment "" ActiveCell.Comment.Visible = True Else ActiveCell.ClearComments End If End Sub
300行くらいのデータ2列を 配列(300,2)に格納して別シートにコピーしたりなどで 扱おうと思ってるのですが これって配列の使い方としてまちがってますか? なんとなく大量のデータを記憶させておくのってよろしく ないのかな?と思ってしまいます。
>>268 「など」じゃわからんよ
もっと具体的に、何と何をやりたいのか
シートから別のシートにコピーするだけならCopyメソッドの方が簡単だし
配列を介すと値しかコピーされないが 値だけのコピーなら、配列を介さず コピー先範囲.Value = コピー元範囲.Value で事足りる
コピー以外のことは考え中です。。
フォーマットの違う他シート2、シート3に
それぞれシート1からコピーしようとしたときに
配列使った方が便利なのかな?と思いました。
300行2列程度なら
>>269 さんのやり方がベストなのでしょうか?
いまいち配列のいきる使い方がわからないです。
失礼 コピー先範囲.Value = コピー元範囲.Value この方式でした。
>>271 言ってることがよくわかんない。
何で無理して配列使わなきゃならんかな。
配列の使い方を勉強したくてその過程で出て来た問題なのか、
その問題に当たったから配列使えば解決出来そうと思ったのか、どっちなんだ?
>>271 まあ小学校卒業してから
また質問すればいいんじゃないか?
実際に使うわけじゃないだろ?
暇があるっていっても、
みんなお前よりは忙しいんだからさ
自重しろハゲ
>>268 基本思考はあってる。
でもそれ実装した奴はそんなもん当たり前のレベルで知ってる。
なので好きにしろ。
>>270 それって配列を介してるじゃん。
コピー元範囲.Valueは2次元配列だ。
配列じゃなくて配列変数の話だって文脈でわかれ
そのマクロを第3者が使うとして、、、その第3者にしてみたら要求を満たしていれば、 とんでもなく遅いとかとんでもなく速いとかでなければ中身がどうだろうと関係ないわけ で、なんで配列に拘るのか?
279 :
問題マン :2011/06/07(火) 08:11:30.11
ウン百回もコピーするならいったん配列に格納したほうがいちいち参照しないぶん無駄がないぜ
280 :
デフォルトの名無しさん :2011/06/07(火) 08:14:15.84
1,1~9,9のセル範囲の偶数列偶数行にランダムに10個●が配置されています。 輪にならないようになるべく少なく○を置いて全ての●と繋げるにはどうすればいいでしょうか? あと試す度に違う結果になるようにしたいです。><
>>279 嘘書くんじゃねーよ。
まさしく問題マンだなw
コピペだけならペをうん百回繰り返した方が良くね?
問題マンは無駄云々を語るにはまだ早い。
>>281 無駄なコードがないって意味では?
俺なら
配列 = 元範囲
配列を回して書式やデータちぇっく
新範囲=配列
ってするけど
287 :
デフォルトの名無しさん :2011/06/07(火) 15:02:14.43
宜しくお願いします。次のマクロを作りました。 Sub 色によって判別() Dim 行 As Long For 行 = 27 To 120 If Cells(行, 122).Interior.ColorIndex = 47 Then'これが赤色のとき Cells(行, 247).Value = 5 If Cells(行, 122).Interior.ColorIndex = 44 Then'これが黄緑色のとき Cells(行, 247).Value = 1 Else Cells(行, 247).Value = 0 End If End If Next 行 End Sub 列DR27~120の色によって、それぞれの行IMの数字を変えたく、 上記のマクロを製作したのですが、最初のIFの条件(赤色の時)は上手く良くのですが、 2番目のIFの条件(黄緑色の時)が反映されず困っています。修正点等宜しくお願いします。 OS=windowsXP EXCEL=2000 です。
>>287 Sub 色によって判別()
Dim 行 As Long
For 行 = 27 To 120
If Cells(行, "DR").Interior.ColorIndex = 47 Then 'これが赤色のとき
Cells(行, "IM").Value = 5
Else
If Cells(行, "DR").Interior.ColorIndex = 44 Then 'これが黄緑色のとき
Cells(行, "IM").Value = 1
Else
Cells(行, "IM").Value = 0
End If
End If
Next 行
End Sub
>>287 いくつも場合分けする時はSelectを使った方がいいよ
Sub 色によって判別()
For 行 = 27 To 120
Select Case Cells(行, "DR").Interior.ColorIndex
Case 47 'これが赤色のとき
Cells(行, "IM").Value = 5
Case 44 'これが黄緑色のとき
Cells(行, "IM").Value = 1
Case Else 'その他
Cells(行, "IM").Value = 0
End Select
Next 行
End Sub
>>287 です。
>>288 >>289 お二人とも本当に有難うございます!
問題解決しました!
わざわざコードまで教えていただき感激です。
]
>>289 そんなやり方があったとは知りませんでした。
重ねて有難うございます!活用します!
まともな質問には優しいお前ら
sub txtbox1_Change () call 処理 end sub というプロシージャが txtbox2、txtbox3・・・・ と10個程度続く場合、ひとつの プロシージャにまとめることはできませんか? txtbox1から10のいずれかがChangeで call 処理 というような。
295 :
問題マン :2011/06/07(火) 22:47:35.04
べろべろばー
>>287 IfでやるならInterior.ColorIndexを何度も参照しないように
いったん変数に入れたほうが無駄がないぜ!
>>293 新しくClass1を挿入
Public WithEvents mytx As MSForms.TextBox
Public Sub init(a)
Set mytx = a
End Sub
Private Sub mytx_Change()
処理
End Sub
グローバルにインスタンス作成
Dim myclass(10) As New Class1
以下を作動させる(名前違ったら適当に変えてね)
For a = 1 To 10
Call myclass(a).init(Sheet1.OLEObjects("TextBox" & a).Object)
Next
で試したら最初はうまくいったけどいじってたら効かなくなったぜ!
変数myclassを保持してる間だけ有効
テキストボックスごとに処理を変えるならMe.mytx.Nameを処理に渡して分岐させれ
>>295 やはりクラスモジュールを使用するのですか。
検索して勉強しても
いまいちクラスが理解できないんですよね。
.netならまだわかるけどVBAでのクラス構築がいまいちわからん 定義エラーでまくり
>>295 ヒントが出れば、答え探してきて、コピペ回答するくらいはできるんだな
今日から始めるんですけど、 ボタン押す→図出現→適当なセルに文字入力→図に反映 って難易度的にはどのぐらい?
中級
五段階の2 1は変数が理解できるレベル
段階少なくね? 5はどれくらいのレベルなのさ?
開発者より詳しい
このスレで他人の回答にいちいちケチを付けるのがレベル5
306 :
デフォルトの名無しさん :2011/06/08(水) 22:37:13.37
CSV出力をすると、書式が日付のセル(例:2011/06/08)が "2011/06/08"のようにダブルクォーテーション付きとなってしまいます。 2011/06/08のようにダブルクォーテーション無しで出力するには どうすればよいのでしょうか?
>>306 直接CSV形式でやる方法はない
VBAでコンマ区切りの文字列を自分で作ってテキストファイルに出力するしかない
VBAの入門書はひと通り読んで、 フォーム入力とか、抽出、転記はかけるようになってきた。 発展というか、入門書より、実用的な本でおすすめありますか? 経験上、やはり、ネット検索より、本のほうが理解しやすいみたいです。
309 :
問題マン :2011/06/09(木) 04:11:04.42
セル内の数値秒の間、1秒ごとに繰り返すプログラムを作ろうとしているのですが実行時エラーが出てしまいます. Public Function myFunc() If 秒数セルが0 Then Application.OnTime Now + TimeValue("00:00:01"), myFunc, False Else 秒数セル -1 処理 → Application.OnTime Now + TimeValue("00:00:01"), myFunc End If End Function エラー発生個所は矢印のところです。 OS=windowsVista EXCEL=2007です。
事故解決しました
ホントだ。キチガイがいる
宜しくお願いします。 コードが長くて書けないのですが、EXCELのバグではないか? という局面に直面しています。次の手順をVBAで踏むと ①シートAで複数のセルをセレクトコピーして、別のシートBへ貼り付けます。 ②次に、シートBで複数のセルをセレクトコピーして、シートAへ貼り付けます。 ①は問題ないのですが②の際、どういうわけか①でコピーされた内容 (シートAのセルデータ)が貼り付けられてしまうのです。 Application.CutCopyMode = False Copy も使用しています。 EXCE2000でです。宜しくお願いします。
1行ずつ実行していって動作を調べろ
315 :
313 :2011/06/10(金) 23:09:21.10
事故解決しますた! すいません。 全然違う単純ミスでした。 すいません!
またお前か
大体、掲示板に質問してくるレベルでExcelのバグか!?なんて100年早いわ 疑いたくなることあるけどw
318 :
問題マン :2011/06/11(土) 02:50:56.99
前田敦子のどこがいいんだぜ
>>310 他サイトだとどう解決したか書いてけ!って怒られたりするぜ
2chだからどーでもいいけど
>>312 後付けで問題禁止とかファビョり出した人のことかい?
触れないであげようぜ・・忘れたい過去みたいだからさ・・
>>317 俺なんか自動保存をバグだと思ってたぜ!
319 :
デフォルトの名無しさん :2011/06/11(土) 05:59:50.15
初心者です。変数の定義の質問です。 Dim v (1 to 10, 1 to 10) As Variant v の後の(1 to 10, 1 to 10)の意味がわかりません。 詳しい方教えてください。お願いします。
>>319 (1 to 10) なら以下のような入れ物を用意するということ
□□□□□□□□□□
(1 to 10, 1 to 10)ならこんな感じ
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
そう言えば前スレでテーブルジャンプに付いて質問した者だけど、自己解決したから挙げさせて頂くわさ。 配列か何かにジャンプテーブルを作って、それでテーブルジャンプをしたいんだけどって言う質問で、 スレチだからダメって言われたけど、何かVBAで普通に簡単に出来たわさ。 標準モジュール側 Sub hoge() Dim sJmpTbl(2) As String Dim ocls1 As New cls1 Dim vMtdNm As Variant sJmpTbl(0) = "hoge1" sJmpTbl(1) = "hoge2" sJmpTbl(2) = "hoge3" For Each vMtdNm In sJmpTbl Call CallByName(ocls1, vMtdNm, VbMethod) Next End Sub クラスモジュール側(クラス名:cls1) Sub hoge1() Call MsgBox("hoge1が呼ばれました") End Sub Sub hoge2() Call MsgBox("hoge2が呼ばれました") End Sub Sub hoge3() Call MsgBox("hoge3が呼ばれました") End Sub かなり端折って書いたけど、こんな感じで片付いたわさ。
322 :
デフォルトの名無しさん :2011/06/11(土) 10:32:06.55
いれものじゃねーよ メモリ上にその値を確保すんだよ
値の領域だから入れ物でいいじゃん。
メモリ上の領域を分かり易く入れ物に例えたんじゃない? それに値を確保するってどういう事? 俺には領域を確保している様にしか見えないんだけど。
>>322 >メモリ上にその値を確保すんだよ
その値ってどの値なんだよ (w
何言ってるんだよ その値って言えばほら、そこにあるその値の事だろ w
327 :
デフォルトの名無しさん :2011/06/11(土) 11:42:59.08
319です。
>>320 ありがとうございます。すごくわかりやすかったです。
ちなみに
>>321 の
Dim sJmpTbl(2) As String
(2)はどのようなことをさすのでしょうか?
stringが文字列型なので2文字分の入れ物を確保?ってことでいいのでしょうか。
328 :
問題マソ :2011/06/11(土) 12:05:25.87
330 :
デフォルトの名無しさん :2011/06/11(土) 12:15:56.07
327です。
>>328 ありがとうございます。
327 での2文字分の表示は As string * 2 と何か違う点がありますか?
ここで聞くよりググった方が早いだろうと思うんだが?
だな。あっさり騙されているみたいだし。
333 :
デフォルトの名無しさん :2011/06/11(土) 21:07:39.82
騙されてたのか。悲しいぜ。 頼みますだれか 327 の(2)について教えてください。 お願いします。
334 :
忍法帖【Lv=1,xxxP】 :2011/06/11(土) 21:20:36.35
シート上にあるすべての埋め込みグラフを少し下に移動させたいのですが Dim Move As Chart For Each Move In Charts Move.IncrementTop 50# Next Move メソッドまたはデータメンバが見つかりません。とエラーが出ます。
書いてある通り
>>333 >頼みますだれか 327 の(2)について教えてください。
>>319-320 見てもわからないってこと?
あと option base でぐぐっておけば幸せになれるかもしれない。
>>333 まさか釣りや煽りの類じゃないだろうな?
_______ __
// ̄~`i ゝ `l |
/ / ,______ ,_____ ________ | | ____ TM
| | ___ // ̄ヽヽ // ̄ヽヽ (( ̄)) | | // ̄_>>
\ヽ、 |l | | | | | | | | ``( (. .| | | | ~~
`、二===-' ` ===' ' ` ===' ' // ̄ヽヽ |__ゝ ヽ二=''
ヽヽ___// 日本
______________ __
|vba 配列 .| |検索|←をクリック!!
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄
◎ウェブ全体 〇日本語のページ
338 :
デフォルトの名無しさん :2011/06/11(土) 22:38:09.49
WEBクエリでテーブルの一部分だけを抜き出すことってできますか?
すいません初心者で質問です。 ボタンを押したときテキストをexcelで読み込み、 線を引いて2箇所ソートを掛けて保存をするものを作りました。 ここで問題なのですが、テキストを読み込んで線を引いて、ソートもOK で保存もちゃんとできたものは作れました。 ですが、ソートをするときに ActiveSheet.Range("A2:W500") .sort key1:O列昇順 key2:G列昇順 この記述を入れているせいで、保存が終了した際にexcelがプロセスに残ってしまっており 2回目の処理を行う際にエラーがおきてしまいます。 プロセスを終了しないとどんどん溜まっていきます。。。 シートにはいくつかデータがあるので、2箇所だけソートを掛けるとほかの データはソートがかからないので、データがある範囲を指定しています。 何かほかの記述方法はありますか? 宜しくお願いいたします。
>>341 ありがとうございます。
明日会社で試したいと思います。
もしわからなかったら、コードを記述させて頂きますので
どなたか宜しくお願いします・・・
>>340 setステートメントでワークブックを掴んだら、参照をきちんと解放しろ
どのオブジェクトでも同じだ
set myWorkbook As Workbook
(略)
set myWorkbook = Nothing
>>343 >set myWorkbook As Workbook
Dim じゃねーのか?
>>344 すまんCreateObjectのから消したからミスった
WorkbookやWorkSheetのオブジェクトは、わざわざNothing代入しなくても変数スコープが外れた時点で参照は解放されるよ これは、どのオブジェクトでも同じだ もちろん「変数スコープが外れた時点で」なので、モジュールレベルでオブジェクト変数を宣言している場合は 処理を終えても(プロシージャを抜けても)参照は保持されたままなので、解放したければNothing代入する必要があるが プロシージャレベルでの宣言なら処理を終えたら(プロシージャを抜けたら)、Nothing代入を記述しなくても、 自動的にNothing代入と同じ処理が入る 問題なのは「参照」ではなく「プロセス」の方で、主にActiveX.dllではなくActiveX.exeの場合に起こる これらはQuit、Exit、Close、Terminateなどの終了や閉じる系のメソッドを実行してやらないと 参照は解放されているのにプロセスが残るという事態が起きる この問題は、Nothing代入して参照をきちんと解放したところで解決しないどころか Nothing代入しちゃうと、当然ながらQuitもCloseも出来なくなっちゃうので、そんな無駄な解放処理やるまえに きちんと終了処理を行わないとダメだ
>>346 Excelに限定される話じゃないけど、暗黙で生成されたオブジェクトを掴んだ場合、
明示的に解放する手段なくない?
だからVBAにDisposeはないって 言ってるじゃないですかァーッ
円のオートシェイプ表示まではできたけど、表示した円に文字入力するのがわからないです
つ マクロの記録
以前プロシージャレベルでもNOTHING入れるのが礼儀とか怒られたぜ!
参照先をオブジェクトからnotingに入れ直すだけで、一度捕らえたオブジェクトはGC以外では解放されない仕様じゃなかったっけ
>>349 Shapes.Characters.Text
>>350 2007だとオートシェイプ関係は記録できないことがある
>>351 それが正解。
基本的にスコープが切れた所で開放されるけど、
場合によってゴミが残ってメモリリークが発生する事がある。
ない 終了
無いと言うのと知らないと言うのは違う。
なんでもかんでも最後にNothingするのはプロが無駄に記述量を増やすために書くってのが多い。 プロはわざと冗長に書くことがある。 アマチュアは無駄なことは書かずに最短距離でいきましょう。 ExcelのVBEのプロシージャレベルのRange型とかWorksheet型なんて100%書く必要はない。
すいません。 セレクトセルが移動していっても、 元をたどれると便利なので、 セルアドレス = Selection.Address() Range("セルアドレス").Select とよくやって元を辿るのですが、 Range("セルアドレス").Select の部分で理由は分からないのですがエラー(デバック)になって、 これを使えない時があります。 何かルールがあるのでしょうか? EXCE2000 WindowXPです。
Sub 1回追加() If ActiveCell.Offset(0, -1).Range("A1").Value = "250" Then セルアドレスA = Selection.Address() ActiveCell.Offset(0, -23).Range("CX1").Select 'ActiveCell.Offset(0, -23)で一番左端の列Aに移動。CXは両建判別列 Select Case Selection.Value Case 1 Range(セルアドレスA).Select ActiveCell.Offset(0, -23).Range("W3:DH3").Select Selection.Insert Shift:=xlDown Selection.Insert Shift:=xlDown Range(セルアドレスA).Select Application.Run "売りに買いで両建2回トレードに変更" ↓が選択され次のマクロに移り================ Sub 売りに買いで両建2回トレードに変更() セルアドレス = Selection.Address() Worksheets("倉庫").Select Range("DT33:DW53").Value = "" Worksheets("損益").Select Range("セルアドレス").Select ←ここでエラーになってしまいます!
>>360 セルアドレスの中身見てみ
原因がわかるよ
>>358 なにか問題起こされると困るし
かといっていちいち細かく説明するのも面倒だから
とりあえずやっとけって言うやつが諸悪の根源
>>361 分かりました!有難うございます!
元々選択されているのに再度選択していました!
いや、その程度の知識しか持ち合わせていないなら とりあえずNothingは付けておいた方がいい。 開放されるのが分かってて付けないなら構わないが。
うむ
>>367 すいません。考えたのですが分からないのです。
教えてください。
>>368 Range("セルアドレス").Select
Range("セルアドレス).Select
>>369 Range("セルアドレス).Select
Range(セルアドレス).Select
>>365 まだ分からないのか。
開放されない事象が有るから言ってるんだ。
人に勉強とやかく言う前に本当にそういう事象が無いのか確認してから言ってくれ。
それが出来ないなら迂闊にないなんて言わない方がいいし、
人に勉強しろなんて言うのはもっての他だ。
>>371 まあまあ、そんなに怒ることでもないわさ。
私も一つ知ってるけど、言うと荒れそうだから黙ってるわさ。
>本当にそういう事象が無いのか確認してから これって不可能じゃないかな? 発生する事象をだしてもらえれば話が早いのに…
まぁ、お前らそう興奮して反応するなって。 別にしらねぇならそれでいいじゃないの。死ぬわけでもなし
この不況下じゃその油断が野垂れ死にを招く
>>372 再現可能なら荒れないよ
今は「ある」「ない」の水掛け論だから荒れてんの
循環参照の例は常識だから不適
>>379 常識でも何でもないと思うが。
ならばNotingを付けるのも常識だろう。
>>380 Nothingつけただけじゃメモリリークする
馬鹿は黙ってろ
382 :
デフォルトの名無しさん :2011/06/13(月) 21:13:58.87
> 基本的にスコープが切れた所で開放されるけど、 > 場合によってゴミが残ってメモリリークが発生する事がある。 > 基本的にスコープが切れた所で開放されるけど、 > 場合によってゴミが残ってメモリリークが発生する事がある。 > 基本的にスコープが切れた所で開放されるけど、 > 場合によってゴミが残ってメモリリークが発生する事がある。
すいません、やはりわからなかったので教えてください・・・ 'エクセル起動 Set a_xls = New Excel.Application With a_xls.Application .Workbooks.OpenText _ ~省略~ FieldInfo:=Array( _ Array(1, 2), Array(2, 2), Array(3, 2), Array(4, 2), Array(5, 2)) ActiveSheet.Range("A2:W500") _ .Sort Key1:=Range("O2"), order1:=xlAscending, _ Key2:=Range("G2"), order2:=xlAscending End With .ActiveWorkbook.SaveAs FileName:= _ Replace(strFileNm, ".txt", ".xls"), FileFormat:= _ xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _ , CreateBackup:=False End With a_xls.Quit Set a_xls = Nothing こう書いているのですが、ソートを掛けるところを記述すると excelが終了せずプロセスに残ったままになってしまいます。 何か書き方などアドバイスいただけませんか。お願いします
何だ、循環参照の話が出たから分かってるのかと思ったが全然分かって無かったみたいだな。 なら俺が説明しても理解出来ないかも知れないな。
386 :
デフォルトの名無しさん :2011/06/13(月) 21:31:38.96
> 常識でも何でもないと思うが。 > ならばNotingを付けるのも常識だろう。 > 常識でも何でもないと思うが。 > ならばNotingを付けるのも常識だろう。 > 常識でも何でもないと思うが。 > ならばNotingを付けるのも常識だろう。
オブジェクトの参照って次の理解でいい? オブジェクトは変数に参照を設定することで使用できるようになる。 変数のメモリアドレスにオブジェクトへ参照アドレスが確保され、 処理の際に変数→メモリ→オブジェクトの呼び出しが行われる。 呼び出されたオブジェクトの実体は、利用しなくなったらシステム側が回収 (おかしな挙動しないようにしまっちゃう)する。 変数にNothingをセットすると、変数の持つメモリアドレスが無しに書き換える。 これにより、変数へのアクセスにより、不要なオブジェクトの呼び出しが無くなる。 つまり、変数の持つメモリアドレスをクリアし、オブジェクト召還を変数から出来なくするが、 実体の回収を保証するものではない。
初心者なのだけど、 Excel VBA で書いたプログラムの拡張子は、どんな文字なのかオセーテ!
>>383 >Set a_xls = New Excel.Application
新しいブックオープンするんじゃダメなん?
>>394 IDも見れないのと思ったがここ出ないんだった
とりあえず内容みような、言ってること違うから、多分
?
やれやれだ。
ここまで
>>386-388 みたいに煮えくり返っている奴に説明するのも馬鹿馬鹿しいな。
人の話を聞かないで決めつける時点でプログラマとしての素質が無いと分かってる奴に説明するのも何だしな。
こう言う奴は結局自分で適当に調べて間違った事をずっとそのまま覚えているんだろうな。
お前みたいに失礼な奴に教えるとでも思っているのか?土下座して出直せ。
>>398 Nothingつけただけじゃメモリリークする
馬鹿は黙ってろ
>>391 前に質問していてその内容が340にあるんですが、
ブックだけを開いてテキストの読み込みは可能ですか。
どうもソートかけるてるところをコメントアウトすると
正常に終了するので、どうしたもんかと試行錯誤しているんですが
よくわからない状態です・・・
>>400 これでお前はまたひとつ勉強する機会を失った訳だ。
そうやって底辺PGとしてそのまま這いつくばっていればいいさw
>>402 Nothingつけただけじゃメモリリークする
馬鹿は黙ってろ
>>401 >ブックだけを開いてテキストの読み込みは可能ですか。
vbaだから、基本的になんでもありだと
ただ、この一文だけじゃなんのことだか?
クラスやフォームを使わなければ起きない。
>>405 そうだとすると、私が知ってるのと同じかも知れないわさ。
>>401 自分のWorkbooksのOpenTextを使えば済む話じゃないのか?
何か妙な勘違いをしている気がする。
まだ続いてたんか でNothingしないとメモリリークする例は出たか?
>>404 ですね、すいません。
と言うか、なんで
ActiveSheet.Range("A2:W500") _
.Sort Key1:=Range("O2"), order1:=xlAscending, _
Key2:=Range("G2"), order2:=xlAscending
End With
ここだけで、プロセスが残ってしまうのが良くわからないんですよね・・・
>>410 sortは環境によっては、おかしくなることがあるみたい
知らないで書くけど、
最後のquitはcloseじゃダメなん。
そもそもメモリリークしたかどうかってどうやって調べるのよ
>>412 長年の経験と勘
単に外部プロセスやOSがキャッシュとして保持している場合があるから難しい
賢くない人の平凡でしょぼいな回答をありがとう
しょぼいなってどこの方言?
>>411 なるほど、どうなんだろう
今は家だからできないんだけど試してみるかな・・・
>>383 このコードみると
With は1個なのに
End With は2個あるけど
コピペミス?
>>418 はい、すいませんコピペミスと言うか
今日色々やっててその残骸です。無視してください
省略の部分
例示もソースもコードも貼れないで脳内で完結してるだけなのになんでわざわざ恥をさらしにくるの? マゾなの? 気持ちいいの?
ここの奴らはスルースキル低いなw
俺もUserFormでメモリリークする事例は知ってるが、Nothingとは無関係だしなぁ。 Set *** = Nohingを書かないとメモリリークして、書くとメモリリークしない例は俺は知らない。
427 :
スーパー問題マン :2011/06/14(火) 03:52:05.88
つまりnothingでジェネレーションを下げないとVBAのガベージなんとかが解放してくんないし、 逆にnothingで参照が切れることでガベージなんとかのリストから外れて残る可能性がある ってことでFA?
何がFA? 中の細かな動作までわかる奴いないと思うけど
こんにちは、質問いいですか? VBAでオブジェクトをシリアライズし文字列をセルに保存することはできますでしょうか?
Nothing派は旗色悪いな 起死回生でみんなを黙らせる書き込みはないんかな?
Nothing代入しないで起こる問題は Nothing代入しても同じように起こる Nothing代入によって発生しない問題は Nothing代入しなくても起こらない プロシージャレベルの参照変数にプロシージャの最後でNothing代入するのは 完全に無意味で、これの有無によって何かが変わることは無い
俺はnoting派じゃないがnotingは入れてる 条件処理で空else書くのと同じ扱いだな 実際俺が無知なだけで、notingにすばらしい効果があるのかも知れないし
コードの明示性を上げるために、自動型変換が働くところでも 文字列型変数 = CStr(整数型変数) とかやるのは無駄じゃないけど、Nothingは無駄以外の何ものでもない
Application. とかもその類いだな でも空elseはNotingと同じじゃんシステム上のメモリリークのリスク回避でなく、コーディングでのリスク回避だと思うんだが つまりシステム上要請されるコードではなく、規約の上に従う一種のルール であれば完全否定もするものじゃないな Notingが明示的な解放ではないと言うスタンスならば
>>430 何も例を挙げていないのに人の話を聞けとか言うやつしかいないよ
書いておいてあれだが日本語がひどすぎだわ俺
同じくnothing は基本的に入れない派なんだが、createobject やnewでインスタンスを新たに生成した場合は最後にnothing をいれるようにしてる。 もしかしてこれも無意味だったりする? 教えてエロい人
メモリリークってどうやって調べるの?
無意味がどの意味で使われてるかいまいち まとめるとこんなかな 宣言する派 │ ├宣言したら解放される説 ├宣言しても解放されないが、メモリリークリスクが減る説 │├GCが自動的に回収するけど想定外エラーとか困る分派 │└回収されるとは限らないから可能な限り明示する分派 ├メモリリークリスクは変わらないけど、コードの明示になる説└みんなしてるじゃん説 宣言しないよ派 │ ├┬dirpose実装しろ説 │└参照先が変更されるだけで破棄が保証されないから宣言が無意味じゃん説 ├GCにまかせろー(バリバリ)説 ├気にするようなシステム作ってないだろ説 ├面倒くさい説 ├参照先が変更されるだけで破棄が保証されないじゃん説 └ソースよこせ説
>>438 タスクマネージャで大体分るんじゃない?
エクセル終了させたら全部解放される程度のことを問題にするな
質問です 対象はシートが"対象者"、"コピー元"と人名のシートが複数枚あるブックです 人名のシートは"対象者"シートに書かれている人名でシート名が付けられています 対象者のシートには1~3列目まで人名を含んだ文字列、それ以降の列がデータとなっており、 1列目から3列目までを順にチェックして、一致する人名のシートにその列をコピーしたいです。 そこで処理を記述してみたのですが、コピーを繰り返すうちに 「リソース不足のため、このタスクを完了することができません。 選択するデータを少なくするか、ほかのアプリケーションを終了して再度試してください。 元に戻さずに続けますか?」と出てしまい、処理が終了してしまいます。 検索して同様の事象の対処法として、クリップボードをクリアするために必要なコピー処理の 直後に1つのセルのみコピーする処理やCutCopyMode=Falseにする処理を入れてみましたが 状況は変わりませんでした。 なんらか対処法ご存知の方教えていただけないでしょうか?
443 :
442 :2011/06/14(火) 23:46:50.21
書いたソースは下記のような感じです(1/2) Private Sub CreatePersonalSheet() nCheckColumn= 1 nPersonCnt = ThisWorkbook.Worksheets("対象者").UsedRange.Rows.count - 1 Do While nCheckColumn < 3 nRow = 2 Do While nRow <= nPersonCnt + 1 sPersonSheet= ThisWorkbook.Sheets("対象者").Cells(nRow , 1) nPersonEndline= ThisWorkbook.Worksheets(sPersonSheet).UsedRange.Rows.count With ThisWorkbook.Worksheets("コピー元") .Range("A1").AutoFilter Field:=nCheckColumn, Criteria1:="*" & sPersonSheet& "*"
444 :
442 :2011/06/14(火) 23:52:56.15
続きです(2/2) If (.AutoFilter.Range.nCheckColumns(1).SpecialCells(xlCellTypeVisible).count > 1) Then .Rows(1).Hidden = True .Range("A1").SpecialCells(xlCellTypeVisible).Copy _ ThisWorkbook.Worksheets(sPersonSheet).Rows(nPersonEndline+ 1) .Cells(1, 1).Copy Application.CutCopyMode = False ' 作業シートよりコピー完了した行を削除 .Range("A1").SpecialCells(xlCellTypeVisible).delete .Rows(1).Hidden = False End If .AutoFilterMode = False End With nRow = nRow + 1 Loop nCheckColumn = nCheckColumn - 1 Loop End Sub 前レスでなぜかインデントが消えてしまいました、すみません どなたか分かる方見えたらお願いします。
>>442 Do While nCheckColumn < 3
...
nCheckColumn = nCheckColumn - 1
Loop
無限ループしてないか?
446 :
442 :2011/06/15(水) 01:26:49.22
>>445 そこは実際のソースだと分かりづらい部分があったんで何箇所か修正したときに直し忘れてました
nCheckColumn = nCheckColumn +1ですね
ご指摘ありがとうございます
あと
>>442 の4行目「対象者のシートには~」は「コピー元のシートには~」でした。
間違いが多くてすみません
447 :
問題マソ :2011/06/15(水) 07:44:30.67
ググったらnothingは7年前から議論して結論でてないみたいだぜ
>>446 ちょっとブックうpしてみて
結論は出てるよ ただ、悪魔の証明で、Nothing無しでも全てのケースに置いて絶対に問題が「無いという証明」は不可能なので 悪魔の証明ってのを理解してない奴だけが結論出てないと勘違いしているだけ
最近は礼儀とか作法とか書く馬鹿が減っただけでも少しは向上したのかもね。
450 :
デフォルトの名無しさん :2011/06/15(水) 18:11:04.35
ユーザーフォームを作成してて、 何度か実行していると、突然 指定されたオブジェクトが見つかりません みたいなエラーがでて、フォームが開けなくなることがあるんですが、 フォームに問題があるのでしょうか? 上書き保存時にもエラーがでることもあります。 コードを新規BOOKに移植しても同じでした。
ブックあるいは再現する最小のコード、デザインをうp 話はそれからだ
452 :
デフォルトの名無しさん :2011/06/15(水) 18:54:35.56
>>451 特定のBOOKではなく、いくつかのファイルで発生します。
エクセル、OSともに再インストールしたけど、再発しました。
内容は複雑なものではなく、
with構文
Application.ScreenUpdating
txt1.Value = Val(txt2.Value) - Val(txt3.Value)
if Else構文
を使い、
フォームのコンボボックスや
テキストボックスに入力したものを
シートに転記する、といったようなものです。
エクセル2007
Celeron 2.53
MEM 1024M です。
ユーザーフォームを何度か実行(Show)すると問題が起きるのか ユーザーフォーム上でなんらかの処理を何度か実行すると問題が起きるのか解らんが 前者なら何のコントロールもコードも乗せてない空のユーザーフォームでも再現するか 後者なら、空のユーザーフォームにボタンを1つ配置して、コードは書かずにそれを 何度か押すだけでも再現するか確認しろ これで問題が再現するなら、MSにバグ報告しな これで問題が再現しないなら、コードに問題があるわけだから 問題が再現する最小のコードをきちんと探って 変に略したりせずに書くように
>>448 Nohitng付けとけ派は
事実と推論できるものが証明できるかどうかを問題にしてるんじゃない
事実として良いかを問題にしてるんだ
VBAの実行環境に対する信頼性の問題だよ
今日初めてユーザーフォームの存在を知ったが、 汎用性はありそうだけど、 繰り返し処理に弱そうなイメージなんだがどう思う?
>>452 似たような症状になったことある。
どういう基準でなるかわからなかったけど、
ユーザーフォームをデバッグしてると、急に
パスが見つかりません、みたいなエラーがでる。
ツリーでひらいても、同じでひらけない。
ぐぐっても、ユーザーフォームがなにか悪さしてる、
程度しかわからなかった。
「時間指定によるマクロの実行のご質問お願いします(エクセル2003)」 「A1に 23:00:00と入力し B2からB11に 101から110までの数字を入力しています 右隣(C2)に数字をコピーするマクロですが下記のようにマクロ記録終了いたしました」 Sub 時間ですコピーです() ' ' 時間ですコピーです Macro ' ' Range("B2:B11").Select Selection.Copy Range("C2").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False Range("A2").Select End Sub 「毎日A1表示時刻に実行するマクロを下記の通りやってみましたが指定時間に実行できません」 Sub 時間ですコピーです() ' ' 時間ですコピーです Macro 間省略 Application.CutCopyMode = False Application.OnTime TimeValue("A1"), "時間ですコピーです" End Sub 「ご指導の程お願いします」
Workbook_Openに無限ループで書くか タスクを使う
>>458 Application.OnTime TimeValue(Range("A1")), "時間ですコピーです"
じゃね?
実用性で考えたらタスクだろうね。
>>459 の人が言ってる様にタスクで立ち上げて
Workbook_Openに処理を書き込む様にすれば大丈夫。
最後にブックを保存して閉じることを忘れずに。
>>459 462
ありがとうございます タスクの意味があまり分かっていませんで
一度くぐってやってみます
質問させてください。 マクロでシートの中の「"」を一度に消したいのですが、文字列として認識してくれないため行き詰まっています。 手動の置換でなら出来るのですが、マクロで処理する方法があればご教授ください。 よろしくお願いします。
>>464 エスケープシーケンス
文字コード
おすきにどうぞ
>>465 はい やってみました
タスクと言うところクリックして タスクの追加とか・・・ありますね
初めて開きました お昼休みに一度やってみます
何度もありがとう
>>464 testしてないけど
Replace(Cells(n, n), Chr(34), "")とかは?
Chr(34)は半角 "
>>464 Cells.Replace What:="""", Replacement:=""
470 :
デフォルトの名無しさん :2011/06/16(木) 15:33:22.65
フォームのコンボボックスのオブジェクト名を 一括で変更するにはどうしたらいいでしょうか? cbo内容1 ~ cbo内容10 と連番にしたです。
全部ならeach
>>466 >>468 >>469 返信ありがとうございます。
しかし、何度やってもダメでした。
VBのバージョンが6.5なのですが、古くてダメなのでしょうか。
>>472 バージョンに限らず駄目でしょう。
あれの扱いは文字列ではありません。
ごめん、頭のシングルクォートと間違えた
フォームって言っても フォームツールなのか、ユーザーフォームなのかで 話は変わってくるわけだが
476 :
デフォルトの名無しさん :2011/06/16(木) 16:16:15.85
Call Cells.Replace("""","")
でも駄目?
>>469 の人の書き方ちょっと変えただけだけど。
VBなんちゃらとかchr使うとかなかったっけ
479 :
デフォルトの名無しさん :2011/06/16(木) 17:00:19.20
タブオーダーってすごく使いにくいですね。 表みたいに配置したテキストボックスが 40個とかあったら、大変。 D&Dとかソートでできたら楽なのに。 みんなは一個ずつちまちま移動しているのですか?
>>477 やはりダメなようです。
他の文字ではちゃんと処理してくれるのでプログラムは合っているのですが
ダブルクォーテーションだけが処理してもらえません。
481 :
デフォルトの名無しさん :2011/06/16(木) 17:33:33.40
ダメだって単に言われてもな。 どのようにコーディングしてどのようにダメなのか実例を示してくれ
482 :
デフォルトの名無しさん :2011/06/16(木) 17:52:33.77
宜しくお願いします。 例えばIf~文の条件式で(必ずしもifでなくてもOKです)、 真であれば 次の行のプログラムをEnd subまで読み込まない。 または、 指定した行のプログラムまで読み込まずにジャンプする。 というようなことは出来ないでしょうか? 宜しくお願いします。 Windows XP EXCEL2000です。
if false then なんたら endif
>>483 >次の行のプログラムをEnd subまで読み込まない。
どう使いたいのかがよく分からないけど、フラグ設けて再帰するとか?
>指定した行のプログラムまで読み込まずにジャンプする。
GOTO文があるけど、これの多用はお勧め出来ない。
If文のネスト加減で難しいならこれもやっぱりフラグ設けてその分岐で目的の行に
飛ばした方がいいと思うよ。
>>481 すみません、言葉が足りないようでした。
例えば、
>>477 さんのプログラムを実行すると、何も変更されないままプログラムが終了するのです。
ダブルクォーテーション以外の文字を指定するとちゃんと置換されてプログラムが終了します。
Call Cells.Replace(""","")だろ低脳共
怨エラーなんちゃら chr(34)
Excel2007/2010 で、vba側から条件付き書式を4つ作ると 最上位にあるプロパティがコード側から うまく操作できないぽい。既出でしょうか? orz ウォッチウィンドウでSelection.FormatConditionsを見ると Item1とItem4のFormula1が同じ値になってる。 Item1の方の.font.colorとか.font.colorindexを変化させても 反映されない。Item4側が変化したりする。
Call Cells.Replace("""","") Call Cells.Replace(""","") なるほど、ダブルクォートが3つか。 ドヤ顏のとこ悪いけど、それじゃ走りもしないよん。
>>493 さんが成功していて
>>486 が失敗してんだから
>>486 の書き方に間違いがあるんでしょ。
ごちゃごちゃ言わずにさ、その部分どういうふうに書いているのかサンプルのデータと一緒にここに書いてみたら?
あれこれ言ってるよりその方がよっぽど早いでしょ。
>>494 失礼しました。
以下のデータになります。
エクセルのシートは「”あ”」のようにダブルコーテーションでくくってある文字の集合です
試しにシートのダブルコーテーションを全角から半角に書き直し、
Macro2の「Chr(&H8168)」を""とすると、消すことが出来ました。
しかし全角の”を消すことができません。
Sub Macro1()
'
' Macro1 Macro
'
'
Cells.Select
Call Cells.Replace("chr$(&H8168)", "")
End Sub
Sub Macro2()
'
' Macro2 Macro
'
'
Cells.Select
Selection.Replace What:="Chr(&H8168)", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
End Sub
ぜwwwんwwwかwwwwくwwwww
498 :
デフォルトの名無しさん :2011/06/17(金) 00:31:14.20
全角のダブルクォーテーション… 書かなきゃいいじゃんww
システム作るときならまあ、ユーザー入力だから想定はするけど・・・ 質問で全角とは予想GUY
>>464 > マクロでシートの中の「"」を一度に消したいのですが
久しぶりによくで来た釣りだったな
503 :
442 :2011/06/17(金) 03:41:09.22
Copyではなく Value = Valueによる代入にしたらエラー出なかったし Copyの場合の「実行~エラー」までより遙かに短い時間で全処理終わったよ
505 :
エスパーマン :2011/06/17(金) 04:49:53.92
同レベルなので初見でエスパー余裕でした
マクロを実行した時に指定したセルの中身が、 例えばA1の中身が「あ」なら終了して、それ意外なら実行するという様なコードを教えてください
これは流石にどう見ても釣り
If Worksheets("sheet1").Cells(1, 1).Value = "あ" Then
Exit Sub
Else
~
End If
これで満足したか?
>>508
誤字に突っ込めよ
>>506 「あ」じゃないときだけ実行すれば、「あ」のとき終了と同じことになる。
>>512 506レベルなら「では"あ"ではないってどうやって(ry」になるんじゃね
514 :
442 :2011/06/17(金) 20:55:52.08
>>504 出来ました、ありがとうございます
しかし原因がよく分からなかったのですが、今回のようにフィルターかけて可視領域だけを
コピーするような連続領域でないコピーみたいな特殊な処理はCopyは使わないほうがよいということですか?
て言うか
>>508 みたいな反応に驚いたw
マジだったんだ。すまんかったな。
ユーザーフォームに リストボックスとボタンを置いて ボタンに Private Sub CommandButton1_Click() Me.ListBox1.ListIndex = -1 End Sub と書くと選択が解除されるのですが リストボックスに Private Sub ListBox1_Click() Me.ListBox1.ListIndex = -1 End Sub と書くと選択が解除されません。 これどうやったら選択解除出来ますか?
押し間違えさせない為に 奇数行に線(---------------------)を入れてて それをクリックした時に選択状態にしない様にしようと 思ってやってみたんですが解除出来なくて。 飾りじゃない行をクリックしたら値をシートにセットして アンロードする様にしています。 見栄えの問題なので絶対必要って訳じゃないんですが。
Meをフォーム名にしてみても動かない?
520 :
デフォルトの名無しさん :2011/06/17(金) 23:49:59.23
とグルボタンで デフォルトがoff(押し込まれた状態)の状態 にする方法ってある?
>>520 UserForm1.ToggleButton1.Value = True
UserForm1.show
かな?かな?
522 :
デフォルトの名無しさん :2011/06/18(土) 00:24:01.87
>>521 フォームを使わず、
Sheet1にActiveXコントロールのToggleButtonをつかった場合です。
したがって、Sheet1にコードを書いた場合です。
523 :
520 :2011/06/18(土) 00:27:21.90
訂正 ToggleButtonで デフォルトがon(押し込まれた状態)にする方法ってある? フォームを使わず、 Sheet1にActiveXコントロールのToggleButtonをつかった場合です。 したがって、Sheet1にコードを書いた場合です。
>>514 原因は「可視領域のコピー」にある
例えば、300件のデータがあって、そのうちフィルタを抜けて表示されたセル(行)が10件あったとしよう
あのコードでコピーされる行数は何行?
おそらく君は10行がコピーされると思ってるのだろう
しかしそれは間違いで、正しくは2003以前なら「65536-300+10 = 65246行」だ
だって、データが入ってない301~65536行目も「可視領域」だろ
六万数千行もの膨大な範囲のコピーを数百回繰り返せば、流石にリソース不足にもなるさ
こんなのは、予備知識が無くてもデバッグ出来る奴ならすぐに気付くこと
だって、各処理の戻り値や変数の変化や内容を確認するという、一番初歩的なデバッグで気付けるから
「可視領域のコピー」ではなく「可視領域『かつデータが入っている領域』のコピー」あるいは
空セルを非表示にした上での「可視領域のコピー」なら、コピー処理でもエラーにはならないはず
まあ書式不要なら、Value = Valueの方が良いとは思うけどね
とりあえず、まともにデバッグが出来ないうちは、どんなに複雑なコードが書けても
「プログラムが組める」「VBAが使える」うちには入らないので、デバッグの仕方はきちんと身につけましょう
このくらいの単純で短い処理ならいいけど、もっと複雑で長い処理になると、
こういうスレで金を貰える訳でもない赤の他人らは、面倒がって相手にしてくれなくなるよ
>>518 ググったんだけど
ClickイベントをMouseUpイベントにしたらできたよ
例えば、リストボックスのValueが"-----"ならListIndex=-1
とか
527 :
丸投げ請負マン :2011/06/18(土) 06:27:00.34
丸投げこいや!!
こいと言っても、君のレベルじゃまともなもの作れないでしょ
529 :
デフォルトの名無しさん :2011/06/18(土) 08:27:29.63
>>523 右クリック→プロパティでTrueにしたら出来たけどさ
(excel2007)
530 :
デフォルトの名無しさん :2011/06/18(土) 10:12:21.87
OS:Windows2000 ExcelVer:Excel2003質問させてください。 処理の高速化が目的です。 ブックA1~ブックAnまでに書かれた同一フォーマットのデータを ブックBに集計しています。 Bに書かれたマクロで、現在Workbooks.openメソッドを使ってA1~Anを参照しているのですが、 Workbookオブジェクトをopenせずに参照する方法はないでしょうか。 よろしくお願いします
あるjpeg画像をサイズ変更して新しいファイルに出力しなおす、ってexcel vbaでできますか?
できる
534 :
デフォルトの名無しさん :2011/06/18(土) 20:07:18.88
>>483 です。
遅レスすいません。
>>484 >>485 有難うございます。
if false then
と
GOTO文を組み合わせることで解決できました。
感謝です。
>>534 それは駄目だ
GOTO文を使わなくていいように考え直せ
536 :
デフォルトの名無しさん :2011/06/18(土) 21:40:29.90
エクセルのVBA初心者が見る参考書でお勧めはなんでしょうか? プログラム言語は全くわかりません。エクセルのVBA以外は扱えます。
>>536 Excel VBAデバッグ編 実践のツボ(九天社)
もう会社なくて絶版だけどまだ十分見つかると思う
自称初心者は是非買っとけ
エクセルのVBA以外は使える…
vbaで2chに書き込むことってできる? ブラウザ起動してとかじゃなくて
おおちょっと勉強してみます ありがとうございます
>>540 出来る、
>>541 の言うようにXMLHTTP使えばVBSですら出来る。
但し、単純にSendすれば良いだけのところに書き込むよりちょっと難しい。
とりあえずCookieが解ってないと無理。まぁ、それ以前に、単純にSendすれば良いだけの
ところへの書き込み方すら解らないとかなら問題外だけどねw
でもCookie含めたHTTPの基礎知識があれば、CookieにしてもSendするデータにしても
仕様は公開されているから簡単に出来るだろう。
スレ違いなので、具体的な解説はここではできないけどね。
544 :
丸投げスルーマン :2011/06/19(日) 02:26:39.56
やっぱり丸投げはスルーします・・><
>>531 できるぜ!、
変更したいサイズにフォームをセット→GetOpenFilename→LoadPicture→SavePicture
でいけると思う
駄目だったらapiのGetObjectとGetBitmapBitsでフォームの画像データの二次元配列がとれるから、後は気合で
>>536 すげーな
俺なんてなんとかテーブルもワークシート関数もろくに知らないぜ!
>>540 エクセルをブラウザがわりって昔誰かが作ってたぜ!
>>543 Cookieは仕組みがおかしいよなw
俺はFunction CookieWriteとかでググってどっかからコピペしたぜ!
545 :
デフォルトの名無しさん :2011/06/19(日) 12:59:18.76
VBA初心者です。 開発支援ツール(アドインなど)で便利なものがありましたら 教えてください。
アドインも自分で作ってこそ漢!!
便利かどうかは個々が判断するものだ 君が何を便利と感じるかなんて知らん 自分で探して自分で便利かどうか試せ
548 :
デフォルトの名無しさん :2011/06/19(日) 15:17:59.11
1 1 2 エンターキー三回で三行分空ける 3 4 2 ・ エンターキー四回で四行分空ける ・ ・ ・ 3 エンターキー二回で二行空ける 4 「入力されてるセルを、エンターキー連打すれば連打するだけ空きセルを作る(改行する)」ってな感じの設定にするにはどうすればいいですか?
EclipseとかのIDEにVBA開発用プラグインとかないのかな?
>>548 そのワークシートに
押されたキーがエンターキーならば、セルを挿入する(縦にずらす)
というコードを書けば?
551 :
デフォルトの名無しさん :2011/06/19(日) 19:23:20.55
>>550 マクロを利用して作ってみたんですが、エンターキーは無理そうなので、ctrlとxで空欄を作ることができました。
ですが、一つのセルだけにしか効果がないようなので、オートフィルする必要がありそうです。
そして、その方法が分かりません・・・・。
>>551 は現時点のマクロです。
訂正よろしくお願いします。
552 :
デフォルトの名無しさん :2011/06/19(日) 19:28:34.24
Sub Macro7() ' ' Macro7 Macro ' ' Keyboard Shortcut: Ctrl+x ' Range("A1:B1").Select Range("B1").Activate Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove Range("B2").Select End Sub なお、熟練者の方々なら見てもらえれば分かるかも知れませんが、ctrlキーとxを押せば「そのとなりのセルも一緒に空欄にする」となっています。 どうかご教授おねがいします。
553 :
550 :2011/06/19(日) 19:58:37.33
>>551 キー押下げのイベントがないみたいですね。
なので
>>550 のようにはできませんでした。すみません。
ショートカット登録でよければ、
Selection.Insert
の一文だけでいいと思います。
登録キーはCTRL+xみたいによく使うのはやめた方がいいです。
例えばCTRL+Shift+Iとかにすればいいと思います。
押入れにしまってたはず
>>551 >>553 の人が言ってるのをパクってEnterキーでやるやつに挑戦してみたわさ。
VBEで
シート側に記述
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Call hoge
End Sub
標準モジュール側に記述
Option Explicit
Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Long
Sub hoge()
On Error GoTo Err_Handler
If GetAsyncKeyState(vbKeyReturn) Then
ActiveCell.Insert
End If
Exit Sub
Err_Handler:
Call MsgBox("もう入れられません><")
End Sub
結構適当だから何か起こるかも知れないわさ・・・
ユーザーフォームを見やすく作るのには textboxのスタイルや BackColorとかフォントとかどんなのが定番なんですか? ネットにもなかなか参考になるレイアウトがなくて。
559 :
デフォルトの名無しさん :2011/06/21(火) 00:21:22.76
設定ファイルから読み取るようにして 利用者に任せる
とりあえず文字をでかくして、容赦なくボタンに色をつける。 下手に小奇麗なデザインより、利用者を最優先する思い切った作りの方が 意外と喜ばれる事が多い。
>>560 フォーム自体の色(背景色)って
グレー系のほうがいいのか迷う俺はどうしたらいいですかね?
どれが視認性いいんだろ。
突き詰めるとカラーコーディネーターとかになるんだろうけど。
テキストボックスは、昔ながらのへっこんだ感じがいいのか、(Falseのときは透過にする)
時代は、フラットな感じなのかわからない。
何のツールかによるな。 身内で使うツールなんかだったら色は自分の好みとセンスでってところはあるけど、 銀行系の上流システムに取り込まれるファイルを出力する様な、上流のユーザーさんが使うツールとかだったら 思いっきり地味に作って無難にしておくかな。 ボタンの配置は作業手順に併せて、ボタンの大きさとフォントは統一するか、 特によく使うボタンは大き目に作っておくかってくらいだけど、 まぁあくまで自分だったらと言う話だけど、制約が無ければ折角のEXCELなんで フォームは使わないでシートを駆使するかな。 バリデートは出来る限りシートの数式に仕込んで集約したセル1こ見ればいい様にしたいし、 ボタンもシェイプにしといてリボン型とかにしとくと大分イメージが変わるし。
>>562 営業・売上日報や請求明細書関連です。
自分でつくって、せいぜい3人程度でしか使わないなら、シート使ったほうがいいのかな。
必死に勉強してフォームとかクラスとかできるようになってきたんだが。
シート駆使ってどんな感じなのですか?
>>562 入力フォームを処理をシートで済ませるってことですか?
たしかにフォームで、テキストボックスを表状に並べたりしましたが
見にくいなって思ってました。
複数行ある上記のテキストボックスの表の各行の合計を自動で計算するのに
クラス勉強したり。
やればやるほどフォームの利点がわからなくなってきました。
エクセルVBAのユーザーフォームの利点ってなにかあるんでしょうか?
>>564 フォームを使うことで他のフレームワークで作ったものと、統一性を図ることが出来る。
例えばアドインファイルにしておいて、立ち上がり時にEXCELのアプリケーションを非表示にしてフォームを表示すれば
見た目VBやC#で作ったのと体して変わらない様なものが作れる。
後はフォーム特有のイベントが有った様な無かった様な・・・
まぁ今までEXCELでフォーム使わないで困ったこと無かったけどね。
逆にファイルを閉じた場合、フォーム中心に考えていたら変数にファイルが閉じる前の値を
継続して使わせたい時、結局シートや外部ファイルに値を残したりそれなりの仕組みを作らなければならないことを考えると、
最初からシートでいいじゃんて事になったり、INIファイルもコントロール用のシートを作ることで
外部ファイルにしなくてもまかなえたりする。
まぁでもあくまで自分だったらということであまり拘らないでいいと思うよ。
ああ、別にアドインファイルにしなくてもEXCELのアプリケーション非表示にすればいけるかな?
セルに入力されている数値分だけ、その行すべてコピーして下に数値分挿入ってどんな構文書けばいいでしょうか。 コピー挿入が終われば、次の行の数値を読んで、また同じ処理を繰り返したいです
>567 丸投げなら ビジネスsoft板/Excel総合相談所97 へどうぞ
Valueプロパティって、エクセルのシートへの文字入力、値の取得以外にも 役割があるんですか? 参考書勧めてたらユーザーフォームの項目でも見慣れる形で出てきたのですが・・・ もうひとつですが、変数の宣言に関しての質問です 「Dim 変数名 As データ型」と宣言方法はなると参考書に書いてますがAs データ型以降は省略しても 大丈夫なんでしょうか?(´・ω・`)初学者で困っています
>>569 value省略してたら、数字が文字列として転記されたりする。
as移行を省略したら、宣言する意味がない。
>>569 その辺、その参考書には書いてないのか。
なんちゅう参考書だ。
まずValueは値。シートに限らず、また、文字列に関わらず値を司るプロパティ。
変数の型は省略すると、Variantと言う型が割り当てられるけど、これがメモリを16バイト以上食う。
例えばInteger型などは2バイトしか使わないが、この型で済む様な値しか扱わない様な場合、
型を設定しなければしない分だけ無駄なメモリ領域を消費し圧迫して処理速度にも影響を与える事もある。
とりあえずコードを書く際、先頭行にOption Explicitと書いて、使う変数は例えVariantであってもそれを
明示的に型指定する様に記述する事をお勧めする。
特に型の指定は後々Object指向言語を使う事になった場合、VBAとは比較にならないくらい
色々な制限や使い方があるので、そちら方面に進みたいならせめて型の宣言は常に行う癖を付けておいた方がいいと思う。
572 :
デフォルトの名無しさん :2011/06/22(水) 23:43:36.89
環境 OS WinXP Excel2003 Felicaカードリーダを用いて、VBAのユーザーフォームで、Felicaカードの読み込み機能を作成しています。 ユーザーフォームが表示されている場合のみ、カードの読み込みを受け付けたいのですが、 VBAってApplication.onTime以外に、イベントのような扱いはできないものでしょうか?
>>572 APIでフォームのハンドル探せばいいんじゃないの?
WinAPIやハンドルなんて解らないとか言い出しそうだが Excelとは関係ない部分なので、なんにしろスレ違いだな。
575 :
デフォルトの名無しさん :2011/06/23(木) 07:23:46.36
>>573 ご返答ありがとうございます。フォームのハンドル関連からググッてみます。
>>574 たしかにWinAPI等詳しいと呼べるちしきはないですね。
ただ、Excelの機能で待ち受け状態が擬似的にできればよいので、
そのような方法がないかさがしておりました。
どちらにしろ、お二方ご返答ありがとうございました。
576 :
デフォルトの名無しさん :2011/06/23(木) 09:53:12.59
できるよ
577 :
デフォルトの名無しさん :2011/06/23(木) 12:04:53.33
VBAで組み込み関数と同じ名前の変数を作ってしまったんだ。(先頭の文字が小文字になっている変数) インテリセンスがうまくきかなくなってしまったんだけど…どうしたら元に戻せますか?
>>578 消してあります。
なのにちゃんと機能してくれません…
クリーンがあればよかったとつくづく思います
>>579 再度宣言し直す
例えばmsgboxと、変数を作ってしまったら
Dim MsgBoxと、VBEに書いてから
このDim~を消す
581 :
デフォルトの名無しさん :2011/06/23(木) 18:58:24.32
エクスポートしてインポートするといいんだな
印刷時の印字濃度を制御するコーディングは可能でしょうか? めちゃくちゃ薄い印字がしたいのです。
>582 プリンタドライバでの設定じゃダメなの?
できるよ
それを実現するための、メソッドとプロパティを教えていただけませんか?
>>580 ,581
できたっ…本当にありがとう…!
印字濃度が変更できるプリンタってそんなにないでしょ できてもせいぜい3段階ぐらいだよね 制御方法も機種ごとに全然違うし それよりも文字や罫線を明るい灰色に変更してグレースケールかカラーで印刷した方がよくない?
やっぱり無料なんですかね。どうしてやりたかったというと、社内のインク代節約を実現したかったからです。
589 :
デフォルトの名無しさん :2011/06/24(金) 11:18:06.47
ドラッグ&ドロップを常に切り取りにする方法ってある? vbaとは関係ないがw
590 :
デフォルトの名無しさん :2011/06/24(金) 11:24:48.25
× ドラッグ&ドロップを常に切り取りにする方法 ○ ドラッグ&ドロップを常に切り取り貼り付けにする方法
592 :
デフォルトの名無しさん :2011/06/24(金) 11:29:25.34
Shiftを押すのは邪魔くさいので、 どこかのチェックボックスをon/offすることでできない?
お前らそろそろEXCEL-DNAに移行しろよ。 幸せになれるぞ。
なんたよDNAって
On Error Gotoについて質問です。(EXCEL 2003) 現在DBのような規則的に並んでいるデータからキー値を取得して、 そのデータをデザインしたフォーマットに基づきEXCELファイルに出力させようとしています。 ※↑は説明用に作りました。(キー値は手入力の為、どうしても重複する事がしばしば) 上記のマクロ組んでいるのですが、キー値が被ってエラーが発生する事があります。 なので、キー値が被っていたら次のデータへいくように下記のようにエラー処理をいれてみました。 悩んでいるのは、エラー発生時に全て定義したGOTO文へ飛んでしまうのですが、回避策ありますでしょうか? sub TEST() On Error Goto NEXT if CheckKeyData then 'キーチェックし重複であれば NEXTへ Goto NEXT end if sheets("aaa").select 'もし、ここでありもしないシートを選択したとしても、NEXTへいってしまいます。 NEXT: end sub よろしくおねがいします。
>>597 です。
説明不足失礼しました。
キー値はEXCELに手入力で打ち、EXCELからマクロ実行するとDBのようなファイルへアクセスし、
データひっぱってくるよにしています。
ラベルを2つに分ける
>>596 なん……だと……
エクセルをdotnetで動かせるわけじゃないよな?
>>599 ラベル効果を無効にしてしまうような機能があればと思いましたが、
やっぱりラベル複数用意しないと回避はできないのですね・・・
ありがとうございました。
On Error GoTo 0を入れれば
自分でチェックしてGotoするなら、On Errorいらないと思うんだが...
605 :
デフォルトの名無しさん :2011/06/24(金) 23:40:03.96
VBAでシストレしてる人 データはどこからとってる?
散布図に最初は目盛りの最大値を自動で合わせる状態にして計算をして 計算が終わったらxとyの目盛りの最大値を比べて高い方の値に両方を合わせたいのですがどうすればいいでしょうか sheet1のグラフ2です
事故解決しました
608 :
デフォルトの名無しさん :2011/06/25(土) 11:00:02.63
VBAでindirectするにはどうしたらいいですか? 例としてセルA1に"Sheet2!B2"と書いてあって、A1の通りSheet2!B2に"×"と記入する
609 :
デフォルトの名無しさん :2011/06/25(土) 11:02:58.48
前スレにありました 事故解決しました
>>603 EXCELのVBE上で入力補完付きで編集出来る様になるなら期待するけど、
そうじゃなきゃVS上で作ってdllにして参照した方が早いからイラネ
611 :
デフォルトの名無しさん :2011/06/25(土) 12:50:21.80
Xについての4次方程式を解きたいのですが これはゴールシークを使ってどのようにすればいいのでしょうか? よろしくお願いします。
UserForm1を二つ表示することは可能でしょうか? 同じのを二つ作らないとだめなんですかね
不可能なはず でも、同じのを2つ作れば完璧に解決することなんだから、それでいいじゃん どんなに複雑なフォームだろうと、全く同じのを作るなら、ほとんど手間かからないし
コピペして終わりだろ・・・
615 :
デフォルトの名無しさん :2011/06/25(土) 21:57:41.25
他のブックに現在開いているブックから セルの中に変数名を含む式を記述する方法について質問です。 dim 数字 as integer Workbook.Worksheets("Sheet1").Cells(1, 1).Formula = "=数字 * 100" とやると、「=数字 * 100」とそのまま入ってしまい上手くいきません。 どのように記述すれば良いのでしょうか? よろしくお願いします。
>615 ).Formula = "=" & 数字 & "* 100"
617 :
デフォルトの名無しさん :2011/06/25(土) 22:51:51.08
Month関数を使いたいのですが month()と小文字になって、配列がありませんとエラーになります どうしたら良いですか?
618 :
デフォルトの名無しさん :2011/06/25(土) 22:56:24.22
定義されてないんだろ
month という 変数 を宣言してない?
620 :
615 :2011/06/25(土) 23:32:36.09
>>616 答えてくれてありがとうございます。
助かります。
A1にaaa.xls A2にbbb.xls と合った場合に もしExcelファイルと同じフォルダにaaa.xlsやbbb.xlsがあった場合 それぞれリンクをつけてそのボタンを押下すると自動的に起動させたいのですが 可能でしょうか? 当然なかった場合にはリンクは張らない状態です
できる
624 :
忍法帖【Lv=1,xxxP】 :2011/06/26(日) 00:26:36.65
IF文について質問です If c >= 1 Then ~ 「1」を別のワークシートのA3~Z3までの値にする場合 どのように書いたらいいのでしょうか?
なんか同じ奴がつまらん質問を繰り返しているようだが 気のせいか?
ヒント:ゴッゴル先生
>>614 ユーザーフォームの内容によってはエクスポートして、ユーザーフォーム名だけ変えてインポートした方が早い
>>624 論理演算かループで
628 :
デフォルトの名無しさん :2011/06/27(月) 01:22:08.21
(ブック名)は既に開いています。 二重に開くとこれまでの変更内容が失われます。
といったエラーが出ることについて質問があります。
Dim thisBook As Workbook
Set thisBook = ThisWorkbook
Set Workbook = Workbooks.Open(thisBook.Path & "\test.xlsx")
ThisWorkbook.Activate
中略
Workbook.Worksheets("Sheet1").Cells(1, 1).Value = ID
というようにこれだと1回目の書き込みは上手く行きますが
2回目以降が上記のエラーが出て上手くいきません。
http://www.excel.studio-kazu.jp/kw/20071007202040.html ここを参考に
If flg = False Then の下にブックが開いていない場合の処理として開くように
Set Workbook = Workbooks.Open(thisBook.Path & "\test.xlsx")
と書いてみたのですが駄目でした。
どこが悪いのか教えて頂けると非常に助かります。よろしくお願いします。
1回処理が終わる毎にちゃんと閉じてるの? 閉じずに開くばかりじゃ、エラーも当然だろw 2回目にまた開くなら、1回目が終わったところできちんと閉じる 1回目が終わっても閉じないなら、2回目は新たに開くのではなく 既に開かれているものを利用する そんな当たり前のことをちゃんとやれば問題ないと思うが
質問させてください エクセルのバージョン(2010とか2000とか)を調べる方法を教えてください お願いします
Application.Version
632 :
631 :2011/06/27(月) 11:46:34.09
Application.Versionでぐぐってこういうのがあった 2010は持ってないから知らん sVer = Application.Version Select Case sVer Case "12.0" MsgBox "Excel2007" Case "11.0" MsgBox "Excel2003" Case "10.0" MsgBox "Excel2002" Case "9.0" MsgBox "Excel2000" Case "8.0a" MsgBox "Excel97 SR-1" Case "8.0" MsgBox "Excel97" Case "7.0" MsgBox "Excel95" Case Else MsgBox "不明" End Select
質問する前にちょっとはググれよ。 2chに書くのもGoogleの検索窓にキーワード書くのも手間は変わらんだろ?
ありがとうございます!
非表示シートを再表示するのに Worksheet.Visible = True とすると 「'Visible' メソッドは失敗しました」と出るのですが、原因が判りません 表示したシートに対して Worksheet.Visible = False は動きます 環境はWin7、Excel2003です よろしくお願いします
対象が間違っている
それだとFalseの方も動かないと思うんですよ Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets("aaa") ws.Visible = True : ws.Visible = False
>>637 Excel2000だと、自動計算か何かの設定によってVisibleが失敗するってバグがあった気がする
2003はどうかなあ
変数wsがどっかで変更されてない?
とりあえずテスト用のプロシージャを作って最小限のコードで試してみ
Sub 表示テスト()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("aaa")
ws.Visible = False
ws.Visible = True
End Sub
>>638 XP、Excel2000ではエラー出なかったです
今Excel触れないので後日テスト用コードを試してみようと思います
640 :
デフォルトの名無しさん :2011/06/27(月) 22:09:04.34
Range("A1").Formula = "=SUM(A2:A3)" と、上のような足し算等をCellsを使ってやりたいのですが Cells(1, 1).Formula = "=SUM(Cells(1, 2):Cells(1, 3))" と書いても駄目で、他にも試してみましたが上手くいきませんでした。 どのように書けばよろしいでしょうか? よろしくお願いいたします。
>>640 Cells(1, 1).Formula = "=SUM(" & Cells(1, 2).Address(0, 0) & ":" & Cells(1, 3).Address(0, 0) & ")"
>>640 訂正。
>>641 だとSUM(B1:C1)になる
Cells(1, 1).Formula = "=SUM(" & Cells(2, 1).Address(0, 0) & ":" & Cells(3, 1).Address(0, 0) & ")"
643 :
640 :2011/06/28(火) 00:20:40.00
>>642 ありがとうございます。
Address(0, 0)と書くとは全くしりませんでした。
勉強しておきます。
ありがとうございました。
644 :
デフォルトの名無しさん :2011/07/02(土) 09:12:51.83
VBAで再帰使うとすぐスタックオーバーフローとか出るね
まぁ「すぐに」って言うのもどれぐらいを指してすぐなのかと言うのはあるけど、俺も再帰処理はキライ。 階層を持つ様なものを生成させる場合でも、なるべく避けるな。
646 :
デフォルトの名無しさん :2011/07/02(土) 12:16:24.74
Rangeのデフォルトプロパティについて質問です。 For Each r In Range("A1").Value Debug.Print r Next ↑で1行目でエラーが発生するのは分かるのですが、 For Each r In Range("A1") Debug.Print r Next ↑のようにValueプロパティを省略した場合に、 エラーが発生しない理由が分かりません。 Rangeでプロパティを省略した場合は、 デフォルトであるValueプロパティが選択されると思っていたのですが、 何か別のプロパティが選択されているのでしょうか?
For Each r In Range("A1") の Range("A1") は Valueプロパティ(又は他のプロパティ) が省略されたものではなく Rangeオブジェクト(が返される)だから
Rangeの既定のプロパティはValueではない バージョンによってヘルプの記載もよくわからない状態になってるんだが すくなくとも、2007のヘルプで Range.Cells プロパティ を見てみると >Item プロパティは、Range オブジェクトに対する既定のプロパティであるため と書いてある オブジェクトブラウザで確認するとホントは_Defailtっていう隠しプロパティだったいする で、こいつが場合によってItem(=Cells)のようにふるまったりValueのようにふるまったりする なので、この場合は For Each r In Range("A1").Cells と同じ意味 明示的にこう書く方が解りやすくて俺は好きだ まあ、あんまりデフォルトプロパティを使うのはよくない
C#とかだとデフォルトプロパティが禁止されたから、意識するべきではあるな VBAもやがて.NETに移行するのかも知れんし
いいねぇ.Net。 C#Aとかになって、今のモジュールやクラスモジュールごとにモジュールを分けるんじゃなくて、 名前空間ごとにファイルを分けたり、継承だけじゃなく、ポリモーフィズム効かせられたり、 ジェネリックやデリゲートやラムダ式とか使えれば最高なんだけどね。 もっとも、今までのVBAの資産があるから中々難しいだろうけどね。
>>651 だからファイルが分かれるなら余りうま味が無いって。
VSからdllファイル作った方が早い。入力補完も効くし。
むしろデータとアルゴリズムの分離って意味ではファイルが分かれた方が良くね? アドイン化した後のファイルの配布の管理が面倒だけど。
>>653 >むしろデータとアルゴリズムの分離って意味ではファイルが分かれた方が良くね?
それはどんなシステムとして使うかによりけりだけど、
ファイルを分割して各機能を分けるくらい大掛かりなものなら
データはAccessやSqlServer、Olacleなどで持って、ロジック部は.NetFrameworkやJavaとかで作成して、
出力物としてExcelを使う様にした方がそれぞれの長所を活かせる。
そうなると、基本ロジック部は.NetFrameWorkやJavaとかで扱うことになるから、
益々Excel-DNAとやらの出番は無くなることになると思うよ。
VB.netちょっとやってて VBAに来てナンジャコリャーって思うのが 「コロンイコール(:=)」これ イコールとどう違うの?
プロパティ設定 dotnetでもあるだろ
>>654 >益々Excel-DNAとやらの出番は無くなることになると思うよ。
試しもしないで必死に避難してるの?
まあ、それはさておき、
VSが使える > ファイルが分割される
.NETが使える > ファイルが分割される
って言う人もいるだろうよ。
俺はVBA資産が多いのでいきなりは移れないけど、面白い
アイデアだと思うよ。
ファイル分割ってのがいまいちわからんな ソリューションファイルとかbinフォルダが生成されるとかだと、エクセルやアクセスが単体で動作出来なくなるじゃないですか、やだー! いずれdotnetに移行するとは思うけど、VSからリリースされ、かつオフィスソフト単体で製造出来るVBA.NETになると思いたい 相互開発可能な形で、モジュールインポート見たいにプロジェクトに組み込まれる方式ににていただきたい
>>657 避難してどうする。
ファイルが分かれるってメリット大じゃん。
あの糞使いにくいVisual Basic Editorわなくて済むんだから。
一旦Visualstudio使い始めるとVisual Basic Editorは苦痛でしかないよ。
あのIDE使いにくいところもあるんだが わざわざ手打ちしてるのに勝手にインテリセンスに修正したり、インテリセンスにあるのに別候補に書き換えたり 機能を個別に設定出来ないし まじでストレス溜まる
Excel2007 フォーム上に貼りつけたボタンに付いては例えば xxbtn.Enabled=True xxbtn.Enabled=False みたい有効・無効を設定できるけど シート上に貼りつけたボタンに付いては 有効・無効を設定できますか?それ以前にそのボタン名をどうやって 取得できるのかってのもあるんですけど。。。
>>657 だからそうなるんなら、最初からVS使えって話。
VS上で.NetFrameWorkの言語から
EXCELを操作すればいい。
>>662 もう一回だけ言うけど、試してから文句言ったら?
VisualstudioからEXCEL使おうとすると、普通はあのめんどくさいCOM経由で
アクセスする必要があるだろ?EXCEL-DNAなら.NETの機能を使用しつつ、
COM経由のアクセスの面倒さを回避できるんだよ。
豊富な.NETの機能もつまみ食いできるしな。
試してから気にくわなければ、使わなければ良いだけだと思うけど。
C とか C++ ならいざ知らず、VB.NET とか C# ならたいして面倒じゃないだろ。 どうみても試す価値なしだと思うので、俺には不要。
>>664 C#はデフォルトプロパティの省略ができないだけでなく、パラメタの規定値の設定ができない
ExcelをCOMオブジェクト経由で呼び出すのは非常に面倒、というか冗長
Type.Missingの嵐になる
分からないなら、お前さんのExcelVBA上で、パラメタの省略を一切せずに全てカンマを入れてみろ
俺もどこの馬の骨が作ったか分からない 大して人柱にも精査されていない ひょっとしたらウイルスが仕込まれているかもしれない様なのを手放しで入れるのは嫌だな。
>>665 4.0以降ならそんなこともないんじゃなかったっけ?
668 :
665 :2011/07/06(水) 07:56:59.76
>>667 RCWのこと?4.x系で書いたことないからよく知らんのだけど
確かにオプションで引数、名前付き引数が追加されたようだね
COM資産は未だに影響が大きいようだ
でも大体Excelのバージョンは決めうちできないから遅延バインディングで
書くことになるだろうし、リフレクションを通さなくちゃいけなかったりと割と面倒
VBだともうちょい楽に書けるようだけど
>>665 この御仁たぶんC#もまともに使ったこと無いでしょ。
相手するだけ無駄だと思うよ。
671 :
661 :2011/07/06(水) 14:59:21.71
回答してくれそうな雰囲気なしなんでこの質問は閉じます
672 :
デフォルトの名無しさん :2011/07/06(水) 15:45:34.74
ボタンを押したらオートシェイプを出すっていうプログラムが書けたのですが、 押すたびに座標をずらして図を表示させたいのですがボタンの判定をifの条件式 に入れる方法ってありますか?
>>671 質問ならならあげとけよ
Sheet1.Shapes("Button 1").ControlFormat.Enabled = False
Sheet1.CommandButton1.Enabled = False
とか
>>672 ボタンの判定をifの条件式に入れるってどういう意味だ?
普通はボタンを押してからコードで判定すると思うんだが
>>673 ボタンを押すたびに座標に数値をプラスしていく感じかとおもって
if ボタンが押される then 座標に値を足す
みたいにできないかと思いまして
ひょっとしてボタンってキーのこと? だったらAPI使えば出来るよ。スレチだけど。
>>674 ボタンを押したら、シェイプを(ずらして)表示させるんだろ?
つまり、ボタンを押した処理の中で判断すればいいのでは
イベントとかよくわかってないレベルの人か?
VBAでウィルスって作れるの?
678 :
デフォルトの名無しさん :2011/07/06(水) 23:46:03.09
ファイルの特定の二列の入力値の組み合わせは4種類しかありえなくて、その4種類の組み合わせに応じて その行の他の列のセル内容を転記するかどうかを決めさせたくて、FindやIfを使えば簡単に書けそうだと思って 朝からこの時間まで格闘してましたが、できませんでした・・・ A B C D 1○○ 2○× 3×○ 4×× 5○○ 6×○ 7×× 8○× 単純化するとこうなっていて(行の多さはファイルによって変動し、常に8行とは限らない。ただしA~の横方向の入力内容は常に固定)。 そして、Cells(i, A) と Cells(i, B)の組み合わせが AB=○○ → 何もしない AB=○× → 何もしない AB=×○ → その列の(C,D...)はコピー対象 AB=×× → 何もしない そしてまずCells(i, A) と Cells(i, B)の組み合わせが○×の行が一つもないファイルは閉じて 一つでもあるファイルは、個々の行をコピーするようにしたいのですが・・・・簡単に見えて全くできませんでした 「○×」の行が一つもないかどうかをフラグで返す方法だけでも宜しいので、ヒントなり戴けないでしょうか?
>>678 いまひとつ何がしたいのか分からないんだけど
普通にこんな感じで駄目ですか?
ファイルを開いて
フラグをOFFに
(行について繰り返し開始)
もしこの行が空白なら行についての繰り返しを抜ける
もしこの行のA列が○ かつ B列が×ならフラグをONにする
行をひとつ進める
(ここまで行についての繰り返し)
もしフラグがONならコピー処理をする
ファイルを閉じる
>>678 '指定範囲で○×の行を探す あればTrue なければFalse
Function checkOX(CheckRange As Range) As Boolean
Dim i As Long
checkOX = False
If CheckRange.Columns.Count <> 2 Then
MsgBox "2列を指定してください"
Exit Function
End If
For i = 1 To CheckRange.Rows.Count
If CheckRange.Cells(i, 1).Value = "○" And CheckRange.Cells(i, 2).Value = "×" Then
checkOX = True
Exit Function
End If
Next
End Function
>>681 長いことBASIC使ってるけど、そんな演算子初めて知ったわ
一つ勉強になった
ただ、.NETで廃止されてるらしいし、この先使うことない知識だろうけど
Excel2007のマクロが遅いことで質問させてください あるフォルダにあるすべてのブックの各シートを一枚のシートに貼り付けなおすマクロを作っています。 ただExcel2003では問題無く動くのですが、 Excel2007で互換モードまたはxlsmで保存しなおして動かすと 最初は早く処理されているのですがだんだん処理が遅くなっていきます。 (Application.ScreenUpdatingはTrueのままですがFalseでも変わりありません) また、処理が遅いときにExcelの画面外をクリックすると(Excelを非アクティブにすると) 途端に処理が高速に戻ります。 同じ経験をした方等、対処方法わかるかたはいらっしゃいますでしょうか?
セルをバリアント型に入れて計算していて 途中でApplication.WorksheetFunction.Sumなど使いたいとき バリアントの特定領域をRange型に変換するスマートな方法教えてください。
>>684 ホントにセルがバリアント型変数に入ってるなら、その変数はすでにRange型だが?
Rangeに対してオフセットとりたいならRange.OffsetプロパティとかRange.Rangeプロパティ使え
Set c1 = Range("B2:C11")
Set c2 = c1.Range("B1:B10")
これでc2はC2:C10のRange型だぞ
だがまあ多分そういうことじゃないんだろうけど
バリアントの変数に入ってるのが値の配列なら
実際のセル(Range)に代入するしかないんじゃね
VBAで配列の特定範囲を切り出すスマートな方法はしらね
先頭からならReDim Preserveってのもなくはないが、もともと配列は
途中でサイズ変更するような用途向けではない
まあ必要なら関数1個つくっとけば良いだけだし
>>685 Set c1 = Range("B2:C11")
Set c2 = c1.Range("C2:C10")
↑これやってみましたけど出来ませんでした。
Dim sh As Worksheet
Set sh = ThisWorkbook.Worksheets("Sheet1")
Dim cB As Variant
cB = sh.Range(sh.Cells(1, 1), sh.Cells(10000, 20))
Dim rng As Range
Set rng = cB.Range(cB.Cells(1, 10), cB.Cells(10000, 10)) ←イメージとしては、こんな風にRange型に入れたいです
>>685 すいません出来ましたSetが付いてないだけでした
ありがとうございました!
>>684 VBAを使わない。
全部Excel側でやる。
689 :
678 :2011/07/07(木) 07:22:58.09
ありがとうございました! 助かりました
>>665 > C#はデフォルトプロパティの省略ができないだけでなく、
> パラメタの規定値の設定ができない
C# 4.0 も知らない情弱か...、かわいそうになってきたよ。
>>668 よく知らないなら、ROM って1人で Excel-DNA とやらを使ってろよ。
また恥かくだけだぞ。
>>669 流石にこれは恥ずかしすぎ。
誰からも相手されてないんだろうな (w
またキモいExcel-DNA儲が湧いてきたな
どこをどう読んだら儲に見えるんだ?
A1からD10まで0を入れたいんだけど C列はそのまま放置したい っていう時に For s = 1 To 10 Sheet1.Range("A" & s) = 0 'A1からA10までを初期化 Sheet1.Range("B" & s) = 0 'B1からB10までを初期化 Sheet1.Range("D" & s) = 0 'D1からC10までを初期化 Next s こうやってるんだけど、他に方法ある?
A1:B10 と D1:D10 じゃだめなのかい
cellsでfor2つにネストしてC以外の時に処理させるとか
そんな感じで ループで1行ずつ入れずに (A1:B10) = 0 みたいなことをやりたい
セル選択 selection.formulaR1C1=゙0゙
c列をどっかにコピー a:d列に0入れる c列を戻す とか
Sheet1.Range("A1:B10").Select Selection.FormulaR1C1 = 0 Sheet1.Range("D1:D10").Select Selection.FormulaR1C1 = 0 で、できました ありがとうございます。 どうでもいいけど 「で、できました」って 「こうするとできました」じゃなくて、 驚愕みたいな「う、うわっ」みたいに読めるよね
>>699 693よりコード悪化してるぞ
まだ
Range("A1:B10").Value = 0
Range("D1:D10").Value = 0
のほうがマシ
しかし汎用性のないコードだな
>>692 そういうことにしないと否定できないんだろ。察してやれ。
>>700 本当だ、こっちの方が早い
実際のプログラムは4列x60行で
最初のループだと置換が終わる処理まで約6秒かかっていたのが
>>699 で約2秒
そのコードにしたら約1秒で終わった。
そんなに違いあるのか
PCの性能もあるだろうけど A:1に0 A:2に0 A:3に・・・って60までループするより A:1からA:60まで全部0!!(どかーん) のほうが圧倒的に速いのは確定的に明らか
VBAでももちろんだけど、 .NETのようなアウトプロセスでのアクセスだと顕著に差が出るよね
オートシェイプに文字を書くのが調べてもわかりません
>>708 よく見かけるのはこんな感じ
Dim Shape1 As Object
Set Shape1 = ActiveSheet.Shapes.AddShape(msoShapeRectangle, 50, 50, 100, 100)
Shape1.Select (True)
Selection.Characters.Text = "hello"
入力されている文字の左から1文字が1か2かで色をつけて他は空白にしたいのですがどうしたらいいですか Private Sub Worksheet_Change(ByVal Target As Range) With Target.Interior Select Case Target.Left(Target.Text, 1) 'ここがわからない Case "1" .ColorIndex = 3 Case "2" .ColorIndex = 5 Case Else .ColorIndex = xlNone End Select End With End Sub あとできればRange("B2:Y35")の間だけこの色の変更が効くようにしたいのですがそこも教えて欲しいです
すみませんメモ帳でやったらうまくインデントできませんでした Private Sub Worksheet_Change(ByVal Target As Range) With Target.Interior Select Case Target.Left(Target.Text, 1) 'ここがわからない Case "1" .ColorIndex = 3 Case "2" .ColorIndex = 5 Case Else .ColorIndex = xlNone End Select End With End Sub
>>710 Private Sub Worksheet_Change(ByVal Target As Range)
If Application.Intersect(Target, Range("B2:Y35")) Is Nothing Then Exit Sub
With Target.Interior
Select Case Left(Target.Value, 1)
Case "1"
.ColorIndex = 3
Case "2"
.ColorIndex = 5
Case Else
.ColorIndex = xlNone
End Select
End With
End Sub
x = cells(a,b).c xにaを返すためにはcを何にしたらいいんですか
事故解決しました
>>702 701じゃないけど、汎用性持たせるとこんな感じか?
Sub Test()
Call NumericalInitialize([A1:B10,D1:D10])
End Sub
Sub NumericalInitialize(IniRange As Range)
IniRange.Value = 0
End Sub
あるいは
Sub Test()
Call InputValue([A1:B10,D1:D10], 0)
End Sub
Sub InputValue(InputRange As Range, Optional Value As Variant = Empty)
InputRange.Value = Value
End Sub
とか。
でも、
[A1:B10,D1:D10].Value = 0
で良い気がする。
Range("A1:B10").Value = 0
Range("D1:D10").Value = 0
みたいに2行で書かざるを得ないものを、ParamArray使った自作関数で、
1行書き出来るようにするとかならまだしも、元から1行書き出来る上に、
関数化しない方が処理の明示性が高いくらいなので、関数化の旨味も少ない。
一般の仕事で使えるマクロってどんなものがあると思う? データ収集と解析以外あんまり使い道内容に思うんだが
>>717 帳票作成は?
昔さんざんやらされたけど w
>>718 スレ違い
学校の課題であるというのもスレ違い要素の一つだが、何よりExcelVBAとは関係ない質問だ
単に言語選択としてたまたまVBA使ってるだけで、C#でもVB6でも出来るような類の処理は
全てスレ違いなのでそこんところよろしく
ここはVBAでExcelのブックやシート、標準オブジェクト類を操作する話以外はスレ違いだから(
>>2 参照)
>>721 御指摘ありがとうございます。
すみませんでした。
XP Excel2007です。 WEBクエリでページをシートに読み込んでるんですが、続けてるとアクセス出来なくなります。 WEBクエリのアクセスをブラウザからに見せる事は出来ますか?ユーザーエージェントを書き変えて送信とか。 別に攻撃しようとかじゃ無いんです。1秒に1回くらいアクセス出来ればいいです。
725 :
724 :2011/07/11(月) 07:44:21.18
HttpSendRuqestやHttpAddRequestHeadersで検索したけど、 WEBクエリにどう応用していいか分かりませんでした。 VBA始めてそんなに長くないので、あんまり詳しくないです。
>>727 館長の基地外発言が話をヤヤこしくしたあれか
パスワードかなんかが暗号化せずに鯖においてあったなんて話もあるんだっけ、あそこ
逮捕されたけど結果は無罪だったじゃん 前例があるからこそ、今後はあんなバカな逮捕劇は起こらんのじゃないか?
>>730 楽観的だなぁ・・・日本という国は技術がある者ほど割を食うIT後進国なのに・・・
Winny作ったやつは逮捕されても当然としてもその罪状が幇助罪だったから、開発者はみんな明日は事故的に火の粉をかぶると怯えたもんだ
あれは怯えている設定にして無罪を勝ち取ろうとした戦術だろ。 実際には、ふ~んて感じだった。 blogでDQN行為を自慢して炎上するようなもんだ。
>>732 職業プログラマやってる友人やその仲間の話なんだけど
案外、皆Winny系統のアプリ使いまくっていて、 巻き添え逮捕に怯えていたとかそんなところだったりしてw
735 :
724 :2011/07/13(水) 08:50:40.24
>>727 そんな事件あったって知りませんでした。やっぱ相手サーバが拒否してる事はやっちゃダメか・・・
春ごろまではOKだったのに、リニューアルされたら急にアクセス規制がきつくなりました。
ソニーエンタメの影響かなあ
とりあえず串とwait関数で気長にやります。
736 :
デフォルトの名無しさん :2011/07/13(水) 22:23:06.60
きちんとしたデータを作ればVBAで工場の予定表も作れるし、 注文書も納品書もできるし、棚卸しだって効率的にできる。 極論すれば工場の経営や管理ができるんだから汎用的 だと思うよ。
>>734 だーかーらー
プログラマとして物作りを阻害する警察の動きに不安を感じたんだってば
>>727 のリンク先読んでから出直せよ
そんなことじゃ見せかけの民主主義かつ、中国共産党による言論統制、政府を守るためなら国民は死んでもいいって社会が日本でも永遠に続く
原子力発電のためなら国民やその子供が死んでもお構いなし、旧ソ連以下の日本のまんまだ
何か剥がれてきたw
初心者なので上手く伝わるかどうかわからないのですが 二個の図を同時に生成する時に、その二つをグループ化させた状態で生成する事ってできるでしょうか?
はい、出来ます
グループ化させた状態で作成? 2つ作成してからグループ化?
開始 図1個目作成 図2個目作成 図1と図2をグループ化 終わり これで同時生成かつグループ化した状態で出現したように見える
指定したテキストファイルの行数を返してくれる1行のステキ関数ってない?
自作
745 :
デフォルトの名無しさん :2011/07/15(金) 23:10:53.46
エクセルで十字カーソルが表示できない? 折れ線グラフを見るときに便利なんだが。
最近の質問者は丸投げが多いな。 自分でここまで調べたけけど、ここからが分からない と言った感じが全く見受けられない。
教えたがりが多いので問題ナッシン
748 :
デフォルトの名無しさん :2011/07/16(土) 07:52:38.71
Excel2007 ブックを閉じられないようにするにはWorkbook_BeforeCloseでCancel=Trueですよな? Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim res As Variant MsgBox "閉じる?", vbYesNo If res = vbNo Then Cancel = True End If End Sub として、閉じるときに「閉じる?」のメッセージボックスは出てくるんだけど"いいえ"を選択しても閉じられてしまうんですけど。
749 :
デフォルトの名無しさん :2011/07/16(土) 08:46:05.63
>>743 > 指定したテキストファイルの行数を返してくれる1行のステキ関数ってない?
split まあ帰ってくるのは数字ではないが・・・
>>748 res に何も入ってないんでは?
以下サンプル
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If vbNo = MsgBox("閉じる?", vbYesNo) Then
Cancel = True
End If
End Sub
>>750 あっ~そうだ!w
すんませんでしたぁm(_ _)m
>>743 ステキ関数はないけど1行で書くのは可能
Debug.Print CreateObject("Scripting.FileSystemObject").OpenTextFile("c:\test.txt", 8).Line - 1
ただしファイルの末尾が改行コードじゃなかった場合は1行少ない数値が取得されるんで、
そのあたりをちゃんと処理するには面倒なコードが必要
何を調べればよいか解らないんだよたぶん
754 :
初心者 :2011/07/17(日) 08:09:27.83
初心者質問です。 sheet1 に A1から A B C 1 1 C b 2 3 A a 3 1 B a 4行目以降も各列にランダムに数字、文字がつづきます。 以前VBAプログラムをおしえていただいたのですが、途中、 a=range("A1").CurrentRegion.resize(,3).select とありました。 これの resize(,3) の意味が解りません。 上のプログラムの意味を教えてください。お願いします。
756 :
初心者 :2011/07/17(日) 09:34:21.06
>>755 resize(1,3)とおなじ意味だったのですか。ありがとうございます。
もう1つ聞きたいことがあるのですがすみません、よろしくおねがいします。
さっきの
a=range("A1").CurrentRegion.resize(,3).select
の下に、
for z= 1 to ubound(a,1)-1
とあるのですが ubound(a,1)-1 の意味がわかりません。
下記サイトでuboundを調べたのですが、、、よくわかりません。
http://msdn.microsoft.com/ja-jp/library/cc437658 (v=vs.71).aspx
すみませんが少し教えてください。お願いします。
757 :
755 :2011/07/17(日) 10:03:01.80
>754,756 試してみたら違ってました。ゴメンナサイ 当該範囲の行×3列 ということでした。(1行ではありません!) range("A1").CurrentRegion. っていうのは>755で示したページの説明にもあるように A1セルで [Ctrl]を押しながら[*}(ノートPCなら[Shift]を押しながら[* : け])を押した範囲 なので、このときに5行×5列が選択されたとしたら、5行×3列に選択し直される、ということです。 ちゃんと試してから書き込まないとダメですね、反省
>756 a=range("A1").CurrentRegion.resize(,3).select って、ほんとですか? a=range("A1").CurrentRegion.resize(,3) までならわかるけど(選択したセル範囲を配列に入れる) ためしに a = Range("A1").CurrentRegion.Resize(, 3).Select MsgBox (UBound(a, 1)) だとエラー(実行時エラー13:型が一致しません)になりました。 a = Range("A1").CurrentRegion.Resize(, 3) MsgBox (UBound(a, 1)) ならば選択セル範囲の行数が表示されました。 差し支えなければ当該マクロの関係する部分を示してくれませんか?
759 :
デフォルトの名無しさん :2011/07/17(日) 10:37:52.96
はじめまして ある莫大なテキスト文があります。これをコピーしExcelのシートsheet1にはりつけました。 いくつかの行にある文字 例えば 「金額は、~円」という文字か含まれていたとします。 質問ですが、~に書かれている数字をすべて拾い上げSHEET2にはりつけていく方法 おしえていただきたいのですが。長文てすみません。 宜しくお願いします。
761 :
デフォルトの名無しさん :2011/07/17(日) 10:54:21.90
760 ありがとうございます。 サンプルの678は、表示できないですか?
762 :
760 :2011/07/17(日) 11:01:38.11
>761 Sub Sample() Dim str As String str = " 123.45+678" MsgBox Val(str) '123.45を表示します ← str = "1,000" MsgBox Val(str) '1を表示します End Sub のことですね。 +記号 で一連の数字が途切れているためです。 小数点や3桁毎の区切りはつながった数字とみなします。
763 :
760 :2011/07/17(日) 11:04:29.42
762の自己レス アレ? str = "1,000" MsgBox Val(str) '1を表示します 3桁毎のカンマはダメなのか。
764 :
初心者 :2011/07/17(日) 11:36:32.72
>>758 すみません、a=range("A1").CurrentRegion.resize(,3).select ではなく
a=range("A1").CurrentRegion.resize(,3).value でした。 ほんとうにすみません。
msgboxをつかってこんな確認もできるのですね。勉強になりました。
765 :
デフォルトの名無しさん :2011/07/17(日) 11:55:49.30
おしえていただきたいです findで検索し、findnextで次を検索します。 最後まで行ってから最初にもどらない方法おしえてもらいませんか
>>759 "金額は、"でSplit、For ~ Uboundで回してVal
Forは1からにすること
>>765 教科書通りに書けば戻りません
むしろ最初に戻す方が手間がかかる
下手くそなとこを教えない方がいい。
100列300,000行のデータがあります これの、行列入れ替えたテキストファイル作りたいのですが、ExcelVBAではやはり不可能でしょうか?
771 :
デフォルトの名無しさん :2011/07/18(月) 08:26:58.63
おしえて下さい あるセルに長い文字列があります。 数字と文字が含まれています。数字のみを取得する方法はないですか。 valだと最初の数字のみの取得になります。 数字すべてを取得したい。
>>770 一列取り込んで一行出力を繰り返すだけ。
>>771 RegExp使うのが一番手っ取り早い。でなければ、一文字ずつ走査していくしかないな。
数字以外の文字を空白に変換→Splitで分割→数字の入っている要素のみ取り出す、とか
773 :
デフォルトの名無しさん :2011/07/18(月) 09:39:32.71
772 ありがとうございます でも文字列のみどうやって空白にできるのですか。
Mid$でちまちま置換していく。 For off = 1 To Len(s) If Not Mid$(s, off, 1) Like "#" Then Mid$(s, off, 1) = " " Next 大体こんな感じ?
>>53 $がつくのとつかないのでは意味はどう変わるのでしょうか?
Mid/Mid$関数の話なら、$が付く方の返り値はString、付かない方はVariant。 受け側がString以外の時はVBAが型変換してくれるのだから、 $が付かない方を選んで不要なコストを追加する理由は無い、 って話が前に出ていた気がする。 ステートメントの方は忘れた。わざわざVariantで受け付けるとかあるのかなあ。
777 :
デフォルトの名無しさん :2011/07/18(月) 14:23:51.57
Like "#" の意味 御教示を。
779 :
778 :2011/07/18(月) 14:42:17.11
なので、小数の場合は都合が悪いことになるはず。 123.45 が 123 と 45 という別々の数字と見なされる。
そこまでいくと、
>>771 の意図している数字の定義を確認する必要があるな。
指数表記は流石に無いとしても、コンマ表記や符号等も考えられるし。
>771は ひょっとして>759ですか? もしそうだとしたら、前提条件をはっきり示してもらわないと。 「実は小数点やマイナス値もあるから~」ってこと(条件後出し)だと回答をもらえませんよ。
782 :
775 :2011/07/18(月) 15:11:58.04
>>776 Midステートメントで$を付けるのは無意味。
エクセルにcsv等のテキストファイルをドラッグアンドドロップすると新たにワークブックとして開かれますが、 このときに自動で処理をしたいのですが、これに対応するイベントはあるんでしょうか? 無いとしたらイベント以外になにか方法はありますでしょうか?
785 :
デフォルトの名無しさん :2011/07/18(月) 15:24:28.86
はい771=759です。 言われる通り、少数、負符号は考慮します。それ以外は無いです。 三桁おきのカンマもないです。文字列から数字のみを抽出したいです。 苦肉策として区切りコマンドを実行しマクロ記録する方針でかんがえてます。 もっとスマートにできないかなと思っで書き込みました。
>785 元データが1列なら、少数やマイナス値を含む数字で区切る処理はこんな風になります。 3桁毎のカンマにも対応するには '← のところを変更してください。 Option Explicit Dim sh_i As Excel.Worksheet, sh_o As Excel.Worksheet Dim tate As Long, i As Integer, retsu As Integer Dim str_i As String, flg As Boolean, flg_sv As Boolean Dim wk As String, str_o As String, num_o As Double Sub test() Set sh_i = ActiveSheet: Set sh_o = Worksheets("Sheet2") tate = 1: str_i = sh_i.Cells(tate, 1).Value Do While (str_i <> "") retsu = 1: flg = False 続く
For i = 1 To Len(str_i) wk = Mid(str_i, i, 1): flg = (InStr(1, "0123456789.-", wk) > 0) '← If i = 1 Then str_o = wk: flg_sv = flg Else If flg = flg_sv Then str_o = str_o & wk Else If flg_sv Then sh_o.Cells(tate, retsu).Value = str_o retsu = retsu + 1 End If 続く
str_o = wk: flg_sv = flg End If End If Next i If flg_sv Then sh_o.Cells(tate, retsu).Value = str_o End If tate = tate + 1: str_i = sh_i.Cells(tate, 1).Value Loop Set sh_i = Nothing: Set sh_o = Nothing End Sub 以上
789 :
786 :2011/07/18(月) 17:11:38.07
数字部分だけの抽出ではなく、文字列部分もsheet2に出力したいのであれば、 If flg_sv Then と、これに対応する End If をコメント化してみてください。
お手数おかけいたしますが、、、、知恵を拝借いたしたく
http://www.dotup.org/uploda/www.dotup.org1802759.zip.html 解凍パス Excel 中身 testtest.xls
テキストボックスに入っている文字列に対して検索する処理を考えています
sample1では複数の検索対象文字列があっても選択されるのは見つかった最初の
語句のみなんで続けて次の対象文字列も選択させたいの(sample2)、ですが、、
ここで行き詰っています。
---------------------------------------------------------------------
検索用のボタンを押すことによって続けて検索させたいのですが、
Instr関数の部分でエラーになっています。
findpos = 1にすればエラーにはならないものの当たり前のことながらsample1
と変わらない動作になってしまいますし。
sample2においてどうすればいいか教えてください。m(_ _)m
791 :
デフォルトの名無しさん :2011/07/18(月) 17:36:01.39
>>786 771です。ありがとうございました。
いただいたプログラムをサブルーチンに組込み、試してみようと思います。
文字列はどの変数に割り当てるのでしょうか。
結果はどの変数になるのでしょうか
792 :
786 :2011/07/18(月) 17:50:15.73
>791 入力側の文字列は str_i に入れて先頭から一文字ずつ調べてます。 出力側は str_o に一文字ずつ連結していき、数字かどうかの判定結果が 変わる都度、それまでの str_o を出力側シートに書き込んでいます。 >790 findpos の値をどこかのセルに書き込んでおくのがわかりやすいと思う。 Private Sub UserForm_Initialize() の処理の中に「当該セルに 1 を設定」を 組み込んでおくだけでいいし。
793 :
786 :2011/07/18(月) 18:12:26.12
自己レス >786の num_o As double は不要でした。文字列の str_o をこれに 転記してから出力シートに書き込もうかと思って定義してたけど、 str_o を直接書き込んでも問題なかった。
>>792 790です。もう少し考えてみます
後でまたするかもしれませんが、よろしくです。
795 :
デフォルトの名無しさん :2011/07/19(火) 12:33:37.91
792 771です 何度もすみません 例えば、CELL(1.1)に数字を3つ含む文字列かあったとします。 CELL(1.10)CELL(1.11)CELL(1.12)に出力するにはどうすべきですか
少しは自分で考えようぜ
>>2 > ★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
> コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
> ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
>
そもそもCELL(1.10)ってなんだ?
とりあえず何を聞きたいのか処理ごとにまとめてくれるESPいないかね
CELL(1.10)はCells(1, 10)の書き間違いだってエスパーじゃなくてもわかるだろ この程度のことがわからない役立たずはレス付けるな
Cells(1, 10)をCELL(1.10)を書き間違えることに寛容なおまいらww
幼稚園児に怒っても仕方ないだろ
>>799 そこじゃねえよ
>>771 から続いてる流れが、結局どこを目指してるのかを聞かせてくれ
何をしたがっててどういう状況で果たしてどのような処理をしたいのだろうか
この程度のことがわからない役立たずはレス付けるな
CELL(1,10)をコンパイル時にCells(1,10)にできないやつはレスつけるな
>>802 ____
/ \
/ ⌒ ⌒ \ 何言ってんだこいつ
/ (●) (●) \
| 、" ゙)(__人__)" ) ___________
\ 。` ⌒゚:j´ ,/ml j゙~~| | | |
__/ \ |__| | | |
| | / , \n|| | | |
| | / / r. ( こ) | | |
| | | ⌒ ーnnn |\ (⊆ソ .|_|___________|
 ̄ \__、("二) ̄ ̄ ̄ ̄ ̄l二二l二二 _|_|__|_
何がやりたくてどこに向かってるかよくわからんのは確かだが
とりあえず
>>795 は正規表現覚えたほうがいいんじゃね
CELL(1.1)はCells(1,1)だとして、マイナス記号と小数点も考慮すると
(俺も正規表現あんまり自信ないんだが)
Sub test()
Dim regEx, Matches, Match
Dim col As Integer
Set regEx = CreateObject("VBScript.RegExp")
regEx.Pattern = "-?\d*\.?\d+"
regEx.Global = True
Set Matches = regEx.Execute(Cells(1, 1).Text)
For Each Match In Matches
Cells(1, 10 + col).Value = Match.Value
col = col + 1
Next
End Sub
でいけるんじゃね
とりあえずこれ理解するまで勉強してくれ
806 :
デフォルトの名無しさん :2011/07/20(水) 09:54:25.54
仮にエクセルのB列にURLの一覧があるとします。 各ページ内のメタタグを抽出したいです。 C列には「description」D列には「keywords」 を抽出するにはどうすれいいでしょうか? 初歩的な質問かもしれませんが、よろしくお願いします。
771か? お礼くらい言っとけよ
お礼とかいらないから
回答とかいらないから
質問とかいらないから
夢とか 希望とかいらないから
812 :
デフォルトの名無しさん :2011/07/20(水) 14:52:57.70
いらないシリーズごくろうさん
ねぎらいとかいらないから
814 :
デフォルトの名無しさん :2011/07/20(水) 20:45:13.30
>>786 771です。プログラム実行しました。
たいへん役に立ちそうです。ありがとうございました。
一つだけ気になった点。sheet1に、もし空白行があったらそこで
アウトプットがとまってしまうようです。この辺も改善できればお願いします。
815 :
デフォルトの名無しさん :2011/07/20(水) 20:49:10.63
VBAは初めてです。回答よろしくお願いします。 ★1 OS:xppro Excelのバージョン:2003 任意の選択したセル(複数可)の行番号をコピー、その後、コピーした行番号をペースト というのをショートカットキーを使う形でつくりたいと考えています。 詰まってるところは、①行番号のコピー方法。(ROW関数を上手いこと使えばいいのかなと思っています) ②ペーストの方法。(普通にCtrl+Vでも可能なのでしょうか?) なにぶん初めてなもので、書き方もよくわかっていません。よろしければ初心者向けの参考サイトなども教えていただけないでしょうか?
816 :
デフォルトの名無しさん :2011/07/20(水) 20:55:12.00
>>807 771です
見る暇もなく返信遅れたようです。
>>806 ひとつの方法として
1. IEオブジェクトを生成し B列にあるURLでページを開く
2. ページを開いたIEオブジェクトからメタタグの情報を取得する
って感じかな?
>>815 コピー、ペーストってのは、基本的にはクリップボードに対する情報のやりとりなので
①コピー処理でクリップボードに値をセットしてあげれば、②貼り付けは普通に行える
クリップボードに対する処理はググれば出てくる。簡単なサンプル書いてみた
Sub rownumberCopy()
Dim r, c
Dim s As String
Dim cb As New DataObject
Set r = Selection
If TypeName(r) <> "Range" Then
Exit Sub
End If
For Each c In r
s = s & CStr(c.Row) & vbCrLf
Next
cb.SetText s
cb.PutInClipboard
End Sub
選択範囲が複数列だったらどうするとかは考慮してない
VBA初心者なら、サイトよりなんか入門書を買う方がいいと思うが
ある程度使えるようになれば後はググれば大概なんとかなる
ググったことしかないから俺はいつまでたっても底辺なのか…
820 :
デフォルトの名無しさん :2011/07/21(木) 13:56:52.70
806です。
>>817 さん、そのやり方だと、ちょっと時間が掛りすぎてしまいませんか?
できれば、スマートに出来ればありがたいのですが・・・。
どなたか教えてください!お願いします!
822 :
817 :2011/07/21(木) 15:15:50.64
>>820 スマートにですか.....ふむ
スマートかどうか?だけど
実際自分が過去にやった事がある方法を紹介してみる
該当URLのHTMLファイルをダウンロード(APIの"URLDownload"なんかで)した後
VBAでテキストファイルとして読み込ませてしまう
あとは文字列検索(InStr関数とかMid関数とかとか駆使して)目的の情報をさがす
・HTMLファイルがShiftJIS以外で書かれていたら文字コード変換しないとダメだったりする
・実行時の見た目はスッキリするけど コードは複雑になるかも
823 :
817 :2011/07/21(木) 15:24:32.28
誤 APIの"URLDownload"なんかで 正 APIの"URLDownloadToFile"なんかで
>>820 スマートと言うなら、Excelではなく、javascript使ったら?
コード変換もいらない
で、その結果Tableにでも出力してExcelに張り付ける
jquery メタタグ で検索かければ参考にはなると思う
板違いはゴメンだけど
825 :
817 :2011/07/21(木) 18:29:49.12
>>820 この種のWebページの情報取得 自動化は
相手サーパに負担をかける恐れがある事を承知しておいてね
実際
>>822 の開発時 コードがループしてしまい
相手サーバーから IPブロックされた事があるんで
(そん時は、たしか1週間ぐらいアクセスできなかった)
岡崎市図書館事件の中の人ですか?
827 :
817 :2011/07/21(木) 19:23:41.93
ちがうよ 自分の場合は、とある"海外のHサイト"を巡回する為に 作成した時のことなので
828 :
デフォルトの名無しさん :2011/07/21(木) 22:10:24.79
すいません accessで、DataGridを使ってデータを表示したいんですがやり方がわかりません。 DataGrid.value や DataGrid.Textにデータを入れようとすると行番号が不正ですというようなエラーが出ます。 何か設定が足りないようなんですが、なんかサンプルないでしょうか?
丸投げしといてもっとスマートなやり方とかどんだけ高貴なお方だよww
>>829 ちょっとくぐったら
件のお方 他質問サイトへも投稿してるみたいね
ttp://okwave.jp/qa/q6890739.html これ自体 悪い事とは思わないけど
CreateObject("MSXML2.XMLHTTP")を使った
タイトルを抽出するコードは、教えてもらった事あるみたいだから
それの応用だけなんだけどなー
自分でなんとかしようとする気ナッシングだね
832 :
デフォルトの名無しさん :2011/07/22(金) 15:12:38.29
すいません。ぐぐっても原因がわからないので質問をば… セルに入力された値が「-1のとき…追加する」「1のとき…使用する」「2のとき…削除する」になるように、 RangeのNumberFormatへ表示形式を設定したいのですがうまくいきません。 もしわかるのであれば、その部分だけのコード教えていただけるとありがたいです。 また、条件が2個の状態の場合設定できるのですが、条件が3個になったとたんエラーになります。 NumberFormatへの登録数上限があるのでしょうか?
833 :
デフォルトの名無しさん :2011/07/22(金) 16:54:05.66
806です。 他のサイトで教えていただき解決しました。 大変お騒がせしました。
>>832 NumberFormatはセルの表示形式を指定するものなのに
条件が2個、3個って一体何の話なんだ?
正負以外に任意の条件書けるとはしらなかった
IE使わずにhtmlソースを取得するのってどうやるの?
XMLHTTPでも使えば? スレ違いだし、腐るほどサンプル転がってるから詳細は省くが
「板のURL」を「板のスレッド一覧のURL」に変換して
そいつを取得して解析して、解析結果をセルに代入すれば良いだけだよ
でも、URLの変換やsubject.txtの解析は
Excelとはなんら関係のないスレ違いな話なので詳細は省くが
とにかく、
>>2 ★3,★4に該当するスレ違い、ルール違反な質問なので
もうこの件ではここで質問しないでね
わかる人だけ解答してください
わかるけどスレチだから回答しない 知識自慢したいお子様と違って俺はスレのマナーをちゃんと守る大人
わからないんですね わかります
VBAでやりたいならスレチじゃないと思うけど
>844 ★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分野の話ではないので、ここでは聞かないでください。
excelのVBAでRange("A1")にある複数行のテキストをA列に1行ずつ分けたいのですがどうしたらいいですか Range("A1")に あ い う え お ってあるとして、それを A1 あ A2 い A3 う A4 え A5 お としたいのです
>846 配列からセル範囲に一度に転記ってできたっけ? Sub test() a = Split(Range("A1").Value, Chr(10)) For i = 0 To UBound(a) Range("B1").Offset(i, 0).Value = a(i) Next i End Sub
848 :
847 :2011/07/23(土) 14:38:51.25
847はテストのためにB列に出力するようにしましたが B1 を A1 にしたらいいです。
おお!ありがとうございます!
>>847 やってみた
Sub Sample()
a = Split(Range("A1").Value, Chr(10))
Cells(1, 1).Resize(UBound(a), 1).Value = WorksheetFunction.Transpose(a)
End Sub
ここは微積分もC#もできない僕チンが ぶいびーえーででかい面するスレなんだから スレチな話は僕チンのわかる範囲にしてください><
嫌味のつもりなのかもしれないが、全然効果が無い件について
853 :
847 :2011/07/24(日) 09:20:59.93
>850 ワークシートファンクションはほとんど使ったことがありませんでした。ありがとうございます。
854 :
デフォルトの名無しさん :2011/07/24(日) 23:05:54.80
A1=0.6 B1=A A2=0.3 B2=B A3=0.1 B3=C と記入してあって、 A列の通り60%の確立でB列の"A"を、30%の確立で"B"を選ぶ というのをさせたいのですが、どうしたらいいでしょうか? 知恵を貸してください。
ネズミ-RND
>>854 A1~A3を配列にいれる(仮に変数AA)
100倍する
AA(1):60、AA(2):30、AA(3):10
AA(1)にはそのまま、AA(2)にはA1-A2の合計、AA(3)にはA1-A3の合計のように数字を足しこんだ値とする
AA(1):60、AA(2):90、AA(3):100
合計を求める(この場合は100)
ここまでが準備
値の選択では、RND関数を使ってまず合計値まで(0から99まで)の乱数 N を生成し、
N <AA(1) (0から59までの値) なら1番目
AA(1)<= N <AA(2) (60から89まで) なら2番目
AA((2)<= N (90以上) なら3番目
が選択されたとみなす
もっとうまいやり方がありそうだけど、ぱっと思いつくのはこんな感じ
…考えたら整数にする必要もないし、配列AAを用意する必要すらないかもしれんが
857 :
デフォルトの名無しさん :2011/07/24(日) 23:57:37.00
>>854 Sub aaa()
r = Rnd(1) '乱数を発生
s = 0
i = 1
Do
s = s + Cells(i, 1)
If r < s Then b = Cells(i, 2) '確率に従ってB列のデータを選ぶ
i = i + 1
Loop Until b <> "" Or i > 3 'ここにデータの個数を書く
Debug.Print b '結果の表示
End Sub
スレチだがそのパターンだけだとして =IF(RAND()<A1,B1,IF(RAND()<(A2/(1-A1)),B2,B3))
その並び順なら 0.6 A 1 ←=A1+C2 0.3 B 0.4 以下同様 0.1 C 0.1 という表を作って=INDEX(B1:B3,MATCH(RAND(),C1:C3,-1))でいいんじゃね? 普通は下のような昇順の表を作って=LOOKUP(RAND(),A1:B3) 0 C 0.1 B 0.4 A
なんだここはVBAスレか
863 :
デフォルトの名無しさん :2011/07/25(月) 09:26:24.70
>>835 832です。
ご回答ありがとうございました。やっぱり2つまでしか設定できないんですね。
もうちょっと試行錯誤してみます。
ありがとうございました。
>>862 答えは合うよ?
条件が多いとLOOKUPの方が簡単だと思うが。
866 :
質問させてください① :2011/07/25(月) 12:15:03.97
セルに数式を直接入力したいと思い、VBAで以下のような記述を行っていますが、セルに設定したい変数が EXCEL上にそのまま出力されてしまい、思うように動作してくれません。 (入力する数式をVBE上でDebug.printを用いて見てみたところ、変数の値は想定通りに変化していました) どのあたりにミスがあるのか、教えていただけませんか?よろしくお願いいたします。
※
>>866 の続きです。
①:入力したい数式を別に用意
Dim CalcStr As String
CalcStr = "=IF(ISERROR(SetSh & ""!"" & ""CN"" & HikGyo),"""",IF(SetSh & ""!"" & ""CN"" & HikGyo = """","""",SetSh & ""!"" & ""CN"" & HikGyo))"
(EXCEL上では、上記式の右辺の内容がそのまま出力されてしまう。変数SetSh、HikGyoはその名前のまま、『&』もそのまま)
②:設定した数式を、任意のセルに設定
ActiveSheet.Range("DD" & MyGyo).Formula = CalcStr
セルにセットした数式みると、セルを指定してないね 実際は、こんな数式をセルにセットしたいのかなぁ? =IF(ISERROR(テストシート!CN100),"""",IF(テストシート!CN100 = """","""",テストシート!CN100))
>>867 CalcStr = "=IF(ISERROR(" & SetSh & "!" & CN & HikGyo & "),"""",IF(" & SetSh & "!" & CN & HikGyo "="""",""""," & SetSh & "!" & CN & HikGyo & "))"
>>868 セットしたい数式は、まさにおっしゃる通りのものです。
SetShがシート名(String型配列から取り出す)、CNは列指定のための文字列(固定)、SetShは行数(処理の進行に応じて加算)です。
②の式だけだと、セルに数式を設定したことにはならないのでしょうか。
というよりも、①の段階でセルを設定する必要がある、という解釈が正しいのでしょうか。
>>869 修正版の提示、ありがとうございます!
①:ISERRORの後の括弧も文字であるため、&で連結する必要があった
②:変数の部分に関しては""で括る必要がない(=文字列のみ2重のダブルクォートで囲めばよい)と考えていた
であるということでしょうか。
ひとまず、家の環境で試してみます。
※スレのルールを無視して申し訳ありませんでした。
この問題で悩んでいる環境は、WindowsXP・Excel2003という環境です。
これから試してみる環境は、Windows7・Excel2010です。
こういう低レベルな処理で訳解らなくなってる奴って、 大抵連結で繋ぎすぎとか入れ子を重ねすぎとかやらかしてるよね 能力もないのにベテランぶって一括一発で処理を書こうとするから解らなくなる CellAddress = "CN" & HikGyo CellPath = SetSh & "!" & CellAddress とかやって、3ヶ所有る「SetSh ~~~ HikGyo」を「CellPath」に変えるだけでも かなり解りやすいコードになるはず CalcStr = "=IF(ISERROR(" & CellPath & "),"""",IF(" & CellPath & "="""",""""," & CellPath & "))"
> CalcStr = "=IF(ISERROR(" & CellPath & "),"""",IF(" & CellPath & "="""",""""," & CellPath & "))" これがベテランのコードですか。
VBAのベテランつうのも何かな
妥協点としては悪くないよ。 ワークシートの数式なんて元々泥臭くなりがちだし。
>>873 それが最良の正解って事ではなく、方法論の一つとして
CalcStr = "=IF(ISERROR(SetSh & ""!"" & ""CN"" & HikGyo),"""",IF(SetSh & ""!"" & ""CN"" & HikGyo = """","""",SetSh & ""!"" & ""CN"" & HikGyo))
よりは
CellAddress = "CN" & HikGyo
CellPath = SetSh & "!" & CellAddress
CalcStr = "=IF(ISERROR(" & CellPath & "),"""",IF(" & CellPath & "="""",""""," & CellPath & "))"
の方が良いだろってだけの話じゃねーの?
まー一人で触るもんなら最終的に文字数が短くなるのがジャスティス
>>865 俺は859じゃなく860なんだが、お前がワークシート関数に詳しいとは思えんなぁ。
>>860 の補足だが
0.6 A 0
0.3 B 0.6 ←=C1+A1
0.1 C 0.9 ←=C2+A2
こんな表作って=LOOKUP(RAND(),C1:C3,B1:B3)でもよかったな。
INDEXとMATCHを使うまでもなかったわ
>>859 の式って40%の確率でサイコロを2回振ることになるけど、それで正確な確率が求まるの?
1つの式の中ではRAND()は1回にしないとまずいんじゃない?
>>880 求まる。
10万個くらい式を入力して数えたら?
=IF(RAND()<A$1,B$1,IF(RAND()<(A$2/(1-A$1)),B$2,B$3))
別にさいころを二度振っても答えは出る。 頭の固いやつは理解出来ないのかなぁ。 865=880なのか?
883 :
デフォルトの名無しさん :2011/07/26(火) 21:04:50.59
大学の情報科学の課題です、まったくてがつけられていないです・・・ 回答よろしくお願いします。 反応速度式が次式で表される二次反応がある。 t=0におけるAの濃度が[A0]である時、[A]の時間変化を数値計算を用いて求めるプログラムを作成せよ(エクセルVBA)。尚、kは下表を用い、A0は任意に入力できるようにする。 -d[A]/dt=k[A]^2 反応 k/L mol^-1s^-1 2NOBr→2NO+Br2 0.80 2NO2→2NO+O2 0.54 H2+I2→2HI 2.42×10^-2 D2+HCl→DH+DCl 0.141 2I→I2 7×10^9 H++OH-→H2O 1.5×10^11 質問はここであっていたでしょうか・・??
質問スレではあるがお前が思っているような場所ではない 帰れ
ただいま
ただいマンボウ
>>883 そういうのは大学で聞けよ
何のために大学行ってるんだよ?
自分の知らないことを教えて貰うためだろ
今、大学以外で教えを乞うて、大学では自力で課題をこなしたかのように見栄を張ってもなんにもならない
解らないことは解らないと正直に言って、きちんと教わってこい
ユーザーフォームでもシートでも場所はどこでもいいので何かファイルをD&Dしたら そのファイルのパスを取得したいのですがどうしたらできますか?
>>889 おぉありがとうございました
調べてから質問するようにします
これってユーザーフォームでも同様にできるんですか?
859ですが一瞬でもラウンドを2回まわすような式は避けるのがジャスティス
本人がそう言うなら仕方ないが、俺にワークシート関数を一から勉強しなおせって言ったやつどこ行った? 答えが出ることも理解できない馬鹿なんだから、あまり偉そうなこと言わん方がいいね。
Openoffice使ってVBA勉強したくなったんだが、正直何から手つけて良いのかわからん オススメの本とかある?
>894 素直にExcel使った方がいいんじゃないかな? ダウンロードして2ヶ月お試しして、身につかなかったらあきらめる、でいいのでは? (さらに使いたければ内部カレンダを巻き戻す、と)
>894 KingsoftOfficeのことかな?
>>894 OpenOfficeはいい参考書が少ない
素直に本物のExcelの期間限定版を無料ダウンロードした方がいい
あと、本を買うときはちゃんと2010に対応したやつを選ぶこと
バージョンが違うとメニューのデザインなんかが変わるから、初心者はそこでつまづく
898 :
デフォルトの名無しさん :2011/07/27(水) 15:43:46.71
仕事で使っているファイルの印刷範囲指定を楽にするため、マクロ記録を使いながら フォームコントロールで印刷ボタンを作りました。 ただ、その顧客情報によってファイルの名前を変えて一つ一つ保存している為、 ファイル名が変わると印刷マクロが機能しません。 他の方法を調べた結果、アドインとして登録しようと思い、早速実行してみました。 が、「実行時エラー424 オブジェクトが必要です」と表示され動きません。 ネットで調べながらやってはいるのですが、どこを修正すべきなのか分かりません…… 申し訳ありませんが、お知恵を貸して頂けないでしょうか? 以下がそれぞれの式になります。 1:アドイン(ファイル名=印刷アドイン) Sub印刷マクロ() ' If (vbYes <> MsgBox("印刷します。よろしいですか?", vbYesNo)) Then Exit Sub End If Range("A1:Z41").Select ActiveSheet.PageSetup.PrintArea = "$A$1:$Z$41" ActiveWindow.SelectedSheets.PrintOut Copies:=1 ActiveSheet.PageSetup.PrintArea = "" End Sub 2:実行用マクロ Sub テスト() ‘ Application.run macro:=”印刷アドイン!印刷マクロ” End Sub
まずはエラー箇所の特定を。 そのメッセージボックスで中断だかってボタンあるでしょ? それでわかるはず
ちょっと教えて下さい。 テキストファイルをOpen Input で読み込んで、例えば ===== hello ===== の行を半角空白でsplitしてhelloの文字列を抜き取りたいのですが splitするときに、先頭に=があるとアプリケーション定義またはオブジェクト定義のエラーです。と怒られるのですが、なぜエラーになるのでしょうか。また回避するベストな方法は何でしうか。 宜しくお願い致します。
底の部分のコード晒しなさいよ
>>900 ですが解決しました。ありがとうございました。
903 :
デフォルトの名無しさん :2011/07/28(木) 23:20:45.41
コマンドボックスの内容が変わったら別のプロシージャを呼び出し そのプロシージャ内でComboBox1の内容を判断して 果物だったら"いちご" "みかん"等をComboBox2から選びたいのですが 一番したの行からどのように記述すれば良いか悩んでいます。 分かる方どのようにすれば良いのかアドバイス頂けると助かります。 よろしくお願いします。 Private Sub UserForm_Initialize() With ComboBox1 .AddItem "果物" .AddItem "野菜" End With End Sub Sub ComboBox1_change() Dim a As String Call test(a) End Sub Sub test(ByVal a As String)
前も見たような気がしなくもない
>>903 testの引数のaはどうする予定なんだ?
多分こんな感じだろ
Sub ComboBox1_change()
Call make_combo2(ComboBox1.Text)
End Sub
Sub make_combo2(s As String)
ComboBox2.Clear
Select Case s
Case "果物"
ComboBox2.AddItem "いちご"
ComboBox2.AddItem "みかん"
End Select
End Sub
他の方法として 選択肢が少ないなら Sub test(ByVal a As String) Select Case a Case "果物": ComboBox2.List = Array("いちご", "みかん", "ぶどう") Case "野菜": ComboBox2.List = Array("だいこん", "とまと", "こぼう") End Select End Sub とか あとは.RowSource 使ってシートからもってくるとか
ユーザーフォームの実行1回に対して、ComboBox1の選択は基本的に1回しか行わないなら AddItemで一つずつ入れたり、逐一Arrayで配列作ったりしてもいいけど ComboBox1を何度も選択変更するならこうだな Private buf As Collection Private Sub UserForm_Initialize() Set buf = New Collection ComboBox1.AddItem "野菜" buf.Add Array("にんじん", "たまねぎ", "じゃがいも"), "野菜" ComboBox1.AddItem "果物" buf.Add Array("りんご", "みかん", "かき"), "果物" End Sub Private Sub ComboBox1_Click() ComboBox2.Clear ComboBox2.List = buf(ComboBox1.Text) End Sub 一度しか実行されない UserForm_Initialize は多少複雑になってもいいから 何度も実行される ComboBox1_Click の処理量を減らす
>>899 返信遅れました、すみません
メッセージボックスの表示は「はい」か「いいえ」しか表示されていません……
範囲指定~印刷までの式か、アドイン登録の方法か、どちらかが間違っているんでしょうか?
909 :
903 :2011/07/29(金) 14:28:59.51
>>905-907 答えてくださってありがとうございます。
一つのプログラムに対してもいくつも方法があるんですね。
ホントありがとうです。
>>908 実行時エラーのでたコードを特定しないと前に進まないと思うよ
EXCELのバージョンによるかもだけど
エラーメッセージが出たとき「デバック」が選べるはず
実行時エラーのでたコードが特定されてないので
違ってるかもだけど ちょっと気になった点を
アドインは開いていないと 通常使えないハズだけど開いている?
(Excel本体では見えないけど VBEからだと確認できる)
あと
アドイン・ファイル名は 印刷アドイン.xla とかじゃない?
Application.run macro:="印刷アドイン.xla!印刷マクロ"
だと思うんだけど
>>910 アドバイスありがとうございます。
仰る通り、アドイン名.マクロ名で打ち込んだらファイル名を変えても問題なく動作しました。
無知な質問にお答え頂き本当にありがとうございました。
912 :
デフォルトの名無しさん :2011/07/30(土) 01:36:12.16
複乳さんに質問なのじゃが VBAでpersonal.xlsbを作る方法は、マクロの記録でダミーのを作ってから、以外にありますか?
vbaでクローラ作るのって無謀っていうか馬鹿ですか?
>>913 クロールする範囲にもよるけどVBAじゃ効率悪いと思う
2chの指定した板の中を延々と特定の文字列が含まれたレスを見つけるまでクロールする奴です 考えているのはsubjectから板一覧を取得してそこからdatを一つ一つ見ていくというものなんですがやっぱVBAじゃやめたほうがいいですか
>>915 たしか連続で読み込みを続けるとアクセス規制されるんじゃなかったっけ?
>>913 VBで作ってからvbaで実現する方法考えたほうが絶対に早い
読み込みだけなら割とすぐに作れる。書き込みはかなり面倒だけど
vbaはクラス作るのもややこしい上、面倒
>>913 馬鹿かどうかは判らんが友達にはなりたくないタイプ
919 :
デフォルトの名無しさん :2011/07/31(日) 13:37:59.87
本では標準モジュールにコードを書くよう指導されてますが SheetやThisWorkbookにコードを書く是非や長所・短所について教えてください
長所や短所なんてのは、特性に対して個々が勝手に判断するものだ 同じ特性でも、人によって長所に感じることも有れば短所に感じることもある 自分のプログラミングスタイルの変化によって、以前は短所に思えていた特性が 長所に思えるようになることもあるし、その逆も然り なので、長所や短所という視点ではなく、それぞれの特性という視点で情報を集め それらが長所か短所かは、自分の作る物やプログラミングスタイルに照らし合わせて 自分で判断しな で、標準モジュール、クラスモジュール、ブックやシートの付随モジュールそれぞれの特性は ググればいくらでも出てくるから自分で調べな
921 :
919 :2011/07/31(日) 14:06:01.39
アホが釣れてる(藁)
VBAは結構やってるけどクラスは1回もやったことない 何に使うの
>>922 真っ当に使うならラップして似非オーバーロードするくらいしか思いつかん
一人で作る分にはあまり恩恵に預かれない
複数人が関わって、標準モジュールだと問題ありの場合に出番だと思う
今時そんな事してるところがあるのかは知らんけど(メンテ除く)
924 :
デフォルトの名無しさん :2011/07/31(日) 16:01:23.27
ある程度VBAは使いこなせてますが 変数やプロシージャのスコープのことがさっぱりわからないんです。 分り易く理解するコツや こう考えたりこうイメージしたら分りやすいよ みたいなアドバイスはありますか?
925 :
デフォルトの名無しさん :2011/07/31(日) 16:17:25.96
load initialize show の違いは何かと聞いておるのだ
>>922 エクセルのセルが優秀すぎて、VBAだとほとんど出番が無い
>>921 真っ当な意見に、論で言い返せない故の悔し紛れ?
優秀過ぎてというか 下手に手を出すと地獄を見そうだから 触らぬ神に祟り無しっていう態度
929 :
デフォルトの名無しさん :2011/07/31(日) 22:35:48.28
いろんなbookやsheetを扱ってるとき 単に cells(1,1).value とすると、どこのbookのどのシートを指しますか? これに関連して、 activeとかselectの概念って、 ある時において、bookもsheetもcellのそれぞれについて、activeなものとselectされてるものが存在してるのでしょうか?
1.activebook.activesheet 2.yes
>>929 ええとね、まずアプリケーションが一番上にいて、
その中にActiveなBookがいて、更にその中にActiveなSheet、SelectされたSheetがいて、
更にその中にSelectされたRangeやActiveなCellがいるんじゃない?
だから何も考えずに複数のBookを扱って対象のBookを選ばずにActiveなBookに対して処理を行うと、
本当は違うBookに処理を行いたかったのに、最後に開いたBookを処理しちゃったり
する様なことが起きるんだと思うよ。
932 :
デフォルトの名無しさん :2011/07/31(日) 23:06:23.23
実数を扱うとき SingleとDoubleは、どっち使ったほうが使いやすいですか? 場合によるだろうけど一般的な話で。
>>929 標準モジュールの場合はアクティブなブックのアクティブなシート、
シートモジュールの場合は、そのモジュールの属するシート、
ブックモジュールの場合、Cellsは標準モジュールと同じでアクティブなブックのアクティブなシートだが、
Worksheetsは、アクティブなブックのものではなくモジュールの属するブックのものになる。
activeとselectは、単一のセルやシートに対して有効な操作の対象となっているものがactive、
複数のセルやシートに対して有効な操作の対象となっているものがselect、因みにbookにselectは無い。
文字入力はCtrlキーを押しながら確定しない限り、基本的に単一セルが対象だが、Deleteキーによる消去は複数セルに有効。
シートでも削除や移動は複数シートに対して行えるが、名前の変更は複数選択していても表示状態の単一のシートに対してしか行えない。
このように、セルやシートでは複数に対して有効な操作と、単一のもののみに有効な操作があるのでactiveとselectが存在している。
934 :
デフォルトの名無しさん :2011/07/31(日) 23:14:03.26
>>931 例えばですよ、CTRLを押しながらSHEETをクリックすれば
たくさんsheetが選べますよね
これがたぶん複数のsheetがselectされた状態だと思うんですよ
で、目の前に見えてるsheetがactiveなシート。
複数のsheetを選んでたら[作業グループ]と出るので分かります。
この状態で、「あ」と入力すると、なんとすべてのシートで「あ」が入力されるんです。
ということは、その状態ではactiveセルは各シートごとに複数存在するってこと?
>>934 Select>Activeってだけだろ
もしかして四則演算ができない人?優先順位って概念は分かる?
936 :
デフォルトの名無しさん :2011/07/31(日) 23:20:57.88
例えばsheetを3つ作って、 それぞれで別のセルを複数選択すると、 なんと各シートで別々の場所のセルが複数選択されてるのと単一のセルがactivateになってるのが各シートで記憶されてるんですよ。 これはどういうこと? activecellは、常にsheetの数だけ存在する?
937 :
デフォルトの名無しさん :2011/07/31(日) 23:23:50.65
性器のダイハツ券をしました。 もしsheetを複数選択すればその瞬間にすべてのシートにおいて同じセル住所が選択された状態になり、同じセル住所がactivateされた状態になるんですよ。
938 :
デフォルトの名無しさん :2011/07/31(日) 23:32:54.70
また発見。 sheetを複数selectして マクロでselectionに文字を書き込んだら その選択したすべてのシートの同じcell番地がすべて文字列で埋まりますわ
939 :
デフォルトの名無しさん :2011/07/31(日) 23:35:53.18
知っとるけのけ? 2つシートをselectしてて マクロでcells(1,1).value="うんこ"を実行したら どのシートに「うんこ」と表示されると思う? (1) 2つのシートのA1 (2) 1つのシートのA1 (3) どちらでもない
いやぁ、そりゃ複数選択して処理を行っているんだから同じ処理が走ると思うよ。 むしろ、選択して違う処理が走ったら問題じゃないかと思うんだけど。
941 :
デフォルトの名無しさん :2011/07/31(日) 23:39:47.30
>>940 あなたの回答は(1)ですね
残念、はずれ
政界は(2)でした
>>941 一つと言うよりActiveなシートの方に反映されるでしょ?
SelectとActiveはその辺ちょっと違うし。
944 :
デフォルトの名無しさん :2011/07/31(日) 23:44:31.34
次の問題。 2つシートをselectしてて マクロでactivecell="まんこ"を実行したら どこに「まんこ」と表示されると思う? (1) 2つのシートの2つのactivecell (2) 1つのシートの1つのactivecell (3) どちらでもない
>>944 へぇ、両方のシートに反映されるんだ。
これは意外。内部的に一つ目とどう違う処理が走ってるの?
946 :
デフォルトの名無しさん :2011/07/31(日) 23:54:23.80
変数で実数を扱うとき SingleとDoubleは、どっち使ったほうが使いやすい?
ユーザフォームのイベントを一時的に禁止する方法はないでしょうか? 下の様にコードを書いているのですが ※P2_StartPage,P2_EndPage はComboBoxです ★の所でChangeイベントが出てしまい正しい初期値が設定できません UserForm_Initialize実行後は P2_StartPage.Value = 1 P2_EndPage.Value = 1 となって欲しいのですが実際には P2_StartPage.Value = "" '空白 P2_EndPage.Value = 1 となってしまいます Changeイベントが出てるのでこうなるのは分かるで 取り合えず今はコードを工夫してなんとか しのいでいますが そもそもとしてイベントを一時的にでも禁止する方法はないでしょうか? ※Application.EnableEvents = False を入れてみても止まらなかった 改行が多すぎます!! といわれたので分けます
948 :
947 :2011/07/31(日) 23:55:20.74
続きです Private Sub UserForm_Initialize() With P2_StartPage .ListRows = 10 For i = 1 To 99 .AddItem .List(.ListCount - 1) = i Next .Value = .List(0) '★ End With With P2_EndPage .ListRows = 10 For i = 1 To 99 .AddItem .List(.ListCount - 1) = i Next .Value = .List(0) '★ End With End Sub Private Sub P1_StartPage_Change() If Val(P1_StartPage.Value) > Val(P1_EndPage.Value) Then P1_EndPage.Value = P1_StartPage.Value End If End Sub Private Sub P1_EndPage_Change() If Val(P1_StartPage.Value) > Val(P1_EndPage.Value) Then P1_StartPage.Value = P1_EndPage.Value End If End Sub
949 :
デフォルトの名無しさん :2011/07/31(日) 23:55:33.89
>>945 それは複乳さんが答えてくれるよ。
お~い、いるかな?
950 :
デフォルトの名無しさん :2011/08/01(月) 00:02:04.04
サブルーチンを呼ぶとき、 Call ○○○ と ○○○ と単に書くのと どっちが望ましい?
>>950 戻りが欲しいとかでない限り、明示的にcallで呼んだ方が
第三者から見ても後から自分で見てもいいと思うぞ
>>950 Callを使わないなら括弧で括らない。
何かそんな話をこのスレでずっと前に言ってた様な・・・
まぁ
>>951 の通りでいいと思う
自分は引数が無いSubプロシージャを呼び出す時に 明示的にCallを書くことがある位だなあ。 識別子だけで浮いているのが気持ち悪いので。
迷ったらDouble
Single=計算スピードが速い、メモリ節約、有効桁数が少ない Double=計算が遅い、メモリ食う、有効桁数が多い(精度が高い) ちゃんと考えて使い分けろ
いきなり伸びてるが産業
959 :
デフォルトの名無しさん :2011/08/01(月) 19:41:56.46
わたしはむか~しBASICという言語で、それこそ「マイコンBASICマガジン」に投稿するほど、BASICの達人でした。 その後プログラミングは全くやってませんが、VBAを始めました。 どの入門書・初心者向けの本を見ても、 「変数のスコープ」だとか、「サブルーチン」をバンバン使う書き方とか、モジュールの概念(標準モジュール・フォームモジュール・シートモジュールの使い分けなど)とか、 一番知りたい情報がないんです。 これらはどのように学べばいいですか? 昔BASICやってたので、プログラムとはどういうものかという知識はあります。 まだ大型書店には行ってませんが、もしそういう本があれば行ってみるつもりです。
>>959 今は本ではなくネットで勉強する時代に変わりました
本は物理的に大きさが限られているため、現代の複雑なプログラムをすべて説明するのは
場所が足りなくて不可能だからです
「VBA スコープ」などのキーワードで検索してください
>>959 時代が経過して、今では構造化言語、オブジェクト指向型言語、関数型言語とどんどん様変わりし、
貴方の時代のPGとは考え方も組み方もまるで変わっています。
その中でもVBAは構造化言語とオブジェクト指向言語の中間に位置する、
今の貴方の立場としては比較的覚え易い言語と言えますが、
今後の事を考えると最新のVBやC#などを最初から全て覚え直すつもりで勉強した方が、
周り道の様ですが結局速くいろんな言語に対応出来る様に思います。
特にC#などは、今までやっていたであろうBASICの知識と混合する事なく覚える事が出来るでしょう。
一つの世代が変わった言語でPGを組むと言うのは、それ程までに容易では無いと言えます。
でも「いつかはCを覚えたい」と思ってるなら先にやっといた方がいいよね 後回しにするといろいろ面倒 知識レベルならともかく、いざ実装しようとすると面倒臭くて死にそうになる
Dim x as String x = tes1 & "abc" & qr & "tes2" ってあったとして(tes1,tes2,は長さ不明の文字列)(qrは長さ不明の数字の文字列) xの中から"abc"の後ろの数字の部分を抜き取るにはどうしたらいいでしょうか 例えばxが goiwhabc123oajfa だったら123を返す とか fabc1512few だったら1512を返す こんな感じです
"tes2"じゃなくてtes2で変数でした
Val(Mid$(x, InStr(x, "abc") + 3)) 超不真面目にやるならこんな感じだな。
せいきひょうげん! せいきひょうげんを使う!
967 :
デフォルトの名無しさん :2011/08/02(火) 08:43:33.73
性器表現とは? 露出狂になるんですか?
つかそれqrそのものじゃないのか?
969 :
デフォルトの名無しさん :2011/08/02(火) 09:28:41.23
Quality of Rifeですか?
970 :
デフォルトの名無しさん :2011/08/02(火) 09:33:04.34
VBではRnd VBAではRand() どうにかならんか?
971 :
デフォルトの名無しさん :2011/08/02(火) 09:37:11.15
あれっ asc("○")ってVBではアスキーコード番号を教えてくれる関数だったと思ったが VBAでは全角を半角に変える関数になってないか?
972 :
デフォルトの名無しさん :2011/08/02(火) 09:48:42.84
おろどきました。 シート3つあれば、それぞれについてアクティブセルが記憶されてるんです 例えば3つの各シートで全く別のセル住所をアクティブにしておいて 下のマクロを実行するとよく分ります。 Sub てすと() Sheets(1).Activate ActiveCell = "うんこ" Sheets(2).Activate ActiveCell = "まんこ" Sheets(3).Activate ActiveCell = "ちんこ" End Sub
何がおどろきなのか判らん
VBAから他のソフトのボタンとか操作できる?
975 :
デフォルトの名無しさん :2011/08/02(火) 10:22:45.23
Excel 2003 , Win7 で、 ワークシート上に、スクロールバーを置いて、それにより、セルの値を増減させたいです。 しかし、うまくいきません。 ・スクロールバーを右clickして、そのプロパティを出します。 ・LinkedCell の値に、Sheet1!B10などと、表示したい目的地のセルを書き込みます。 ・しかし、プロパティの枠の中のLinkedCellの枠に「Sheet1!B10」と打ち込んで、 リターンをすると、そのプロパティの枠の中が消えてしまい、 真っ白になってしまいます。何度やっても書き込めません。 ・スライドバーやスピンボタン、どちらもできませんでした。 スライドバーやスピンボタンで、指定したセルの値を変化させる方法は、 上記では間違っているでしょうか? どうやってやれば実現するでしょうか? 宜しくお願いします。
976 :
デフォルトの名無しさん :2011/08/02(火) 10:57:39.30
>>974 できるけどSendMessageとかAPI使うしボタンのハンドル取得するまでが大変
UWSとか他アプリを操作するソフトをShellで起動した方が簡単
977 :
デフォルトの名無しさん :2011/08/02(火) 11:13:10.62
Form_InitializeとForm_Loadの違いとは?
979 :
デフォルトの名無しさん :2011/08/02(火) 13:28:48.97
>>979 VBAにはRandは無いと思うぞ
Randはワークシート関数
そしてVBAにもRndはあるんだが
981 :
979 :2011/08/02(火) 20:08:59.88
釣れた(ワラ
恥ずかしい勘違いをしてしまったことに気付いたときに 誤魔化しとしてつぶやく言葉・・・・・それは 釣れた(ワラ
983 :
979 :2011/08/02(火) 20:32:55.48
(爆)
(核爆)
985 :
979 :2011/08/02(火) 20:45:58.42
藁
986 :
デフォルトの名無しさん :2011/08/02(火) 21:20:07.88
A1:E50の中で一番下に要素がある行を返すのと一番右に要素がある列を返す方法を教えてください
>>986 1つもなかったら0を返す
Sub aaa()
r = 50
Do While r >= 1 And cat1(r) = 0
r = r - 1
Loop
c = 5
Do While c >= 1 And cat2(c) = 0
c = c - 1
Loop
Debug.Print r, c
End Sub
Function cat1(r)
If r >= 1 Then s = WorksheetFunction.CountA(Range(Cells(r, 1), Cells(r, 5)))
cat1 = s
End Function
Function cat2(c)
If c >= 1 Then s = WorksheetFunction.CountA(Range(Cells(1, c), Cells(50, c)))
cat2 = s
End Function
989 :
977 :2011/08/02(火) 21:52:00.99
>>987 I'm afraid I do not speak English, nor do I read it.
It would be really, truly, absolutely helpful, if you could provide me with some information regarding 'Form methods' in Japanese.
990 :
デフォルトの名無しさん :2011/08/02(火) 22:10:45.94
>>987 とても役立ちました
ありがとうございます!
"<"から">"まで(下のでいう<koko>,<kokomo>)を見つけ出してそれを改行コードのvbCrLfに置換したいのですがどうしたらいいでしょうか? "abc<koko>def<kokomo>ghi" 置換後は "abc" & vbCrLf & "def" & vbCrLf & "ghi" このようにしたいです <>内またその外の文字数は不明です お願いします
ユーザーフォームのラベルの文字の書式について ワークシートに"123"とあり、2だけ赤字 これをラベルに反映されるにはどうしたらよいでしょうか? forecolorではNullとなりエラーとなったので質問します。
994 :
デフォルトの名無しさん :2011/08/03(水) 00:02:15.55
一つのラベルじゃ無理 桁ごとにラベル用意するかピクチャボックススに書く
>>992 Sub AAA()
Dim A As String
A = "abc<koko>def<kokomo>ghi"
A = Replace(Replace(A, "<koko>", vbCrLf), "<kokomo>", vbCrLf)
MsgBox A
End Sub
For i = 1 To r For le = c To 5 For te = 5 To le - 1 If Cells(i, le).Value = Cells(i, te).Value _ Then Cells(i, le).Clear Next te Next le Next i rは要素がある最大行,cは要素がある最大列 これで重複を消そうとしたのですがうまくいきません どうしたらいいでしょうか
すみませんstep -1を付けたらうまくいきました forを逆からやるときってstepでマイナスつけないといけないんですね・・・
998 :
デフォルトの名無しさん :2011/08/03(水) 20:14:45.49
age
______ ___________ V _____ /::::::::::::::::::::::::::\ _ /::::::::::::::::::::::::::::::::::::::\ /  ̄  ̄ \ |:::::::::::::::::|_|_|_|_| /、 ヽ はぁ?黙ってろデブw |;;;;;;;;;;ノ \,, ,,/ ヽ |・ |―-、 | |::( 6 ー─◎─◎ ) q -´ 二 ヽ | |ノ (∵∴ ( o o)∴) ノ_ ー | | /| < ∵ 3 ∵> \. ̄` | / ::::::\ ヽ ノ\ O===== | :::::::::::::\_____ノ:::::::::::\ / |
うんこチンチン
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。