ExcelのVBAに関する質問スレです
★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。
★2 ExcelのVBA以外の部分に関する質問はNGです。
但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。
★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。
VBAとは、『Visual Basic for Applications』の略で
Application
├Workbooks
|└Workbook
| ├Worksheets
| |└Worksheet
というApplication以下のオブジェクトを、VB言語で操作するものを指します。
例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、
セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。
★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。
★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み、
コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)
前スレ:
Excel VBA 質問スレ Part25
http://toro.2ch.net/test/read.cgi/tech/1341722983/
MsgBox "
>>1 乙", vbAlert
しかしWin8でもVB6サポートされるとか
やっぱ当分VB系は安泰だなぁ
4 :
デフォルトの名無しさん :2012/08/20(月) 10:28:43.34
閉じたままのBook内のデータを参照するにはどうしたらいいですか? そして閉じたぱぱのBook内のデータをオートフィルタすることもできたりしますか?
パパやママのことは、直接本人(両親)に相談してください というのはさて置き、閉じたままと言っても、当然本当に閉じたままでは 何も出来るわけが無いので、「閉じたまま=GUI上で開かず」と解釈すると ExcelのCOMインスタンスを作ってやってそれで開けばいいだけ 後の操作は普通に開いてるブックやシートと全く同じ GUI上には表示せずに、裏で開いた状態でなんでも出来る
7 :
デフォルトの名無しさん :2012/08/20(月) 11:54:07.42
どこの誤爆だw
9 :
デフォルトの名無しさん :2012/08/20(月) 16:55:32.92
ExcelVBAで Outlookのテンプレートの機能をプログラミングをしたいのですが その方法を教えてくださぃ。 Outlookのテンプレート機能を使わないのは メールの本文中にその当日の「日付」を使ったり Excelのセルに用意したデータをメールの本文に使いたいからです。
outlookのvbaでやれ
11 :
桃白白 :2012/08/20(月) 17:30:59.98
12 :
デフォルトの名無しさん :2012/08/20(月) 17:45:38.20
モジュル先頭で宣言する変数はそのモジュル全体で使えるとのことですが マクロ実行後も値はそのままですか? 次回にマクロ実行したときは値はそのぱぱ残ってる値に加算されますか?
14 :
デフォルトの名無しさん :2012/08/20(月) 18:08:05.83
>>5 COMインスタンスとはなんでしょぅか?
>>13 びっくりですね。
これからはモジュル先頭で変数は宣言しないことにしました。
>>14 > これからはモジュル先頭で変数は宣言しないことにしました。
関数の実行開始から終了までの同一性は保証されてるから、その範囲で使うなら問題ない。
「関数の実行開始から終了まで」というのは、
dim g as long
sub foo()
g = 1
bar
debug.print g
end sub
sub bar()
g = g + 1
end sub
のとき、foo()の開始から終了までという意味。
なお、クラスを使ってgをプロパティかprivate変数にすれば、知らない間にクリアされるということはなくなる。
>>15 では無いが
よく解らなかったらとりあえずシートに残して使う時だけ拾うようにしとけば良いんでねーの
解ったら自分で直せる訳だし
COMはググれとしか。多分意識しないでも使ってるんだろうけど。
ユーザーフォーム表示してると表示されてる間はまずクリアされないよ
ユーザーフォームを表示している時に 別のブックを開いてアクティブにするにはどうしたらいい?
19 :
デフォルトの名無しさん :2012/08/21(火) 09:58:35.99
元のブック.ユーザフォーム.Activate
20 :
デフォルトの名無しさん :2012/08/21(火) 11:16:09.57
ありゃ?
元のブックのユーザフォーム.を開くには
元のブック.ユーザフォーム.Showでできないのはどうして?
>>18 単に「別ブック.Activate」でいいじゃん。
>>20 マクロから開くのではなくて、
普通にフォルダからダブルクリックで開いたときに
アクティブになるようにしたいのです。
23 :
デフォルトの名無しさん :2012/08/21(火) 17:31:25.65
他ブックのFormをActivateするにはどうしたらいいですか?
荒らすなよ
>>21 マクロ使わないなら、スレ違いだからどっか行って。
>>25 スレ違いですか?
元々開いてるユーザーフォームのあるブックの
マクロで設定できないかと思ったんですが
thisworkbook: private sub workbook_open() userform1.show end sub
For sh = 5 To 10 Worksheets("" & sh & "").Activate ActiveSheet.ChartObjects.Add(0, 500, 960, 300). _ Chart.SetSourceData Sheets("" & sh & "").Range("C" & sh & ":C" & num + 5 & "") ActiveSheet.ChartObjects(1).Chart.ChartType = xlLineMarkers Cells(1, num).Select Next sh 埋め込みグラフが選択されているのをはずしたいだけなのですが Cells(1, num).Selectのところで「アプリケーション定義またはオブジェクト定義のエラーです。」 と出ます。解決策をご教授ください。
>>28 ActiveSheet.Cells(1, num).Select
にしてみたら?
あと、Withとか使うと楽かもよ
30 :
桃白白 :2012/08/22(水) 23:06:16.79
32 :
桃白白 :2012/08/22(水) 23:40:17.20
>>31 やめて!桃白白にむやみにリンクを張らないで!
定義のエラーっていってたから定義されてないんじゃねって桃白白考えたの
Cellsはオブジェクトが指定されなかったらアクティブワークブックのアクティブシート
を返しちゃうだろ WorksheetsほげほげActivateでアクティブシートが選択されてんだから
ActiveSheetってつけなくてもいんじゃね
33 :
桃白白 :2012/08/23(木) 00:27:36.41
フォフォフォ… ∧ ∧ |≡V≡| |O(\)O| (V)(゚Д゚)(V) ヽ三i三ソ (/ \) ∪"∪
34 :
桃白白 :2012/08/23(木) 00:28:10.42
フォッフォッフォッ (V)∧_∧(V) ヽ(・ω・)ノ / / ノ ̄ゝ フォッフォッフォッフォッフォッ (V)∧_∧(V) ヽ( )ノ / / .....ノ ̄ゝ
35 :
デフォルトの名無しさん :2012/08/24(金) 06:50:22.30
マクロを頻繁に使ってたらPCが非常に重くなり、Excelの超基本操作のセル移動でさえ2-3秒かかることがあります(通常は一瞬)。 仕事で使ってるのでAM9からPM6までずっとExcelは立ち上げたままです。 マクロが原因なのは間違いないと思います。 軽くするにはどうしたらいいでしょうか?
>>35 マクロが原因だということまで特定できてるなら
そのマクロのバグを修正しろよ・・・
37 :
35 :2012/08/24(金) 07:59:23.13
>>36 そんなこといわずに
あなたが上級者なら
よく初心者が犯しがちな
メモリーを消費したままになる良くないコードを予想し
それに対しての対策を指示してあげたらどうです?
38 :
桃白白 :2012/08/24(金) 08:03:24.58
>>37 エスパーしたらいいじゃない! 教えてくれたらいいじゃない! ってか
じゃあ桃白白が教えてあげちゃう
グローバル変数使うのやめな これで100%解決する
桃白白に感謝しちゃったらいいじゃない
39 :
35 :2012/08/24(金) 08:21:39.84
残念ながら白桃には感謝できん グローバル変数なんて野蛮なものは使ってないからだ
40 :
桃白白 :2012/08/24(金) 08:29:22.43
>>39 いいやお前はグローバル変数を使っている
使っていないと思い込んでいるだけだ
桃白白は上級者だがお前は初心者だ
初心者は上級者の言うことを素直に聞くべきだ
お前はグローバル変数を使っている お前はグローバル変数を使っている 目を閉じて反芻しろ
41 :
35 :2012/08/24(金) 08:33:19.36
VBA触り始めて数日の初歩的な質問ですみません。 環境はWindows7、Excel2007です。 ユーザーフォーム上のテキストボックスに セルをリンクさせたいのですが、テキストボックスのプロパティの Text欄、Value欄に「=Sheet1!A1」と入れても「」内の文字列が そのまま表示されてしまいます。 Excelのシート上のテキストボックスで同じ操作をすると そちらはきちんとセルがリンクされるのですが…。
>>42 ユーザーフォームのテキストボックスなら
「=Sheet1!A1」を入れるのはControlSource
>>43 おおおおお!出来た!
これでとりあえず形だけは完成しました。
ありがとうございます
>>42 です
実際に動かしてみたら問題が発生してしまいました。
下記の状況です。
ユーザーフォーム上でコマンドボタンnAとコマンドボタンnBを重ねて表示
コマンドボタン1Aを押すとSheet1!B1に1が入力されコマンドボタン1Aが背面に移動
コマンドボタン1Bを押すとSheet1!B1に0が入力されコマンドボタン1Bが背面に移動
コマンドボタン2Aを押すとSheet1!B2に1が入力されコマンドボタン2Aが背面に移動
コマンドボタン2Bを押すとSheet1!B2に0が入力されコマンドボタン2Bが背面に移動
以下コマンドボタン3〜と続く。
Sheet1のA列にはあらかじめ決まった数字が入力されていて、Sheet1のC列はA列とB列の積です。
Sheet2のA1はSheet1のC列の合計、SUM(Sheet1!C:C)です。
たとえばSheet1!A1に30、Sheet1!A2に40が入力されていたとして、
ボタン1Aを押すとSheet1!C1が30*1で30となり、まずSheet2!A1が30になり、
次いでボタン2Aを押すとSheet1!C2が40*1で40、Sheet2!A1が30+40で70になります。
このSheet2!A1を先ほどのテキストボックスのControlSouceに入力したのですが
コマンドボタン1Aを押すとSheet2!A1にSheet1!A1 * Sheet1!B1の数値、上記の例だと30*1の30という数値が
入力されてしまい、SUM(Sheet1!C:C)という数式は消え、他のコマンドボタンを押しても反応がなくなってしまいます。
どうすればよいのでしょうか。。
>>46 各コマンドボタンのクリックイベントに
Sheet2.Cells(1,1) = "= SUM(Sheet1!C:C)"
って入れといたらどうですか?
あと、On/Offの2値を扱いたいなら
コマンドボタンよりトグルボタンのほうが良くないですか?
>>46 ,47
まずControlSource使うのやめて、
各ボタンのクリックイベントに、TextBox1.Text = Sheet2.Range("A1").Valueとか書くのが正解だろ
(つかそう書いたサブルーチン呼べ)
というかまずボタンを重ねて配置するとか馬鹿なことをやめろよ
埋め込みグラフの目盛り線を選択したいのですが、エラーになってしまいます。 ActiveSheet.ChartObjects(1).Chart.Axes(xlValue).MajorGridlines.Select どこを直せばいいですか。
50 :
デフォルトの名無しさん :2012/08/25(土) 11:59:34.26
シートに挿入したチェックボックスが消せません。 どこを直せばいいのですか。 Activesheet.Shapes.Delete
51 :
桃白白 :2012/08/25(土) 12:04:08.98
>>49 なんというエラーが出る?桃白白にもわかりそうなエラー?
わかりそうなやつだったら答えちゃうけど
52 :
桃白白 :2012/08/25(土) 12:12:42.00
>>50 For Eachでぐーるぐる
Dim s As Shape
For Each s In ActiveSheet.Shapes
If (s.Type = MsoShapeType.msoFormControl) Then
If (s.FormControlType = XlFormControl.xlCheckBox) Then
s.Delete
End If
End If
Next
>>47 >>48 役割はトグル以外の何物でもないのですが、
クリックすると白黒画像からカラーに変わるギミックを
どうしてもやりたくて、方法がわからずこのような原始的な方法を取りました。
各ボタンに記述してみます。ありがとうございました
>>49 選択しようとするからじゃないの?
ActiveSheet.ChartObjects(1).Activate
>>54 ActiveSheet.ChartObjects(1).Activate
ActiveSheet.ChartObjects(1).Chart.Axes(xlValue).MajorGridlines.Select
できましたwありがとうございます
56 :
桃白白 :2012/08/25(土) 14:40:56.33
ExcelVBAの型変換について疑問がありますので、詳しい方、ご教示ください。 ExcelVBAでは、文字型の数値が、代入先の型に自動的に変換されるものと漠然と思っていました。 以下のようにサンプルを作ってテストしてみましたが一貫しない結果がでました。 Test1は、文字列が数値化されて数値の合計が表示されました。 しかし、Test2では、文字列の連結として表示しました。 さらに、宣言文の(**)の部分を、Dim Int3, Int4, n As Long からDim Int3, Int4 As Long としてnを除くと、正常に数値として加算されました。 このように変わるのはどうしてでしょうか? 原因がわからないと安心してマクロを組めないのでよろしくご教示ください。 (WindowsXP Excel2007です) Sub 型変換テスト() Dim Int1, Int2 As Long '(*) Dim Int3, Int4, n As Long '(**) Dim Sum1, Sum2 As Long ' ******* Test 1 ************ Int1 = "1827" Int2 = "1931" Sum1 = Int1 + Int2 MsgBox ("Test 1 = " & Sum1) ' ******* Test 2 ************ Int3 = "1827" Int4 = "1931" Sum2 = Int3 + Int4 MsgBox ("Test 2 = " & Sum2) '文字列の連結 End Sub
初心者がよくハマるやつだな Dim Int1, Int2 As Long Int1は型指定無し、Int2はLong型 Dim Int3, Int4, n As Long Int3, Int4は型指定無し、nはLong型 Dim Int3 As Long, Int4 As Long, n As Long Int3, Int4, n全部Long型 型はひとつひとつ指定しないとダメ Dim Int3, Int4, n As Long だと最後のnしか型指定してないことになる 型指定無し(Valiant型)だと、代入した値依存の内部型になるから Intのつもりで実はstr3 + str4をやっていたというわけだ
初心者じゃ無いつもりだけど未だに分からないのがdecimal。 なんで宣言出来ないんだ??
>>60 仕様に対して「なんで」って言い出したらキリがない
現在、10 進型はバリアント型 (Variant) の内部処理形式でのみ使用できます。変数を 10 進型として宣言することはできません ってヘルプに書いてあるから、そういう仕様だとしか
ある程度割り切りも必要だけど、 何事にも疑問を持って追求しようとする姿勢が無いとダメだよ。
調べれば仕様だって事はすぐわかるんだが、追及なんて全くしてないだろ なんでそういう仕様なのか考えるのはまだ意味があるかもしれんが
一応Currency型があるから。 誰も覚えてなさそうだけどw
57です 59様、ありがとうございます。 てっきり複数列挙してもまとめて型宣言できるものと思っていました。
セルにAlt+Enterで改行したデータを ユーザーフォームのTextboxに入れようとしても 改行してくれないんですね。 何かいい方法はないですか?
>>67 たぶん MultiLineがFalseになってるだけだと
>>63 追求する意味があるものと無いものを見極める能力も無いとダメだよ
何も解ってない状態で割り切って諦めるのと、追求する意味がないことを見極めて
無駄な愚考をしないのは違うからね
おまいらが作ったクラスモジュール教えてくれ 使える、別のアプリ専用、面白い、誰得と何でもいいわ
>>71 具体性のない質問というかネタクレクレはスレ違い
>>2 でも行くかググって漁れ
ソート用クラスなら。 並び替えられるデータは数字の入った配列で、 比較メソッドはイベントとして使う側で実装する形。 数字=インデックスとして見れば、どんな内容のソートにでも使える。
入力データを取り込むのに Dim ttl As String If TypeName(buf) = "String" Then ttl = InputBox("タイトルを入力", title:="タイトル入力", Default:=buf) ←bufは事前にクリップボードからセット Else ttl1 = "" End If と言うのを作ったのですが、これだと1度に1つの文字列しか取り込めません 1つのダイアログを表示して入力箇所を2つ表示し 同時に2つの文字列を取り込む場合どうすればよいのでしょうか?
ユーザーフォーム使えば良いだけだと思うよ
使う方が嫌じゃなければカンマで区切るとか
あとはforで二回まわすとか? ユーザーフォームが一番スマートだと思うけどね
78 :
74 :2012/08/27(月) 00:50:32.74
ユーザーフォームって本を買ってきてVBを独学したときに作った記憶があるな クリップボードから拾わせた文字列を入力の初期値にして 文字列を入力したらVBに取り込んで シートのフィルターの指定フィールドで抽出させるというのを作ったんだけど やっぱり複数の文字列で同時にフィルターを掛けたいときが時々ある 同じ内容なんだけど、入力した時期によってキーワードが違っているときとか
解読しづらい文章だな
各セルの文中の最初に「★」がついてるものだけを探して「★」だけを消すのはどうすればよいでしょうか 最初でないところ(文中)にも「★」が出てくることがあるので検索して丸ごと置換というわけにもいかず困っています よろしくお願いします
>>80 Range.Findで探して、Mid$関数で消せば良いんじゃないか?
その条件ならワイルドカードが使えるし。
Selection.Replace What:="★*", Replacement:="", LookAt:=xlWhole, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False たんに全体一致で"★*"を""で置き換えるだけだが。VBAいらね
>>80 ↑ので充分だと思うけど
もし範囲が決まっているなら
Sub test()
Dim r As Range
For Each r In Range("A1:B5")
If r Like "★*" Then r = Replace(r, "★", "", 1, 1)
Next r
End Sub
でもどうだろうか
if instr(hoge,"★") = 1 then right(hoge,len(hoge)-1)
エクセルでwavファイルを取り込んでmp3で保存することは可能でしょうか?
常識だろw
87 :
デフォルトの名無しさん :2012/08/28(火) 07:15:53.67
89 :
桃白白 :2012/08/28(火) 07:31:22.12
>>87 エクセルはみんなのツールだ。フロントエンドをこしらえるのならなかなかいんじゃないか。
マクロ1でマクロ2を走らせる時、どちらも同じ変数名を使っているのですが問題ないですか? それぞれのマクロの中で値を指定していれば大丈夫ですよね? 一応動くのですがちょっと不安なので詳しく教えてください
変数にはスコープって概念があってな 大丈夫かどうかはソースみないと何とも言えん
93 :
デフォルトの名無しさん :2012/08/28(火) 19:44:37.89
Public変数を知らなそうなので大丈夫でしゅ
ユーザー定義関数の引数にrangeオブジェクトを指定した場合、 その値が数値の場合は配列に入れ直した方が処理は軽くなるのですか? 範囲は固定ではなく任意です。 環境なくて試せません。お願いします
軽くって? 配列に移し替える時にループ使うから意味ないと思うけど
>>95 失礼しました、シートから関数を直接呼び出すと挙動が重かったので軽くとかきました。
たしかにループしたら効果半減ですね…
ソートの質問です Sheet1が A B C 1あ い う 2か き く 3さ し す となっていて Sheet2で関連度の表を作っていて A B C 1 さ し す 2さ 2 0 1 3し0 2 1 4す1 1 2 としています これを,Sheet1でセルを選択した時に,Sheet2の関連度を呼び出してソートするのはどのように書けばいいでしょうか 例えば,B3[し]を選択したら,Sheet2で[し]をみると関連のある順に[し][す][さ]なので Sheet1全体を A B C 1い う あ 2き く か 3し す さ と並べ替えたいのです また,このようなソートはどのようにググればやり方が出てきますか?
自力で関数を書く
>>97 Worksheet_SelectionChangeでググってみたらどう?
>>94-96 Variant型変数にRangeの値を代入するならループなんて不要
ためしにこんなん書いてみたらTest1よりTest2のほうが10倍以上速かった
Sub Test1()
Dim I&, J&, T As Date, R As Range
T = Now
Set R = Cells(1, 1).Resize(65535, 100)
For I = 1 To 65535
For J = 1 To 100
R.Cells(I, J) = I + J
Next J
Next I
Set R = Nothing
T = Now - T
Cells(1, 1) = Format(T, "hh:mm:ss")
End Sub
Sub Test2()
Dim I&, J&, T As Date, R As Range, V As Variant
T = Now
Set R = Cells(1, 1).Resize(65535, 100)
V = R
For I = 1 To 65535
For J = 1 To 100
V(I, J) = I + J
Next J
Next I
R = V
Set R = Nothing
T = Now - T
Cells(1, 1) = Format(T, "hh:mm:ss")
End Sub
>>100 ありがとうございます。
引数をvariantにしてしまえばいいのですかね。
試してみます。
>>101 エクセル使う人は、直感的使いたいようで。
配列数式とか駆使して挙動みながら無理のない範囲で作るしかないですよね。
103 :
桃白白 :2012/08/29(水) 11:37:02.40
VBA勉強して2日目のド初心者です
http://www.dotup.org/uploda/www.dotup.org3367663.jpg 画像のように、2ページに分かれてそれぞれテキストボックスオブジェクトが2つ有り
上部のボタンを押すと各テキストをテキストファイルとして保存する
という処理を作りたいのですが
1ページだけなら
strREC = ActiveSheet.Shapes.Range(Array("Text Box 7")).TextFrame.Characters.Text
Print #intFreeFile, strREC
という風にして実装できたのですが、
2ページ目にあるテキストボックスオブジェクトを指定する方法が分かりません。
やり方のヒントを教えて下さい。
ド素人すぎてクラクラするなw
そんなこと言うくらいなら教えてあげなよ
for eachで回せばいいんだよ
108 :
桃白白 :2012/08/30(木) 17:52:44.75
>>104 画像ではText Box 7って2ページ目のテキストボックスなんでない?
ページ変わってもテキストボックス取得する方法は変わらんだろ
テキストボックスを選択したら左上にテキストボックスの名前が表示されるから、そこに桃白白と入力して
ActiveSheet.Shapes("桃白白").TextFrame.Characters.Textでいけるっしょ
対象のブックが開いているか調べるのにはどうしたらいいですか? もし、開いていたらそのままシートの内容をコピーして、 開いていなかったら、開いてコピー後、対象ブックを閉じる というのをやりたいです。
馬鹿には無理
111 :
桃白白 :2012/08/31(金) 00:02:07.39
>>109 For Eachでぐーるぐる
Sub TestFindWorkbook()
Dim book As Workbook
Set book = FindWorkbook("C:\Users\a\Documents\桃白白.xlsm")
:
End Sub
Function FindWorkbook(ByVal fullName As String) As Workbook
Dim w As Workbook
For Each w In Excel.Workbooks
If (w.fullName = fullName) Then
Set FindWorkbook = w
Exit Function
End If
Next
Set FindWorkbook = Nothing
End Function
Windows XP / Excel 2003 環境にて質問です。 A.xls が直接開かれたか、他ブック(B.xls、C.xls、D.xls)から VBA-Workbooks.Openで開かれたかを A.xls側から判断するのに適した方法ご教示願います。 今現在の方法としては、AにWorkbook_Open時に開いているブック名を調べ、 B、C、Dに該当するファイル名が開かれたら、他ブックより開かれた。と判定させています。 (偶然ですが>109-111さんの流れのようなもの) ただしこの場合だとAを直接開く際、Bが既に起動中でも該当してしまいます。 条件として個人用マクロは使用せずにてクリアしたく、よろしくお願いします。
馬鹿には無理
Auto_Open が走るかどうかで判定できる気がする
>>112 A.xls側が判断するタイミングはいつ?いつでも?
116 :
デフォルトの名無しさん :2012/08/31(金) 09:55:33.99
>>112 他ブックからオープンしたときは
A.xlsのどこか任意のセルにその呼び出し元を記述させるようにしたら良いんでない?
たとえばB.xlsからオープンしたら
Workbooks.open(A.xls)
Activeworkbook.sheets(1).cells(1,1)="B.xls"
みたいに
質問です 変数 = A1.value A1のセルには、文字列helpme となっているところを A1にhelp A2にme としたとき、 変数= なんて.value書けばいいですか?
range("a1").value & range("a2).value ってことか?
>>119 質問するならちゃんとしたコードで書いてよ
普通に考えて
変数 = A1.value
は「セルA1の値を変数に代入する」という意味のコードとしては
まともなコードとはいえない
これが「セルA1の値を変数に代入する」という意味のコードとして成立するためには
表記中の「A1」が「セルA1を意味するオブジェクト変数」である必要があるけど
それは
>>119 の質問内容からは確定できない
ちゃんと動作するコードとして書くなら
変数 = Cells("A1").Value
みたいに書いてないとおかしい
で、そういう意味であるなら
変数 = Cells("A1").Value & Cells("A2").Value
とすれば要求を満たせる
122 :
桃白白 :2012/08/31(金) 17:25:14.21
もしくはこうか Range("A2") = Right(Range("A1"), 2) Range("A1") = Left(Range("A1"), 4)
123 :
デフォルトの名無しさん :2012/08/31(金) 17:41:04.79
お前ら相変わらずエスパーだな俺には何言ってるのかわからん
126 :
112 :2012/08/31(金) 20:04:45.71
>>115 Aが呼び出されて直後の必要があります。
Workbook_Open起動時に本来やるべき処理があって、
それを実行する条件として、BCDから開かれたときのみとしたい。
という感じです。(直接起動時は実行したくない)
>>116 ちょうど↑の内容に絡む分ですが、オープンした後だと
分岐条件作る前にAのWorkbook_Openが走ってしまうのでダメでした。
>>118 読み取り専用に関する内容でした。
少し今回の件とは異なるように見受けられました。
>>115-118 ありがとうございました。
何か他の手を考えてみようと思います。
ってレス書いているホント今。思い浮かびました。
>116の内容をAじゃなく、開きに行くブックBCD自身にすればいいのですね。
Aを開く処理時に自ブックのCells(1,1)="flag"として
Aが開いたらCells(1,1)=""にする。
AからはBCDの存在調査じゃなく、BCD存在調査後、cells1,1の値を調べさせればいいのですね。
if Cells(1,1)="flag" then マクロから起動。 else 自己起動。見たいに。
どうもありがとうございました。
こんにちは!質問です! エクセルファイルを開いている日(毎日)からみて次の月曜日の日付を取得するにはどうすればいいですか? つまり火曜日に開いても木曜日に開いても来週の月曜日の日付を表示し、来週には再来週の日付を表示するということです。
129 :
112 :2012/08/31(金) 20:31:39.46
>>128 =TODAY()+9-WEEKDAY(TODAY())
月曜日に開いた場合の処理が指示されていないから、そこはつけたしてくだしあ。
name消し漏れ+ 日曜日の判定も必要ですな。>129だと不完全です。 WEEKDAY(TODAY()) = 0と1のとき分岐してください。
セルに文字としてプラスの記号入れ方教えてください。
ありがとうございます
多分解決しますた
選択セルの日付が今日を過ぎていたら赤文字、でなければ黒文字 をマクロにしようと思い、以下を書いた Dim cell As Range For Each cell In Selection If cell.Value >= Date Then cell.Font.ColorIndex = 3 Else cell.Font.ColorIndex = 1 End Next 実行するとNextに対するForが無いと言われる If〜Endをコメントブロックすると、ループは廻ります、何がいけないのでしょうか?
×End ○End If
>>138 最後から2行目の「End」は「End If」でしょ。
あっ!ミスってた 有り難うみんな
ここって資格試験について質問しても大丈夫でしょうか? 公式テキストの解答で1つ理解できないものがありまして・・・。
既に終った試験だとしても、出題内容をこういうところで漏らすことが 非常識な行動じゃないと思えるほどのバカなら好きにしたらいいさ。
>>144 いや、実際の試験では無くて公式テキストのサンプル問題です。
ちょっと理屈が良く分からない部分がありまして。
何でも良いから晴れよ
福沢諭吉「脱亜論」 1885年3月16日 時事新報 日本の不幸は中国と朝鮮だ。 この二国の人々も日本人と同じく漢字文化圏に属し、同じ古典を共有しているが、 もともと人種的に異なるのか、教育に差があるのか、 日本との精神的隔たりはあまりにも大きい。 地球規模で情報が行き来する時代にあって、近代文明や国際法について知りながら、 過去に拘り続ける中国・朝鮮の精神は千年前と違わない。 国際的な紛争の場面でも「悪いのはお前の方だ」と開き直って恥じることもない。 もはや、この二国が国際的な常識を身につけることを期待してはならない。 「東アジア共同体」の一員として その繁栄に与ってくれるなどという幻想は捨てるべきである。 日本は、大陸や半島との関係を絶ち、 欧米と共に進まなければならない。 ただ隣国だからという理由だけで特別な感情を持って接してはならない。 この二国に対しても、国際的な常識に従い、国際法に則って接すればよい。 悪友の悪事を見逃す者は、共に悪名を逃れ得ない。 私は気持ちにおいては「東アジア」の悪友と絶交するものである。 _,,,,,,__ __,,,__ ィjj)))))))))!!!!!彡ヽ, /ミ/ ,}彡ヘ |ミ{ -‐ ‐ ‐ ‐- {三=| El==; ゚ ''==. |ミミ,| `レfォ、,〉 :rfォ.、, !iル┤ . { `¨ i ・、¨ ´ `{ゞ'} 支那、朝鮮とは . | '`!!^'ヽ .「´ 付き合うなと忠告しておいたのに。。。 ! ,-ニ'¬-、 ,!|,_ . \´?` / ∧ヘ、 __/〉`ー ' ´ / 〉 \ _, ィ´「∧ / / 」¬ー- 、_ -‐ ´ / / ヽ、/ / iヾ ヽ
>>144 公式テキストの問題と解答をまるごとここに書くのならともかく、納得できない一問について
ここに書くことのどこに問題があるのか?
149 :
桃白白 :2012/09/03(月) 15:19:53.53
引用の範疇なら問題ないだろ VBAの設問なのか? 何だったら桃白白がお答えしちゃうけど? 貼っちゃいなよ
151 :
デフォルトの名無しさん :2012/09/03(月) 21:54:07.61
質問です。環境はwindows XP , Excel2003です エクセルファイルをメールで送信するコード、つまり Application.Dialogs(xlDialogSendMail).Show を使いましてメールを送信する際、引数の"Arg1"つまり「メール宛先」に 複数人のアドレスを入れる関係上、宛先文字列が256文字を超えてしまいます。 255文字以内に収めれば、上手くメーラーが起動してメール送信準備が されるのですが、256文字を超えると、エラーが出るわけでもなく ただメールが立ち上がらないという状態になります。 対策をする前に、なぜここで256文字を超えたらダメなのか、を一応 知っておきたいです。どなたか、知っていたら教えてください!
多量のテーブルデータがあったとして、 ワークシートとデータベースって どっちを使おうっていう判断基準を教えてください ファイルサイズを考えて、どちらも外部ファイルにデータを置くとした場合。
>>154 具体例を挙げてくれれば助言はできるけど
そんなもん一概に言えないよ
データ数が1万レコード以上ある時はアクセスを使うべき
>>155 1000×3ぐらいの数値テーブルが、数十個あって
ランダムな場所を幾度も読み込んで計算するような感じです
速度が求められます
シートにおさまるんだけど、どちらがいいのかな〜と。
158 :
157 :2012/09/04(火) 00:48:49.04
ちなみに、今はワークシートのデータをdllに投げて、処理して値を受け取るようにしているんだけど、 配布やら設定やらの問題でvbaで完結させたい。
アクセスじゃなくてエクセルでdbやってみりゃいいじゃん
メモリに乗りきらないとか、ワークシートに収まらないほどのデータがあるならDB それ以外なら好きにしろ
>>157 その程度のデータ量なら配列に一気に読み込んでから計算するのが一番処理が速い
162 :
桃白白 :2012/09/04(火) 05:52:03.40
>>153 スリープのあとにDoEventsを呼ぶようにしたら
10000回ループしても問題なかったよ
Call VBA.Interaction.DoEvents
理屈は知らん、寝るのに忙しくて表示を更新できません的なことなんじゃね
何かというと配列云々をいうアホがいるがそれだけじゃまったく不十分 アルゴリズムの方が大事だ
アルゴリズムの方も大事だ、だろ
シートとのやり取りのコストも、これはこれで馬鹿にならないよ。
>>153 x64Win8+Excel2013で動かしてみたけど固まりはしないな。
ただ、ESCキーでの実行中断が何故か効かなくなった。
165 :
153 :2012/09/04(火) 07:57:06.49
>>162 固まらなくなりました。ありがとうございます
ちょっと理屈調べてみたいと思います
>>164 環境にもよるみたいですね。テストありがとうございました
>>153 余計なお世話かも知れないが、
プログラムが動作するしない以前の問題として
変数の宣言が間違ってる。
dim a,b as integer
だと、aがVariant型、bがInteger型になる。
あと、変数名間違ってるのが数カ所あった。
Option Expricitで変数の宣言を強制する癖をつけた方が良いと思う。
167 :
166 :2012/09/04(火) 09:31:39.92
綴り間違えた ×Expricit ○Explicit
これは恥ずかしい。
169 :
151 :2012/09/04(火) 18:52:25.13
>>152 ありがとうございます。その255バイトまでっていうのが
何の仕様なのかが、どうも掴めなくて気持ち悪いんです。
変数の型はバリアントにしているので、変数の型によって255バイト
っていう制限がかかるわけじゃないし
Application.Dialogs(xlDialogSendMail).Show の引数は255バイト
までと決まっている(仕様)、ということなんでしょうか?
>>169 メールのtoフィールドが255バイト以下ってのはRFCで決まってたはず
それ以上送りたい場合はtoフィールド自体の数を増やせばいいんだけど、
受け取った側から見るとあんまり気分の良い物じゃないのでBCCなどを使った方がいい
171 :
桃白白 :2012/09/04(火) 20:06:56.45
>>170 マジで!? メールアドレスの最大の長さが255文字でTOが複数のアドレスを含むことが
できるとするなら理屈としてはTOは255文字以上を許容しないといけないんじゃね?
>>151 配列でアドレスを指定できるんじゃね?
Application.Dialogs(xlDialogSendMail).Show Array("桃白白さん", "ブルマさん")
みたいにして
172 :
153 :2012/09/04(火) 20:29:08.45
>>169 自作鯖ならsendmailmaxなんちゃらみたいな設定がたぶんhtod.confとかにあると
思ったけど
to Cc Bccでの上限数はあまり変わらないんじゃないか
>>172 VBAがというか大本のVBがそういう仕様だからなぁ
つか知らなきゃそう書いちゃうよな
質問です。 For shapeCounter = 0 To .Shapes.Count --- (※) Dim tempShape As Shape Set tempShape = mySheet.Shapes(shapeCounter) (略) Next このようにShapeオブジェクトを取得していたのですが、 別のマシンで動作させると3行目で停止してしまいます。 そこで、(※)を For shapeCounter = 1 To .Shapes.Count + 1 に変えると正常に動作しました。 officeのバージョンによってこのような事が起こるのでしょうか? もしそうだとしたらどこかにその情報のソースは無いでしょうか?
176 :
デフォルトの名無しさん :2012/09/07(金) 12:47:57.33
ExcelのVBAについて学ぼうと思っています。 まだまだ初心者なので、VBAについてお詳しい方、 ExcelのVBAでのテーブル作成方法を教えてください。
177 :
デフォルトの名無しさん :2012/09/07(金) 12:51:57.92
↑入力項目は@入力年月日A転出入りフラグ1、転入2、転出(選択すると自動的にカウントアップ)B氏名C新住所D性別 E年齢F生年月日F職業G男性人口±H女性人口±I全体の人口±といったところです。 このデーターを格納し帳票に飛ばしカウントアップしてデイリー分の男性、女性の転出、転入を出力データとしてまとめ 総人口数を求めるようにしたいのですが。
馬鹿には無理
179 :
桃白白 :2012/09/07(金) 13:34:55.59
>>175 Excel 2007 で Shapes オブジェクトのインデックスに不正な値 0 を指定してもエラーにならない
http://support.microsoft.com/kb/2699812/ja これかな。
For Toでぐるぐるするなら
For shapeCount = 1 To .Shapes.Count
にしないと0からCountまでぐるぐるしたらCount + 1のShapeが存在することになっちゃう。
Shapesオブジェクトの実装はたぶん線形リストで
序数が大きくなるほどアクセスするのに時間がかかるから
For Eachでぐるぐるしたほうがいいよ。
For Each tempShape In .Shapes
Next
180 :
桃白白 :2012/09/07(金) 13:39:04.73
>>176 データベースがメインになるんなら
Accessでやっちゃった方がよくね?
access高いから避けたい
182 :
桃白白 :2012/09/07(金) 14:17:45.26
>>181 データベースに何を使うかは決まってんの? MDB?
PostgreSQLが良い
184 :
桃白白 :2012/09/07(金) 19:38:37.15
教えて下さい。 excel vba でIE object のコントロールで ajaxを起動できますか? fireeventでjavascriptはわかったのですが selectにonclickがなくajaxでload window しているものがありどう呼び出せばよいか 悩んでます
★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。 VBAとは、『Visual Basic for Applications』の略で Application ├Workbooks |└Workbook | ├Worksheets | |└Worksheet というApplication以下のオブジェクトを、VB言語で操作するものを指します。 例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、 セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。 ★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。
187 :
デフォルトの名無しさん :2012/09/08(土) 08:35:29.78
重ねたバケツが抜けないのですが、何か良い方法はあるでしょうか?
188 :
デフォルトの名無しさん :2012/09/08(土) 09:29:19.83
外側のバケツのみ熱します
189 :
187 :2012/09/08(土) 09:30:46.59
どうやって熱しますか?
油を注いで熱します
>>177 DAOとかADOとかでExcelをRDBみたいにSQLで扱えるから
そういう感じでやれば良いんでね
やり方はググって好きな方法選んでくれ
193 :
桃白白 :2012/09/09(日) 01:50:11.99
みんな聞いて。桃白白のExcelの使用期限が終わりそう、繰り返す、桃白白のExcelの使用期限が終わりそう。
Excelって使用期限が設けられているライセンス体系もあったんか 次買うときはケチらずに無期限ライセンスのを買えよ
195 :
桃白白 :2012/09/09(日) 02:27:17.22
>>194 桃白白貧乏だから買えないの。寄付する? するんだったら桃白白はその好意を決して断らない
ことをここに誓う用意があるけど?
パソコンをリカバリすればまた体験版が使えるようになるよ
197 :
デフォルトの名無しさん :2012/09/09(日) 07:12:31.16
>>195 互換Office使えばタダだよ
VBA使えないけど
貧乏だけど知識が豊富で頭も良くて有用な回答者にならOfficeくらい寄付してもいいが、 貧乏な上に知識も多少の回答は出来るが並以下レベルで、頭の回転も弱い奴となると、 べつに回答者を続けてくれなくても誰も困らないから、Excelの使用期限と共に消えてくれて 一向に構わないな
199 :
桃白白 :2012/09/09(日) 10:38:47.13
∧∧ /⌒ヽ) i三 ∪ ○三 | (/~∪ 三三 三三 三三三
200 :
デフォルトの名無しさん :2012/09/09(日) 15:24:00.49
>>199 俺も貧乏だから寄付しないけどタオパイパイ嫌いじゃないよ
これからは回答せずに
にぎやかしでAA貼ってりゃいいじゃん
私の声がデムパになって 波になってあなたへ向かってく 私の歌がデムパになって 波になってあなたへ響いてく 私の愛がデムパになって 波になってあなたへ届いてく 私の電子回路が短絡する前に Electric LOVE Electric LOVE (∩ ゚д゚) アーアー この気持ちあなたに届くかな
202 :
デフォルトの名無しさん :2012/09/10(月) 11:09:37.38
VBAであるセル範囲をコピペして他のシートに貼り付けたとき 図のオブジェクトがどういうわけかコピペされないんです。 どうすればこの図のオブジェクトも正しくコピペされて他のシートにも表示させるようにできますか?
馬鹿には無理
204 :
202 :2012/09/10(月) 11:31:04.49
>>203 みたいな馬鹿には回答は無理なのは分かりますよ。
ただ図がセル範囲からはみ出してるだけじゃないのか?
206 :
202 :2012/09/10(月) 11:40:24.57
いえ、しっかりセル範囲内におさまっています。 列は3、行は20くらい、 図はちょうどど真ん中あたりにあり、1つのセルと同じくらいの大きさなのに。
2007以降だっけ、図形や画像のオブジェクト仕様が変わってるから その影響じゃね確かめてないけど
>>202 コードも貼らずに・・・VBAでコピペといっても丸ごと・値だけ・図だけ・云々
値だけコピぺのコードになっていないか?
再現できたよ import os import win32com.client def test_auto_shape(filename): xl = win32com.client.Dispatch('Excel.Application') xl.Visible = True try: book = xl.Workbooks.Open(filename) sheet = book.Worksheets(2) rs = "A10:D20" sheet.Select() sheet.Range(rs).Select() xl.Selection.Copy() sheet = book.Worksheets(1) sheet.Select() sheet.Range(rs).Select() xl.Selection.PasteSpecial() finally: xl.Workbooks.Close() xl.Quit() if __name__ == '__main__': test_auto_shape(os.path.abspath(u'autoshape_copy.xls'))
きもっ
こっちのコードなら図形も正しくコピペされたよ import os import win32com.client def test_auto_shape(filename): xl = win32com.client.Dispatch('Excel.Application') xl.Visible = True try: book = xl.Workbooks.Open(filename) sheet = book.Worksheets(2) rs = "A10:D20" sheet.Range(rs).Copy(book.Worksheets(1).Range(rs)) finally: xl.Workbooks.Close() xl.Quit() if __name__ == '__main__': test_auto_shape(os.path.abspath(u'autoshape_copy.xls'))
212 :
デフォルトの名無しさん :2012/09/10(月) 15:43:04.57
Select って恥ずかしいよね
なんでVBAのコードにしないんだろう?
中二病だから
覚えたてだからやってみたいだけだろ
下げ
セルの値が4:07の場合内部データでは0.17152.......となっていて この値だと例え同じ4:07でもFIndでヒットしません。 TimeValueを使おうにもTimeValue(0.17152.......)となってしまいdate型にもできないです。 方法はないでしょうか?
>>217 A1セルに"4:07"を入力してFindでヒットしたけどなんか解釈間違ってる?
Dim r As Range
Set r = Range("a1").Find("4:07")
If Not (r Is Nothing) Then
Debug.Print r.Text
End If
>>218 Debug.Print Range("a3").Value
とすると小数点の値になりませんか?
訂正a1でした。
> FIndでヒットしません。方法はないでしょうか? これが質問じゃないの?何が質問なの?
説明不足なので補足します。 エクセルのテキストファイル読み込みでRange("A1":"A10")まで 16:08 16:40 18:23 19:49 20:18 16:08 3:59 15:02 19:49 19:49 の値が入っているとします。 Dim r As Range Set r = Range("A1":"A10").Find(Range("A1")) というコードの場合に Find(Range("A1"))は小数点0.0***********の様な値を検索するようです。 その場合は例え同じ小数点の値でもヒットしません。
>>222 Set r = Range("A1":"A10").Find(Range("A1").text)
にするとか
>>223 ででででできました。
ありがとうございました。
.text メモメモ
省略されてるけど.Valueで検索されてて、.Valueは丸められてるんだな .Textで検索すればいけるんじゃね
226 :
デフォルトの名無しさん :2012/09/15(土) 04:10:49.15
【対応したい環境.】 Windows 2000以降/Excel 2000以降 とあるエクセルファイルのマクロを実行する前に、実行対象PCかを判定する必要があります。 PC名等で細かく指定することでクリアできますが、対象PCがかなり多いため、 以下条件を踏まえて捌こうと考えています。 「マクロを実行したい対象PCにのみ、専用のマクロが入った個人用マクロブックが既に設置されている」 という条件より、もともと設置済みの個人用マクロブックを判定して対象PCとする。 が良いと考えました。 これより、 Onerror goto ERR1 Application.Run "PERSONAL.XLS!判別マクロ名" Hanbetu = 1 ERR1: といった単純な内容で達成したかと思っていたのですが、 PERSONAL.XLSB(最後にB)なるものが存在し、エラーを返される事がわかりました。 どうやら新しいEXCELにはXLSBらしいのですが、 この場合にも対応するにはどうすればいいでしょうか? Onerror goto ERR1 Application.Run "PERSONAL.XLS!判別マクロ名" Hanbetu = 1 ERR1: Onerror goto ERR2 Application.Run "PERSONAL.XLSB!判別マクロ名" Hanbetu = 1 ERR2: もし一つのマクロでONERRORが2個使えたらこんなイメージなのですが、 そのやり方を知らず、回避できませんでした。 ご教示お願いします。
227 :
226 :2012/09/15(土) 05:03:52.12
自己解決しました。 For Each wb In Workbooksと 以下2つは同じであることを利用。 Left(personal.xls,12) Left(personal.xlsb,12) 個人用マクロブックを見つけ、そのときの名前を拾う形でうまくいきました。 For Each wb In Workbooks If LCase(Left(wb.Name, 12)) = "personal.xls" Then PSBname = wb.Name End If Next wb あとは適当に>226を付け足して If PSBname = "" Then GoTo pointA End If On Error GoTo pointA Application.Run PSBname & "!判別マクロ名" Hanbetu = 1 pointA: MsgBox Hanbetu 個人用マクロブックに判別マクロ名があるPCを判定することができました。 ありがとうございました。
228 :
デフォルトの名無しさん :2012/09/15(土) 14:38:49.88
へんな質問ですが、営業や事務はExcelVBA以外のプログラミング言語を知っていても仕事には役に立たないものですかね?
229 :
デフォルトの名無しさん :2012/09/15(土) 14:43:02.60
>1 ExcelのVBAに関する質問スレです
>>228 >ExcelVBA以外のプログラミング言語を
スレチです。
>>228 どんな知識だって有って損になるわけじゃないと思うけど、
そもそも営業にVBAの知識って要る?
事務はVBAで自分の業務を改善できるかもしれないけど、
営業ってPC弄るんじゃなくて人と会ってナンボの仕事でしょ?
VBAの設計センスを磨くのにいいサイトとか書籍とかってありませんか? …それとも必要ありませんか… ちなみにwindows7 excel2010です。 始めて1日目なんですが、どうもいわゆる入門書とかサイトとか見てても、 「仕様はそこそこわかった。ではこれからどうするの?」ってなりがちなのですが… みんなは設計書とか書くんですかね?
vbaの問題ではなくプログラミングのアイデアの問題だ w >設計書とか書くんですかね? 全く俺専用のプライベートのものだけど、最近はテキストファイルに予め作るようにしている。 作っている間にあそこをこうしないといけない、あの処理もいるな…などいろいろ出てきたりするんで。
A.xlsにmacroAがあり B.xlsにmacroBがあり A.xlsのmacroA--------------- sub macroA() Workbooks.Open B.xls end sub B.xlsのmacroB--------------- sub Auto_Open() Workbooks(A.xls).close msgbox "確認" end sub こういった異なるブックを呼び出し、 呼び出された側が呼び出したブックをクローズすると、 そこでマクロ止まっちゃいました(msgbox 確認が出ない) どうにかして次の処理に進める方法ありませんか?
>>233 そもそもWorkbooks.Openで開いたら、Auto_Openは実行されなかったはずだが
それちゃんと実行されてるか?
単にエラーー出ても無視したいだけなら On Error Resume Next 使え
>>234 ゴメ、ブックオープンマクロだった。
ちなみにやっぱダメみたいね。
エラー出してくれるなら拾えるんだけど、.closeにて閉じた跡、
エラーも出さずにそこで止まる。仕様だね。
さっきB.xlsからVBSへ切り替えて完成した。
どうもありがとう。
>>232 回答ありがとうございます。
少々質問が悪かったのですが
僕が言いたいのは設計センスというか設計法のことについてであり
(たとえばジャクソン法だのモジュール設計だのって言葉がネットでは調べればでてきますよね)
そういうのは一切なしで、結局はとにかく「プログラムにさせたい動作を日本語で書いて、
それをそのまま言語に落としこめるだけの作業を作成者はするだけだ」ということなんでしょうかね?
なんだかたかがVBAに自分は気難しく考えすぎなようも気がします…
237 :
236 :2012/09/16(日) 08:07:09.27
ああ、ちょっと日本語が不自由なもんだから質問がわけわからない でも疑問なんでだれかたすけてー
238 :
236 :2012/09/16(日) 08:11:14.42
ちょっと質問を整理します。 1まず、VBAの仕様はわかります 2しかしこれからどうすればいいのかわかりません 3モジュール設計とかそういう設計や仕様書の勉強したほうがいいの? という理屈なわけです。
>>235 Application.OnTimeではダメかな
>>238 一番大事なのは、「何」をしたいのかを明確にすることじゃないかな?
例えば
VBAを使って「集計レポートの作成」をしたいとか
VBAを使って「入力フォームの作成」をしたいとか
>>238 とにかく書いてセンスを養えばいいと思う。
テスト技法なんかは気にした方がいいかな。
人に配ったマクロにバグがあると一気に信用を無くす可能性がある。
>>238 設計しないとコーディングできない
設計書に落とし込むか脳内で完結するかは規模次第
テスト設計も然り
>>239 あーその手があったかぁ。
今回はVBSで逃げたけど、今までApplication.OnTimeって
使ったこと無かったけど、色々過去振り返ると便利に使えそうなシーンざくざく出てきそう。
ちょっと練習がてらに使ってみるかな。
244 :
236 :2012/09/16(日) 15:26:55.47
おk
>>240 .241.242 氏
回答ありがとうございます。
書いて書いて書きまくれとは、今、小説書いてたりするんですけど
クーンツの本でも同じことが書いてありました。結局「やらないことには始まらない」ということですね。
一応テスト設計という言葉も調べてみようと思います。
C♯勉強したら、VBA書けるようになりますか?
247 :
桃白白 :2012/09/16(日) 17:09:54.60
>>246 桃白白もかわいくておっぱいが大きいママが欲しかったよ。
ぜったいちゅーちゅーしたいよ、ちゅーちゅーとれいんを一緒に踊りたいって
意味だからな、そういうアクティブでカッコいい母親がいればいいってことだからな。
開発中のブックで下記のコードを書くと二行目のWorksheets(1)に問題があるようで動作しませんが 新規ブックで同じコードを書くと動作します。なぜですか? Worksheets("sheet1").Cells(1, 2).Value = 479 Worksheets(1).Cells(1, 1).Value = 476
>>248 開発中のブックにWorksheets(1)がなくて
新規ブックにWorksheets(1)があるからじゃない?
>>248 Worksheets(1)をSheets(1)に書き換えてみ
もしそれで動いたんならインデックス番号1のシートの種類がワークシートじゃないって事
>>248 動作しませんってのは具体的にどういうことなんだ
単にお前が思ってるシート(sheet1)以外のシートに値がセットされてるだけじゃないのか?
試しに MsgBox Worksheets(1).Name を間にいれて何が表示されるかみてみ
>>249-250 Worksheetsってワークシートだけのコレクションだと思ったんだが
Worksheets("sheet1")があるのにWorksheets(1)が無いなんてこと起きるのか?
248です。 .Nameで確認したら僕が思っているWorksheetsではなく その左にWorksheetが隠れていたようです。 解決しましたありがとうございました。 どうも一度ウインドウの横幅を細くして左下の右矢印を押して隠した後に 横幅を戻しても隠れたままになるようです。
>>251 > Worksheets("sheet1")があるのにWorksheets(1)が無いなんてこと起きるのか?
そんなん普通にあるだろ
新規ブックに対してSheet1の左側にグラフシートを追加すれば簡単に再現できる
255 :
デフォルトの名無しさん :2012/09/17(月) 12:55:34.00
すみません、質問! OffsetとResizeで範囲?が取得できると思うんですが、この範囲に入ってる 数字の合計を出したい場合、どのように書けばいいですか? Range("A1").Offset(1, 1).Resize(2, 0) ↑たとえばこの範囲に入ってるセルの合計をVBAでもとめたい よろしくおながいします。
Resize(2, 0)はResize(2, 1)と解釈 WorksheetFunction.Sum(Range("A1").Offset(1, 1).Resize(2, 1))
>>256 さん
おおお、ありがとうございます!
SUMも試したんですが、問題はResizeの引数の側だったとは…。
すません、助かりました。
>>254 再現しないんですが?
Worksheetsはワークシートだけのコレクションだから、グラフシートがあっても関係ないんですが
Sheets(1)がWorksheets(1)じゃないって状況ならいくらでも存在するがな
変数を使わずにA1からデータがあるセルまで選択するにはどうすればいいんでしょうか?
変数を使いたくない理由は?
使わずにできるならそうしたいなって
>>259 Range("A1", Cells(1, 1).SpecialCells(xlLastCell)).Select
スペシャルセルズってはじめて見た。 同じだけど Range(Cells(1, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, 1)).Select
エクセルマクロでさ シートが10ぐらいあって、そのうち5枚だけに以下の作業させたい ・1から10行までで一列目に何も入ってない行を非表示にする これどうしたらいいの? 記録でやってみるんだけど、最初のシートしか非表示にならないんだ
>>265 とりあえずこれ見て考えて
Dim i As Integer
Dim row As Integer
For i = 1 To 5
With Worksheets(i)
For row = 10 To 1 Step -1
If .Cells(row, 1).Value = "" Then
.Cells(row, 1).EntireRow.Hidden = True
End If
Next
End With
Next
>>266 これって右のシートから順に5つに動作する?
連投ごめん、ワークシートにはそれぞれ予算とかそういう名前がついてるんだ どうしたらいい?
269 :
デフォルトの名無しさん :2012/09/17(月) 20:01:36.61
270 :
263 :2012/09/17(月) 20:17:27.38
ごめ、間違えてた? 試しても無いんだけど、あってるほうで頼む>262-263
>>268 Dim row As Integer
Dim sheetnames
Dim sheetname
sheetnames = Array("予算", "名前1", "名前2", "名前3", "名前4")
For Each sheetname In sheetnames
With Worksheets(sheetname)
For row = 10 To 1 Step -1
If .Cells(row, 1).Value = "" Then
.Cells(row, 1).EntireRow.Hidden = True
End If
Next
End With
Next
とりあえずこれ理解するまで次の質問禁止な
もうちょっとシンプルに If Cells(r, 1) = "" Then Rows(r).Hidden = True
273 :
デフォルトの名無しさん :2012/09/17(月) 20:51:23.07
ご教授願います。 2012/8/23 10:44:24 を秒数に変換する方法を教えてください。
VBAではformatする場合は秒数を使わないのでしょうか?
ある程度使い方調べてから質問しろよカス
>>274 =Int(Range("A1") * 86400 + 0.5)
>>277 ありがとうございます。
>>276 UNIXタイムスタンプという言葉を忘れていました。検索キーワードを変えてみます。
気に障ったみたいですいません。
>>278 すみません。
こちらこそ言い過ぎました。
>>259 >>264 xlLastCellって「使われた最後のセル」であって「データがあるセル」では無いのだが良いのか?
有効データがある最後のセルがほしいのならもう一工夫必要になる。
(一列だけが対象なら
>>263 で有効データがある最後のセルが得られる)
281 :
桃白白 :2012/09/17(月) 21:50:35.12
牛乳飲みすぎた、気持ち悪い、吐きそう
282 :
デフォルトの名無しさん :2012/09/17(月) 22:00:45.02
使用期限切れで消えるんじゃなかったのかよ TAO PAI PAI 恐らくこのスレ内だけで生じているTPP問題
>>262 A列限定だとして
Range(Cells(1, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, 1)).Select
昔はこんな回りくどいコード書くやつがいっぱいいたねぇ
Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp)).Select
とできるんだが
A列と決まってなければFindメソッドで"*"を後ろから検索するのが普通
その時は変数を使うのが普通だ
>>283 そんなめんどいことにならないように、range(hoge).currentregionで使用範囲を特定できる構成にするのがいいよ
>>283 そのコードはレアケースで壱番下までデータで埋まってると失敗する
まあ現実的には下まで埋まる前にデータ大杉でExcelが無反応になると思うけど
>283
他を否定、アレンジして主張するもなお粗末な出来。 挙句の果てには >変数を使わず に対し >Findメソッドで >変数を使うのが普通だ なんだろうこの痛い奴・・
290 :
デフォルトの名無しさん :2012/09/18(火) 22:14:25.17
OFFICE XPを使用しています。 A列にID、B列に数値が入っており、 IDと数値の関係は1対多になっています。 (A列には複数のIDデータが入っています。) このデータで、各IDの最初の数値だけ必要であり、 それ以外の行を削除したいと考えています。 for nextで最終行からIDのマッチング、削除をする VBAを組んだのですが、データ量が多すぎて 処理が時間がかかりすぎる状況です… どなたか改善策のヒントをご教示いただければと思います。
>>289 アレンジ?
Cells(Cells(Rows.Count, 1).End(xlUp).Row, 1)の間違いを正しただけなんだが
Cells(Rows.Count, 1).End(xlUp)と同じだもんねぇ
いまどきこの程度が分からないやつはあまりいないけどな
>>286 知ってるよ
>>292 Cells(Rows.Count, 1).End(xlUp)はアマチュアの書き方
Cells(Cells(Cells(Rows.Count, 1).End(xlUp).Row, 1).Row, 1)と書くのがプロ
そんなプロはいねーよと言いたい人もいるだろうが実際にいた
>>290 はい、IDが6万件あっても0.1秒で終わるよ
Sub Macro1()
Set dic = CreateObject("Scripting.Dictionary")
cel = Range("A1:B" & ActiveSheet.UsedRange.End(xlDown).Row).Value
For r = 1 To UBound(cel)
If Not dic.Exists(cel(r, 1)) Then dic.Add cel(r, 1), cel(r, 2)
Next
Columns("A:B").Clear
Key = dic.keys
itm = dic.items
For r = 1 To dic.Count
Cells(r, 1) = Key(r - 1)
Cells(r, 2) = itm(r - 1)
Next
End Sub
vlookupを使って処理したいのですが、データが多くて時間がかかります。 具体的には、Aシートに氏名と来た日時が入っており(各人何回も来ているとする)、 Bシートには氏名と誕生日が入っています。 各人、誕生日の3日後以前に来た日のデータを削除したいのです。 どうかお知恵をお貸し下さい。
単純にAシートに、Vlookupより取得した誕生日列を追加して、 =if(来場日<誕生日+3,"削除対象","") とかじゃダメなの?
Excelのマクロって Excel用に便利な関数みたいのを作れるだけで それ以外に使うことって出来る?
299 :
297 :2012/09/19(水) 12:43:25.54
>>298 その作ったものを
Excel上以外で動かせる?
>>299 無理だと思う
VBに移植すれば単独起動も可能になるけど、Excelの機能を使ってる場合は
結局はExcelもインストールしとかないと動かない
>>299 「Excel上以外」というのが、Excelを起動しないで、という意味なら、OLE経由で可能。
詳しくは"windows ole excel"で検索。
Excelインストールしないでも動くの作れないかな
Access使えよ
VisualStudio使えよ タダだよ
Accessもインストールしないと使えないしなぁ
Excelマクロで作ったゲームをExcelのインストールしてないPCで遊ぶ方法ねぇ・・・
Flash最強説
Flashは開発環境が有料だし、VisualStudioでいいじゃん
Flashはやりたいことばかり実装しててセキュリティとかすっぽり抜けてた 今更直せませんごめんなさいって開発チームが謝ってたろ アップルも嫌がらせだけで外した訳じゃねーぞ半分ぐらいは
AndroidからもFlash終了 そのうちデスクトップからも消えるのは時間の問題 っていうかスレチ
312 :
デフォルトの名無しさん :2012/09/21(金) 12:00:04.64
Worksheets("result").Cells(writerow, 2).Formula = "=100*SUMPRODUCT((MOD(ROW(O" & startrow & ":O" & finishrow & "),2)=0)*O" & startrow & ":O" & finishrow & ")/D " & finishrow というコードが、 実行時エラー '1004': アプリケーション定義またはオブジェクト定義のエラーです。 と表示されてエラーになってしまいます。 変数自体はちゃんと認識されています。 何が間違っているのかご教示ください。お願いします。
>>313 うわわ、本当だ…
ありがとうございました!
315 :
デフォルトの名無しさん :2012/09/21(金) 18:02:02.29
いつも参考にさせていただいています。 下記、どうかお助けください>< 現在、エクセルのマトリクス表をテーブルに変換する作業が必要となっており、 私の知識では対応できないため、皆様のお知恵をお借りできないでしょうか。 【イメージ】 (基データ) ABC 1 121 2 222 3 32 ↓↓↓ (変換後) A1 1 A2 2 A3 3 B1 2 B2 2 B3 2 C1 1 C2 2 C3 ※実際には、行・列とも1000近くあります。 良い方法がありましたら、ぜひご教示ください。 [エクセルのバージョン] Excel2007 [OSのバージョン] WindowsXP
セルの指定方法は、worksheets("Sheet1").cells(1, 1) 文字列の長さはlen(buf) ループはfor i = 0 to len(buf) -1 ... loop 文字列のn文字目を1文字取得するのはmid$(buf, n, 1) セルへの設定は、cell.value = hoge
ユーザー定義関数で例えば Sub Tset() cells(1,2) = CellValue(1, 1) End Sub Sub CellValue(address1 as Long, address2 as Long) cells(address1, address2).value このcells(address1, address2).value値が返るようにするにはどうしたらいいですか?
319 :
デフォルトの名無しさん :2012/09/23(日) 22:22:05.56
>>318 Function プロシージャを使う
Function CellValue(address1 as Long, address2 as Long) As Variant
CellValue = cells(address1, address2).value
End Function
A1セルに不定期にデータが入っています。 でーたが入っている行の上に1行挿入したいのですがどうしたらいいでしょうか? For i = 22 To 1 Step -1 If Len(Cells(i, 1).Text) >= 0 Then Rows(i).Insert End If Next i としてみましたが空白行が連続すると余分に挿入されてしまいます。
>>320 If Len(Cells(i, 1).Text) >= 0 Then だと全行がTrueになるような・・・
If Not IsEmpty(Cells(i, 1)) Then にするとか
XP SP3? Excel 2003 Excel起動時にPERSONAL.XLSからマクロを実行して時間指定、 指定時間になる度(10:00と11:30とか複数あり)に、 他のアプリケーションを実行していてExcelが隠れていてもExcelを表示させたい 要はタイマーにしたいのですがうまくいきません Workbook.activateではうまくいかず、 CreateobjectならExcelの表示には出来ますが、新たに開いてしまいます 出来れば既に開いているPERSONAL.XLS(シートは非表示ですが)を表示させたいと考えています どなたかググる際のキーワードでもいいので教えてください
>>321 勘違いしてました。
For i = 22 To 1 Step -1
If Len(Cells(i, 1).Text) = 0 Then
Else
Rows(i).Insert
'i = i - 1
End If
Next i
で良かったんですね。
でもまた一つ勉強になりました。
>>323 タイマーイベントを仕込みたいって事?
でも基本的にそういうスパンの長いものは
タスクスケジューラとかで実装するもんだと思う。
あと既存のExcel取得したい時はCreateObjectじゃなくてGetObject
という感じでキーワードを散りばめてみたがどうか
>>323 「Excel 最前面」
SetWindowPos()かな?
>>103 スーパー亀ですが実装再開します
VBAの新規画面に入力するとEndSubが必要と出るのですがどこが違うのでしょうか
>>327 最初のSubの次の行に入れたらエラーなくなりました
しかしどうすれば動くのかわからない…
329 :
桃白白 :2012/09/26(水) 07:12:09.39
>>328 Sheet1でしを選択してSortTable関数を実行したらいいよ
>>329 うんともすんともです…orz
EndSubを2行目に入れるのはあってますか?
入れないとエラーが出ますが入れても動かないのです
331 :
桃白白 :2012/09/26(水) 08:20:26.76
>>330 2行目ってどこの2行目? 桃白白のコードには入れたらまずいよ
1行目には何がある?
>>331 マクロにコピペしていたのでSub test()とかなっちゃってました
新規VBAとして書き込んだらできました
ありがとうございます!
>>331 何度もごめんなさい…
これって一度動かしたら、動かした後のシートに対して同じ動作はできませんか?
>>333 あ、3行目だけに有効だとわかりました
全行で同じ事やりたいので何とかならないか考えてみます
335 :
デフォルトの名無しさん :2012/09/26(水) 10:12:27.14
>>334 関連度がさ・し・す についてしか定義されてないんだから
他の文字では何も起こらないだけでは?
>>335 わお
自分ばかすぎでした逝ってきます
助かりましたありがとうございました
Dictionaryオブジェクトで動的配列のITEMに動的配列を入れる方法を教えてください。 コレクションで下記コードで実行した場合どうも上手くいきません。 For i = 2 To Range("A1").CurrentRegion.Rows.Count - 1 With vArray .Add Item:=Cells(i, 1) .Add Item:=Cells(i + 1, 1) .Add Item:=Cells(i + 2, 1) .Add Item:=Cells(i + 3, 1) .Add Item:=Cells(i + 4, 1) End With dateArray.Add Item:=vArray Next i
Debug.Print Join(dateArray.Item(1))とかDebug.Print Join(dateArray(1))やりましたがエラーになりました。
検索値と一致する値が連続した複数行にあるとします。 その最初と最後の行のrowsを取得したいのですが、 for nextを使わずに処理する方法があればご教示下さい。 よろしくお願いします。
>>337 めんどくせぇ。
vArrayって何なんだよ。
実行したらどの行でどんなエラーになるんだよ。
列数-1のループなのに、1セルごとに縦方向に参照してるのは正しいのか?
>>337 ・ソース貼るなら端折るな
・どう上手くいかないのか具体的に書け
・上手くいかないミニマムコードを書いて貼れ
Dictionaryって、keyとitemのペアだよ。 あとJoin()ってなんだよ?
344 :
337 :2012/09/26(水) 20:10:33.75
ツッコミどころ満載のコードですいません。 今ミニマムコードで試したら Dim dArray As New Collection With bArray .Add Item:=Cells(1, 1) .Add Item:=Cells(2, 1) End With Debug.Print Join(bArray) どうやらコレクションではjoinは使えないようです。
Dictionaryオブジェクトと動的配列はどこ行ったんだ
346 :
デフォルトの名無しさん :2012/09/26(水) 20:44:15.51
ちょっと近所へ買い物へ行ってる
>>344 質問内容が変わっちゃったの?
とりあえず Option Explicit 書いてみたら?
>>344 どうやらっておまえ・・・・
F1くらい押せよ
Collectionのインスタンスにarrayってつけるのやめません?
コレクションと配列とディクショナリの区別がついてないんだな、きっと
>>337 何がやりたくて何で躓いてるのかよくわからないけど
もしかしてUnion使ったら解決するとか
仕事で売り上げの比率を出さなければならないのですが質問させて下さい。 総売り上げから人件費%経費%など円グラフにするにはどうすればいいですか? 総売り上げが100%です。 宜しくお願いします。
>>353 >わからなければとりあえず「マクロの記録」(Alt, T, M, R)
質問内容が伝わってこないので、もう少し具体的に質問してください
何がやりたくて、現状どんなソースコードを書いていて、どこでどのように行き詰っているのか、とか
丸投げしたいならせめて入力情報と現状のソースが入力されたブックをアップしてください
winXP excel2002 マクロ実行中に手動で他のブックを開くようにするには どういった記述を追加すればよいですか? マクロ実行中に手動で他のブックを開くことができません。 マクロ実行前に他ブックを開いておけば、編集作業はできます。 実行時間が1時間近くなるので困っています。
>>355 実行しているマクロの所々にDoEventsを入れる。
所々というのは、Loop行の前とか、関数呼び出し後とか適当に。
>>355 力業だけど別プロセスでExcelをもう1個起動して作業するという手もあるよ
>>355 OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls?")
これだと開くファイルを自分で選べるけど
1時間もかかるマクロを実行中のPCで他の作業やるなんて・・・
360 :
デフォルトの名無しさん :2012/09/27(木) 19:30:16.73
>>359 いまどきのPCなんて大概マルチスレッド対応なんだから
Excel実行中に別の事したって問題ないでしょ
361 :
デフォルトの名無しさん :2012/09/27(木) 20:32:50.52
下記のコードがうまく機能しないで困っています。 nowrow、maxrowは変数で、resultシートの現在の値を検索値とし、 sheet1の2行目から最終行までの範囲で検索し、その4列目の数値を 変数kaiとして求める式です。 kai = Application.WorksheetFunction.VLookup(Worksheets("result").Range("A" & nowrow), Worksheets("sheet1").Range("A2:A" & maxrow), 4, False) ヒントをください。 どうかよろしくお願いします。
362 :
361 :2012/09/27(木) 21:06:19.33
我ながらアホだ・・・ 自己解決しました。
>>362 もしかして
"result"
ここか?
>Worksheets("sheet1").Range("A2:A" & maxrow) 4列目だと?
365 :
デフォルトの名無しさん :2012/09/27(木) 21:29:08.09
VBAを使って Excelのある内容をグラフ化してそのグラフをJPGとして デスクトップに保存したいのですが なんとなく VBAでワークシートにグラフを作成 ↓ そのグラフをアクセサリのペイントに張り付け ↓ JGP形式でデスクトップに保存 を自動でするみたいなのを想像していますが もっと簡単なやり方とかあるのでしょうか? 上記の方法だとペイントがある事が前提とかマシンに依存しすぎなので避けたいです
>>365 excel vba グラフ 画像 保存
とかでググる
>>356 所々にいれてはあるのですが、なかなか起動しですね
>>357 、
>>358 いいアイデアもらえました。実現できそうです
>>359 webアクセス→テキスト整形、貼付なので負荷は重くないです
368 :
359 :2012/09/27(木) 23:09:06.42
>>360 負荷的なことを言ってるんじゃなくて別の作業することでPCがフリーズしたりとかすると
また最初からマクロ実行しなおしになって時間がかかるなと思っただけ
あんま気にしないで
369 :
デフォルトの名無しさん :2012/09/27(木) 23:19:08.89
すいません、どなたかご教授下さい。 Sheet1にA列B列C列の3列でできた表があって、C列の数値が10以上ならSheet2にA列B列を表示させたいのですが 関数で表示させるとしたら、どういう関数式になりますか?
ExcelのVBAに関する質問スレです
371 :
デフォルトの名無しさん :2012/09/27(木) 23:30:44.08
スレ違いすみません;質問に適当なスレに誘導していただけませんか?
373 :
桃白白 :2012/09/27(木) 23:35:13.97
374 :
デフォルトの名無しさん :2012/09/27(木) 23:38:52.18
ちんこの事ちんちん言う奴は大概短小
376 :
桃白白 :2012/09/27(木) 23:42:23.73
378 :
桃白白 :2012/09/28(金) 09:31:46.81
>>377 切れた、完全に切れた、もう使えない・・・寄付する?してくれてもいいけど?
>>378 PCリカバリで体験版の使用歴リセットできるよ
>>378 ネット解約してその金でExcel買え
みんなハッピーになれる
無料のオフィスソフトあるだろ。 アレ使え。
382 :
デフォルトの名無しさん :2012/09/28(金) 13:02:54.96
ソレはVBAも対応してるのか?
VBAあきらめてVB使えば?無期限完全無料だぞ あと、VBならゴニョゴニョ……
384 :
デフォルトの名無しさん :2012/09/28(金) 15:42:09.39
VBが無料と申すか? 10万円以上するんじゃなかったか? ゴニョゴニョとはどういうことか教えれ。
何年前のはなしだよw てかお前の知ってるVBは死んだ。
Office体験版の期限が切れても、VBからOLE経由でExcelのブックを開くと、あら不思議
387 :
デフォルトの名無しさん :2012/09/28(金) 18:14:59.98
あら不思議(藁)
OLE OLE 詐欺
389 :
デフォルトの名無しさん :2012/10/01(月) 10:38:11.30
OSとExcelのバージョンは?
391 :
桃白白 :2012/10/01(月) 10:55:42.23
>>389 違います。桃白白のほうがイケメンです。
393 :
桃白白 :2012/10/01(月) 11:35:01.94
桃白白と書いた紙を持って撮って
395 :
デフォルトの名無しさん :2012/10/01(月) 20:46:03.54
396 :
桃白白 :2012/10/01(月) 20:59:25.28
>>394 桃白白の家庭では小さいころから桃白白と書かかれた紙を持って写真に撮られたら魂抜かれると
教わって育てられる、都市伝説かもしれないけど、迷信かもしれないけど、桃白白は昔の人が
代々語り継いできた言葉を大事にしたい、だからそれは無理だけど、イケメンだろ? ほれるだろ? お前はもう桃白白にほれている
397 :
デフォルトの名無しさん :2012/10/01(月) 21:04:21.37
>>396 ExcelVBAと書いた紙を持って撮って
三つ編みじゃない桃白白なんて誰が認めるか
399 :
323 :2012/10/01(月) 21:12:08.48
>>325 ,326
遅くなりましたがレスありがとうございました
できました!と書きたかったのですが、
まだ時間がかかりそうです
単純なウィンドウ操作だけではうまくいかない感じで、
APIのスレッドIDとかプロセスIDとか勉強してみようと思います
>>399 画面をとにかく最前面に出すってのなら、SetWindowPosを使った例がExcel VBA 裏ワザ大辞典って本に載ってる
SetWindowPosでもダメだったんですよね うまくいくときもあれば、そうじゃない時もあって 幸い仕事も暇なので、色々勉強します
テキストボックスに現在の時刻+3分先の時刻を表示するにはどうすればいいですか? リアルタイムで進まず、ボタンを押したら2012/10/02 20:10 みたいな感じで表示したいんですが
>>402 TextBox1.Text = Format(Now() + TimeValue("00:03"), "yyyy/mm/dd hh:mm")
>>401 あんまり上手くいかないようならExcel以外の手も組み合わせると良いと思うよ
このスレ的には反則だけどもExcelオンリーじゃなきゃダメってんでもないんでしょ?
勉強なら良いけど、仕事なら手を狭めるのは損だ。
質問です。テキストボックス1から6まであり、チェックボックスが2つあります。 クリアボタンを押したとき、初期の入力画面に戻したいのですが やり方教えてもらえると助かります お願いいたします
>>406 その「クリアボタン」って何?
コマンドボタンかなんかですか?
「初期の入力画面」てのも
どういう状態が初期なのか分かりません。
もう少し詳しく説明してください。
>>407 失礼しました。
自分でボタンを作って、そのボタンを押すと、テキストボックス1番から6番に入ってるテキスト情報を削除し、
尚且つ、チェックボックスでチェックが入ってる場合、それをチェックなしの状態にしたいと思ったんですが。
やり方がわからないのでアドバイスいただけると幸いです。
409 :
デフォルトの名無しさん :2012/10/04(木) 21:40:34.57
'ファイルを開く Workbooks.Open "C:\aaa" 'あああシートを選択する Sheets("あああ").Select こういう処理があるのですが どうもファイルをオープンする前にシートを選択する処理が走っていて 当然まだファイルが開く前だからそんなものは無いって言われて 落ちてしまいます 確実にファイルが開いてから次の処理に進ませるために これって対応する場合どういうのがいいのでしょうか?
>>408 Private Sub CommandButton1_Click()
TextBox1.Text = ""
TextBox2.Text = ""
TextBox3.Text = ""
TextBox4.Text = ""
TextBox5.Text = ""
TextBox6.Text = ""
CheckBox1.Value = False
CheckBox2.Value = False
End Sub
411 :
デフォルトの名無しさん :2012/10/04(木) 21:54:00.02
>>410 そうじゃなくて、for i=1 to 6みたいな使って行を減らしたいの
>>411 Private Sub CommandButton1_Click()
For Each c In Controls
If Left(c.Name, 7) = "TextBox" Then c.Text = ""
If Left(c.Name, 8) = "CheckBox" Then c.Value = False
Next
End Sub
>>411 たった2個じゃ一行も減らない
Private Sub CommandButton1_Click()
For i = 1 To 6
Controls("TextBox" & i).Text = ""
Next
End Sub
こういうのって、思い付いたときは良さげに見えるけど、 実際書いてみたら何か読み辛いなあ、で結局元のコードに戻す。 未だにこのパターンで時間を無駄にしてしまう事があるなw
コピペしたらエラー出た テキストボックスのクリアは出来た。ひとまずありがとう。でも CheckBox1.Value = False CheckBox2.Value = False これなんか違うmちあい。Valueじゃないってエラーメッセージが出る。下の2つがチェックボックス1と2なんだけど もしかしてバージョン違うのかな? Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged End Sub Private Sub CheckBox2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox2.CheckedChanged End Sub
417 :
デフォルトの名無しさん :2012/10/04(木) 23:17:46.41
sp = split("aaa,bbb,ccc",",") これで分割されてspの中に配列としてaaa、bbb,cccが入れられるのですが sp = split("aaa,bbb,ccc",",") sp = split("eee,fff,ggg",",") みたいに一回目に分割させた配列の中に2回目に分割した内容を 追記するような方法ってあるのでしょうか?
繋いでから纏めて分割したら良いんじゃね?
>>417 str = "aaa,bbb,ccc" & "," & "eee,fff,ggg")
sp = split(str , ",")
420 :
デフォルトの名無しさん :2012/10/05(金) 22:35:49.44
array = Range("A1:C10000) だとRengeの内容がarrayに格納されるのですが メソッド化して、arrayという変数を引数にして使いたい場合 call aaa(array) funcion aaa(s1 As Object) s1 = Range("A1:C10000) end function だとうまくいきません ご教授ください
>>420 そもそも値を返さないならfunctionである必要がない
422 :
デフォルトの名無しさん :2012/10/05(金) 22:49:23.11
Variant
適当に書いてみる Sub aaa(ByRef s1) s1 = Range("A1:C10000") End Sub
424 :
デフォルトの名無しさん :2012/10/06(土) 01:32:05.42
Excel VBAを使って体脂肪率を下げたいのですが、どのような コードを書いたら下がりますか?いい解決方法を教えてください。
>>424 連休中に水しか飲まずにコーディングすれば下がると思うよ
ブラック企業に入って何日も家に帰らずにプログラム書く
>424が体脂肪計に乗ったときだけ分岐して、A=A*0.8で8割に見せる。
設置したテキストボックスに情報を貼り付ける作業をしてるんですが 最後にたまに半角スペースが入っちゃうことがあって 最後の半角スペースをトリミングする方法ってありますか?
429 :
デフォルトの名無しさん :2012/10/08(月) 12:53:25.37
431 :
デフォルトの名無しさん :2012/10/08(月) 22:46:03.15
textbox1.text.trim() これでいい?
ほんとに半角スペースかそれ改行コードとかじゃないの
433 :
桃白白 :2012/10/09(火) 08:07:03.29
__ //:\ / /::::::::\ / /:::::::::::::::\ / . /:::::::::::::::::::::::\ / /::::::::::::::::::::::::::::::::\ / . /:::::::::::::::::::::::::::::::::::::::::\ / /:::::::::::::::::::::::::::::::::::::::::::::::::\ ____ / /:::::::::::::::::::::::::::::::::::::::::::::::::: / ― -\ . /::::::::::::::::::::::::::::::::::::::::::::::::: / (●) (●) 暇だお /::::::::::::::::::::::::::::::::::::::::::::::: / (__人__) \ /::::::::::::::::::::::::::::::::::::::::::::::::: | ` ⌒´ | . /::::::::::::::::::::::::::::::::::::::::::::::::::::: \ / ノ \ /´ ヽ r──| l \ / ̄ ̄ ̄ヽ -一''''''"~~``'ー--、 -一'''''''ー-、. /  ̄ ̄  ̄ ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
ユーザー関数で自身のセルの背景色を変更させたいのですが、 上手く出来ません。(文字色なら変更できた) どなたか、ヒントを頂けないでしょうか? Function Test() Dim MyCell As String MyCell = Application.ThisCell.Address(False, False, xlA1) Range(MyCell).Interior.ColorIndex = 3 ' Range(MyCell).Font.ColorIndex = 3 Test = MyCell End Function
Excelのセルを正方形にして100x100のマスの迷路をつくりたいのですが スタートと出口をそれぞれ左上、右下にし、 必ず出口に行けるルートは一つだけで、 その他は壁をつくり、その壁は罫線で表したいです。 こういうプログラムをつくるにあたり、アルゴリズムはどうすればいいでしょうか? できるだけくわしく教えてください
437 :
434 :2012/10/09(火) 13:01:09.36
なんてこった、そもそも無理なのか。 さんざん頭を悩ませたのに…… ありがとう、おかげで諦めがついたよ
条件付き書式とかでなんとかならない?
普通にVBA走らせたらええやん SelectionChangeとかで
440 :
434 :2012/10/09(火) 14:45:56.12
おおこれは便利そうなコマンドだ、SelectionChange。 知らんかったわ。 ただ、VBA初心者な自分には説明眺めても使い方がチンプンカンプンなので、 勉強しなおしてきます。 サンクスです。
441 :
デフォルトの名無しさん :2012/10/09(火) 19:30:59.40
s2 = Range("A4", "B100") Range("C4", "D100") = s2 配列を使って、これでA4:B100のデータをC4:D100にコピペできますが 元の文字が赤とかセルの色が黄色とかは引き継ぎません これを書式を含めて完全な状態でコピーしたい場合どうすればいいのでしょうあ?
>>442 コピーペーストではそれで可能だが
配列の代入では使えないのでは?
444 :
デフォルトの名無しさん :2012/10/09(火) 21:34:27.37
>>441 Variant変数を用いる手法ではセルの値だけしか受け渡しされない。
だから書式なども含めてコピーしたいときにはこの方法は使えない。
事務処理改善でエクセルを使うようになり最近エクセルの虜状態です。 レベルはど素人並ですが、頑張ってみたいプログラムを書いてみようと思い質問させていただきます。 まず1〜5のブックに A1に入力された日付のデータを A2〜C6に落とす というボタン(A)が組まれています 日付入力はブック毎に手入力だったのですが、 新規ブック(以下Aブック)を作りそこに連動して一括で日付変更できるまでは行きました。 (スライムを倒した程度のレベルです) 次に 同じようにボタン(A)もブック毎に押してデータを落としていたのですが Aブックにボタンを設置し、そのボタンを押せば1〜5のブックのボタンが一発で押されるようにしたいです。 いろいろ調べては見ましたが知恵足らずで手詰まり状態です。 よろしくお願いします
>>445 落とすって意味が理解できないけど
他のブックのマクロを実行したいってこと?ならそれでググれば答えが見つかる
>>446 ありがとうございます。
試しにやってみたところ「オブジェクトが必要です」みたいなエラーが出ました
Book1のAを実行すればBook2のBが実行されるが狙いで
書いた内容は
Book1に
Sub A()
Application.Run "Book2!B"
End Sub
です
追伸追記です 現在Book1でA実行すればBook2のBがBook1で実行される状態です 狙いとしてはBook2のBをBook1のAで実行です VBA謎すぎて熱が出そうです・・・
連レス失礼します 何とか出来ました。
>>435 この問題て良く使われるん?
なんかあちこちで見た覚えが
>>450 フカシギの数え方という元ネタから動画サイトなどでかなり有名になった。
ほのぼのと思いきや、シリアスな内容が入ってたりとか。
>>450 PC-8001mkIIのデモプログラムにも入っていたのを思い出した。
数当てゲームのような、伝統的な練習問題になってるんだろうな。
予算は?
ゲームそのものを作るより 解答するプログラムが良いな
456 :
デフォルトの名無しさん :2012/10/10(水) 11:51:51.66
>>453 YouTubeは変わったのか?
実にみにくい。
画面が小さすぎるままか、最大化にするか、どちらかしかないから
小さいのは見にくいし、最大化にすると他のWindow見たり他の作業ができない。
実に困る。
>>453 すでにある
「マスターマインド」でぐぐれ
458 :
桃白白 :2012/10/10(水) 12:36:45.47
>>457 ふむふむ、なるほどね、こんな作りになってるわけか、あ、マンコでぐぐってた
Excel VBAの課題でタイマーを作成したのですが上手に動きません どなたかヒントをお願いできないでしょうか?お願いいたします Sub タイマー() endtime = Timer + Range("C1") * 60 + Range("E1") Do pt = Timer Range("C1") = (endtime - pt) \ 60 Range("E1") = (endtime - pt) Mod 60 Loop Until endtimes - pt <= 0 MsgBox "時間切れです" End Sub
462 :
桃白白 :2012/10/11(木) 18:00:23.45
>>461 | Loop Until endtimes - pt <= 0
Loop Until endtime - pt <= 0
>>461 ちなみに、そのやり方はビジーループと言って、どのプログラミング言語でもやってはいけない方法。
VBAでタイマーを使いたいなら、Application.OnTimeを使うべし。
>>461 ヒント1 「シリアル値」
ヒント2 「Option Explicit」
ヒント3 「DoEvents」
Option Explicit
Sub タイマー()
Dim endtime, pt
endtime = Time * 86400 + Range("C1") * 60 + Range("E1")
Do
pt = Time * 86400
Range("C1") = (endtime - pt) \ 60
Range("E1") = (endtime - pt) Mod 60
DoEvents
Loop Until endtime - pt <= 0
MsgBox "時間切れです"
End Sub
>>463 よく見ろ
途中経過をセルに出したいんだよ
あとOnTimeだと秒以下が切り捨てられる
>>462-465 おかげで解決しましたありがとうございます
お手を煩わせてしまいまして申し訳ありません
ど素人質問ですみません As string*16とかの *16ってどういう意味ですか? ググッてみたけど全文英語とかでわかりません;;
↑ですが連レス失礼します *16=16文字までってことでおkですか?
>>467 質問内容中の「As string」でググったら答えがヒットするんだけど
一体どんなワードでググってるの?
>>468 ○ 16文字
× 16文字まで
16文字以外の文字列は入れることができない
短い文字列には自動的にスペースが足されて16文字になる
長いと勝手に切り捨てられる
>>467 16文字の固定長文字列
16文字までじゃなくて、常に16文字の文字列
>>470 >>471 わかり易い説明感謝します!
>>469 As string*でググってました・・・
ほんとど素人で恥ずかしいです
i=とかも良くわからなくて@@
さらに質問なんですが
"12/"&Format(Cells(3,"A").Value,"00")&"/"&Format(Cells(3,"B").Value,"00"
これがあったとして
日付だけB3に入れたい時ってFormat(Cells(3,"B").Value,"00"ここだけ残せばいいんでしょうか?
まず自分で試してみてから聞きましょう w
>>465 > 途中経過をセルに出したいんだよ
OnTimeでも出せるよ。
> あとOnTimeだと秒以下が切り捨てられる
そんな厳密なタイマー使いたいなら、別の方法をとった方がいいね。
ビジーループは糞。
475 :
デフォルトの名無しさん :2012/10/12(金) 11:59:45.98
AdvancedFilterを使うと、文字列で後ろにあたかも*(オールマイティ)がついた状態でFilterがかかってしまうんですが これを防ぐ良い方法はありませんかな?
476 :
デフォルトの名無しさん :2012/10/12(金) 12:09:26.41
「排他制御」についてご紹介します。
477 :
デフォルトの名無しさん :2012/10/12(金) 12:15:09.66
478 :
デフォルトの名無しさん :2012/10/12(金) 12:24:55.60
この言語の実装にはフォントを設定する必要があり、可読性の低さもあって普及には至らなかった。
>>475 そんな動きしないけど、具体的にどんなデータとどんなコードで発生するの?
480 :
デフォルトの名無しさん :2012/10/12(金) 17:41:04.54
>>479 [データ]
項目1
うんこ
しっち
ちんこ
まんこ
うんこカレー
[抽出条件]
項目1
うんこ
[結果]
うんこ
うんこカレー
variant変数にデータを格納するときに特定の文字を除いて格納したい場合。 A1:A100までを配列に格納、ただしその中で「AAA」という文字は格納しない ってやりたいですが。
>461 配列にまとめて格納した後、 配列を全検索して「AAA」以外を別の配列に 入れなおせばいい。 もしくはfilter関数を使えば 指定された文字列を除いた配列が得られる。
select caseの条件分岐でORは , でできるが ANDはどうやるんですか? ググってもORしか出てこない(´・ω・`)
485 :
デフォルトの名無しさん :2012/10/13(土) 01:08:09.18
487 :
桃白白 :2012/10/13(土) 01:48:33.04
>>483 桃白白ならこう書くけど?
Dim num1 As Long
Dim num2 As Long
num1 = 1
num2 = 2
Select Case num1
Case 1
Select Case num2
Case 2
MsgBox "たおぱいぱい"
End Select
End Select
489 :
桃白白 :2012/10/13(土) 02:17:40.68
>>488 いいえ、無職でVBAを使用してない桃白白です
>>489 使用してないのにそこまで書けるのですか?
すごいです・・・
491 :
桃白白 :2012/10/13(土) 02:26:58.69
>>490 はい、桃白白はすごいです、こんごともよろしくお願いします
>483 select case で判定する変数は1つだからandは必要ないと思うよ。 比較するものが2つ以上ないとandは意味ないよね?
>>492 Select Case True って使い方知ってるか?
Select Case True Case (VarType(var) = vbString And var = "123") MsgBox "String-123" End Select ElseIfまんどくせな人には良いのかもしれんね。
495 :
483 :2012/10/13(土) 07:54:53.42
>>485 どういうふうにANDを付けるの想像できませんでした
>>486 A1セルに「あ、い」のいずれかが最初にあり
さらに「う」が最後に入ってる時に処理をしたいみたいな感じです
Option Explicit
Sub a()
Select Case Left(Range("A1"), 1)
Case "あ", "い": If Right(Range("A1"), 1) = "う" Then Range("A2") = 1
End Select
End Sub
こういうふうになるのはわかるのですが
こんな条件ならまとめて一つの条件にできないかなと思いまして質問させていただきました
先生方、Web連携や外部ファイルや外部アプリ連携が勉強できる本でお勧めなのありませんか?
>>495 Select Case (Left(Range("A1"), 1) & Right(Range("A1"), 1))
Case "あう", "いう"
Range("A2") = 1
End Select
499 :
483 :2012/10/13(土) 11:03:44.06
>>498 ANDを&で出来るなんて知りませんでしたありがとうございます
&って文字列くっつけるだけかと思っていました
>>493 知らなかった。勉強になったよ。
他人のソース見ることが多いんだけど、その書き方はif文に直したい。
変数の名前について質問です。 For n1 = 1 To 4 For n2 = 1 To 4 For n3 = 1 To 4 ・ ・ といった形で変数nxそれぞれでフォーループをまわし、 AAA = n1 & n2 & n3 & n4 & n5 ・・・ にて 11111・・・11 11111・・・12 11111・・・13 11111・・・14 11111・・・21 といったx文字の数字を総当りで取るイメージな物を必要としているのですが、 例えばその桁が100であったり50であったり、任意の値によって For n1 = 1 To 4 For n2 = 1 To 4 For n3 = 1 To 4 ・ ・ For n100 = 1 To 4 もしくは For n50 = 1 To 4 のように、For loopで使うnxの変数も指定したいのですが どうすればいいでしょうか? For 桁 = 1 to 100 For n & 桁 = 1 to 4 next 桁 見たいな事ができればいいのですが。
504 :
503 :2012/10/13(土) 12:47:49.91
ちなみに少し上に出てたフカシギの数え方を勉強のため作ろうと思ったのですが、 自分の知識が足りず、升目の数によって大量のFor loopを書き、 升目分だけsubを作成していく事しかでき無かったためです。 質問している側がエスパーを要するような内容と感じてしまう内容で申し訳ないです。
506 :
503 :2012/10/13(土) 17:00:58.75
>>505 解決するかどうかは、わたしが聞いておるのだ
507 :
デフォルトの名無しさん :2012/10/13(土) 17:29:09.05
初歩的な質問ですが、お答えください。 指定した一つのセルの数値を返す場合はINDEXを使えば良いんですか?
>>507 indexはセルを指定するために必要なものであって
数値を返すためのものじゃない
>>508 なるほど・・・
わかりやすくいうと
i = ("d4")といった形でiに数値を代入したいのです。
教えていただけないでしょうか?
>>509 i = 0
with thisworkbook.worksheets("sheet1")
if isnumeric(.range("d1")) then
i = .range("d1")
end if
end with
>>510 ありがとうございます。
ということは、そのままそっくり代入できる関数は無いということみたいですね。
精進します。
512 :
511 :2012/10/13(土) 19:19:21.73
ごめんなさい、自己解決しました。 i = Range("d4").Value で良かったみたいです。 難しく考えすぎてました。
マクロを実行するとあるシートのA列に書いている内容を上から下まですべて iCloudのメモ帳と同期化させたいのですが こんなのって可能でしょうか? もちろんネット接続している状態です
天プレ読んで出直して来い
可能
>>516 >>1 >★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)
現在選択しているセルの取得する場合、 どうすればいいのでしょうか? たとえばA4:J3の場合はrange("A4:J3").valueみたいな感じで
やりたいこと A1からA10まで連続でネットのURLリンクがある場合 それをまとめてリンク先のホームページを開く ですが マクロ記録でそれをやってもセルがselectされるだけでリンク押下まではしてくれません。 教えて下しあ
523 :
デフォルトの名無しさん :2012/10/19(金) 03:15:26.49
VBAのIF文の条件で、日付の比較をさせたいのですが、 If Worksheets("Sheet1").Cells(row, 1) < DATE(2010,07,01) Then〜 という記述では認識されません。 どのように記述すれば良いか、アドバイスをお願いいたします。
>>523 If Cells(r, 1) < DateValue("2010/07/01") Then
RowとDateは予約されているので変数名などに使わない方がいい
525 :
桃白白 :2012/10/20(土) 09:56:57.73
みなさんこんにちは、桃白白です。
選択範囲をhtmlのtableタグに変換したいのですが結合セルの
処理の仕方がわかりません。
http://uploda.cc/img/img5081f58e1bb33.png 画像のように選択したセルから
<table>
<tr><td colspan="2">1</td><td rowspan="2">2</td></tr>
<tr><td>3</td><td>4</td></tr>
</table>
このような文字列を作りたいです。どうやったらいいですか、教えてください。
桃白白困ってます、教えてくださいお願いします。
vba cells 結合 検出 でググれば
527 :
桃白白 :2012/10/20(土) 21:22:54.05
>>526 なんか冷たくない?結婚生活送ってて最近ご無沙汰じゃない?って嫁に聞いたら
風俗行ってくれば?と言われたような、どうしてもっていうんならあたしが
マットプレイしてあげてもいいけど?と言ってくれるかわいい嫁が欲しいです。
桃白白はそういう結婚生活を送りたいです。桃白白はいまそういう心境です。
vba cells 結合 検出でググったらMergeCellsとMergeAreaを使っちゃいな的な
ページがありましたのでMergeCellsとMergeAreaを使ってみちゃいたいと思います。ありがとうございます。
528 :
デフォルトの名無しさん :2012/10/20(土) 22:36:13.28
>>527 Excelどーなったの?
2000だったらあまってるのあげてもいーけどw
529 :
526 :2012/10/20(土) 22:51:03.49
>>527 なんだかんだいってお礼はしてくれるのね・・(笑)
そういうのを仕事でつくった(htmlじゃなくってCのTableに変換)事あるんだけど、
4年位前だったんで忘れてたのでググる為の検索Keyを言っただけ。
ちなみに最近はVC++であるデータをhtlmのTableに落とすのを作っています。
530 :
桃白白 :2012/10/20(土) 22:56:32.77
使ってる変数にどんな名前つけますか? カウンタのcとか、boolでfとか、IE だからobjieとかはなんとなく使うけど、モジュール内がややこしくなってくると、 わけわからんどうしよう..って感じになってくる\(^o^)/ とくにグローバル変数も使う時とかどうしよ... センスある命名おしえて下さい。
名前長をケチらない。意味不になる位なら日本語名を付けてしまえ。 自分はこんな感じでやってる。
迷うときは日本語で良いんだよ
おっとかぶた。
確かにその方がいいかもしれない、コメントとかはバリバリ日本語で書くくせに、コードの記述は、日本語入れると動作に悪影響かも...とか考えて頑なにアルファベット使ってるとか俺あほや。\(^o^)/ でも変数名とか上手く使いこなすと上級者っぽいじゃんw なるほどInt の C か...(キリッ!) みたいな。
4文字熟語とかを変数に使うと上級者っぽいぞ。 上級のベクトルが一致してるかは知らんが。 驚天動地 = 国士無双 + 神出鬼没 中二っぽくてよい。
自分だけが読める感ですかね、よくないと思いつつ、その気持ちわかります/// 私用のexcelベースのアプリ作ってるんだけど、アプリ名なんか中二すぎて人に言えない///
エクセルのバージョン変わったときだったかな、 変数名がセルのアドレスとイコールでエラー出たことあったけど、 どこにも情報出てなくて、またメッセージも皆目掴めずで困ったときあったなぁ。 確かアルファべット3文字+数字みたいな変数名を旧バージョンで使ってて、 バージョンアップ後、エクセルの仕様で列数変わって セル範囲内になっちゃってエラーになった。とかだったかな。
そんな事があるんですね、覚えとこう。 常用してる変数名だと置き換え作業だけで発狂しそう../(^o^)\ 変数名って手ぐせと同じで、使いぐせついちゃいません?
ここはお前の日記帳か?
続きはチラ裏でやりますw レス下さった方、参考になりました。 ありがとうございます。
>>532 日本人は英語に弱い人が多いから
特に他人に公開するソースで意味のわからない英語、
タイプしづらい英語を使うとよろしくない。
この前どっかで見たソースで、added_dataみたいな変数名を見かけたが
dが大杉でタイプミスしまくりでお話にならなかった。
ad_dataくらいでいいだろうよ。
544 :
デフォルトの名無しさん :2012/10/22(月) 04:43:36.38
キーボードに弱いんですねw そんなんコード補完つかうでしょ
>543の言いたい事はわかるが、>543の内容だけを見ると >543の頭が弱くてお話にならない感じだな。
541=544=545
一応MSにガイドラインというかこうするとイインジャネ?みたいなの有るよ 型3文字+内容を端的に表した単語、みたいな。 文字列ならstrTitleとか数値ならintCountてな感じで MSのサンプルコードは大概そんな感じになってる
ハンガリアン記法ってやつでしょ
549 :
337 :2012/10/23(火) 21:27:55.23
質問です。 下記コードを実行すると応答停止してしまい強制終了させています。 10000を5000に変更すると数分で終わります。 画像は3KB程度です。画像を取り込む数に限界とかあるのでしょうか? Sub gif10000() Dim gif10000 As Worksheet i = 1 Do While i <= 10000 With ActiveSheet.Pictures.Insert(Filename:="C:\TESTgif\bear.gif") .Name = i .Top = Rows(i).Top .Left = Columns(1).Left End With i = i + 1 If i Mod 10 = 0 Then Debug.Print i & "行目" Loop Rows("1:" & i).RowHeight = 60 End Sub
>>549 限界については明文化されてないと思うけど、
ワークシートに大量のオブジェクト(画像など)を貼るとフリーズするのはまれによくある
64bit版だと多少はマシになる
551 :
337 :2012/10/23(火) 22:45:54.31
明日DoEventsで確認しみます。
>>549 仕様や制限についてはMSのサポートに聞かないとわかんないよ
553 :
デフォルトの名無しさん :2012/10/24(水) 19:43:47.20
指定のセルに日本語(アルファベット以外)があるかどうかを取得したい場合 そういったのって可能でしょうか?
554 :
デフォルトの名無しさん :2012/10/24(水) 19:49:00.10
すみませんもう一つ質問ですが s = range("A1:B10").select でその範囲の内容を配列に入れれますが ただしA1:B10の中でA列が赤文字以外の場合のみってしたい場合 つまり一回全選択して、この行とこの行は除くみたいな感じです それとも一行ずつ見て行区方法しかないのでしょうか? というのも対象範囲が1万行ぐらいの場合ではじく行が3行程度の場合 スピードを考えると上記のほうがいいのかなと
せ・・・・性器表現?
558 :
デフォルトの名無しさん :2012/10/24(水) 21:09:24.61
>>553 はわかりました
554は可能でしょうか?
そんなおもしろ関数を作ればいいんじゃないでしょうか?
>>554 スピードを考えるなら実行すればいいじゃん。
あおりとかじゃなくて、普通にその質問レス書く間で
両方実行してどっちが早いか見るだけでは?
ちなみに前者も、除く行を一個一個探す必要があると思うが・・
>>558 スピードが重要ならスピードを重視すればいいと思うけど?
可能でしょうか?って質問がなんなのかよくわからん
質問者って巧い奴とそうでない奴が居るよな (回答を得やすい質問の仕方という意味で)
相手に伝わるように質問できるような人ならハナから自分でググって解決できるよ ここそうじゃない人のためのスレなんだから エスパー能力を試したりラリーを楽しんだりすればいいんだよ
ま、どっちが良いかなとかこれで出来ますか的なやつは 実行環境にも左右されるし、実際にやってみた方が早いし確実
565 :
桃白白 :2012/10/25(木) 13:25:39.49
>>565 パターンを洗い出してそれに当てはめれば?
567 :
桃白白 :2012/10/25(木) 14:13:34.19
>>566 え、わかんなーい、桃白白わかんなーい、もっと詳しく教えて、どうやるの?
桃白白の頭が爆発しそうなんです。
>>565 B5はB3にぶら下がってるけどB6はB1にぶら下がらないんだよね?
文字列を作るルールを第三者に伝わるように説明できないと回答貰うのは難しいと思うよ
まあじゃれてるだけなんだろうけど
569 :
桃白白 :2012/10/25(木) 14:47:09.62
>>568 とにかくさ、階層構造にしたいんだよね、じゃあ逆に聞くけどどうしたらいい?
どういう文字列にしたらいいと思う?
>>569 この階層構造は既存のフォルダ構成をエクセルで作ろうとしてるのかな?
既存のフォルダ構成を階層構造にしたいのであれば、DOSコマンドのtreeコマンドを使う方法があるけど。
因みに俺は
>>568 じゃない。
>>565 考えてみたけど、ルールが絞り込めない…?
列ごとに上から1セルずつ調べてって、文字列が書いてあるセルが
上と下にあったらその間を全部「│」にする、
文字列が書いてあるセルが上にあって右隣にあったら「└」にする、
「└」があるセルの上、及び右隣に文字列が書いてあったら「├」にする、とか
こんな感じでいけるとおもうんだけど。あるいはこういう風な記述の組み合わせで。
必ず「└」を一発ズバリで判定して書かなきゃいけないわけでもない。
最初「└」を入れた(洗い出した)セルを後で(さらに洗い出して)「├」に書き換えてもいい。
それとAとBで処理を別枠にして回して(A1:D2とA3:D8)、あとから
A1、B1の入っている左列だけは別処理で書き換える必要がでてくる?と思った。
実際に組んでないから苦情は受け付けられない!
A1 ├A2 B1 ├B2 │└B3 │ ├B4 │ └B5 └B6 だったらそんなに難しくなさそうだけどなあ
A1 ├A2 B1 └B2 ├B3 │├B4 │B5 B6 が正解では?
ルール通りなら こうだね A1 ├A2 B1 └B2 ├B3 │└B4 │ │ │ B5 B6
>>574 質問者はルールなんて提示してないけど?
文字だけ追ってスクリーンショット見てない人は見た方がいいんじゃない?
Excelの質問でもないし、VBAの質問でもないんだから、いい加減スルーしろアホ共
ぶっちゃけフォルダツリーだってのならこうだよなと思った root ├A1 │└A2 └B1 ├B2 │└B3 │ ├B4 │ └B5 └B6
tree c:\ /f これ気持ちいいよな。 スクリーンセーバー代わりになるくらい。
580 :
デフォルトの名無しさん :2012/10/26(金) 08:40:51.64
初歩的な質問になってしまいますがよろしくお願いします。 どこが間違っているのかも分からないのですが、ここかなと言う部分を観てください。 Dim Posgyou, Posretu (行、列の変数) Dim hantei (判定用の変数) Posgyou = 3: Posretu = 4 hantei = Cells(Posgyou, Posretu) 判定にセル内容を代入 Do If Cells(Posgyou, Posretu) = hantei Then 省略 Else hantei = Cells(Posgyou, Posretu) End If Posgyou = Posgyou + 1 loop (条件は省略) 先ず、hantei = Cells(Posgyou, Posretu)で最初のセル値を代入して、 以下の、DO LOOP中のIF文の実行後に、1行毎処理していきます。 1行毎のセル値がhanteiと一致しなければ、 hantei に新規のセル値を代入するマクロです。 ここで、間違いはありますか? デバッグはスル―なのですが、想定通りの実行結果が得られません。 それとも、他の部分の間違いでしょうか?
罫線をもう1個挟むと見映えが良くなるw ┬root ├┬A1 │└─A2 └┬B1 ├┬B2 │└┬B3 │ ├─B4 │ └─B5 └─B6
582 :
桃白白 :2012/10/26(金) 09:27:38.16
>>580 hanteiが変態に見えて、そんな不純な実装してまともに動くわけがないだろと
風紀委員である桃白白が罵ってしんぜようかと思案していたら違っていた、お母さん・・・
なにをどう想定しているのかわからんから間違っているかはわからんけど、重複除去かなんかか?
D
3 A '処理される
4 A '処理される
5 A '処理される
6 B '処理されない
7 B '処理される
8 C '処理されない
こうなるだろ、hanteiの初期値が違うんじゃね?
Excel2003(11.6560.6568)SP2で、VBAの途中でデバッグかかってとまるようになった ブレークポイントはもちろん設定してない ただ、前に一度ctrl breakでとめたら、その場所記憶したみたいで、なにしてもそこで止まるようになった。エラーじゃない。 他のPC(EXCEL2003だけどSP2じゃない)からだと止まんないでふつうに走る こういう不具合出たことあるひといる?バグなのかな?
584 :
580 :2012/10/26(金) 13:07:55.69
分かりにくくて済みません hantei = Cells(Posgyou, Posretu) シート上のJ3(仮にAとする) 仮に セル値が J3(A) J4(A) J5(B) ここでIF文のElese が実行されhantei にセル値(B)が入るようにしたいのです J6(A) ここでIF文のElese が実行されhantei にセル値(A) DO LOOP中 cellsのPosgyouを1加算していき、J列の値を判定フラグにしたかったのです。
>>584 ステップ実行で各変数の値をウォッチしてみたら?
期待通りに動かない可能性なんて山ほどあるのでエスパーしきれない
586 :
桃白白 :2012/10/26(金) 13:57:01.86
>>584 じゃあ
>>580 は間違ってないんじゃね、列は違うだろうけど。
想定通りじゃなかったというのはどういうこと?どうなったの?
>>580 まず、やりたいことを日本語で書け。
で、何が期待したどうさと違うのかを日本語で書け。
あと「判定フラグ」とかいう、プログラミング用語っぽい単語は使うな。
588 :
580 :2012/10/26(金) 15:30:46.83
色々有難うございます ステップ実行で値をウォッチを言う機能があるのですね。 もうちょっと、自分でも粘って考えてみます。 実はhanteiをフラグにして処理をIFで変化させるVBAにするつもりだったのです。
>>588 > 実はhanteiをフラグにして処理をIFで変化させるVBAにするつもりだったのです。
あのねぇ、これは「手段」と言うの。
目的を書け。
>>580 間違いはありません。あなたのプログラムした通り動きます
それがあなたの希望通りかは、あなたの希望が解らないので判断できません
とりあえず、
Doループ入ってすぐCells(Posgyou, Posretu) の比較してるけど、行も列もそのままだから、必ずThen側実行するぞ?
なんの修飾もなしにCellsつかってるけど、どのシートのセルみてるか解らんぞ
それ以外は概ね>584の動作してるぞ
>>583 ノシ
リアルタイムで出るよ。
7@64bit のマシンで excel2000 2003 ともに出る。
会社PCで作ってなんら問題なく実行できていたものも、
この環境じゃとまったりする。
例えば
msgbox "a"
range("a1").select
これでも時折セレクトでエラーハッスル。
もちろんなんら材料があるわけないので、
エラー(デバッグ応答)時にそのまま続けて実行すると、普通に抜ける。
何回同じマクロを同じ環境でやっても、
出たり出なかったりするんだけど、出るときはかなりの頻度だよね。
まぁ自分も調べに掛かったけど、ヒットしなかったから放置している。
ブレークを解除しろとかよく見つかるけど、してねぇよ。ってな。
ブレークポイントじゃなくてウォッチ式でも入ってるんじゃね
Debug.Assert(0)
win7 32bit 2003です。E1に入った数字によってリストの情報が反映され、 指定範囲の番号に該当する書類を作るような仕組みを作りたく。 しかし無限印刷になってしまいます・・・お助けくださいませ。 Sub 印刷() a = InputBox("開始番号を入力") z = InputBox("終了番号を入力") Do Range("E1") = a a = a + 1 ActiveWindow.SelectedSheets.PrintOut Copies:=1 Loop Until a = z End Sub
>>594 無限印刷ってなに?
一般的な用語使わないと伝わらないよ
とりあえずロジックの問題か印刷の問題かぐらい切り分けしたら?
>>595 開始番号1、終了番号10と入力しても10で終わらずずっと印刷され続けます。
loop関数が無限ループになってしまってるのではと思うのですが解決法が解らず。
597 :
デフォルトの名無しさん :2012/10/26(金) 23:24:26.06
>>594 とりあえず
Sub 印刷() の次に
Dim a As Integer, z As Integer
の1行入れろ
InputBoxにIntegerにならない文字列入れたときは知らん
>>596 ロジックの問題か印刷の問題かぐらい切り分けしたら?
って言ってるのになんでやらないの?
数値の終了条件に=を使うやつは素人。
>>599 お前こそ素人に分かる一般的な用語で説明してやれよw
あの終了条件が数値だと思ってるならもっと素人
>>598 出来ました、有難う御座いました。
小さい会社でマクロのマの字も知らず無茶振りされ、
ネットで探した式もまともに動かず途方にくれておりました。
>>599 すみません、ロジックか印刷かという文面が良く解りませんでした。
印刷の問題はプリンタの会社に電話するものではないのでしょうか。
>>603 もしも今回のような無茶振り?がまだ続くようなら
一回本買って、VBAの勉強した方がいいよ
基礎の基礎の部分からわけわからんままやってるだろ
VBAどころかプログラムの根本が分かってない感じ
605 :
デフォルトの名無しさん :2012/10/27(土) 08:02:55.62
プログラムの根本なら俺が教えてやるから聞きにこいよ
たまに来る程度の無茶振りなら勉強するより聞いた方が効率は良いだろう。 専門外の事だ→勉強しなきゃ の思考回路は社畜に陥りやすい
607 :
桃白白 :2012/10/27(土) 09:15:49.89
みなさんおはようございます、桃白白です。
>>570-579 ,
>>581 ありがとうございます。
root
├A1
│└A2
└B1
├B2
│└B3
│ ├B4
│ └B5
└B6
ご提案いただいたこの形式にしたいと思います。桃白白はこれに決めました。
この文字列を作りたいという強い思いが桃白白の胸にありますが、問題はプログラムだと思います。
それが問題だと桃白白は認識しています。みなさんならどのように実装しますか?教えてください、お願いします。
>>607 これは業者にお金払って開発してもらうレベルの案件。
通りすがりの俺らでは無理。
Rootがセル(1,1)にあるとして、 (2,1)から(B列の最終行-1,1)までの範囲で下に向かってセル一個ずつ選択するループ もし同じ行のB列に文字があったら"├"、なければ"│"を書き込む。 最後に(B列の最終行,1)に"└"を書き込む。 次にB列の最初の文字列(x,2)について、その次の文字列(y,2)を求めて (x+1,3)から(y-1,3)の範囲でA列のときと同じ作業をする。 終わったら(y,2)についても同様の処理。 ってのを順番に繰り返せば良いんでない? 同じ処理の繰り返しになるから再帰処理で書けばコードはだいぶ短くなると思う。
MkDir("A1") MkDir("A1\A2") MkDir("B1") MkDir("B1\B2") MkDir("B1\B2\B3") MkDir("B1\B2\B3\B4") MkDir("B1\B2\B3\B5") MkDir("B1\B6") Set WSH = CreateObject("WScript.Shell") Set wExec = WSH.Exec("%ComSpec% /c tree A1 > tmp.txt")
611 :
桃白白 :2012/10/27(土) 12:45:53.62
>>608 桃白白にお金があれば業者の可愛い女性の担当者にお家に来てもらって、
ところで桃白白さんイケメンですよね、もてるんじゃないですか?いやそんなことないですよ・・・むぎゅ、
みたいな展開も期待したいところだけど、残念ながら桃白白お金ないから無理
皆さんならどのようにとかじゃねぇ もう作れるだろ作ればいい 多少ソースが汚かろうが思い通りに動けばいいだろ
613 :
桃白白 :2012/10/27(土) 12:52:48.84
>>612 え、できなーい、桃白白できなーい、できるだけきれいなソースがいいな、教えて?
614 :
デフォルトの名無しさん :2012/10/27(土) 14:46:46.27
ツリー構造でフォルダを出力するのかね それなら以前作ったことあるよ ポイントは、深渡を表すグローバル変数を用意する、当然回帰関数
615 :
デフォルトの名無しさん :2012/10/27(土) 15:01:29.36
>>614 は間違った
グローバル変数じゃない
深渡は呼ぶ側で引渡し、呼ばれた方でインクリメントする
>>611 金なくても自画撮写真くらいうpできるだろ
いずれにしても、セルに配置した文字のツリー表示なんてのを ExcelのVBAでやることに何の意味があるのか不明だし 誰もコードを出さないところから見ても面倒なことは間違いないし この話題はここで終わりとしよう。
>名前:桃白白 この時点でネタ確定なんだからスルーしておけばいい
>>617 超初級の練習問題レベルだし
別に面倒じゃないけど
やる気が起こらない
なにかやる気スイッチ押してくれればやるお
620 :
桃白白 :2012/10/27(土) 15:42:03.09
>>618 心外、桃白白マジ心外。
>>619 (  ̄∇ ̄)σ=σ[]ピンポン!!ピンポン!!ピンポン!!ピンポン!!
>>609 読んだから、桃白白ちゃんと読んだから。
いま桃白白のタマムシ色の脳細胞で考えているところだから。
>610 で答え出てたんだな
excel2003(xp),2010(7)両方で試しましたが駄目でした。 シート2の1,2列をシート1の1.2列にコピーするコードです。 Worksheets("Sheet1").Range(Columns(1), Columns(2)).Value = Worksheets("Sheet2").Range(Columns(1), Columns(2)).Value これの後半のRange(Columns(1), Columns(2))で引っかかるのです。 これがRange("A:B")なら大丈夫なのですが、何がいけないのでしょう。
623 :
桃白白 :2012/10/27(土) 17:44:22.20
>>622 Columnsプロパティはオブジェクトが指定されないときアクティブシートの列を返すんじゃね。
オブジェクトが指定されてないからアクティブシートの列を返してSheet2がアクティブシートじゃないから
列が見当たりませんぜ的なことなんじゃね。
VBAのクラスモジュールで質問があります。 JAVAで言う、ThisやSuperのようなものは無いのでしょうか
無いのです
>>623 分からないんだったら回答すんなよ。
回答するんだったら裏くらい取れよ。
自分の問題さえも解決できないのに、他人の問題に口出しすんな。
話がややこしくなるだけ。
質問している人や質問の内容に対して回答している人に対して大変失礼。
627 :
桃白白 :2012/10/27(土) 18:45:00.84
>>626 反証あるの?ないんだったらお前が黙ってろ。
>>桃白白 反証云々は関係ないんだよ。 質問者に対してこうなんじゃね?っていうこと自体問題が理解できていないこと。 推測なんて意味無いからw 知ったかもいい加減にしとけ。 ようは何も分かってないんでしょwwwww
629 :
桃白白 :2012/10/27(土) 18:59:41.40
>>628 桃白白は回答するのに客観的ソースは必ずしも提示する必要はないと思ってるわけ。
だから思いついたままに回答するわけ。でもお前は裏を取って回答するべきだと思ってるわけだろ。
桃白白が何もわかってないことの根拠がないじゃん。何もわかってないんでしょってお前は桃白白に
聞いちゃってんじゃん。桃白白はそれで問題ないという立場だけれどもお前は違うわけだから
お前は自爆してるだけじゃん。ようはお前は桃白白に嫉妬してるだけだってこと。質問に答えるどころか
桃白白に絡んでるだけじゃん。
>>625 ありがとござます。どこかでMYみたいなものを見たけど違うものだったか
>>桃白白 思いついたまま回答されることほど質問者に対して失礼。 この時点で質問に対してきちんと理解しないで回答してるってこと。 お前に対して凄い迷惑と思うことはあるけど、嫉妬なんてしたことないw だってきちんと回答できてないんだもんwwww お前の回答は百害あって一利なし。
633 :
622 :2012/10/27(土) 19:15:19.85
ご回答ありがとうございます。 確かにアクティブシートを変えると引っかかる所が変わる気がします。 しかしながら、オブジェクトの指定方法というのが分かりません、自分なりにこうではないかと、
634 :
622 :2012/10/27(土) 19:17:23.62
633の続き Dim sheet1 As Worksheet, sheet2 As Worksheet Set sheet1 = Worksheets("Sheet1") Set sheet2 = Worksheets("Sheet2") sheet1.Range(Columns(1), Columns(2)).Value = sheet2.Range(Columns(1), Columns(2)).Value としましたが駄目でした。申し訳ありませんが、オブジェクトの指定方法をいうのを教えて頂けますでしょうか。
635 :
桃白白 :2012/10/27(土) 19:23:56.70
>>632 ひどい、いっとくけど桃白白が傷つかないと思ったら大間違いだからな
すごい迷惑というのを直ちに撤回してもらいたいよ、ああひどい
636 :
桃白白 :2012/10/27(土) 19:31:25.80
>>634 Columnsプロパティを呼ぶときにオブジェクトを指定してみちゃいなよ
sheet1.Range(sheet1.Columns(1), sheet1.Columns(2)).Value = sheet2.Range(sheet2.Columns(1), sheet2.Columns(2)).Value
>>636 Withステートメントくらい使えよボケ!
638 :
622 :2012/10/27(土) 19:41:04.37
>>636 おお、いけました。ありがとうございます。
2日程悩まされていました。
639 :
デフォルトの名無しさん :2012/10/27(土) 20:17:23.98
>>637 >>636 でWith使っても大して意味ない気がする
Sheet1かSheet2のどっちかしか括れないでしょ。
641 :
622 :2012/10/27(土) 21:08:25.81
>>640 に便乗で質問ですが、
withステートメントでまとめようとしても片方しか出来ません。
変数で受け渡して一応出来たのですが、もう少しスマートな方法はあるでしょうか。
642 :
622 :2012/10/27(土) 21:11:33.45
Dim sheet1 As Worksheet, sheet2 As Worksheet Set sheet1 = Worksheets("Sheet1") Set sheet2 = Worksheets("Sheet2") Dim a As Variant With sheet2 a = .Range(.Columns(1), .Columns(2)).Value End With With sheet1 .Range(.Columns(1), .Columns(2)).Value = a End With
>>641-642 質問の趣旨からは外れるけど、
このコードだとむしろ変数sheet1とsheet2のほうがあんまり意味ないね。
Dim a As Variant
With Worksheets("Sheet2")
a = .Range(.Columns(1), .Columns(2)).Value
End With
With Worksheets("Sheet1")
.Range(.Columns(1), .Columns(2)).Value = a
End With
これだけでいける
>>641 Dim sheet1 As Worksheet, sheet2 As Worksheet
Set sheet1 = Worksheets("Sheet1")
Set sheet2 = Worksheets("Sheet2")
sheet1.Columns(1) = sheet2.Columns(1)
sheet1.Columns(2) = sheet2.Columns(2)
こーゆーのはどうだ?
なんなら最後2行をFor Nextでまとめると
行数は増える(たぶん命令実行のコストもかさむ)けど
メンテナンス性は増すかも知れん。
Dim sheet1 As Worksheet, sheet2 As Worksheet
Dim I As Long
Set sheet1 = Worksheets("Sheet1")
Set sheet2 = Worksheets("Sheet2")
For I = 1 to 2
sheet1.Columns(I) = sheet2.Columns(I)
Next I
>>643 と
>>644 のあわせ技で
Dim I As Long
For I = 1 to 2
Worksheets("Sheet1").Columns(I) = Worksheets("Sheet1").Columns(I)
Next I
646 :
645 :2012/10/27(土) 21:42:16.01
こぴぺして修正忘れた・・・orz Dim I As Long For I = 1 to 2 Worksheets("Sheet1").Columns(I) = Worksheets("Sheet2").Columns(I) Next I ですた Worksheets("Sheet1").Columns(1) = Worksheets("Sheet2").Columns(1) Worksheets("Sheet1").Columns(2) = Worksheets("Sheet2").Columns(2) このほうが短いか。スマートじゃないけど。
647 :
デフォルトの名無しさん :2012/10/27(土) 22:00:24.19
このような式を作っても、sub Aの式からcallされる度にpが初期化されます。 Sub A()の前にpの型を宣言すればいいのですが、あんまりスマートになりません。 Sub B()内で宣言をして、値を保持する方法ないですか?(ただしプログラムの実行が終わればpは初期化) Sub A() dim i as long for i = 1 to 100 call B next i End Sub Sub B() dim p as long if p = 0 then elseif p = 1 then else end if p = p + 1 End Sub
648 :
622 :2012/10/27(土) 22:02:01.29
>>643-
>>646 ご回答ありがとうございます。いろいろな書き方がありますね。
微妙に不規則に左右に連続して同じような式を書くことがあります。
649 :
622 :2012/10/27(土) 22:04:05.75
>>648 の続き
sheet1.Range("A1")=sheet2.("B3")
sheet1.Range("C5")=sheet2.("D4")
・・・・
この場合はやはり
>>643 がベストですかね。
そうなると普通に書いた方がいいかなと思ってしまいます。
652 :
643 :2012/10/27(土) 22:28:53.42
>>649 それはむしろ
>>644 のやり方ではなかろうか?
でもって、セル一箇所ずつ指定するなら
Range()よりCells()の形式のほうが便利だと思うよ。
Range("A1")はCells(1,1)だしRange("B3")ならCells(3,2)だから
>>649 のコードは
sheet1.Cells(1,1)=sheet2.Cells(3,2)
sheet1.Cells(5,3)=sheet2.Cells(4,4)
ってなる。
Cells(x,y)みたいに変数が使えるから
Cellsで書いておくといろいろと捗る場合が多いよ。
>>650 それだと再び実行したときにpが100から始まってしまいませんか?
今手元にプログラムがなくて、すぐに確認できないのですが、
たしか試してプログラムが終了しても値が保持された気がします。
654 :
622 :2012/10/27(土) 22:40:05.66
>>652 今までは
with sheet1.
Range("A1")=sheet2.("B3")
Range("C5")=sheet2.("D4")
end with
としていましたが、右の部分もwithでまとめたいなというのが元なのですが、
>>644 の方が良いでしょうか。
>>647 なんでB内で宣言をするようなスマートじゃない方法を採ろうと思うの?
656 :
622 :2012/10/27(土) 22:42:36.50
すいません。 with sheet1. Range("A1")=sheet2.Range("B3") Range("C5")=sheet2.Range("D4") end with ですね。
657 :
643 :2012/10/27(土) 23:04:35.86
>>656 ケアレスミスだと思うけど
>with sheet1.
>Range("A1")=sheet2.Range("B3")
>Range("C5")=sheet2.Range("D4")
>end with
じゃなくて
with sheet1
.Range("A1")=sheet2.Range("B3")
.Range("C5")=sheet2.Range("D4")
end with
ですね("."の位置が違ってる)
この程度のものであればWith使うほどの事もなさそうに思います。
Withってネストできるけど
それはあくまでもより下位のオブジェクトに対してであって、
たとえば
Workbooks("hoge.xlsx").sheets("sheet1").Range("A1")
の時に
With Workbooks("hoge.xlsx")
With .sheets("sheet1")
.Range("A1")
End With
End With
と書くことは可能ですけど、
>>656 みたいなときには
sheet1 と sheet2 の両方を同時に With で指定できないですからあんまり意味ない気がします。
私が
>>643 で書いたのはあの時点のコードではsheet1とsheet2という2つの変数が
あんまり有効に活用されてないってことであって、
>>656 に関してならWorksheetの指定に変数を使うやり方のほうが中途半端にWithを使うより有効だと思います。
658 :
622 :2012/10/27(土) 23:44:27.94
>>657 ありがとうございます。
この例は聞きやすいように短くしたのですが、どちらにしても、右と左を端的にwithでまとめる方法はないという事ですね。
場合によって変数を使っていくようにします。
659 :
643 :2012/10/28(日) 00:09:37.35
>>658 Withでまとめられない場合、変数名を短くするのも有効な手だと思いますよ。
たとえば、
Dim sheet1 As Worksheet
を
Dim sh1 As Worksheet
にすればコードが若干短くできますよね。
あんまり短い変数名だと可読性が下がるんでやりすぎは拙いですけど、
Workbook型ならWBで、Worksheet型ならSH、とか
自分なりの命名則を決めておくと効率が良いです。
(ちなみに私は変数名には大文字使ってます。そのほうがタイプミスが分かりやすいんで)
まぁ、自分ひとりでやる作業じゃないなら職場全体とかプロジェクト全体とかで意思統一を計る必要が有りますけど
そういう職場ならすでに何らかのルールが決められてるでしょうからそれに従うって事で。
>ちなみに私は変数名には大文字使ってます さすがにその個人的ルールは特殊すぎるので公の場で紹介しない方がいいと思う 特に初心者が多いこのスレではなおさら
661 :
桃白白 :2012/10/28(日) 07:55:56.44
>>647 あ、どうもこちら桃白白、Aの終わりに初期化するしかないんじゃね
Sub A()
Dim i As Long
For i = 1 To 100
B
Next
C 0
End Sub
Sub B()
Dim p As Long
p = C(0)
p = p + 1
Debug.Print p
C p
End Sub
Function C(n) As Long
Static s As Long
C = s
s = n
End Function
>>634 そもそも広い範囲ならコピーするのが妥当だがそのスタイルならResize使えば変数は要らん
Sheet1.Cells.Resize(,2).Value = Sheet2.Cells.Resize(,2).Value
広い範囲の配列を代入するのは馬鹿げているが
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, _ Cancel As Boolean) Dim myPic Dim myRange As Range '画像を配置するセル範囲 Dim rX As Double, rY As Double myPic = Application.GetOpenFilename("画像ファイル,*.jpg;*.jpeg;*.gif;*.tif") If VarType(myPic) = vbBoolean Then Exit Sub Set myRange = Target 'このセル範囲に収まるように画像を縮小する Application.ScreenUpdating = False With ActiveSheet.Pictures.Insert(myPic).ShapeRange rX = myRange.Width / .Width rY = myRange.Height / .Height If rX > rY Then .Height = .Height * rY Else .Width = .Width * rX End If .Left = .Left + (myRange.Width - .Width) / 2 '写真を横方向の中央に配置 .Top = .Top + (myRange.Height - .Height) / 2 '写真を縦方向に中央に配置 End With Application.ScreenUpdating = True Cancel = True End Sub こんな感じの写真挿入のマクロがあるのですが、メールでファイル添付するときにマクロを外して送りたいのですが、送る方法ってありますか? 送る際相手方がマクロのないファイルを欲しいそうなので、困っております。もし、マクロを外した場合解除されてしまう時は、他にマクロを使わずに効率的ないい方法はないでしょうか?数百枚の写真を貼り付けるので、いい方法があればお願いします。
>>663 エクスポートするなりして別のファイルとして送ればいい
やはり、マクロを解除してしまうと、画像のサイズも解除されてしまう感じですかー・・
相手方はマクロで実装してある機能そのものが欲しいの? それとも写真が貼り付けられた完成品があればいいの? 前者は無理な注文、後者なら写真貼ってマクロ消して送ればいいだけだし、 一体、何を悩んでるのだろうか。
>>663 関係ないけどそのUIで数百枚の写真を貼り付けるのはものすごく大変そうだな
668 :
桃白白 :2012/10/28(日) 15:29:00.34
>>647 どうしても関数Bでpを宣言しな蹴ればいけないのかな?
提示されたコードを見る限り、関数Aの変数iを関数Bに引数として渡せば済むような気がするけど。
Sub B(ByVal p As Long)
if p = 0 then
elseif p = 1 then
else
end if
End Sub
>>683 マクロの中身の問題というよりは取り扱いの問題だと思う。
・相手がマクロを無効にする設定にする
・写真を貼り付けて完成品にしたファイルからマクロを消して送る。
またはそれを目的にマクロに手を加える。
マクロを記述したSheet1と貼り付ける目的のSheet2を作って、完成後のSheet2だけを
新規Excelファイルとして保存するように作業手順を改めるとか。
・あなたが今与えられている環境があなたの自由に出来るのなら、
Excelテンプレートとしてマクロを記述、必要なファイルを開いた時に
そのマクロが作動するようにする、とかもできるはず。
写真を何枚か貼ってリサイズして作ったシートからマクロを除去しても、
既に貼られてリサイズされてる写真が勝手に大きさが変わるってことは考えにくい。
試してみた?
仕事でファイルを送信する際マクロの使ったものはだめという規則があるらしく、なんとか効率化できないかと思ったのですが、、、 とりあえず、マクロの入ったものはNGだそうで、困ってる形です。 完成品でマクロを貼り付けたシート内を削除したのですが、マクロがある形になってしまいました。
>>671 効率化?何を効率化したいの?
困ってるとか困ってないとかそんな情報役に立たない
ブックに記述されたVBAコードの削除方法が知りたいのかな
わからないならzipとかで圧縮して送っちゃえばいいんじゃね?
マクロの記述が出来るのに削除が出来ないとか、 いくらなんでも釣り針が大きすぎるだろ・・・
>>671 「excelからマクロを削除」でググるとか?
>>671 そういう場合は標準モジュールにマクロを書くのがおすすめ。
その標準モジュールをエクスポート(basファイル)した後に解放すれば、マクロのないブックになる。
再度同じマクロを使いたい場合は、エクスポートしたbasファイルをインポートして使う。
因みに標準モジュールが分からないということならググれ。
おお!ありがとうございます。 マクロを完全に削除することができました。 まだ、本で学んで日が浅く、少しづつ触っているのですがとても助かりました。 今回は助けていただき、ありがとうございました。
質問です。 A1からA50にランダムに"☆"が入っています。ここから☆が入っていないセルを18コ、☆が入っているセルを2コ、計20コのセルを選ぶにはどうすればよいですか? ただし、選ぶセルはどれも行が連続せず、また、☆は少なくとも2コ以上あり、☆が多すぎて☆の入っていないセルが18コ選べない場合は☆を3コ以上選び、必ず計20コのセルを選択するものとします。
678 :
デフォルトの名無しさん :2012/10/29(月) 00:42:02.21
それが何の役に立つの?
>>677 課題かなんか?
☆が入ってないセルを調べて配列Aにいれとく
☆が入っているセルを調べて配列Bにいれとく
配列に入れる直前に特殊条件(行が連続しないとか)に該当するものを入れないようにする
☆の入っているセルを2個、配列Bから選んで抽出
引数Cを用意して最初に20をいれ、抽出するごとに1減算(この時点で18)
☆の入ってないセルを配列Aから選んで抽出
引数Cは抽出するごとに1減算を続ける、変数Cが0になれば終了
引数Cが0に満たなかった場合は、☆の入っているセルを配列Bから選んで抽出
引数Cが0になったら抽出は終了
必要ならrndでランダムな数字をだしてそれに従うようにする
その場合既に選択済みのセルを再度選択しないよう、抽出する時に
配列上から順に全部チェック,も追加。
適当。抽出方法はお任せ。
VBA関係ない、プログラム以前のアルゴリズムの問題 まず2個の☆を選ぶくみ合わせをしらべて、その状態で18個の空白を選択できるか調べないとダメじゃね 全部の星2個選ぶ組み合わせで順次チェックして、それがOKならそれを出力して終了 全部の星2個選ぶ組み合わせで空白18個が不可能ならどうするかは、選択の優先順位考えないとだめだな まあ、星三つでやって、だめなら星4つ....って順次増やすのが妥当か
>>676 個人的にはマクロ用のブックを一つ作る。
使うときはマクロ用のブックを起動。
画像編集用のファイル名、挿入する画像のフォルダ又はファイル名を指定しマクロ実行かな。
basファイルを使うやり方は元のファイルを手で触る必要があるし、マクロの解放忘れとか問題が出そう。
Pivotテーブル内に対する条件付き書式で 「値が表示されているすべてのセル」を指定したいのですが、 VBAで指定する(新たに作成する)方法はあるでしょうか?
>>679 ☆が連続した行に入ってる場合とかどうすればいい?
というか具体的に質問してるわけだし誰か完璧なコード書いてくれないか?
出力は隣の列に増やしてく感じでお願いします
685 :
桃白白 :2012/10/29(月) 17:56:28.29
>>683 完璧な仕様書いてないのに
完璧なコードを出せるわけないじゃない
諦めて自分で作れ
ヒントは出てんだから
そもそも
>>1 ★5にもある通り、ここは丸投げの制作依頼所ではなく
ヒントを貰って自分で書くって人がヒントを貰いに来る場だからな
何度も言うが
>>1 のテンプレは誰かが勝手に作った物で、厳密に守る必要なんかない
元々、答えたいやつ、作りたいやつは勝手にすればいいってスレだから
689 :
デフォルトの名無しさん :2012/10/29(月) 21:47:53.08
アルゴリズムこそブログラミングの醍醐味。 もっと語ろうぜや。
質問スレなんだから、助け合いの場として使えばいいとおもうけどな。 まー仕事とかですぐ使うような人のはすぐ答えてもいい気はする
おれ的には後で除外するのが手っ取り早いと思うが、どうだろう?
692 :
デフォルトの名無しさん :2012/10/29(月) 21:51:00.15
>>689 同意。
あなたはすばらしい。
ところでExcelVBAを使って野球シミュレーションを作りたいのですが
アルゴリズムはどうすればいいですか?
ボールの移動のようなアクション部分は一切排除して、
各選手の能力値(野手なら長打力とかミート力や総力や守備力などなど、投手なら球速や切れやスタミナなどなど)を設定しておき
結果は「ヒット」「三振」「ホームラン」「内野ゴロ」みたいにテキストで出るだけ、というところから始めよう。
677に答えられないからって話を逸らすヤツ…Orz
694 :
692 :2012/10/29(月) 21:54:41.25
とりあえず1リーグ6チームで、「得点力」「防御力」のたった2パラメータのみ存在し、 イニングの点数だけしか表示せず(★) それを1シーズン144試合やって優勝チームを決める、ところからスタートしてもいいかもしれない。 ★とは、単に下のように点数しか表示しない単純なもの。 巨人 0 0 2 1 0 0 3 0 0 6 阪神 0 0 0 0 0 0 0 0 0 0
もちろん自分で叩き台は用意するんだろうな?
みんなーExcelは表計算ソフトだからなー VBAも自ずとExcelの主な使途である事務処理の 支援・自動化のために使うべきものであって ☆を選ぶとか野球シミュレーションとか そんなのなんでExcelでやるんだよって突っ込みたくなる テーマはスレ違いだと思うぞー
>>688 >>1 はスレ主である。
>>1 のテンプレが嫌なら自分でスレくらい立てろ。
テンプレ無視だったらどんな話題でもOKになるというのが分からないみたいだね。
何事にもルールがあってそれが嫌なら自分で作ればいいだけのこと。
スレ立てたとしても、お前みたいなやつがまた沸いてきて
スレを荒らされるのは目に見えてるけどね。
698 :
デフォルトの名無しさん :2012/10/29(月) 22:58:50.96
アルゴリズムは言語関係ないからな それ用のスレがどっかになかったか?
700 :
桃白白 :2012/10/30(火) 08:52:17.84
>>683 ☆が連続した行に入ってるときは片方を読まないようにすればいいと思うけど、
☆が入っているセルが2個、☆が入ってないセルを18個、計20個の組み合わせを1個見つければいいのか?
それとも可能な組み合わせを全部列挙する必要があるのか?
>>696 いや、シミュレーションは事務処理の自動化の醍醐味だろ?
まあ良いんだけどさ嫌いじゃないし
でもここExcelVBAスレだしな。
>>677 だって50*50の配列でってすれば
他言語のスレでも普通に質問できちゃうだろ
そういうのはそういうスレで聞いた方が早いし確実だと思うぜ
Dim FoundCell As Variant Worksheets("temp").Activate i = 2 Do i = i + 1 targetFile = Cells(i, 3) Set FoundCell = Worksheets("全FileList").Range(Cells(2, 2), Cells(lastrow, 2)).Find(What:=targetFile) If FoundCell Is Nothing Then If Right(targetFile, 4) = ".lzh" Then er_cnt = er_cnt + 1 Call S_Output2Text(targetFile, "Excel不一致データ", "append") End If End If Loop Until Cells(i, 1) = "" tempシートのC列にあるファイルリストと事前に集めておいた"全FileList" シートのB列とを比較してチェックしようとしているんですが、 (lastrowには18832という値が入っています(可変ですけど)) Set FoundCell = 〜のところで アプリケーション定義またはオブジェクト定義のエラーです となります。 解決策教えて下さい〜m(__)m
704 :
デフォルトの名無しさん :2012/10/31(水) 22:30:29.30
703です。シートを切り替えて作業したら出来ました。ありがと。
706 :
704 :2012/11/01(木) 10:40:04.62
まぁ解決したならどんな方法でも良いわけだけど、
Cellsオブジェクトの使い方を間違ったのがそもそもの原因なんだから
その辺きちんと把握しておいたほうが今後のためだと思う。
たとえば、
dim R As Range
Sheets(2).Activate
Set R = Sheets(1).Range(Cells(1,1),Cells(2,2))
というコードは
Set R = Sheets(1).Range(Sheets(2).Cells(1,1),Sheets(2).Cells(2,2))
だと解釈されるからエラーになる。
でも、Sheets(2)のセルA1に"A1"とセルB2に"B2"を入力
(別に"F2"と"Y3"とかでも何でも良いし、""も不要)しておいて
こんな風に書くとエラーにならない。
Set R = Sheets(1).Range(Cells(1,1) & ":" & Cells(2,2))
Set R = Sheets(1).Range(Cells(1,1).Value,Cells(2,2).Value)
(どちらも同じ動作をする)
まぁ、Sheets(2)のセル内にA1形式でセルを指定しておかないと結局エラーになるけど。
とにかく、ただ単に"Cells"と書くとActiveシートに対して処理をしてしまうから
常にそれを意識していないとエラーになったり、あるいは意図しない動作になったりする。
で、
>>662 はそういう暗黙のオブジェクト指定を気にせずにすむ書き方。
>>703 のケースだと、
Set FoundCell = Worksheets("全FileList").Cells(2, 2).Resize(lastrow -1).Find(What:=targetFile)
と書くと問題なく動く。
この書き方を覚えておくと色々応用が利いて便利。
>>706 703です。解説ありがとうございます。m(__)m
セオリーの書き方をテンプレに入れればこんな同じような質問がなくなると思う。
>>708 質問する初心者がわざわざテンプレなんて読むわけないだろ
常識で考えろ
>>709 回答者が楽しちゃいかんのか?
「テンプレ嫁」で終わりなんだが。
712 :
704 :2012/11/02(金) 01:26:22.61
こんなのセオリーっていう程のものでもないけど、 全部書いてたらテンプレだけで1000いきそうだよ。
713 :
デフォルトの名無しさん :2012/11/02(金) 18:04:25.33
Dim arr() As String arr = Split(wk, vbCrLf) で配列に改行でsplitした値を格納しましたが この配列の数を取得するにはどうしたらよいでしょうか? arr.Length count(arr) いずれも vba だと認識されません。
714 :
デフォルトの名無しさん :2012/11/02(金) 18:10:46.79
自己解決
715 :
桃白白 :2012/11/02(金) 18:36:07.56
>>713 もしもし桃白白です、桃白白に聞いちゃう? じゃあ桃白白が教えちゃう。
Function Count(a) As Long
Count = UBound(a) - LBound(a) + 1
End Function
716 :
デフォルトの名無しさん :2012/11/02(金) 19:53:32.48
>>715 すみません。
ほわいとぴーちさん
自己可決しました。
可決したのか。それは良かった w
VBAの構文って、古き良きVB6を踏襲しているけど これが今のVB.netのごとく、senderなんたらとか 関数の宣言に意味不明な単語が付くような 極悪仕様に改訂されることは将来あり得るかな? VBAは俺が唯一理解できるコンピュータ言語なので そうなったら会社のシステムをメンテできなくなって 非常に困るのだけど。
>>718 そういうのはこんなところで議論しても全く意味がない。
Microsoftに聞くのが一番。
メンテの話なら前もって会社に伝えておくのがいいと思う。
システムなんて永久に使われるということはないわけだから、
VBAが使えないシステムに切り替えたときに、それ相応にコストがかかると。
そんなこと考えるんであれば、Microsoft Officeなんか使わずOpenOffice.org使えばいい。
無料だから、無駄にお金をつぎ込むわけじゃないしね。
水面下でVBAマクロをOpenOffice.org用に移植しておけば切り替えとかもすんなりいくだろうし。
720 :
桃白白 :2012/11/03(土) 09:55:07.78
>>718 そうなったら桃白白を雇ってくれたらいいじゃん。あまり複雑化したらそれはもう
素人が手を出すようなことじゃなくなっちゃうしさ、プログラム作るのは専門の
会社にまかせて、そのあいだ桃白白がお前とあやとりしてあげるよ。
雇ってやるから ここに電話番号と本名書いて ↓
722 :
桃白白 :2012/11/03(土) 11:19:08.72
>>721 そんなことしたらただでさえイケメンの桃白白がストーカーの被害にあうことは目に
見えているじゃん。やめろやめるんだみちるくん・・・桃白白はそんなんじゃ・・・ん、むぎゅ・・・
てなことになることは明明白白桃白白じゃん。会社名と採用担当部署の連絡先を教えてよ、
桃白白はそこに連絡するからさ。御社には桃白白を採用することができるというメリットを
与えました。桃白白は通り一辺倒の受け答えはさせていただきますが、それが難しいときは・・・
その先は言う必要ないですよね。自分で考えてみてください。
723 :
デフォルトの名無しさん :2012/11/03(土) 14:57:12.76
読み込んだ文字列がセル内に収まりきらなくて切れる時に、セル値を自動で広げることはできますか。 例えばB1にVLOOKUP関数で、A1:A10の範囲から該当する文字列を表示します。 A1:A10の文章の長さはバラバラで、セルの大きさもバラバラなんですが、表示した文章をキレいに表示したいんです。
724 :
桃白白 :2012/11/03(土) 16:05:35.97
>>723 折り返して全体を表示するにしておけばたいてい問題ないだろ、それでいいだろ、じゅうぶんきれいだろ、それでいいよ
>>723 Worksheet_CalculateにAutoFit
726 :
デフォルトの名無しさん :2012/11/03(土) 19:37:03.65
>>724 折り返して全体を表示するにチェックは入れています。
それでも行幅までは変更されません。この行幅まで自動で調整して全文見えるようにしたいのです。
何か良い方法はないでしょうか。
折り返して全体を表示するにチェックしてるからだろ 指定したセル幅で折り返すための機能なんだから用途が逆 つかExcelは表計算ソフトなんだから 文章を綺麗に表示させたいならワードやパワポ使えよ 確かに便利なんだけどさExcel
728 :
デフォルトの名無しさん :2012/11/04(日) 05:46:50.06
>>727 幅じゃなくて高さでした。
作成してるものは計算が主なんでExcelじゃないと駄目なんです。
>>728 この場合、セルに入っている実体は表示データではなく関数だから無理。
高さを広げたい時は、都度手動で行番号の境界をダブルクリックするしかない。
>>727 表示データのLenBを取ってきて所定値との除算結果とCellの高さ基準値を乗算して
調整すればいいじゃん。
もしかしたらもっと簡単な方法があったかもしれないけど忘れた。
んじゃあ行の境界ダブルクリックをマクロでやればいいんじゃねーの
732 :
デフォルトの名無しさん :2012/11/04(日) 19:55:37.21
VB.net になれてると どうしても VBA のコードに違和感を感じてしまう。
お次の方、どうぞ
734 :
デフォルトの名無しさん :2012/11/04(日) 20:48:21.98
>>732 どう違和感を感じるか教えていただけませんか?
わたしはExcelVBAは上級レベルですが、VB.netのことはさっぱりわかりません。
でも今後VB.netを勉強しようと思っています。
735 :
デフォルトの名無しさん :2012/11/04(日) 21:56:38.80
>>734 にている様で文法が微妙に違ってます。
あと、DataTableとかの概念がないのがVBA
VBA上級ってどれぐらいなんだろうか
VBAを組み込んだアプリを作れるレベル。
738 :
デフォルトの名無しさん :2012/11/05(月) 22:09:03.07
セルA1の内容を変数に入れたい場合 仮にそのA1の内容にセル内改行とかあった場合で そのまま変数にも改行情報を維持したい場合 そういうのって可能でしょうか?
739 :
桃白白 :2012/11/05(月) 22:22:53.73
>>738 可能、というか維持されるっしょ問題ないっしょ桃白白そう思うっしょ
740 :
デフォルトの名無しさん :2012/11/05(月) 22:27:01.20
変数に入れると 改行などの初期設定はすべて解除されます つまり A1の内容→変数に格納→B1にペーストすると A1が赤文字や途中で改行とかが入っていてもすべて消えます
741 :
桃白白 :2012/11/05(月) 23:04:07.83
>>740 改行は設定じゃなくて文字だろ、消えないだろ、これでいけるだろ
Dim s As String
s = Range("A1").Value
Range("B1").Value = s
B1のセルの設定が改行しないになってるってオチでしょ 普通に操作してそうなるものは当然マクロでやってもそうなるよ 因みに改行はコードな Windowsだとキャリッジリターン&ラインフィードな vbCrLfでもChr(13)&Chr(10)でも好きなの使え なんでこんなんかってのはプリンタ制御コードの話とかになるから自分で調べてくれ
>>742 セル内の改行コードってラインフィードのみじゃなかったっけ?
744 :
デフォルトの名無しさん :2012/11/06(火) 15:05:43.16
win7 excel2010 です。 複数の画像が縦に並んでいて、シート2からシート1に同じように縦に貼り付けたいです。 マクロで下のような感じなんですが ActiveSheet.Shapes.Range(Array("Picture 16")).Select Selection.Copy Sheets("1").Select Range("C11").Select ActiveSheet.Paste ActiveWindow.SmallScroll Down:=4 Selection.ShapeRange.ScaleWidth 0.5472061447, msoFalse, msoScaleFromTopLeft Selection.ShapeRange.ScaleHeight 0.5472061657, msoFalse, msoScaleFromTopLeft これをRangeではなく、Worksheets(1).Cells(i, 4)みたいにしてやりたいのですが、どのように書けば良いですか? 単純に上のマクロのRangeの部分を、Worksheets(1).Cells(i, 4).Selectみたいにしてもエラーが出ます。
745 :
744 :2012/11/06(火) 16:25:47.29
まだ完全に解決してませんが、自己解決できるっぽいです。
しゃっくりが止まらない・・・・誰か良い方法教えてくれよ まぁ、ワシのバックリはすでに良い方法ですけどね(´・ω・`)b
あ・・・・・誤爆してしまった。
748 :
デフォルトの名無しさん :2012/11/06(火) 23:27:14.15
Dim s As String = String.Empty こーいう宣言がなぜできないのだ? だからVBAは好きになれない。
VBAとしても、君に好かれる事を望んでいないんじゃないかな?
15年近くほぼ放置の言語に、何を今更って感じ。
751 :
デフォルトの名無しさん :2012/11/07(水) 11:56:45.21
753 :
桃白白 :2012/11/08(木) 18:18:13.64
>>748 桃白白ほどのベテランプロフェッショナルになると変数宣言しない
s = ""
これでOK
754 :
デフォルトの名無しさん :2012/11/08(木) 19:26:14.40
>>753 業務でそんな事する奴がいたらすぐ首だよ。
755 :
桃白白 :2012/11/08(木) 19:52:36.85
>>754 おいやめろ、まるで桃白白より文鎮のほうがまだ役に立つみたいなそんなことやめろ。
DimとかAsとかロジックに直接かかわりのないものを排除することによってロジックを際立たせて
さらに最近の風潮としてテストで動作保証しちゃったらいいじゃん的な流れがあるだろ。
つまり桃白白はできるやつってわけ。
Option Explicit
オプション イクスプリシット って単語、覚えづらいよな。
いちいち覚える必要なんて無い 変数の宣言を強制するにチェックを入れておけばいいだけだろ?
質問させてください. 5行2列の範囲を選択してテキストファイルにして保存したいんですが,その際に 1.列と列の間にタブでのスペースがある 2.ファイル名に日付と変数を入れたい 例 mm_dd_名前_k OSはwindows7でexcel2007を使っています 回答して貰えるとうれしいです
>>759 > 5行2列の範囲を選択して
Range.Selectを使う(そもそも選択する必要性があるの?)
>テキストファイルにして保存したい
FreeFile、Open、Write、Closeを使う
>1.列と列の間にタブでのスペースがある
ある?
>2.ファイル名に日付と変数を入れたい 例 mm_dd_名前_k
日付はどこから取得したいの?
変数を入れたいってどういう意味?
タブ区切りにしたいのかタブを取りたいのか別の文字に置き換えたいのか こういう形にしたいって具体例言ってくれた方が早いんでないの
Replace(str,vbTab,"") str = Cells(a,b) & vbTab & Cells(a,b+1) とか?
765 :
桃白白 :2012/11/10(土) 08:41:39.09
/ ̄ ̄ ̄\ / ⌒ ⌒ ヽ ,,, / ( ●)(●) | /⌒_) | (__人__) } ノ ノ おいっすー __. }、. ` ⌒´ 、` / (⌒ |_,,,ノ ""''''''ヽ_ ┌──┐ | | ├──┤ | | ├──┤ | i  ̄\ ./ \_ |/ _ノ \___) ( _/ |_ノ''
csvとして別名保存すれば一発なのになんで難しく考えるんだろう
コーディングスタイルの問題についてですが IF〜ELSEや、FOR〜NEXTなどの 全体でブロックを構成する制御構文は 前後に空行を置いて他のコードと離して書くものですか? 先輩にそうしろと注意されたのですが、行の無駄と思うのですけど。
一概にこうって話じゃ無いけど、C#でStyleCopかけると似たようなこと言われるね 宗教みたいなもんだから職場のルールに合わせておけばいいと思うよ
769 :
桃白白 :2012/11/11(日) 15:12:40.59
>>767 行数を減らせばコードを一覧できる量が増える。空行を入れればコードが
見やすくなる。どちらを選択するかはケースバイケースだけれども、先輩が
空行を入れろと言うんだったら仕方がない。会社で書式をそういうふうに統一
するようになってるんだろ、じゃあそうしたほうがいいだろ、そうするべきだ。
count = 1
For i = 1 To count
ほげらちょ
Next
桃白白ならブロックに関連する処理もひとまとめにしちゃうけど。
宗教wまあそうだなw
>>767 プログラムソースは何百何千行と書くものなんだから
1行や2行の空白行を気にするだけ無駄。
先輩の言うことには黙って従え
>>767 マルチステートメントで極限まで1行に詰め込んでやれ
ここで賛意を得て先輩に得意げに見せようとした
>>767 の意図はこうして崩れ去ったのであった、まる
無駄とかどうとかではなく画一的に作られているのが大事 時代で変わるならまだしも、作った人によって違うとか 後で保守する人が地獄見るからやめような?
777 :
デフォルトの名無しさん :2012/11/12(月) 13:21:27.32
>>767 の先輩はあほです
処理の区切りで空行やコメントを入れるべきであって
>>769 でいうならcount = 1を切り離すべきじゃない
空行がもったいないという理由はおかしい
印刷するなら紙がもったいないと言えるが
そうではなく重要なのはモニタで見る時に、
スカスカのコードだと見えない部分を記憶しなきゃいけないということだ
作った本人は当然知ってるのだから気にしないが
人のプログラムなら、モニタにはみだした部分を記憶する必要がある
記憶しなくたってスクロールすればいいってか?
スクロールして見て、戻ったときに記憶してるではないか
という訳で朝鮮人は皆殺しにする必要があることがお分かり頂けたろうか
>>777 変数countでループの最大値を指定していると言う事は、count = 1はループと切り離しておいても問題ない
変数countが、どういう意図を持っているのかはコメントしておかなければならないと思うけどな
>>769 の変数名のつけ方がアレなんだよね。
変数i →count
変数count →max
が妥当。個人的にはこれでもNGだが。
ループの変数であっても一文字変数はバグの元。
一文字云々より変数名=既存関数名である事が、個人的に受け付けない。 俺ならこうする。 変数i →count → cnt 変数count →max → maxcnt
781 :
桃白白 :2012/11/12(月) 19:22:40.53
>>779 おいやめろ、まるで桃白白が書いたプログラムがバグだらけみたいな、そんなことを
いうんじゃない。グローバル変数や引数はまた別だけどさ、桃白白の経験上ローカル変数は
長くしてもプログラムが見づらいだけの気がするわ。桃白白だったらcountもcntと略したりcに
したりしちゃう。桃白白なら平気でやっちゃう。そのほうが全体のロジックがわかりやすい。
真似してくれてもいいよ?桃白白に倣って今日から心を入れ替える気があるなら桃白白の真似しちゃってもいいよ?
>>777 >人のプログラムなら、モニタにはみだした部分を記憶する必要がある
>記憶しなくたってスクロールすればいいってか?
なら、マルチウィンドウを活用したらいいのに。
まあ、それはそれで不便だが。
結論は776だよな。
まあ、767が書いたコードが再利用されることなく短期間でお蔵入りになる予定なら、
それも保守すら必要とされないような短期利用・一時利用の、767本人以外が触らないようなコードならともかくだ。
職場の、他の人が保守したり再利用したりすることが想定される以上は、
その職場内でコード記述法、基本的書式を統一しとかないとバグの温床になるだろう。
>>779 Forに i j k を使うのは50年以上前から続く伝統(当初は大文字だったけど)
意味がわからないのは単なる勉強不足
世の中にある無数のコードですでに使われてるから今さら否定してもしょうがないし
他人の書いたコードを読むにはこういう知識も必要
逆に i 以外が使ってあると、特別な意味があるのかと思ってしまう
>>779 分からなくなるほど行数のあるループ作るやつはプログラマ辞めてくれ
スコープの狭い変数は短い変数名でOK
ループ変数にiを使うとか常識
I〜Nは暗黙の整数だろ学校で何勉強してきたんだ
786 :
デフォルトの名無しさん :2012/11/12(月) 23:54:19.17
そうか、VBAだとCountもMaxも予約語とかぶらないのか
一文字変数はバグの元(キリッ
VBA使いこなせたら便利なんだろうなあ
その「使いこなす」って表現もいい加減いやなんだけどw、まぁ、使えたら何かにつけて便利ではあるんだろ。用途によっては
For Each i なんて見るとこいつ馬鹿かと思う For i = 1 To ***ならいいんだが
説明ヘタで申し訳ないんですが… シートの一行目に必ず列のタイトルがあるという前提で ColRange(”列タイトル”, myWorkSheet).(消したり切ったり貼ったりその他色々) (数十行似た処理が続く) Private Function ColRange(ByVal 列タイトル As String, ByRef TargetSheet As WorkSheet) As Range Set ColRange = TargetSheet.Colmns(TargetSheet.Rows(1).Find(”列タイトル).Colmn) みたいな感じで、列を取得して処理をかけていくみたいなマクロがあるんですけど、ColRange以下略が長ったらしいので With myWorkSheet .ColRange(”列タイトル”).処理 以下略 End With みたくできないかと思ったんですけど、クラスとかメソッドとか使えばいけるんですかね? ググっても見つけられなかったもんで…
>>793 ColRange()はExcel VBAの機能ではなく、あなたの周りの誰かが作ったユーザ関数。
なので、With ... .ColRange()という使い方はできない。
また、その関数は二つの引数を必要としているので、それを省略することはできない。
ではどう書けば良いかというと、
Set myRange = ColRange(”列タイトル”, myWorkSheet)
myRange.(消したり切ったり貼ったりその他色々)
...
あるいは、
Set myRange = ColRange(”列タイトル”, myWorkSheet)
With myRange
...
End With
>>794 ありがとうございます。
誰かが自作したというのはなんとなくですがわかりました。
で…やっぱり書き方が悪かったと思うんですが、
ColRange(”列タイトルその1”, myWorkSheet).なんか色々処理
ColRange(”列タイトルその2”, myWorkSheet).なんか色々処理
って感じで列タイトルの部分も毎行変わります…
>>795 ColRangeのI/Fが気に入らないならColRangeのラッパーを作るとか
そもそもの理由が「長ったらしい」じゃ説得力がなさすぎて助言しにくい
>>795 なら、シート毎のマクロとして
function myColRange(byval title as string) as range
return colrange(title, thisworksheet)
end function
として(ただし、実行するシート全部にこのマクロが必要)、
myColRange("abc").何か
myColRange("def").何か
とするのがいいかな。
あるいは、クラスを作って、コンストラクタにworksheetを渡して、GetColRange(byref title as string)という
メソッドを作り、呼び出し元では、
set obj = new Hoge(thisworksheet)
obj.ColRange("abc").何か
obj.ColRange("def").何か
とするかのどちらかな。といっても、こっちの方は多分理解できないと思うけど。
>>796-797 なんかほんともう、すいません…
ラッパーというのがどんなものか、ちょっとわかったような気がします。
クラスとかコンストラクタとかの方法が、一番自分がやってみたいことに近いと思うので、これから勉強してみます。
単純に「気に入らない」「やってみたい」でお騒がせしてしまい、申し訳ありませんでした。
800 :
桃白白 :2012/11/14(水) 14:48:37.08
∧ ∧ (*‘ω‘ *) ちんぽっぽ ( ) v v ぼいんっ 川 ( ( ) )
セルA1からZ1まで値が1で かつ C1ではない って条件でループを組みたいのですがうまくいきません If Cells(1, i) = 1 And (Not Cells(1, 3)) Then ここでエラーになります
VBAの練習の為に現在簡単な収支表を作っています。 Worksheets(1)のC列が収入でD列が支出、E列が残高です。金額は2行目から32行目までに打ち込みます。 元々はセルに直接数式を入れていたのですが、それだと誤ってDeleteキー押したときに数式が消えてしまうのでVBAで処理しようと思いました。 VBAの入門書等を参考に書いてみたのですが、思ったように動くコードが書けなく、おかしな所も発見出来なかったのでご教示お願いします。
>>801 If Cells(1, i) = 1 And i <> 3 Then
805 :
802 :2012/11/17(土) 20:18:54.45
長いため分割になってます。すみません。 Sub soukei() With Worksheets(1) Range("C33").Formula = "=SUM(C2:C32)" Range("D33").Formula = "=SUM(D2:D32)" Range("E33").Formula = "=C33-D33" End With End Sub
806 :
802 :2012/11/17(土) 20:21:11.86
コード先頭の空白が消えてますね、済みません。 Sub zandaka1st() With Worksheets(1) Range("E2").Formula = "=IF(AND(C2="",D2=""),"",C2-D2" Range("E3").Formula = "=IF(AND(C3="",D3=""),"",E2+C3-D3" Range("E3:E32").FillDown End With End Sub
>>805 with を使ってるのに、Rangeの前に . (ピリオド) が無いのはなぜ?
808 :
802 :2012/11/17(土) 20:25:07.32
空白が消えるのは仕様の様ですね。空白の代わりに…を入れる事にします Sub zandaka2nd() … With Worksheets(1) ……If Range("C2,D2") <> "" Then ………Range("E2").Formula = "C2-D2" ……End If …Dim cnt As Long ……For cnt = 3 To 32 ………If Cells(cnt, 3) <> "" Then …………If Cells(cnt, 4) <> "" Then ……………Cells(cnt, 5) = Cells(cnt - 1, 5) + Cells(cnt, 3) - Cells(cnt, 4) …………End If ………End If ……Next cnt …End With End Sub
809 :
802 :2012/11/17(土) 20:27:48.37
OSはWindows7 Home Premiumの64bitで、Excelは2007です。長文すみません。
810 :
802 :2012/11/17(土) 20:34:14.74
済みません、ピリオドはこちらに書いた時に落としてました。実際には入ってます。 また、OSはWindows 7 Home Premium 64bitの Service Pack 1でした。Excelは2007で間違いありません。
>>810 ……If Range("C2,D2") <> "" Then
これはなんだろう?
この表記だと"D2"セルの値は判定に影響しないよ。
あと、結果が思ったように行かないのであれば具体的にどのセルの出力結果が
思ったのとどのように違うのか教えて。
813 :
802 :2012/11/17(土) 20:55:37.41
結果としては、E2に計算結果である残高が入ればよいのですが、現状では空白になります。
>>813 E2セルに着目すると、
[
>>811 ]の判定がおかしいのと、
………Range("E2").Formula = "C2-D2"
「=」を忘れてる
815 :
802 :2012/11/17(土) 21:08:22.48
表の一番上なので前日の残高がないためループには入れていません。 C2とD2の両方が空白の時はE2は空白にし、そうでないときはC2からD2を引き、E2に残高を入れる。としたかったのです。
>>815 >C2とD2の両方が空白の時
これを実現する判定文は
If Range("C2") <> "" and Range("D2") <> "" Then
817 :
802 :2012/11/17(土) 21:42:19.18
ありがとうございます。 そのような書き方が正しいのですね。イコールを直し、Ifも直してやってみたら、 C2とD2両方に値がある時、E2に式"C2-D2"が入り、E2に計算結果が出るようにはなりました。 ですが、E3からE32の間ではC3とD3両方に値が入っている時、コードを実行すれば計算結果はちゃんとE3に出るのですが、 その状態でC3やD3の値を変えても、残高であるE3には即時に反映はされず、そのままです。 コードを実行すると変更後の値で再計算されるのですが、これをC3やD3の値を変えた直後に再計算されるようにはできないのでしょうか。 何故かE2ではC2やD2を変えた直後に自動で再計算されE2に反映されます。
818 :
802 :2012/11/17(土) 21:51:16.81
あーミスタイプありますね済みません。式"C2-D2"ではなく式"=C2-D2"ですね。
それと、E3以降E32までですが、C3とD3に値を入れただけだと計算されずコードを実行するまでE3は空白のままななのですが、
これをC3とD3両方に値を入れた直後に計算させる事は出来ないのでしょうか。これが解決できれば
>>817 のも解決できると思ったのですが。
VBAより先にEXCELそのものをもっと勉強した方がいいんじゃね
>>802 Deleteキー押したときに数式が消えてしまうのを防ぎたいなら保護すればいいんじゃないの?
目的と手段がごっちゃになってない?
>>801 If Cells(1, i).Value = 1 And Cells(1, i).Value<>Cells(1, 3).Value Then
だが、Andを使うコードは汚いし両方を評価するから無駄だ
Ifのネストをつかえ
temp1 = Range("C1").Value
For Each c In Range("A1:Z1")
temp2=c.Value
If tem2 = 1 Then
If temp2 <> temp1 Then
処理
End If
End If
Next
無駄な工数を
言ってることは間違っちゃないが例が悪いな たった26回のループで評価のコストとか誰もが無視するレベル
824 :
デフォルトの名無しさん :2012/11/18(日) 13:10:09.44
新ブックを作るVBAコードはどうしますか? Workbooks.add だと、3つもシートが作られるのがイヤだし。 かといって Activesheet.copy ではシートは1個だけどそのシートに元シートのデータがそのままだし。
>>824 何がしたいのかが書いてないから外してるかもしれんが
Application.SheetsInNewWorkbook
>>824 Application.SheetsInNewWorkbook = 1
で、次から新規作成されるブックのシート数の設定を変更できる。
マクロの最後で3(もしくは初期値)に戻せばおk
827 :
824 :2012/11/18(日) 13:21:33.00
めんどくさいなあ。 Workbooks.add sheet:=1 みたいなのでできないの?
828 :
824 :2012/11/18(日) 13:23:48.73
諸君の非常に役に立たない意見を参考に Aheets.Add Activesheet.move とすることにしたよ。
829 :
824 :2012/11/18(日) 13:24:49.06
Sだ、最初。
>>828 失礼なやつだな。
回答をもらう身で、めんどいとか役に立たないとか。
あぼーんするからコテ付けろ。
831 :
桃白白 :2012/11/18(日) 13:51:54.97
参考にしたんだから役に立ったんだろ。 感謝の気持ちを表すのに憎まれ口を叩きたくなる年頃なんだろ。 思い返せば桃白白にもそんなときがなかった。よくよく考えてみたけど桃白白は昔から素直でいいやつ。
>>824 誰か答えてやれよこんぐらい
Workbook.Add xlWBATWorksheet
835 :
デフォルトの名無しさん :2012/11/18(日) 17:00:11.25
VBAを自習するために ダミーデータが大量にはいったデータベースってどこかで手に入りませんか? フィルター機能、日付処理、シート処理、ブック処理、その他いろいろ含め、いろんな作業を実体験したいから 数千、数万行もエントリーのある巨大データベースが欲しい。 中身はなんでもよい。
>>834 普通はシート三つで全然困らないからね。
あまり需要のない作業に関する質問には
回答も付きにくいものさ。
>>835 自習の一環としてダミーデータをInsertするSQLをつくってみたら
838 :
デフォルトの名無しさん :2012/11/18(日) 17:16:42.03
>>835 それを作る過程そのものが勉強になるじゃないか!
ノースウィンド持ってくれば?
840 :
デフォルトの名無しさん :2012/11/18(日) 17:44:33.09
>>835 日本の街区データとかいいぞ。
そのまま実用にも使える
>>835 毎日、体重と血圧と体温を測ってデータベース化すれば?
>>841 1万件のデータを集めるのに1万日=27年か
wikipediaの中身のデータなら、確か無料で公表してたはず もはやVBAってよりSQL他になる気がするけど
>>842 くくっ
今の健康が、いつまでも続くと思うなよw
845 :
デフォルトの名無しさん :2012/11/18(日) 23:43:48.30
>>835 例えば、ランダムな数値や文字列を作成してぶっこむコードを作るとか。
上で散々同じこと書かれてるけど本当に勉強になるからやってみた方がいいよ。
なんでも良いが一番困るんだよな しかも大体用意してやるとこれじゃダメって言い出すんだよ サンプルなんざ腐るほど転がってるし自分で探せと言いたい
そういえば昔、電算担当に「これこれこの条件で適当なダミーデータ作っといて」って言われたから、 ランダム関数とか適当にこさえた辞書とか使って顧客番号から住所氏名その他のダミーデータ作って渡したら、 「ダミーデータ作れって言っただろ!! 顧客の個人情報引っ張ってくんな!!」 ってえらい怒られたことがあったな。 じゃあ電算担当側で勝手に作って下さい、あとちゃんと個人情報かどうかチェックしてから言ってます?って訊いたら「もういい」って電話切られて、そのあとなんも音沙汰ないし…
電算担当はプライド高いだけの能なし 間違いを認めて謝ることを知らない
電算室は広い個室みたいなもんだからねえ
大きな部屋を占領してると偉くなった気になるのは確か
>>848 ちゃんと「いえ、あれは自作したダミーです」って言えよ
自分が正しくても、嫌味っぽく言い返しちゃうのは完全に相手と同レベルだから社会人失格だよ
仕事切られて当然
「ダミーデータ頼んでたのにこれはどういうことですか?」 とかじゃなくて、 いきなり怒ってきたんだろ? そりゃだめじゃん。
問答無用の原理主義者が多いのは確か
相手が先に怒ったとか関係ないだろ むしろそういう時ほど冷静に対処しなきゃ、状況が悪くなるだけってわからないかな
>>848 若いなw
相手に本番データと勘違いされるようなデータを作ったのは君なのだから、
まずは素直に詫びなきゃならん。紛らわしくて申し訳ないと。
しかしあれだな、ダミーデータと言えば、普通は住所XXX、氏名YYYみたいな
ものにすると思うが、どんだけリアルなもの作ったんだよ。
>>848 の正しい応答
それがどうかしましたか?
>>854 ダミーデータだから、本番データに近い物を作らなきゃ駄目なんじゃないの?
わざとエラーを出すデータ 使う文字の種類 「これこれの条件で」 示されていれば問題ない 大抵の場合「適当な」ってのがあいまいで ほんとに適当にやると怒られる
>>845 自分以外の人がどうなろうと自分には関係ない、そうは思わないか?
くくっ
今の健康が、いつまでも続くと思うなよw
症状の軽い病気ほど重症化しやすいんだぜw
859 :
デフォルトの名無しさん :2012/11/19(月) 10:56:32.04
>>858 最近、身内の軽めの病気の人が重症化して死んだのか?
放射脳ですね わかります
>>859 症状の重さと病気の重さは、全く別物なんだぜぇ
くくっ
今の健康が、いつまでも続くと思うなよw
862 :
デフォルトの名無しさん :2012/11/19(月) 19:37:19.66
Findを組み込んだモジュールを実行中、 あまりに処理が遅いので CTR+Pause で中止させると 必ずFind処理のところで停止するのですが、そういうものでしょうか? そして必ず検索に失敗して Nothing が返ってきてしまいます。
>>862 「必ず」Find処理のところで停止する
のならそういうものって事でしょうね
864 :
桃白白 :2012/11/19(月) 21:32:11.27
>>862 犬も歩けば棒に当たるという言葉がある。それは連綿と続く日本の歴史の中で古く
昔から語り継がれているものだ。あまりに語り継がれているがゆえにことわざと
いわれる。犬も歩いていれば棒にあたるし、処理をしていればFind処理のところにも
くるだろ。つまりあれだろ、まあそういうことだろ、うん。Find処理のところで実行が停止されたとき
Find処理は完了してないから、検索が失敗するのはしかたない。桃白白的に見てもそれは
しかたない。Find処理のところで停止するのは偶然なんじゃね、もしくは必然なんじゃね。
Find処理に時間が超かかっていて実行の停止をしたときにそこで停止する確率が高いか、
または実行を停止するやつの脳内クロックとエクセルがシンクロしてるんだろ。
ふう、疲れた、長文書くの超疲れた。役に立ったっしょ?桃白白のアドバイス。
私と友達はいつも一緒に帰ります。 駅で違う電車に乗って分かれるのですが、どちらも10分間隔なのにほぼ友達の方が先に来ます。 何故なんでしょうか。 ってことかな。
お返事ありがとうございます。 途中中断しなければNothingは返ってこないので、 根気よく処理が終了するまで待つことにします。
868 :
桃白白 :2012/11/20(火) 23:32:16.09
>>867 検索処理を高速化すればいんじゃね。どういう検索をしてるんだ? 無理なのか?
とりあえずExcel自体の検索機能で時間かかるようなら それがExcelを使った処理の限界だよ それ以上はAccessに変えるなりDB使うなりを考えなよ
>>868 数千行あるソースSheetを上から順番に読み込み、
A列にある文字列と一致する行を、
これまた数千行あるデータSheetからFindで検索。
一致する行があればその行に、無ければ新規行に書き込み。
簡単にこのような処理です。
CopyDestinationを用い、1回ごとに書き込みをする方法と
書き込むデータは配列で格納し、
最後に1回だけ書き込む方法を試しましたが
速度的には変化ないようでした。
dictionary使ったら早くなるとかないかね
872 :
桃白白 :2012/11/21(水) 13:38:50.51
>>871 ソレダ!! m9(・∀・)ビシッ!! ナイスアイデア!イカスアイデアだな!
そもそもイカスの語源ってなんなんだ。まさか下ネタじゃないないだろ、
イカのように素敵ということか、イカが素敵という価値観は一般的に
共有されるものじゃないと思うの、桃白白はそう思うの。Dictionaryの話に
戻ってもいい?桃白白べつにイカの話をしたいわけじゃないからさ。
文字列が全体一致で検索されているならDictionaryを試してみるべきだな。
>>870 文字列を全体一致で検索してるならDictionary使っちゃいなよ。
873 :
デフォルトの名無しさん :2012/11/21(水) 16:38:51.60
Activecell.AutoFilterと Activecell.CurrentRegion.AutoFilterは 同じですか?
874 :
デフォルトの名無しさん :2012/11/21(水) 20:25:11.90
ブックをコピーして新ブックを作りたいとき なぜ Activeworkbook.Copy でできないの? シートなら Activesheet.Copy でできるのに。
875 :
874 :2012/11/21(水) 20:25:44.36
もしできないなら ブックをコピーして新ブックを作りたいときはどうしたらいいの?
>>870 探す前にちょっと整理とかできないデータなのか
ていうか、数十万行ならともかく数千行って大した量じゃないように思うんだけど、
再計算とかちゃんと停止してる?
>>874 仕様の疑問はメーカーサポートへどうぞ
我々ユーザにはわかりません
>>874 ActiveWorkbookが返すWorkbookオブジェクトにCopyメソッドがないから
>>875 SaveAsメソッドとかSaveCopyAsメソッドとか使う
もしくは元のファイルをコピーする
>>874 単純に考えろよExcel自体にブックをコピーして新ブックを作るなんて機能ねーだろ
>>878 が言うように、別名で保存したりファイル自体をコピーしたりしてるだろ
Excelの機能を使ってるものはExcel以上の事はできないからな
やりたければ普通にVBAで作れ
880 :
桃白白 :2012/11/22(木) 05:25:12.12
| |(゚(エ)゚)| | |(. .)| |  ̄ ̄~ ̄ ̄ | ∩___∩ :::| ノ ヽ ヽ :::/ _ _ | 暇だお ::| (_●) ミ :彡、 |Ч i`ヽ :/ _/「 ̄Y ̄」> | :|ヽ  ̄ ̄)( ̄ .ノ C T ̄| ̄ 「__ /`―、___)__) ;;;;;;;;;; ;;;;;
>>871 ありがとう。Dictionaryってやつは初めて知りました。
しかしDictionaryを用いるのはどうも難しそうです。
ソースSheetから読み出す情報は、その行の特定複数列ですし、
書き込む時も特定複数列に書いています。
また検索に使用する文字列は重複も多くありますので。
>>876 >再計算とかちゃんと停止してる?
申し訳ない↑の意味が理解できなかった。
再計算を停止?
>>881 自動再計算の停止
Application.Calculation = xlManual
再計算実行
Calculate
自動再計算の再開
Application.Calculation = xlAutomatic
>>870 Findで総当たり検索は駄目だな
エクセラーはアルゴリズムくらい勉強したほうがいい
ソートして上からなぞるように検索すれば総当たりなんてしなくて済む
数万データまでならアルゴリズム無知のサルでも使えるDictionaryでもいいと思うけど
ちなみに数十万以上ならDictionaryは遅い部類に入るから万能じゃないことは知っておくべきだ
質問者は配列に一回ため込んで一気に書き出しも試してるんだから再計算云々は今回は関係なさそう しかしたった数千で時間がかかるのも不思議だな 万に近い数千なのかな?
access使えればそのほうが楽そうだな 覚えればアルゴリズムとか考える力のない馬鹿でも使えるし
質問者がソースコードを提示すれば解決すると思うんだけどな
>>883 ソートして上からなぞる→O(n)
Dictionary→O(1)
Dictionaryはキーの数が多くなると遅くなる 馬鹿の一つ覚えの人は万能だと思っているが
ソースもマスタも追加も全部配列に持ってきてからやれば 一瞬でそ
>>888 確かにデータ量が多くなるとDictionaryを構築する時間は線形時間よりもかかるようになってくるが、
検索はO(1)だと思ったがそれも違うのか?
手元で試したら、50万件のdictionaryでランダムなkeyを1万回検索したら、969ms、
50万件のソート済み配列で、順次1万回検索したら、160656ms。
まあ、ソート済みなんで、配列だと普通は他の探索法取るんだろうけど。
だから構築する時間を言ってるんだよ そこがきっと抜けてると思ったよ ちなみに6文字から9文字のランダムなアルファベットで10万アイテムで0.3秒でも100万アイテムだと3秒とはならず46秒となった
>>891 > そこがきっと抜けてると思ったよ
いや、ちゃんと線形時間よりはかかるようになるって書いてるでしょ。
> ちなみに6文字から9文字のランダムなアルファベットで10万アイテムで0.3秒でも100万アイテムだと3秒とはならず46秒となった
100万要素のDictionaryに対して、6文字から9文字のランダムなアルファベットを1万回検索するのにかかる時間と、
ソート済みの100万要素の配列に対して、6文字から9文字のランダムなアルファベットを順次検索するコード書いて
それにかかる時間比べてみ?
ちなみに、「ちなみに6文字から9文字のランダムなアルファベット」って決まってるなら、 dictionaryを26個用意すれば、データ構築にはほぼ0.3*10秒で終わるよね。
検索側と被検索がソート済みならそれなりのアルゴリズムが昔からあるからね じっくり考えればそんなに難しくない ちょっと高度になると番兵を使ったりするんだがwikiによると最近は番兵は使わないほうが多いらしい
>>893 100万人分の名簿のダミーデータだと思ってくれ
意味分かったかな?
ウィキペディアだろ?
>>895 > 意味分かったかな?
いや、全然意味わかんないんだけど。
検索する回数が多いなら、データ構築に数十秒くらいかかっても全然大丈夫かもしれないし、
それも許容できないなら、なんらかのアルゴリズムでパーティショニングすれば劇的にデータ
構築時間が減る。
VBから簡単に使える、バルクロードできるデータベースがあるなら、そっちを使うのがいいかも
しれないし、まあケースバイケースだよ。
まあそれはいいんだけど、これやってみてよ。
> 100万要素のDictionaryに対して、6文字から9文字のランダムなアルファベットを1万回検索するのにかかる時間と、
> ソート済みの100万要素の配列に対して、6文字から9文字のランダムなアルファベットを順次検索するコード書いて
> それにかかる時間比べてみ?
>>897 そうなのか・・・
ExcelVBAのTips系のwikiがあるのかと思ってしまった
>>894 > ちょっと高度になると番兵を使ったりするんだがwikiによると最近は番兵は使わないほうが多いらしい
いったいどの項目にそんなこと書いてるのか知らないけど、ソート済みの配列に対する検索は、
バイナリサーチがメジャーな方法。O(log2 n)。
>>898 おめーがやれよ
俺はそういうのはもう飽きるほどやってる
もちろんソート済みアルゴリズムには番兵使ってチューニングしてる
なんだ、ただのかまってちゃんか。
>>900 おめー馬鹿か
両方ともソートすると別のアルゴリズムがあるんだよ
二分探索しか知らないなら黙っとけ
>>903 > 両方ともソートすると別のアルゴリズムがあるんだよ
まあそのアルゴリズムより、ハッシュによる検索の方が多分速いんだけどね。
>>904 100万でやってみたら?
検索時間じゃなくてほとんど構築時間になってしまうけどな
>>905 は?
君の環境で46秒で終わったんでしょ?
つか、自分で何を言ってるのかよくわかってないみたいだけど、検索元データがソート済みなら、 データ構造を構築する必要なんてなんだよね。 俺が言ってる意味わかる?
誤:必要なんてなんだよね。 正:必要なんてないんだよね。
>>907 Dictionaryの構築時間の話ね
検索は速いけど前準備のDictionary構築の時間がほとんどって意味
910 :
デフォルトの名無しさん :2012/11/22(木) 16:49:39.03
激安中古ソフト市場かなりやすいね=キャンペーンだと 庶民の味方だよホントググってみ
>>909 だが訂正
Dictionaryってデータ多いと構築時間ばかりじゃなく検索時間も同様に遅いのね
どっちも同じデータの100万と100万で試すと格納に46秒で検索に46秒で計92秒かかったわ
まぁ昔からデータ多い時にはDictionaryは使うなってのは言われてるよな
Excel2003では6万ちょっとだから問題にならなかったってだけで
ちなみにCollectionだと11秒
これでも十分に遅いけど
エディターでCrLfとかの定数が使えなくなったんだがどうして?
>>912 そんな定数ないぞ
vbCrLfのことか?
914 :
デフォルトの名無しさん :2012/11/22(木) 18:43:53.06
>>912 vbCrLfだろ CrLfじゃなくて
で、使えなくなったってのはどういうこと?
915 :
912 :2012/11/22(木) 18:50:47.46
916 :
桃白白 :2012/11/22(木) 19:03:06.48
>>911 Dictionaryは、後に入れたもののほうが、先に入れたものより速く取得できるな。
Dictionaryの実装はハッシュテーブルだとばかり思ってたけれど、もしかしてあれか、
スタックを線形探索してるだけなのかこれ。だとしたらかっけーな。桃白白ほれちゃいそう。
>>916 おう!そうか知らんかったわ
100万データを前半50万と後半50万で試したら34秒と10秒だったわ
というわけで
>>887 のO(1)ってのは間違いってことだな
>>916 ハッシュテーブルだろうけど
ハッシュがかち合えば単なるリストになる他ない
ランダムデータじゃなくて全データを1回ずつ検索して平均をとらないと検索時間の期待値が出ないのか
921 :
デフォルトの名無しさん :2012/11/23(金) 01:03:32.59
Dictionaryのハッシュ値のbit数は設定変えられないのかな
そもそもVBAに組み込みのDictionaryなんてなかったはずだから ちゃんとなんのDictionaryなのか明示しようぜ で、たぶんScripting.Dictionaryだろうけど、これホントにハッシュテーブルじゃないのか? どっかにちゃんとした資料ないか?
どうでもいいよそんなこと。 辞書は辞書であることに意味があり 実装がどのようになっているかを議論することは このスレの範疇を超えていると思うが。
>>923 高速化もこのスレの範疇ではないってか?
それともScripting.Dictionaryの話はスレ違いだと?
VBAじゃHashtableは使えないのか
>>924 辞書が遅いので困っていますという質問が
投稿されたならばありかも知れんが、
辞書の話題から派生した雑談を広げまくっているだけじゃないか。
Scripting.Dictionaryは、VBAと言うよりはVBSだなぁ...
>>1 に従うなら完全にスレチ
やりたければ適切なスレでやってくれ
しょっちゅう使うものだしいいんじゃねーの? **の一つ覚えの人は特にw しかしDictionaryオブジェクトを辞書っていうのはなんか違和感があるね
なんで?
そもそも辞書って言い出した奴が馬鹿の一つ覚えの人だったからw
さすがにデータベース使うべき
だな頭使わなくていいもんな 選択クエリとか不一致クエリとかの内部のアルゴリズムなど何にも分からなくても使えるんだし
Dictionaryオブジェクトっていえば端から65536を超えるデータは念頭にない人多いよな Transpose関数と併用してる人を見ると大丈夫かよって思う
そんなんDictionaryに限らん 最大データ数、許容処理時間、推奨環境などなど、 質問に書かれてない条件をどう設定するかは回答者の自由
回答者たる者何件以上は使えませんって一回くらい書いてもいいと思うが一回も見たことない 知らないだけだったりして
937 :
桃白白 :2012/11/23(金) 11:42:04.80
>>925 .NETフレームワークがインストールされてれば
mscorlib.Hashtableが使えるよ
938 :
デフォルトの名無しさん :2012/11/23(金) 19:33:17.21
Autofilterで同一行に複数(3つ以上)の項目でフィルターをかけたいんです。 さらにフィルターは、「指定の値で始まる」にしたいんです(つまりワイルドカードが最後についたような「てすと*」みたいなもの。)。 これはどうやったらできますか? Criteria1で配列変数にしてみたんですが、これだとワイルドカード式のフィルターができません。 (この質問を理解できるのはかなりVBAに精通してる人のみだと思いますが)
>>938 マクロの記録で、あっさり記録できたからそれを使えばいいだけだと思う。
>(この質問を理解できるのはかなりVBAに精通してる人のみだと思いますが)
むしろド素人のほうが向いてる質問だね。
940 :
938 :2012/11/23(金) 20:01:45.55
>>939 あなたは質問の意味が分かっていませんね
3つ以上をAutofilter。
942 :
938 :2012/11/23(金) 20:09:14.65
943 :
938 :2012/11/23(金) 20:14:59.18
ありゃ?できた。なぜ会社のPCではできないのだ?
>>942 なぜできないのかが不思議なんで、自分がやりたいことをもっと具体的に説明してるれる?
>>937 .netはなぁ
CLRがインプロセスサーバとしてExcel.exe内で動作するんだよね?
Excel.exe.configがあればロードされちゃうし何かキモチワルイ
946 :
デフォルトの名無しさん :2012/11/23(金) 20:28:51.84
ExcelVBA 2010 で作成したマクロにパスワードを設定した 場合、バイナリエディタ等でパスワードがクラックされる事はありませんか? Excel2003 位までのマクロは、 バイナリエディタでパスワードの書き換えが出来ていたので心配です。
947 :
桃白白 :2012/11/23(金) 21:27:11.95
よく知らないけど2007とか マクロの記録がまともに動作しないそうだから そもそもMS-Officeですらなかったりして
03 という文字列から先頭の 0 を取るにはどうしたらいいですか?
>>951 「取る」の意味がわからん
取り除く =RIGHT("03",1)
取り出す =LEFT("03",1)
cstr(clng("03"))
>>938 質問や書き込みをする前にもう一回試したり調べたりしてからのが
人生で恥ずかしい思いをする事が少なくなるぞ
いやまじでまじで焦りは禁物
>>938 最後の一行いらなくね?
あとExcelのバージョンは?
957 :
デフォルトの名無しさん :2012/11/24(土) 16:11:49.42
Office 田中 のスキルってお前らどう思いますか? どうも俺らの方が上な気がしてしまうんだが。
958 :
デフォルトの名無しさん :2012/11/24(土) 16:14:37.87
VBAの編集ウィンドウでは、Visual Studio みたに マウスで選択した行を一度にコメント、コメントアウト する様なショートカットボタンは無いですか?
959 :
デフォルトの名無しさん :2012/11/24(土) 16:17:23.33
あと、 #region **** #endregion みたいなのってVBAじゃ無理?
>>958 Office XPはあるよ。
それ以外のバージョンは手元にないんで知らん。
1.VBEのツールバーを右クリック。
2.メニューの中から「ユーザー設定」を選択。
3.「ユーザー設定」ウィンドウの「コマンド」タブを選択。
4.「分類(G):」の中から「編集」を選択。
5.「コマンド(D):」の中の「コメントブロック」か「非コメントブロック」をツールバーにドラッグして移動。
>>957 高いスキルを保有していることと
人に教えることは、何というか別物だと思うんだ
>>957 少なくともアルファベットを全角で書くやつはPC初心者に多いよね
963 :
デフォルトの名無しさん :2012/11/24(土) 17:58:55.71
>>957 彼の知識は上の中くらいはある
でも頭の回転はさほど良くない
初心者相手に知識や初歩テクを伝授することは出来ても
素晴らしいプログラムを生み出したり
中級以上の者のステップアップになるような
記事や本を書くのは無理
人間、生まれた時からVBAの知識を持ってる奴など居ないから
初めは彼の知識を見て「こいつ、詳しいじゃん」と思うだろうが
頭の回転の良い奴は、理解や知識の蓄積も早いから
すぐに彼の領域を超えてしまい、「こいつより俺の方が上じゃん」となる
965 :
デフォルトの名無しさん :2012/11/24(土) 18:56:06.98
>>960 ありがとうございます。Excel2010でも出来ました。
>>961 >>964 あの人のスキル自体は然程高く無いでしょうけど、
人に分かり易く教えるスキルはかなり上位なんじゃないかと思います。
966 :
802 :2012/11/24(土) 19:04:13.33
自分にはVBAはまだ早かったようなのでマクロの記録でやりました。 Excel自体の理解も浅いようなのでもっと勉強したいと思います。 お目汚し済みませんでした。
967 :
デフォルトの名無しさん :2012/11/24(土) 20:19:46.06
こんどはAdvancedFilterで同一行に複数(3つ以上)の項目でフィルターをかけるとき、 フィルターは、「指定の値で始まる」にしたいんです(つまりワイルドカードが最後についたような「てすと*」みたいなもの。)。 これはどうやったらできますか? CriteriaRangeにはセル範囲を入れないといけないらしいし一行目は項目名だから、ワイルドカードが使えないのです。 (この質問を理解できるのはかなりVBAに精通してる人のみだと思いますが)
荒らし認定。みんなスルーな。
969 :
967 :2012/11/24(土) 20:44:49.83
ありゃ、できたわ。 でもそれは作業用のセルをわざわざつくって、「てすと*」みたいに代入したから。 こうせず、コードだけでCriteriaRangeを実現することはできますか? (理解できるのは限られた人のみと思いますが)
自分にはまだ早いと言ってるやつが将来にわたって出来たためしがない 今この機会を逃すのはどうして?
VBの開発理念は、10分で作れそうかどうか?というものになります。 それ以上はそれなりのしっかりした開発環境で開発しましょう、という事です。 更にそのサブセットでしかないVBAでコレ以上悩むなら、それは無駄だということです。 これ以上無駄に時間を消費する事を止め、解る人に開発を依頼してください。 ご安心下さい、あなたがダメと言う訳ではありません。 あなたは向いてない、というだけの事です。
それマイクロソフトのおっさんの発言だろ? 実際にはサポート切りたいのに使われすぎて切れないって時点で そいつの想定外の使われ方されてるのは分かりきってるし そんな理念はとうに崩れてるよ 実際に仕事でVBで○人月の開発とかザラにあるんだが・・・
VBならともかく VBAでそれやるのは 間違ってる気がする
実はそうでもない VBAはExcelというプログラム分からない人でも長年使っていたインターフェイスを持っており そのインターフェイスをそのままに、長年使ってきたシートフォーマットをそのままに 機能追加や自動化が出来るというメリットがある PC慣れしてる奴は、Excelのシート操作がVBやCなどで作ったフォーム入力になっても何の弊害も感じないし むしろそっちの方がやりやすく感じるものだが、PCに疎い奴は、ユーザーフォームで入力を簡素化してやっても 「作業が簡素化されている」ということより「以前と操作や入力方法が違う」ということに弊害を感じてしまうものだ 組織の中で働く以上、いまだそういう人の方が多いくらいだと言うことを忘れてしまうと 一部のPCベテランのみには認められるが、大多数のPC初心者にはウザがられる独りよがり野郎になってしまう
975 :
デフォルトの名無しさん :2012/11/25(日) 10:39:12.38
たとえば activecell.AutoFilterまで入力すると自動入力候補が現れますが cells(1,1).autofilterを入力してもなにも現れないのは どうしてですか?
Cells(1,1)の戻り値がObject型だから。
このレベルの質問してくる奴にその説明で伝わるかな?
978 :
975 :2012/11/25(日) 10:54:39.06
どういうことでしょうか?
979 :
デフォルトの名無しさん :2012/11/25(日) 10:55:18.24
じゃあActivecellの戻り値は何型?
そういうもの。まあVBAだし。
>むしろそっちの方がやりやすく感じるものだが、PCに疎い奴は、ユーザーフォームで入力を簡素化してやっても >「作業が簡素化されている」ということより「以前と操作や入力方法が違う」ということに弊害を感じてしまうものだ Windows 8 ですね。わかります。
>>975 Cells(1,1)ってCells.Item(1.1)の省略形なんだよ。厳密にはCells.[_Default](1,1)だが
これらItemプロパティや[_Default]プロパティはRange以外でもいろんなものに使われている
たとえばWorksheets("Sheet1")はWorksheets.Item("Sheet1")の省略形。これも厳密には上と同じ[_Default]だ
だからItemプロパティでは入力候補を出しようがないんだな
Range("A1")やCells.Resize(1,1)などきちんとRange型を返すプロパティなら入力候補が出る
あるいはCells(1,1)をRange型の変数に入れてからピリオド打てば入力候補が出る
コーディングするときは入力候補が出るようなコーディング方法がおおむねセンスの良いコーディング方法だ
たとえばWith Worksheets("Sheet1")としてピリオド打っても入力候補は出ないが、Worksheet型の変数に
Set ws = Worksheets("Sheet1")
With ws
とすればピリオド打った時入力候補が出る
間違いだらけのドヤ顔解説w
正しい解説は
>>983 にお任せしてようするにItemプロパティって実行してみないと型がわからない実行時バインドってことね
> With Worksheets("Sheet1") Worksheetsの引数に変数使うならまだしも リテラル値でベタ書きするなら With Sheet1 ってすれば良いだけ シート名(ブックのシートタブに表示される名前)は VBA使わない人でも変更できるから、この名前を使って シートを特定する方法は他者が使う場合は特に バグの原因になることも多い シートのオブジェクト名(CodeName)は、VBAわかる人以外 まず弄ることは無いからバグを引きおこしにくい
よく見たらピリオド打った時の話じゃなかったな
>>982 は的外れだった
>>986 オブジェクト名使うのには俺も賛成だ
固有の型を返すからね
>>986 他のWorkSheetを見てしまう可能性があるからそれはだめだろ
何勘違いしてるんだ?
>>986 マクロブックからデータブックを扱うときのデータブックのコードネームの使い方を教えて欲しい
人に物を聞くときは最後に次の一文をつけることがこのスレの礼儀 (この質問を理解できるのはかなりVBAに精通してる人のみだと思いますが)
あ
994 :
デフォルトの名無しさん :2012/11/25(日) 18:51:24.94
>>985 バインドってなんですか?
怪我したときに貼るやつ?
995 :
デフォルトの名無しさん :2012/11/25(日) 19:09:32.46
>>990 他のワークブックがアクティブなときにマクロ実行するとそっちのブックのSheet1をwithるだろ
>>996 意味不明
そっちのブックってコードが書いてあるブックのことか? それなら理解できるが
ようするにワークブックとワークシートを明示しないとどのブック・シートになるかわからない、ってことじゃないの? 実は俺もよく解ってないんだけど、俺はいつもこうしてる。 Set myBook = Workbooks("hoge") Set mySheet = myBook.Worksheets("fuga") With mySheet 〜 End With
999 :
デフォルトの名無しさん :2012/11/25(日) 20:15:05.52
そう Sheet1等のシートオブジェクトを指定した場合 対象となるワークブックは暗黙的にActiveSheetになる だからAというブックへマクロを適応しようとしても 他のBというブックがActiveSheetになっていると Aに対して行いたいことがBに対して行われてしまう
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。