Excel VBA質問スレ Part4 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
07/09/15 09:03:22

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

質問前に 【 >>2-3 】 あたりを良く読むこと

前スレ
スレリンク(tech板)


2:デフォルトの名無しさん
07/09/15 09:03:33

★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。

★2 ExcelのVBA以外の部分に関する質問はNGです。
   但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。

★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。
   
 VBAとは、『Visual Basic for Application』の略で
  Application
  ├Workbooks
  |└Workbook
  |  ├Worksheets
  |  |└Worksheet
 というApplication以下のオブジェクトを、VB言語で操作するものを指します。 
 例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、
 セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。

★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。

★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
   コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
   ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。


3:デフォルトの名無しさん
07/09/15 09:03:38

・過去スレ

01 スレリンク(tech板)
02 スレリンク(tech板)
03 スレリンク(tech板)


4:デフォルトの名無しさん
07/09/18 07:04:47


5:デフォルトの名無しさん
07/09/18 22:54:04
−−−−−−−−−−
|1000|1100|以上|
−−−−−−−−−−
|   | 900|以下|
−−−−−−−−−−

こんな感じのデータが縦横に沢山入っているワークシートなんですが
1000の数値を監視し、1100以上や900以下になったら
1000のセルの色(既に1000ではなくなっているけど)を変えるというものを
VBAで作ろうとしています。

1000の部分は自動で数値が刻々と変わり
1100、900、以上、以下のセルに関しては事前に手入力します。

WorkSheetのChangeイベントでワークシートの全セルの変化を全て監視し
変化のあったセルが1000の位置だったら(2つ右のセルの内容が「以上」かどうかで判定するつもりです)
1000の右の1100や右下の900と比較して
以上なら1000の文字列を青、以下なら赤といった感じで
セルの色を青や赤に変えたいんですが
VBA初心者なんでセルの色を変えるのはともかく
右隣や2つ右、右下といった位置のセルの内容を取得するには
どんなソースを書けばいいのか検討もつきません_| ̄|○

環境はWin2000+EXCEL2000です

6:デフォルトの名無しさん
07/09/18 23:06:44
cells.offset

7:デフォルトの名無しさん
07/09/18 23:07:26
VBAが必要かどうかから考えろ
シートの関数も知らないで聞いてる訳じゃないだろ?



8:デフォルトの名無しさん
07/09/18 23:15:55
>>5 条件付き書式でダメなのか?

9:5
07/09/18 23:15:56
>>6.
offsetが目的に使えそうです。
有難うございます。

>>7
すんません、関数もVBAもほとんど知りません。
大昔にC言語でゴリゴリソース書いていたことはあるのですが・・・・


10:5
07/09/18 23:19:41
>>8
とりあえず条件付き書式で作ってみたんですが
空白の部分にも1000を入れる必要があるのと
条件を満たした時に音を鳴らしたいのでVBA化するつもりです。
(音の鳴らし方は調べて分かりました)


11:デフォルトの名無しさん
07/09/19 21:40:05
現在、あるフォルダ内のcsvを読み込んで進捗表に反映させるマクロを使っているんですが、
その後にフォルダとその下層のファイルをクリップボードに張り付ける事は可能ですか?
可能であればヒントだけでも頂ければ・・・

12:デフォルトの名無しさん
07/09/19 21:50:24
>>11
可能だけど>>2★3★4

13:デフォルトの名無しさん
07/09/19 21:53:18
クリップボードとか不安定な領域じゃなく、FSO使ってフォルダオブジェクトとして保持すればいいような

14:デフォルトの名無しさん
07/09/20 20:12:47
INDIRECT関数をVBA上で作りたいと思っています。
たとえば、sheet2にある(B,C)のセルにあるものを参照しようとして、

Function INDIRECT2(B, C)
Dim SHEETNAME As Worksheet
Set SHEETNAME = Worksheets("sheet2")
INDIRECT2 = SHEETNAME.Cells(B, C)
End Function

で動かすと、値が帰ってきます。
ここで、"sheet2"を変数としてに扱おうと考えて、

Function INDIRECT2(B, C)
Dim SHEETNAME As Worksheet
MOJI = "Sheet2"
Set SHEETNAME = Worksheets(MOJI)
INDIRECT2 = SHEETNAME.Cells(B, C)
End Function

と書くと#value!になってしまいます。
worksheet名を変数で指定することはできないのでしょうか?



15:デフォルトの名無しさん
07/09/20 20:25:27
ツッコミどころが多すぎてどこから突っ込んで良いものやら・・・

とりあえず
INDIRECT2 = SHEETNAME.Cells(B, C)

INDIRECT2 = SHEETNAME.Cells(B, C).Value

こうしろ



16:デフォルトの名無しさん
07/09/20 20:33:44
上のコードで動くのか。。。

17:前スレ984
07/09/20 22:46:42
Dim fName , tmp

fName = Combobox1.Value

 With CreateObject("Scripting.FileSystemObject")
  If LCase(.GetExtensionName(fName)) = "txt" & vbCrLf Then
   tmp = Split(fName, ".txt" & vbCrLf)

    For Each fName In tmp
     Msgbox fName
    Next fName
  End If

 End With

End Sub

こんな感じで、コンボボックス内のテキストファイル名を取り出す処理はできたのですが、
最後に一回空白が返ってきてしまいます。
どのようにすれば改善できるでしょうか?

18:デフォルトの名無しさん
07/09/20 23:39:49
あのねぇ・・・Valueにリストを入れるなよ・・・

19:14
07/09/21 14:05:42
ありがとうございました。

Function INDIRECT2(B, C)
Dim SHEETNAME As Worksheet
MOJI = "Sheet2"
Set SHEETNAME = Worksheets(MOJI)
INDIRECT2 = SHEETNAME.Cells(B, C).value
End Function

にすることによって、同一ブックの中でのセルの参照ができるようになりました。
ここで、
MOJI="[002.xls]sheet2"のように、ほかのブックの値を参照させることはできないのでしょうか?


20:デフォルトの名無しさん
07/09/21 20:32:14
application.workbooks(BookName).worksheets(SheetName)

