Excel VBA 質問スレ Part26

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん

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/
2デフォルトの名無しさん:2012/08/19(日) 17:03:06.09

関連スレ:
VBAなんでも質問スレ
http://toro.2ch.net/test/read.cgi/tech/1342087380/
3デフォルトの名無しさん:2012/08/20(月) 00:06:38.58
MsgBox ">>1乙", vbAlert

しかしWin8でもVB6サポートされるとか
やっぱ当分VB系は安泰だなぁ
4デフォルトの名無しさん:2012/08/20(月) 10:28:43.34
閉じたままのBook内のデータを参照するにはどうしたらいいですか?
そして閉じたぱぱのBook内のデータをオートフィルタすることもできたりしますか?
5デフォルトの名無しさん:2012/08/20(月) 10:40:26.94
パパやママのことは、直接本人(両親)に相談してください

というのはさて置き、閉じたままと言っても、当然本当に閉じたままでは
何も出来るわけが無いので、「閉じたまま=GUI上で開かず」と解釈すると
ExcelのCOMインスタンスを作ってやってそれで開けばいいだけ
後の操作は普通に開いてるブックやシートと全く同じ
GUI上には表示せずに、裏で開いた状態でなんでも出来る
6デフォルトの名無しさん:2012/08/20(月) 11:10:48.19
>>4
どうしてググろうと思わないわけ?
7デフォルトの名無しさん:2012/08/20(月) 11:54:07.42
http://prt.iza.ne.jp/images/news/20120819/502425_c450.jpg
雷でよく見る実にわかりにくい図のことで質問です。
濃いピンクが安全だということらしいけど
それより内側は危険であり、さらにそれより外側も危険という認識で合ってますか?
8デフォルトの名無しさん:2012/08/20(月) 12:12:49.20
どこの誤爆だw
9デフォルトの名無しさん:2012/08/20(月) 16:55:32.92
ExcelVBAで
Outlookのテンプレートの機能をプログラミングをしたいのですが
その方法を教えてくださぃ。

Outlookのテンプレート機能を使わないのは
メールの本文中にその当日の「日付」を使ったり
Excelのセルに用意したデータをメールの本文に使いたいからです。
10デフォルトの名無しさん:2012/08/20(月) 17:16:34.42
outlookのvbaでやれ
11桃白白:2012/08/20(月) 17:30:59.98
みんなおはよう

>>7
合ってると思うよ
12デフォルトの名無しさん:2012/08/20(月) 17:45:38.20
モジュル先頭で宣言する変数はそのモジュル全体で使えるとのことですが
マクロ実行後も値はそのままですか?
次回にマクロ実行したときは値はそのぱぱ残ってる値に加算されますか?
13デフォルトの名無しさん:2012/08/20(月) 17:59:32.15
>>12
その変数がクリアされなければ残ってる。
いつクリアされるのかは、明らかではない。
クリアされて困るなら、シートに保存すべし。

詳しくは、こことか参照。
http://www.moug.net/tech/exvba/0150116.html
14デフォルトの名無しさん:2012/08/20(月) 18:08:05.83
>>5
COMインスタンスとはなんでしょぅか?

>>13
びっくりですね。
これからはモジュル先頭で変数は宣言しないことにしました。
15デフォルトの名無しさん:2012/08/20(月) 18:26:39.82
>>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変数にすれば、知らない間にクリアされるということはなくなる。
16デフォルトの名無しさん:2012/08/20(月) 23:54:52.30
>>15では無いが
よく解らなかったらとりあえずシートに残して使う時だけ拾うようにしとけば良いんでねーの
解ったら自分で直せる訳だし
COMはググれとしか。多分意識しないでも使ってるんだろうけど。
17デフォルトの名無しさん:2012/08/21(火) 05:38:35.68
ユーザーフォーム表示してると表示されてる間はまずクリアされないよ
18デフォルトの名無しさん:2012/08/21(火) 09:28:19.50
ユーザーフォームを表示している時に
別のブックを開いてアクティブにするにはどうしたらいい?
19デフォルトの名無しさん:2012/08/21(火) 09:58:35.99
元のブック.ユーザフォーム.Activate
20デフォルトの名無しさん:2012/08/21(火) 11:16:09.57
ありゃ?
元のブックのユーザフォーム.を開くには
元のブック.ユーザフォーム.Showでできないのはどうして?

>>18
単に「別ブック.Activate」でいいじゃん。
21デフォルトの名無しさん:2012/08/21(火) 17:04:40.11
>>20
マクロから開くのではなくて、
普通にフォルダからダブルクリックで開いたときに
アクティブになるようにしたいのです。
22デフォルトの名無しさん:2012/08/21(火) 17:10:40.46
>>21
したいのならしろよ。
23デフォルトの名無しさん:2012/08/21(火) 17:31:25.65
他ブックのFormをActivateするにはどうしたらいいですか?
24デフォルトの名無しさん:2012/08/21(火) 17:40:51.79
荒らすなよ
25デフォルトの名無しさん:2012/08/21(火) 18:13:39.86
>>21
マクロ使わないなら、スレ違いだからどっか行って。
26デフォルトの名無しさん:2012/08/21(火) 18:26:13.56
>>25
スレ違いですか?
元々開いてるユーザーフォームのあるブックの
マクロで設定できないかと思ったんですが
27デフォルトの名無しさん:2012/08/21(火) 18:29:55.86
thisworkbook:
private sub workbook_open()
userform1.show
end sub
28デフォルトの名無しさん:2012/08/22(水) 12:32:49.07
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のところで「アプリケーション定義またはオブジェクト定義のエラーです。」
と出ます。解決策をご教授ください。
29デフォルトの名無しさん:2012/08/22(水) 12:49:13.39
>>28
ActiveSheet.Cells(1, num).Select
にしてみたら?

あと、Withとか使うと楽かもよ
30桃白白:2012/08/22(水) 23:06:16.79
>>28
numが定義されてないんじゃね
31デフォルトの名無しさん:2012/08/22(水) 23:22:08.89
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は立ち上げたままです。
マクロが原因なのは間違いないと思います。
軽くするにはどうしたらいいでしょうか?
36デフォルトの名無しさん:2012/08/24(金) 07:28:47.43
>>35
マクロが原因だということまで特定できてるなら
そのマクロのバグを修正しろよ・・・
3735:2012/08/24(金) 07:59:23.13
>>36
そんなこといわずに
あなたが上級者なら
よく初心者が犯しがちな
メモリーを消費したままになる良くないコードを予想し
それに対しての対策を指示してあげたらどうです?
38桃白白:2012/08/24(金) 08:03:24.58
>>37
エスパーしたらいいじゃない! 教えてくれたらいいじゃない! ってか
じゃあ桃白白が教えてあげちゃう
グローバル変数使うのやめな これで100%解決する
桃白白に感謝しちゃったらいいじゃない
3935:2012/08/24(金) 08:21:39.84
残念ながら白桃には感謝できん
グローバル変数なんて野蛮なものは使ってないからだ
40桃白白:2012/08/24(金) 08:29:22.43
>>39
いいやお前はグローバル変数を使っている
使っていないと思い込んでいるだけだ
桃白白は上級者だがお前は初心者だ
初心者は上級者の言うことを素直に聞くべきだ
お前はグローバル変数を使っている お前はグローバル変数を使っている 目を閉じて反芻しろ
4135:2012/08/24(金) 08:33:19.36
>>40
のび太のくせに生意気だ
42デフォルトの名無しさん:2012/08/24(金) 11:37:23.01
VBA触り始めて数日の初歩的な質問ですみません。
環境はWindows7、Excel2007です。
ユーザーフォーム上のテキストボックスに
セルをリンクさせたいのですが、テキストボックスのプロパティの
Text欄、Value欄に「=Sheet1!A1」と入れても「」内の文字列が
そのまま表示されてしまいます。
Excelのシート上のテキストボックスで同じ操作をすると
そちらはきちんとセルがリンクされるのですが…。
43デフォルトの名無しさん:2012/08/24(金) 11:49:49.47
>>42
ユーザーフォームのテキストボックスなら
「=Sheet1!A1」を入れるのはControlSource
44へっぽこエスパー:2012/08/24(金) 12:34:01.86
>>35
エラーメッセージとか出ないの?
Excel2007だとこんなバグもあるみたいだけど
http://support.microsoft.com/kb/971594/ja
45デフォルトの名無しさん:2012/08/24(金) 12:34:21.37
>>43
おおおおお!出来た!
これでとりあえず形だけは完成しました。
ありがとうございます
46デフォルトの名無しさん:2012/08/24(金) 13:36:54.76
>>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)という数式は消え、他のコマンドボタンを押しても反応がなくなってしまいます。

どうすればよいのでしょうか。。
47へっぽこエスパー:2012/08/24(金) 15:54:05.98
>>46
各コマンドボタンのクリックイベントに
Sheet2.Cells(1,1) = "= SUM(Sheet1!C:C)"
って入れといたらどうですか?

あと、On/Offの2値を扱いたいなら
コマンドボタンよりトグルボタンのほうが良くないですか?
48デフォルトの名無しさん:2012/08/24(金) 22:39:47.47
>>46,47
まずControlSource使うのやめて、
各ボタンのクリックイベントに、TextBox1.Text = Sheet2.Range("A1").Valueとか書くのが正解だろ
(つかそう書いたサブルーチン呼べ)

というかまずボタンを重ねて配置するとか馬鹿なことをやめろよ
49デフォルトの名無しさん:2012/08/25(土) 11:19:20.04
埋め込みグラフの目盛り線を選択したいのですが、エラーになってしまいます。

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
53デフォルトの名無しさん:2012/08/25(土) 13:12:04.08
>>47
>>48
役割はトグル以外の何物でもないのですが、
クリックすると白黒画像からカラーに変わるギミックを
どうしてもやりたくて、方法がわからずこのような原始的な方法を取りました。

各ボタンに記述してみます。ありがとうございました
54デフォルトの名無しさん:2012/08/25(土) 13:26:17.55
>>49
選択しようとするからじゃないの?
ActiveSheet.ChartObjects(1).Activate
55デフォルトの名無しさん:2012/08/25(土) 14:32:05.25
>>54
ActiveSheet.ChartObjects(1).Activate
ActiveSheet.ChartObjects(1).Chart.Axes(xlValue).MajorGridlines.Select
できましたwありがとうございます
56桃白白:2012/08/25(土) 14:40:56.33
>>55
そんなの桃白白認めない
57デフォルトの名無しさん:2012/08/25(土) 17:22:08.78
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
58デフォルトの名無しさん:2012/08/25(土) 17:32:32.39
>>57
ちゃんと宣言されてないよ
59デフォルトの名無しさん:2012/08/25(土) 17:33:16.19

初心者がよくハマるやつだな

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をやっていたというわけだ
60デフォルトの名無しさん:2012/08/25(土) 18:25:24.46
初心者じゃ無いつもりだけど未だに分からないのがdecimal。
なんで宣言出来ないんだ??
61デフォルトの名無しさん:2012/08/25(土) 18:49:27.72
>>60
仕様に対して「なんで」って言い出したらキリがない
62デフォルトの名無しさん:2012/08/25(土) 18:50:38.91
現在、10 進型はバリアント型 (Variant) の内部処理形式でのみ使用できます。変数を 10 進型として宣言することはできません

ってヘルプに書いてあるから、そういう仕様だとしか
63デフォルトの名無しさん:2012/08/25(土) 19:10:26.70
ある程度割り切りも必要だけど、
何事にも疑問を持って追求しようとする姿勢が無いとダメだよ。
64デフォルトの名無しさん:2012/08/25(土) 19:33:44.95
調べれば仕様だって事はすぐわかるんだが、追及なんて全くしてないだろ

なんでそういう仕様なのか考えるのはまだ意味があるかもしれんが
65デフォルトの名無しさん:2012/08/25(土) 21:27:58.33
一応Currency型があるから。
誰も覚えてなさそうだけどw
66デフォルトの名無しさん:2012/08/25(土) 21:29:55.49
57です

59様、ありがとうございます。
てっきり複数列挙してもまとめて型宣言できるものと思っていました。
67デフォルトの名無しさん:2012/08/25(土) 22:39:09.50
セルにAlt+Enterで改行したデータを
ユーザーフォームのTextboxに入れようとしても
改行してくれないんですね。
何かいい方法はないですか?
68デフォルトの名無しさん:2012/08/25(土) 22:44:36.80
>>67
たぶん MultiLineがFalseになってるだけだと

69デフォルトの名無しさん:2012/08/25(土) 23:10:05.12
>>68
ありがとう!
70デフォルトの名無しさん:2012/08/26(日) 03:13:42.98
>>63
追求する意味があるものと無いものを見極める能力も無いとダメだよ

何も解ってない状態で割り切って諦めるのと、追求する意味がないことを見極めて
無駄な愚考をしないのは違うからね
71デフォルトの名無しさん:2012/08/26(日) 09:14:57.64
おまいらが作ったクラスモジュール教えてくれ
使える、別のアプリ専用、面白い、誰得と何でもいいわ
72デフォルトの名無しさん:2012/08/26(日) 09:46:58.31
>>71
具体性のない質問というかネタクレクレはスレ違い
>>2でも行くかググって漁れ
73デフォルトの名無しさん:2012/08/26(日) 19:11:36.33
ソート用クラスなら。
並び替えられるデータは数字の入った配列で、
比較メソッドはイベントとして使う側で実装する形。
数字=インデックスとして見れば、どんな内容のソートにでも使える。
74デフォルトの名無しさん:2012/08/26(日) 23:09:08.58
入力データを取り込むのに

Dim ttl As String
If TypeName(buf) = "String" Then
ttl = InputBox("タイトルを入力", title:="タイトル入力", Default:=buf) ←bufは事前にクリップボードからセット
Else
ttl1 = ""
End If

と言うのを作ったのですが、これだと1度に1つの文字列しか取り込めません
1つのダイアログを表示して入力箇所を2つ表示し
同時に2つの文字列を取り込む場合どうすればよいのでしょうか?
75デフォルトの名無しさん:2012/08/26(日) 23:19:45.24
ユーザーフォーム使えば良いだけだと思うよ
76デフォルトの名無しさん:2012/08/26(日) 23:40:00.07
使う方が嫌じゃなければカンマで区切るとか
77デフォルトの名無しさん:2012/08/26(日) 23:54:40.85
あとはforで二回まわすとか?
ユーザーフォームが一番スマートだと思うけどね
7874:2012/08/27(月) 00:50:32.74
ユーザーフォームって本を買ってきてVBを独学したときに作った記憶があるな

クリップボードから拾わせた文字列を入力の初期値にして
文字列を入力したらVBに取り込んで
シートのフィルターの指定フィールドで抽出させるというのを作ったんだけど
やっぱり複数の文字列で同時にフィルターを掛けたいときが時々ある

同じ内容なんだけど、入力した時期によってキーワードが違っているときとか
79デフォルトの名無しさん:2012/08/27(月) 01:07:36.07
解読しづらい文章だな
80デフォルトの名無しさん:2012/08/27(月) 21:04:53.28
各セルの文中の最初に「★」がついてるものだけを探して「★」だけを消すのはどうすればよいでしょうか
最初でないところ(文中)にも「★」が出てくることがあるので検索して丸ごと置換というわけにもいかず困っています
よろしくお願いします
81デフォルトの名無しさん:2012/08/27(月) 21:21:09.13
>>80
Range.Findで探して、Mid$関数で消せば良いんじゃないか?
その条件ならワイルドカードが使えるし。
82デフォルトの名無しさん:2012/08/27(月) 22:37:49.14
    Selection.Replace What:="★*", Replacement:="", LookAt:=xlWhole, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False

たんに全体一致で"★*"を""で置き換えるだけだが。VBAいらね
83デフォルトの名無しさん:2012/08/27(月) 23:58:40.21
>>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

でもどうだろうか
84デフォルトの名無しさん:2012/08/28(火) 00:23:11.36
if instr(hoge,"★") = 1 then
right(hoge,len(hoge)-1)
85デフォルトの名無しさん:2012/08/28(火) 05:54:18.56
エクセルでwavファイルを取り込んでmp3で保存することは可能でしょうか?
86デフォルトの名無しさん:2012/08/28(火) 06:18:10.50
常識だろw
87デフォルトの名無しさん:2012/08/28(火) 07:15:53.67
>>85
エクセルでやる意味について
88デフォルトの名無しさん:2012/08/28(火) 07:30:31.18
>>85
世の中広いな
89桃白白:2012/08/28(火) 07:31:22.12
>>87
エクセルはみんなのツールだ。フロントエンドをこしらえるのならなかなかいんじゃないか。
90デフォルトの名無しさん:2012/08/28(火) 07:35:55.08
>>85
可能だけどスレ違い
91デフォルトの名無しさん:2012/08/28(火) 19:27:40.17
マクロ1でマクロ2を走らせる時、どちらも同じ変数名を使っているのですが問題ないですか?
それぞれのマクロの中で値を指定していれば大丈夫ですよね?
一応動くのですがちょっと不安なので詳しく教えてください
92デフォルトの名無しさん:2012/08/28(火) 19:29:55.84
変数にはスコープって概念があってな
大丈夫かどうかはソースみないと何とも言えん
93デフォルトの名無しさん:2012/08/28(火) 19:44:37.89
Public変数を知らなそうなので大丈夫でしゅ
94デフォルトの名無しさん:2012/08/28(火) 20:57:27.14
ユーザー定義関数の引数にrangeオブジェクトを指定した場合、
その値が数値の場合は配列に入れ直した方が処理は軽くなるのですか?
範囲は固定ではなく任意です。

環境なくて試せません。お願いします
95デフォルトの名無しさん:2012/08/28(火) 21:15:15.96
軽くって?
配列に移し替える時にループ使うから意味ないと思うけど
96デフォルトの名無しさん:2012/08/28(火) 21:47:07.44
>>95
失礼しました、シートから関数を直接呼び出すと挙動が重かったので軽くとかきました。

たしかにループしたら効果半減ですね…


97デフォルトの名無しさん:2012/08/28(火) 22:13:29.80
ソートの質問です
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し す さ
と並べ替えたいのです
また,このようなソートはどのようにググればやり方が出てきますか?
98デフォルトの名無しさん:2012/08/28(火) 22:43:26.96
自力で関数を書く
99デフォルトの名無しさん:2012/08/28(火) 22:46:56.48
>>97
Worksheet_SelectionChangeでググってみたらどう?
100デフォルトの名無しさん:2012/08/29(水) 00:56:26.02
>>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
101デフォルトの名無しさん:2012/08/29(水) 00:57:03.37
>>96
ユーザー定義だとどう書いても重いよね
102デフォルトの名無しさん:2012/08/29(水) 07:25:09.73
>>100
ありがとうございます。
引数をvariantにしてしまえばいいのですかね。
試してみます。

>>101
エクセル使う人は、直感的使いたいようで。
配列数式とか駆使して挙動みながら無理のない範囲で作るしかないですよね。
103桃白白:2012/08/29(水) 11:37:02.40
>>97
Friendpaste - SortWithForeinKey
https://friendpaste.com/2SD94Big6C5rrUcyFYuphe

桃白白が全力で実装したから試してみて
104デフォルトの名無しさん:2012/08/30(木) 15:06:34.82
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ページ目にあるテキストボックスオブジェクトを指定する方法が分かりません。
やり方のヒントを教えて下さい。
105デフォルトの名無しさん:2012/08/30(木) 15:23:23.59
ド素人すぎてクラクラするなw
106デフォルトの名無しさん:2012/08/30(木) 16:23:19.37
そんなこと言うくらいなら教えてあげなよ
107デフォルトの名無しさん:2012/08/30(木) 16:27:27.69
for eachで回せばいいんだよ
108桃白白:2012/08/30(木) 17:52:44.75
>>104
画像ではText Box 7って2ページ目のテキストボックスなんでない?
ページ変わってもテキストボックス取得する方法は変わらんだろ
テキストボックスを選択したら左上にテキストボックスの名前が表示されるから、そこに桃白白と入力して
ActiveSheet.Shapes("桃白白").TextFrame.Characters.Textでいけるっしょ
109デフォルトの名無しさん:2012/08/30(木) 23:44:46.08
対象のブックが開いているか調べるのにはどうしたらいいですか?
もし、開いていたらそのままシートの内容をコピーして、
開いていなかったら、開いてコピー後、対象ブックを閉じる
というのをやりたいです。
110デフォルトの名無しさん:2012/08/30(木) 23:53:28.43
馬鹿には無理
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
112デフォルトの名無しさん:2012/08/31(金) 00:33:06.46
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が既に起動中でも該当してしまいます。
条件として個人用マクロは使用せずにてクリアしたく、よろしくお願いします。
113デフォルトの名無しさん:2012/08/31(金) 07:10:08.53
馬鹿には無理
114デフォルトの名無しさん:2012/08/31(金) 08:24:31.30
Auto_Open が走るかどうかで判定できる気がする
115デフォルトの名無しさん:2012/08/31(金) 08:44:54.04
>>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"

みたいに
117デフォルトの名無しさん:2012/08/31(金) 10:34:50.97
118デフォルトの名無しさん:2012/08/31(金) 12:16:22.91
>>112
http://www.moug.net/tech/exvba/0060076.html
これ参考にならないかな?
119デフォルトの名無しさん:2012/08/31(金) 16:48:56.27
質問です
変数 = A1.value

A1のセルには、文字列helpme
となっているところを

A1にhelp
A2にme
としたとき、

