2012年09月プログラム7: Excel VBA 質問スレ Part26 (717) TOP カテ一覧 スレ一覧 2ch元 削除依頼
Rubyについて(アンチ専用) Part004 (747)
Borland Developer Studio 2006 No.13 (268)
C#, C♯, C#相談室 Part76 (831)
くだすれDelphi(超初心者用)その54 (902)
くだすれDelphi(超初心者用)その54 (902)
NetBeans Part6 (864)

Excel VBA 質問スレ Part26


1 :2012/08/19 〜 最終レス :2012/11/02

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 :

関連スレ:
VBAなんでも質問スレ
http://toro.2ch.net/test/read.cgi/tech/1342087380/

3 :
MsgBox ">>1乙", vbAlert
しかしWin8でもVB6サポートされるとか
やっぱ当分VB系は安泰だなぁ

4 :
閉じたままのBook内のデータを参照するにはどうしたらいいですか?
そして閉じたぱぱのBook内のデータをオートフィルタすることもできたりしますか?

5 :
パパやママのことは、直接本人(両親)に相談してください
というのはさて置き、閉じたままと言っても、当然本当に閉じたままでは
何も出来るわけが無いので、「閉じたまま=GUI上で開かず」と解釈すると
ExcelのCOMインスタンスを作ってやってそれで開けばいいだけ
後の操作は普通に開いてるブックやシートと全く同じ
GUI上には表示せずに、裏で開いた状態でなんでも出来る

6 :
>>4
どうしてググろうと思わないわけ?

7 :
http://prt.iza.ne.jp/images/news/20120819/502425_c450.jpg
雷でよく見る実にわかりにくい図のことで質問です。
濃いピンクが安全だということらしいけど
それより内側は危険であり、さらにそれより外側も危険という認識で合ってますか?

8 :
どこの誤爆だw

9 :
ExcelVBAで
Outlookのテンプレートの機能をプログラミングをしたいのですが
その方法を教えてくださぃ。
Outlookのテンプレート機能を使わないのは
メールの本文中にその当日の「日付」を使ったり
Excelのセルに用意したデータをメールの本文に使いたいからです。

10 :
outlookのvbaでやれ

11 :
みんなおはよう
>>7
合ってると思うよ

12 :
モジュル先頭で宣言する変数はそのモジュル全体で使えるとのことですが
マクロ実行後も値はそのままですか?
次回にマクロ実行したときは値はそのぱぱ残ってる値に加算されますか?

13 :
>>12
その変数がクリアされなければ残ってる。
いつクリアされるのかは、明らかではない。
クリアされて困るなら、シートに保存すべし。
詳しくは、こことか参照。
http://www.moug.net/tech/exvba/0150116.html

14 :
>>5
COMインスタンスとはなんでしょぅか?
>>13
びっくりですね。
これからはモジュル先頭で変数は宣言しないことにしました。

15 :
>>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 :
>>15では無いが
よく解らなかったらとりあえずシートに残して使う時だけ拾うようにしとけば良いんでねーの
解ったら自分で直せる訳だし
COMはググれとしか。多分意識しないでも使ってるんだろうけど。

17 :
ユーザーフォーム表示してると表示されてる間はまずクリアされないよ

18 :
ユーザーフォームを表示している時に
別のブックを開いてアクティブにするにはどうしたらいい?

19 :
元のブック.ユーザフォーム.Activate

20 :
ありゃ?
元のブックのユーザフォーム.を開くには
元のブック.ユーザフォーム.Showでできないのはどうして?
>>18
単に「別ブック.Activate」でいいじゃん。

21 :
>>20
マクロから開くのではなくて、
普通にフォルダからダブルクリックで開いたときに
アクティブになるようにしたいのです。

22 :
>>21
したいのならしろよ。

23 :
他ブックのFormをActivateするにはどうしたらいいですか?

24 :
荒らすなよ

25 :
>>21
マクロ使わないなら、スレ違いだからどっか行って。

26 :
>>25
スレ違いですか?
元々開いてるユーザーフォームのあるブックの
マクロで設定できないかと思ったんですが

27 :
thisworkbook:
private sub workbook_open()
userform1.show
end sub

28 :
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 :
>>28
ActiveSheet.Cells(1, num).Select
にしてみたら?
あと、Withとか使うと楽かもよ

30 :
>>28
numが定義されてないんじゃね

31 :
>>30

32 :
>>31
やめて!桃白白にむやみにリンクを張らないで!
定義のエラーっていってたから定義されてないんじゃねって桃白白考えたの
Cellsはオブジェクトが指定されなかったらアクティブワークブックのアクティブシート
を返しちゃうだろ WorksheetsほげほげActivateでアクティブシートが選択されてんだから
ActiveSheetってつけなくてもいんじゃね

33 :
フォフォフォ…
  ∧ ∧
  |≡V≡|
  |O(\)O|
(V)(゚Д゚)(V)
 ヽ三i三ソ
  (/ \)
  ∪"∪

34 :
フォッフォッフォッ
 (V)∧_∧(V)
  ヽ(・ω・)ノ
   / /
  ノ ̄ゝ
フォッフォッフォッフォッフォッ
   (V)∧_∧(V)
    ヽ(  )ノ
     / /
 .....ノ ̄ゝ

35 :
マクロを頻繁に使ってたらPCが非常に重くなり、Excelの超基本操作のセル移動でさえ2-3秒かかることがあります(通常は一瞬)。
仕事で使ってるのでAM9からPM6までずっとExcelは立ち上げたままです。
マクロが原因なのは間違いないと思います。
軽くするにはどうしたらいいでしょうか?

36 :
>>35
マクロが原因だということまで特定できてるなら
そのマクロのバグを修正しろよ・・・

37 :
>>36
そんなこといわずに
あなたが上級者なら
よく初心者が犯しがちな
メモリーを消費したままになる良くないコードを予想し
それに対しての対策を指示してあげたらどうです?

38 :
>>37
エスパーしたらいいじゃない! 教えてくれたらいいじゃない! ってか
じゃあ桃白白が教えてあげちゃう
グローバル変数使うのやめな これで100%解決する
桃白白に感謝しちゃったらいいじゃない

39 :
残念ながら白桃には感謝できん
グローバル変数なんて野蛮なものは使ってないからだ

40 :
>>39
いいやお前はグローバル変数を使っている
使っていないと思い込んでいるだけだ
桃白白は上級者だがお前は初心者だ
初心者は上級者の言うことを素直に聞くべきだ
お前はグローバル変数を使っている お前はグローバル変数を使っている 目を閉じて反芻しろ

41 :
>>40
のび太のくせに生意気だ

42 :
VBA触り始めて数日の初歩的な質問ですみません。
環境はWindows7、Excel2007です。
ユーザーフォーム上のテキストボックスに
セルをリンクさせたいのですが、テキストボックスのプロパティの
Text欄、Value欄に「=Sheet1!A1」と入れても「」内の文字列が
そのまま表示されてしまいます。
Excelのシート上のテキストボックスで同じ操作をすると
そちらはきちんとセルがリンクされるのですが…。

43 :
>>42
ユーザーフォームのテキストボックスなら
「=Sheet1!A1」を入れるのはControlSource

44 :
>>35
エラーメッセージとか出ないの?
Excel2007だとこんなバグもあるみたいだけど
http://support.microsoft.com/kb/971594/ja

45 :
>>43
おおおおお!出来た!
これでとりあえず形だけは完成しました。
ありがとうございます

46 :
>>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 :
>>46
各コマンドボタンのクリックイベントに
Sheet2.Cells(1,1) = "= SUM(Sheet1!C:C)"
って入れといたらどうですか?
あと、On/Offの2値を扱いたいなら
コマンドボタンよりトグルボタンのほうが良くないですか?

48 :
>>46,47
まずControlSource使うのやめて、
各ボタンのクリックイベントに、TextBox1.Text = Sheet2.Range("A1").Valueとか書くのが正解だろ
(つかそう書いたサブルーチン呼べ)
というかまずボタンを重ねて配置するとか馬鹿なことをやめろよ

49 :
埋め込みグラフの目盛り線を選択したいのですが、エラーになってしまいます。
ActiveSheet.ChartObjects(1).Chart.Axes(xlValue).MajorGridlines.Select
どこを直せばいいですか。

50 :
シートに挿入したチェックボックスが消せません。
どこを直せばいいのですか。
Activesheet.Shapes.Delete

51 :
>>49
なんというエラーが出る?桃白白にもわかりそうなエラー?
わかりそうなやつだったら答えちゃうけど

52 :
>>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 :
>>47
>>48
役割はトグル以外の何物でもないのですが、
クリックすると白黒画像からカラーに変わるギミックを
どうしてもやりたくて、方法がわからずこのような原始的な方法を取りました。
各ボタンに記述してみます。ありがとうございました

54 :
>>49
選択しようとするからじゃないの?
ActiveSheet.ChartObjects(1).Activate

55 :
>>54
ActiveSheet.ChartObjects(1).Activate
ActiveSheet.ChartObjects(1).Chart.Axes(xlValue).MajorGridlines.Select
できましたwありがとうございます

56 :
>>55
そんなの桃白白認めない

57 :
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 :
>>57
ちゃんと宣言されてないよ

59 :

初心者がよくハマるやつだな
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 :
初心者じゃ無いつもりだけど未だに分からないのがdecimal。
なんで宣言出来ないんだ??

61 :
>>60
仕様に対して「なんで」って言い出したらキリがない

62 :
現在、10 進型はバリアント型 (Variant) の内部処理形式でのみ使用できます。変数を 10 進型として宣言することはできません
ってヘルプに書いてあるから、そういう仕様だとしか

63 :
ある程度割り切りも必要だけど、
何事にも疑問を持って追求しようとする姿勢が無いとダメだよ。

64 :
調べれば仕様だって事はすぐわかるんだが、追及なんて全くしてないだろ
なんでそういう仕様なのか考えるのはまだ意味があるかもしれんが

65 :
一応Currency型があるから。
誰も覚えてなさそうだけどw

66 :
57です
59様、ありがとうございます。
てっきり複数列挙してもまとめて型宣言できるものと思っていました。

67 :
セルにAlt+Enterで改行したデータを
ユーザーフォームのTextboxに入れようとしても
改行してくれないんですね。
何かいい方法はないですか?

68 :
>>67
たぶん MultiLineがFalseになってるだけだと


69 :
>>68
ありがとう!

70 :
>>63
追求する意味があるものと無いものを見極める能力も無いとダメだよ
何も解ってない状態で割り切って諦めるのと、追求する意味がないことを見極めて
無駄な愚考をしないのは違うからね

71 :
おまいらが作ったクラスモジュール教えてくれ
使える、別のアプリ専用、面白い、誰得と何でもいいわ

72 :
>>71
具体性のない質問というかネタクレクレはスレ違い
>>2でも行くかググって漁れ

73 :
ソート用クラスなら。
並び替えられるデータは数字の入った配列で、
比較メソッドはイベントとして使う側で実装する形。
数字=インデックスとして見れば、どんな内容のソートにでも使える。

74 :
入力データを取り込むのに
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 :
ユーザーフォーム使えば良いだけだと思うよ

76 :
使う方が嫌じゃなければカンマで区切るとか

77 :
あとはforで二回まわすとか?
ユーザーフォームが一番スマートだと思うけどね

78 :
ユーザーフォームって本を買ってきてVBを独学したときに作った記憶があるな
クリップボードから拾わせた文字列を入力の初期値にして
文字列を入力したらVBに取り込んで
シートのフィルターの指定フィールドで抽出させるというのを作ったんだけど
やっぱり複数の文字列で同時にフィルターを掛けたいときが時々ある
同じ内容なんだけど、入力した時期によってキーワードが違っているときとか

79 :
解読しづらい文章だな

80 :
各セルの文中の最初に「★」がついてるものだけを探して「★」だけを消すのはどうすればよいでしょうか
最初でないところ(文中)にも「★」が出てくることがあるので検索して丸ごと置換というわけにもいかず困っています
よろしくお願いします

81 :
>>80
Range.Findで探して、Mid$関数で消せば良いんじゃないか?
その条件ならワイルドカードが使えるし。

82 :
    Selection.Replace What:="★*", Replacement:="", LookAt:=xlWhole, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
たんに全体一致で"★*"を""で置き換えるだけだが。VBAいらね

83 :
>>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 :
if instr(hoge,"★") = 1 then
right(hoge,len(hoge)-1)

85 :
エクセルでwavファイルを取り込んでmp3で保存することは可能でしょうか?

86 :
常識だろw

87 :
>>85
エクセルでやる意味について

88 :
>>85
世の中広いな

89 :
>>87
エクセルはみんなのツールだ。フロントエンドをこしらえるのならなかなかいんじゃないか。

90 :
>>85
可能だけどスレ違い

91 :
マクロ1でマクロ2を走らせる時、どちらも同じ変数名を使っているのですが問題ないですか?
それぞれのマクロの中で値を指定していれば大丈夫ですよね?
一応動くのですがちょっと不安なので詳しく教えてください

92 :
変数にはスコープって概念があってな
大丈夫かどうかはソースみないと何とも言えん

93 :
Public変数を知らなそうなので大丈夫でしゅ

94 :
ユーザー定義関数の引数にrangeオブジェクトを指定した場合、
その値が数値の場合は配列に入れ直した方が処理は軽くなるのですか?
範囲は固定ではなく任意です。
環境なくて試せません。お願いします

95 :
軽くって?
配列に移し替える時にループ使うから意味ないと思うけど

96 :
>>95
失礼しました、シートから関数を直接呼び出すと挙動が重かったので軽くとかきました。
たしかにループしたら効果半減ですね…


97 :
ソートの質問です
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 :
自力で関数を書く

99 :
>>97
Worksheet_SelectionChangeでググってみたらどう?

100 :
>>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 :
>>96
ユーザー定義だとどう書いても重いよね

102 :
>>100
ありがとうございます。
引数をvariantにしてしまえばいいのですかね。
試してみます。
>>101
エクセル使う人は、直感的使いたいようで。
配列数式とか駆使して挙動みながら無理のない範囲で作るしかないですよね。