21:デフォルトの名無しさん
07/09/22 09:53:52
VBA歴3ヶ月の初心者なんですが質問させて下さい。

WindowsXPでエクセル2003を使用しています。

下記のように

a
--
b
--
c
--
d

と縦に並んでいる文字列をコピーして
行と列を入れ替えて、それぞの文字を2つずつに
増やして貼り付けしたいのですが、これは可能でしょうか?

a│a│b│b│c│c│d│d│

いろいろ考えたのですが上手い方法が思いつきません。
もし可能でしたらヒントを頂けないでしょうか?

よろしくお願い致します。


22:デフォルトの名無しさん
07/09/22 12:00:22
可能
range
For each

23:21
07/09/22 14:23:27
22さんありがとうございます。

22さんのヒントを見てから
1時間ぐらいネットで調べたりして考えたんですが
やっぱり分かりません(T_T)
私の職場は女性ばかりでプログラムに強い人が
いなくて職場では誰にも聞けません。。

もし良かったらもう少しヒントを頂けないでしょうか?
よろしくお願い致します。

24:デフォルトの名無しさん
07/09/22 14:46:28
>>23
説明するの面倒だから、一セルずつコピーしたら?

25:21
07/09/22 15:24:48
>>24さん

例ではa〜dまでしか書きませんでしたが、実際は膨大な量なんですよ(^^;)
1セルずつコピーしてたらものすごく時間がかかるんです。
この問題さえクリア出来れば全ての作業を自動化出来るのですが・・・。

お手数おかけして申し訳ありませんでした。
私の今の実力では無理ですが、いつかは自分で出来るように頑張ります!

26:デフォルトの名無しさん
07/09/22 15:36:41
>>25
まさか、描画や再計算を止めてないって落ちはないよね?
あなたの言う膨大がどれほどか判らないけれど、100や200のセルのコピーくらい大して時間掛かりませんが。

27:21
07/09/22 16:18:45
>>25さん
プログラム完成してないので再計算を止めてないも何も動かしていません(T_T)
200のセルのコピーぐらい大して時間がかからないとの事ですが、
すべてのセルを2倍にして、縦横入れ替えていたらミスも発生するし
作業時間が勿体ないと感じるのです。
その時間が他の仕事に当てられたらと思い、家で考えていました。

もっと勉強してから出直して来ます。

28:21
07/09/22 16:19:33
すいません、↑間違えました
>>26さんでした(^^;)

29:デフォルトの名無しさん
07/09/22 16:27:04
大して時間がかからないとは、手作業でやってもということではなく、
マクロで実行したときの話だと思うが。

30:デフォルトの名無しさん
07/09/22 16:40:46
21はプログラムが完成していないと言っているので手作業の事じゃないの?

完成してりゃあ100や200のコピーぐらいすぐ終わるっしょ。

完成して無い奴に
100や200のセルのコピーくらい大して時間掛かりませんが
とか言っても意味無いっしょw

31:デフォルトの名無しさん
07/09/22 16:55:36
ちょっと待て、もしかしたら>21はマクロ云々の話をしていないのではないか?
# だとしたら鼬害なのだが。

32:デフォルトの名無しさん
07/09/22 17:16:20
ちょっと待て、実は24も分かってないとか。

33:デフォルトの名無しさん
07/09/22 17:23:35
問題を整理すると、>21は手作業では手間が掛かることをマクロでやりたい。
しかし、セルを一つずつコピーするようなマクロも書けないので一から教えろ。
と言う話なのかな?

34:デフォルトの名無しさん
07/09/22 18:18:59
For Eachが理解できないやつにExcel VBAを教えるのも無理な話

素直に手動でコピって、形式を選択して貼り付けで行列変換しとけ

35:デフォルトの名無しさん
07/09/22 19:56:11
ここの住人はやっぱり冷たいな。
分かるんなら正解かいてやれよ。

36:デフォルトの名無しさん
07/09/22 20:02:44
自演乙

37:デフォルトの名無しさん
07/09/22 20:54:31
いや冷たいのは事実

38:デフォルトの名無しさん
07/09/22 20:56:56
能書きはこくけどサンプルコードのひとつもだせない
それがVBAスレクオリティ

39:デフォルトの名無しさん
07/09/22 21:02:29
>>2★5なので、丸投げ野郎やコード呉厨に冷たいのは当然

それを叩いてるのは自演か過去に丸投げやクレクレして冷たくあしらわれた事が有る奴等w

40:デフォルトの名無しさん
07/09/22 21:24:50
クレクレが必死だな

41:デフォルトの名無しさん
07/09/23 00:36:16
ヒント:dim文が3行set文2行コード3行でできる

42:デフォルトの名無しさん
07/09/23 00:53:27
ハズレ

43:デフォルトの名無しさん
07/09/23 02:53:50
>>31の鼬害がよめなかった俺はゆとり。再変換して納得。

>>21
別のシートのA1に
=INDEX(シート名!$A:$A,ROUNDUP(COLUMN()/2,0),1)
といれて横にフィルすれば俺の脳内ではいけるけど
128行を超えるとExcel2003は256列しかないで無理。

なんで、もし129行目からは下の行に表示するならA1に
=INDEX($A:$A,ROUNDUP(COLUMN()/2,0)+(ROW()-1)*128,1)
でフィルすれば良い感じ

このままじゃ板違いなんで、同じことをVBAでやると

Dim Rng, rngValue, col%, r%
Rng = sh.Range(sh.Range("A1"), sh.Range("A65536").End(xlUp))
col = 1: r = 1
For Each rngValue In Rng
Cells(r, col) = rngValue: Cells(r, col + 1) = rngValue
col = col + 2: If col > 256 Then col = 1: r = r + 1
Next
まぁ参考程度に。

てか、ここの住人なら俺なんかより良いコードかけるだろうに
ホントいけずだな




44:デフォルトの名無しさん
07/09/23 05:39:06
Sub aaa()

a = 0

Do Until a 〉127

a = a + 1
c = a * 2

b = 1

Cells(b,c -1) = Cells(a,b)

Cells(b,c) = Cells(a,b)
End Sub
もういないかな?
これ貼り付けれ