変数= なんて.value書けばいいですか?
120デフォルトの名無しさん:2012/08/31(金) 17:13:04.83
range("a1").value & range("a2).value
ってことか?
121デフォルトの名無しさん:2012/08/31(金) 17:13:52.47
>>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
>>122
それは意味が違うんじゃない?
124デフォルトの名無しさん:2012/08/31(金) 18:30:31.90
お前ら相変わらずエスパーだな俺には何言ってるのかわからん
125デフォルトの名無しさん:2012/08/31(金) 18:40:22.16
>>124
>>119は意味分からんでもそれへの回答で理解できただろ
126112: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 自己起動。見たいに。

どうもありがとうございました。
127デフォルトの名無しさん:2012/08/31(金) 20:12:25.23
>>120
これでできますた!!!ありがとう!
128デフォルトの名無しさん:2012/08/31(金) 20:16:13.19
こんにちは!質問です!

エクセルファイルを開いている日(毎日)からみて次の月曜日の日付を取得するにはどうすればいいですか?

つまり火曜日に開いても木曜日に開いても来週の月曜日の日付を表示し、来週には再来週の日付を表示するということです。
129112:2012/08/31(金) 20:31:39.46
>>128
=TODAY()+9-WEEKDAY(TODAY())

月曜日に開いた場合の処理が指示されていないから、そこはつけたしてくだしあ。
130デフォルトの名無しさん:2012/08/31(金) 20:34:43.70
name消し漏れ+
日曜日の判定も必要ですな。>129だと不完全です。

WEEKDAY(TODAY()) = 0と1のとき分岐してください。
131デフォルトの名無しさん:2012/08/31(金) 21:13:03.84
>>126
>>114はダメだったのか?
132デフォルトの名無しさん:2012/08/31(金) 21:14:54.31
セルに文字としてプラスの記号入れ方教えてください。
133デフォルトの名無しさん:2012/08/31(金) 21:17:13.60
>>132
全角文字で
134デフォルトの名無しさん:2012/08/31(金) 21:18:26.75
ありがとうございます
135デフォルトの名無しさん:2012/09/01(土) 00:26:56.53
>>130
これってどういう意味?
136デフォルトの名無しさん:2012/09/01(土) 00:36:13.97
多分解決しますた
137>112 >126:2012/09/02(日) 03:17:58.59
>>131(>>114)
初めて知りました。
できそうですね。
ありがとうございます。
138デフォルトの名無しさん:2012/09/02(日) 21:54:53.26
選択セルの日付が今日を過ぎていたら赤文字、でなければ黒文字
をマクロにしようと思い、以下を書いた

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をコメントブロックすると、ループは廻ります、何がいけないのでしょうか?
139デフォルトの名無しさん:2012/09/02(日) 22:03:18.22
×End
○End If
140デフォルトの名無しさん:2012/09/02(日) 22:03:38.33
>>138
end じゃなく end ifでは?
141デフォルトの名無しさん:2012/09/02(日) 22:04:45.00
>>138
最後から2行目の「End」は「End If」でしょ。
142デフォルトの名無しさん:2012/09/02(日) 22:13:18.95
あっ!ミスってた

有り難うみんな
143デフォルトの名無しさん:2012/09/02(日) 23:06:48.44
ここって資格試験について質問しても大丈夫でしょうか?
公式テキストの解答で1つ理解できないものがありまして・・・。
144デフォルトの名無しさん:2012/09/02(日) 23:13:57.52
既に終った試験だとしても、出題内容をこういうところで漏らすことが
非常識な行動じゃないと思えるほどのバカなら好きにしたらいいさ。
145デフォルトの名無しさん:2012/09/02(日) 23:48:20.43
>>144
いや、実際の試験では無くて公式テキストのサンプル問題です。
ちょっと理屈が良く分からない部分がありまして。
146デフォルトの名無しさん:2012/09/03(月) 00:14:38.18
何でも良いから晴れよ
147デフォルトの名無しさん:2012/09/03(月) 01:33:06.43
福沢諭吉「脱亜論」 1885年3月16日 時事新報

日本の不幸は中国と朝鮮だ。
この二国の人々も日本人と同じく漢字文化圏に属し、同じ古典を共有しているが、
もともと人種的に異なるのか、教育に差があるのか、 日本との精神的隔たりはあまりにも大きい。
地球規模で情報が行き来する時代にあって、近代文明や国際法について知りながら、
過去に拘り続ける中国・朝鮮の精神は千年前と違わない。
国際的な紛争の場面でも「悪いのはお前の方だ」と開き直って恥じることもない。
もはや、この二国が国際的な常識を身につけることを期待してはならない。
「東アジア共同体」の一員として その繁栄に与ってくれるなどという幻想は捨てるべきである。
日本は、大陸や半島との関係を絶ち、 欧米と共に進まなければならない。
ただ隣国だからという理由だけで特別な感情を持って接してはならない。
この二国に対しても、国際的な常識に従い、国際法に則って接すればよい。
悪友の悪事を見逃す者は、共に悪名を逃れ得ない。
私は気持ちにおいては「東アジア」の悪友と絶交するものである。

         _,,,,,,__  __,,,__
        ィjj)))))))))!!!!!彡ヽ,
      /ミ/         ,}彡ヘ
      |ミ{ -‐ ‐ ‐ ‐-  {三=|
      El==; ゚ ''==. |ミミ,|
        `レfォ、,〉 :rfォ.、,  !iル┤
.        { `¨ i ・、¨ ´  `{ゞ'} 支那、朝鮮とは
.        | '`!!^'ヽ     .「´  付き合うなと忠告しておいたのに。。。
        ! ,-ニ'¬-、  ,!|,_   
.        \´?`  / ∧ヘ、
         __/〉`ー ' ´ /  〉 \
     _, ィ´「∧     /  /    」¬ー- 、_
  -‐ ´  / /  ヽ、/    /     iヾ      ヽ
148デフォルトの名無しさん:2012/09/03(月) 14:20:50.18
>>144
公式テキストの問題と解答をまるごとここに書くのならともかく、納得できない一問について
ここに書くことのどこに問題があるのか?
149桃白白:2012/09/03(月) 15:19:53.53
引用の範疇なら問題ないだろ
VBAの設問なのか? 何だったら桃白白がお答えしちゃうけど? 貼っちゃいなよ
150デフォルトの名無しさん:2012/09/03(月) 20:55:59.52
>>145
気になるから貼ってくれよ
151デフォルトの名無しさん:2012/09/03(月) 21:54:07.61
質問です。環境はwindows XP , Excel2003です

エクセルファイルをメールで送信するコード、つまり

Application.Dialogs(xlDialogSendMail).Show

を使いましてメールを送信する際、引数の"Arg1"つまり「メール宛先」に
複数人のアドレスを入れる関係上、宛先文字列が256文字を超えてしまいます。
255文字以内に収めれば、上手くメーラーが起動してメール送信準備が
されるのですが、256文字を超えると、エラーが出るわけでもなく
ただメールが立ち上がらないという状態になります。

対策をする前に、なぜここで256文字を超えたらダメなのか、を一応
知っておきたいです。どなたか、知っていたら教えてください!
152デフォルトの名無しさん:2012/09/03(月) 22:24:12.60
>>151
容量的な問題255バイトまで
153デフォルトの名無しさん:2012/09/03(月) 22:27:48.90
ExcelVBAでLifeGameを作った( https://www.dropbox.com/s/kntdvpijtpdje90/LifeGame.xlsm )
のですが、10世代ぐらいループさせるとExcelが固まります
何が原因か教えていただけませんか?

Windows 7 Ult x64、Excel 2010です
154デフォルトの名無しさん:2012/09/04(火) 00:07:02.26
多量のテーブルデータがあったとして、
ワークシートとデータベースって
どっちを使おうっていう判断基準を教えてください
ファイルサイズを考えて、どちらも外部ファイルにデータを置くとした場合。
155デフォルトの名無しさん:2012/09/04(火) 00:24:44.36
>>154
具体例を挙げてくれれば助言はできるけど
そんなもん一概に言えないよ
156デフォルトの名無しさん:2012/09/04(火) 00:30:58.40
データ数が1万レコード以上ある時はアクセスを使うべき
157デフォルトの名無しさん:2012/09/04(火) 00:40:54.73
>>155
1000×3ぐらいの数値テーブルが、数十個あって
ランダムな場所を幾度も読み込んで計算するような感じです
速度が求められます

シートにおさまるんだけど、どちらがいいのかな〜と。
158157:2012/09/04(火) 00:48:49.04
ちなみに、今はワークシートのデータをdllに投げて、処理して値を受け取るようにしているんだけど、
配布やら設定やらの問題でvbaで完結させたい。
159デフォルトの名無しさん:2012/09/04(火) 01:03:28.50
アクセスじゃなくてエクセルでdbやってみりゃいいじゃん
160デフォルトの名無しさん:2012/09/04(火) 01:19:21.98
メモリに乗りきらないとか、ワークシートに収まらないほどのデータがあるならDB
それ以外なら好きにしろ
161デフォルトの名無しさん:2012/09/04(火) 04:33:32.77
>>157
その程度のデータ量なら配列に一気に読み込んでから計算するのが一番処理が速い
162桃白白:2012/09/04(火) 05:52:03.40
>>153
スリープのあとにDoEventsを呼ぶようにしたら
10000回ループしても問題なかったよ

Call VBA.Interaction.DoEvents

理屈は知らん、寝るのに忙しくて表示を更新できません的なことなんじゃね
163デフォルトの名無しさん:2012/09/04(火) 06:51:00.28
何かというと配列云々をいうアホがいるがそれだけじゃまったく不十分
アルゴリズムの方が大事だ
164デフォルトの名無しさん:2012/09/04(火) 07:11:04.98
アルゴリズムの方も大事だ、だろ
シートとのやり取りのコストも、これはこれで馬鹿にならないよ。

>>153
x64Win8+Excel2013で動かしてみたけど固まりはしないな。
ただ、ESCキーでの実行中断が何故か効かなくなった。
165153:2012/09/04(火) 07:57:06.49
>>162
固まらなくなりました。ありがとうございます
ちょっと理屈調べてみたいと思います
>>164
環境にもよるみたいですね。テストありがとうございました
166デフォルトの名無しさん:2012/09/04(火) 09:26:27.40
>>153
余計なお世話かも知れないが、
プログラムが動作するしない以前の問題として
変数の宣言が間違ってる。
dim a,b as integer
だと、aがVariant型、bがInteger型になる。
あと、変数名間違ってるのが数カ所あった。
Option Expricitで変数の宣言を強制する癖をつけた方が良いと思う。
167166:2012/09/04(火) 09:31:39.92
綴り間違えた
×Expricit
○Explicit
168デフォルトの名無しさん:2012/09/04(火) 18:33:21.31
これは恥ずかしい。
169151:2012/09/04(火) 18:52:25.13
>>152
ありがとうございます。その255バイトまでっていうのが
何の仕様なのかが、どうも掴めなくて気持ち悪いんです。

変数の型はバリアントにしているので、変数の型によって255バイト
っていう制限がかかるわけじゃないし
Application.Dialogs(xlDialogSendMail).Show の引数は255バイト
までと決まっている(仕様)、ということなんでしょうか?

170デフォルトの名無しさん:2012/09/04(火) 19:26:37.09
>>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("桃白白さん", "ブルマさん")
みたいにして
172153:2012/09/04(火) 20:29:08.45
>>166
まじかよVBA糞だな首吊ってきます
173デフォルトの名無しさん:2012/09/04(火) 23:30:33.17
>>169
自作鯖ならsendmailmaxなんちゃらみたいな設定がたぶんhtod.confとかにあると
思ったけど
to Cc Bccでの上限数はあまり変わらないんじゃないか
174デフォルトの名無しさん:2012/09/05(水) 00:43:55.42
>>172
VBAがというか大本のVBがそういう仕様だからなぁ
つか知らなきゃそう書いちゃうよな
175デフォルトの名無しさん:2012/09/07(金) 12:02:31.87
質問です。

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全体の人口±といったところです。
このデーターを格納し帳票に飛ばしカウントアップしてデイリー分の男性、女性の転出、転入を出力データとしてまとめ
総人口数を求めるようにしたいのですが。
178デフォルトの名無しさん:2012/09/07(金) 13:06:18.19
馬鹿には無理
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でやっちゃった方がよくね?
181デフォルトの名無しさん:2012/09/07(金) 13:58:48.61
access高いから避けたい
182桃白白:2012/09/07(金) 14:17:45.26
>>181
データベースに何を使うかは決まってんの? MDB?
183デフォルトの名無しさん:2012/09/07(金) 15:37:49.26
PostgreSQLが良い
184桃白白:2012/09/07(金) 19:38:37.15
>>183
ゾウさんのやつな、かっけーよな
185デフォルトの名無しさん:2012/09/08(土) 02:27:32.71
教えて下さい。
excel vba でIE object のコントロールで
ajaxを起動できますか?
fireeventでjavascriptはわかったのですが
selectにonclickがなくajaxでload window
しているものがありどう呼び出せばよいか
悩んでます
186デフォルトの名無しさん:2012/09/08(土) 04:45:25.16
★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
外側のバケツのみ熱します
189187:2012/09/08(土) 09:30:46.59
どうやって熱しますか?
190デフォルトの名無しさん:2012/09/08(土) 09:41:15.34
油を注いで熱します
191デフォルトの名無しさん:2012/09/08(土) 09:48:31.79
>>185
的外れかもしれないけどブックマークレットで呼ぶとか?
http://shokai.org/blog/archives/1234
192デフォルトの名無しさん:2012/09/08(土) 20:57:56.13
>>177
DAOとかADOとかでExcelをRDBみたいにSQLで扱えるから
そういう感じでやれば良いんでね
やり方はググって好きな方法選んでくれ
193桃白白:2012/09/09(日) 01:50:11.99
みんな聞いて。桃白白のExcelの使用期限が終わりそう、繰り返す、桃白白のExcelの使用期限が終わりそう。
194デフォルトの名無しさん:2012/09/09(日) 02:17:54.45
Excelって使用期限が設けられているライセンス体系もあったんか
次買うときはケチらずに無期限ライセンスのを買えよ
195桃白白:2012/09/09(日) 02:27:17.22
>>194
桃白白貧乏だから買えないの。寄付する? するんだったら桃白白はその好意を決して断らない
ことをここに誓う用意があるけど?
196デフォルトの名無しさん:2012/09/09(日) 04:13:41.72
パソコンをリカバリすればまた体験版が使えるようになるよ
197デフォルトの名無しさん:2012/09/09(日) 07:12:31.16
>>195
互換Office使えばタダだよ
VBA使えないけど
198デフォルトの名無しさん:2012/09/09(日) 07:31:11.37
貧乏だけど知識が豊富で頭も良くて有用な回答者にならOfficeくらい寄付してもいいが、
貧乏な上に知識も多少の回答は出来るが並以下レベルで、頭の回転も弱い奴となると、
べつに回答者を続けてくれなくても誰も困らないから、Excelの使用期限と共に消えてくれて
一向に構わないな
199桃白白:2012/09/09(日) 10:38:47.13
   ∧∧
   /⌒ヽ)
  i三 ∪
 ○三 |
  (/~∪
  三三
 三三
三三三
200デフォルトの名無しさん:2012/09/09(日) 15:24:00.49
>>199
俺も貧乏だから寄付しないけどタオパイパイ嫌いじゃないよ
これからは回答せずに
にぎやかしでAA貼ってりゃいいじゃん
201デフォルトの名無しさん:2012/09/09(日) 15:26:03.47
私の声がデムパになって
波になってあなたへ向かってく
私の歌がデムパになって
波になってあなたへ響いてく
私の愛がデムパになって
波になってあなたへ届いてく
私の電子回路が短絡する前に
Electric LOVE Electric LOVE
(∩ ゚д゚) アーアー
この気持ちあなたに届くかな
202デフォルトの名無しさん:2012/09/10(月) 11:09:37.38
VBAであるセル範囲をコピペして他のシートに貼り付けたとき
図のオブジェクトがどういうわけかコピペされないんです。
どうすればこの図のオブジェクトも正しくコピペされて他のシートにも表示させるようにできますか?
203デフォルトの名無しさん:2012/09/10(月) 11:21:30.08
馬鹿には無理
204202:2012/09/10(月) 11:31:04.49
>>203みたいな馬鹿には回答は無理なのは分かりますよ。
205デフォルトの名無しさん:2012/09/10(月) 11:37:58.19
ただ図がセル範囲からはみ出してるだけじゃないのか?
206202:2012/09/10(月) 11:40:24.57
いえ、しっかりセル範囲内におさまっています。
列は3、行は20くらい、
図はちょうどど真ん中あたりにあり、1つのセルと同じくらいの大きさなのに。
207デフォルトの名無しさん:2012/09/10(月) 14:03:16.08
2007以降だっけ、図形や画像のオブジェクト仕様が変わってるから
その影響じゃね確かめてないけど
208デフォルトの名無しさん:2012/09/10(月) 14:23:25.83
>>202
コードも貼らずに・・・VBAでコピペといっても丸ごと・値だけ・図だけ・云々
値だけコピぺのコードになっていないか?

209デフォルトの名無しさん:2012/09/10(月) 15:30:15.55
再現できたよ

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'))
210デフォルトの名無しさん:2012/09/10(月) 15:36:44.24
きもっ
211デフォルトの名無しさん:2012/09/10(月) 15:39:18.22
こっちのコードなら図形も正しくコピペされたよ

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 って恥ずかしいよね
213デフォルトの名無しさん:2012/09/10(月) 15:50:50.02
なんでVBAのコードにしないんだろう?
214デフォルトの名無しさん:2012/09/11(火) 11:33:18.80
中二病だから
215デフォルトの名無しさん:2012/09/14(金) 05:33:23.35
覚えたてだからやってみたいだけだろ
216デフォルトの名無しさん:2012/09/14(金) 08:02:53.37
下げ
217デフォルトの名無しさん:2012/09/14(金) 21:32:53.98
セルの値が4:07の場合内部データでは0.17152.......となっていて
この値だと例え同じ4:07でもFIndでヒットしません。
TimeValueを使おうにもTimeValue(0.17152.......)となってしまいdate型にもできないです。
方法はないでしょうか?
218デフォルトの名無しさん:2012/09/14(金) 22:03:01.30
>>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
219デフォルトの名無しさん:2012/09/14(金) 22:13:37.27
>>218
Debug.Print Range("a3").Value
とすると小数点の値になりませんか?
220デフォルトの名無しさん:2012/09/14(金) 22:14:46.16
訂正a1でした。
221デフォルトの名無しさん:2012/09/14(金) 22:27:11.83
> FIndでヒットしません。方法はないでしょうか?

これが質問じゃないの?何が質問なの?
222デフォルトの名無しさん:2012/09/14(金) 22:28:37.96
説明不足なので補足します。
エクセルのテキストファイル読み込みで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***********の様な値を検索するようです。
その場合は例え同じ小数点の値でもヒットしません。
223デフォルトの名無しさん:2012/09/14(金) 22:38:50.60
>>222
Set r = Range("A1":"A10").Find(Range("A1").text)
にするとか
224デフォルトの名無しさん:2012/09/14(金) 22:47:46.79
>>223
ででででできました。
ありがとうございました。
.text メモメモ
225デフォルトの名無しさん:2012/09/14(金) 22:49:02.72
省略されてるけど.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個使えたらこんなイメージなのですが、
そのやり方を知らず、回避できませんでした。
ご教示お願いします。
227226: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以外のプログラミング言語を

スレチです。
230デフォルトの名無しさん:2012/09/15(土) 18:03:26.07
>>228
どんな知識だって有って損になるわけじゃないと思うけど、
そもそも営業にVBAの知識って要る?

事務はVBAで自分の業務を改善できるかもしれないけど、
営業ってPC弄るんじゃなくて人と会ってナンボの仕事でしょ?
231デフォルトの名無しさん:2012/09/15(土) 21:11:33.85
VBAの設計センスを磨くのにいいサイトとか書籍とかってありませんか?
…それとも必要ありませんか…
ちなみにwindows7 excel2010です。
始めて1日目なんですが、どうもいわゆる入門書とかサイトとか見てても、
「仕様はそこそこわかった。ではこれからどうするの?」ってなりがちなのですが…
みんなは設計書とか書くんですかね?
232デフォルトの名無しさん:2012/09/15(土) 21:27:53.16
vbaの問題ではなくプログラミングのアイデアの問題だ w

>設計書とか書くんですかね?

全く俺専用のプライベートのものだけど、最近はテキストファイルに予め作るようにしている。
作っている間にあそこをこうしないといけない、あの処理もいるな…などいろいろ出てきたりするんで。
233デフォルトの名無しさん:2012/09/15(土) 21:34:40.61
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 確認が出ない)
どうにかして次の処理に進める方法ありませんか?
234デフォルトの名無しさん:2012/09/16(日) 03:05:46.35
>>233
そもそもWorkbooks.Openで開いたら、Auto_Openは実行されなかったはずだが
それちゃんと実行されてるか?

単にエラーー出ても無視したいだけなら On Error Resume Next 使え
235デフォルトの名無しさん:2012/09/16(日) 03:38:14.45
>>234
ゴメ、ブックオープンマクロだった。
ちなみにやっぱダメみたいね。
エラー出してくれるなら拾えるんだけど、.closeにて閉じた跡、
エラーも出さずにそこで止まる。仕様だね。


さっきB.xlsからVBSへ切り替えて完成した。
どうもありがとう。
236デフォルトの名無しさん:2012/09/16(日) 08:05:02.59
>>232
回答ありがとうございます。
少々質問が悪かったのですが
僕が言いたいのは設計センスというか設計法のことについてであり
(たとえばジャクソン法だのモジュール設計だのって言葉がネットでは調べればでてきますよね)
そういうのは一切なしで、結局はとにかく「プログラムにさせたい動作を日本語で書いて、
それをそのまま言語に落としこめるだけの作業を作成者はするだけだ」ということなんでしょうかね?

なんだかたかがVBAに自分は気難しく考えすぎなようも気がします…
237236:2012/09/16(日) 08:07:09.27
ああ、ちょっと日本語が不自由なもんだから質問がわけわからない
でも疑問なんでだれかたすけてー
238236:2012/09/16(日) 08:11:14.42
ちょっと質問を整理します。
1まず、VBAの仕様はわかります
2しかしこれからどうすればいいのかわかりません
3モジュール設計とかそういう設計や仕様書の勉強したほうがいいの?

という理屈なわけです。
239デフォルトの名無しさん:2012/09/16(日) 10:48:57.05
>>235
Application.OnTimeではダメかな
240デフォルトの名無しさん:2012/09/16(日) 10:51:22.60
>>238
一番大事なのは、「何」をしたいのかを明確にすることじゃないかな?

例えば
VBAを使って「集計レポートの作成」をしたいとか
VBAを使って「入力フォームの作成」をしたいとか
241デフォルトの名無しさん:2012/09/16(日) 11:05:32.47
>>238
とにかく書いてセンスを養えばいいと思う。
テスト技法なんかは気にした方がいいかな。
人に配ったマクロにバグがあると一気に信用を無くす可能性がある。
242デフォルトの名無しさん:2012/09/16(日) 11:27:44.78
>>238
設計しないとコーディングできない
設計書に落とし込むか脳内で完結するかは規模次第
テスト設計も然り
243デフォルトの名無しさん:2012/09/16(日) 12:57:56.70
>>239
あーその手があったかぁ。
今回はVBSで逃げたけど、今までApplication.OnTimeって
使ったこと無かったけど、色々過去振り返ると便利に使えそうなシーンざくざく出てきそう。

ちょっと練習がてらに使ってみるかな。
244236:2012/09/16(日) 15:26:55.47
おk
>>240.241.242 氏
回答ありがとうございます。
書いて書いて書きまくれとは、今、小説書いてたりするんですけど
クーンツの本でも同じことが書いてありました。結局「やらないことには始まらない」ということですね。
一応テスト設計という言葉も調べてみようと思います。
245デフォルトの名無しさん:2012/09/16(日) 15:56:33.38
C♯勉強したら、VBA書けるようになりますか?
246デフォルトの名無しさん:2012/09/16(日) 16:00:31.07
>>245
ママのおっぱいでも吸ってろ
247桃白白:2012/09/16(日) 17:09:54.60
>>246
桃白白もかわいくておっぱいが大きいママが欲しかったよ。
ぜったいちゅーちゅーしたいよ、ちゅーちゅーとれいんを一緒に踊りたいって
意味だからな、そういうアクティブでカッコいい母親がいればいいってことだからな。
248デフォルトの名無しさん:2012/09/16(日) 22:18:55.01
開発中のブックで下記のコードを書くと二行目のWorksheets(1)に問題があるようで動作しませんが
新規ブックで同じコードを書くと動作します。なぜですか?
Worksheets("sheet1").Cells(1, 2).Value = 479
Worksheets(1).Cells(1, 1).Value = 476


249デフォルトの名無しさん:2012/09/16(日) 22:47:59.82
>>248
開発中のブックにWorksheets(1)がなくて
新規ブックにWorksheets(1)があるからじゃない?
250デフォルトの名無しさん:2012/09/17(月) 00:00:09.67
>>248
Worksheets(1)をSheets(1)に書き換えてみ
もしそれで動いたんならインデックス番号1のシートの種類がワークシートじゃないって事
251デフォルトの名無しさん:2012/09/17(月) 02:47:25.92
>>248
動作しませんってのは具体的にどういうことなんだ
単にお前が思ってるシート(sheet1)以外のシートに値がセットされてるだけじゃないのか?
試しに MsgBox Worksheets(1).Name を間にいれて何が表示されるかみてみ

>>249-250
Worksheetsってワークシートだけのコレクションだと思ったんだが
Worksheets("sheet1")があるのにWorksheets(1)が無いなんてこと起きるのか?
252デフォルトの名無しさん:2012/09/17(月) 06:54:21.58
248です。
.Nameで確認したら僕が思っているWorksheetsではなく
その左にWorksheetが隠れていたようです。
解決しましたありがとうございました。

どうも一度ウインドウの横幅を細くして左下の右矢印を押して隠した後に
横幅を戻しても隠れたままになるようです。
253デフォルトの名無しさん:2012/09/17(月) 08:50:46.62
>>244
書いて書いて書きまくれっていうのも、効率悪い。
一般的に言われるのはこんなところ。
・1関数1機能
・1関数は100行以内
・一文字変数は厳禁(iとかjとかkとか)

言語は違うけど、こんなサイトを参考にできるかと。
Cプログラミング診断室
http://www.kojima-cci.or.jp/fuji/mybooks/cdiag/

あとは、お作法程度だけどこんなのもある。
ハンガリアン記法
http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%B3%E3%82%AC%E3%83%AA%E3%82%A2%E3%83%B3%E8%A8%98%E6%B3%95
254デフォルトの名無しさん:2012/09/17(月) 09:11:12.86
>>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でもとめたい

よろしくおながいします。
256デフォルトの名無しさん:2012/09/17(月) 13:10:01.88
Resize(2, 0)はResize(2, 1)と解釈
WorksheetFunction.Sum(Range("A1").Offset(1, 1).Resize(2, 1))
257デフォルトの名無しさん:2012/09/17(月) 13:17:55.79
>>256さん
おおお、ありがとうございます!
SUMも試したんですが、問題はResizeの引数の側だったとは…。
すません、助かりました。
258デフォルトの名無しさん:2012/09/17(月) 17:33:27.22
>>254
再現しないんですが?
Worksheetsはワークシートだけのコレクションだから、グラフシートがあっても関係ないんですが

Sheets(1)がWorksheets(1)じゃないって状況ならいくらでも存在するがな
259デフォルトの名無しさん:2012/09/17(月) 19:01:34.01
変数を使わずにA1からデータがあるセルまで選択するにはどうすればいいんでしょうか?
260デフォルトの名無しさん:2012/09/17(月) 19:04:17.92
変数を使いたくない理由は?
261デフォルトの名無しさん:2012/09/17(月) 19:05:31.08
使わずにできるならそうしたいなって
262デフォルトの名無しさん:2012/09/17(月) 19:14:32.75
>>259
Range("A1", Cells(1, 1).SpecialCells(xlLastCell)).Select
263デフォルトの名無しさん:2012/09/17(月) 19:17:14.80
スペシャルセルズってはじめて見た。
同じだけど
Range(Cells(1, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, 1)).Select
264デフォルトの名無しさん:2012/09/17(月) 19:25:21.64
>>262>>263
できました
ありがとうございます
265デフォルトの名無しさん:2012/09/17(月) 19:26:59.29
エクセルマクロでさ
シートが10ぐらいあって、そのうち5枚だけに以下の作業させたい
・1から10行までで一列目に何も入ってない行を非表示にする

これどうしたらいいの?

記録でやってみるんだけど、最初のシートしか非表示にならないんだ
266デフォルトの名無しさん:2012/09/17(月) 19:39:11.70
>>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
267デフォルトの名無しさん:2012/09/17(月) 19:44:13.80
>>266
これって右のシートから順に5つに動作する?
268デフォルトの名無しさん:2012/09/17(月) 19:45:17.93
連投ごめん、ワークシートにはそれぞれ予算とかそういう名前がついてるんだ
どうしたらいい?
269デフォルトの名無しさん:2012/09/17(月) 20:01:36.61
おいおい、>>259=>>264なのか?
>>259の問いに対して
>>262は正解だが>>263は違うぞ
270263:2012/09/17(月) 20:17:27.38
ごめ、間違えてた?
試しても無いんだけど、あってるほうで頼む>262-263
271デフォルトの名無しさん:2012/09/17(月) 20:27:49.57
>>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
とりあえずこれ理解するまで次の質問禁止な
272デフォルトの名無しさん:2012/09/17(月) 20:35:37.82
もうちょっとシンプルに
If Cells(r, 1) = "" Then Rows(r).Hidden = True
273デフォルトの名無しさん:2012/09/17(月) 20:51:23.07
>>270

>>263はA列だけしか見てないから、
たとえばB1が最終セルでもそれが反映されない
274デフォルトの名無しさん:2012/09/17(月) 21:00:44.51
ご教授願います。
2012/8/23 10:44:24
を秒数に変換する方法を教えてください。

275デフォルトの名無しさん:2012/09/17(月) 21:02:29.24
VBAではformatする場合は秒数を使わないのでしょうか?
276デフォルトの名無しさん:2012/09/17(月) 21:04:09.86
ある程度使い方調べてから質問しろよカス
277デフォルトの名無しさん:2012/09/17(月) 21:24:12.98
>>274
=Int(Range("A1") * 86400 + 0.5)
278デフォルトの名無しさん:2012/09/17(月) 21:39:17.89
>>277
ありがとうございます。
>>276
UNIXタイムスタンプという言葉を忘れていました。検索キーワードを変えてみます。
気に障ったみたいですいません。
279デフォルトの名無しさん:2012/09/17(月) 21:44:58.98
>>278
すみません。
こちらこそ言い過ぎました。
280デフォルトの名無しさん:2012/09/17(月) 21:48:46.84
>>259
>>264
xlLastCellって「使われた最後のセル」であって「データがあるセル」では無いのだが良いのか?
有効データがある最後のセルがほしいのならもう一工夫必要になる。
(一列だけが対象なら>>263で有効データがある最後のセルが得られる)
281桃白白:2012/09/17(月) 21:50:35.12
牛乳飲みすぎた、気持ち悪い、吐きそう
282デフォルトの名無しさん:2012/09/17(月) 22:00:45.02
使用期限切れで消えるんじゃなかったのかよ
TAO
PAI
PAI
恐らくこのスレ内だけで生じているTPP問題
283デフォルトの名無しさん:2012/09/18(火) 13:20:28.40
>>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メソッドで"*"を後ろから検索するのが普通
その時は変数を使うのが普通だ
284デフォルトの名無しさん:2012/09/18(火) 13:22:02.25
アンカーミスったわ
上は>>263向けね
285デフォルトの名無しさん:2012/09/18(火) 13:37:02.88
>>283
そんなめんどいことにならないように、range(hoge).currentregionで使用範囲を特定できる構成にするのがいいよ
286デフォルトの名無しさん:2012/09/18(火) 18:08:11.65
>>283
そのコードはレアケースで壱番下までデータで埋まってると失敗する
まあ現実的には下まで埋まる前にデータ大杉でExcelが無反応になると思うけど
287デフォルトの名無しさん:2012/09/18(火) 18:44:29.30
>>285
俺も>285に賛成だなぁ。
288デフォルトの名無しさん:2012/09/18(火) 19:26:34.18
>283
289デフォルトの名無しさん:2012/09/18(火) 19:53:05.26
他を否定、アレンジして主張するもなお粗末な出来。
挙句の果てには
>変数を使わず
 に対し
>Findメソッドで
>変数を使うのが普通だ

なんだろうこの痛い奴・・
290デフォルトの名無しさん:2012/09/18(火) 22:14:25.17
OFFICE XPを使用しています。

A列にID、B列に数値が入っており、
IDと数値の関係は1対多になっています。
(A列には複数のIDデータが入っています。)
このデータで、各IDの最初の数値だけ必要であり、
それ以外の行を削除したいと考えています。
for nextで最終行からIDのマッチング、削除をする
VBAを組んだのですが、データ量が多すぎて
処理が時間がかかりすぎる状況です…
どなたか改善策のヒントをご教示いただければと思います。
291デフォルトの名無しさん:2012/09/18(火) 22:33:03.90
>>290
データが多いって、具体的には何件?

VBAなんか使わんでも重複の削除は簡単にできる
ttp://office.microsoft.com/ja-jp/excel-help/HA001034626.aspx

Office2007以降なら「重複データを削除」ってボタンがあるから、それクリックするだけ

どうしてもVBAでやる必要があるんなら、下からDictionaryに突っ込んでけば
自動的に先頭の数値だけが残るけど、とりあえず作ったコード晒してみ?ちょっとの手直しで
劇的にスピードアップする可能性もあるから
292デフォルトの名無しさん:2012/09/18(火) 23:04:43.24
>>289
アレンジ?
Cells(Cells(Rows.Count, 1).End(xlUp).Row, 1)の間違いを正しただけなんだが
Cells(Rows.Count, 1).End(xlUp)と同じだもんねぇ
いまどきこの程度が分からないやつはあまりいないけどな

>>286
知ってるよ
293デフォルトの名無しさん:2012/09/18(火) 23:10:16.71
>>292
Cells(Rows.Count, 1).End(xlUp)はアマチュアの書き方
Cells(Cells(Cells(Rows.Count, 1).End(xlUp).Row, 1).Row, 1)と書くのがプロ
そんなプロはいねーよと言いたい人もいるだろうが実際にいた
294デフォルトの名無しさん:2012/09/18(火) 23:15:29.03
>>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
295デフォルトの名無しさん:2012/09/19(水) 01:53:02.71
vlookupを使って処理したいのですが、データが多くて時間がかかります。
具体的には、Aシートに氏名と来た日時が入っており(各人何回も来ているとする)、
Bシートには氏名と誕生日が入っています。
各人、誕生日の3日後以前に来た日のデータを削除したいのです。
どうかお知恵をお貸し下さい。
296デフォルトの名無しさん:2012/09/19(水) 02:14:17.11
単純にAシートに、Vlookupより取得した誕生日列を追加して、
=if(来場日<誕生日+3,"削除対象","")
とかじゃダメなの?
297デフォルトの名無しさん:2012/09/19(水) 12:00:58.01
Excelのマクロって
Excel用に便利な関数みたいのを作れるだけで
それ以外に使うことって出来る?
298デフォルトの名無しさん:2012/09/19(水) 12:20:59.81
>>297
ゲームでもなんでも作れる
ttp://www.geocities.jp/excel_game/
299297:2012/09/19(水) 12:43:25.54
>>298
その作ったものを
Excel上以外で動かせる?
300デフォルトの名無しさん:2012/09/19(水) 13:13:00.40
>>299
無理だと思う

VBに移植すれば単独起動も可能になるけど、Excelの機能を使ってる場合は
結局はExcelもインストールしとかないと動かない
301デフォルトの名無しさん:2012/09/19(水) 13:40:46.54
>>299
「Excel上以外」というのが、Excelを起動しないで、という意味なら、OLE経由で可能。
詳しくは"windows ole excel"で検索。
302デフォルトの名無しさん:2012/09/19(水) 16:12:00.35
Excelインストールしないでも動くの作れないかな
303デフォルトの名無しさん:2012/09/19(水) 16:18:56.59
Access使えよ
304デフォルトの名無しさん:2012/09/19(水) 16:22:27.46
VisualStudio使えよ
タダだよ
305デフォルトの名無しさん:2012/09/19(水) 16:27:09.50
Accessもインストールしないと使えないしなぁ
306デフォルトの名無しさん:2012/09/19(水) 16:28:19.15
>>304
それが正解っぽい
307デフォルトの名無しさん:2012/09/19(水) 16:40:08.46
Excelマクロで作ったゲームをExcelのインストールしてないPCで遊ぶ方法ねぇ・・・
308デフォルトの名無しさん:2012/09/19(水) 16:46:19.94
Flash最強説
309デフォルトの名無しさん:2012/09/19(水) 18:47:07.54
Flashは開発環境が有料だし、VisualStudioでいいじゃん
310デフォルトの名無しさん:2012/09/20(木) 00:52:24.10
Flashはやりたいことばかり実装しててセキュリティとかすっぽり抜けてた
今更直せませんごめんなさいって開発チームが謝ってたろ
アップルも嫌がらせだけで外した訳じゃねーぞ半分ぐらいは
311デフォルトの名無しさん:2012/09/20(木) 01:21:29.62
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デフォルトの名無しさん:2012/09/21(金) 13:09:08.30
>>312
Dの後ろのスペース
314デフォルトの名無しさん:2012/09/21(金) 13:13:49.42
>>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
316デフォルトの名無しさん:2012/09/21(金) 18:25:45.90
セルの指定方法は、worksheets("Sheet1").cells(1, 1)
文字列の長さはlen(buf)
ループはfor i = 0 to len(buf) -1 ... loop
文字列のn文字目を1文字取得するのはmid$(buf, n, 1)
セルへの設定は、cell.value = hoge
317デフォルトの名無しさん:2012/09/21(金) 18:26:59.88
318デフォルトの名無しさん:2012/09/23(日) 21:00:38.19
ユーザー定義関数で例えば
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
320デフォルトの名無しさん:2012/09/24(月) 23:16:51.22
A1セルに不定期にデータが入っています。
でーたが入っている行の上に1行挿入したいのですがどうしたらいいでしょうか?
For i = 22 To 1 Step -1
If Len(Cells(i, 1).Text) >= 0 Then
Rows(i).Insert
End If
Next i

としてみましたが空白行が連続すると余分に挿入されてしまいます。
321デフォルトの名無しさん:2012/09/24(月) 23:25:13.86
>>320
If Len(Cells(i, 1).Text) >= 0 Then だと全行がTrueになるような・・・
If Not IsEmpty(Cells(i, 1)) Then にするとか
322デフォルトの名無しさん:2012/09/24(月) 23:50:13.36
>>321
ありがとう。
出来ました。
323デフォルトの名無しさん:2012/09/25(火) 00:08:28.03
XP SP3?
Excel 2003

Excel起動時にPERSONAL.XLSからマクロを実行して時間指定、
指定時間になる度(10:00と11:30とか複数あり)に、
他のアプリケーションを実行していてExcelが隠れていてもExcelを表示させたい
要はタイマーにしたいのですがうまくいきません

Workbook.activateではうまくいかず、
CreateobjectならExcelの表示には出来ますが、新たに開いてしまいます
出来れば既に開いているPERSONAL.XLS(シートは非表示ですが)を表示させたいと考えています

どなたかググる際のキーワードでもいいので教えてください
324デフォルトの名無しさん:2012/09/25(火) 00:11:15.49
>>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

で良かったんですね。
でもまた一つ勉強になりました。
325デフォルトの名無しさん:2012/09/25(火) 00:38:37.25
>>323
タイマーイベントを仕込みたいって事?
でも基本的にそういうスパンの長いものは
タスクスケジューラとかで実装するもんだと思う。
あと既存のExcel取得したい時はCreateObjectじゃなくてGetObject

という感じでキーワードを散りばめてみたがどうか
326デフォルトの名無しさん:2012/09/25(火) 10:56:15.48
>>323
「Excel 最前面」

SetWindowPos()かな?
327デフォルトの名無しさん:2012/09/26(水) 06:21:43.61
>>103
スーパー亀ですが実装再開します
VBAの新規画面に入力するとEndSubが必要と出るのですがどこが違うのでしょうか
328デフォルトの名無しさん:2012/09/26(水) 06:54:19.74
>>327
最初のSubの次の行に入れたらエラーなくなりました
しかしどうすれば動くのかわからない…
329桃白白:2012/09/26(水) 07:12:09.39
>>328
Sheet1でしを選択してSortTable関数を実行したらいいよ
330デフォルトの名無しさん:2012/09/26(水) 07:33:22.29
>>329
うんともすんともです…orz
EndSubを2行目に入れるのはあってますか?
入れないとエラーが出ますが入れても動かないのです
331桃白白:2012/09/26(水) 08:20:26.76
>>330
2行目ってどこの2行目? 桃白白のコードには入れたらまずいよ
1行目には何がある?
332デフォルトの名無しさん:2012/09/26(水) 08:27:54.95
>>331
マクロにコピペしていたのでSub test()とかなっちゃってました
新規VBAとして書き込んだらできました
ありがとうございます!
333デフォルトの名無しさん:2012/09/26(水) 08:40:26.44
>>331
何度もごめんなさい…
これって一度動かしたら、動かした後のシートに対して同じ動作はできませんか?
334デフォルトの名無しさん:2012/09/26(水) 08:54:01.61
>>333
あ、3行目だけに有効だとわかりました
全行で同じ事やりたいので何とかならないか考えてみます
335デフォルトの名無しさん:2012/09/26(水) 10:12:27.14
>>334
関連度がさ・し・す についてしか定義されてないんだから
他の文字では何も起こらないだけでは?
336デフォルトの名無しさん:2012/09/26(水) 10:45:38.07
>>335
わお
自分ばかすぎでした逝ってきます
助かりましたありがとうございました
337デフォルトの名無しさん:2012/09/26(水) 17:05:02.73
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
338デフォルトの名無しさん:2012/09/26(水) 17:07:20.30
Debug.Print Join(dateArray.Item(1))とかDebug.Print Join(dateArray(1))やりましたがエラーになりました。
339デフォルトの名無しさん:2012/09/26(水) 17:09:44.40
検索値と一致する値が連続した複数行にあるとします。
その最初と最後の行のrowsを取得したいのですが、
for nextを使わずに処理する方法があればご教示下さい。
よろしくお願いします。
340デフォルトの名無しさん:2012/09/26(水) 17:13:32.88
>>337
めんどくせぇ。
vArrayって何なんだよ。
実行したらどの行でどんなエラーになるんだよ。
341デフォルトの名無しさん:2012/09/26(水) 17:33:58.08
列数-1のループなのに、1セルごとに縦方向に参照してるのは正しいのか?
342デフォルトの名無しさん:2012/09/26(水) 17:51:18.70
>>337
・ソース貼るなら端折るな
・どう上手くいかないのか具体的に書け
・上手くいかないミニマムコードを書いて貼れ
343デフォルトの名無しさん:2012/09/26(水) 18:15:40.36
Dictionaryって、keyとitemのペアだよ。
あとJoin()ってなんだよ?
344337 :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は使えないようです。
345デフォルトの名無しさん:2012/09/26(水) 20:40:14.62
Dictionaryオブジェクトと動的配列はどこ行ったんだ
346デフォルトの名無しさん:2012/09/26(水) 20:44:15.51
ちょっと近所へ買い物へ行ってる
347デフォルトの名無しさん:2012/09/26(水) 20:48:01.54
348デフォルトの名無しさん:2012/09/26(水) 21:53:39.57
>>344
質問内容が変わっちゃったの?
とりあえず Option Explicit 書いてみたら?
349デフォルトの名無しさん:2012/09/27(木) 00:02:02.75
>>344
どうやらっておまえ・・・・
F1くらい押せよ
350デフォルトの名無しさん:2012/09/27(木) 00:03:14.41
Collectionのインスタンスにarrayってつけるのやめません?
351デフォルトの名無しさん:2012/09/27(木) 00:32:35.83
コレクションと配列とディクショナリの区別がついてないんだな、きっと
352デフォルトの名無しさん:2012/09/27(木) 00:58:40.29
>>337
何がやりたくて何で躓いてるのかよくわからないけど
もしかしてUnion使ったら解決するとか
353デフォルトの名無しさん:2012/09/27(木) 01:06:05.11
仕事で売り上げの比率を出さなければならないのですが質問させて下さい。
総売り上げから人件費%経費%など円グラフにするにはどうすればいいですか?
総売り上げが100%です。
宜しくお願いします。
354デフォルトの名無しさん:2012/09/27(木) 01:15:54.75
>>353
>わからなければとりあえず「マクロの記録」(Alt, T, M, R)

質問内容が伝わってこないので、もう少し具体的に質問してください
何がやりたくて、現状どんなソースコードを書いていて、どこでどのように行き詰っているのか、とか
丸投げしたいならせめて入力情報と現状のソースが入力されたブックをアップしてください
355デフォルトの名無しさん:2012/09/27(木) 09:44:37.81
winXP excel2002

マクロ実行中に手動で他のブックを開くようにするには
どういった記述を追加すればよいですか?


マクロ実行中に手動で他のブックを開くことができません。
マクロ実行前に他ブックを開いておけば、編集作業はできます。
実行時間が1時間近くなるので困っています。
356デフォルトの名無しさん:2012/09/27(木) 10:46:16.21
>>355
実行しているマクロの所々にDoEventsを入れる。
所々というのは、Loop行の前とか、関数呼び出し後とか適当に。
357デフォルトの名無しさん:2012/09/27(木) 11:15:05.08
>>355
力業だけど別プロセスでExcelをもう1個起動して作業するという手もあるよ
358デフォルトの名無しさん:2012/09/27(木) 18:19:05.68
>>355
OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls?")
これだと開くファイルを自分で選べるけど
359デフォルトの名無しさん:2012/09/27(木) 18:26:10.08
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)

ヒントをください。
どうかよろしくお願いします。
362361:2012/09/27(木) 21:06:19.33
我ながらアホだ・・・
自己解決しました。
363デフォルトの名無しさん:2012/09/27(木) 21:22:24.08
>>362
もしかして

"result"

ここか?
364デフォルトの名無しさん:2012/09/27(木) 21:27:15.17
>Worksheets("sheet1").Range("A2:A" & maxrow)
4列目だと?
365デフォルトの名無しさん:2012/09/27(木) 21:29:08.09
VBAを使って
Excelのある内容をグラフ化してそのグラフをJPGとして
デスクトップに保存したいのですが

なんとなく
VBAでワークシートにグラフを作成

そのグラフをアクセサリのペイントに張り付け

JGP形式でデスクトップに保存
を自動でするみたいなのを想像していますが

もっと簡単なやり方とかあるのでしょうか?
上記の方法だとペイントがある事が前提とかマシンに依存しすぎなので避けたいです
366デフォルトの名無しさん:2012/09/27(木) 21:37:11.67
>>365
excel vba グラフ 画像 保存
とかでググる
367デフォルトの名無しさん:2012/09/27(木) 22:41:16.75
>>356
所々にいれてはあるのですが、なかなか起動しですね

>>357>>358
いいアイデアもらえました。実現できそうです

>>359
webアクセス→テキスト整形、貼付なので負荷は重くないです
368359: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列を表示させたいのですが
関数で表示させるとしたら、どういう関数式になりますか?
370デフォルトの名無しさん:2012/09/27(木) 23:25:53.67
ExcelのVBAに関する質問スレです
371デフォルトの名無しさん:2012/09/27(木) 23:30:44.08
スレ違いすみません;質問に適当なスレに誘導していただけませんか?
372デフォルトの名無しさん:2012/09/27(木) 23:32:28.97
373桃白白:2012/09/27(木) 23:35:13.97
>>371
ちんちんもみもみしてくれませんかみたいな

Excel総合相談所 105
http://toro.2ch.net/test/read.cgi/bsoft/1346498940/
374デフォルトの名無しさん:2012/09/27(木) 23:38:52.18
>>372>>373
ちんもみは勘弁ですw
ありがとうございます、行ってきす。
375デフォルトの名無しさん:2012/09/27(木) 23:42:21.55
ちんこの事ちんちん言う奴は大概短小
376桃白白:2012/09/27(木) 23:42:23.73
>>374
二度とくんじゃねえよバーカ
377デフォルトの名無しさん:2012/09/28(金) 09:00:36.88
>>373
Excelの期限はもう切れたのか?
378桃白白:2012/09/28(金) 09:31:46.81
>>377
切れた、完全に切れた、もう使えない・・・寄付する?してくれてもいいけど?
379デフォルトの名無しさん:2012/09/28(金) 09:52:22.65
>>378
PCリカバリで体験版の使用歴リセットできるよ
380デフォルトの名無しさん:2012/09/28(金) 10:48:52.04
>>378
ネット解約してその金でExcel買え
みんなハッピーになれる
381デフォルトの名無しさん:2012/09/28(金) 12:47:40.12
無料のオフィスソフトあるだろ。
アレ使え。
382デフォルトの名無しさん:2012/09/28(金) 13:02:54.96
ソレはVBAも対応してるのか?
383デフォルトの名無しさん:2012/09/28(金) 14:49:45.36
VBAあきらめてVB使えば?無期限完全無料だぞ

あと、VBならゴニョゴニョ……
384デフォルトの名無しさん:2012/09/28(金) 15:42:09.39
VBが無料と申すか?
10万円以上するんじゃなかったか?
ゴニョゴニョとはどういうことか教えれ。
385デフォルトの名無しさん:2012/09/28(金) 15:44:16.93
何年前のはなしだよw
てかお前の知ってるVBは死んだ。
386デフォルトの名無しさん:2012/09/28(金) 18:01:42.47
Office体験版の期限が切れても、VBからOLE経由でExcelのブックを開くと、あら不思議
387デフォルトの名無しさん:2012/09/28(金) 18:14:59.98
あら不思議(藁)
388デフォルトの名無しさん:2012/09/28(金) 22:06:24.01
OLE OLE 詐欺
389デフォルトの名無しさん:2012/10/01(月) 10:38:11.30
質問です。
VBA本で有名なこの人ですが
http://www.amazon.co.jp/立山-秀利/e/B004LA5SL6/
自分の写真を公開してるということは、自分のことをハンサムで男前でカッコいい部類に入ると思っているからなんでしょうか?
390デフォルトの名無しさん:2012/10/01(月) 10:55:39.94
OSとExcelのバージョンは?
391桃白白:2012/10/01(月) 10:55:42.23
>>389
違います。桃白白のほうがイケメンです。
392デフォルトの名無しさん:2012/10/01(月) 11:21:04.19
>>391
写真うp
393桃白白:2012/10/01(月) 11:35:01.94
394デフォルトの名無しさん:2012/10/01(月) 12:16:32.17
桃白白と書いた紙を持って撮って
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と書いた紙を持って撮って
398デフォルトの名無しさん:2012/10/01(月) 21:10:16.23
三つ編みじゃない桃白白なんて誰が認めるか
399323:2012/10/01(月) 21:12:08.48
>>325,326
遅くなりましたがレスありがとうございました
できました!と書きたかったのですが、
まだ時間がかかりそうです
単純なウィンドウ操作だけではうまくいかない感じで、
APIのスレッドIDとかプロセスIDとか勉強してみようと思います
400デフォルトの名無しさん:2012/10/01(月) 21:16:10.15
>>399
画面をとにかく最前面に出すってのなら、SetWindowPosを使った例がExcel VBA 裏ワザ大辞典って本に載ってる
401デフォルトの名無しさん:2012/10/01(月) 21:50:16.27
SetWindowPosでもダメだったんですよね
うまくいくときもあれば、そうじゃない時もあって
幸い仕事も暇なので、色々勉強します
402デフォルトの名無しさん:2012/10/02(火) 20:04:04.69
テキストボックスに現在の時刻+3分先の時刻を表示するにはどうすればいいですか?
リアルタイムで進まず、ボタンを押したら2012/10/02 20:10
みたいな感じで表示したいんですが
403デフォルトの名無しさん:2012/10/02(火) 20:40:33.92
>>402
=NOW()+"00:03"
404デフォルトの名無しさん:2012/10/02(火) 21:05:15.41
>>402
TextBox1.Text = Format(Now() + TimeValue("00:03"), "yyyy/mm/dd hh:mm")
405デフォルトの名無しさん:2012/10/03(水) 00:44:34.23
>>401
あんまり上手くいかないようならExcel以外の手も組み合わせると良いと思うよ
このスレ的には反則だけどもExcelオンリーじゃなきゃダメってんでもないんでしょ?
勉強なら良いけど、仕事なら手を狭めるのは損だ。
406デフォルトの名無しさん:2012/10/04(木) 19:30:44.92
質問です。テキストボックス1から6まであり、チェックボックスが2つあります。
クリアボタンを押したとき、初期の入力画面に戻したいのですが
やり方教えてもらえると助かります
お願いいたします
407デフォルトの名無しさん:2012/10/04(木) 21:20:14.35
>>406
その「クリアボタン」って何?
コマンドボタンかなんかですか?
「初期の入力画面」てのも
どういう状態が初期なのか分かりません。
もう少し詳しく説明してください。
408デフォルトの名無しさん:2012/10/04(木) 21:28:38.16
>>407
失礼しました。
自分でボタンを作って、そのボタンを押すと、テキストボックス1番から6番に入ってるテキスト情報を削除し、
尚且つ、チェックボックスでチェックが入ってる場合、それをチェックなしの状態にしたいと思ったんですが。
やり方がわからないのでアドバイスいただけると幸いです。
409デフォルトの名無しさん:2012/10/04(木) 21:40:34.57
'ファイルを開く
Workbooks.Open "C:\aaa"
'あああシートを選択する
Sheets("あああ").Select

こういう処理があるのですが
どうもファイルをオープンする前にシートを選択する処理が走っていて
当然まだファイルが開く前だからそんなものは無いって言われて
落ちてしまいます
確実にファイルが開いてから次の処理に進ませるために
これって対応する場合どういうのがいいのでしょうか?
410デフォルトの名無しさん:2012/10/04(木) 21:46:33.26
>>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みたいな使って行を減らしたいの
412デフォルトの名無しさん:2012/10/04(木) 21:58:29.36
>>411
メリットがないのでやめた方がいい
413デフォルトの名無しさん:2012/10/04(木) 22:00:04.21
>>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
414デフォルトの名無しさん:2012/10/04(木) 22:03:28.62
>>411
たった2個じゃ一行も減らない

Private Sub CommandButton1_Click()
 For i = 1 To 6
  Controls("TextBox" & i).Text = ""
 Next
End Sub
415デフォルトの名無しさん:2012/10/04(木) 22:12:20.06
こういうのって、思い付いたときは良さげに見えるけど、
実際書いてみたら何か読み辛いなあ、で結局元のコードに戻す。

未だにこのパターンで時間を無駄にしてしまう事があるなw
416デフォルトの名無しさん:2012/10/04(木) 22:43:35.80
コピペしたらエラー出た

テキストボックスのクリアは出来た。ひとまずありがとう。でも
 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回目に分割した内容を
追記するような方法ってあるのでしょうか?
418デフォルトの名無しさん:2012/10/04(木) 23:23:25.23
繋いでから纏めて分割したら良いんじゃね?
419デフォルトの名無しさん:2012/10/04(木) 23:26:07.72
>>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

だとうまくいきません
ご教授ください
421デフォルトの名無しさん:2012/10/05(金) 22:42:26.83
>>420
そもそも値を返さないならfunctionである必要がない
422デフォルトの名無しさん:2012/10/05(金) 22:49:23.11
Variant
423デフォルトの名無しさん:2012/10/05(金) 23:36:45.93
適当に書いてみる

Sub aaa(ByRef s1)
  s1 = Range("A1:C10000")
End Sub
424デフォルトの名無しさん:2012/10/06(土) 01:32:05.42
Excel VBAを使って体脂肪率を下げたいのですが、どのような
コードを書いたら下がりますか?いい解決方法を教えてください。
425デフォルトの名無しさん:2012/10/06(土) 01:46:45.38
>>424
連休中に水しか飲まずにコーディングすれば下がると思うよ
426デフォルトの名無しさん:2012/10/06(土) 10:27:02.62
ブラック企業に入って何日も家に帰らずにプログラム書く
427デフォルトの名無しさん:2012/10/06(土) 19:37:58.74
>424が体脂肪計に乗ったときだけ分岐して、A=A*0.8で8割に見せる。
428デフォルトの名無しさん:2012/10/08(月) 12:46:05.92
設置したテキストボックスに情報を貼り付ける作業をしてるんですが
最後にたまに半角スペースが入っちゃうことがあって
最後の半角スペースをトリミングする方法ってありますか?
429デフォルトの名無しさん:2012/10/08(月) 12:53:25.37
430デフォルトの名無しさん:2012/10/08(月) 12:55:20.71
>>428
RTrim
431デフォルトの名無しさん:2012/10/08(月) 22:46:03.15
textbox1.text.trim()
これでいい?
432デフォルトの名無しさん:2012/10/09(火) 00:41:31.37
ほんとに半角スペースかそれ改行コードとかじゃないの
433桃白白:2012/10/09(火) 08:07:03.29

             __
            //:\
           / /::::::::\
          /  /:::::::::::::::\
        /  . /:::::::::::::::::::::::\
      /     /::::::::::::::::::::::::::::::::\
    /     . /:::::::::::::::::::::::::::::::::::::::::\
  /       /:::::::::::::::::::::::::::::::::::::::::::::::::\ ____
/       /::::::::::::::::::::::::::::::::::::::::::::::::::  / ―  -\
.        /::::::::::::::::::::::::::::::::::::::::::::::::: /  (●)  (●)      暇だお
       /::::::::::::::::::::::::::::::::::::::::::::::: /     (__人__) \
     /::::::::::::::::::::::::::::::::::::::::::::::::: |       ` ⌒´   |
 .   /::::::::::::::::::::::::::::::::::::::::::::::::::::: \           /
                    ノ            \
                  /´               ヽ
                r──|   l              \
           / ̄ ̄ ̄ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、.
          /  ̄ ̄  ̄ ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))
434デフォルトの名無しさん:2012/10/09(火) 11:34:08.96
ユーザー関数で自身のセルの背景色を変更させたいのですが、
上手く出来ません。(文字色なら変更できた)
どなたか、ヒントを頂けないでしょうか?

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
435デフォルトの名無しさん:2012/10/09(火) 12:07:53.13
Excelのセルを正方形にして100x100のマスの迷路をつくりたいのですが
スタートと出口をそれぞれ左上、右下にし、
必ず出口に行けるルートは一つだけで、
その他は壁をつくり、その壁は罫線で表したいです。

こういうプログラムをつくるにあたり、アルゴリズムはどうすればいいでしょうか?
できるだけくわしく教えてください
436デフォルトの名無しさん:2012/10/09(火) 12:44:15.63
>>434
できません。

>>435
VBAと関係無いよ。
437434:2012/10/09(火) 13:01:09.36
なんてこった、そもそも無理なのか。
さんざん頭を悩ませたのに……
ありがとう、おかげで諦めがついたよ
438デフォルトの名無しさん:2012/10/09(火) 13:20:35.52
条件付き書式とかでなんとかならない?
439デフォルトの名無しさん:2012/10/09(火) 14:05:18.52
普通にVBA走らせたらええやん
SelectionChangeとかで
440434: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デフォルトの名無しさん:2012/10/09(火) 19:48:49.48
>>441
Pastespecial
443デフォルトの名無しさん:2012/10/09(火) 20:54:08.30
>>442
コピーペーストではそれで可能だが
配列の代入では使えないのでは?
444デフォルトの名無しさん:2012/10/09(火) 21:34:27.37
>>441
Variant変数を用いる手法ではセルの値だけしか受け渡しされない。
だから書式なども含めてコピーしたいときにはこの方法は使えない。
445デフォルトの名無しさん:2012/10/09(火) 22:28:54.53
事務処理改善でエクセルを使うようになり最近エクセルの虜状態です。
レベルはど素人並ですが、頑張ってみたいプログラムを書いてみようと思い質問させていただきます。

まず1〜5のブックに
A1に入力された日付のデータを
A2〜C6に落とす
というボタン(A)が組まれています

日付入力はブック毎に手入力だったのですが、
新規ブック(以下Aブック)を作りそこに連動して一括で日付変更できるまでは行きました。
(スライムを倒した程度のレベルです)

次に
同じようにボタン(A)もブック毎に押してデータを落としていたのですが
Aブックにボタンを設置し、そのボタンを押せば1〜5のブックのボタンが一発で押されるようにしたいです。

いろいろ調べては見ましたが知恵足らずで手詰まり状態です。
よろしくお願いします
446デフォルトの名無しさん:2012/10/09(火) 22:38:49.53
>>445
落とすって意味が理解できないけど
他のブックのマクロを実行したいってこと?ならそれでググれば答えが見つかる
447デフォルトの名無しさん:2012/10/09(火) 23:32:42.51
>>446
ありがとうございます。

試しにやってみたところ「オブジェクトが必要です」みたいなエラーが出ました

Book1のAを実行すればBook2のBが実行されるが狙いで

書いた内容は
Book1に
Sub A()
   Application.Run "Book2!B"

End Sub

です
448デフォルトの名無しさん:2012/10/09(火) 23:54:52.15
追伸追記です

現在Book1でA実行すればBook2のBがBook1で実行される状態です

狙いとしてはBook2のBをBook1のAで実行です

VBA謎すぎて熱が出そうです・・・
449デフォルトの名無しさん:2012/10/10(水) 00:31:28.07
連レス失礼します

何とか出来ました。
450デフォルトの名無しさん:2012/10/10(水) 01:17:59.55
>>435
この問題て良く使われるん?
なんかあちこちで見た覚えが
451デフォルトの名無しさん:2012/10/10(水) 02:04:12.99
>>450
フカシギの数え方という元ネタから動画サイトなどでかなり有名になった。
ほのぼのと思いきや、シリアスな内容が入ってたりとか。
452デフォルトの名無しさん:2012/10/10(水) 07:49:50.06
>>450
PC-8001mkIIのデモプログラムにも入っていたのを思い出した。
数当てゲームのような、伝統的な練習問題になってるんだろうな。
453デフォルトの名無しさん:2012/10/10(水) 07:51:57.81
VBAでこれのプログラム作って頂戴
ttp://www.youtube.com/watch?v=0hlixJsRLso
454デフォルトの名無しさん:2012/10/10(水) 08:42:56.10
予算は?
455デフォルトの名無しさん:2012/10/10(水) 11:31:14.11
ゲームそのものを作るより
解答するプログラムが良いな
456デフォルトの名無しさん:2012/10/10(水) 11:51:51.66
>>453
YouTubeは変わったのか?
実にみにくい。
画面が小さすぎるままか、最大化にするか、どちらかしかないから
小さいのは見にくいし、最大化にすると他のWindow見たり他の作業ができない。
実に困る。
457デフォルトの名無しさん:2012/10/10(水) 12:22:06.59
>>453
すでにある
「マスターマインド」でぐぐれ
458桃白白:2012/10/10(水) 12:36:45.47
>>457
ふむふむ、なるほどね、こんな作りになってるわけか、あ、マンコでぐぐってた
459デフォルトの名無しさん:2012/10/10(水) 13:19:51.02
>>457
残念。
ルールが違う。
460デフォルトの名無しさん:2012/10/10(水) 15:47:07.53
PerlからEXCEL-VBAのマクロを起動するには
http://chaichan.lolipop.jp/perlnote/perlnote2007-11-182.htm
461デフォルトの名無しさん:2012/10/11(木) 17:13:01.25
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
463デフォルトの名無しさん:2012/10/11(木) 18:10:30.76
>>461
ちなみに、そのやり方はビジーループと言って、どのプログラミング言語でもやってはいけない方法。
VBAでタイマーを使いたいなら、Application.OnTimeを使うべし。
464デフォルトの名無しさん:2012/10/11(木) 18:15:27.22
>>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
465デフォルトの名無しさん:2012/10/11(木) 18:17:10.77
>>463
よく見ろ
途中経過をセルに出したいんだよ
あとOnTimeだと秒以下が切り捨てられる
466デフォルトの名無しさん:2012/10/11(木) 18:56:59.15
>>462-465
おかげで解決しましたありがとうございます
お手を煩わせてしまいまして申し訳ありません
467デフォルトの名無しさん:2012/10/11(木) 23:15:08.83
ど素人質問ですみません

As string*16とかの
*16ってどういう意味ですか?
ググッてみたけど全文英語とかでわかりません;;
468デフォルトの名無しさん:2012/10/11(木) 23:19:49.30
↑ですが連レス失礼します
*16=16文字までってことでおkですか?
469デフォルトの名無しさん:2012/10/11(木) 23:25:10.01
>>467
質問内容中の「As string」でググったら答えがヒットするんだけど
一体どんなワードでググってるの?
470デフォルトの名無しさん:2012/10/11(木) 23:26:40.91
>>468
○ 16文字
× 16文字まで

16文字以外の文字列は入れることができない
短い文字列には自動的にスペースが足されて16文字になる
長いと勝手に切り捨てられる
471デフォルトの名無しさん:2012/10/11(木) 23:29:34.86
>>467
16文字の固定長文字列
16文字までじゃなくて、常に16文字の文字列
472デフォルトの名無しさん:2012/10/12(金) 00:14:06.27
>>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"ここだけ残せばいいんでしょうか?
473デフォルトの名無しさん:2012/10/12(金) 00:59:35.33
まず自分で試してみてから聞きましょう w
474デフォルトの名無しさん:2012/10/12(金) 11:04:56.15
>>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
>>476
したまえ。
478デフォルトの名無しさん:2012/10/12(金) 12:24:55.60
この言語の実装にはフォントを設定する必要があり、可読性の低さもあって普及には至らなかった。
479デフォルトの名無しさん:2012/10/12(金) 13:10:27.20
>>475
そんな動きしないけど、具体的にどんなデータとどんなコードで発生するの?
480デフォルトの名無しさん:2012/10/12(金) 17:41:04.54
>>479
[データ]
項目1
うんこ
しっち
ちんこ
まんこ
うんこカレー

[抽出条件]
項目1
うんこ

[結果]
うんこ
うんこカレー
481デフォルトの名無しさん:2012/10/12(金) 22:31:56.12
variant変数にデータを格納するときに特定の文字を除いて格納したい場合。
A1:A100までを配列に格納、ただしその中で「AAA」という文字は格納しない
ってやりたいですが。
482デフォルトの名無しさん:2012/10/12(金) 22:47:32.42
>461

配列にまとめて格納した後、
配列を全検索して「AAA」以外を別の配列に
入れなおせばいい。

もしくはfilter関数を使えば
指定された文字列を除いた配列が得られる。
483デフォルトの名無しさん:2012/10/13(土) 00:26:57.82
select caseの条件分岐でORは , でできるが ANDはどうやるんですか?
ググってもORしか出てこない(´・ω・`)
484デフォルトの名無しさん:2012/10/13(土) 01:03:29.65
>>480
[抽出条件]
項目1
="=うんこ"
485デフォルトの名無しさん:2012/10/13(土) 01:08:09.18
>>483
AND でやってみた?
486デフォルトの名無しさん:2012/10/13(土) 01:08:22.73
>>483
例えばどんなことがしたいの?
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
488デフォルトの名無しさん:2012/10/13(土) 02:11:52.86
>>487
お仕事でVBA使用している方ですか?
489桃白白:2012/10/13(土) 02:17:40.68
>>488
いいえ、無職でVBAを使用してない桃白白です
490デフォルトの名無しさん:2012/10/13(土) 02:23:24.17
>>489
使用してないのにそこまで書けるのですか?
すごいです・・・
491桃白白:2012/10/13(土) 02:26:58.69
>>490
はい、桃白白はすごいです、こんごともよろしくお願いします
492デフォルトの名無しさん:2012/10/13(土) 03:09:55.39
>483
select case で判定する変数は1つだからandは必要ないと思うよ。
比較するものが2つ以上ないとandは意味ないよね?
493デフォルトの名無しさん:2012/10/13(土) 04:41:01.99
>>492
Select Case True って使い方知ってるか?
494デフォルトの名無しさん:2012/10/13(土) 07:51:27.23
Select Case True
 Case (VarType(var) = vbString And var = "123")
  MsgBox "String-123"