103 :
>>97
Friendpaste - SortWithForeinKey
https://friendpaste.com/2SD94Big6C5rrUcyFYuphe
桃白白が全力で実装したから試してみて

104 :
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 :
ド素人すぎてクラクラするなw

106 :
そんなこと言うくらいなら教えてあげなよ

107 :
for eachで回せばいいんだよ

108 :
>>104
画像ではText Box 7って2ページ目のテキストボックスなんでない?
ページ変わってもテキストボックス取得する方法は変わらんだろ
テキストボックスを選択したら左上にテキストボックスの名前が表示されるから、そこに桃白白と入力して
ActiveSheet.Shapes("桃白白").TextFrame.Characters.Textでいけるっしょ

109 :
対象のブックが開いているか調べるのにはどうしたらいいですか?
もし、開いていたらそのままシートの内容をコピーして、
開いていなかったら、開いてコピー後、対象ブックを閉じる
というのをやりたいです。

110 :
馬鹿には無理

111 :
>>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 :
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 :
馬鹿には無理

114 :
Auto_Open が走るかどうかで判定できる気がする

115 :
>>112
A.xls側が判断するタイミングはいつ?いつでも?

116 :
>>112
他ブックからオープンしたときは
A.xlsのどこか任意のセルにその呼び出し元を記述させるようにしたら良いんでない?
たとえばB.xlsからオープンしたら
Workbooks.open(A.xls)
Activeworkbook.sheets(1).cells(1,1)="B.xls"
みたいに

117 :
http://www.officiallyjd.com/wp-content/uploads/2012/06/20120618_kinashi_15.jpg

118 :
>>112
http://www.moug.net/tech/exvba/0060076.html
これ参考にならないかな?

119 :
質問です
変数 = A1.value
A1のセルには、文字列helpme
となっているところを
A1にhelp
A2にme
としたとき、
変数= なんて.value書けばいいですか?