列の端っこまでの制限はあるが

ソースが美しくないとかの批判は受け付けねw

作るより打つほうに時間かかる始末
携帯からだと死ねるw

お前らもうちょい優しく教えてやれやwwwwwwwwwwwww



45:デフォルトの名無しさん
07/09/23 05:45:25
美しい美しくない以前に・・・・・

46:デフォルトの名無しさん
07/09/23 05:51:13
ダメならダメとはっきりいってください

ソースのヒントも書かない糞野郎さん

47:デフォルトの名無しさん
07/09/23 06:12:08
結局質問スレとして機能してねぇのなここ
ビジネスsoft板のと統合しちまえよ
こんな糞スレ要らん

48:デフォルトの名無しさん
07/09/23 09:07:11
Dim RngA As Range
Dim RngB As Range
Dim i As Long

Set RngA = Range("A1:A5") 'コピー元セル
Set RngB = Range("B1") 'コピー先セルの始点

For i = 1 To RngA.Count
Range(RngB.Offset(0, i * 2 - 2), RngB.Offset(0, i * 2 - 1)) = RngA.Cells(i)
Next

中途半端だけど普通はこんなもんか?
ハードコードにすればRngA,Bのくだりはいらないけど。
ただ、やっぱりコード0行で来るスレではないと思うぞここは。

>>44 はループは閉じるとこから始めような。

49:デフォルトの名無しさん
07/09/23 11:23:57
Excel2000で、officeのクリップボードではなくWindowsのクリップボードに変数の値をコピーする方法を教えてください

50:デフォルトの名無しさん
07/09/23 13:17:15
>>49
DataObject使うかWin32API使え

>>2★5なので、あとは自分で頑張ろう

51:デフォルトの名無しさん
07/09/23 13:36:33
〉〉48

ああすまん Loop書きわ忘れてたな

一応VBA歴3ヶ月って書いてあったから行列の入れ替えと二列づつて書く方法がたまたま思いつかなかったんじゃないかね?
そのヒントすら教えんで ただ罵倒してるのにイラついたもんで

ヒントくださいっていってるしな



52:デフォルトの名無しさん
07/09/23 13:38:32
そして誤字 脱字orz

53:デフォルトの名無しさん
07/09/23 14:18:24
誰か罵倒しているのか?

54:デフォルトの名無しさん
07/09/23 20:14:16
Rangeオブジェクト と For Eachステートメントを書いといたのに、
「ヒントすら教えん」とか言われてモナ
これ以上どうしろっつーんだよw
コード丸々書けと?
Rangeでヘルプ引けば
--------------------------------------------
次の使用例は、シート 1 のセル範囲 A1:D10 に対してループを行います。
セルの値が 0.001 未満の場合は、値をゼロ (0) に置き換えます。

For Each c in Worksheets("Sheet1").Range("A1:D10")
If c.Value < .001 Then
c.Value = 0
End If
Next c
-----------------------------------------
なんて出てきて、よく読んでみれば
「あー範囲をセル単位でループして値をセットすりゃ良いんだな」って
ぐらい、ちょっと脳みそが有ればすぐ分かるだろ

残念ながら最低限の能力ラインってのは存在するんだわ
自分が相手にされなかった経験があるからって、いいかげん怨み節を垂れ流すのは
やめてもらえんもんかね?>>51

55:デフォルトの名無しさん
07/09/23 20:40:34
>>54
考え自体は肯定も否定もしないがそのレスは何なのw
そう思ってたからみんなスルーしてただけだろ。

たまーに質問者放置でコード談義に盛り上がり、たまーに優しい人がいて、
基本は「スレ違い」で終わるだけのスレじゃんw

56:デフォルトの名無しさん
07/09/23 21:36:01
>>55
まぁここはExcel VBA雑談スレだからなぁ

57:デフォルトの名無しさん
07/09/23 21:45:39
> 考え自体は肯定も否定もしないがそのレスは何なのw
> そう思ってたからみんなスルーしてただけだろ。

なるほどな
「みんなもそう思ってる」とかその系統か

クレクレ脳を基準に「ヒントもない」とか強弁しなさんなよ

58:デフォルトの名無しさん
07/09/24 14:13:20
OS:winxp2
ver:2003

宣言セクションでモジュールレベル変数やパブリック変数を
宣言する際に、初期値を格納したのですが、どう記述すればいいんでしょうか?

59:58
07/09/24 14:14:27
× 初期値を格納したのですが、・・・



○ 初期値を格納したいのですが、・・・

60:デフォルトの名無しさん
07/09/24 14:42:10
無理なバージョンは無理だから
まとめて初期値入れるプロシージャでもつくっとけ