End Select

ElseIfまんどくせな人には良いのかもしれんね。
495483: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

こういうふうになるのはわかるのですが
こんな条件ならまとめて一つの条件にできないかなと思いまして質問させていただきました
496デフォルトの名無しさん:2012/10/13(土) 08:23:55.69
先生方、Web連携や外部ファイルや外部アプリ連携が勉強できる本でお勧めなのありませんか?
497デフォルトの名無しさん:2012/10/13(土) 10:46:14.40
>>496
本じゃないけどMSDNライブラリ嫁
498デフォルトの名無しさん:2012/10/13(土) 10:52:16.13
>>495
Select Case (Left(Range("A1"), 1) & Right(Range("A1"), 1))
Case "あう", "いう"
Range("A2") = 1
End Select
499483:2012/10/13(土) 11:03:44.06
>>498
ANDを&で出来るなんて知りませんでしたありがとうございます
&って文字列くっつけるだけかと思っていました
500デフォルトの名無しさん:2012/10/13(土) 11:24:59.59
>>499
&は連結演算子ですよ…
501デフォルトの名無しさん:2012/10/13(土) 11:38:32.16
>>499
それ、文字列くっつけてる。。。
502デフォルトの名無しさん:2012/10/13(土) 11:46:19.14
>>493
知らなかった。勉強になったよ。
他人のソース見ることが多いんだけど、その書き方はif文に直したい。
503デフォルトの名無しさん:2012/10/13(土) 12:46:52.56
変数の名前について質問です。
 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 桁