120 :
range("a1").value & range("a2).value
ってことか?

121 :
>>119
質問するならちゃんとしたコードで書いてよ
普通に考えて
変数 = A1.value
は「セルA1の値を変数に代入する」という意味のコードとしては
まともなコードとはいえない
これが「セルA1の値を変数に代入する」という意味のコードとして成立するためには
表記中の「A1」が「セルA1を意味するオブジェクト変数」である必要があるけど
それは>>119の質問内容からは確定できない
ちゃんと動作するコードとして書くなら
変数 = Cells("A1").Value
みたいに書いてないとおかしい
で、そういう意味であるなら
変数 = Cells("A1").Value & Cells("A2").Value
とすれば要求を満たせる

122 :
もしくはこうか
Range("A2") = Right(Range("A1"), 2)
Range("A1") = Left(Range("A1"), 4)

123 :
>>122
それは意味が違うんじゃない?

124 :
お前ら相変わらずエスパーだな俺には何言ってるのかわからん

125 :
>>124
>>119は意味分からんでもそれへの回答で理解できただろ

126 :
>>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 :
>>120
これでできますた!!!ありがとう!

128 :
こんにちは!質問です!
エクセルファイルを開いている日(毎日)からみて次の月曜日の日付を取得するにはどうすればいいですか?
つまり火曜日に開いても木曜日に開いても来週の月曜日の日付を表示し、来週には再来週の日付を表示するということです。

129 :
>>128
=TODAY()+9-WEEKDAY(TODAY())
月曜日に開いた場合の処理が指示されていないから、そこはつけたしてくだしあ。

130 :
name消し漏れ+
日曜日の判定も必要ですな。>129だと不完全です。
WEEKDAY(TODAY()) = 0と1のとき分岐してください。

131 :
>>126
>>114はダメだったのか?

132 :
セルに文字としてプラスの記号入れ方教えてください。

133 :
>>132
全角文字で

134 :
ありがとうございます

135 :
>>130
これってどういう意味?

136 :
多分解決しますた

137 :
>>131(>>114)
初めて知りました。
できそうですね。
ありがとうございます。

138 :
選択セルの日付が今日を過ぎていたら赤文字、でなければ黒文字
をマクロにしようと思い、以下を書いた
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 :
×End
○End If

140 :
>>138
end じゃなく end ifでは?

141 :
>>138
最後から2行目の「End」は「End If」でしょ。

142 :
あっ!ミスってた
有り難うみんな

143 :
ここって資格試験について質問しても大丈夫でしょうか?
公式テキストの解答で1つ理解できないものがありまして・・・。

144 :
既に終った試験だとしても、出題内容をこういうところで漏らすことが
非常識な行動じゃないと思えるほどのバカなら好きにしたらいいさ。

145 :
>>144
いや、実際の試験では無くて公式テキストのサンプル問題です。
ちょっと理屈が良く分からない部分がありまして。

146 :
何でも良いから晴れよ

147 :
福沢諭吉「脱亜論」 1885年3月16日 時事新報
日本の不幸は中国と朝鮮だ。
この二国の人々も日本人と同じく漢字文化圏に属し、同じ古典を共有しているが、
もともと人種的に異なるのか、教育に差があるのか、 日本との精神的隔たりはあまりにも大きい。
地球規模で情報が行き来する時代にあって、近代文明や国際法について知りながら、
過去に拘り続ける中国・朝鮮の精神は千年前と違わない。
国際的な紛争の場面でも「悪いのはお前の方だ」と開き直って恥じることもない。
もはや、この二国が国際的な常識を身につけることを期待してはならない。
「東アジア共同体」の一員として その繁栄に与ってくれるなどという幻想は捨てるべきである。
日本は、大陸や半島との関係を絶ち、 欧米と共に進まなければならない。
ただ隣国だからという理由だけで特別な感情を持って接してはならない。
この二国に対しても、国際的な常識に従い、国際法に則って接すればよい。
悪友の悪事を見逃す者は、共に悪名を逃れ得ない。
私は気持ちにおいては「東アジア」の悪友と絶交するものである。
         _,,,,,,__  __,,,__
        ィjj)))))))))!!!!!彡ヽ,
      /ミ/         ,}彡ヘ
      |ミ{ -‐ ‐ ‐ ‐-  {三=|
      El==; ゚ ''==. |ミミ,|
        `レfォ、,〉 :rfォ.、,  !iル┤
.        { `¨ i ・、¨ ´  `{ゞ'} 支那、朝鮮とは
.        | '`!!^'ヽ     .「´  付き合うなと忠告しておいたのに。。。
        ! ,-ニ'¬-、  ,!|,_   
.        \´?`  / ∧ヘ、
         __/〉`ー ' ´ /  〉 \
     _, ィ´「∧     /  /    」¬ー- 、_
  -‐ ´  / /  ヽ、/    /     iヾ      ヽ

148 :
>>144
公式テキストの問題と解答をまるごとここに書くのならともかく、納得できない一問について
ここに書くことのどこに問題があるのか?

149 :
引用の範疇なら問題ないだろ
VBAの設問なのか? 何だったら桃白白がお答えしちゃうけど? 貼っちゃいなよ

150 :
>>145
気になるから貼ってくれよ

151 :
質問です。環境はwindows XP , Excel2003です
エクセルファイルをメールで送信するコード、つまり
Application.Dialogs(xlDialogSendMail).Show
を使いましてメールを送信する際、引数の"Arg1"つまり「メール宛先」に
複数人のアドレスを入れる関係上、宛先文字列が256文字を超えてしまいます。
255文字以内に収めれば、上手くメーラーが起動してメール送信準備が
されるのですが、256文字を超えると、エラーが出るわけでもなく
ただメールが立ち上がらないという状態になります。
対策をする前に、なぜここで256文字を超えたらダメなのか、を一応
知っておきたいです。どなたか、知っていたら教えてください!

152 :
>>151
容量的な問題255バイトまで

153 :
ExcelVBAでLifeGameを作った( https://www.dropbox.com/s/kntdvpijtpdje90/LifeGame.xlsm )
のですが、10世代ぐらいループさせるとExcelが固まります
何が原因か教えていただけませんか?
Windows 7 Ult x64、Excel 2010です

154 :
多量のテーブルデータがあったとして、
ワークシートとデータベースって
どっちを使おうっていう判断基準を教えてください
ファイルサイズを考えて、どちらも外部ファイルにデータを置くとした場合。

155 :
>>154
具体例を挙げてくれれば助言はできるけど
そんなもん一概に言えないよ

156 :
データ数が1万レコード以上ある時はアクセスを使うべき

157 :
>>155
1000×3ぐらいの数値テーブルが、数十個あって
ランダムな場所を幾度も読み込んで計算するような感じです
速度が求められます
シートにおさまるんだけど、どちらがいいのかな〜と。

158 :
ちなみに、今はワークシートのデータをdllに投げて、処理して値を受け取るようにしているんだけど、
配布やら設定やらの問題でvbaで完結させたい。

159 :
アクセスじゃなくてエクセルでdbやってみりゃいいじゃん

160 :
メモリに乗りきらないとか、ワークシートに収まらないほどのデータがあるならDB
それ以外なら好きにしろ

161 :
>>157
その程度のデータ量なら配列に一気に読み込んでから計算するのが一番処理が速い

162 :
>>153
スリープのあとにDoEventsを呼ぶようにしたら
10000回ループしても問題なかったよ
Call VBA.Interaction.DoEvents
理屈は知らん、寝るのに忙しくて表示を更新できません的なことなんじゃね

163 :
何かというと配列云々をいうアホがいるがそれだけじゃまったく不十分
アルゴリズムの方が大事だ

164 :
アルゴリズムの方も大事だ、だろ
シートとのやり取りのコストも、これはこれで馬鹿にならないよ。
>>153
x64Win8+Excel2013で動かしてみたけど固まりはしないな。
ただ、ESCキーでの実行中断が何故か効かなくなった。

165 :
>>162
固まらなくなりました。ありがとうございます
ちょっと理屈調べてみたいと思います
>>164
環境にもよるみたいですね。テストありがとうございました

166 :
>>153
余計なお世話かも知れないが、
プログラムが動作するしない以前の問題として
変数の宣言が間違ってる。
dim a,b as integer
だと、aがVariant型、bがInteger型になる。
あと、変数名間違ってるのが数カ所あった。
Option Expricitで変数の宣言を強制する癖をつけた方が良いと思う。

167 :
綴り間違えた
×Expricit
○Explicit

168 :
これは恥ずかしい。

169 :
>>152
ありがとうございます。その255バイトまでっていうのが
何の仕様なのかが、どうも掴めなくて気持ち悪いんです。
変数の型はバリアントにしているので、変数の型によって255バイト
っていう制限がかかるわけじゃないし
Application.Dialogs(xlDialogSendMail).Show の引数は255バイト
までと決まっている(仕様)、ということなんでしょうか?


170 :
>>169
メールのtoフィールドが255バイト以下ってのはRFCで決まってたはず
それ以上送りたい場合はtoフィールド自体の数を増やせばいいんだけど、
受け取った側から見るとあんまり気分の良い物じゃないのでBCCなどを使った方がいい

171 :
>>170
マジで!? メールアドレスの最大の長さが255文字でTOが複数のアドレスを含むことが
できるとするなら理屈としてはTOは255文字以上を許容しないといけないんじゃね?
>>151
配列でアドレスを指定できるんじゃね?
Application.Dialogs(xlDialogSendMail).Show Array("桃白白さん", "ブルマさん")
みたいにして

172 :
>>166
まじかよVBA糞だな首吊ってきます

173 :
>>169
自作鯖ならsendmailmaxなんちゃらみたいな設定がたぶんhtod.confとかにあると
思ったけど
to Cc Bccでの上限数はあまり変わらないんじゃないか

174 :
>>172
VBAがというか大本のVBがそういう仕様だからなぁ
つか知らなきゃそう書いちゃうよな

175 :
質問です。
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 :
ExcelのVBAについて学ぼうと思っています。
まだまだ初心者なので、VBAについてお詳しい方、
ExcelのVBAでのテーブル作成方法を教えてください。

177 :
↑入力項目は@入力年月日A転出入りフラグ1、転入2、転出(選択すると自動的にカウントアップ)B氏名C新住所D性別
E年齢F生年月日F職業G男性人口±H女性人口±I全体の人口±といったところです。
このデーターを格納し帳票に飛ばしカウントアップしてデイリー分の男性、女性の転出、転入を出力データとしてまとめ
総人口数を求めるようにしたいのですが。

178 :
馬鹿には無理

179 :
>>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 :
>>176
データベースがメインになるんなら
Accessでやっちゃった方がよくね?

181 :
access高いから避けたい

182 :
>>181
データベースに何を使うかは決まってんの? MDB?

183 :
PostgreSQLが良い

184 :
>>183
ゾウさんのやつな、かっけーよな

185 :
教えて下さい。
excel vba でIE object のコントロールで
ajaxを起動できますか?
fireeventでjavascriptはわかったのですが
selectにonclickがなくajaxでload window
しているものがありどう呼び出せばよいか
悩んでます

186 :
★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 :
重ねたバケツが抜けないのですが、何か良い方法はあるでしょうか?

188 :
外側のバケツのみ熱します

189 :
どうやって熱しますか?

190 :
油を注いで熱します

191 :
>>185
的外れかもしれないけどブックマークレットで呼ぶとか?
http://shokai.org/blog/archives/1234

192 :
>>177
DAOとかADOとかでExcelをRDBみたいにSQLで扱えるから
そういう感じでやれば良いんでね
やり方はググって好きな方法選んでくれ

193 :
みんな聞いて。桃白白のExcelの使用期限が終わりそう、繰り返す、桃白白のExcelの使用期限が終わりそう。

194 :
Excelって使用期限が設けられているライセンス体系もあったんか
次買うときはケチらずに無期限ライセンスのを買えよ

195 :
>>194
桃白白貧乏だから買えないの。寄付する? するんだったら桃白白はその好意を決して断らない
ことをここに誓う用意があるけど?

196 :
パソコンをリカバリすればまた体験版が使えるようになるよ

197 :
>>195
互換Office使えばタダだよ
VBA使えないけど

198 :
貧乏だけど知識が豊富で頭も良くて有用な回答者にならOfficeくらい寄付してもいいが、
貧乏な上に知識も多少の回答は出来るが並以下レベルで、頭の回転も弱い奴となると、
べつに回答者を続けてくれなくても誰も困らないから、Excelの使用期限と共に消えてくれて
一向に構わないな

199 :
   ∧∧
   /⌒ヽ)
  i三 ∪
 ○三 |
  (/~∪
  三三
 三三
三三三

200 :
>>199
俺も貧乏だから寄付しないけどタオパイパイ嫌いじゃないよ
これからは回答せずに
にぎやかしでAA貼ってりゃいいじゃん

201 :
私の声がデムパになって
波になってあなたへ向かってく
私の歌がデムパになって
波になってあなたへ響いてく
私の愛がデムパになって
波になってあなたへ届いてく
私の電子回路が短絡する前に
Electric LOVE Electric LOVE
(∩ ゚д゚) アーアー
この気持ちあなたに届くかな

202 :
VBAであるセル範囲をコピペして他のシートに貼り付けたとき
図のオブジェクトがどういうわけかコピペされないんです。
どうすればこの図のオブジェクトも正しくコピペされて他のシートにも表示させるようにできますか?

203 :
馬鹿には無理

204 :
>>203みたいな馬鹿には回答は無理なのは分かりますよ。

205 :
ただ図がセル範囲からはみ出してるだけじゃないのか?

206 :
いえ、しっかりセル範囲内におさまっています。
列は3、行は20くらい、
図はちょうどど真ん中あたりにあり、1つのセルと同じくらいの大きさなのに。

207 :
2007以降だっけ、図形や画像のオブジェクト仕様が変わってるから
その影響じゃね確かめてないけど

208 :
>>202
コードも貼らずに・・・VBAでコピペといっても丸ごと・値だけ・図だけ・云々
値だけコピぺのコードになっていないか?


209 :
再現できたよ
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 :
きもっ

211 :
こっちのコードなら図形も正しくコピペされたよ
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 :
Select って恥ずかしいよね

213 :
なんでVBAのコードにしないんだろう?

214 :
中二病だから

215 :
覚えたてだからやってみたいだけだろ

216 :
下げ

217 :
セルの値が4:07の場合内部データでは0.17152.......となっていて
この値だと例え同じ4:07でもFIndでヒットしません。
TimeValueを使おうにもTimeValue(0.17152.......)となってしまいdate型にもできないです。
方法はないでしょうか?

218 :
>>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 :
>>218
Debug.Print Range("a3").Value
とすると小数点の値になりませんか?

220 :
訂正a1でした。

221 :
> FIndでヒットしません。方法はないでしょうか?
これが質問じゃないの?何が質問なの?

222 :
説明不足なので補足します。
エクセルのテキストファイル読み込みで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 :
>>222
Set r = Range("A1":"A10").Find(Range("A1").text)
にするとか

224 :
>>223
ででででできました。
ありがとうございました。
.text メモメモ

225 :
省略されてるけど.Valueで検索されてて、.Valueは丸められてるんだな
.Textで検索すればいけるんじゃね

226 :
【対応したい環境.】 Windows 2000以降/Excel 2000以降
とあるエクセルファイルのマクロを実行する前に、実行対象PCかを判定する必要があります。
PC名等で細かく指定することでクリアできますが、対象PCがかなり多いため、
以下条件を踏まえて捌こうと考えています。
「マクロを実行したい対象PCにのみ、専用のマクロが入った個人用マクロブックが既に設置されている」
という条件より、もともと設置済みの個人用マクロブックを判定して対象PCとする。
が良いと考えました。
これより、
Onerror goto ERR1
 Application.Run "PERSONAL.XLS!判別マクロ名"
 Hanbetu = 1
ERR1:
といった単純な内容で達成したかと思っていたのですが、
PERSONAL.XLSB(最後にB)なるものが存在し、エラーを返される事がわかりました。
どうやら新しいEXCELにはXLSBらしいのですが、
この場合にも対応するにはどうすればいいでしょうか?
Onerror goto ERR1
 Application.Run "PERSONAL.XLS!判別マクロ名"
 Hanbetu = 1
ERR1:
Onerror goto ERR2
 Application.Run "PERSONAL.XLSB!判別マクロ名"
 Hanbetu = 1
ERR2:
もし一つのマクロでONERRORが2個使えたらこんなイメージなのですが、
そのやり方を知らず、回避できませんでした。
ご教示お願いします。

227 :
自己解決しました。
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 :
へんな質問ですが、営業や事務はExcelVBA以外のプログラミング言語を知っていても仕事には役に立たないものですかね?

229 :

>1 ExcelのVBAに関する質問スレです
>>228
>ExcelVBA以外のプログラミング言語を
スレチです。

230 :
>>228
どんな知識だって有って損になるわけじゃないと思うけど、
そもそも営業にVBAの知識って要る?
事務はVBAで自分の業務を改善できるかもしれないけど、
営業ってPC弄るんじゃなくて人と会ってナンボの仕事でしょ?

231 :
VBAの設計センスを磨くのにいいサイトとか書籍とかってありませんか?
…それとも必要ありませんか…
ちなみにwindows7 excel2010です。
始めて1日目なんですが、どうもいわゆる入門書とかサイトとか見てても、
「仕様はそこそこわかった。ではこれからどうするの?」ってなりがちなのですが…
みんなは設計書とか書くんですかね?

232 :
vbaの問題ではなくプログラミングのアイデアの問題だ w
>設計書とか書くんですかね?
全く俺専用のプライベートのものだけど、最近はテキストファイルに予め作るようにしている。
作っている間にあそこをこうしないといけない、あの処理もいるな…などいろいろ出てきたりするんで。

233 :
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 :
>>233
そもそもWorkbooks.Openで開いたら、Auto_Openは実行されなかったはずだが
それちゃんと実行されてるか?
単にエラーー出ても無視したいだけなら On Error Resume Next 使え

235 :
>>234
ゴメ、ブックオープンマクロだった。
ちなみにやっぱダメみたいね。
エラー出してくれるなら拾えるんだけど、.closeにて閉じた跡、
エラーも出さずにそこで止まる。仕様だね。

さっきB.xlsからVBSへ切り替えて完成した。
どうもありがとう。

236 :
>>232
回答ありがとうございます。
少々質問が悪かったのですが
僕が言いたいのは設計センスというか設計法のことについてであり
(たとえばジャクソン法だのモジュール設計だのって言葉がネットでは調べればでてきますよね)
そういうのは一切なしで、結局はとにかく「プログラムにさせたい動作を日本語で書いて、
それをそのまま言語に落としこめるだけの作業を作成者はするだけだ」ということなんでしょうかね?
なんだかたかがVBAに自分は気難しく考えすぎなようも気がします…

237 :
ああ、ちょっと日本語が不自由なもんだから質問がわけわからない
でも疑問なんでだれかたすけてー

238 :
ちょっと質問を整理します。
1まず、VBAの仕様はわかります
2しかしこれからどうすればいいのかわかりません
3モジュール設計とかそういう設計や仕様書の勉強したほうがいいの?
という理屈なわけです。

239 :
>>235
Application.OnTimeではダメかな

240 :
>>238
一番大事なのは、「何」をしたいのかを明確にすることじゃないかな?
例えば
VBAを使って「集計レポートの作成」をしたいとか
VBAを使って「入力フォームの作成」をしたいとか

241 :
>>238
とにかく書いてセンスを養えばいいと思う。
テスト技法なんかは気にした方がいいかな。
人に配ったマクロにバグがあると一気に信用を無くす可能性がある。

242 :
>>238
設計しないとコーディングできない
設計書に落とし込むか脳内で完結するかは規模次第
テスト設計も然り

243 :
>>239
あーその手があったかぁ。
今回はVBSで逃げたけど、今までApplication.OnTimeって
使ったこと無かったけど、色々過去振り返ると便利に使えそうなシーンざくざく出てきそう。
ちょっと練習がてらに使ってみるかな。

244 :
おk
>>240.241.242 氏
回答ありがとうございます。
書いて書いて書きまくれとは、今、小説書いてたりするんですけど
クーンツの本でも同じことが書いてありました。結局「やらないことには始まらない」ということですね。
一応テスト設計という言葉も調べてみようと思います。

245 :
C♯勉強したら、VBA書けるようになりますか?

246 :
>>245
ママのRでも吸ってろ

247 :
>>246
桃白白もかわいくてRが大きいママが欲しかったよ。
ぜったいちゅーちゅーしたいよ、ちゅーちゅーとれいんを一緒に踊りたいって
意味だからな、そういうアクティブでカッコいい母親がいればいいってことだからな。

248 :
開発中のブックで下記のコードを書くと二行目のWorksheets(1)に問題があるようで動作しませんが
新規ブックで同じコードを書くと動作します。なぜですか?
Worksheets("sheet1").Cells(1, 2).Value = 479
Worksheets(1).Cells(1, 1).Value = 476


249 :
>>248
開発中のブックにWorksheets(1)がなくて
新規ブックにWorksheets(1)があるからじゃない?

250 :
>>248
Worksheets(1)をSheets(1)に書き換えてみ
もしそれで動いたんならインデックス番号1のシートの種類がワークシートじゃないって事

251 :
>>248
動作しませんってのは具体的にどういうことなんだ
単にお前が思ってるシート(sheet1)以外のシートに値がセットされてるだけじゃないのか?
試しに MsgBox Worksheets(1).Name を間にいれて何が表示されるかみてみ
>>249-250
Worksheetsってワークシートだけのコレクションだと思ったんだが
Worksheets("sheet1")があるのにWorksheets(1)が無いなんてこと起きるのか?

252 :
248です。
.Nameで確認したら僕が思っているWorksheetsではなく
その左にWorksheetが隠れていたようです。
解決しましたありがとうございました。
どうも一度ウインドウの横幅を細くして左下の右矢印を押して隠した後に
横幅を戻しても隠れたままになるようです。

253 :
>>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 :
>>251
> Worksheets("sheet1")があるのにWorksheets(1)が無いなんてこと起きるのか?
そんなん普通にあるだろ
新規ブックに対してSheet1の左側にグラフシートを追加すれば簡単に再現できる

255 :
すみません、質問!
OffsetとResizeで範囲?が取得できると思うんですが、この範囲に入ってる
数字の合計を出したい場合、どのように書けばいいですか?
Range("A1").Offset(1, 1).Resize(2, 0)
↑たとえばこの範囲に入ってるセルの合計をVBAでもとめたい
よろしくおながいします。

256 :
Resize(2, 0)はResize(2, 1)と解釈
WorksheetFunction.Sum(Range("A1").Offset(1, 1).Resize(2, 1))

257 :
>>256さん
おおお、ありがとうございます!
SUMも試したんですが、問題はResizeの引数の側だったとは…。
すません、助かりました。

258 :
>>254
再現しないんですが?
Worksheetsはワークシートだけのコレクションだから、グラフシートがあっても関係ないんですが
Sheets(1)がWorksheets(1)じゃないって状況ならいくらでも存在するがな

259 :
変数を使わずにA1からデータがあるセルまで選択するにはどうすればいいんでしょうか?

260 :
変数を使いたくない理由は?

261 :
使わずにできるならそうしたいなって

262 :
>>259
Range("A1", Cells(1, 1).SpecialCells(xlLastCell)).Select

263 :
スペシャルセルズってはじめて見た。
同じだけど
Range(Cells(1, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, 1)).Select

264 :
>>262>>263
できました
ありがとうございます

265 :
エクセルマクロでさ
シートが10ぐらいあって、そのうち5枚だけに以下の作業させたい
・1から10行までで一列目に何も入ってない行を非表示にする
これどうしたらいいの?
記録でやってみるんだけど、最初のシートしか非表示にならないんだ

266 :
>>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 :
>>266
これって右のシートから順に5つに動作する?

268 :
連投ごめん、ワークシートにはそれぞれ予算とかそういう名前がついてるんだ
どうしたらいい?

269 :
おいおい、>>259=>>264なのか?
>>259の問いに対して
>>262は正解だが>>263は違うぞ

270 :
ごめ、間違えてた?
試しても無いんだけど、あってるほうで頼む>262-263

271 :
>>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 :
もうちょっとシンプルに
If Cells(r, 1) = "" Then Rows(r).Hidden = True

273 :
>>270
>>263はA列だけしか見てないから、
たとえばB1が最終セルでもそれが反映されない

274 :
ご教授願います。
2012/8/23 10:44:24
を秒数に変換する方法を教えてください。


275 :
VBAではformatする場合は秒数を使わないのでしょうか?

276 :
ある程度使い方調べてから質問しろよカス

277 :
>>274
=Int(Range("A1") * 86400 + 0.5)

278 :
>>277
ありがとうございます。
>>276
UNIXタイムスタンプという言葉を忘れていました。検索キーワードを変えてみます。
気に障ったみたいですいません。

279 :
>>278
すみません。
こちらこそ言い過ぎました。

280 :
>>259
>>264
xlLastCellって「使われた最後のセル」であって「データがあるセル」では無いのだが良いのか?
有効データがある最後のセルがほしいのならもう一工夫必要になる。
(一列だけが対象なら>>263で有効データがある最後のセルが得られる)

281 :
牛R飲みすぎた、気持ち悪い、吐きそう

282 :
使用期限切れで消えるんじゃなかったのかよ
TAO
PAI
PAI
恐らくこのスレ内だけで生じているTPP問題

283 :
>>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 :
アンカーミスったわ
上は>>263向けね

285 :
>>283
そんなめんどいことにならないように、range(hoge).currentregionで使用範囲を特定できる構成にするのがいいよ

286 :
>>283
そのコードはレアケースで壱番下までデータで埋まってると失敗する
まあ現実的には下まで埋まる前にデータ大杉でExcelが無反応になると思うけど

287 :
>>285
俺も>285に賛成だなぁ。

288 :
>283

289 :
他を否定、アレンジして主張するもなお粗末な出来。
挙句の果てには
>変数を使わず
 に対し
>Findメソッドで
>変数を使うのが普通だ
なんだろうこの痛い奴・・

290 :
OFFICE XPを使用しています。
A列にID、B列に数値が入っており、
IDと数値の関係は1対多になっています。
(A列には複数のIDデータが入っています。)
このデータで、各IDの最初の数値だけ必要であり、
それ以外の行を削除したいと考えています。
for nextで最終行からIDのマッO、削除をする
VBAを組んだのですが、データ量が多すぎて
処理が時間がかかりすぎる状況です…
どなたか改善策のヒントをご教示いただければと思います。

291 :
>>290
データが多いって、具体的には何件?
VBAなんか使わんでも重複の削除は簡単にできる
ttp://office.microsoft.com/ja-jp/excel-help/HA001034626.aspx
Office2007以降なら「重複データを削除」ってボタンがあるから、それクリックするだけ
どうしてもVBAでやる必要があるんなら、下からDictionaryに突っ込んでけば
自動的に先頭の数値だけが残るけど、とりあえず作ったコード晒してみ?ちょっとの手直しで
劇的にスピードアップする可能性もあるから

292 :
>>289
アレンジ?
Cells(Cells(Rows.Count, 1).End(xlUp).Row, 1)の間違いを正しただけなんだが
Cells(Rows.Count, 1).End(xlUp)と同じだもんねぇ
いまどきこの程度が分からないやつはあまりいないけどな
>>286
知ってるよ

293 :
>>292
Cells(Rows.Count, 1).End(xlUp)はアマチュアの書き方
Cells(Cells(Cells(Rows.Count, 1).End(xlUp).Row, 1).Row, 1)と書くのがプロ
そんなプロはいねーよと言いたい人もいるだろうが実際にいた

294 :
>>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 :
vlookupを使って処理したいのですが、データが多くて時間がかかります。
具体的には、Aシートに氏名と来た日時が入っており(各人何回も来ているとする)、
Bシートには氏名と誕生日が入っています。
各人、誕生日の3日後以前に来た日のデータを削除したいのです。
どうかお知恵をお貸し下さい。

296 :
単純にAシートに、Vlookupより取得した誕生日列を追加して、
=if(来場日<誕生日+3,"削除対象","")
とかじゃダメなの?

297 :
Excelのマクロって
Excel用に便利な関数みたいのを作れるだけで
それ以外に使うことって出来る?

298 :
>>297
ゲームでもなんでも作れる
ttp://www.geocities.jp/excel_game/

299 :
>>298
その作ったものを
Excel上以外で動かせる?

300 :
>>299
無理だと思う
VBに移植すれば単独起動も可能になるけど、Excelの機能を使ってる場合は
結局はExcelもインストールしとかないと動かない

301 :
>>299
「Excel上以外」というのが、Excelを起動しないで、という意味なら、OLE経由で可能。
詳しくは"windows ole excel"で検索。

302 :
Excelインストールしないでも動くの作れないかな

303 :
Access使えよ

304 :
VisualStudio使えよ
タダだよ

305 :
Accessもインストールしないと使えないしなぁ

306 :
>>304
それが正解っぽい

307 :
Excelマクロで作ったゲームをExcelのインストールしてないPCで遊ぶ方法ねぇ・・・

308 :
Flash最強説

309 :
Flashは開発環境が有料だし、VisualStudioでいいじゃん

310 :
Flashはやりたいことばかり実装しててセキュリティとかすっぽり抜けてた
今更直せませんごめんなさいって開発チームが謝ってたろ
アップルも嫌がらせだけで外した訳じゃねーぞ半分ぐらいは

311 :
AndroidからもFlash終了
そのうちデスクトップからも消えるのは時間の問題
っていうかスレチ

312 :
Worksheets("result").Cells(writerow, 2).Formula = "=100*SUMPRODUCT((MOD(ROW(O" & startrow & ":O" & finishrow & "),2)=0)*O" & startrow & ":O" & finishrow & ")/D " & finishrow
というコードが、
実行時エラー '1004':
アプリケーション定義またはオブジェクト定義のエラーです。
と表示されてエラーになってしまいます。
変数自体はちゃんと認識されています。
何が間違っているのかご教示ください。お願いします。

313 :
>>312
Dの後ろのスペース

314 :
>>313
うわわ、本当だ…
ありがとうございました!

315 :
いつも参考にさせていただいています。
下記、どうかお助けください><
現在、エクセルのマトリクス表をテーブルに変換する作業が必要となっており、
私の知識では対応できないため、皆様のお知恵をお借りできないでしょうか。
【イメージ】
(基データ)
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 :
セルの指定方法は、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 :
>>315
ttp://www.excel.studio-kazu.jp/kw/20120921172512.html

318 :
ユーザー定義関数で例えば
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 :
>>318
Function プロシージャを使う
Function CellValue(address1 as Long, address2 as Long) As Variant
CellValue = cells(address1, address2).value
End Function

320 :
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 :
>>320
If Len(Cells(i, 1).Text) >= 0 Then だと全行がTrueになるような・・・
If Not IsEmpty(Cells(i, 1)) Then にするとか

322 :
>>321
ありがとう。
出来ました。

323 :
XP SP3?
Excel 2003
Excel起動時にPERSONAL.XLSからマクロを実行して時間指定、
指定時間になる度(10:00と11:30とか複数あり)に、
他のアプリケーションを実行していてExcelが隠れていてもExcelを表示させたい
要はタイマーにしたいのですがうまくいきません
Workbook.activateではうまくいかず、
CreateobjectならExcelの表示には出来ますが、新たに開いてしまいます
出来れば既に開いているPERSONAL.XLS(シートは非表示ですが)を表示させたいと考えています
どなたかググる際のキーワードでもいいので教えてください

324 :
>>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 :
>>323
タイマーイベントを仕込みたいって事?
でも基本的にそういうスパンの長いものは
タスクスケジューラとかで実装するもんだと思う。
あと既存のExcel取得したい時はCreateObjectじゃなくてGetObject
という感じでキーワードを散りばめてみたがどうか

326 :
>>323
「Excel 最前面」
SetWindowPos()かな?

327 :
>>103
スーパー亀ですが実装再開します
VBAの新規画面に入力するとEndSubが必要と出るのですがどこが違うのでしょうか

328 :
>>327
最初のSubの次の行に入れたらエラーなくなりました
しかしどうすれば動くのかわからない…

329 :
>>328
Sheet1でしを選択してSortTable関数を実行したらいいよ

330 :
>>329
うんともすんともです…orz
EndSubを2行目に入れるのはあってますか?
入れないとエラーが出ますが入れても動かないのです

331 :
>>330
2行目ってどこの2行目? 桃白白のコードには入れたらまずいよ
1行目には何がある?

332 :
>>331
マクロにコピペしていたのでSub test()とかなっちゃってました
新規VBAとして書き込んだらできました
ありがとうございます!

333 :
>>331
何度もごめんなさい…
これって一度動かしたら、動かした後のシートに対して同じ動作はできませんか?

334 :
>>333
あ、3行目だけに有効だとわかりました
全行で同じ事やりたいので何とかならないか考えてみます

335 :
>>334
関連度がさ・し・す についてしか定義されてないんだから
他の文字では何も起こらないだけでは?

336 :
>>335
わお
自分ばかすぎでした逝ってきます
助かりましたありがとうございました

337 :
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 :
Debug.Print Join(dateArray.Item(1))とかDebug.Print Join(dateArray(1))やりましたがエラーになりました。

339 :
検索値と一致する値が連続した複数行にあるとします。
その最初と最後の行のrowsを取得したいのですが、
for nextを使わずに処理する方法があればご教示下さい。
よろしくお願いします。

340 :
>>337
めんどくせぇ。
vArrayって何なんだよ。
実行したらどの行でどんなエラーになるんだよ。

341 :
列数-1のループなのに、1セルごとに縦方向に参照してるのは正しいのか?

342 :
>>337
・ソース貼るなら端折るな
・どう上手くいかないのか具体的に書け
・上手くいかないミニマムコードを書いて貼れ

343 :
Dictionaryって、keyとitemのペアだよ。
あとJoin()ってなんだよ?

344 :
ツッコミどころ満載のコードですいません。
今ミニマムコードで試したら
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 :
Dictionaryオブジェクトと動的配列はどこ行ったんだ

346 :
ちょっと近所へ買い物へ行ってる

347 :
>>339
ttp://www.eurus.dti.ne.jp/yoneyama/Excel/vba/vba_find.html

348 :
>>344
質問内容が変わっちゃったの?
とりあえず Option Explicit 書いてみたら?

349 :
>>344
どうやらっておまえ・・・・
F1くらい押せよ

350 :
Collectionのインスタンスにarrayってつけるのやめません?

351 :
コレクションと配列とディクショナリの区別がついてないんだな、きっと

352 :
>>337
何がやりたくて何で躓いてるのかよくわからないけど
もしかしてUnion使ったら解決するとか

353 :
仕事で売り上げの比率を出さなければならないのですが質問させて下さい。
総売り上げから人件費%経費%など円グラフにするにはどうすればいいですか?
総売り上げが100%です。
宜しくお願いします。

354 :
>>353
>わからなければとりあえず「マクロの記録」(Alt, T, M, R)
質問内容が伝わってこないので、もう少し具体的に質問してください
何がやりたくて、現状どんなソースコードを書いていて、どこでどのように行き詰っているのか、とか
丸投げしたいならせめて入力情報と現状のソースが入力されたブックをアップしてください

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

マクロ実行中に手動で他のブックを開くことができません。
マクロ実行前に他ブックを開いておけば、編集作業はできます。
実行時間が1時間近くなるので困っています。

356 :
>>355
実行しているマクロの所々にDoEventsを入れる。
所々というのは、Loop行の前とか、関数呼び出し後とか適当に。

357 :
>>355
力業だけど別プロセスでExcelをもう1個起動して作業するという手もあるよ

358 :
>>355
OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls?")
これだと開くファイルを自分で選べるけど

359 :
1時間もかかるマクロを実行中のPCで他の作業やるなんて・・・

360 :
>>359
いまどきのPCなんて大概マルチスレッド対応なんだから
Excel実行中に別の事したって問題ないでしょ

361 :
下記のコードがうまく機能しないで困っています。
nowrow、maxrowは変数で、resultシートの現在の値を検索値とし、
sheet1の2行目から最終行までの範囲で検索し、その4列目の数値を
変数kaiとして求める式です。
kai = Application.WorksheetFunction.VLookup(Worksheets("result").Range("A" & nowrow), Worksheets("sheet1").Range("A2:A" & maxrow), 4, False)
ヒントをください。
どうかよろしくお願いします。

362 :
我ながらアホだ・・・
自己解決しました。

363 :
>>362
もしかして
"result"
ここか?

364 :
>Worksheets("sheet1").Range("A2:A" & maxrow)
4列目だと?

365 :
VBAを使って
Excelのある内容をグラフ化してそのグラフをJPGとして
デスクトップに保存したいのですが
なんとなく
VBAでワークシートにグラフを作成

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

JGP形式でデスクトップに保存
を自動でするみたいなのを想像していますが
もっと簡単なやり方とかあるのでしょうか?
上記の方法だとペイントがある事が前提とかマシンに依存しすぎなので避けたいです

366 :
>>365
excel vba グラフ 画像 保存
とかでググる

367 :
>>356
所々にいれてはあるのですが、なかなか起動しですね
>>357>>358
いいアイデアもらえました。実現できそうです
>>359
webアクセス→テキスト整形、貼付なので負荷は重くないです

368 :
>>360
負荷的なことを言ってるんじゃなくて別の作業することでPCがフリーズしたりとかすると
また最初からマクロ実行しなおしになって時間がかかるなと思っただけ
あんま気にしないで

369 :
すいません、どなたかご教授下さい。
Sheet1にA列B列C列の3列でできた表があって、C列の数値が10以上ならSheet2にA列B列を表示させたいのですが
関数で表示させるとしたら、どういう関数式になりますか?

370 :
ExcelのVBAに関する質問スレです

371 :
スレ違いすみません;質問に適当なスレに誘導していただけませんか?

372 :
Excel総合相談所 105
http://toro.2ch.net/test/read.cgi/bsoft/1346498940/

373 :
>>371
Rもみもみしてくれませんかみたいな
Excel総合相談所 105
http://toro.2ch.net/test/read.cgi/bsoft/1346498940/

374 :
>>372>>373
ちんもみは勘弁ですw
ありがとうございます、行ってきす。

375 :
Rの事R言う奴は大概短小

376 :
>>374
二度とくんじゃねえよバーカ

377 :
>>373
Excelの期限はもう切れたのか?

378 :
>>377
切れた、完全に切れた、もう使えない・・・寄付する?してくれてもいいけど?

379 :
>>378
PCリカバリで体験版の使用歴リセットできるよ

380 :
>>378
ネット解約してその金でExcel買え
みんなハッピーになれる

381 :
無料のオフィスソフトあるだろ。
アレ使え。

382 :
ソレはVBAも対応してるのか?

383 :
VBAあきらめてVB使えば?無期限完全無料だぞ
あと、VBならゴニョゴニョ……

384 :
VBが無料と申すか?
10万円以上するんじゃなかったか?
ゴニョゴニョとはどういうことか教えれ。

385 :
何年前のはなしだよw
てかお前の知ってるVBは死んだ。

386 :
Office体験版の期限が切れても、VBからOLE経由でExcelのブックを開くと、あら不思議

387 :
あら不思議(藁)

388 :
OLE OLE 詐欺

389 :
質問です。
VBA本で有名なこの人ですが
http://www.amazon.co.jp/立山-秀利/e/B004LA5SL6/
自分の写真を公開してるということは、自分のことをハンサムで男前でカッコいい部類に入ると思っているからなんでしょうか?

390 :
OSとExcelのバージョンは?

391 :
>>389
違います。桃白白のほうがイケメンです。

392 :
>>391
写真うp

393 :
>>392
http://pic.prepics-cdn.com/shomaru/17166204.jpeg

394 :
桃白白と書いた紙を持って撮って

395 :
http://www.dotup.org/uploda/www.dotup.org3475059.jpg.html

396 :
>>394
桃白白の家庭では小さいころから桃白白と書かかれた紙を持って写真に撮られたら魂抜かれると
教わって育てられる、都市伝説かもしれないけど、迷信かもしれないけど、桃白白は昔の人が
代々語り継いできた言葉を大事にしたい、だからそれは無理だけど、イケメンだろ? ほれるだろ? お前はもう桃白白にほれている

397 :
>>396
ExcelVBAと書いた紙を持って撮って

398 :
三つ編みじゃない桃白白なんて誰が認めるか

399 :
>>325,326
遅くなりましたがレスありがとうございました
できました!と書きたかったのですが、
まだ時間がかかりそうです
単純なウィンドウ操作だけではうまくいかない感じで、
APIのスレッドIDとかプロセスIDとか勉強してみようと思います

400 :
>>399
画面をとにかく最前面に出すってのなら、SetWindowPosを使った例がExcel VBA 裏ワザ大辞典って本に載ってる

401 :
SetWindowPosでもダメだったんですよね
うまくいくときもあれば、そうじゃない時もあって
幸い仕事も暇なので、色々勉強します

402 :
テキストボックスに現在の時刻+3分先の時刻を表示するにはどうすればいいですか?
リアルタイムで進まず、ボタンを押したら2012/10/02 20:10
みたいな感じで表示したいんですが

403 :
>>402
=NOW()+"00:03"

404 :
>>402
TextBox1.Text = Format(Now() + TimeValue("00:03"), "yyyy/mm/dd hh:mm")

405 :
>>401
あんまり上手くいかないようならExcel以外の手も組み合わせると良いと思うよ
このスレ的には反則だけどもExcelオンリーじゃなきゃダメってんでもないんでしょ?
勉強なら良いけど、仕事なら手を狭めるのは損だ。

406 :
質問です。テキストボックス1から6まであり、チェックボックスが2つあります。
クリアボタンを押したとき、初期の入力画面に戻したいのですが
やり方教えてもらえると助かります
お願いいたします

407 :
>>406
その「クリアボタン」って何?
コマンドボタンかなんかですか?
「初期の入力画面」てのも
どういう状態が初期なのか分かりません。
もう少し詳しく説明してください。

408 :
>>407
失礼しました。
自分でボタンを作って、そのボタンを押すと、テキストボックス1番から6番に入ってるテキスト情報を削除し、
尚且つ、チェックボックスでチェックが入ってる場合、それをチェックなしの状態にしたいと思ったんですが。
やり方がわからないのでアドバイスいただけると幸いです。

409 :
'ファイルを開く
Workbooks.Open "C:\aaa"
'あああシートを選択する
Sheets("あああ").Select
こういう処理があるのですが
どうもファイルをオープンする前にシートを選択する処理が走っていて
当然まだファイルが開く前だからそんなものは無いって言われて
落ちてしまいます
確実にファイルが開いてから次の処理に進ませるために
これって対応する場合どういうのがいいのでしょうか?

410 :
>>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 :
>>410
そうじゃなくて、for i=1 to 6みたいな使って行を減らしたいの

412 :
>>411
メリットがないのでやめた方がいい

413 :
>>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 :
>>411
たった2個じゃ一行も減らない
Private Sub CommandButton1_Click()
 For i = 1 To 6
  Controls("TextBox" & i).Text = ""
 Next
End Sub

415 :
こういうのって、思い付いたときは良さげに見えるけど、
実際書いてみたら何か読み辛いなあ、で結局元のコードに戻す。
未だにこのパターンで時間を無駄にしてしまう事があるなw

416 :
コピペしたらエラー出た
テキストボックスのクリアは出来た。ひとまずありがとう。でも
 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 :
sp = split("aaa,bbb,ccc",",")
これで分割されてspの中に配列としてaaa、bbb,cccが入れられるのですが
sp = split("aaa,bbb,ccc",",")
sp = split("eee,fff,ggg",",")
みたいに一回目に分割させた配列の中に2回目に分割した内容を
追記するような方法ってあるのでしょうか?

418 :
繋いでから纏めて分割したら良いんじゃね?

419 :
>>417
str = "aaa,bbb,ccc" & "," & "eee,fff,ggg")
sp = split(str , ",")

420 :
array = Range("A1:C10000)
だとRengeの内容がarrayに格納されるのですが
メソッド化して、arrayという変数を引数にして使いたい場合
call aaa(array)
funcion aaa(s1 As Object)
s1 = Range("A1:C10000)
end function
だとうまくいきません
ご教授ください

421 :
>>420
そもそも値を返さないならfunctionである必要がない

422 :
Variant

423 :
適当に書いてみる
Sub aaa(ByRef s1)
  s1 = Range("A1:C10000")
End Sub

424 :
Excel VBAを使って体脂肪率を下げたいのですが、どのような
コードを書いたら下がりますか?いい解決方法を教えてください。

425 :
>>424
連休中に水しか飲まずにコーディングすれば下がると思うよ

426 :
ブラック企業に入って何日も家に帰らずにプログラム書く

427 :
>424が体脂肪計に乗ったときだけ分岐して、A=A*0.8で8割に見せる。

428 :
設置したテキストボックスに情報を貼り付ける作業をしてるんですが
最後にたまに半角スペースが入っちゃうことがあって
最後の半角スペースをトリミングする方法ってありますか?

429 :
>>428
http://note.phyllo.net/?eid=1106073

430 :
>>428
RTrim

431 :
textbox1.text.trim()
これでいい?

432 :
ほんとに半角スペースかそれ改行コードとかじゃないの

433 :

             __
            //:\
           / /::::::::\
          /  /:::::::::::::::\
        /  . /:::::::::::::::::::::::\
      /     /::::::::::::::::::::::::::::::::\
    /     . /:::::::::::::::::::::::::::::::::::::::::\
  /       /:::::::::::::::::::::::::::::::::::::::::::::::::\ ____
/       /::::::::::::::::::::::::::::::::::::::::::::::::::  / ―  -\
.        /::::::::::::::::::::::::::::::::::::::::::::::::: /  (●)  (●)      暇だお
       /::::::::::::::::::::::::::::::::::::::::::::::: /     (__人__) \
     /::::::::::::::::::::::::::::::::::::::::::::::::: |       ` ⌒´   |
 .   /::::::::::::::::::::::::::::::::::::::::::::::::::::: \           /
                    ノ            \
                  /´               ヽ
                r──|   l              \
           / ̄ ̄ ̄ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、.
          /  ̄ ̄  ̄ ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))

434 :
ユーザー関数で自身のセルの背景色を変更させたいのですが、
上手く出来ません。(文字色なら変更できた)
どなたか、ヒントを頂けないでしょうか?
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 :
Excelのセルを正方形にして100x100のマスの迷路をつくりたいのですが
スタートと出口をそれぞれ左上、右下にし、
必ず出口に行けるルートは一つだけで、
その他は壁をつくり、その壁は罫線で表したいです。
こういうプログラムをつくるにあたり、アルゴリズムはどうすればいいでしょうか?
できるだけくわしく教えてください

436 :
>>434
できません。
>>435
VBAと関係無いよ。

437 :
なんてこった、そもそも無理なのか。
さんざん頭を悩ませたのに……
ありがとう、おかげで諦めがついたよ

438 :
条件付き書式とかでなんとかならない?

439 :
普通にVBA走らせたらええやん
SelectionChangeとかで

440 :
おおこれは便利そうなコマンドだ、SelectionChange。 知らんかったわ。
ただ、VBA初心者な自分には説明眺めても使い方がvンカンプンなので、
勉強しなおしてきます。  サンクスです。

441 :
s2 = Range("A4", "B100")
Range("C4", "D100") = s2
配列を使って、これでA4:B100のデータをC4:D100にコピペできますが
元の文字が赤とかセルの色が黄色とかは引き継ぎません
これを書式を含めて完全な状態でコピーしたい場合どうすればいいのでしょうあ?

442 :
>>441
Pastespecial

443 :
>>442
コピーペーストではそれで可能だが
配列の代入では使えないのでは?

444 :
>>441
Variant変数を用いる手法ではセルの値だけしか受け渡しされない。
だから書式なども含めてコピーしたいときにはこの方法は使えない。

445 :
事務処理改善でエクセルを使うようになり最近エクセルの虜状態です。
レベルはど素人並ですが、頑張ってみたいプログラムを書いてみようと思い質問させていただきます。
まず1〜5のブックに
A1に入力された日付のデータを
A2〜C6に落とす
というボタン(A)が組まれています
日付入力はブック毎に手入力だったのですが、
新規ブック(以下Aブック)を作りそこに連動して一括で日付変更できるまでは行きました。
(スライムを倒した程度のレベルです)
次に
同じようにボタン(A)もブック毎に押してデータを落としていたのですが
Aブックにボタンを設置し、そのボタンを押せば1〜5のブックのボタンが一発で押されるようにしたいです。
いろいろ調べては見ましたが知恵足らずで手詰まり状態です。
よろしくお願いします

446 :
>>445
落とすって意味が理解できないけど
他のブックのマクロを実行したいってこと?ならそれでググれば答えが見つかる

447 :
>>446
ありがとうございます。
試しにやってみたところ「オブジェクトが必要です」みたいなエラーが出ました
Book1のAを実行すればBook2のBが実行されるが狙いで
書いた内容は
Book1に
Sub A()
   Application.Run "Book2!B"
End Sub
です

448 :
追伸追記です
現在Book1でA実行すればBook2のBがBook1で実行される状態です
狙いとしてはBook2のBをBook1のAで実行です
VBA謎すぎて熱が出そうです・・・

449 :
連レス失礼します
何とか出来ました。

450 :
>>435
この問題て良く使われるん?
なんかあちこちで見た覚えが

451 :
>>450
フカシギの数え方という元ネタから動画サイトなどでかなり有名になった。
ほのぼのと思いきや、シリアスな内容が入ってたりとか。

452 :
>>450
PC-8001mkIIのデモプログラムにも入っていたのを思い出した。
数当てゲームのような、伝統的な練習問題になってるんだろうな。

453 :
VBAでこれのプログラム作って頂戴
ttp://www.youtube.com/watch?v=0hlixJsRLso

454 :
予算は?

455 :
ゲームそのものを作るより
解答するプログラムが良いな

456 :
>>453
YouTubeは変わったのか?
実にみにくい。
画面が小さすぎるままか、最大化にするか、どちらかしかないから
小さいのは見にくいし、最大化にすると他のWindow見たり他の作業ができない。
実に困る。

457 :
>>453
すでにある
「マスターマインド」でぐぐれ

458 :
>>457
ふむふむ、なるほどね、こんな作りになってるわけか、あ、Rでぐぐってた

459 :
>>457
残念。
ルールが違う。

460 :
PerlからEXCEL-VBAのマクロを起動するには
http://chaichan.lolipop.jp/perlnote/perlnote2007-11-182.htm

461 :
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 :
>>461
| Loop Until endtimes - pt <= 0
Loop Until endtime - pt <= 0

463 :
>>461
ちなみに、そのやり方はビジーループと言って、どのプログラミング言語でもやってはいけない方法。
VBAでタイマーを使いたいなら、Application.OnTimeを使うべし。

464 :
>>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 :
>>463
よく見ろ
途中経過をセルに出したいんだよ
あとOnTimeだと秒以下が切り捨てられる

466 :
>>462-465
おかげで解決しましたありがとうございます
お手を煩わせてしまいまして申し訳ありません

467 :
ど素人質問ですみません
As string*16とかの
*16ってどういう意味ですか?
ググッてみたけど全文英語とかでわかりません;;

468 :
↑ですが連レス失礼します
*16=16文字までってことでおkですか?

469 :
>>467
質問内容中の「As string」でググったら答えがヒットするんだけど
一体どんなワードでググってるの?

470 :
>>468
○ 16文字
× 16文字まで
16文字以外の文字列は入れることができない
短い文字列には自動的にスペースが足されて16文字になる
長いと勝手に切り捨てられる

471 :
>>467
16文字の固定長文字列
16文字までじゃなくて、常に16文字の文字列

472 :
>>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 :
まず自分で試してみてから聞きましょう w

474 :
>>465
> 途中経過をセルに出したいんだよ
OnTimeでも出せるよ。
> あとOnTimeだと秒以下が切り捨てられる
そんな厳密なタイマー使いたいなら、別の方法をとった方がいいね。
ビジーループは糞。

475 :
AdvancedFilterを使うと、文字列で後ろにあたかも*(オールマイティ)がついた状態でFilterがかかってしまうんですが
これを防ぐ良い方法はありませんかな?

476 :
「排他制御」についてご紹介します。

477 :
>>476
したまえ。

478 :
この言語の実装にはフォントを設定する必要があり、可読性の低さもあって普及には至らなかった。

479 :
>>475
そんな動きしないけど、具体的にどんなデータとどんなコードで発生するの?

480 :
>>479
[データ]
項目1
R
しっち
R
R
Rカレー
[抽出条件]
項目1
R
[結果]
R
Rカレー

481 :
variant変数にデータを格納するときに特定の文字を除いて格納したい場合。
A1:A100までを配列に格納、ただしその中で「AAA」という文字は格納しない
ってやりたいですが。

482 :
>461
配列にまとめて格納した後、
配列を全検索して「AAA」以外を別の配列に
入れなおせばいい。
もしくはfilter関数を使えば
指定された文字列を除いた配列が得られる。

483 :
select caseの条件分岐でORは , でできるが ANDはどうやるんですか?
ググってもORしか出てこない(´・ω・`)

484 :
>>480
[抽出条件]
項目1
="=R"

485 :
>>483
AND でやってみた?

486 :
>>483
例えばどんなことがしたいの?

487 :
>>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 :
>>487
お仕事でVBA使用している方ですか?

489 :
>>488
いいえ、無職でVBAを使用してない桃白白です

490 :
>>489
使用してないのにそこまで書けるのですか?
すごいです・・・

491 :
>>490
はい、桃白白はすごいです、こんごともよろしくお願いします

492 :
>483
select case で判定する変数は1つだからandは必要ないと思うよ。
比較するものが2つ以上ないとandは意味ないよね?

493 :
>>492
Select Case True って使い方知ってるか?

494 :
Select Case True
 Case (VarType(var) = vbString And var = "123")
  MsgBox "String-123"
End Select
ElseIfまんどくせな人には良いのかもしれんね。

495 :
>>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 :
先生方、Web連携や外部ファイルや外部アプリ連携が勉強できる本でお勧めなのありませんか?

497 :
>>496
本じゃないけどMSDNライブラリ嫁

498 :
>>495
Select Case (Left(Range("A1"), 1) & Right(Range("A1"), 1))
Case "あう", "いう"
Range("A2") = 1
End Select

499 :
>>498
ANDを&で出来るなんて知りませんでしたありがとうございます
&って文字列くっつけるだけかと思っていました

500 :
>>499
&は連結演算子ですよ…

501 :
>>499
それ、文字列くっつけてる。。。

502 :
>>493
知らなかった。勉強になったよ。
他人のソース見ることが多いんだけど、その書き方はif文に直したい。

503 :
変数の名前について質問です。
 For n1 = 1 To 4
 For n2 = 1 To 4
 For n3 = 1 To 4
 ・
 ・
といった形で変数nxそれぞれでフォーループをまわし、
 AAA = n1 & n2 & n3 & n4 & n5 ・・・
にて
 11111・・・11
 11111・・・12
 11111・・・13
 11111・・・14
 11111・・・21
といったx文字の数字を総当りで取るイメージな物を必要としているのですが、
例えばその桁が100であったり50であったり、任意の値によって
 For n1 = 1 To 4
 For n2 = 1 To 4
 For n3 = 1 To 4
 ・
 ・
 For n100 = 1 To 4
もしくは
 For n50 = 1 To 4
のように、For loopで使うnxの変数も指定したいのですが
どうすればいいでしょうか?
 For 桁 = 1 to 100
  For n & 桁 = 1 to 4
 next 桁
見たいな事ができればいいのですが。

504 :
ちなみに少し上に出てたフカシギの数え方を勉強のため作ろうと思ったのですが、
自分の知識が足りず、升目の数によって大量のFor loopを書き、
升目分だけsubを作成していく事しかでき無かったためです。
質問している側がエスパーを要するような内容と感じてしまう内容で申し訳ないです。

505 :
>>503
よくわからんけど配列使えば解決する?

506 :
>>505
解決するかどうかは、わたしが聞いておるのだ

507 :
初歩的な質問ですが、お答えください。
指定した一つのセルの数値を返す場合はINDEXを使えば良いんですか?

508 :
>>507
indexはセルを指定するために必要なものであって
数値を返すためのものじゃない

509 :
>>508
なるほど・・・
わかりやすくいうと
i = ("d4")といった形でiに数値を代入したいのです。
教えていただけないでしょうか?

510 :
>>509
i = 0
with thisworkbook.worksheets("sheet1")
if isnumeric(.range("d1")) then
i = .range("d1")
end if
end with

511 :
>>510
ありがとうございます。
ということは、そのままそっくり代入できる関数は無いということみたいですね。
精進します。

512 :
ごめんなさい、自己解決しました。
i = Range("d4").Value
で良かったみたいです。
難しく考えすぎてました。

513 :
マクロを実行するとあるシートのA列に書いている内容を上から下まですべて
iCloudのメモ帳と同期化させたいのですが
こんなのって可能でしょうか?
もちろんネット接続している状態です

514 :
天プレ読んで出直して来い

515 :
可能

516 :
フォームに貼り付けるボタンのサイズとか高さとかはそのプロパティのところで
変更することができるけど、シートに貼り付けるボタンのサイズを変更しようと
する場合はどうするんですかね
http://uni.2ch.net/test/read.cgi/operatex/1345250215/878代行)

517 :
>>516
>>1
>★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)

518 :
>>517
ボタンを右クリックからコントロールの書式設定で
サイズを変更はできましたが、マクロの記録でやっても
それは出てきませんでしたが
今回はコントロールの書式設定で変更できたんでこれでよしと
しておきます
http://uni.2ch.net/test/read.cgi/operatex/1345250215/881代行)

519 :
現在選択しているセルの取得する場合、
どうすればいいのでしょうか?
たとえばA4:J3の場合はrange("A4:J3").valueみたいな感じで

520 :
>>519
Selection.Value

521 :
やりたいこと
A1からA10まで連続でネットのURLリンクがある場合
それをまとめてリンク先のホームページを開く
ですが
マクロ記録でそれをやってもセルがselectされるだけでリンク押下まではしてくれません。
教えて下しあ

522 :
>>521
http://officetanaka.net/excel/vba/tips/tips42.htm
ここらに数パターン乗ってたよ

523 :
VBAのIF文の条件で、日付の比較をさせたいのですが、
If Worksheets("Sheet1").Cells(row, 1) < DATE(2010,07,01) Then〜
という記述では認識されません。
どのように記述すれば良いか、アドバイスをお願いいたします。

524 :
>>523
If Cells(r, 1) < DateValue("2010/07/01") Then
RowとDateは予約されているので変数名などに使わない方がいい

525 :
みなさんこんにちは、桃白白です。
選択範囲を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 :
vba cells 結合 検出
でググれば

527 :
>>526
なんか冷たくない?結婚生活送ってて最近ご無沙汰じゃない?って嫁に聞いたら
風俗行ってくれば?と言われたような、どうしてもっていうんならあたしが
マットプレイしてあげてもいいけど?と言ってくれるかわいい嫁が欲しいです。
桃白白はそういう結婚生活を送りたいです。桃白白はいまそういう心境です。
vba cells 結合 検出でググったらMergeCellsとMergeAreaを使っちゃいな的な
ページがありましたのでMergeCellsとMergeAreaを使ってみちゃいたいと思います。ありがとうございます。

528 :
>>527
Excelどーなったの?
2000だったらあまってるのあげてもいーけどw

529 :
>>527
なんだかんだいってお礼はしてくれるのね・・(笑)
そういうのを仕事でつくった(htmlじゃなくってCのTableに変換)事あるんだけど、
4年位前だったんで忘れてたのでググる為の検索Keyを言っただけ。
ちなみに最近はVC++であるデータをhtlmのTableに落とすのを作っています。

530 :
>>528
Office カスタマー プレビューを入手する | Microsoft Office カスタマー プレビュー
http://www.microsoft.com/ja-jp/office/preview/try-office-preview.aspx
Office 2013のプレビュー版があったからそれインストールした。桃白白はエクセルを使えるし、
マイクロソフトは桃白白からフィードバックを受けることができるし、このスレのみんなは
桃白白がいてくれてうれしいし、大勝利の関係。

531 :
できた、やった
https://friendpaste.com/1v4wWzAy2RQsNSL8MuXjtW

532 :
使ってる変数にどんな名前つけますか?
カウンタのcとか、boolでfとか、IE だからobjieとかはなんとなく使うけど、モジュール内がややこしくなってくると、
わけわからんどうしよう..って感じになってくる\(^o^)/
とくにグローバル変数も使う時とかどうしよ...
センスある命名おしえて下さい。

533 :
名前長をケチらない。意味不になる位なら日本語名を付けてしまえ。
自分はこんな感じでやってる。

534 :
迷うときは日本語で良いんだよ

535 :
おっとかぶた。

536 :
確かにその方がいいかもしれない、コメントとかはバリバリ日本語で書くくせに、コードの記述は、日本語入れると動作に悪影響かも...とか考えて頑なにアルファベット使ってるとか俺あほや。\(^o^)/
でも変数名とか上手く使いこなすと上級者っぽいじゃんw
なるほどInt の C か...(キリッ!) みたいな。


537 :
4文字熟語とかを変数に使うと上級者っぽいぞ。
上級のベクトルが一致してるかは知らんが。
驚天動地 = 国士無双 + 神出鬼没
中二っぽくてよい。

538 :
自分だけが読める感ですかね、よくないと思いつつ、その気持ちわかります///
私用のexcelベースのアプリ作ってるんだけど、アプリ名なんか中二すぎて人に言えない///

539 :
エクセルのバージョン変わったときだったかな、
変数名がセルのアドレスとイコールでエラー出たことあったけど、
どこにも情報出てなくて、またメッセージも皆目掴めずで困ったときあったなぁ。
確かアルファべット3文字+数字みたいな変数名を旧バージョンで使ってて、
バージョンアップ後、エクセルの仕様で列数変わって
セル範囲内になっちゃってエラーになった。とかだったかな。

540 :
そんな事があるんですね、覚えとこう。
常用してる変数名だと置き換え作業だけで発狂しそう../(^o^)\
変数名って手ぐせと同じで、使いぐせついちゃいません?


541 :
ここはお前の日記帳か?

542 :
続きはチラ裏でやりますw
レス下さった方、参考になりました。
ありがとうございます。

543 :
>>532
日本人は英語に弱い人が多いから
特に他人に公開するソースで意味のわからない英語、
タイプしづらい英語を使うとよろしくない。
この前どっかで見たソースで、added_dataみたいな変数名を見かけたが
dが大杉でタイプミスしまくりでお話にならなかった。
ad_dataくらいでいいだろうよ。

544 :
キーボードに弱いんですねw
そんなんコード補完つかうでしょ

545 :
>543の言いたい事はわかるが、>543の内容だけを見ると
>543の頭が弱くてお話にならない感じだな。

546 :
541=544=545

547 :
一応MSにガイドラインというかこうするとイインジャネ?みたいなの有るよ
型3文字+内容を端的に表した単語、みたいな。
文字列ならstrTitleとか数値ならintCountてな感じで
MSのサンプルコードは大概そんな感じになってる

548 :
ハンガリアン記法ってやつでしょ

549 :
質問です。
下記コードを実行すると応答停止してしまい強制終了させています。
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 :
>>549
限界については明文化されてないと思うけど、
ワークシートに大量のオブジェクト(画像など)を貼るとフリーズするのはまれによくある
64bit版だと多少はマシになる

551 :
明日DoEventsで確認しみます。

552 :
>>549
仕様や制限についてはMSのサポートに聞かないとわかんないよ

553 :
指定のセルに日本語(アルファベット以外)があるかどうかを取得したい場合
そういったのって可能でしょうか?

554 :
すみませんもう一つ質問ですが
s = range("A1:B10").select
でその範囲の内容を配列に入れれますが
ただしA1:B10の中でA列が赤文字以外の場合のみってしたい場合
つまり一回全選択して、この行とこの行は除くみたいな感じです
それとも一行ずつ見て行区方法しかないのでしょうか?
というのも対象範囲が1万行ぐらいの場合ではじく行が3行程度の場合
スピードを考えると上記のほうがいいのかなと

555 :
>>553
可能

556 :
>>553
正規表現使え

557 :
せ・・・・性器表現?

558 :
>>553はわかりました
554は可能でしょうか?

559 :
そんなおもしろ関数を作ればいいんじゃないでしょうか?

560 :
>>554
スピードを考えるなら実行すればいいじゃん。
あおりとかじゃなくて、普通にその質問レス書く間で
両方実行してどっちが早いか見るだけでは?
ちなみに前者も、除く行を一個一個探す必要があると思うが・・

561 :
>>558
スピードが重要ならスピードを重視すればいいと思うけど?
可能でしょうか?って質問がなんなのかよくわからん

562 :
質問者って巧い奴とそうでない奴が居るよな
(回答を得やすい質問の仕方という意味で)

563 :
相手に伝わるように質問できるような人ならハナから自分でググって解決できるよ
ここそうじゃない人のためのスレなんだから
エスパー能力を試したりラリーを楽しんだりすればいいんだよ

564 :
ま、どっちが良いかなとかこれで出来ますか的なやつは
実行環境にも左右されるし、実際にやってみた方が早いし確実

565 :
こんにちは、桃白白です。
http://uploda.cc/img/img5088bd2d83be1.png
画像のように選択した範囲から次のような文字列を作りたいです。
A1
├A2
B1
└B2
 ├B3
 │├B4
 │└B5
 B6
どうやればいいですか?難しくて頭が爆発しそうです。教えてください。

566 :
>>565
パターンを洗い出してそれに当てはめれば?

567 :
>>566
え、わかんなーい、桃白白わかんなーい、もっと詳しく教えて、どうやるの?
桃白白の頭が爆発しそうなんです。

568 :
>>565
B5はB3にぶら下がってるけどB6はB1にぶら下がらないんだよね?
文字列を作るルールを第三者に伝わるように説明できないと回答貰うのは難しいと思うよ
まあじゃれてるだけなんだろうけど

569 :
>>568
とにかくさ、階層構造にしたいんだよね、じゃあ逆に聞くけどどうしたらいい?
どういう文字列にしたらいいと思う?

570 :
>>569
この階層構造は既存のフォルダ構成をエクセルで作ろうとしてるのかな?
既存のフォルダ構成を階層構造にしたいのであれば、DOSコマンドのtreeコマンドを使う方法があるけど。
因みに俺は>>568じゃない。

571 :
>>565
考えてみたけど、ルールが絞り込めない…?
列ごとに上から1セルずつ調べてって、文字列が書いてあるセルが
上と下にあったらその間を全部「│」にする、
文字列が書いてあるセルが上にあって右隣にあったら「└」にする、
「└」があるセルの上、及び右隣に文字列が書いてあったら「├」にする、とか
こんな感じでいけるとおもうんだけど。あるいはこういう風な記述の組み合わせで。
必ず「└」を一発ズバリで判定して書かなきゃいけないわけでもない。
最初「└」を入れた(洗い出した)セルを後で(さらに洗い出して)「├」に書き換えてもいい。
それとAとBで処理を別枠にして回して(A1:D2とA3:D8)、あとから
A1、B1の入っている左列だけは別処理で書き換える必要がでてくる?と思った。
実際に組んでないから苦情は受け付けられない!

572 :
A1
├A2
B1
├B2
│└B3
│ ├B4
│ └B5
└B6
だったらそんなに難しくなさそうだけどなあ

573 :
A1
├A2
B1
└B2
 ├B3
 │├B4
 │B5
 B6
が正解では?

574 :
ルール通りなら
こうだね
A1
├A2
B1
└B2
 ├B3
 │└B4
 │ │
 │ B5
 B6

575 :
>>574
質問者はルールなんて提示してないけど?

576 :
文字だけ追ってスクリーンショット見てない人は見た方がいいんじゃない?

577 :
Excelの質問でもないし、VBAの質問でもないんだから、いい加減スルーしろアホ共

578 :
ぶっちゃけフォルダツリーだってのならこうだよなと思った
root
├A1
│└A2
└B1
 ├B2
 │└B3
 │ ├B4
 │ └B5
 └B6

579 :
tree c:\ /f
これ気持ちいいよな。
スクリーンセーバー代わりになるくらい。

580 :
初歩的な質問になってしまいますがよろしくお願いします。
どこが間違っているのかも分からないのですが、ここかなと言う部分を観てください。
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 :
罫線をもう1個挟むと見映えが良くなるw
┬root
├┬A1
│└─A2
└┬B1
  ├┬B2
  │└┬B3
  │  ├─B4
  │  └─B5
  └─B6

582 :
>>580
hanteiがRに見えて、そんな不純な実装してまともに動くわけがないだろと
風紀委員である桃白白が罵ってしんぜようかと思案していたら違っていた、お母さん・・・
なにをどう想定しているのかわからんから間違っているかはわからんけど、重複除去かなんかか?
  D
3 A '処理される
4 A '処理される
5 A '処理される
6 B '処理されない
7 B '処理される
8 C '処理されない
こうなるだろ、hanteiの初期値が違うんじゃね?

583 :
Excel2003(11.6560.6568)SP2で、VBAの途中でデバッグかかってとまるようになった
ブレークポイントはもちろん設定してない
ただ、前に一度ctrl breakでとめたら、その場所記憶したみたいで、なにしてもそこで止まるようになった。エラーじゃない。
他のPC(EXCEL2003だけどSP2じゃない)からだと止まんないでふつうに走る
こういう不具合出たことあるひといる?バグなのかな?

584 :
分かりにくくて済みません
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 :
>>584
ステップ実行で各変数の値をウォッチしてみたら?
期待通りに動かない可能性なんて山ほどあるのでエスパーしきれない

586 :
>>584
じゃあ>>580は間違ってないんじゃね、列は違うだろうけど。
想定通りじゃなかったというのはどういうこと?どうなったの?

587 :
>>580
まず、やりたいことを日本語で書け。
で、何が期待したどうさと違うのかを日本語で書け。
あと「判定フラグ」とかいう、プログラミング用語っぽい単語は使うな。

588 :
色々有難うございます
ステップ実行で値をウォッチを言う機能があるのですね。
もうちょっと、自分でも粘って考えてみます。
実はhanteiをフラグにして処理をIFで変化させるVBAにするつもりだったのです。

589 :
>>588
> 実はhanteiをフラグにして処理をIFで変化させるVBAにするつもりだったのです。
あのねぇ、これは「手段」と言うの。
目的を書け。

590 :
>>580
間違いはありません。あなたのプログラムした通り動きます
それがあなたの希望通りかは、あなたの希望が解らないので判断できません
とりあえず、
Doループ入ってすぐCells(Posgyou, Posretu) の比較してるけど、行も列もそのままだから、必ずThen側実行するぞ?
なんの修飾もなしにCellsつかってるけど、どのシートのセルみてるか解らんぞ
それ以外は概ね>584の動作してるぞ

591 :
>>583
ノシ
リアルタイムで出るよ。
7@64bit のマシンで excel2000 2003 ともに出る。
会社PCで作ってなんら問題なく実行できていたものも、
この環境じゃとまったりする。
例えば
msgbox "a"
range("a1").select
これでも時折セレクトでエラーハッスル。
もちろんなんら材料があるわけないので、
エラー(デバッグ応答)時にそのまま続けて実行すると、普通に抜ける。
何回同じマクロを同じ環境でやっても、
出たり出なかったりするんだけど、出るときはかなりの頻度だよね。
まぁ自分も調べに掛かったけど、ヒットしなかったから放置している。
ブレークを解除しろとかよく見つかるけど、してねぇよ。ってな。

592 :
ブレークポイントじゃなくてウォッチ式でも入ってるんじゃね

593 :
Debug.Assert(0)

594 :
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 :
>>594
無限印刷ってなに?
一般的な用語使わないと伝わらないよ
とりあえずロジックの問題か印刷の問題かぐらい切り分けしたら?

596 :
>>595
開始番号1、終了番号10と入力しても10で終わらずずっと印刷され続けます。
loop関数が無限ループになってしまってるのではと思うのですが解決法が解らず。

597 :
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 :
>>594
とりあえず
Sub 印刷() の次に
Dim a As Integer, z As Integer
の1行入れろ
InputBoxにIntegerにならない文字列入れたときは知らん

599 :
>>596
ロジックの問題か印刷の問題かぐらい切り分けしたら?
って言ってるのになんでやらないの?

600 :
数値の終了条件に=を使うやつは素人。

601 :
>>599
お前こそ素人に分かる一般的な用語で説明してやれよw

602 :
あの終了条件が数値だと思ってるならもっと素人

603 :
>>598
出来ました、有難う御座いました。
小さい会社でマクロのマの字も知らず無茶振りされ、
ネットで探した式もまともに動かず途方にくれておりました。
>>599
すみません、ロジックか印刷かという文面が良く解りませんでした。
印刷の問題はプリンタの会社に電話するものではないのでしょうか。

604 :
>>603
もしも今回のような無茶振り?がまだ続くようなら
一回本買って、VBAの勉強した方がいいよ
基礎の基礎の部分からわけわからんままやってるだろ
VBAどころかプログラムの根本が分かってない感じ

605 :
プログラムの根本なら俺が教えてやるから聞きにこいよ

606 :
たまに来る程度の無茶振りなら勉強するより聞いた方が効率は良いだろう。
専門外の事だ→勉強しなきゃ の思考回路は社畜に陥りやすい

607 :
みなさんおはようございます、桃白白です。
>>570-579, >>581
ありがとうございます。
root
├A1
│└A2
└B1
 ├B2
 │└B3
 │ ├B4
 │ └B5
 └B6
ご提案いただいたこの形式にしたいと思います。桃白白はこれに決めました。
この文字列を作りたいという強い思いが桃白白の胸にありますが、問題はプログラムだと思います。
それが問題だと桃白白は認識しています。みなさんならどのように実装しますか?教えてください、お願いします。

608 :
>>607
これは業者にお金払って開発してもらうレベルの案件。
通りすがりの俺らでは無理。

609 :
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 :
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 :
>>608
桃白白にお金があれば業者の可愛い女性の担当者にお家に来てもらって、
ところで桃白白さんイケメンですよね、もてるんじゃないですか?いやそんなことないですよ・・・むぎゅ、
みたいな展開も期待したいところだけど、残念ながら桃白白お金ないから無理

612 :
皆さんならどのようにとかじゃねぇ
もう作れるだろ作ればいい
多少ソースが汚かろうが思い通りに動けばいいだろ

613 :
>>612
え、できなーい、桃白白できなーい、できるだけきれいなソースがいいな、教えて?

614 :
ツリー構造でフォルダを出力するのかね
それなら以前作ったことあるよ
ポイントは、深渡を表すグローバル変数を用意する、当然回帰関数

615 :
>>614は間違った
グローバル変数じゃない
深渡は呼ぶ側で引渡し、呼ばれた方でインクリメントする

616 :
>>611
金なくても自画撮写真くらいうpできるだろ

617 :
いずれにしても、セルに配置した文字のツリー表示なんてのを
ExcelのVBAでやることに何の意味があるのか不明だし
誰もコードを出さないところから見ても面倒なことは間違いないし
この話題はここで終わりとしよう。

618 :
>名前:桃白白
この時点でネタ確定なんだからスルーしておけばいい

619 :
>>617
超初級の練習問題レベルだし
別に面倒じゃないけど
やる気が起こらない
なにかやる気スイッチ押してくれればやるお

620 :
>>618
心外、桃白白マジ心外。
>>619
(  ̄∇ ̄)σ=σ[]ピンポン!!ピンポン!!ピンポン!!ピンポン!!
>>609
読んだから、桃白白ちゃんと読んだから。
いま桃白白のタマムシ色の脳細胞で考えているところだから。

621 :
>610 で答え出てたんだな

622 :
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 :
>>622
Columnsプロパティはオブジェクトが指定されないときアクティブシートの列を返すんじゃね。
オブジェクトが指定されてないからアクティブシートの列を返してSheet2がアクティブシートじゃないから
列が見当たりませんぜ的なことなんじゃね。

624 :
VBAのクラスモジュールで質問があります。
JAVAで言う、ThisやSuperのようなものは無いのでしょうか

625 :
無いのです

626 :
>>623
分からないんだったら回答すんなよ。
回答するんだったら裏くらい取れよ。
自分の問題さえも解決できないのに、他人の問題に口出しすんな。
話がややこしくなるだけ。
質問している人や質問の内容に対して回答している人に対して大変失礼。

627 :
>>626
反証あるの?ないんだったらお前が黙ってろ。

628 :
>>桃白白
反証云々は関係ないんだよ。
質問者に対してこうなんじゃね?っていうこと自体問題が理解できていないこと。
推測なんて意味無いからw
知ったかもいい加減にしとけ。
ようは何も分かってないんでしょwwwww

629 :
>>628
桃白白は回答するのに客観的ソースは必ずしも提示する必要はないと思ってるわけ。
だから思いついたままに回答するわけ。でもお前は裏を取って回答するべきだと思ってるわけだろ。
桃白白が何もわかってないことの根拠がないじゃん。何もわかってないんでしょってお前は桃白白に
聞いちゃってんじゃん。桃白白はそれで問題ないという立場だけれどもお前は違うわけだから
お前は自爆してるだけじゃん。ようはお前は桃白白に嫉妬してるだけだってこと。質問に答えるどころか
桃白白に絡んでるだけじゃん。

630 :
>>625
ありがとござます。どこかでMYみたいなものを見たけど違うものだったか

631 :
>>618

632 :
>>桃白白
思いついたまま回答されることほど質問者に対して失礼。
この時点で質問に対してきちんと理解しないで回答してるってこと。
お前に対して凄い迷惑と思うことはあるけど、嫉妬なんてしたことないw
だってきちんと回答できてないんだもんwwww
お前の回答は百害あって一利なし。

633 :
ご回答ありがとうございます。
確かにアクティブシートを変えると引っかかる所が変わる気がします。
しかしながら、オブジェクトの指定方法というのが分かりません、自分なりにこうではないかと、

634 :
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 :
>>632
ひどい、いっとくけど桃白白が傷つかないと思ったら大間違いだからな
すごい迷惑というのを直ちに撤回してもらいたいよ、ああひどい

636 :
>>634
Columnsプロパティを呼ぶときにオブジェクトを指定してみちゃいなよ
sheet1.Range(sheet1.Columns(1), sheet1.Columns(2)).Value = sheet2.Range(sheet2.Columns(1), sheet2.Columns(2)).Value

637 :
>>636
Withステートメントくらい使えよボケ!

638 :
>>636
おお、いけました。ありがとうございます。
2日程悩まされていました。

639 :
http://www.atmarkit.co.jp/fdotnet/dotnettips/591mp3tags/mp3tags.html
こんなmp3ファイル一覧の取得の際に、ファイル名以外に
タイトル、サイズ、ジャンルなどを一緒に取得したいです
VBやC#ではできるみたいなのですが
VBAでは可能なんでしょうか?
いろいろ設定が必要な気がしますが

640 :
>>637
>>636でWith使っても大して意味ない気がする
Sheet1かSheet2のどっちかしか括れないでしょ。

641 :
>>640に便乗で質問ですが、
withステートメントでまとめようとしても片方しか出来ません。
変数で受け渡して一応出来たのですが、もう少しスマートな方法はあるでしょうか。

642 :
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 :
>>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 :
>>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 :
>>643>>644のあわせ技で
Dim I As Long
For I = 1 to 2
Worksheets("Sheet1").Columns(I) = Worksheets("Sheet1").Columns(I)
Next I

646 :
こぴぺして修正忘れた・・・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 :
このような式を作っても、sub Aの式からcallされる度にpが初期化されます。
Sub A()の前にpの型を宣言すればいいのですが、あんまりスマートになりません。
Sub B()内で宣言をして、値を保持する方法ないですか?(ただしプログラムの実行が終わればpは初期化)
Sub A()
dim i as long
for i = 1 to 100
call B
next i
End Sub
Sub B()
dim p as long
if p = 0 then
elseif p = 1 then
else
end if
p = p + 1
End Sub

648 :
>>643->>646
ご回答ありがとうございます。いろいろな書き方がありますね。
微妙に不規則に左右に連続して同じような式を書くことがあります。

649 :
>>648の続き
sheet1.Range("A1")=sheet2.("B3")
sheet1.Range("C5")=sheet2.("D4")
・・・・
この場合はやはり>>643がベストですかね。
そうなると普通に書いた方がいいかなと思ってしまいます。

650 :
>>647
pをStaticにしろ

651 :
>>639
可能

652 :
>>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 :
>>650
それだと再び実行したときにpが100から始まってしまいませんか?
今手元にプログラムがなくて、すぐに確認できないのですが、
たしか試してプログラムが終了しても値が保持された気がします。

654 :
>>652
今までは
with sheet1.
Range("A1")=sheet2.("B3")
Range("C5")=sheet2.("D4")
end with
としていましたが、右の部分もwithでまとめたいなというのが元なのですが、>>644の方が良いでしょうか。

655 :
>>647
なんでB内で宣言をするようなスマートじゃない方法を採ろうと思うの?

656 :
すいません。
with sheet1.
Range("A1")=sheet2.Range("B3")
Range("C5")=sheet2.Range("D4")
end with
ですね。

657 :
>>656
ケアレスミスだと思うけど
>with sheet1.
>Range("A1")=sheet2.Range("B3")
>Range("C5")=sheet2.Range("D4")
>end with
じゃなくて
with sheet1
.Range("A1")=sheet2.Range("B3")
.Range("C5")=sheet2.Range("D4")
end with
ですね("."の位置が違ってる)
この程度のものであればWith使うほどの事もなさそうに思います。
Withってネストできるけど
それはあくまでもより下位のオブジェクトに対してであって、
たとえば
Workbooks("hoge.xlsx").sheets("sheet1").Range("A1")
の時に
With Workbooks("hoge.xlsx")
With .sheets("sheet1")
.Range("A1")
End With
End With
と書くことは可能ですけど、
>>656みたいなときには
sheet1 と sheet2 の両方を同時に With で指定できないですからあんまり意味ない気がします。
私が>>643で書いたのはあの時点のコードではsheet1とsheet2という2つの変数が
あんまり有効に活用されてないってことであって、
>>656に関してならWorksheetの指定に変数を使うやり方のほうが中途半端にWithを使うより有効だと思います。

658 :
>>657
ありがとうございます。
この例は聞きやすいように短くしたのですが、どちらにしても、右と左を端的にwithでまとめる方法はないという事ですね。
場合によって変数を使っていくようにします。

659 :
>>658
Withでまとめられない場合、変数名を短くするのも有効な手だと思いますよ。
たとえば、
Dim sheet1 As Worksheet

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

660 :
>ちなみに私は変数名には大文字使ってます
さすがにその個人的ルールは特殊すぎるので公の場で紹介しない方がいいと思う
特に初心者が多いこのスレではなおさら

661 :
>>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 :
>>634
そもそも広い範囲ならコピーするのが妥当だがそのスタイルならResize使えば変数は要らん
Sheet1.Cells.Resize(,2).Value = Sheet2.Cells.Resize(,2).Value
広い範囲の配列を代入するのは馬鹿げているが

663 :
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 :
>>663
エクスポートするなりして別のファイルとして送ればいい

665 :
やはり、マクロを解除してしまうと、画像のサイズも解除されてしまう感じですかー・・

666 :
相手方はマクロで実装してある機能そのものが欲しいの?
それとも写真が貼り付けられた完成品があればいいの?
前者は無理な注文、後者なら写真貼ってマクロ消して送ればいいだけだし、
一体、何を悩んでるのだろうか。

667 :
>>663
関係ないけどそのUIで数百枚の写真を貼り付けるのはものすごく大変そうだな

668 :
>>609
できた、できました。桃白白マジヤッホー。ありがとうございました。
https://friendpaste.com/j4GDQaQsbkxeX8r2MoqWe

669 :
>>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 :
>>683
マクロの中身の問題というよりは取り扱いの問題だと思う。
・相手がマクロを無効にする設定にする
・写真を貼り付けて完成品にしたファイルからマクロを消して送る。
またはそれを目的にマクロに手を加える。
マクロを記述したSheet1と貼り付ける目的のSheet2を作って、完成後のSheet2だけを
新規Excelファイルとして保存するように作業手順を改めるとか。
・あなたが今与えられている環境があなたの自由に出来るのなら、
Excelテンプレートとしてマクロを記述、必要なファイルを開いた時に
そのマクロが作動するようにする、とかもできるはず。
写真を何枚か貼ってリサイズして作ったシートからマクロを除去しても、
既に貼られてリサイズされてる写真が勝手に大きさが変わるってことは考えにくい。
試してみた?

671 :
仕事でファイルを送信する際マクロの使ったものはだめという規則があるらしく、なんとか効率化できないかと思ったのですが、、、
とりあえず、マクロの入ったものはNGだそうで、困ってる形です。
完成品でマクロを貼り付けたシート内を削除したのですが、マクロがある形になってしまいました。

672 :
>>671
効率化?何を効率化したいの?
困ってるとか困ってないとかそんな情報役に立たない
ブックに記述されたVBAコードの削除方法が知りたいのかな
わからないならzipとかで圧縮して送っちゃえばいいんじゃね?

673 :
マクロの記述が出来るのに削除が出来ないとか、
いくらなんでも釣り針が大きすぎるだろ・・・

674 :
>>671
「excelからマクロを削除」でググるとか?

675 :
>>671
そういう場合は標準モジュールにマクロを書くのがおすすめ。
その標準モジュールをエクスポート(basファイル)した後に解放すれば、マクロのないブックになる。
再度同じマクロを使いたい場合は、エクスポートしたbasファイルをインポートして使う。
因みに標準モジュールが分からないということならググれ。

676 :
おお!ありがとうございます。
マクロを完全に削除することができました。
まだ、本で学んで日が浅く、少しづつ触っているのですがとても助かりました。
今回は助けていただき、ありがとうございました。

677 :
質問です。
A1からA50にランダムに"☆"が入っています。ここから☆が入っていないセルを18コ、☆が入っているセルを2コ、計20コのセルを選ぶにはどうすればよいですか?
ただし、選ぶセルはどれも行が連続せず、また、☆は少なくとも2コ以上あり、☆が多すぎて☆の入っていないセルが18コ選べない場合は☆を3コ以上選び、必ず計20コのセルを選択するものとします。

678 :
それが何の役に立つの?

679 :
>>677
課題かなんか?
☆が入ってないセルを調べて配列Aにいれとく
☆が入っているセルを調べて配列Bにいれとく
配列に入れる直前に特殊条件(行が連続しないとか)に該当するものを入れないようにする
☆の入っているセルを2個、配列Bから選んで抽出
引数Cを用意して最初に20をいれ、抽出するごとに1減算(この時点で18)
☆の入ってないセルを配列Aから選んで抽出
引数Cは抽出するごとに1減算を続ける、変数Cが0になれば終了
引数Cが0に満たなかった場合は、☆の入っているセルを配列Bから選んで抽出
引数Cが0になったら抽出は終了
必要ならrndでランダムな数字をだしてそれに従うようにする
その場合既に選択済みのセルを再度選択しないよう、抽出する時に
配列上から順に全部チェック,も追加。
適当。抽出方法はお任せ。

680 :
VBA関係ない、プログラム以前のアルゴリズムの問題
まず2個の☆を選ぶくみ合わせをしらべて、その状態で18個の空白を選択できるか調べないとダメじゃね
全部の星2個選ぶ組み合わせで順次チェックして、それがOKならそれを出力して終了
全部の星2個選ぶ組み合わせで空白18個が不可能ならどうするかは、選択の優先順位考えないとだめだな
まあ、星三つでやって、だめなら星4つ....って順次増やすのが妥当か

681 :
>>676
個人的にはマクロ用のブックを一つ作る。
使うときはマクロ用のブックを起動。
画像編集用のファイル名、挿入する画像のフォルダ又はファイル名を指定しマクロ実行かな。
basファイルを使うやり方は元のファイルを手で触る必要があるし、マクロの解放忘れとか問題が出そう。

682 :
Pivotテーブル内に対する条件付き書式で
「値が表示されているすべてのセル」を指定したいのですが、
VBAで指定する(新たに作成する)方法はあるでしょうか?

683 :
>>679
☆が連続した行に入ってる場合とかどうすればいい?
というか具体的に質問してるわけだし誰か完璧なコード書いてくれないか?

684 :
出力は隣の列に増やしてく感じでお願いします

685 :
>>683
たおぱいぱーい・・・・・・はーい!!
>>679とか>>680とか見ると超難しそう。
それが桃白白の感想です。以上です。

686 :
>>683
完璧な仕様書いてないのに
完璧なコードを出せるわけないじゃない
諦めて自分で作れ
ヒントは出てんだから

687 :
そもそも>>1★5にもある通り、ここは丸投げの制作依頼所ではなく
ヒントを貰って自分で書くって人がヒントを貰いに来る場だからな

688 :
何度も言うが>>1のテンプレは誰かが勝手に作った物で、厳密に守る必要なんかない
元々、答えたいやつ、作りたいやつは勝手にすればいいってスレだから

689 :
アルゴリズムこそブログラミングの醍醐味。
もっと語ろうぜや。

690 :
質問スレなんだから、助け合いの場として使えばいいとおもうけどな。
まー仕事とかですぐ使うような人のはすぐ答えてもいい気はする

691 :
おれ的には後で除外するのが手っ取り早いと思うが、どうだろう?

692 :
>>689
同意。
あなたはすばらしい。
ところでExcelVBAを使って野球シミュレーションを作りたいのですが
アルゴリズムはどうすればいいですか?
ボールの移動のようなアクション部分は一切排除して、
各選手の能力値(野手なら長打力とかミート力や総力や守備力などなど、投手なら球速や切れやスタミナなどなど)を設定しておき
結果は「ヒット」「三振」「ホームラン」「内野ゴロ」みたいにテキストで出るだけ、というところから始めよう。

693 :
677に答えられないからって話を逸らすヤツ…Orz

694 :
とりあえず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 :
もちろん自分で叩き台は用意するんだろうな?

696 :
みんなーExcelは表計算ソフトだからなー
VBAも自ずとExcelの主な使途である事務処理の
支援・自動化のために使うべきものであって
☆を選ぶとか野球シミュレーションとか
そんなのなんでExcelでやるんだよって突っ込みたくなる
テーマはスレ違いだと思うぞー

697 :
>>688
>>1はスレ主である。
>>1のテンプレが嫌なら自分でスレくらい立てろ。
テンプレ無視だったらどんな話題でもOKになるというのが分からないみたいだね。
何事にもルールがあってそれが嫌なら自分で作ればいいだけのこと。
スレ立てたとしても、お前みたいなやつがまた沸いてきて
スレを荒らされるのは目に見えてるけどね。

698 :
>>692
そういうのは糞ウゼェから別スレでやれ

699 :
アルゴリズムは言語関係ないからな
それ用のスレがどっかになかったか?

700 :
>>683
☆が連続した行に入ってるときは片方を読まないようにすればいいと思うけど、
☆が入っているセルが2個、☆が入ってないセルを18個、計20個の組み合わせを1個見つければいいのか?
それとも可能な組み合わせを全部列挙する必要があるのか?

701 :
>>696
いや、シミュレーションは事務処理の自動化の醍醐味だろ?

702 :
まあ良いんだけどさ嫌いじゃないし
でもここExcelVBAスレだしな。
>>677だって50*50の配列でってすれば
他言語のスレでも普通に質問できちゃうだろ
そういうのはそういうスレで聞いた方が早いし確実だと思うぜ

703 :
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 :
>>703
>>622と同じミス
解説は>>623
解決策は>>662

705 :
703です。シートを切り替えて作業したら出来ました。ありがと。

706 :
まぁ解決したならどんな方法でも良いわけだけど、
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 :
>>706
703です。解説ありがとうございます。m(__)m

708 :
セオリーの書き方をテンプレに入れればこんな同じような質問がなくなると思う。

709 :
>>708
質問する初心者がわざわざテンプレなんて読むわけないだろ
常識で考えろ

710 :
>>709
回答者が楽しちゃいかんのか?
「テンプレ嫁」で終わりなんだが。

711 :
>>710
>>708は「同じような質問がなくなると思う」って言ってるんだよ

712 :
こんなのセオリーっていう程のものでもないけど、
全部書いてたらテンプレだけで1000いきそうだよ。

713 :
Dim arr() As String
arr = Split(wk, vbCrLf)
で配列に改行でsplitした値を格納しましたが
この配列の数を取得するにはどうしたらよいでしょうか?
arr.Length
count(arr)
いずれも vba だと認識されません。

714 :
自己解決

715 :
>>713
もしもし桃白白です、桃白白に聞いちゃう? じゃあ桃白白が教えちゃう。
Function Count(a) As Long
  Count = UBound(a) - LBound(a) + 1
End Function

716 :
>>715
すみません。
ほわいとぴーちさん
自己可決しました。

717 :2012/11/02
可決したのか。それは良かった w
TOP カテ一覧 スレ一覧 2ch元 削除依頼
Google App Engine for java (266)
【初心者歓迎】C/C++室 Ver.80【環境依存OK】 (550)
日本語プログラミング言語『なでしこ』スレ5 (813)
リファクタリングをただのコード修正と思ってる人へ (274)
OpenGLスレ Part18 (925)
Pythonのお勉強 Part47 (755)
--log9.info------------------
最も可愛い生物はうささんに決定しました (924)
【こけ】にわとりってかわいいね 6羽目【こうろう】 (794)
………我が家にイモリがやって来た………【その5】 (540)
アジアンスネークを語るスレ2 (512)
レプティリカスを語るスレ4 (487)
イシガメについて語ろう 10 (331)
【オオトカゲ】 モニター総合スレpart6 【大蜥蜴】 (693)
Hoshi Family異常な動物愛護 (548)
【両爬】HBM&ぶりくら&JRS10【祭典】 (803)
レオパードゲッコー・ヒョウモントカゲモドキ36匹目 (216)
【虹の橋(笑)】痛いハムスター飼育者【ちっこ(笑)】 (364)
ペット禁止物件でうさぎを飼う屑 (219)
札幌のペットショップを語るスレ。パート2 (975)
グリンパイ★ツリーパイソン・ボア専門★エメツリ (903)
ヨウム好き集まれ【11羽目】 (537)
【アホロートル・メキシコサラマンダー】ウーパールーパーpart25 (792)
--log55.com------------------
FX初心者スレ Part131
【バーチャル詐欺師】Manager2525監視スレ8
インデックスファンド Part196
【水風呂】珍法使いはエアコン無し467【扇風機】
【株板相場師列伝】かっこいいおじさん男3838
【株板相場師列伝】バーロー始まった男3838
【海外BO】ハイローオーストラリアpart94【アフィ禁】
【FX】どうしたら勝てるようになった?159勝目