61:デフォルトの名無しさん
07/09/24 15:02:33
残念ながら言語仕様で宣言と初期化は同時にできないんです(><


62:デフォルトの名無しさん
07/09/24 15:16:18
Workbook_Open() か UserForm_Initialize()

63:デフォルトの名無しさん
07/09/24 15:43:20
[VBA プロジェクト オブジェクト モデルへのアクセスを信頼する]
をVBAから操作するにはどうすればよいのでしょうか?

64:デフォルトの名無しさん
07/09/24 16:04:26
>>63
それが出来ちゃったら"脆弱性"と呼ばれるだろうなw

65:デフォルトの名無しさん
07/09/25 00:31:37
>>21さんのやりたいことってVBA使わなくても実現できますよ。
a
b
c
d
a
b
c
d
というデータを用意して,並べ替えたら
a
a
b
b
c
c
d
d
になるでしょ。
その後コピーしてから「形式を選択して貼り付け」します。
この時「行列を入れ替える」をチェックしてね。
すると
aabbccdd
になるよ。

66:デフォルトの名無しさん
07/09/25 00:44:51
VBみたいにuserformにメニューバーて追加できますか?
ツールバーなら出来るみたいだけど。
メニューエディタは見当たらないし仕様上無理ですか?

67:デフォルトの名無しさん
07/09/25 01:51:34
>>65
ついでに「それをマクロ記録してショートカットキー登録」すれば十分だったりするかなw

68:デフォルトの名無しさん
07/09/25 02:09:59
>>66
無理
ただしOCX自作するならその限りではない

69:デフォルトの名無しさん
07/09/25 03:01:24
>>68
素早い回答ありがとうございます。
OCX?ですか。多分無理そうなのであきらめます…。

70:デフォルトの名無しさん
07/09/25 20:49:01
○Sheet1.Activate
Range("A1:C3").Borders.Linestyle = True

○Sheet1.Activate
Range(Cells(1,1),Cells(3,3)).Borders.Linestyle = True

○Sheet1.Range("A1:C3").Borders.Linestyle = True

×Sheet1.Range(Cells(1,1),Cells(3,3)).Borders.Linestyle = True

動いたからいいんだけど、どうして一番下だけ駄目なのか理由がわからなくて。
下が駄目なら3番目も駄目なような気がするんだけど?

71:デフォルトの名無しさん
07/09/25 20:54:34
3番目はそれで特定できるけど
下はSheet1.Cells(1,1)じゃないとダメってことだろ
Sheet1.Activateすれば下でも通るでしょ

72:デフォルトの名無しさん
07/09/25 21:19:07
それじゃ回答になっていない

Sheet1.Range(Cells(hoge))って記法だと
Rangeまでは上位オブジェクトが参照できている
しかし(Cells(hoge))だとCellsの上位オブジェクトが分からない
だからその場合VBA側で「とりあえずアクティブシートを参照」するわけだ
これだと期待する動作かどうか判然としない
Activate,Select系を使わないのが望ましいというのは、こういうことから

つまり面倒でも.Sheet1.Range(Sheet1.Cells(hoge,hoge),Sheet1.Cells(hoge2,hoge2))
って記法にしなくてはならない
ソースが読みづらくなるので、こう言うときは通常はWithステートメントを使う

73:デフォルトの名無しさん
07/09/25 21:28:21
とりあえずじゃないだろ

74:デフォルトの名無しさん
07/09/25 23:25:51
65はアホ?

75:デフォルトの名無しさん
07/09/25 23:36:49
>>70
Sheet1.Range(Range("A1").Address, Cells(3, 3).Address).Borders.LineStyle = True
これはOKだったりして

76:デフォルトの名無しさん
07/09/26 19:42:21
Excelで入力規則でリストを設定するとセルがコンボボックスになります。
これと同じようにセルにボタンのような機能を持たせる事は可能でしょうか?
見た目はボタンでなくてもいいです。
実現したいことはあるセルのボタンをクリックすると隣のセルの入力文字を
取得したいのです。通常のコントロールボックスのボタンだとどのセルにも
置けてしまうので隣のセルの文字列取得はできないと思うのです。
VBで言えばSPREADの一つのセルをボタン型にしたようなものです。
要はクリックされれば隣のセルの文字列を取得しメッセージボックスで表示
させるような処理がしたいのです。


77:デフォルトの名無しさん
07/09/26 19:53:46
SelectionChangeイベントでそれなりには作れる

78:デフォルトの名無しさん
07/09/26 21:02:46
コントロールのボタンでそれなりには作れる(配置されてるセルを取得できるので)

79:デフォルトの名無しさん
07/09/26 22:00:11
>>78
配置されたセルが取得できるとは知りませんでした。
セル間の微妙な位置にも置けると思うので・・・
配置されたセルの取得方法はどうすればいいのでしょうか?

80:デフォルトの名無しさん
07/09/26 22:01:53
ヘルプ嫁

81:デフォルトの名無しさん
07/09/26 22:14:30
for i=1 to 100
  if cells(i,1).value ="飛ばす" then □
  ○○
next i

□で、今回のループだけ抜けたいときはどうすればいいんでしょう
(ようするに、A列に特定文字が入ってるときは○○を実行させたくない)

nextだとエラー、
end forだとfor〜next自体が終わってしまう

elseで囲めばいいんだけど○○の部分が凄く長くて見通しが悪くなるので
なんかどうにかしたかった。

82:デフォルトの名無しさん
07/09/26 22:17:02
そこでgotoですぜ。旦那w

83:デフォルトの名無しさん
07/09/26 22:56:57
>>80
すみません。うまく見つける事ができません。

84:デフォルトの名無しさん
07/09/26 23:40:49
>>81
Continueは?

85:デフォルトの名無しさん
07/09/27 00:12:17
if not 〜 end if

86:デフォルトの名無しさん
07/09/27 00:34:22
>>79
CommandButton1だったら

CommandButton1.BottomRightCell.Address

とか

87:デフォルトの名無しさん
07/09/27 01:19:33
10進小数を2進小数に直すプログラムを作っています
このプログラムを使って0.375を2進数に直したいのですが
0.375はこのプログラムのどこに入れたらよいでしょうか?
プログラム自体間違えてたら
間違えている場所を指摘してくれると幸いです


Sub m進小数()
p = Cells(1, 1)
q = Cells(1, 2)
k = 1
While p > 0
a = Int(p * 2)
q = a * 0.1 ^ k + q
p = p * 2 - Int(p * 2)
k = k + 1
Wend
Cells(2, 1) = 0.1 ^ k + q
End Sub


88:デフォルトの名無しさん
07/09/27 07:15:14
Cells(1, 1)

89:デフォルトの名無しさん
07/09/27 09:27:59
多数のファイルの、それぞれ同一の名前のシート内に、
特定の文字列があるかどうかを検索して、できればそれを削除したいのですが、
どうすれば可能でしょうか?

↓のマクロではシートを指定できず、削除することもできません。

Sub Macro()
With Application.FileSearch

.NewSearch
.LookIn = "C:\Documents"
.TextOrProperty = "NaN"
.MatchTextExactly = True
.FileType = msoFileTypeAllFiles
.Execute

For Each f In .FoundFiles

MsgBox f
Next f
End With

End Sub



90:デフォルトの名無しさん
07/09/27 12:29:11
あたりまえ

91:デフォルトの名無しさん
07/09/27 22:35:14
へー、そんなメソッドがあったのか
知らんかった

お礼にヒントをあげよう

Sub SearchXLS()
Dim wbkTemp As Workbook

For Each wbkTemp In Application.Workbooks
Debug.Print wbkTemp.Name
Debug.Print wbkTemp.Worksheets(1).Name
Call wkbTemp.Close(False)
Next

End Sub

92:デフォルトの名無しさん
07/09/27 23:09:36
>>86
回答ありがとうございます。
やっと調査できるきっかけができました。

93:デフォルトの名無しさん
07/09/28 01:59:10
押されたコマンドボタンのオブジェクトは
どうやって取得すればよいのでしょうか?

94:デフォルトの名無しさん
07/09/28 08:25:32
>>93
普通に

95:デフォルトの名無しさん
07/09/28 18:15:32
OSはXP、エクセルは2000を使っています。
VBAでソルバーの作業を記録して、実行しようとするとエラーが出ます。
VBAでソルバーは使えないのでしょうか?
使えるのであれば、是非方法を教えてください。お願いします。

96:デフォルトの名無しさん
07/09/29 21:09:22
C、C++のincludeにあたる機能はあるのでしょうか

他のSheet(というかモジュール)のマクロ関数を呼びたいのですが・・・よろしくお願いします。

97:96
07/09/29 21:23:05
検索ワード変えたら見つかりました、すんまそん>Run

98:デフォルトの名無しさん
07/10/01 01:53:56
■長さ0の空白をempty値にしない方法教えてください
次のような代入をすると、右側のセルの""(長さ0の空白)が左側にはempty値に変換されて代入されます

Sheets("Sheet1").Range("A1:Z1").Value = Sheets("Sheet2").Range("A1:Z1").Value

もともとのデータで0と区別するために、あえて""が入ってるので、empty値に換えて欲しくないのです。
そもそも、VBAで
Sheets("Sheet1").Range("A1:Z1").Value = ""
と入れると、各セルにはempty値が入るみたいです。
(excel 2000、windows 2000)

以上、よろしく

99:デフォルトの名無しさん
07/10/01 03:36:46
>>98
Sub test()
  [A1].NumberFormat = "@"
  [A1].Value = ""
  Debug.Print TypeName([A1].Value)

  [A1].NumberFormatLocal = "G/標準"
  [A1].Value = ""
  Debug.Print TypeName([A1].Value)
End Sub


「Value = ""」の代入をするとEmpty値が入るのではなく
表示形式「G/標準」のセルにNullStringを代入するとEmpty値として扱われる
NullString("")は文字通りString(文字列)なんだから、文字列として扱って欲しければ
文字列の表示形式である「@」を設定してから代入すればいい

あとは値(Value)の代入ではなくセルのコピーを行ってもいいし
NullStringを返す数式「=""」を入力してやる手もある
[A1].Formula = "="""""

100:デフォルトの名無しさん
07/10/01 11:58:45
>>99
ありがとうございます、こんな感じでOKですね。

Sheets("Sheet1").Range("A1:Z1").NumberFormat = "@"
Sheets("Sheet1").Range("A1:Z1").Value = Sheets("Sheet2").Range("A1:Z1").Value
Sheets("Sheet1").Range("A1:Z1").NumberFormat = Sheets("Sheet2").Range("A1:Z1").NumberFormat

■セルのコピーとは、Selection.Copyとかですかね?
 処理中にシートの切り替えとかの操作により、影響を受けそうな感じで使いたくないです

101:デフォルトの名無しさん
07/10/01 21:37:58
偉そうな弁舌はオブジェクト構造を理解してからにしな

102:デフォルトの名無しさん
07/10/02 02:18:31
今日の日付で保存したいのですが・・・
1001.xls みたいに

103:デフォルトの名無しさん
07/10/02 04:30:07
そんぐらいググレカス

104:デフォルトの名無しさん
07/10/02 07:57:21
>>102
つ[time()]
つ[localtime()]
つ[strftime()]
つ[fopen()]
いけね、Cスレじゃなかった。

105:デフォルトの名無しさん
07/10/02 08:18:00
>>101

106:デフォルトの名無しさん
07/10/03 09:42:52
糞VBAなんて偉いやつは使わん、いいかげんに使えるから良いのさ

107:デフォルトの名無しさん
07/10/03 10:24:49
CheckBoxのオブジェクト名を変数に置き換える事って可能ですか?
For~Nextで複数のCheckBoxを使いたいと思っているのですが上手く行きません

108:107
07/10/03 10:27:19
OSは2000でExcel2002です、連投すいません

109:デフォルトの名無しさん
07/10/03 11:17:43
>>108
Excel コントロール配列
でググってみ

110:デフォルトの名無しさん
07/10/04 01:57:44
ちょい質問です。
クラスのインスタンスを生成する方法として
下記の2つの方法に機能的な違いはありますか??

【方法@】
Dim myObj As class
Set myObj = New class

【方法A】
Dim myObj As New class


Aはただ単に@を1行にまとめただけ???

111:デフォルトの名無しさん
07/10/04 02:29:56
Sub 桁合わせる()
Dim aaa As Range

Application.DisplayAlerts = False
On Error Resume Next
Set aaa = Application.InputBox(prompt:="セル範囲を指定してください", Title:="桁を合わせます", Type:=8)
On Error GoTo 0
Application.DisplayAlerts = True

If aaa Is Nothing Then
MsgBox ("終了します")
Exit Sub
Else
Select Case aaa
Case Is >= 100
aaa.NumberFormatLocal = "0"
Case 10 To 99
aaa.NumberFormatLocal = "0.0"
Case 1 To 9
aaa.NumberFormatLocal = "0.00"
Case Is <= 0
aaa.NumberFormatLocal = "0.000"
End Select
End If
End Sub

単一セルに対してなら処理できるのですが、セル範囲指定だと、型が一致しなくなってしまいます
それと上記のままだと、数値が0以下のとき(0.123456789なら0.123って表示したい)うまく動作しません
なので変数でSingleを宣言したら、今度は整数が処理できなくなってしまいました
どこを直したら、いいでしょうか つたないソースですが、よろしくお願いします

112:デフォルトの名無しさん
07/10/04 05:46:41
>>110
オブジェクト指向を勉強してくれ

113:デフォルトの名無しさん
07/10/04 08:21:51
>>109
出来ました、ありがとうございます

114:デフォルトの名無しさん
07/10/04 13:26:48
>>111
Sub 桁合わせる()
Dim aaa As Range
Dim myCell As Range

省略

Else
For Each myCell In aaa
Select Case myCell.Value
Case Is >= 100
myCell.NumberFormatLocal = "0"
Case 10 To 99
myCell.NumberFormatLocal = "0.0"
Case 1 To 9
myCell.NumberFormatLocal = "0.00"
Case Is < 1
myCell.NumberFormatLocal = "0.000"
End Select
Next
End If
End Sub

>数値が0以下のとき(0.123456789なら0.123って表示したい)うまく動作しません
0.123456789は0より大きい数値だから0以下が条件では動作しない

115:デフォルトの名無しさん
07/10/04 15:43:42
今のエクセルは>>111で動くほどおばかさんにもやさしいのか

116:デフォルトの名無しさん
07/10/04 15:44:12
>>112
今勉強中

117:デフォルトの名無しさん
07/10/04 21:26:51
>>110
機能的には同じ。

118:デフォルトの名無しさん
07/10/04 21:38:34
ハズレ

119:デフォルトの名無しさん
07/10/04 21:56:38
とあるフォルダを指定して、そのフォルダ配下(下位フォルダを含めて)のファイルを
探してデータを更新するというマクロを作成しようとしています。
(Microsoft Scripting Runtimeを参照設定しています)

 Dim FSO As FileSystemObject
 Dim dataFolder As Folder
 Dim pathName As String ←指定するフォルダ名

 Set FSO = CreateObject("Scripting.FileSystemObject")
 dataFolder = FSO.GetFolder(pathName)
 …

とやりたいのですが、dataFolderの設定を入れようとすると 「As folder」と
変換されてしまってうまくいきません。
他は大丈夫でFolderの指定だけできないので自分の書いたソースが悪いと思うのですが
どうにも見当がつきません。
何をチェックすると解決できるのでしょうか?

120:デフォルトの名無しさん
07/10/04 22:06:03
とりあえず
Set dataFolder = FSO.GetFolder(pathName)


121:デフォルトの名無しさん
07/10/05 00:24:30
>>110
機能的な違いはないが、MS推奨では宣言と初期化を分けるように書かれている
オブジェクト指向云々は一切関係ない
コーディング規約の問題

>>119
オブジェクトブラウザ見れ
Dim objFSO As Scripting.FileSystemObject
Dim objFld As Scripting.Folder
Dim objFile As Scripting.File

Set objFSO = New Scripting.FileSystemObject
Set objFld = objFSO.GetFolder(ThisWorkbook.Path)
For Each objFile In objFld.Files
Debug.Print objFile.Name
Next
Set objFile = Nothing
Set objFld = Nothing
Set objFSO = Nothing
Set objFile = Nothing
Set objFld = Nothing
Set objFSO = Nothing

122:デフォルトの名無しさん
07/10/05 00:26:22
分かると思うけど後半3行は単なるコピペミスなので気にしないこと

123:110
07/10/05 02:47:11
>>121
なるほど!さんくすです!勉強になりました!

124:デフォルトの名無しさん
07/10/05 08:24:33
嘘(or間違い)を見て勉強になったとは、これ如何に?

125:デフォルトの名無しさん
07/10/05 10:55:49
失敗から学べることは多いが
性交から学べることは何一つない

126:119
07/10/05 19:12:20
>>120-121
ありがとうございます。
参考にしながら1から作り直したところ今のところはうまくいっています。
Setで設定してなかったから駄目だった、ということなのでしょうか。

教えてくださってありがとうございました。

127:デフォルトの名無しさん
07/10/06 00:30:12
半可通が朝っぱらから何を語ってんだか

128:デフォルトの名無しさん
07/10/06 07:12:43
能書きスレ

129:デフォルトの名無しさん
07/10/06 15:16:25
>>114
とても勉強になりました。ありがとうございます

130:デフォルトの名無しさん
07/10/06 19:36:50
>>110
以前どこかで
(1)のやり方の方にしないとNothingにしても
メモリが解放されないと聞いた。

131:デフォルトの名無しさん
07/10/06 19:58:00
んなーこたーない

132:デフォルトの名無しさん
07/10/06 20:13:05
別にnothingでメモリが開放されるわけじゃないから正解

133:デフォルトの名無しさん
07/10/06 20:29:30
そうなん?でもnothingしないと解放してくれないときもあるぞ

134:デフォルトの名無しさん
07/10/06 20:40:38
>>133
例をあげてみてよ

135:デフォルトの名無しさん
07/10/06 21:03:14
相互参照した場合、どっちかを明示的にnothingしないとメモリが残った


136:デフォルトの名無しさん
07/10/06 21:32:08
Nothingはあくまでもデストラクタを呼びつつ参照先を消去するだけ

デストラクタが解放を拒んだらそこでリークになる

137:デフォルトの名無しさん
07/10/07 14:28:33
WindowsXP、エクセル2003を使用しています。
VBAで引数に範囲があるWorksheet関数を使用したいのですが
VBA上の配列を範囲に指定することが出来ません。
どのようにすれば、使用できるのかご教授願います。


RANK(数値,範囲,順序)

Dim Hht(9) As Double
Dim i As Long

中略

Hrank = WorksheetFunction.rank(Hht(i), Hht)

Hhtで型が一致しませんとエラーがでる。

138:デフォルトの名無しさん
07/10/07 15:23:10
これはひどい

139:デフォルトの名無しさん
07/10/07 16:00:44
皆さんこんにちは
この連休でデーター仕事を行なっていますが、
なにせ未熟者、手作業で遅々として進みません。
皆さんのお力お借りしたいです、よろしくお願いいたします。

以下のようなデーターがありまして、
黒★の列は時間なのですが、
これを一秒ごとに行を空けたいのです。
時間は5秒毎というわけではなく、10秒であったり、
18秒であったりとランダムに出現します。
この表であれば各4行づつ空けたいのです。
他の列は空白でかまいません。時間さえ一秒ごとに埋まってくれれば…。
どなたか教えていただけませんか?
ググレば出て来るのなら、ググレカスでもかまいません、
なんでもアドバイスよろしくお願いいたします。

                                    ★ 
T1|No. 1|34.4149|135.31245|10.7|2007/9/12|5:18:30|WGS84|-9999.9|-9999.9
T1|No. 2|34.4149|135.31245|11.7|2007/9/12|5:18:35|WGS84|-9999.9|-9999.9
T1|No. 3|34.4149|135.31245|13.6|2007/9/12|5:18:40|WGS84|-9999.9|-9999.9
T1|No. 4|34.4149|135.31245|14.6|2007/9/12|5:18:45|WGS84|-9999.9|-9999.9
T1|No. 5|34.4149|135.31245|14.6|2007/9/12|5:18:50|WGS84|-9999.9|-9999.9


140:139
07/10/07 16:04:40
>他の列は空白でかまいません。時間さえ一秒ごとに埋まってくれれば…。 ×
他のセルは空白でかまいません。時間さえ一秒ごとに埋まってくれれば…。○

すみません。説明が悪いです。

141:デフォルトの名無しさん
07/10/07 17:12:34
>>137
範囲は文字通りrange

>>138
黙ってろ

>>139
何がしたいんだか皆目わかんね

142:デフォルトの名無しさん
07/10/07 17:45:09
>>139
5:18:30のセルを選択5:18:30を変数に入れる
カーソルをひとつ下に5:18:35を変数に入れる
2つの変数から差の秒数を取得
秒数だけ繰り返し行を挿入
1秒増やした時間をセルに入れながらカーソルを下に移動
以上を繰り返す

143:デフォルトの名無しさん
07/10/07 19:42:03
考え方は正しいけど、それだと実行速度的に現実的じゃないし、
シート行数が有限であるので判定が面倒くさくなる

最終時間と開始時間との差を導出して、開始時間から終了時間まで1秒づつステップしたカウント数を算出
Yにそのカウント数、Xに10個という配列を作る
配列を開始時間から最終時間まで1秒をステップした数で初期化
データを読み出して一致する時間があればデータをセット
終わったら書き出す

こんでいいはず

144:デフォルトの名無しさん
07/10/07 19:44:01
>>139
なんか、過去スレでも、ほとんど同じ質問を教えてあげた気がする。
素直に142のいう通りにやったらいいと思う。
ちなみに、2つの秒差を求める式(Date2-Date1)は、
変数=DateDiff("s",Date1,Date2)

145:デフォルトの名無しさん
07/10/07 20:26:50
やりかたくらいはわかっているんだろ

146:137
07/10/07 21:13:17
>>141
レスありがとう御座います。

Rangeの使い方がわまりません。
コードの書き方を示して頂けないでしょうか?

147:デフォルトの名無しさん
07/10/07 21:57:20
このスレをRangeで検索

148:デフォルトの名無しさん
07/10/07 22:03:17
>>146

Public Sub OshietekunTruth()
dim rngAnswer as range
dim rngOshiete as range
dim blnRes as boolean

set rngAnswer=activesheet.range("A1:Z99")
For Each rngOshiete in rngAnswer
If rngOshiete.Value Like "*書き方を示してください*" Then
rngOshiete.Value= "書き方教えろや"
End if
Next

End Sub


149:デフォルトの名無しさん
07/10/08 08:56:22
Excelのセルにコマンドボタンを貼り付けたセルをコピーしたときに
コマンドボタンをも貼り付けるにはどうすればいいのでしょうか?
動的にコマンドボタンを作成する方法でもいいのですが・・・

150:デフォルトの名無しさん
07/10/08 09:12:41
君は調べるって事がそんなに嫌いなのか?

URLリンク(www.google.co.jp)

151:デフォルトの名無しさん
07/10/08 09:14:20
>>147
ありがとう御座います。

Dim R As Range
Set R=Worksheets("Sheet1").Range("A1:C10")
an=Application.WorksheetFunction.Min(R)

こんな感じで使うことはできるのですが
配列の値をいったんシートに入れないといけないのでしょうか?
シートを使用せずにRange変数に入れるにはどうしたらよいのでしょうか?

152:デフォルトの名無しさん
07/10/08 09:35:23
>>150
調べたのですが・・・ユーザフォームでなくセルに配置してあるボタンを
コピーできればいいのですが。現状できないようですし、
できないのならセルコピー後なんらかのマクロで指定されたボタンとボタンをクリックされた
ときのプロシージャを動的に作成できないのかと探していましたが
そういった処理の例はなかなか無いようで・・・

153:デフォルトの名無しさん
07/10/08 10:21:10
>>151
そのRangeはあくまでも参照なのでメモリ上に作るって用途じゃない
ただRangeのValueは2次元配列と互換できるんで、2次元配列で処理して一括代入が可能
こんな感じで
Dim objRange as Range
Redim varArray(9,2) 'Y,Xの形式で2次元配列を宣言
(適当に配列を初期化)
With ThisWorkbook.Worksheets("Sheet1")
Set objRange=.Range(.Cells(1,1),.Cells(10,3))
objRange.Value=varArray

>>152
>そういった処理の例はなかなか無いようで・・・
検索リンク先を本当に見たのかね?
OLEObjectsとかモロで出てくるんだがね


154:139
07/10/08 12:38:42
>>144さん
パート2で、10秒おきに行を挿入するマクロを
書いていただいた方ですか?あの時は、ホント助かりました。
先月までバリバリ使ってました。ありがとうございました。

ちょっとは勉強しようと思ってるのですが、
数字の処理に追われて、全然スキルがあがってません。

教えて君ですみません。


155:137
07/10/08 23:13:13
>>153
ありがとう御座いました。
範囲指定が必要なワークシート関数が使用できるようになりました。

objRange.Value=varArray
のようにコードを書くとシート上に配列の値が入ってしまうようです。
ワークシート関数の範囲指定をVBAのコード内で完結することはできないのかな。

156:デフォルトの名無しさん
07/10/08 23:32:55
もうやだ・・・

157:デフォルトの名無しさん
07/10/09 16:23:19
Function getrank(ByVal idx As Long, arrayx As Variant)
getrank = 1
For i = 0 To UBound(arrayx)
If arrayx(i) > arrayx(idx) Then getrank = getrank + 1
Next
End Function

>>137のレス行数の半分以下でできた

158:デフォルトの名無しさん
07/10/09 19:35:21
列に書かれた文字を、1度出てきたら他を除いて
ListboxのListに書き出す書き方ってどうするんですか?
   あああ         あああ
   いいい         いいい
   えええ  −−−> えええ
   あああ         おおお
   いいい
   おおお
なかなか、うまく除けないです。

159:デフォルトの名無しさん
07/10/09 19:40:53
collectionでも使え

160:デフォルトの名無しさん
07/10/09 19:54:28
Select Distinctでも使え

161:デフォルトの名無しさん
07/10/09 20:24:01
>>159
ちょっと難しそうですが、おもしろそうです。
>>160
おおー、ありがとうございます。
早いレスありがとうございます。

162:デフォルトの名無しさん
07/10/09 22:13:33
>>159
collectionを使って、重複にエラーでできました。
ありがとうございました。

163:デフォルトの名無しさん
07/10/10 01:55:39
シートの中で一番右下にあるセルのアドレスを抜き出すことって可能ですか?

164:デフォルトの名無しさん
07/10/10 03:33:51
可能です

165:デフォルトの名無しさん
07/10/10 04:38:19
お前らVBAをどうやって学んだのですか?
またそのきっかけは?

166:デフォルトの名無しさん
07/10/10 08:13:48
本やネットを調べた
必要に迫られて


167:デフォルトの名無しさん
07/10/10 08:42:42
ヘルプとネットで調べた
マクロの記録を弄ってみたら簡単そうで便利そうだったから(事実、簡単で便利だし)

168:デフォルトの名無しさん
07/10/10 09:32:29
グラフやPivotウィザードの作るマクロは意味不明


169:デフォルトの名無しさん
07/10/10 09:37:25
>>163
SpecialCells

170:デフォルトの名無しさん
07/10/10 12:20:17
確に訳ワカメ
集計をピボットにやらそうと思ったけど、意味不明すぎて
結局SQLに逃げた


171:デフォルトの名無しさん
07/10/10 13:11:20
グラフは初めエラーばっかりでわけわからんかったけど
慣れたら簡単だった

172:デフォルトの名無しさん
07/10/10 20:43:45
エクセルだと

セルの選択は
cells(),range(),activecell
移動は
cells(x+1,1),activecell.offset()
じゃないですか

ところで、ワードだと
行の選択や、行の移動の方法は何に該当するでしょうか


173:デフォルトの名無しさん
07/10/10 22:21:36
URLリンク(hippos-lab.com)

174:デフォルトの名無しさん
07/10/10 22:22:34
わーどうしようもない

175:デフォルトの名無しさん
07/10/10 22:52:00
彡    ビュウウウ…
          彡
  彡       
        .∧ ∧
       ヾ(,,゚Д゚),)
        人つゝ 人,,
      Yノ人 ノ ノノゞ⌒〜ゞ
    .  ノ /ミ|\、    ノノ ( 彡
     `⌒  .U~U`ヾ    丿


176:デフォルトの名無しさん
07/10/11 02:55:31
>>169
ありがとうございます

177:デフォルトの名無しさん
07/10/11 18:50:56
あるセルに入った数値を整数か小数点で色分けしたいのですが(100と100.53みたいな感じ)
どういったアルゴリズムで判断すればいいでしょうか
select caseとセルの色つけは大丈夫です

プログラムの最初に戻るときは、変数の前に飛ばした方が無難ですか
それとも、一度、変数を宣言したら大丈夫なものなのでしょうか

sub sample()
start:
dim i as integer

178:デフォルトの名無しさん
07/10/11 19:15:37
検索条件で「〜と一致しないセル」というのはどうすればいいでしょうか。

例えばA1:W100までに「a,b,c,それ以外」のデータが入っているか空白か、の場合
For Each X In Range("A1:W100")
 If not X = a and not X = b and not X = c and not X = "" Then
  処理
 End If
Next
だと全セルを見に行くので、範囲が広がると時間がかかりそうな気がします。
Findメソッドのような形で不一致条件で検索して、またそこから次を検索して、ということはできませんか。

179:デフォルトの名無しさん
07/10/11 20:16:41
>>177

TypeName関数

180:デフォルトの名無しさん
07/10/11 20:45:00
> Findメソッドのような形で不一致条件で検索して、またそこから次を検索して、ということはできませんか。
それは出来る出来ないではなく「作る」ものだよ。その為のVBA。

時間短縮なら二次元配列に値を取得してからやればかなり速度アップするし
a,b,cではなく"a","b","c"ならlike演算子が使えるし
複数条件使う場合はandで繋げるよりネストした方が速い

URLリンク(officetanaka.net)
のように配列使った検索はFindメソッドより遙かに早いくらいなんで、
速度求めるなら組み込みメソッドに拘るなんてバカらしい

181:デフォルトの名無しさん
07/10/11 21:26:26
>複数条件使う場合はandで繋げるよりネストした方が速い

Ifの条件節が2つだけでも多数でもAndよりネストのほうが早いんですか?
今まで勝手なイメージで条件のネストや繰り返しより1つのメソッドで済むものは済ませたほうが
早いのかと思っていたので勉強になりました、ありがとうございます。


182:デフォルトの名無しさん
07/10/12 03:33:27
おまえらVBA勉強してよかった事ある?

183:デフォルトの名無しさん
07/10/12 05:31:12
ないよ

184:exc
07/10/12 06:46:22
>>182
VBA楽しくて好きなんですけど仕事ではほとんど使ったことないですね。
データをリスト形式で並べておいてソート,フィルタ,ピボットテーブルレポ
ートでほぼ終わりです。
さびしい。もっと使いたい!
ビジネス用途でなんかおもしろい使い方ないですか?みなさん。



次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5013日前に更新/248 KB
担当:undef