見たいな事ができればいいのですが。
504503:2012/10/13(土) 12:47:49.91
ちなみに少し上に出てたフカシギの数え方を勉強のため作ろうと思ったのですが、
自分の知識が足りず、升目の数によって大量のFor loopを書き、
升目分だけsubを作成していく事しかでき無かったためです。

質問している側がエスパーを要するような内容と感じてしまう内容で申し訳ないです。
505デフォルトの名無しさん:2012/10/13(土) 14:20:49.07
>>503
よくわからんけど配列使えば解決する?
506503:2012/10/13(土) 17:00:58.75
>>505
解決するかどうかは、わたしが聞いておるのだ
507デフォルトの名無しさん:2012/10/13(土) 17:29:09.05
初歩的な質問ですが、お答えください。
指定した一つのセルの数値を返す場合はINDEXを使えば良いんですか?
508デフォルトの名無しさん:2012/10/13(土) 17:35:26.94
>>507
indexはセルを指定するために必要なものであって
数値を返すためのものじゃない
509デフォルトの名無しさん:2012/10/13(土) 17:50:50.62
>>508
なるほど・・・
わかりやすくいうと
i = ("d4")といった形でiに数値を代入したいのです。
教えていただけないでしょうか?
510デフォルトの名無しさん:2012/10/13(土) 18:38:54.11
>>509
i = 0
with thisworkbook.worksheets("sheet1")
if isnumeric(.range("d1")) then
i = .range("d1")
end if
end with
511デフォルトの名無しさん:2012/10/13(土) 18:57:29.18
>>510
ありがとうございます。
ということは、そのままそっくり代入できる関数は無いということみたいですね。
精進します。
512511:2012/10/13(土) 19:19:21.73
ごめんなさい、自己解決しました。
i = Range("d4").Value
で良かったみたいです。
難しく考えすぎてました。
513デフォルトの名無しさん:2012/10/13(土) 21:12:51.68
マクロを実行するとあるシートのA列に書いている内容を上から下まですべて
iCloudのメモ帳と同期化させたいのですが
こんなのって可能でしょうか?

もちろんネット接続している状態です
514デフォルトの名無しさん:2012/10/13(土) 22:14:39.30
天プレ読んで出直して来い
515デフォルトの名無しさん:2012/10/14(日) 03:05:16.77
可能
516デフォルトの名無しさん:2012/10/15(月) 10:06:37.37
フォームに貼り付けるボタンのサイズとか高さとかはそのプロパティのところで
変更することができるけど、シートに貼り付けるボタンのサイズを変更しようと
する場合はどうするんですかね

http://uni.2ch.net/test/read.cgi/operatex/1345250215/878代行
517デフォルトの名無しさん:2012/10/15(月) 10:33:06.72
>>516
>>1
>★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)
518デフォルトの名無しさん:2012/10/15(月) 18:17:48.43
>>517
ボタンを右クリックからコントロールの書式設定で
サイズを変更はできましたが、マクロの記録でやっても
それは出てきませんでしたが

今回はコントロールの書式設定で変更できたんでこれでよしと
しておきます

http://uni.2ch.net/test/read.cgi/operatex/1345250215/881代行
519デフォルトの名無しさん:2012/10/15(月) 20:53:03.93
現在選択しているセルの取得する場合、
どうすればいいのでしょうか?

たとえばA4:J3の場合はrange("A4:J3").valueみたいな感じで
520デフォルトの名無しさん:2012/10/15(月) 21:06:50.30
>>519
Selection.Value
521デフォルトの名無しさん:2012/10/19(金) 00:54:43.03
やりたいこと
A1からA10まで連続でネットのURLリンクがある場合
それをまとめてリンク先のホームページを開く
ですが
マクロ記録でそれをやってもセルがselectされるだけでリンク押下まではしてくれません。

教えて下しあ
522デフォルトの名無しさん:2012/10/19(金) 01:05:59.16
>>521
http://officetanaka.net/excel/vba/tips/tips42.htm

ここらに数パターン乗ってたよ
523デフォルトの名無しさん:2012/10/19(金) 03:15:26.49
VBAのIF文の条件で、日付の比較をさせたいのですが、

If Worksheets("Sheet1").Cells(row, 1) < DATE(2010,07,01) Then〜

という記述では認識されません。
どのように記述すれば良いか、アドバイスをお願いいたします。
524デフォルトの名無しさん:2012/10/19(金) 03:33:26.26
>>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>
このような文字列を作りたいです。どうやったらいいですか、教えてください。
桃白白困ってます、教えてくださいお願いします。
526デフォルトの名無しさん:2012/10/20(土) 10:15:59.85
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
529526:2012/10/20(土) 22:51:03.49
>>527
なんだかんだいってお礼はしてくれるのね・・(笑)

そういうのを仕事でつくった(htmlじゃなくってCのTableに変換)事あるんだけど、
4年位前だったんで忘れてたのでググる為の検索Keyを言っただけ。

ちなみに最近はVC++であるデータをhtlmのTableに落とすのを作っています。
530桃白白:2012/10/20(土) 22:56:32.77
>>528
Office カスタマー プレビューを入手する | Microsoft Office カスタマー プレビュー
http://www.microsoft.com/ja-jp/office/preview/try-office-preview.aspx

Office 2013のプレビュー版があったからそれインストールした。桃白白はエクセルを使えるし、
マイクロソフトは桃白白からフィードバックを受けることができるし、このスレのみんなは
桃白白がいてくれてうれしいし、大勝利の関係。
531デフォルトの名無しさん:2012/10/21(日) 02:55:20.94
532デフォルトの名無しさん:2012/10/22(月) 02:16:00.21
使ってる変数にどんな名前つけますか?
カウンタのcとか、boolでfとか、IE だからobjieとかはなんとなく使うけど、モジュール内がややこしくなってくると、
わけわからんどうしよう..って感じになってくる\(^o^)/

とくにグローバル変数も使う時とかどうしよ...

センスある命名おしえて下さい。
533デフォルトの名無しさん:2012/10/22(月) 02:26:51.66
名前長をケチらない。意味不になる位なら日本語名を付けてしまえ。
自分はこんな感じでやってる。
534デフォルトの名無しさん:2012/10/22(月) 02:27:17.10
迷うときは日本語で良いんだよ
535デフォルトの名無しさん:2012/10/22(月) 02:27:47.50
おっとかぶた。
536デフォルトの名無しさん:2012/10/22(月) 02:45:17.83
確かにその方がいいかもしれない、コメントとかはバリバリ日本語で書くくせに、コードの記述は、日本語入れると動作に悪影響かも...とか考えて頑なにアルファベット使ってるとか俺あほや。\(^o^)/

でも変数名とか上手く使いこなすと上級者っぽいじゃんw

なるほどInt の C か...(キリッ!) みたいな。

537デフォルトの名無しさん:2012/10/22(月) 02:51:55.64
4文字熟語とかを変数に使うと上級者っぽいぞ。
上級のベクトルが一致してるかは知らんが。

驚天動地 = 国士無双 + 神出鬼没

中二っぽくてよい。
538デフォルトの名無しさん:2012/10/22(月) 02:55:41.75
自分だけが読める感ですかね、よくないと思いつつ、その気持ちわかります///

私用のexcelベースのアプリ作ってるんだけど、アプリ名なんか中二すぎて人に言えない///
539デフォルトの名無しさん:2012/10/22(月) 03:06:13.69
エクセルのバージョン変わったときだったかな、
変数名がセルのアドレスとイコールでエラー出たことあったけど、
どこにも情報出てなくて、またメッセージも皆目掴めずで困ったときあったなぁ。

確かアルファべット3文字+数字みたいな変数名を旧バージョンで使ってて、
バージョンアップ後、エクセルの仕様で列数変わって
セル範囲内になっちゃってエラーになった。とかだったかな。
540デフォルトの名無しさん:2012/10/22(月) 03:11:57.75
そんな事があるんですね、覚えとこう。

常用してる変数名だと置き換え作業だけで発狂しそう../(^o^)\

変数名って手ぐせと同じで、使いぐせついちゃいません?


541デフォルトの名無しさん:2012/10/22(月) 03:18:25.27
ここはお前の日記帳か?
542デフォルトの名無しさん:2012/10/22(月) 03:45:07.08
続きはチラ裏でやりますw
レス下さった方、参考になりました。
ありがとうございます。
543デフォルトの名無しさん:2012/10/22(月) 04:21:23.51
>>532
日本人は英語に弱い人が多いから
特に他人に公開するソースで意味のわからない英語、
タイプしづらい英語を使うとよろしくない。
この前どっかで見たソースで、added_dataみたいな変数名を見かけたが
dが大杉でタイプミスしまくりでお話にならなかった。
ad_dataくらいでいいだろうよ。
544デフォルトの名無しさん:2012/10/22(月) 04:43:36.38
キーボードに弱いんですねw
そんなんコード補完つかうでしょ
545デフォルトの名無しさん:2012/10/22(月) 20:31:34.46
>543の言いたい事はわかるが、>543の内容だけを見ると
>543の頭が弱くてお話にならない感じだな。
546デフォルトの名無しさん:2012/10/22(月) 21:21:40.45
541=544=545
547デフォルトの名無しさん:2012/10/23(火) 01:00:45.00
一応MSにガイドラインというかこうするとイインジャネ?みたいなの有るよ
型3文字+内容を端的に表した単語、みたいな。
文字列ならstrTitleとか数値ならintCountてな感じで
MSのサンプルコードは大概そんな感じになってる
548デフォルトの名無しさん:2012/10/23(火) 07:00:05.91
ハンガリアン記法ってやつでしょ
549337 :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
550デフォルトの名無しさん:2012/10/23(火) 22:19:53.51
>>549
限界については明文化されてないと思うけど、
ワークシートに大量のオブジェクト(画像など)を貼るとフリーズするのはまれによくある

64bit版だと多少はマシになる
551337 :2012/10/23(火) 22:45:54.31
明日DoEventsで確認しみます。
552デフォルトの名無しさん:2012/10/23(火) 22:53:23.67
>>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行程度の場合
スピードを考えると上記のほうがいいのかなと
555Go!Go!!Go!!!:2012/10/24(水) 20:20:08.18
>>553
可能
556デフォルトの名無しさん:2012/10/24(水) 20:21:39.17
>>553
正規表現使え
557デフォルトの名無しさん:2012/10/24(水) 20:24:39.25
せ・・・・性器表現?
558デフォルトの名無しさん:2012/10/24(水) 21:09:24.61
>>553はわかりました
554は可能でしょうか?
559デフォルトの名無しさん:2012/10/24(水) 21:16:43.37
そんなおもしろ関数を作ればいいんじゃないでしょうか?
560デフォルトの名無しさん:2012/10/24(水) 21:25:53.90
>>554
スピードを考えるなら実行すればいいじゃん。
あおりとかじゃなくて、普通にその質問レス書く間で
両方実行してどっちが早いか見るだけでは?

ちなみに前者も、除く行を一個一個探す必要があると思うが・・
561デフォルトの名無しさん:2012/10/24(水) 21:26:05.93
>>558
スピードが重要ならスピードを重視すればいいと思うけど?
可能でしょうか?って質問がなんなのかよくわからん
562デフォルトの名無しさん:2012/10/24(水) 21:29:19.65
質問者って巧い奴とそうでない奴が居るよな
(回答を得やすい質問の仕方という意味で)
563デフォルトの名無しさん:2012/10/24(水) 21:34:15.22
相手に伝わるように質問できるような人ならハナから自分でググって解決できるよ
ここそうじゃない人のためのスレなんだから
エスパー能力を試したりラリーを楽しんだりすればいいんだよ
564デフォルトの名無しさん:2012/10/25(木) 01:14:35.03
ま、どっちが良いかなとかこれで出来ますか的なやつは
実行環境にも左右されるし、実際にやってみた方が早いし確実
565桃白白:2012/10/25(木) 13:25:39.49
こんにちは、桃白白です。
http://uploda.cc/img/img5088bd2d83be1.png
画像のように選択した範囲から次のような文字列を作りたいです。
A1
├A2
B1
└B2
 ├B3
 │├B4
 │└B5
 B6
どうやればいいですか?難しくて頭が爆発しそうです。教えてください。
566デフォルトの名無しさん:2012/10/25(木) 14:04:41.15
>>565
パターンを洗い出してそれに当てはめれば?
567桃白白:2012/10/25(木) 14:13:34.19
>>566
え、わかんなーい、桃白白わかんなーい、もっと詳しく教えて、どうやるの?
桃白白の頭が爆発しそうなんです。
568デフォルトの名無しさん:2012/10/25(木) 14:29:36.81
>>565
B5はB3にぶら下がってるけどB6はB1にぶら下がらないんだよね?
文字列を作るルールを第三者に伝わるように説明できないと回答貰うのは難しいと思うよ
まあじゃれてるだけなんだろうけど
569桃白白:2012/10/25(木) 14:47:09.62
>>568
とにかくさ、階層構造にしたいんだよね、じゃあ逆に聞くけどどうしたらいい?
どういう文字列にしたらいいと思う?
570デフォルトの名無しさん:2012/10/25(木) 20:19:37.77
>>569
この階層構造は既存のフォルダ構成をエクセルで作ろうとしてるのかな?
既存のフォルダ構成を階層構造にしたいのであれば、DOSコマンドのtreeコマンドを使う方法があるけど。

因みに俺は>>568じゃない。
571デフォルトの名無しさん:2012/10/25(木) 21:12:20.76
>>565
考えてみたけど、ルールが絞り込めない…?
列ごとに上から1セルずつ調べてって、文字列が書いてあるセルが
上と下にあったらその間を全部「│」にする、
文字列が書いてあるセルが上にあって右隣にあったら「└」にする、
「└」があるセルの上、及び右隣に文字列が書いてあったら「├」にする、とか
こんな感じでいけるとおもうんだけど。あるいはこういう風な記述の組み合わせで。

必ず「└」を一発ズバリで判定して書かなきゃいけないわけでもない。
最初「└」を入れた(洗い出した)セルを後で(さらに洗い出して)「├」に書き換えてもいい。

それとAとBで処理を別枠にして回して(A1:D2とA3:D8)、あとから
A1、B1の入っている左列だけは別処理で書き換える必要がでてくる?と思った。

実際に組んでないから苦情は受け付けられない!
572デフォルトの名無しさん:2012/10/25(木) 21:26:33.89
A1
├A2
B1
├B2
│└B3
│ ├B4
│ └B5
└B6

だったらそんなに難しくなさそうだけどなあ
573デフォルトの名無しさん:2012/10/25(木) 21:39:21.07
A1
├A2
B1
└B2
 ├B3
 │├B4
 │B5
 B6
が正解では?
574デフォルトの名無しさん:2012/10/25(木) 21:43:55.08
ルール通りなら
こうだね

A1
├A2
B1
└B2
 ├B3
 │└B4
 │ │
 │ B5
 B6
575デフォルトの名無しさん:2012/10/25(木) 22:28:45.18
>>574
質問者はルールなんて提示してないけど?
576デフォルトの名無しさん:2012/10/25(木) 23:37:08.45
文字だけ追ってスクリーンショット見てない人は見た方がいいんじゃない?
577デフォルトの名無しさん:2012/10/25(木) 23:42:12.53
Excelの質問でもないし、VBAの質問でもないんだから、いい加減スルーしろアホ共
578デフォルトの名無しさん:2012/10/26(金) 00:57:32.90
ぶっちゃけフォルダツリーだってのならこうだよなと思った
root
├A1
│└A2
└B1
 ├B2
 │└B3
 │ ├B4
 │ └B5
 └B6
579デフォルトの名無しさん:2012/10/26(金) 02:14:32.92
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 に新規のセル値を代入するマクロです。

ここで、間違いはありますか?
デバッグはスル―なのですが、想定通りの実行結果が得られません。
それとも、他の部分の間違いでしょうか?
581デフォルトの名無しさん:2012/10/26(金) 08:45:37.28
罫線をもう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の初期値が違うんじゃね?
583デフォルトの名無しさん:2012/10/26(金) 09:53:02.26
Excel2003(11.6560.6568)SP2で、VBAの途中でデバッグかかってとまるようになった
ブレークポイントはもちろん設定してない

ただ、前に一度ctrl breakでとめたら、その場所記憶したみたいで、なにしてもそこで止まるようになった。エラーじゃない。

他のPC(EXCEL2003だけどSP2じゃない)からだと止まんないでふつうに走る

こういう不具合出たことあるひといる?バグなのかな?
584580: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列の値を判定フラグにしたかったのです。
585デフォルトの名無しさん:2012/10/26(金) 13:50:35.71
>>584
ステップ実行で各変数の値をウォッチしてみたら?
期待通りに動かない可能性なんて山ほどあるのでエスパーしきれない
586桃白白:2012/10/26(金) 13:57:01.86
>>584
じゃあ>>580は間違ってないんじゃね、列は違うだろうけど。
想定通りじゃなかったというのはどういうこと?どうなったの?
587デフォルトの名無しさん:2012/10/26(金) 13:59:24.96
>>580
まず、やりたいことを日本語で書け。
で、何が期待したどうさと違うのかを日本語で書け。
あと「判定フラグ」とかいう、プログラミング用語っぽい単語は使うな。
588580:2012/10/26(金) 15:30:46.83
色々有難うございます
ステップ実行で値をウォッチを言う機能があるのですね。
もうちょっと、自分でも粘って考えてみます。

実はhanteiをフラグにして処理をIFで変化させるVBAにするつもりだったのです。
589デフォルトの名無しさん:2012/10/26(金) 15:59:32.57
>>588
> 実はhanteiをフラグにして処理をIFで変化させるVBAにするつもりだったのです。
あのねぇ、これは「手段」と言うの。
目的を書け。
590デフォルトの名無しさん:2012/10/26(金) 19:21:43.14
>>580
間違いはありません。あなたのプログラムした通り動きます
それがあなたの希望通りかは、あなたの希望が解らないので判断できません

とりあえず、
Doループ入ってすぐCells(Posgyou, Posretu) の比較してるけど、行も列もそのままだから、必ずThen側実行するぞ?

なんの修飾もなしにCellsつかってるけど、どのシートのセルみてるか解らんぞ

それ以外は概ね>584の動作してるぞ
591デフォルトの名無しさん:2012/10/26(金) 19:47:18.96
>>583
ノシ
リアルタイムで出るよ。
7@64bit のマシンで excel2000 2003 ともに出る。
会社PCで作ってなんら問題なく実行できていたものも、
この環境じゃとまったりする。

例えば
msgbox "a"
range("a1").select

これでも時折セレクトでエラーハッスル。
もちろんなんら材料があるわけないので、
エラー(デバッグ応答)時にそのまま続けて実行すると、普通に抜ける。

何回同じマクロを同じ環境でやっても、
出たり出なかったりするんだけど、出るときはかなりの頻度だよね。

まぁ自分も調べに掛かったけど、ヒットしなかったから放置している。
ブレークを解除しろとかよく見つかるけど、してねぇよ。ってな。
592デフォルトの名無しさん:2012/10/26(金) 20:12:25.45
ブレークポイントじゃなくてウォッチ式でも入ってるんじゃね
593デフォルトの名無しさん:2012/10/26(金) 20:18:13.98
Debug.Assert(0)
594デフォルトの名無しさん:2012/10/26(金) 22:43:50.68
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
595デフォルトの名無しさん:2012/10/26(金) 23:12:03.13
>>594
無限印刷ってなに?
一般的な用語使わないと伝わらないよ
とりあえずロジックの問題か印刷の問題かぐらい切り分けしたら?
596デフォルトの名無しさん:2012/10/26(金) 23:17:46.91
>>595
開始番号1、終了番号10と入力しても10で終わらずずっと印刷され続けます。
loop関数が無限ループになってしまってるのではと思うのですが解決法が解らず。
597デフォルトの名無しさん:2012/10/26(金) 23:24:26.06
http://www.uproda.net/down/uproda512919.zip.html

※「Hnn(年度)」…平成(nn-1)年4月〜平成nn年3月
※「中之島」「渡辺橋」「大江橋」「なにわ橋」…「H21」10月の[総数]は日割り(13/31日) 。
※「大阪難波」「桜川」「ドーム前」「九条」…「H21」3月の[総数]は日割り(12/31日) 。
※「総数」…「H18」の7月以降及び年度平均はOTS線を除いた数値となっている。

平成23年4月〜平成24年8月
http://www.city.osaka.lg.jp/keikakuchosei/page/0000020916.html
[2012年10月25日]
http://www.city.osaka.lg.jp/keikakuchosei/cmsfiles/contents/0000020/20916/6-2.xls

平成23年3月〜平成13年4月
http://www.city.osaka.lg.jp/keikakuchosei/page/0000164566.html
[2012年4月18日]
http://www.city.osaka.lg.jp/keikakuchosei/cmsfiles/contents/0000164/164566/12-8.xls
598デフォルトの名無しさん:2012/10/26(金) 23:55:13.91
>>594
とりあえず
Sub 印刷() の次に
Dim a As Integer, z As Integer
の1行入れろ

InputBoxにIntegerにならない文字列入れたときは知らん
599デフォルトの名無しさん:2012/10/27(土) 00:00:13.38
>>596
ロジックの問題か印刷の問題かぐらい切り分けしたら?
って言ってるのになんでやらないの?
600デフォルトの名無しさん:2012/10/27(土) 00:03:07.83
数値の終了条件に=を使うやつは素人。
601デフォルトの名無しさん:2012/10/27(土) 00:14:24.40
>>599
お前こそ素人に分かる一般的な用語で説明してやれよw
602デフォルトの名無しさん:2012/10/27(土) 00:15:30.29
あの終了条件が数値だと思ってるならもっと素人
603デフォルトの名無しさん:2012/10/27(土) 00:30:40.74
>>598
出来ました、有難う御座いました。
小さい会社でマクロのマの字も知らず無茶振りされ、
ネットで探した式もまともに動かず途方にくれておりました。

>>599
すみません、ロジックか印刷かという文面が良く解りませんでした。
印刷の問題はプリンタの会社に電話するものではないのでしょうか。
604デフォルトの名無しさん:2012/10/27(土) 06:24:14.33
>>603
もしも今回のような無茶振り?がまだ続くようなら
一回本買って、VBAの勉強した方がいいよ
基礎の基礎の部分からわけわからんままやってるだろ
VBAどころかプログラムの根本が分かってない感じ
605デフォルトの名無しさん:2012/10/27(土) 08:02:55.62
プログラムの根本なら俺が教えてやるから聞きにこいよ
606デフォルトの名無しさん:2012/10/27(土) 08:13:19.97
たまに来る程度の無茶振りなら勉強するより聞いた方が効率は良いだろう。
専門外の事だ→勉強しなきゃ の思考回路は社畜に陥りやすい
607桃白白:2012/10/27(土) 09:15:49.89
みなさんおはようございます、桃白白です。
>>570-579, >>581
ありがとうございます。
root
├A1
│└A2
└B1
 ├B2
 │└B3
 │ ├B4
 │ └B5
 └B6
ご提案いただいたこの形式にしたいと思います。桃白白はこれに決めました。
この文字列を作りたいという強い思いが桃白白の胸にありますが、問題はプログラムだと思います。
それが問題だと桃白白は認識しています。みなさんならどのように実装しますか?教えてください、お願いします。
608デフォルトの名無しさん:2012/10/27(土) 10:56:27.67
>>607
これは業者にお金払って開発してもらうレベルの案件。
通りすがりの俺らでは無理。
609デフォルトの名無しさん:2012/10/27(土) 11:07:50.08
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)についても同様の処理。
ってのを順番に繰り返せば良いんでない?
同じ処理の繰り返しになるから再帰処理で書けばコードはだいぶ短くなると思う。
610デフォルトの名無しさん:2012/10/27(土) 11:42:41.96
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
桃白白にお金があれば業者の可愛い女性の担当者にお家に来てもらって、
ところで桃白白さんイケメンですよね、もてるんじゃないですか?いやそんなことないですよ・・・むぎゅ、
みたいな展開も期待したいところだけど、残念ながら桃白白お金ないから無理
612デフォルトの名無しさん:2012/10/27(土) 12:50:02.94
皆さんならどのようにとかじゃねぇ
もう作れるだろ作ればいい
多少ソースが汚かろうが思い通りに動けばいいだろ
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は間違った
グローバル変数じゃない
深渡は呼ぶ側で引渡し、呼ばれた方でインクリメントする
616デフォルトの名無しさん:2012/10/27(土) 15:01:59.17
>>611
金なくても自画撮写真くらいうpできるだろ
617デフォルトの名無しさん:2012/10/27(土) 15:15:50.88
いずれにしても、セルに配置した文字のツリー表示なんてのを
ExcelのVBAでやることに何の意味があるのか不明だし
誰もコードを出さないところから見ても面倒なことは間違いないし
この話題はここで終わりとしよう。
618デフォルトの名無しさん:2012/10/27(土) 15:25:24.44
>名前:桃白白
この時点でネタ確定なんだからスルーしておけばいい
619デフォルトの名無しさん:2012/10/27(土) 15:34:56.90
>>617
超初級の練習問題レベルだし
別に面倒じゃないけど
やる気が起こらない
なにかやる気スイッチ押してくれればやるお
620桃白白:2012/10/27(土) 15:42:03.09
>>618
心外、桃白白マジ心外。

>>619
(  ̄∇ ̄)σ=σ[]ピンポン!!ピンポン!!ピンポン!!ピンポン!!

>>609
読んだから、桃白白ちゃんと読んだから。
いま桃白白のタマムシ色の脳細胞で考えているところだから。
621デフォルトの名無しさん:2012/10/27(土) 15:44:08.32
>610 で答え出てたんだな
622デフォルトの名無しさん:2012/10/27(土) 17:02:58.90
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がアクティブシートじゃないから
列が見当たりませんぜ的なことなんじゃね。
624デフォルトの名無しさん:2012/10/27(土) 17:58:05.71
VBAのクラスモジュールで質問があります。
JAVAで言う、ThisやSuperのようなものは無いのでしょうか
625デフォルトの名無しさん:2012/10/27(土) 18:11:54.50
無いのです
626デフォルトの名無しさん:2012/10/27(土) 18:38:44.00
>>623
分からないんだったら回答すんなよ。
回答するんだったら裏くらい取れよ。
自分の問題さえも解決できないのに、他人の問題に口出しすんな。
話がややこしくなるだけ。

質問している人や質問の内容に対して回答している人に対して大変失礼。
627桃白白:2012/10/27(土) 18:45:00.84
>>626
反証あるの?ないんだったらお前が黙ってろ。
628デフォルトの名無しさん:2012/10/27(土) 18:52:42.10
>>桃白白
反証云々は関係ないんだよ。
質問者に対してこうなんじゃね?っていうこと自体問題が理解できていないこと。
推測なんて意味無いからw

知ったかもいい加減にしとけ。
ようは何も分かってないんでしょwwwww
629桃白白:2012/10/27(土) 18:59:41.40
>>628
桃白白は回答するのに客観的ソースは必ずしも提示する必要はないと思ってるわけ。
だから思いついたままに回答するわけ。でもお前は裏を取って回答するべきだと思ってるわけだろ。
桃白白が何もわかってないことの根拠がないじゃん。何もわかってないんでしょってお前は桃白白に
聞いちゃってんじゃん。桃白白はそれで問題ないという立場だけれどもお前は違うわけだから
お前は自爆してるだけじゃん。ようはお前は桃白白に嫉妬してるだけだってこと。質問に答えるどころか
桃白白に絡んでるだけじゃん。
630デフォルトの名無しさん:2012/10/27(土) 19:04:44.56
>>625
ありがとござます。どこかでMYみたいなものを見たけど違うものだったか
631デフォルトの名無しさん:2012/10/27(土) 19:09:26.00
632デフォルトの名無しさん:2012/10/27(土) 19:13:47.12
>>桃白白
思いついたまま回答されることほど質問者に対して失礼。
この時点で質問に対してきちんと理解しないで回答してるってこと。
お前に対して凄い迷惑と思うことはあるけど、嫉妬なんてしたことないw

だってきちんと回答できてないんだもんwwww
お前の回答は百害あって一利なし。
633622:2012/10/27(土) 19:15:19.85
ご回答ありがとうございます。
確かにアクティブシートを変えると引っかかる所が変わる気がします。
しかしながら、オブジェクトの指定方法というのが分かりません、自分なりにこうではないかと、
634622: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
637デフォルトの名無しさん:2012/10/27(土) 19:35:56.91
>>636
Withステートメントくらい使えよボケ!
638622:2012/10/27(土) 19:41:04.37
>>636
おお、いけました。ありがとうございます。
2日程悩まされていました。
639デフォルトの名無しさん:2012/10/27(土) 20:17:23.98
http://www.atmarkit.co.jp/fdotnet/dotnettips/591mp3tags/mp3tags.html
こんなmp3ファイル一覧の取得の際に、ファイル名以外に
タイトル、サイズ、ジャンルなどを一緒に取得したいです

VBやC#ではできるみたいなのですが
VBAでは可能なんでしょうか?
いろいろ設定が必要な気がしますが
640デフォルトの名無しさん:2012/10/27(土) 20:56:14.84
>>637
>>636でWith使っても大して意味ない気がする
Sheet1かSheet2のどっちかしか括れないでしょ。
641622:2012/10/27(土) 21:08:25.81
>>640に便乗で質問ですが、
withステートメントでまとめようとしても片方しか出来ません。
変数で受け渡して一応出来たのですが、もう少しスマートな方法はあるでしょうか。
642622: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
643デフォルトの名無しさん:2012/10/27(土) 21:25:50.81
>>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

これだけでいける
644デフォルトの名無しさん:2012/10/27(土) 21:34:38.30
>>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
645デフォルトの名無しさん:2012/10/27(土) 21:38:43.39
>>643>>644のあわせ技で
Dim I As Long
For I = 1 to 2
Worksheets("Sheet1").Columns(I) = Worksheets("Sheet1").Columns(I)
Next I
646645: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
648622:2012/10/27(土) 22:02:01.29
>>643->>646
ご回答ありがとうございます。いろいろな書き方がありますね。
微妙に不規則に左右に連続して同じような式を書くことがあります。
649622:2012/10/27(土) 22:04:05.75
>>648の続き
sheet1.Range("A1")=sheet2.("B3")
sheet1.Range("C5")=sheet2.("D4")
・・・・
この場合はやはり>>643がベストですかね。
そうなると普通に書いた方がいいかなと思ってしまいます。
650デフォルトの名無しさん:2012/10/27(土) 22:17:32.39
>>647
pをStaticにしろ
651デフォルトの名無しさん:2012/10/27(土) 22:25:03.71
>>639
可能
652643: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で書いておくといろいろと捗る場合が多いよ。
653デフォルトの名無しさん:2012/10/27(土) 22:37:07.35
>>650
それだと再び実行したときにpが100から始まってしまいませんか?
今手元にプログラムがなくて、すぐに確認できないのですが、
たしか試してプログラムが終了しても値が保持された気がします。
654622:2012/10/27(土) 22:40:05.66
>>652
今までは
with sheet1.
Range("A1")=sheet2.("B3")
Range("C5")=sheet2.("D4")
end with
としていましたが、右の部分もwithでまとめたいなというのが元なのですが、>>644の方が良いでしょうか。
655デフォルトの名無しさん:2012/10/27(土) 22:41:40.29
>>647
なんでB内で宣言をするようなスマートじゃない方法を採ろうと思うの?
656622:2012/10/27(土) 22:42:36.50
すいません。
with sheet1.
Range("A1")=sheet2.Range("B3")
Range("C5")=sheet2.Range("D4")
end with
ですね。
657643: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を使うより有効だと思います。
658622:2012/10/27(土) 23:44:27.94
>>657
ありがとうございます。
この例は聞きやすいように短くしたのですが、どちらにしても、右と左を端的にwithでまとめる方法はないという事ですね。
場合によって変数を使っていくようにします。
659643:2012/10/28(日) 00:09:37.35
>>658
Withでまとめられない場合、変数名を短くするのも有効な手だと思いますよ。
たとえば、
Dim sheet1 As Worksheet

Dim sh1 As Worksheet
にすればコードが若干短くできますよね。
あんまり短い変数名だと可読性が下がるんでやりすぎは拙いですけど、
Workbook型ならWBで、Worksheet型ならSH、とか
自分なりの命名則を決めておくと効率が良いです。
(ちなみに私は変数名には大文字使ってます。そのほうがタイプミスが分かりやすいんで)
まぁ、自分ひとりでやる作業じゃないなら職場全体とかプロジェクト全体とかで意思統一を計る必要が有りますけど
そういう職場ならすでに何らかのルールが決められてるでしょうからそれに従うって事で。
660デフォルトの名無しさん:2012/10/28(日) 00:29:57.38
>ちなみに私は変数名には大文字使ってます

さすがにその個人的ルールは特殊すぎるので公の場で紹介しない方がいいと思う
特に初心者が多いこのスレではなおさら
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
662デフォルトの名無しさん:2012/10/28(日) 09:07:19.90
>>634
そもそも広い範囲ならコピーするのが妥当だがそのスタイルならResize使えば変数は要らん
Sheet1.Cells.Resize(,2).Value = Sheet2.Cells.Resize(,2).Value
広い範囲の配列を代入するのは馬鹿げているが
663デフォルトの名無しさん:2012/10/28(日) 10:58:26.42
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

こんな感じの写真挿入のマクロがあるのですが、メールでファイル添付するときにマクロを外して送りたいのですが、送る方法ってありますか?
送る際相手方がマクロのないファイルを欲しいそうなので、困っております。もし、マクロを外した場合解除されてしまう時は、他にマクロを使わずに効率的ないい方法はないでしょうか?数百枚の写真を貼り付けるので、いい方法があればお願いします。
664デフォルトの名無しさん:2012/10/28(日) 12:36:57.54
>>663
エクスポートするなりして別のファイルとして送ればいい
665デフォルトの名無しさん:2012/10/28(日) 12:52:28.23
やはり、マクロを解除してしまうと、画像のサイズも解除されてしまう感じですかー・・
666デフォルトの名無しさん:2012/10/28(日) 13:11:33.32
相手方はマクロで実装してある機能そのものが欲しいの?
それとも写真が貼り付けられた完成品があればいいの?

前者は無理な注文、後者なら写真貼ってマクロ消して送ればいいだけだし、
一体、何を悩んでるのだろうか。
667デフォルトの名無しさん:2012/10/28(日) 13:57:56.02
>>663
関係ないけどそのUIで数百枚の写真を貼り付けるのはものすごく大変そうだな
668桃白白:2012/10/28(日) 15:29:00.34
>>609
できた、できました。桃白白マジヤッホー。ありがとうございました。
https://friendpaste.com/j4GDQaQsbkxeX8r2MoqWe
669デフォルトの名無しさん:2012/10/28(日) 15:32:35.09
>>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
670デフォルトの名無しさん:2012/10/28(日) 17:47:00.87
>>683
マクロの中身の問題というよりは取り扱いの問題だと思う。

・相手がマクロを無効にする設定にする
・写真を貼り付けて完成品にしたファイルからマクロを消して送る。
またはそれを目的にマクロに手を加える。
マクロを記述したSheet1と貼り付ける目的のSheet2を作って、完成後のSheet2だけを
新規Excelファイルとして保存するように作業手順を改めるとか。
・あなたが今与えられている環境があなたの自由に出来るのなら、
Excelテンプレートとしてマクロを記述、必要なファイルを開いた時に
そのマクロが作動するようにする、とかもできるはず。

写真を何枚か貼ってリサイズして作ったシートからマクロを除去しても、
既に貼られてリサイズされてる写真が勝手に大きさが変わるってことは考えにくい。
試してみた?
671デフォルトの名無しさん:2012/10/28(日) 18:18:01.29
仕事でファイルを送信する際マクロの使ったものはだめという規則があるらしく、なんとか効率化できないかと思ったのですが、、、
とりあえず、マクロの入ったものはNGだそうで、困ってる形です。
完成品でマクロを貼り付けたシート内を削除したのですが、マクロがある形になってしまいました。
672デフォルトの名無しさん:2012/10/28(日) 18:57:20.17
>>671
効率化?何を効率化したいの?
困ってるとか困ってないとかそんな情報役に立たない
ブックに記述されたVBAコードの削除方法が知りたいのかな
わからないならzipとかで圧縮して送っちゃえばいいんじゃね?
673デフォルトの名無しさん:2012/10/28(日) 19:06:51.51
マクロの記述が出来るのに削除が出来ないとか、
いくらなんでも釣り針が大きすぎるだろ・・・
674デフォルトの名無しさん:2012/10/28(日) 19:11:43.77
>>671
「excelからマクロを削除」でググるとか?
675デフォルトの名無しさん:2012/10/28(日) 19:13:41.14
>>671
そういう場合は標準モジュールにマクロを書くのがおすすめ。
その標準モジュールをエクスポート(basファイル)した後に解放すれば、マクロのないブックになる。

再度同じマクロを使いたい場合は、エクスポートしたbasファイルをインポートして使う。
因みに標準モジュールが分からないということならググれ。
676デフォルトの名無しさん:2012/10/28(日) 19:15:28.58
おお!ありがとうございます。
マクロを完全に削除することができました。
まだ、本で学んで日が浅く、少しづつ触っているのですがとても助かりました。
今回は助けていただき、ありがとうございました。
677デフォルトの名無しさん:2012/10/29(月) 00:25:39.39
質問です。
A1からA50にランダムに"☆"が入っています。ここから☆が入っていないセルを18コ、☆が入っているセルを2コ、計20コのセルを選ぶにはどうすればよいですか?
ただし、選ぶセルはどれも行が連続せず、また、☆は少なくとも2コ以上あり、☆が多すぎて☆の入っていないセルが18コ選べない場合は☆を3コ以上選び、必ず計20コのセルを選択するものとします。
678デフォルトの名無しさん:2012/10/29(月) 00:42:02.21
それが何の役に立つの?
679デフォルトの名無しさん:2012/10/29(月) 01:12:47.30
>>677
課題かなんか?

☆が入ってないセルを調べて配列Aにいれとく
☆が入っているセルを調べて配列Bにいれとく
配列に入れる直前に特殊条件(行が連続しないとか)に該当するものを入れないようにする

☆の入っているセルを2個、配列Bから選んで抽出
引数Cを用意して最初に20をいれ、抽出するごとに1減算(この時点で18)
☆の入ってないセルを配列Aから選んで抽出
引数Cは抽出するごとに1減算を続ける、変数Cが0になれば終了
引数Cが0に満たなかった場合は、☆の入っているセルを配列Bから選んで抽出
引数Cが0になったら抽出は終了

必要ならrndでランダムな数字をだしてそれに従うようにする
その場合既に選択済みのセルを再度選択しないよう、抽出する時に
配列上から順に全部チェック,も追加。

適当。抽出方法はお任せ。
680デフォルトの名無しさん:2012/10/29(月) 01:40:08.96
VBA関係ない、プログラム以前のアルゴリズムの問題

まず2個の☆を選ぶくみ合わせをしらべて、その状態で18個の空白を選択できるか調べないとダメじゃね
全部の星2個選ぶ組み合わせで順次チェックして、それがOKならそれを出力して終了

全部の星2個選ぶ組み合わせで空白18個が不可能ならどうするかは、選択の優先順位考えないとだめだな
まあ、星三つでやって、だめなら星4つ....って順次増やすのが妥当か
681デフォルトの名無しさん:2012/10/29(月) 08:32:28.26
>>676
個人的にはマクロ用のブックを一つ作る。
使うときはマクロ用のブックを起動。
画像編集用のファイル名、挿入する画像のフォルダ又はファイル名を指定しマクロ実行かな。

basファイルを使うやり方は元のファイルを手で触る必要があるし、マクロの解放忘れとか問題が出そう。
682デフォルトの名無しさん:2012/10/29(月) 12:24:43.96
Pivotテーブル内に対する条件付き書式で
「値が表示されているすべてのセル」を指定したいのですが、
VBAで指定する(新たに作成する)方法はあるでしょうか?
683デフォルトの名無しさん:2012/10/29(月) 15:01:36.19
>>679
☆が連続した行に入ってる場合とかどうすればいい?

というか具体的に質問してるわけだし誰か完璧なコード書いてくれないか?
684デフォルトの名無しさん:2012/10/29(月) 15:04:19.88
出力は隣の列に増やしてく感じでお願いします
685桃白白:2012/10/29(月) 17:56:28.29
>>683
たおぱいぱーい・・・・・・はーい!!

>>679とか>>680とか見ると超難しそう。
それが桃白白の感想です。以上です。
686デフォルトの名無しさん:2012/10/29(月) 19:30:31.05
>>683
完璧な仕様書いてないのに
完璧なコードを出せるわけないじゃない
諦めて自分で作れ
ヒントは出てんだから
687デフォルトの名無しさん:2012/10/29(月) 20:08:13.17
そもそも>>1★5にもある通り、ここは丸投げの制作依頼所ではなく
ヒントを貰って自分で書くって人がヒントを貰いに来る場だからな
688デフォルトの名無しさん:2012/10/29(月) 21:21:38.29
何度も言うが>>1のテンプレは誰かが勝手に作った物で、厳密に守る必要なんかない
元々、答えたいやつ、作りたいやつは勝手にすればいいってスレだから
689デフォルトの名無しさん:2012/10/29(月) 21:47:53.08
アルゴリズムこそブログラミングの醍醐味。
もっと語ろうぜや。
690デフォルトの名無しさん:2012/10/29(月) 21:49:08.13
質問スレなんだから、助け合いの場として使えばいいとおもうけどな。
まー仕事とかですぐ使うような人のはすぐ答えてもいい気はする
691デフォルトの名無しさん:2012/10/29(月) 21:49:41.93
おれ的には後で除外するのが手っ取り早いと思うが、どうだろう?
692デフォルトの名無しさん:2012/10/29(月) 21:51:00.15
>>689
同意。
あなたはすばらしい。

ところでExcelVBAを使って野球シミュレーションを作りたいのですが
アルゴリズムはどうすればいいですか?
ボールの移動のようなアクション部分は一切排除して、
各選手の能力値(野手なら長打力とかミート力や総力や守備力などなど、投手なら球速や切れやスタミナなどなど)を設定しておき
結果は「ヒット」「三振」「ホームラン」「内野ゴロ」みたいにテキストで出るだけ、というところから始めよう。
693デフォルトの名無しさん:2012/10/29(月) 21:53:39.59
677に答えられないからって話を逸らすヤツ…Orz
694692: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
695デフォルトの名無しさん:2012/10/29(月) 22:08:19.09
もちろん自分で叩き台は用意するんだろうな?
696デフォルトの名無しさん:2012/10/29(月) 22:20:40.15
みんなーExcelは表計算ソフトだからなー
VBAも自ずとExcelの主な使途である事務処理の
支援・自動化のために使うべきものであって
☆を選ぶとか野球シミュレーションとか
そんなのなんでExcelでやるんだよって突っ込みたくなる
テーマはスレ違いだと思うぞー
697デフォルトの名無しさん:2012/10/29(月) 22:31:38.18
>>688
>>1はスレ主である。
>>1のテンプレが嫌なら自分でスレくらい立てろ。
テンプレ無視だったらどんな話題でもOKになるというのが分からないみたいだね。

何事にもルールがあってそれが嫌なら自分で作ればいいだけのこと。
スレ立てたとしても、お前みたいなやつがまた沸いてきて
スレを荒らされるのは目に見えてるけどね。
698デフォルトの名無しさん:2012/10/29(月) 22:58:50.96
>>692
そういうのは糞ウゼェから別スレでやれ
699デフォルトの名無しさん:2012/10/30(火) 00:15:24.39
アルゴリズムは言語関係ないからな
それ用のスレがどっかになかったか?
700桃白白:2012/10/30(火) 08:52:17.84
>>683
☆が連続した行に入ってるときは片方を読まないようにすればいいと思うけど、
☆が入っているセルが2個、☆が入ってないセルを18個、計20個の組み合わせを1個見つければいいのか?
それとも可能な組み合わせを全部列挙する必要があるのか?
701デフォルトの名無しさん:2012/10/30(火) 16:45:56.12
>>696
いや、シミュレーションは事務処理の自動化の醍醐味だろ?
702デフォルトの名無しさん:2012/10/31(水) 01:05:02.15
まあ良いんだけどさ嫌いじゃないし
でもここExcelVBAスレだしな。
>>677だって50*50の配列でってすれば
他言語のスレでも普通に質問できちゃうだろ
そういうのはそういうスレで聞いた方が早いし確実だと思うぜ
703デフォルトの名無しさん:2012/10/31(水) 21:08:04.12
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
>>622と同じミス
解説は>>623
解決策は>>662
705デフォルトの名無しさん:2012/11/01(木) 07:59:49.38
703です。シートを切り替えて作業したら出来ました。ありがと。
706704: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)
と書くと問題なく動く。
この書き方を覚えておくと色々応用が利いて便利。
707デフォルトの名無しさん:2012/11/01(木) 16:12:29.91
>>706
703です。解説ありがとうございます。m(__)m
708デフォルトの名無しさん:2012/11/01(木) 22:03:31.57
セオリーの書き方をテンプレに入れればこんな同じような質問がなくなると思う。
709デフォルトの名無しさん:2012/11/01(木) 23:02:20.99
>>708
質問する初心者がわざわざテンプレなんて読むわけないだろ
常識で考えろ
710デフォルトの名無しさん:2012/11/02(金) 00:23:21.70
>>709
回答者が楽しちゃいかんのか?
「テンプレ嫁」で終わりなんだが。
711デフォルトの名無しさん:2012/11/02(金) 00:32:47.59
>>710
>>708は「同じような質問がなくなると思う」って言ってるんだよ
712704: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
すみません。
ほわいとぴーちさん

自己可決しました。
717デフォルトの名無しさん:2012/11/02(金) 20:33:00.77
可決したのか。それは良かった w
718デフォルトの名無しさん:2012/11/03(土) 05:01:48.37
VBAの構文って、古き良きVB6を踏襲しているけど
これが今のVB.netのごとく、senderなんたらとか
関数の宣言に意味不明な単語が付くような
極悪仕様に改訂されることは将来あり得るかな?
VBAは俺が唯一理解できるコンピュータ言語なので
そうなったら会社のシステムをメンテできなくなって
非常に困るのだけど。
719デフォルトの名無しさん:2012/11/03(土) 07:11:52.76
>>718
そういうのはこんなところで議論しても全く意味がない。
Microsoftに聞くのが一番。

メンテの話なら前もって会社に伝えておくのがいいと思う。
システムなんて永久に使われるということはないわけだから、
VBAが使えないシステムに切り替えたときに、それ相応にコストがかかると。

そんなこと考えるんであれば、Microsoft Officeなんか使わずOpenOffice.org使えばいい。
無料だから、無駄にお金をつぎ込むわけじゃないしね。
水面下でVBAマクロをOpenOffice.org用に移植しておけば切り替えとかもすんなりいくだろうし。
720桃白白:2012/11/03(土) 09:55:07.78
>>718
そうなったら桃白白を雇ってくれたらいいじゃん。あまり複雑化したらそれはもう
素人が手を出すようなことじゃなくなっちゃうしさ、プログラム作るのは専門の
会社にまかせて、そのあいだ桃白白がお前とあやとりしてあげるよ。
721デフォルトの名無しさん:2012/11/03(土) 10:53:41.36
雇ってやるから
ここに電話番号と本名書いて
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
折り返して全体を表示するにしておけばたいてい問題ないだろ、それでいいだろ、じゅうぶんきれいだろ、それでいいよ
725デフォルトの名無しさん:2012/11/03(土) 16:08:27.48
>>723
Worksheet_CalculateにAutoFit
726デフォルトの名無しさん:2012/11/03(土) 19:37:03.65
>>724
折り返して全体を表示するにチェックは入れています。
それでも行幅までは変更されません。この行幅まで自動で調整して全文見えるようにしたいのです。
何か良い方法はないでしょうか。
727デフォルトの名無しさん:2012/11/04(日) 02:57:09.39
折り返して全体を表示するにチェックしてるからだろ
指定したセル幅で折り返すための機能なんだから用途が逆

つかExcelは表計算ソフトなんだから
文章を綺麗に表示させたいならワードやパワポ使えよ
確かに便利なんだけどさExcel
728デフォルトの名無しさん:2012/11/04(日) 05:46:50.06
>>727
幅じゃなくて高さでした。

作成してるものは計算が主なんでExcelじゃないと駄目なんです。
729デフォルトの名無しさん:2012/11/04(日) 07:48:25.61
>>728
この場合、セルに入っている実体は表示データではなく関数だから無理。
高さを広げたい時は、都度手動で行番号の境界をダブルクリックするしかない。
730デフォルトの名無しさん:2012/11/04(日) 11:59:57.25
>>727
表示データのLenBを取ってきて所定値との除算結果とCellの高さ基準値を乗算して
調整すればいいじゃん。

もしかしたらもっと簡単な方法があったかもしれないけど忘れた。
731デフォルトの名無しさん:2012/11/04(日) 19:46:10.74
んじゃあ行の境界ダブルクリックをマクロでやればいいんじゃねーの
732デフォルトの名無しさん:2012/11/04(日) 19:55:37.21
VB.net になれてると どうしても VBA のコードに違和感を感じてしまう。
733デフォルトの名無しさん:2012/11/04(日) 20:35:30.25
お次の方、どうぞ
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
736デフォルトの名無しさん:2012/11/05(月) 11:31:31.41
VBA上級ってどれぐらいなんだろうか
737デフォルトの名無しさん:2012/11/05(月) 19:50:33.77
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
742デフォルトの名無しさん:2012/11/06(火) 01:06:25.60
B1のセルの設定が改行しないになってるってオチでしょ
普通に操作してそうなるものは当然マクロでやってもそうなるよ

因みに改行はコードな
Windowsだとキャリッジリターン&ラインフィードな
vbCrLfでもChr(13)&Chr(10)でも好きなの使え
なんでこんなんかってのはプリンタ制御コードの話とかになるから自分で調べてくれ
743デフォルトの名無しさん:2012/11/06(火) 07:16:54.01
>>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みたいにしてもエラーが出ます。
745744:2012/11/06(火) 16:25:47.29
まだ完全に解決してませんが、自己解決できるっぽいです。
746デフォルトの名無しさん:2012/11/06(火) 22:34:10.47
しゃっくりが止まらない・・・・誰か良い方法教えてくれよ


まぁ、ワシのバックリはすでに良い方法ですけどね(´・ω・`)b
747デフォルトの名無しさん:2012/11/06(火) 22:34:41.19
あ・・・・・誤爆してしまった。
748デフォルトの名無しさん:2012/11/06(火) 23:27:14.15
Dim s As String = String.Empty

こーいう宣言がなぜできないのだ?
だからVBAは好きになれない。
749デフォルトの名無しさん:2012/11/06(火) 23:34:12.49
VBAとしても、君に好かれる事を望んでいないんじゃないかな?
750デフォルトの名無しさん:2012/11/06(火) 23:42:00.02
15年近くほぼ放置の言語に、何を今更って感じ。
751デフォルトの名無しさん:2012/11/07(水) 11:56:45.21
2ch規制された人が集まる、おーぷん2ちゃんねるというサイトがあるんだけど
そこのプログラム板に、エクセル97でおーぷん2ちゃんねる専ブラ作ろうよ
というスレを立てておいたので規制されたら遊びに行ってよ
http://toro.open2ch.net/test/read.cgi/tech/1351539027/l50
752デフォルトの名無しさん:2012/11/08(木) 01:35:39.90
昔excelで作られた専ブラあったよな・・・と思って探したら
サイトだけはまだあったわ 実物はもうないみたいだけど
http://turedure.s8.xrea.com/equal2ch/

ダウンロードして使ってみた記憶はあるので探してみようかな
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とかロジックに直接かかわりのないものを排除することによってロジックを際立たせて
さらに最近の風潮としてテストで動作保証しちゃったらいいじゃん的な流れがあるだろ。
つまり桃白白はできるやつってわけ。
756デフォルトの名無しさん:2012/11/08(木) 19:54:57.29
Option Explicit
757デフォルトの名無しさん:2012/11/08(木) 21:23:56.34
オプション イクスプリシット って単語、覚えづらいよな。
758デフォルトの名無しさん:2012/11/08(木) 21:43:41.49
いちいち覚える必要なんて無い
変数の宣言を強制するにチェックを入れておけばいいだけだろ?
759デフォルトの名無しさん:2012/11/08(木) 22:39:11.02
質問させてください.
5行2列の範囲を選択してテキストファイルにして保存したいんですが,その際に
1.列と列の間にタブでのスペースがある
2.ファイル名に日付と変数を入れたい 例 mm_dd_名前_k

OSはwindows7でexcel2007を使っています
回答して貰えるとうれしいです
760デフォルトの名無しさん:2012/11/08(木) 23:37:12.53
>>759
質問するなら質問内容を書けよ
761デフォルトの名無しさん:2012/11/08(木) 23:50:52.47
>>760すみませんでした.
>>759です
どのようにしたらできますか?
762デフォルトの名無しさん:2012/11/09(金) 00:20:44.29
>>759
> 5行2列の範囲を選択して
Range.Selectを使う(そもそも選択する必要性があるの?)

>テキストファイルにして保存したい
FreeFile、Open、Write、Closeを使う

>1.列と列の間にタブでのスペースがある
ある?

>2.ファイル名に日付と変数を入れたい 例 mm_dd_名前_k
日付はどこから取得したいの?
変数を入れたいってどういう意味?
763デフォルトの名無しさん:2012/11/09(金) 01:36:54.89
タブ区切りにしたいのかタブを取りたいのか別の文字に置き換えたいのか
こういう形にしたいって具体例言ってくれた方が早いんでないの
764デフォルトの名無しさん:2012/11/09(金) 03:01:56.97
Replace(str,vbTab,"")
str = Cells(a,b) & vbTab & Cells(a,b+1)

とか?
765桃白白:2012/11/10(土) 08:41:39.09
          / ̄ ̄ ̄\
         /   ⌒  ⌒ ヽ    ,,,
         /  ( ●)(●) |  /⌒_)
           |    (__人__) } ノ  ノ   おいっすー
     __. }、.    ` ⌒´ 、`   /
   (⌒               |_,,,ノ
    ""''''''ヽ_   ┌──┐ |
         |   ├──┤ |
         |   ├──┤ |
         i      ̄\ ./
         \_     |/
          _ノ \___)
         (    _/
          |_ノ''
766デフォルトの名無しさん:2012/11/11(日) 08:11:12.98
csvとして別名保存すれば一発なのになんで難しく考えるんだろう
767デフォルトの名無しさん:2012/11/11(日) 14:55:04.55
コーディングスタイルの問題についてですが
IF〜ELSEや、FOR〜NEXTなどの
全体でブロックを構成する制御構文は
前後に空行を置いて他のコードと離して書くものですか?
先輩にそうしろと注意されたのですが、行の無駄と思うのですけど。
768デフォルトの名無しさん:2012/11/11(日) 15:06:02.34
一概にこうって話じゃ無いけど、C#でStyleCopかけると似たようなこと言われるね
宗教みたいなもんだから職場のルールに合わせておけばいいと思うよ
769桃白白:2012/11/11(日) 15:12:40.59
>>767
行数を減らせばコードを一覧できる量が増える。空行を入れればコードが
見やすくなる。どちらを選択するかはケースバイケースだけれども、先輩が
空行を入れろと言うんだったら仕方がない。会社で書式をそういうふうに統一
するようになってるんだろ、じゃあそうしたほうがいいだろ、そうするべきだ。

count = 1
For i = 1 To count
&nbsp;&nbsp;ほげらちょ
Next

桃白白ならブロックに関連する処理もひとまとめにしちゃうけど。
770デフォルトの名無しさん:2012/11/11(日) 15:13:34.36
宗教wまあそうだなw
771デフォルトの名無しさん:2012/11/11(日) 15:36:24.79
>>767
プログラムソースは何百何千行と書くものなんだから
1行や2行の空白行を気にするだけ無駄。
772デフォルトの名無しさん:2012/11/11(日) 18:04:19.84
>>767
先輩に注意されたなら理由は先輩に聞け
773デフォルトの名無しさん:2012/11/11(日) 20:55:55.50
先輩の言うことには黙って従え
774デフォルトの名無しさん:2012/11/11(日) 21:32:37.96
>>767
マルチステートメントで極限まで1行に詰め込んでやれ
775デフォルトの名無しさん:2012/11/11(日) 22:20:14.44
ここで賛意を得て先輩に得意げに見せようとした>>767の意図はこうして崩れ去ったのであった、まる
776デフォルトの名無しさん:2012/11/11(日) 23:52:42.38
無駄とかどうとかではなく画一的に作られているのが大事
時代で変わるならまだしも、作った人によって違うとか
後で保守する人が地獄見るからやめような?
777デフォルトの名無しさん:2012/11/12(月) 13:21:27.32
>>767の先輩はあほです
処理の区切りで空行やコメントを入れるべきであって
>>769でいうならcount = 1を切り離すべきじゃない

空行がもったいないという理由はおかしい
印刷するなら紙がもったいないと言えるが
そうではなく重要なのはモニタで見る時に、
スカスカのコードだと見えない部分を記憶しなきゃいけないということだ
作った本人は当然知ってるのだから気にしないが
人のプログラムなら、モニタにはみだした部分を記憶する必要がある

記憶しなくたってスクロールすればいいってか?
スクロールして見て、戻ったときに記憶してるではないか
という訳で朝鮮人は皆殺しにする必要があることがお分かり頂けたろうか
778デフォルトの名無しさん:2012/11/12(月) 13:55:23.38
>>777
変数countでループの最大値を指定していると言う事は、count = 1はループと切り離しておいても問題ない
変数countが、どういう意図を持っているのかはコメントしておかなければならないと思うけどな
779デフォルトの名無しさん:2012/11/12(月) 19:08:13.36
>>769の変数名のつけ方がアレなんだよね。
変数i   →count
変数count →max
が妥当。個人的にはこれでもNGだが。
ループの変数であっても一文字変数はバグの元。
780デフォルトの名無しさん:2012/11/12(月) 19:17:17.92
一文字云々より変数名=既存関数名である事が、個人的に受け付けない。
俺ならこうする。

変数i   →count  → cnt
変数count →max  → maxcnt
781桃白白:2012/11/12(月) 19:22:40.53
>>779
おいやめろ、まるで桃白白が書いたプログラムがバグだらけみたいな、そんなことを
いうんじゃない。グローバル変数や引数はまた別だけどさ、桃白白の経験上ローカル変数は
長くしてもプログラムが見づらいだけの気がするわ。桃白白だったらcountもcntと略したりcに
したりしちゃう。桃白白なら平気でやっちゃう。そのほうが全体のロジックがわかりやすい。
真似してくれてもいいよ?桃白白に倣って今日から心を入れ替える気があるなら桃白白の真似しちゃってもいいよ?
782デフォルトの名無しさん:2012/11/12(月) 19:30:47.83
俺ならこうする俺ならこうするってのが出てきてキリがないから
とりあえず初心者はMSのルールに則って命名しておけばいいと思うよ
http://msdn.microsoft.com/ja-jp/library/cc375956.aspx
783デフォルトの名無しさん:2012/11/12(月) 19:53:44.53
>>777
>人のプログラムなら、モニタにはみだした部分を記憶する必要がある
>記憶しなくたってスクロールすればいいってか?

なら、マルチウィンドウを活用したらいいのに。
まあ、それはそれで不便だが。

結論は776だよな。
まあ、767が書いたコードが再利用されることなく短期間でお蔵入りになる予定なら、
それも保守すら必要とされないような短期利用・一時利用の、767本人以外が触らないようなコードならともかくだ。
職場の、他の人が保守したり再利用したりすることが想定される以上は、
その職場内でコード記述法、基本的書式を統一しとかないとバグの温床になるだろう。
784デフォルトの名無しさん:2012/11/12(月) 22:32:20.92
>>779
Forに i j k を使うのは50年以上前から続く伝統(当初は大文字だったけど)
意味がわからないのは単なる勉強不足

世の中にある無数のコードですでに使われてるから今さら否定してもしょうがないし
他人の書いたコードを読むにはこういう知識も必要
逆に i 以外が使ってあると、特別な意味があるのかと思ってしまう
785デフォルトの名無しさん:2012/11/12(月) 23:37:23.61
>>779
分からなくなるほど行数のあるループ作るやつはプログラマ辞めてくれ
スコープの狭い変数は短い変数名でOK
ループ変数にiを使うとか常識
I〜Nは暗黙の整数だろ学校で何勉強してきたんだ
786デフォルトの名無しさん:2012/11/12(月) 23:54:19.17
そうか、VBAだとCountもMaxも予約語とかぶらないのか
787デフォルトの名無しさん:2012/11/12(月) 23:57:14.70
一文字変数はバグの元(キリッ
788デフォルトの名無しさん:2012/11/12(月) 23:58:45.89
>>785
いつまでスレチの話してるんだ
789デフォルトの名無しさん:2012/11/13(火) 01:40:56.51
VBA使いこなせたら便利なんだろうなあ
790デフォルトの名無しさん:2012/11/13(火) 07:38:12.44
その「使いこなす」って表現もいい加減いやなんだけどw、まぁ、使えたら何かにつけて便利ではあるんだろ。用途によっては
791デフォルトの名無しさん:2012/11/13(火) 09:18:17.10
>>784-785
今時FORTRANかよ...
792デフォルトの名無しさん:2012/11/13(火) 09:38:51.52
For Each i なんて見るとこいつ馬鹿かと思う
For i = 1 To ***ならいいんだが
793デフォルトの名無しさん:2012/11/13(火) 13:04:22.44
説明ヘタで申し訳ないんですが…
シートの一行目に必ず列のタイトルがあるという前提で
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
みたくできないかと思ったんですけど、クラスとかメソッドとか使えばいけるんですかね?
ググっても見つけられなかったもんで…
794デフォルトの名無しさん:2012/11/13(火) 13:23:28.06
>>793
ColRange()はExcel VBAの機能ではなく、あなたの周りの誰かが作ったユーザ関数。
なので、With ... .ColRange()という使い方はできない。
また、その関数は二つの引数を必要としているので、それを省略することはできない。

ではどう書けば良いかというと、
Set myRange = ColRange(”列タイトル”, myWorkSheet)
myRange.(消したり切ったり貼ったりその他色々)
...

あるいは、
Set myRange = ColRange(”列タイトル”, myWorkSheet)
With myRange
...
End With
795デフォルトの名無しさん:2012/11/13(火) 14:10:17.50
>>794
ありがとうございます。
誰かが自作したというのはなんとなくですがわかりました。
で…やっぱり書き方が悪かったと思うんですが、
ColRange(”列タイトルその1”, myWorkSheet).なんか色々処理
ColRange(”列タイトルその2”, myWorkSheet).なんか色々処理
って感じで列タイトルの部分も毎行変わります…
796デフォルトの名無しさん:2012/11/13(火) 14:45:30.06
>>795
ColRangeのI/Fが気に入らないならColRangeのラッパーを作るとか
そもそもの理由が「長ったらしい」じゃ説得力がなさすぎて助言しにくい
797デフォルトの名無しさん:2012/11/13(火) 15:29:15.65
>>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").何か
とするかのどちらかな。といっても、こっちの方は多分理解できないと思うけど。
798デフォルトの名無しさん:2012/11/13(火) 17:06:02.83
>>796-797
なんかほんともう、すいません…
ラッパーというのがどんなものか、ちょっとわかったような気がします。
クラスとかコンストラクタとかの方法が、一番自分がやってみたいことに近いと思うので、これから勉強してみます。

単純に「気に入らない」「やってみたい」でお騒がせしてしまい、申し訳ありませんでした。
799デフォルトの名無しさん:2012/11/13(火) 17:17:43.22
>>798
> 単純に「気に入らない」「やってみたい」でお騒がせしてしまい、申し訳ありませんでした。

いやいや、これがプログラミングスキルを伸ばすために必要なことなんだよ。

プログラマの三大美徳:
・怠慢(Laziness)
・短気(Impatience)
・傲慢(Hubris)
http://itpro.nikkeibp.co.jp/article/Watcher/20061005/250057/
800桃白白:2012/11/14(水) 14:48:37.08
 ∧ ∧
(*‘ω‘ *)  ちんぽっぽ
 (   )
  v v
        ぼいんっ
   川
 ( (  ) )
801デフォルトの名無しさん:2012/11/17(土) 20:07:45.90
セルA1からZ1まで値が1で かつ C1ではない
って条件でループを組みたいのですがうまくいきません
If Cells(1, i) = 1 And (Not Cells(1, 3)) Then
ここでエラーになります
802デフォルトの名無しさん:2012/11/17(土) 20:15:36.43
VBAの練習の為に現在簡単な収支表を作っています。
Worksheets(1)のC列が収入でD列が支出、E列が残高です。金額は2行目から32行目までに打ち込みます。
元々はセルに直接数式を入れていたのですが、それだと誤ってDeleteキー押したときに数式が消えてしまうのでVBAで処理しようと思いました。
VBAの入門書等を参考に書いてみたのですが、思ったように動くコードが書けなく、おかしな所も発見出来なかったのでご教示お願いします。
803デフォルトの名無しさん:2012/11/17(土) 20:16:58.57
>>801
If Cells(1, i) = 1 And i <> 3 Then
804デフォルトの名無しさん:2012/11/17(土) 20:18:10.19
>>802
Formulaを使う。
805802: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
806802: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
807デフォルトの名無しさん:2012/11/17(土) 20:22:22.23
>>805
with を使ってるのに、Rangeの前に . (ピリオド) が無いのはなぜ?
808802: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
809802:2012/11/17(土) 20:27:48.37
OSはWindows7 Home Premiumの64bitで、Excelは2007です。長文すみません。
810802:2012/11/17(土) 20:34:14.74
済みません、ピリオドはこちらに書いた時に落としてました。実際には入ってます。
また、OSはWindows 7 Home Premium 64bitの Service Pack 1でした。Excelは2007で間違いありません。
811デフォルトの名無しさん:2012/11/17(土) 20:45:02.98
>>810
……If Range("C2,D2") <> "" Then

これはなんだろう?
この表記だと"D2"セルの値は判定に影響しないよ。

あと、結果が思ったように行かないのであれば具体的にどのセルの出力結果が
思ったのとどのように違うのか教えて。
812デフォルトの名無しさん:2012/11/17(土) 20:54:02.48
>>803
ありがとうございます!
813802:2012/11/17(土) 20:55:37.41
結果としては、E2に計算結果である残高が入ればよいのですが、現状では空白になります。
814デフォルトの名無しさん:2012/11/17(土) 21:07:36.44
>>813
E2セルに着目すると、

[>>811]の判定がおかしいのと、
………Range("E2").Formula = "C2-D2"
「=」を忘れてる
815802:2012/11/17(土) 21:08:22.48
表の一番上なので前日の残高がないためループには入れていません。
C2とD2の両方が空白の時はE2は空白にし、そうでないときはC2からD2を引き、E2に残高を入れる。としたかったのです。
816デフォルトの名無しさん:2012/11/17(土) 21:12:09.49
>>815
>C2とD2の両方が空白の時
これを実現する判定文は
If Range("C2") <> "" and Range("D2") <> "" Then
817802: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に反映されます。
818802:2012/11/17(土) 21:51:16.81
あーミスタイプありますね済みません。式"C2-D2"ではなく式"=C2-D2"ですね。
それと、E3以降E32までですが、C3とD3に値を入れただけだと計算されずコードを実行するまでE3は空白のままななのですが、
これをC3とD3両方に値を入れた直後に計算させる事は出来ないのでしょうか。これが解決できれば>>817のも解決できると思ったのですが。
819デフォルトの名無しさん:2012/11/17(土) 22:16:39.22
VBAより先にEXCELそのものをもっと勉強した方がいいんじゃね
820デフォルトの名無しさん:2012/11/17(土) 23:52:39.95
>>802
Deleteキー押したときに数式が消えてしまうのを防ぎたいなら保護すればいいんじゃないの?
目的と手段がごっちゃになってない?
821デフォルトの名無しさん:2012/11/18(日) 08:56:19.56
>>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
822デフォルトの名無しさん:2012/11/18(日) 12:16:15.66
無駄な工数を
823デフォルトの名無しさん:2012/11/18(日) 12:38:50.30
言ってることは間違っちゃないが例が悪いな
たった26回のループで評価のコストとか誰もが無視するレベル
824デフォルトの名無しさん:2012/11/18(日) 13:10:09.44
新ブックを作るVBAコードはどうしますか?
Workbooks.add
だと、3つもシートが作られるのがイヤだし。

かといって
Activesheet.copy
ではシートは1個だけどそのシートに元シートのデータがそのままだし。
825デフォルトの名無しさん:2012/11/18(日) 13:15:23.80
>>824
何がしたいのかが書いてないから外してるかもしれんが
Application.SheetsInNewWorkbook
826デフォルトの名無しさん:2012/11/18(日) 13:16:50.81
>>824
Application.SheetsInNewWorkbook = 1
で、次から新規作成されるブックのシート数の設定を変更できる。

マクロの最後で3(もしくは初期値)に戻せばおk
827824:2012/11/18(日) 13:21:33.00
めんどくさいなあ。

Workbooks.add sheet:=1
みたいなのでできないの?
828824:2012/11/18(日) 13:23:48.73
諸君の非常に役に立たない意見を参考に

Aheets.Add
Activesheet.move

とすることにしたよ。
829824:2012/11/18(日) 13:24:49.06
Sだ、最初。
830デフォルトの名無しさん:2012/11/18(日) 13:26:07.63
>>828
失礼なやつだな。
回答をもらう身で、めんどいとか役に立たないとか。
あぼーんするからコテ付けろ。
831桃白白:2012/11/18(日) 13:51:54.97
参考にしたんだから役に立ったんだろ。
感謝の気持ちを表すのに憎まれ口を叩きたくなる年頃なんだろ。
思い返せば桃白白にもそんなときがなかった。よくよく考えてみたけど桃白白は昔から素直でいいやつ。
832デフォルトの名無しさん:2012/11/18(日) 14:15:00.01
>>801の解釈って>>803であってるんじゃない?
Ifのネストを使えってのは同意するが>>821は質問の取り違えかと
>>801でエラーになるってことはC1に文字列でも入ってるてことだよな
833デフォルトの名無しさん:2012/11/18(日) 15:02:50.54
>>831
まとめれば自画自賛ってやつですね
834デフォルトの名無しさん:2012/11/18(日) 16:48:54.76
>>824 誰か答えてやれよこんぐらい
Workbook.Add xlWBATWorksheet
835デフォルトの名無しさん:2012/11/18(日) 17:00:11.25
VBAを自習するために
ダミーデータが大量にはいったデータベースってどこかで手に入りませんか?
フィルター機能、日付処理、シート処理、ブック処理、その他いろいろ含め、いろんな作業を実体験したいから
数千、数万行もエントリーのある巨大データベースが欲しい。
中身はなんでもよい。
836デフォルトの名無しさん:2012/11/18(日) 17:08:27.37
>>834
普通はシート三つで全然困らないからね。
あまり需要のない作業に関する質問には
回答も付きにくいものさ。
837デフォルトの名無しさん:2012/11/18(日) 17:14:55.72
>>835
自習の一環としてダミーデータをInsertするSQLをつくってみたら
838デフォルトの名無しさん:2012/11/18(日) 17:16:42.03
>>835
それを作る過程そのものが勉強になるじゃないか!
839デフォルトの名無しさん:2012/11/18(日) 17:32:58.38
ノースウィンド持ってくれば?
840デフォルトの名無しさん:2012/11/18(日) 17:44:33.09
>>835
日本の街区データとかいいぞ。
そのまま実用にも使える
841デフォルトの名無しさん:2012/11/18(日) 19:57:35.70
>>835
毎日、体重と血圧と体温を測ってデータベース化すれば?
842デフォルトの名無しさん:2012/11/18(日) 20:01:26.80
>>841
1万件のデータを集めるのに1万日=27年か
843デフォルトの名無しさん:2012/11/18(日) 22:00:51.17
wikipediaの中身のデータなら、確か無料で公表してたはず
もはやVBAってよりSQL他になる気がするけど
844デフォルトの名無しさん:2012/11/18(日) 23:20:31.07
>>842
くくっ
今の健康が、いつまでも続くと思うなよw
845デフォルトの名無しさん:2012/11/18(日) 23:43:48.30
>>844
最近、身内か知り合いで人が死んだか?
846デフォルトの名無しさん:2012/11/19(月) 00:17:18.89
>>835
例えば、ランダムな数値や文字列を作成してぶっこむコードを作るとか。
上で散々同じこと書かれてるけど本当に勉強になるからやってみた方がいいよ。
847デフォルトの名無しさん:2012/11/19(月) 00:54:39.63
なんでも良いが一番困るんだよな
しかも大体用意してやるとこれじゃダメって言い出すんだよ
サンプルなんざ腐るほど転がってるし自分で探せと言いたい
848デフォルトの名無しさん:2012/11/19(月) 01:15:54.71
そういえば昔、電算担当に「これこれこの条件で適当なダミーデータ作っといて」って言われたから、
ランダム関数とか適当にこさえた辞書とか使って顧客番号から住所氏名その他のダミーデータ作って渡したら、
「ダミーデータ作れって言っただろ!! 顧客の個人情報引っ張ってくんな!!」
ってえらい怒られたことがあったな。
じゃあ電算担当側で勝手に作って下さい、あとちゃんと個人情報かどうかチェックしてから言ってます?って訊いたら「もういい」って電話切られて、そのあとなんも音沙汰ないし…
849デフォルトの名無しさん:2012/11/19(月) 02:41:14.81
電算担当はプライド高いだけの能なし
間違いを認めて謝ることを知らない
850デフォルトの名無しさん:2012/11/19(月) 03:08:32.84
電算室は広い個室みたいなもんだからねえ
大きな部屋を占領してると偉くなった気になるのは確か

>>848
ちゃんと「いえ、あれは自作したダミーです」って言えよ
自分が正しくても、嫌味っぽく言い返しちゃうのは完全に相手と同レベルだから社会人失格だよ
仕事切られて当然
851デフォルトの名無しさん:2012/11/19(月) 03:35:08.67
「ダミーデータ頼んでたのにこれはどういうことですか?」
とかじゃなくて、
いきなり怒ってきたんだろ?
そりゃだめじゃん。
852デフォルトの名無しさん:2012/11/19(月) 03:37:02.61
問答無用の原理主義者が多いのは確か
853デフォルトの名無しさん:2012/11/19(月) 03:48:45.52
相手が先に怒ったとか関係ないだろ
むしろそういう時ほど冷静に対処しなきゃ、状況が悪くなるだけってわからないかな
854デフォルトの名無しさん:2012/11/19(月) 06:44:35.27
>>848
若いなw
相手に本番データと勘違いされるようなデータを作ったのは君なのだから、
まずは素直に詫びなきゃならん。紛らわしくて申し訳ないと。

しかしあれだな、ダミーデータと言えば、普通は住所XXX、氏名YYYみたいな
ものにすると思うが、どんだけリアルなもの作ったんだよ。
855デフォルトの名無しさん:2012/11/19(月) 06:49:39.50
>>848 の正しい応答

それがどうかしましたか?
856デフォルトの名無しさん:2012/11/19(月) 09:46:35.64
>>854
ダミーデータだから、本番データに近い物を作らなきゃ駄目なんじゃないの?
857デフォルトの名無しさん:2012/11/19(月) 09:59:10.93
わざとエラーを出すデータ
使う文字の種類
「これこれの条件で」
示されていれば問題ない

大抵の場合「適当な」ってのがあいまいで
ほんとに適当にやると怒られる
858デフォルトの名無しさん:2012/11/19(月) 10:39:01.92
>>845
自分以外の人がどうなろうと自分には関係ない、そうは思わないか?

くくっ
今の健康が、いつまでも続くと思うなよw
症状の軽い病気ほど重症化しやすいんだぜw
859デフォルトの名無しさん:2012/11/19(月) 10:56:32.04
>>858
最近、身内の軽めの病気の人が重症化して死んだのか?
860デフォルトの名無しさん:2012/11/19(月) 10:57:44.01
放射脳ですね
わかります
861デフォルトの名無しさん:2012/11/19(月) 13:54:07.63
>>859
症状の重さと病気の重さは、全く別物なんだぜぇ

くくっ
今の健康が、いつまでも続くと思うなよw
862デフォルトの名無しさん:2012/11/19(月) 19:37:19.66
Findを組み込んだモジュールを実行中、
あまりに処理が遅いので CTR+Pause で中止させると
必ずFind処理のところで停止するのですが、そういうものでしょうか?
そして必ず検索に失敗して Nothing が返ってきてしまいます。
863デフォルトの名無しさん:2012/11/19(月) 19:47:40.86
>>862
「必ず」Find処理のところで停止する
のならそういうものって事でしょうね
864桃白白:2012/11/19(月) 21:32:11.27
>>862
犬も歩けば棒に当たるという言葉がある。それは連綿と続く日本の歴史の中で古く
昔から語り継がれているものだ。あまりに語り継がれているがゆえにことわざと
いわれる。犬も歩いていれば棒にあたるし、処理をしていればFind処理のところにも
くるだろ。つまりあれだろ、まあそういうことだろ、うん。Find処理のところで実行が停止されたとき
Find処理は完了してないから、検索が失敗するのはしかたない。桃白白的に見てもそれは
しかたない。Find処理のところで停止するのは偶然なんじゃね、もしくは必然なんじゃね。
Find処理に時間が超かかっていて実行の停止をしたときにそこで停止する確率が高いか、
または実行を停止するやつの脳内クロックとエクセルがシンクロしてるんだろ。
ふう、疲れた、長文書くの超疲れた。役に立ったっしょ?桃白白のアドバイス。
865デフォルトの名無しさん:2012/11/19(月) 23:23:36.22
>>864
別に無理しなくてもいいんじゃね?
866デフォルトの名無しさん:2012/11/20(火) 11:22:47.44
私と友達はいつも一緒に帰ります。
駅で違う電車に乗って分かれるのですが、どちらも10分間隔なのにほぼ友達の方が先に来ます。
何故なんでしょうか。

ってことかな。
867デフォルトの名無しさん:2012/11/20(火) 20:08:14.70
お返事ありがとうございます。
途中中断しなければNothingは返ってこないので、
根気よく処理が終了するまで待つことにします。
868桃白白:2012/11/20(火) 23:32:16.09
>>867
検索処理を高速化すればいんじゃね。どういう検索をしてるんだ? 無理なのか?
869デフォルトの名無しさん:2012/11/21(水) 01:32:07.47
とりあえずExcel自体の検索機能で時間かかるようなら
それがExcelを使った処理の限界だよ
それ以上はAccessに変えるなりDB使うなりを考えなよ
870デフォルトの名無しさん:2012/11/21(水) 06:03:54.27
>>868
数千行あるソースSheetを上から順番に読み込み、
A列にある文字列と一致する行を、
これまた数千行あるデータSheetからFindで検索。
一致する行があればその行に、無ければ新規行に書き込み。
簡単にこのような処理です。

CopyDestinationを用い、1回ごとに書き込みをする方法と
書き込むデータは配列で格納し、
最後に1回だけ書き込む方法を試しましたが
速度的には変化ないようでした。
871デフォルトの名無しさん:2012/11/21(水) 07:22:57.26
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
でできるのに。
875874:2012/11/21(水) 20:25:44.36
もしできないなら
ブックをコピーして新ブックを作りたいときはどうしたらいいの?
876デフォルトの名無しさん:2012/11/21(水) 21:20:51.55
>>870
探す前にちょっと整理とかできないデータなのか

ていうか、数十万行ならともかく数千行って大した量じゃないように思うんだけど、
再計算とかちゃんと停止してる?
877デフォルトの名無しさん:2012/11/21(水) 21:23:06.91
>>874
仕様の疑問はメーカーサポートへどうぞ
我々ユーザにはわかりません
878デフォルトの名無しさん:2012/11/21(水) 21:32:30.80
>>874
ActiveWorkbookが返すWorkbookオブジェクトにCopyメソッドがないから

>>875
SaveAsメソッドとかSaveCopyAsメソッドとか使う
もしくは元のファイルをコピーする
879デフォルトの名無しさん:2012/11/22(木) 01:24:10.93
>>874
単純に考えろよExcel自体にブックをコピーして新ブックを作るなんて機能ねーだろ
>>878が言うように、別名で保存したりファイル自体をコピーしたりしてるだろ
Excelの機能を使ってるものはExcel以上の事はできないからな
やりたければ普通にVBAで作れ
880桃白白:2012/11/22(木) 05:25:12.12
 |    |(゚(エ)゚)|
 |    |(.  .)|
 |     ̄ ̄~ ̄ ̄
 | ∩___∩
:::| ノ    ヽ ヽ
:::/  _    _ |  暇だお
::|     (_●)   ミ
:彡、   |Ч    i`ヽ
:/  _/「 ̄Y ̄」>  |
:|ヽ   ̄ ̄)( ̄  .ノ
C   T ̄| ̄ 「__
/`―、___)__)
;;;;;;;;;; ;;;;;
881デフォルトの名無しさん:2012/11/22(木) 07:16:38.24
>>871
ありがとう。Dictionaryってやつは初めて知りました。
しかしDictionaryを用いるのはどうも難しそうです。
ソースSheetから読み出す情報は、その行の特定複数列ですし、
書き込む時も特定複数列に書いています。
また検索に使用する文字列は重複も多くありますので。

>>876
>再計算とかちゃんと停止してる?

申し訳ない↑の意味が理解できなかった。
再計算を停止?
882デフォルトの名無しさん:2012/11/22(木) 07:32:10.81
>>881
自動再計算の停止
Application.Calculation = xlManual

再計算実行
Calculate

自動再計算の再開
Application.Calculation = xlAutomatic
883デフォルトの名無しさん:2012/11/22(木) 09:32:19.24
>>870
Findで総当たり検索は駄目だな
エクセラーはアルゴリズムくらい勉強したほうがいい
ソートして上からなぞるように検索すれば総当たりなんてしなくて済む
数万データまでならアルゴリズム無知のサルでも使えるDictionaryでもいいと思うけど
ちなみに数十万以上ならDictionaryは遅い部類に入るから万能じゃないことは知っておくべきだ
884デフォルトの名無しさん:2012/11/22(木) 09:38:34.53
質問者は配列に一回ため込んで一気に書き出しも試してるんだから再計算云々は今回は関係なさそう
しかしたった数千で時間がかかるのも不思議だな
万に近い数千なのかな?
885デフォルトの名無しさん:2012/11/22(木) 10:00:36.06
access使えればそのほうが楽そうだな
覚えればアルゴリズムとか考える力のない馬鹿でも使えるし
886デフォルトの名無しさん:2012/11/22(木) 10:02:15.87
質問者がソースコードを提示すれば解決すると思うんだけどな
887デフォルトの名無しさん:2012/11/22(木) 10:45:45.12
>>883
ソートして上からなぞる→O(n)
Dictionary→O(1)
888デフォルトの名無しさん:2012/11/22(木) 13:00:31.93
Dictionaryはキーの数が多くなると遅くなる
馬鹿の一つ覚えの人は万能だと思っているが
889デフォルトの名無しさん:2012/11/22(木) 13:16:25.06
ソースもマスタも追加も全部配列に持ってきてからやれば
一瞬でそ
890デフォルトの名無しさん:2012/11/22(木) 13:37:56.80
>>888
確かにデータ量が多くなるとDictionaryを構築する時間は線形時間よりもかかるようになってくるが、
検索はO(1)だと思ったがそれも違うのか?

手元で試したら、50万件のdictionaryでランダムなkeyを1万回検索したら、969ms、
50万件のソート済み配列で、順次1万回検索したら、160656ms。
まあ、ソート済みなんで、配列だと普通は他の探索法取るんだろうけど。
891デフォルトの名無しさん:2012/11/22(木) 13:42:56.61
だから構築する時間を言ってるんだよ
そこがきっと抜けてると思ったよ
ちなみに6文字から9文字のランダムなアルファベットで10万アイテムで0.3秒でも100万アイテムだと3秒とはならず46秒となった
892デフォルトの名無しさん:2012/11/22(木) 13:52:34.48
>>891
> そこがきっと抜けてると思ったよ

いや、ちゃんと線形時間よりはかかるようになるって書いてるでしょ。

> ちなみに6文字から9文字のランダムなアルファベットで10万アイテムで0.3秒でも100万アイテムだと3秒とはならず46秒となった

100万要素のDictionaryに対して、6文字から9文字のランダムなアルファベットを1万回検索するのにかかる時間と、
ソート済みの100万要素の配列に対して、6文字から9文字のランダムなアルファベットを順次検索するコード書いて
それにかかる時間比べてみ?
893デフォルトの名無しさん:2012/11/22(木) 13:56:05.74
ちなみに、「ちなみに6文字から9文字のランダムなアルファベット」って決まってるなら、
dictionaryを26個用意すれば、データ構築にはほぼ0.3*10秒で終わるよね。
894デフォルトの名無しさん:2012/11/22(木) 13:59:22.85
検索側と被検索がソート済みならそれなりのアルゴリズムが昔からあるからね
じっくり考えればそんなに難しくない
ちょっと高度になると番兵を使ったりするんだがwikiによると最近は番兵は使わないほうが多いらしい
895デフォルトの名無しさん:2012/11/22(木) 14:01:54.92
>>893
100万人分の名簿のダミーデータだと思ってくれ
意味分かったかな?
896デフォルトの名無しさん:2012/11/22(木) 14:08:13.70
>>894
>wikiによると

kwsk
897デフォルトの名無しさん:2012/11/22(木) 14:09:15.77
ウィキペディアだろ?
898デフォルトの名無しさん:2012/11/22(木) 14:10:12.62
>>895
> 意味分かったかな?

いや、全然意味わかんないんだけど。
検索する回数が多いなら、データ構築に数十秒くらいかかっても全然大丈夫かもしれないし、
それも許容できないなら、なんらかのアルゴリズムでパーティショニングすれば劇的にデータ
構築時間が減る。

VBから簡単に使える、バルクロードできるデータベースがあるなら、そっちを使うのがいいかも
しれないし、まあケースバイケースだよ。

まあそれはいいんだけど、これやってみてよ。
> 100万要素のDictionaryに対して、6文字から9文字のランダムなアルファベットを1万回検索するのにかかる時間と、
> ソート済みの100万要素の配列に対して、6文字から9文字のランダムなアルファベットを順次検索するコード書いて
> それにかかる時間比べてみ?
899デフォルトの名無しさん:2012/11/22(木) 14:11:00.14
>>897
そうなのか・・・
ExcelVBAのTips系のwikiがあるのかと思ってしまった
900デフォルトの名無しさん:2012/11/22(木) 14:16:58.82
>>894
> ちょっと高度になると番兵を使ったりするんだがwikiによると最近は番兵は使わないほうが多いらしい

いったいどの項目にそんなこと書いてるのか知らないけど、ソート済みの配列に対する検索は、
バイナリサーチがメジャーな方法。O(log2 n)。
901デフォルトの名無しさん:2012/11/22(木) 14:18:56.00
>>898
おめーがやれよ
俺はそういうのはもう飽きるほどやってる
もちろんソート済みアルゴリズムには番兵使ってチューニングしてる
902デフォルトの名無しさん:2012/11/22(木) 14:21:02.20
なんだ、ただのかまってちゃんか。
903デフォルトの名無しさん:2012/11/22(木) 14:23:38.37
>>900
おめー馬鹿か
両方ともソートすると別のアルゴリズムがあるんだよ
二分探索しか知らないなら黙っとけ
904デフォルトの名無しさん:2012/11/22(木) 14:33:00.14
>>903
> 両方ともソートすると別のアルゴリズムがあるんだよ
まあそのアルゴリズムより、ハッシュによる検索の方が多分速いんだけどね。
905デフォルトの名無しさん:2012/11/22(木) 14:36:00.43
>>904
100万でやってみたら?
検索時間じゃなくてほとんど構築時間になってしまうけどな
906デフォルトの名無しさん:2012/11/22(木) 14:37:20.38
>>905
は?
君の環境で46秒で終わったんでしょ?
907デフォルトの名無しさん:2012/11/22(木) 14:39:54.78
つか、自分で何を言ってるのかよくわかってないみたいだけど、検索元データがソート済みなら、
データ構造を構築する必要なんてなんだよね。
俺が言ってる意味わかる?
908デフォルトの名無しさん:2012/11/22(木) 14:40:38.78
誤:必要なんてなんだよね。
正:必要なんてないんだよね。
909デフォルトの名無しさん:2012/11/22(木) 14:47:53.80
>>907
Dictionaryの構築時間の話ね
検索は速いけど前準備のDictionary構築の時間がほとんどって意味
910デフォルトの名無しさん:2012/11/22(木) 16:49:39.03
激安中古ソフト市場かなりやすいね=キャンペーンだと
庶民の味方だよホントググってみ
911デフォルトの名無しさん:2012/11/22(木) 17:47:10.46
>>909だが訂正
Dictionaryってデータ多いと構築時間ばかりじゃなく検索時間も同様に遅いのね
どっちも同じデータの100万と100万で試すと格納に46秒で検索に46秒で計92秒かかったわ
まぁ昔からデータ多い時にはDictionaryは使うなってのは言われてるよな
Excel2003では6万ちょっとだから問題にならなかったってだけで
ちなみにCollectionだと11秒
これでも十分に遅いけど
912デフォルトの名無しさん:2012/11/22(木) 18:33:37.04
エディターでCrLfとかの定数が使えなくなったんだがどうして?
913デフォルトの名無しさん:2012/11/22(木) 18:43:27.80
>>912
そんな定数ないぞ
vbCrLfのことか?
914デフォルトの名無しさん:2012/11/22(木) 18:43:53.06
>>912

vbCrLfだろ CrLfじゃなくて
で、使えなくなったってのはどういうこと?
915912:2012/11/22(木) 18:50:47.46
>>913-914
そうだった
頭のvbを忘れてたよ
916桃白白:2012/11/22(木) 19:03:06.48
>>911
Dictionaryは、後に入れたもののほうが、先に入れたものより速く取得できるな。
Dictionaryの実装はハッシュテーブルだとばかり思ってたけれど、もしかしてあれか、
スタックを線形探索してるだけなのかこれ。だとしたらかっけーな。桃白白ほれちゃいそう。
917デフォルトの名無しさん:2012/11/22(木) 20:08:11.70
>>916
おう!そうか知らんかったわ
100万データを前半50万と後半50万で試したら34秒と10秒だったわ
918デフォルトの名無しさん:2012/11/22(木) 21:03:40.27
というわけで>>887のO(1)ってのは間違いってことだな
919デフォルトの名無しさん:2012/11/22(木) 21:20:02.06
>>916
ハッシュテーブルだろうけど
ハッシュがかち合えば単なるリストになる他ない
920デフォルトの名無しさん:2012/11/23(金) 00:02:29.66
ランダムデータじゃなくて全データを1回ずつ検索して平均をとらないと検索時間の期待値が出ないのか
921デフォルトの名無しさん:2012/11/23(金) 01:03:32.59
Dictionaryのハッシュ値のbit数は設定変えられないのかな
922デフォルトの名無しさん:2012/11/23(金) 07:59:49.34
そもそもVBAに組み込みのDictionaryなんてなかったはずだから
ちゃんとなんのDictionaryなのか明示しようぜ

で、たぶんScripting.Dictionaryだろうけど、これホントにハッシュテーブルじゃないのか?
どっかにちゃんとした資料ないか?
923デフォルトの名無しさん:2012/11/23(金) 08:08:28.89
どうでもいいよそんなこと。
辞書は辞書であることに意味があり
実装がどのようになっているかを議論することは
このスレの範疇を超えていると思うが。
924デフォルトの名無しさん:2012/11/23(金) 08:16:53.45
>>923
高速化もこのスレの範疇ではないってか?
それともScripting.Dictionaryの話はスレ違いだと?
925デフォルトの名無しさん:2012/11/23(金) 08:21:07.49
VBAじゃHashtableは使えないのか
926デフォルトの名無しさん:2012/11/23(金) 08:24:33.54
>>924
辞書が遅いので困っていますという質問が
投稿されたならばありかも知れんが、
辞書の話題から派生した雑談を広げまくっているだけじゃないか。
927デフォルトの名無しさん:2012/11/23(金) 09:37:54.67
Scripting.Dictionaryは、VBAと言うよりはVBSだなぁ...
928デフォルトの名無しさん:2012/11/23(金) 09:53:00.66
>>1に従うなら完全にスレチ
やりたければ適切なスレでやってくれ
929デフォルトの名無しさん:2012/11/23(金) 10:10:04.14
しょっちゅう使うものだしいいんじゃねーの?
**の一つ覚えの人は特にw
しかしDictionaryオブジェクトを辞書っていうのはなんか違和感があるね
930デフォルトの名無しさん:2012/11/23(金) 10:16:12.04
なんで?
931デフォルトの名無しさん:2012/11/23(金) 10:18:45.35
そもそも辞書って言い出した奴が馬鹿の一つ覚えの人だったからw
932デフォルトの名無しさん:2012/11/23(金) 10:21:25.48
さすがにデータベース使うべき
933デフォルトの名無しさん:2012/11/23(金) 10:27:20.49
だな頭使わなくていいもんな
選択クエリとか不一致クエリとかの内部のアルゴリズムなど何にも分からなくても使えるんだし
934デフォルトの名無しさん:2012/11/23(金) 10:41:19.20
Dictionaryオブジェクトっていえば端から65536を超えるデータは念頭にない人多いよな
Transpose関数と併用してる人を見ると大丈夫かよって思う
935デフォルトの名無しさん:2012/11/23(金) 11:11:55.58
そんなんDictionaryに限らん
最大データ数、許容処理時間、推奨環境などなど、
質問に書かれてない条件をどう設定するかは回答者の自由
936デフォルトの名無しさん:2012/11/23(金) 11:15:11.94
回答者たる者何件以上は使えませんって一回くらい書いてもいいと思うが一回も見たことない
知らないだけだったりして
937桃白白:2012/11/23(金) 11:42:04.80
>>925
.NETフレームワークがインストールされてれば
mscorlib.Hashtableが使えるよ
938デフォルトの名無しさん:2012/11/23(金) 19:33:17.21
Autofilterで同一行に複数(3つ以上)の項目でフィルターをかけたいんです。
さらにフィルターは、「指定の値で始まる」にしたいんです(つまりワイルドカードが最後についたような「てすと*」みたいなもの。)。
これはどうやったらできますか?
Criteria1で配列変数にしてみたんですが、これだとワイルドカード式のフィルターができません。

(この質問を理解できるのはかなりVBAに精通してる人のみだと思いますが)
939デフォルトの名無しさん:2012/11/23(金) 19:53:17.79
>>938
マクロの記録で、あっさり記録できたからそれを使えばいいだけだと思う。


>(この質問を理解できるのはかなりVBAに精通してる人のみだと思いますが)
むしろド素人のほうが向いてる質問だね。
940938:2012/11/23(金) 20:01:45.55
>>939
あなたは質問の意味が分かっていませんね
3つ以上をAutofilter。
941デフォルトの名無しさん:2012/11/23(金) 20:04:25.85
>>940
いや、3つ以上でも記録でできる。
942938:2012/11/23(金) 20:09:14.65
>>941
そのやりかたを聞いておるのだ
943938:2012/11/23(金) 20:14:59.18
ありゃ?できた。なぜ会社のPCではできないのだ?
944デフォルトの名無しさん:2012/11/23(金) 20:15:54.01
>>942
なぜできないのかが不思議なんで、自分がやりたいことをもっと具体的に説明してるれる?
945デフォルトの名無しさん:2012/11/23(金) 20:16:32.06
>>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
>>945
わかんない、桃白白それわかんない。

>>919
そうか、なるほど。

Arrrrr! Cap'n Eric be learnin' about threadin' the harrrrd way - Fabulous Adventures In Coding - Site Home - MSDN Blogs
http://blogs.msdn.com/b/ericlippert/archive/2003/09/19/53054.aspx

この人はScripting.Dictionaryの中の人なのか。Scripting.Dictionaryの実装がハッシュテーブル
であることは間違いないようだな。バケツの数が変わらないハッシュテーブルか。
948デフォルトの名無しさん:2012/11/23(金) 22:14:44.93
>>943
会社のが割れモノなんだろ
949デフォルトの名無しさん:2012/11/23(金) 22:24:58.67
よく知らないけど2007とか
マクロの記録がまともに動作しないそうだから

そもそもMS-Officeですらなかったりして
950デフォルトの名無しさん:2012/11/23(金) 23:05:25.65
>>946
やってみりゃいいじゃん。同じ手順で。
951デフォルトの名無しさん:2012/11/24(土) 02:56:05.35
03 という文字列から先頭の 0 を取るにはどうしたらいいですか?
952デフォルトの名無しさん:2012/11/24(土) 03:34:13.38
>>951
「取る」の意味がわからん
取り除く =RIGHT("03",1)
取り出す =LEFT("03",1)
953デフォルトの名無しさん:2012/11/24(土) 03:38:46.38
cstr(clng("03"))
954デフォルトの名無しさん:2012/11/24(土) 03:48:48.71
>>952 >>953
ありがとうございます。
Format 関数を使ったら出来ました。
955デフォルトの名無しさん:2012/11/24(土) 08:55:39.70
>>938
質問や書き込みをする前にもう一回試したり調べたりしてからのが
人生で恥ずかしい思いをする事が少なくなるぞ
いやまじでまじで焦りは禁物
956デフォルトの名無しさん:2012/11/24(土) 09:04:35.06
>>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じゃ無理?
960デフォルトの名無しさん:2012/11/24(土) 17:20:23.10
>>958
Office XPはあるよ。
それ以外のバージョンは手元にないんで知らん。

1.VBEのツールバーを右クリック。
2.メニューの中から「ユーザー設定」を選択。
3.「ユーザー設定」ウィンドウの「コマンド」タブを選択。
4.「分類(G):」の中から「編集」を選択。
5.「コマンド(D):」の中の「コメントブロック」か「非コメントブロック」をツールバーにドラッグして移動。
961デフォルトの名無しさん:2012/11/24(土) 17:49:40.29
>>957
高いスキルを保有していることと
人に教えることは、何というか別物だと思うんだ
962デフォルトの名無しさん:2012/11/24(土) 17:53:55.73
>>957
少なくともアルファベットを全角で書くやつはPC初心者に多いよね
963デフォルトの名無しさん:2012/11/24(土) 17:58:55.71
>>962
あなたですね。
964デフォルトの名無しさん:2012/11/24(土) 18:28:55.71
>>957
彼の知識は上の中くらいはある
でも頭の回転はさほど良くない

初心者相手に知識や初歩テクを伝授することは出来ても
素晴らしいプログラムを生み出したり
中級以上の者のステップアップになるような
記事や本を書くのは無理

人間、生まれた時からVBAの知識を持ってる奴など居ないから
初めは彼の知識を見て「こいつ、詳しいじゃん」と思うだろうが
頭の回転の良い奴は、理解や知識の蓄積も早いから
すぐに彼の領域を超えてしまい、「こいつより俺の方が上じゃん」となる
965デフォルトの名無しさん:2012/11/24(土) 18:56:06.98
>>960
ありがとうございます。Excel2010でも出来ました。

>>961 >>964
あの人のスキル自体は然程高く無いでしょうけど、
人に分かり易く教えるスキルはかなり上位なんじゃないかと思います。
966802:2012/11/24(土) 19:04:13.33
自分にはVBAはまだ早かったようなのでマクロの記録でやりました。
Excel自体の理解も浅いようなのでもっと勉強したいと思います。
お目汚し済みませんでした。
967デフォルトの名無しさん:2012/11/24(土) 20:19:46.06
こんどはAdvancedFilterで同一行に複数(3つ以上)の項目でフィルターをかけるとき、
フィルターは、「指定の値で始まる」にしたいんです(つまりワイルドカードが最後についたような「てすと*」みたいなもの。)。
これはどうやったらできますか?
CriteriaRangeにはセル範囲を入れないといけないらしいし一行目は項目名だから、ワイルドカードが使えないのです。

(この質問を理解できるのはかなりVBAに精通してる人のみだと思いますが)
968デフォルトの名無しさん:2012/11/24(土) 20:20:58.04
荒らし認定。みんなスルーな。
969967:2012/11/24(土) 20:44:49.83
ありゃ、できたわ。
でもそれは作業用のセルをわざわざつくって、「てすと*」みたいに代入したから。
こうせず、コードだけでCriteriaRangeを実現することはできますか?

(理解できるのは限られた人のみと思いますが)
970デフォルトの名無しさん:2012/11/24(土) 23:24:56.94
自分にはまだ早いと言ってるやつが将来にわたって出来たためしがない
今この機会を逃すのはどうして?
971デフォルトの名無しさん:2012/11/24(土) 23:34:42.41
VBの開発理念は、10分で作れそうかどうか?というものになります。
それ以上はそれなりのしっかりした開発環境で開発しましょう、という事です。
更にそのサブセットでしかないVBAでコレ以上悩むなら、それは無駄だということです。
これ以上無駄に時間を消費する事を止め、解る人に開発を依頼してください。

ご安心下さい、あなたがダメと言う訳ではありません。
あなたは向いてない、というだけの事です。
972デフォルトの名無しさん:2012/11/25(日) 02:38:20.62
それマイクロソフトのおっさんの発言だろ?
実際にはサポート切りたいのに使われすぎて切れないって時点で
そいつの想定外の使われ方されてるのは分かりきってるし
そんな理念はとうに崩れてるよ
実際に仕事でVBで○人月の開発とかザラにあるんだが・・・
973デフォルトの名無しさん:2012/11/25(日) 05:17:05.16
VBならともかく
VBAでそれやるのは
間違ってる気がする
974デフォルトの名無しさん:2012/11/25(日) 08:23:34.21
実はそうでもない
VBAはExcelというプログラム分からない人でも長年使っていたインターフェイスを持っており
そのインターフェイスをそのままに、長年使ってきたシートフォーマットをそのままに
機能追加や自動化が出来るというメリットがある

PC慣れしてる奴は、Excelのシート操作がVBやCなどで作ったフォーム入力になっても何の弊害も感じないし
むしろそっちの方がやりやすく感じるものだが、PCに疎い奴は、ユーザーフォームで入力を簡素化してやっても
「作業が簡素化されている」ということより「以前と操作や入力方法が違う」ということに弊害を感じてしまうものだ

組織の中で働く以上、いまだそういう人の方が多いくらいだと言うことを忘れてしまうと
一部のPCベテランのみには認められるが、大多数のPC初心者にはウザがられる独りよがり野郎になってしまう
975デフォルトの名無しさん:2012/11/25(日) 10:39:12.38
たとえば
activecell.AutoFilterまで入力すると自動入力候補が現れますが
cells(1,1).autofilterを入力してもなにも現れないのは
どうしてですか?
976デフォルトの名無しさん:2012/11/25(日) 10:42:30.84
Cells(1,1)の戻り値がObject型だから。
977デフォルトの名無しさん:2012/11/25(日) 10:48:39.09
このレベルの質問してくる奴にその説明で伝わるかな?
978975:2012/11/25(日) 10:54:39.06
どういうことでしょうか?
979デフォルトの名無しさん:2012/11/25(日) 10:55:18.24
じゃあActivecellの戻り値は何型?
980デフォルトの名無しさん:2012/11/25(日) 11:05:34.62
そういうもの。まあVBAだし。
981デフォルトの名無しさん:2012/11/25(日) 11:45:13.74
>むしろそっちの方がやりやすく感じるものだが、PCに疎い奴は、ユーザーフォームで入力を簡素化してやっても
>「作業が簡素化されている」ということより「以前と操作や入力方法が違う」ということに弊害を感じてしまうものだ

Windows 8 ですね。わかります。
982デフォルトの名無しさん:2012/11/25(日) 12:38:01.11
>>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
とすればピリオド打った時入力候補が出る
983デフォルトの名無しさん:2012/11/25(日) 12:53:11.69
間違いだらけのドヤ顔解説w
984デフォルトの名無しさん:2012/11/25(日) 12:57:45.83
間違いだそうだから>>983に正しい解説求む
985デフォルトの名無しさん:2012/11/25(日) 13:02:30.13
正しい解説は>>983にお任せしてようするにItemプロパティって実行してみないと型がわからない実行時バインドってことね
986デフォルトの名無しさん:2012/11/25(日) 13:18:24.21
> With Worksheets("Sheet1")
Worksheetsの引数に変数使うならまだしも
リテラル値でベタ書きするなら
With Sheet1
ってすれば良いだけ

シート名(ブックのシートタブに表示される名前)は
VBA使わない人でも変更できるから、この名前を使って
シートを特定する方法は他者が使う場合は特に
バグの原因になることも多い
シートのオブジェクト名(CodeName)は、VBAわかる人以外
まず弄ることは無いからバグを引きおこしにくい
987デフォルトの名無しさん:2012/11/25(日) 13:19:42.26
よく見たらピリオド打った時の話じゃなかったな
>>982は的外れだった
988デフォルトの名無しさん:2012/11/25(日) 13:21:18.02
>>986
オブジェクト名使うのには俺も賛成だ
固有の型を返すからね
989デフォルトの名無しさん:2012/11/25(日) 15:37:14.77
>>986
他のWorkSheetを見てしまう可能性があるからそれはだめだろ
990デフォルトの名無しさん:2012/11/25(日) 17:43:39.44
何勘違いしてるんだ?
991デフォルトの名無しさん:2012/11/25(日) 18:37:11.45
>>986
マクロブックからデータブックを扱うときのデータブックのコードネームの使い方を教えて欲しい
992デフォルトの名無しさん:2012/11/25(日) 18:39:12.85
人に物を聞くときは最後に次の一文をつけることがこのスレの礼儀

(この質問を理解できるのはかなりVBAに精通してる人のみだと思いますが)
993デフォルトの名無しさん:2012/11/25(日) 18:46:45.15
994デフォルトの名無しさん:2012/11/25(日) 18:51:24.94
>>985
バインドってなんですか?
怪我したときに貼るやつ?
995デフォルトの名無しさん:2012/11/25(日) 19:09:32.46
>>994
ツマンネ
996デフォルトの名無しさん:2012/11/25(日) 19:26:36.74
>>990
他のワークブックがアクティブなときにマクロ実行するとそっちのブックのSheet1をwithるだろ
997デフォルトの名無しさん:2012/11/25(日) 19:58:51.92
>>996  意味不明
そっちのブックってコードが書いてあるブックのことか? それなら理解できるが
998デフォルトの名無しさん:2012/11/25(日) 20:10:08.75
ようするにワークブックとワークシートを明示しないとどのブック・シートになるかわからない、ってことじゃないの?
実は俺もよく解ってないんだけど、俺はいつもこうしてる。
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に対して行われてしまう
1000デフォルトの名無しさん:2012/11/25(日) 20:20:50.91
次スレ:Excel VBA 質問スレ Part27
http://toro.2ch.net/test/read.cgi/tech/1353842387/
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。