Excel VBA質問スレ Part4at TECH
Excel VBA質問スレ Part4 - 暇つぶし2ch1:デフォルトの名無しさん
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

【方法②】
Dim myObj As New class


②はただ単に①を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楽しくて好きなんですけど仕事ではほとんど使ったことないですね。
データをリスト形式で並べておいてソート,フィルタ,ピボットテーブルレポ
ートでほぼ終わりです。
さびしい。もっと使いたい!
ビジネス用途でなんかおもしろい使い方ないですか?みなさん。


185:exc
07/10/12 07:10:41
私がVBAを仕事で利用した例

品質管理のため毎回5個ずつ抜取検査する商品があり,
測定データが次のような形式で入力されていた。

測定日  商品  値1 値2 値3 値4 値5
10/1 ABC 32 31 34 33 31
10/2 XYZ 45 47 43 42 45
10/3 ABC 35 32 34 31 31




測定値の度数分布を測定日別,商品別にピボットテーブル
レポートで集計したいがこのままの形式ではピボットテー
ブルレポートが使えない。
(続く)


186:exc
07/10/12 07:11:31
>>185の続き)
そのため
データをVBAで次のように整形した。
測定日  商品  測定番号  値 度数
10/1 ABC    1 32  1
10/1 ABC    2 31  1
10/1 ABC    3 34  1
10/1 ABC    4 33  1
10/1 ABC    5 31  1
10/2 XYZ    1 45  1



これで無事にピボットテーブルレポートが使えた。
以上。


187:デフォルトの名無しさん
07/10/12 07:19:21
>>184
個人用EXCEL活用法
スレリンク(bsoft板)l50


188:exc
07/10/12 08:07:15
>>187
ごめん。確かにこのスレッドの趣旨とは違うかも。
でも誘導先も…。

個人用EXCEL活用法
1 :名無しさん@そうだ選挙にいこう :2001/02/17(土) 16:11
実験結果をただグラフ化するが為にEXCELを購入しました。
今の時点ではそれ以外に使い道が無く、何だか勿体無いように感じます。
ところで皆さんは、仕事以外の日常生活に擱いてどのようにEXCELを活用していますか?


189:デフォルトの名無しさん
07/10/12 08:19:35
>>184
株とかFXでいいやん

190:デフォルトの名無しさん
07/10/12 08:33:47
>>188
で?

191:exc
07/10/12 08:37:44
>>190
僕も悪いけど>>187もあわて者だねってことです。
ごめんなさい。この話題やめましょう。さよなら。

192:デフォルトの名無しさん
07/10/12 09:24:30
> >>187もあわて者
そうでもない

193:デフォルトの名無しさん
07/10/12 14:33:53
VBAの練習をしています。
FormにTextBox×1、ComboBox×3を配置して、
TextBoxに名前を、ComboBoxにはそれぞれ生年・月・日を入力できるようにしました。
入力できますが、重複防止がまだできません。

生年月日の入力時に(Changeイベントで)、名前の重複を検索し、
重複があれば生年月日の重複検索をして、
そこでも重複があれば同一人物として入力不可にしようと思います。

重複の検索の仕方がわからないのですが、
御教示お願いします。


194:デフォルトの名無しさん
07/10/12 18:30:54
同姓同名、同生年月日の別人の存在に考慮しなくていなら
単純に検索すればいいだけじゃん
入力された名前か生年月日で検索して、一致が有ればもう一方も一致するかをチェック
両方一致なら重複扱い、もう一方が一致しなければFindNext

Find、FindNextの使い方はヘルプ見てね


195:193
07/10/12 18:52:20
>>194
ありがとうございます。
帰ったら早速やってみます。

196:デフォルトの名無しさん
07/10/12 20:11:23
>>186
どんなVBA書いたのか知らないけど
そういう整形はUNIONクエリ一行で出来てしまう


197:デフォルトの名無しさん
07/10/12 20:19:53
Excelで?

198:exc
07/10/12 20:48:03
>>196
ほんとだ!あの時は全然思いつかなかったからVBAでこつこつやっちゃった。
しかしますますVBA使う場面がなくなるな。


199:デフォルトの名無しさん
07/10/12 22:20:46
>>197
196じゃないけど、最近、
Accessなどを使わずに
Excelのリスト形式名前付き範囲に対して
ExcelからADO経由でクエリーを実行するのがマイブーム

一度クエリー発行の仕組みを作れば後が楽なので
条件が複雑になればなるほど便利。

というか普通の使い方だと思う。

200:デフォルトの名無しさん
07/10/13 03:52:50
これかな
URLリンク(www.amazon.co.jp)


201:デフォルトの名無しさん
07/10/15 13:02:49
Formを開いた時に常に最大表示になるようにしたいのですが
できません。
標準モジュールに

Sub auto_open()
 Application.DisplayFullScreen = true
UserForm1.Show
End Sub
としたのですが…

Application.DisplayFullScreen = true
の他に
Application.WindowState = xlMaximized
も試してみましたが駄目でした。

どこが間違っているのでしょうか?

202:exc
07/10/15 21:53:24
>>199
ぜひもっと詳しく教えて下さい。
参考になるサイトとかないですか。
>>200の本を読むといいのかな?


203:デフォルトの名無しさん
07/10/17 02:06:04
VBAでEXEファイルを作る方法がわかりません
どなたか教えてください

204:デフォルトの名無しさん
07/10/17 02:16:11
>>203
Open "hoge.exe" For Binary As #1

205:デフォルトの名無しさん
07/10/17 02:21:16
>>204
すみません・・・本当に初心者でどういうことかわかりません・・・・
ユーザーフォームの出力とかやってみたんですが.frmと.frxというファイルしか出てこなくて何をすればいいのかさっぱり

206:デフォルトの名無しさん
07/10/17 06:50:26
ネタじゃなしに、マジにEXEを作れると思ってんの?

207:デフォルトの名無しさん
07/10/17 08:46:51
Excel2003でスライダーコントロールを追加して操作できるようにしたいのですが
VB上でActiveSheet.OLEObjects.Add ClassType:="MSComctlLib.Slider.2"
としても、ツールバーから直接追加しても、スライダーが動かせません

デザインモードで形を変えたり位置を移動すると動かせるようになるのですが
プログラム上で同様の操作をしても動かせないときが多いです
おそらく標準以外のコントロールを使用しているためだと思うのですが
どうやったら安定して動かせるようになるでしょうか?

208:デフォルトの名無しさん
07/10/17 16:32:50
EXE作ることできないんですか?
ということは作ったプログラムを使うためにはいちいちエクセルを起動しなきゃいけないんですか・・・


209:デフォルトの名無しさん
07/10/17 16:39:43
なんか、VBとVBAを混同してる人な予感

210:デフォルトの名無しさん
07/10/17 17:05:58
>>110
すごい遅レスだけど、①はSet行で実際にNewされてオブジェクトが生成されるけど、
②はオブジェクトはその行では生成されないという違いがある。
つまりDimではnewされないってこと。

オブジェクトを10個作るつもりで
dim dic as new dictionary
for i = 1 to 10
 dim obj as new myclass
 dic.add key, obj
next
とやると実際にはobjは1個しかできないからね。

211:デフォルトの名無しさん
07/10/17 17:19:27
>>210
スゲェ。長年のモヤモヤが一気に晴れた

212:デフォルトの名無しさん
07/10/17 18:18:21
最後に質問していいでしょうか?
エクセルのVBAのフォームを使えば簡単にボタン配置などができて便利なんですがEXEファイルに変換
できないのであれば、やはりCなどで一からつくり直さなくてはいけないんでしょうか。また、VBを使えば
VBAで作ったフォームをEXEに変換できるのですか。

213:デフォルトの名無しさん
07/10/17 18:21:32
>>212
プログラムの互換性はあるけど
VBでエクセルを直接操作できるわけじゃないから
そんなこと考えるだけ無駄

214:デフォルトの名無しさん
07/10/17 18:33:00
>>213
ようするにVBAは悪魔でもエクセルの一機能で独立させることはできないということですね。
ありがとうございました

215:デフォルトの名無しさん
07/10/17 20:37:02
>>214

VBA は Visual Basic for Application の略 OK? ってもう見てないか w

216:デフォルトの名無しさん
07/10/17 21:44:29
Activesheet.Shape.Nodes(1)とかいろんなプロパティが載っているVBの本って無いですか?

ヘルプとネットで調べるのが効率悪くて。

217:デフォルトの名無しさん
07/10/17 22:08:22
>>210
というかそれは2回目以降のDimが無視されてるだけ
ともとれるね

218:デフォルトの名無しさん
07/10/17 22:16:50
>>208
WSHを勉強してみてごらん

219:デフォルトの名無しさん
07/10/17 22:20:22
>>213
>VBでエクセルを直接操作できるわけじゃないから

できるよ


220:デフォルトの名無しさん
07/10/17 22:21:44
>>216
ありますよ

221:216
07/10/17 23:03:56
>>200
知っているのがありましたら教えてください。

222:216
07/10/17 23:04:28
スマソ
>>220
知っているのがありましたら教えてください。

223:デフォルトの名無しさん
07/10/17 23:16:39
>200でいいんじゃね?

224:デフォルトの名無しさん
07/10/17 23:25:23
>>216
ヘルプをプリントアウトすればいんじゃね
自分なりに工夫して纏めて

225:デフォルトの名無しさん
07/10/18 04:09:55
Excel2002のVBAからOracleのストアドプロシージャ(PL/SQL)を呼び出したいのですが
呼び出し部分と戻り値の受け方のサンプルソースは無いでしょうか?
ODBC経由のSQLだと投げたきり返ってきませんが
PL/SQLだと1,2分で返って来るので、何とか使いたいのです。
よろしくお願いします><


226:デフォルトの名無しさん
07/10/18 09:08:29
>>217
いえ、Dimはあくまでも宣言文であって、最初のアクセス時に実際にNewされるんです。
Sub Foo()
  Dim obj as new myclass
Exit Sub
とすると、Newされません。
まぁこれを「無視されている」というならそのとおりですが・・・

227:デフォルトの名無しさん
07/10/18 11:24:06
dim文はCなどで言うところの「定義」ではなくて「宣言」ということだな

228:デフォルトの名無しさん
07/10/18 11:26:41
つか、今ヘルプ見たらちゃんと書かれてるじゃん
>New
>省略可能です。このキーワードを指定すると、オブジェクトを暗黙的に作成できます。
>オブジェクト変数を宣言するときにキーワード New を指定した場合は、オブジェクトを
>最初に参照したときにオブジェクトの新しいインスタンスが作成されるので、Set ステー
>トメントを使ってオブジェクトへの参照を代入する必要はありません。

229:デフォルトの名無しさん
07/10/18 12:55:48
やっぱりヘルプが一番だな。

230:デフォルトの名無しさん
07/10/18 13:51:26
うむ

231:デフォルトの名無しさん
07/10/18 15:09:52
とはいえ良い勉強になったな

232:デフォルトの名無しさん
07/10/18 18:54:28
Sub 今日の日付()
Cells(1, 2).Value = Date
ActiveSheet.Name = Format(Date, "yyyymmdd")
End Sub

このような感じでボタンをポチっと押すと、

・指定したセルに日付を入力
・現在のシート名を20071018というような名前にしています


これを1日に2回目が必要になったときに(データが重複する時)

・指定したセルに日付を入力
・その真下のセルに「2」というデータを入力
・現在のシート名を「20071018-2」というように通し番号を入力

したいです。

一日に3回目もたまに必要になりますが、
どのように行えばいいでしょうか?

233:デフォルトの名無しさん
07/10/18 19:54:00
Sub 今日の日付(ByVal SerNum As Long)
Cells(1, 2).Value = Date
Cells(2, 2).Value = SerNum
ActiveSheet.Name = Format(Date, "yyyymmdd") & "-" & Cstr(SerNum)
End Sub

234:デフォルトの名無しさん
07/10/18 20:34:37
ちょっと相談させてください。
レコードが数万、列がレコードによって可変(2~30くらい)のカンマ区切りのCSVファイルがあって、
その第一列目にだけ特定文字列の置換処理を、出来るだけ高速に行いたいのです。
とりあえず思いつくのは二次元配列に入れて置き換えてそのままCSVでまた書き出す、というもので

Sub csvRead()
'書き込みが長くなるので宣言は省略
' 配列の上限設定
LastCol = 0
Do Until ffile.AtEndOfStream
DataLine = Split(ffile.Readline, ",")
If LastCol < UBound(DataLine) Then LastCol = UBound(DataLine)
Loop
LastRow = ffile.Line - 1
ffile.Close
ReDim TmpData(LastRow, LastCol)

235:デフォルトの名無しさん
07/10/18 20:35:08
' 2次元配列に格納
Set ffile = fso.OpenTextFile(csvName, ForReading)
R = 0
Do Until ffile.AtEndOfStream
DataLine = Split(ffile.Readline, ",")
For C = 0 To UBound(DataLine)
TmpData(R, C) = DataLine(C)
Next
R = R + 1
Loop
ffile.Close
'以降TmpData(1~最後まで, 1)に対して置換、CSVを書き出し
End Sub

帰宅してしまってテストしていないのですが、
漠然とこんな感じかと思ったのですがもっと速く処理できる方法はありませんか?
CSVエディタや置換専門のフリーソフトが一番速いとは思うのですがそれはナシとさせてください。

236:232
07/10/18 20:46:01
>>233
「引数は省略できません」とエラーがでました。

詳しく状況を書くと、テンプレートのシートがあって、
それを同じブックにコピーします。
そのシート名を日付にしているので、

右のシート名が同じなら、YYYYMMDD-2となってほしいです。

237:デフォルトの名無しさん
07/10/18 23:20:51
すいません、質問があります。

AccessVBAで、エクセルVBAのマクロを使用したいのですが上手くいきません。
どちらも2003を使用しています。

アクセス側で「Application.Run "C:\○○.xls!マクロ名" 」と呼び出しているの
ですが、「マクロが見つかりません」とダイアログがでます。

マクロの指定方法が良くないのでしょうか?
最近始めた初心者で、しょうもない質問で申し訳ないです。


238:デフォルトの名無しさん
07/10/19 00:10:51
数万レコードのCSVに一列だけとはいえ置換をかけるならセル上でやるより
配列の中でやったほうが速いと思うが、配列からCSVへの保存ってのは時間かかりそうだ。
一発で出来る方法あったっけ、1区切りごとに書き出すことになるんじゃないかな。
かといってワークシートに貼り付けて保存すると文字列が""囲いになったりするし。

239:デフォルトの名無しさん
07/10/19 07:57:00
・CSVファイルを開くもしくは配列に格納
・置換
・CSVファイルに保存
それぞれのステップで最速になるようにすればいい。

第一のステップはセル上に開なら実は書式を文字列にしてテキストとして
普通に開くのが一番速く配列に格納してから開くのは2番目に速いが、
セル上に開かないで格納するだけなら多分大差ないと思う。置換は比較したことないけど多分配列の中でやるのが最速だろう。

問題は出力だが、二次元配列からCSVに保存ってどうするんだろうな。
列データごとにカンマを挟んでString変数に追記して1レコードずつ書き出して
.TXTで保存してから拡張子をCSVに変えれば""も付かないと思うが、これは遅そうだな。

240:デフォルトの名無しさん
07/10/19 08:06:11
> 二次元配列からCSVに保存ってどうするんだろうな

ADOかDAOってのが通例

241:デフォルトの名無しさん
07/10/19 11:38:16
>>237
呼び出し方が間違っている


242:デフォルトの名無しさん
07/10/19 12:06:34
ADOかDAOか、全然使ったことないからわからんな。

ただ>>234
FSOを使うより普通にOPENメソッド使った方が配列への格納時間は短くなる。

243:デフォルトの名無しさん
07/10/20 00:56:12
>>241
ネットでいろいろ調べてのですが、
呼び方はこれでは駄目なのでしょうか?

Dim objXL As New Excel.Application
Const f_Name = "C:\test1.xls"
Const m_Name = "test_mc" 'マクロ名


mc = objXL.Application.Run(f_Name & "!" & m_Name, "Sheet1")

マクロは標準モジュールにあります。

244:デフォルトの名無しさん
07/10/21 15:42:20
何故かVBEのツールボックスが選択できなくなってしまいました
(白抜きになっている)
どう対処したらよいでしょうか

245:デフォルトの名無しさん
07/10/22 17:08:17
一定の範囲内にある数値の中で、最大値を持つセルの行番号を求めたいのですが、
IF文を使って比較と代入を繰り返す(それまでの最大値より大きい値を持つセルの
場合に行番号をその都度更新していく)のではない方法はありますか?

246:デフォルトの名無しさん
07/10/22 17:11:36
>>245
RowとMAX組み合わせりゃ関数でできるだろ

247:デフォルトの名無しさん
07/10/22 17:17:30
worksheetfunction.max(range("a1:c5")) みたいな感じ

248:デフォルトの名無しさん
07/10/22 17:20:32
あ、行番号か。
range("a1:c5").find(worksheetfunction.max(range("a1:c5"))).row

249:245
07/10/22 17:35:53
>>246,247=248
即レスありがとうございます!

worksheetfunction.max(range("a1:c5")).row
あたりまでは何とかたどり着いていたんですけど、その先で行き詰まっていました…

おかげさまで解決できました!!!
ありがとうございました!!!!!

250:デフォルトの名無しさん
07/10/24 08:04:47
>>244
俺もなった
ついでにVBE上のIMEも死んだ
仕方がないのでExcel全部再起動

これで直った

251:デフォルトの名無しさん
07/10/25 14:34:47
Excel の質問なんですが、どこに訊けばよいかわからないので、
一旦ここでうかがいます。

環境:Windows XP、Excel 2000(両方とも日本語環境)

Excel の印刷中に出る「印刷中」ダイアログでは、
通常そのメッセージが以下のようになるため
それを想定してプログラムを作成しました。
 現在
 '[文書名.xls]' を
 [プリンタ名] on Nexx: で印刷中です。

ところが、あるユーザの環境で動かないため調べていたら
 現在
 '[文書名.xls]' を
 Nexx: の [プリンタ名] で印刷中です。

と表示されていました。
この3行目の表示が想定外であるためプログラムが動作しません。
これに対して個別対応は可能なのですが、
今後他のケースが出て来ないとも限りません。

そこで質問なのですが、
この「印刷中」ダイアログの表記を変更する方法があるのでしょうか?
方法等、ご存知の方いらっしゃいましたらよろしくお願いいたします。




252:デフォルトの名無しさん
07/10/25 15:54:21
>>251
何がしたいのか分からないけど、考え方自体に問題がある気が。

ダイアログを変えるのじゃなくて
ダイアログの文字列を取得できるのなら
取得文字列をうまく利用する方向で

application.ActivePrinter
でプリンタ名は取得できるわけだし
あとは正規表現使うなり、InStr使うなりでなんとかなる気が。

253:デフォルトの名無しさん
07/10/25 19:13:55
[VBA] Public 宣言された変数の有効期間
URLリンク(support.microsoft.com)

これ、知らんかった。。。

254:デフォルトの名無しさん
07/10/25 20:14:28
基本じゃね?

255:デフォルトの名無しさん
07/10/25 20:24:46
基本だったのか。。。

256:デフォルトの名無しさん
07/10/25 20:53:25
>>253

どのような状況でも変数の値を保持したい場合は、以下の方法を使用します。
? Excel の場合 非表示にしたワークシートに値を記述します。
? Word の場合 文書変数 (Variable オブジェクト) を利用します。
? PowerPoint の場合 非表示スライドなどに値を記述します。



そりゃそうだろうけどさ…


257:デフォルトの名無しさん
07/10/25 21:05:03
>原因
>この動作は、VBA の仕様に基づく制限です。

VBAのPublic変数はPublic変数ではないとゆうことだな

258:デフォルトの名無しさん
07/10/25 21:42:47
visual basicでも > 押して □ 押せば public変数だろうが消えるだろ
それのことだよ

259:デフォルトの名無しさん
07/10/25 22:01:26
>>257
ハズレ

Visual Basicで作ったアプリだって、アプリを一度終了して再度起動したら変数の値は保持されてないだろ
VBAの場合、「実行可能状態=編集可能状態」なので、実行後は編集可能状態にになるためアプリを一度終了してるのと同じ
まぁ大抵は「編集可能状態」では保持され「編集状態」になると破棄されるんだけどね
>>258も言ってるとおりで、IDE上の実行とかインタプリタ型マクロとか、編集可能な状態で実行されてるものは、ほとんどこういう仕様だよ

普通の実行ファイルとほぼ同じで、終了したら値は保持されない(保持が保証されない)けど
普通の実行ファイルと同じで、実行中は値が保持され、Public変数はPublic変数として正常に機能する
ただ、この「実行中」というのは当然ながら「VBAを含むシートを開いてる間」ではなく「マクロの実行中」なだけ
その辺解ってれば「VBAのPublic変数はPublic変数ではない」なんて勘違いは発生しない

260:デフォルトの名無しさん
07/10/25 22:45:31
>>253
むしろ終了後も値が残ってしまう可能性がある事を初めて知った。
毎回必ず初期化されるものだと思っているとハマリそう。

261:デフォルトの名無しさん
07/10/26 07:49:19
初期化は明示する癖をつけた方が良いってことだ

262:デフォルトの名無しさん
07/10/26 19:45:38
Public変数はグローバルな変数ではないとゆうことだな

263:デフォルトの名無しさん
07/10/26 21:39:05
また勘違いした奴が…

264:デフォルトの名無しさん
07/10/27 00:04:37
VBAの中から任意の範囲選択を促すダイアログを出すにはどうすればよいのでしょう?

グラフウィザードやPivotウィザードとかで範囲選択するときに出てくるアレです


265:デフォルトの名無しさん
07/10/27 00:41:39
InputBoxじゃね

266:デフォルトの名無しさん
07/10/27 06:20:26
はぁ?

267:デフォルトの名無しさん
07/10/27 07:00:41
Refedit

268:デフォルトの名無しさん
07/10/27 14:42:32
>>267
ありがとうございます
でも調べてみると色々問題ありそうですね
URLリンク(www.h3.dion.ne.jp)


269:デフォルトの名無しさん
07/10/27 16:09:03
すいません。
教えて頂きたいです。

学校の課題なのですが・・・
「三山崩し」をユーザーフォームを利用し、ゲームとして楽しめるようにしなさい。
と出ました。

どなたか作って下さいませんか?

お願いします。

270:デフォルトの名無しさん
07/10/27 16:54:43
>>269
まずはお前がどれ程の努力をしたのか見てからだ。
ここはプログラムを提供してもらう場じゃない。

271:デフォルトの名無しさん
07/10/27 18:14:28
それって四十八手の一種か?

272:257
07/10/27 18:23:43
>>269
Public変数は使うなよ


273:デフォルトの名無しさん
07/10/27 19:09:05
>教えて頂きたいです。

>どなたか作って下さいませんか?


わろす



274:デフォルトの名無しさん
07/10/27 19:24:30
学校の課題で、VBAにユーザーフォームか…
そういう時代なんだなあ。


275:デフォルトの名無しさん
07/10/27 19:29:57
俺Office持ってません

276:デフォルトの名無しさん
07/10/27 20:27:04
どうせ専学だろ

277:デフォルトの名無しさん
07/10/27 20:29:25
OpenOfficeのCalcのスクリプトの質問はここでいいですか?

278:デフォルトの名無しさん
07/10/27 21:59:02
当然ながらダメです

279:デフォルトの名無しさん
07/10/27 22:18:37
鼬害←最近読み方を覚えた

280:デフォルトの名無しさん
07/10/28 00:35:06
excelのvbaって何で使うんだろう?

281:デフォルトの名無しさん
07/10/28 01:46:49
日本語で(r

282:デフォルトの名無しさん
07/10/28 08:01:15
URLリンク(opentechpress.jp)

283:デフォルトの名無しさん
07/10/28 09:25:25
winXP excel2003

Sheets("").select
という文で、()の中に入れるシート名を、現在アクティブになっているシートを入れたいです。
どうすればいいでしょうか?
この文じゃなくてもアクティブシート名をセレクトできたら構わないです。

284:デフォルトの名無しさん
07/10/28 09:30:02
>>283
お前、自分では少しも調べてないだろ。
最低でも”アクティブシート 取得”ぐらいでググれよ、クズ。

285:デフォルトの名無しさん
07/10/28 09:34:47
>>283

dim sht as String
sht = ActiveSheet.Name
MsgBox sht


286:デフォルトの名無しさん
07/10/28 13:12:58
というかアクティブシートって既にセレクトされてないか?

287:デフォルトの名無しさん
07/10/28 13:17:11
simatta!
tsuridattanoka...

288:デフォルトの名無しさん
07/10/28 15:13:34
>>286
セレクトされてるよ
でもアクティブシートだけがセレクトされてるとは限らない

283がどう使うのかは解らないが、例えば複数シート選択状態から
非アクティブな選択シートを外してアクティブシートのみの選択にしたい場合は
ActiveSheet.Select
という処理を行う

通常は「アクティブシート=セレクトされてるシート」だが
こういった例外も想定出来るようにならないと良いプログラムは書けないぞ

289:デフォルトの名無しさん
07/10/28 15:56:31
>>288
まあ、この場合は元質問が
>この文じゃなくてもアクティブシート名をセレクトできたら構わないです。
だからアクティブシートはセレクトされていますでOKな気もするが。

ところで複数選択時の.Activateと.Selectでの
複数選択解除の挙動が
ActiveSheetに対する場合とActiveCellに対する場合で
逆なのはちょっと面白いと思った。

290:デフォルトの名無しさん
07/10/28 19:34:57
というか、ActiveとSelectを使用している時点で良いプログラムとは言えない

291:デフォルトの名無しさん
07/10/28 20:50:33
そうでもないか

292:デフォルトの名無しさん
07/10/29 02:14:30
Copy と Paste 多用してるけどw

293:sage
07/10/29 16:52:09
すいません。VBEditorについて聞きたいのですが・・。
プロジェクトウィンドウやプロパティウィンドウ、コードウィンドウを
分離させて使用していたものを初期状態(ドッキング状態)に戻すには
どうすればいいのでしょうか・・。


294:デフォルトの名無しさん
07/10/29 22:42:49
>>293
「プロパティ」とか「イミディエイト」とか表示されている
各ウィンドウのタイトルをダブルクリック。

295:デフォルトの名無しさん
07/10/30 10:17:17
VB6でいう、CommonDialogを実現するにはどうしたらいいのですか。

開発側
Windows XP Pro SP2
Office XP

利用者側
WindowsXP, 2000
Offece XP, 2003

開発側で作成したワークブックだけを利用者に渡して、設定とかせずにすぐに利用できるようにしたい。
ワークシート上のある範囲のセル値を、作業ファイルとしてcsvで一時的に保存場所を指定して保存させたい。
保存場所を指定して、作業ファイルを選択してワークシート上に読込ませたい。

といったものを考えています。

296:295
07/10/30 10:30:54
書き忘れ

諸般の事情でフォームは使わずに、ワークシート上のボタンにコマンドを割付ける。

フォームであればコントロールを追加すればいいんでしょうけど。

297:sage
07/10/30 11:21:35
>>294
アドバイスありがとうございます。
ダブルクリックでプロジェクトウィンドウとプロパティウィンドウは
ドッキングするのですが、コードウィンドウだけがドッキングしてくれません。
こういうものでしょうか?
ドッキングしたプロジェクトウィンドウとプロパティウィンドウがVBEの枠からはみ出るのが
気になるんですが・・


298:デフォルトの名無しさん
07/10/30 21:22:21
>>295
GetOpenFilename でサエコれ

299:デフォルトの名無しさん
07/10/30 22:37:44
特定のシート以外からは使用できないユーザー定義のワークシート関数は作れないの?

300:デフォルトの名無しさん
07/10/30 23:25:54
作れる

301:デフォルトの名無しさん
07/10/31 02:29:17
時刻の入ってるセルの値を「表示通りに」取得するにはどうすればよいのでしょうか。

セルに「12:00:00」って書いて.valueなり.formulaR1C1なりで読み出すと
勝手に0.5(だっけ?)になってしまって非常に困ります。
文字列の"12:00:00"として取得したいです。

書式を文字列するのは訳あってできません。

302:デフォルトの名無しさん
07/10/31 02:44:48
型変換関数って知ってるか?

303:デフォルトの名無しさん
07/10/31 02:48:53
Format(.Value, .NumberFormatLocal)

304:デフォルトの名無しさん
07/10/31 07:53:39
あれ?
.Textじゃダメなんだっけ?

305:デフォルトの名無しさん
07/10/31 08:53:50
>>303
こんなことやってる奴も居るんだなw

306:デフォルトの名無しさん
07/10/31 12:36:56
あれ?Textは「######」とか返してくるの知らないの?

307:デフォルトの名無しさん
07/10/31 12:49:11
それでも表示通り

308:デフォルトの名無しさん
07/10/31 13:02:53
画面表示と印刷の結果も違ったりするよね。

309:デフォルトの名無しさん
07/10/31 14:45:11
>>306
おぉ試したら確かに#が返ってきた
非表示だと""が返るのな
勉強になるな~

ついでに、[h]:mmのときでも
正しく取得できる方法をお願い

310:デフォルトの名無しさん
07/11/01 00:18:34
なにそのコンドームに穴があいてても避妊できる方法をお願いしてる感じw

311:デフォルトの名無しさん
07/11/01 00:32:27
図々しい教えて野郎ばっか来るのな

312:VBA初心者
07/11/01 16:23:19
シートdata2を変数Mywd2に代入しまたシートdata3を変数Mywd3に代入する。
その上でメッセージボックスにそれぞれのシートの名前を表示させる。

sub macro1()
 dim mywd2 as worksheet
 dim mywd3 as worksheet
 dim res1 as variant
 dim res2 as string

 set mywd2 = worksheets("data2")
 set mywd3 = worksheets("data3")
 msgbox mywd2.name
 msgbox mywd3.name

やってみたのですが、これで大丈夫でしょうか?

313:デフォルトの名無しさん
07/11/01 16:57:10
大丈夫って何が?

314:VBA初心者
07/11/01 17:09:46
>>313

合っていますか?

315:デフォルトの名無しさん
07/11/01 19:50:13
なんで聞く前に試さないの?

316:デフォルトの名無しさん
07/11/01 20:10:37
操作間違えると、PCが爆発するとでも思ってたり w

317:デフォルトの名無しさん
07/11/01 20:48:26
よく読め。
やってみたと書いてるじゃないか。

318:デフォルトの名無しさん
07/11/01 21:36:03
適切とは言えないが間違ってはいない
得に問題はないから、この先へは自分で行き着こう

そもそも>>312は条件に関係なく「最適とは言えない」と断定できるが
「なら何が最適か?」となるといろんな条件が関係してくるので
どういう条件で何がしたいのか(名前を表示するだけで終わりではないだろ)を
ほとんど書いてない状況では答えようも無いしね

まあ、後出しでいろいろ書かれてもウザいだけなので後は自分で頑張ろう

319:デフォルトの名無しさん
07/11/01 21:52:42
別に目的があるんじゃなくて単なる練習なんだろ
シート名決め打ちだったらわざわざ取得する意味無いw

320:デフォルトの名無しさん
07/11/01 23:01:46
ぜんぜん関係なくて悪いけど、
俺最近VBA触り始めたんだが意外となんでもできるのな。
馬鹿にしてて悪かった。

321:デフォルトの名無しさん
07/11/01 23:10:39
俺はむしろVBA無しの素のExcelを最近見直した
意外となんでもできるのな
VBA使いだすと歯止めが利かなくなってどんどんExcelを使う意味が薄くなる気がする

322:デフォルトの名無しさん
07/11/02 06:50:21
↑関数で出来ることをわざわざVBAでやってた俺だ w

323:デフォルトの名無しさん
07/11/02 09:16:48
関数とVBAと、どこでやめるか、みたいなところが難しいと思う。

自分で使うだけのブックならいいけど、後々引継いでもらうような奴だと特に。

324:デフォルトの名無しさん
07/11/02 11:07:01
2003エクセル 使ってます。
同じ作業の繰り返しを頼まれて困ってます。

  02375290   のようにあらかじめ入力してあるせるセルに
 ↑ ↑
TKDME D と入力したいですがマクロでできますか?

これをコピペで永遠にやっています。
VBA神さま助けて下さい。

325:デフォルトの名無しさん
07/11/02 11:10:28
うわ、行がずれてた。
文頭にTKDME  
0237★5290 ★にDと入れたいという意味です。


326:デフォルトの名無しさん
07/11/02 11:11:38
変換前の文字列と、変換後の文字列を、スペースを考慮して正確に書け。
変換に複数のルールがあるなら、それも書いとけ。

327:デフォルトの名無しさん
07/11/02 11:15:24
対象のセル範囲を選択して、次のマクロを実行。
Sub foo()
Dim c As Range
For Each c In Selection
c.Value = "TKDME" & Left$(c.Value, 4) & "D" & Right$(c.Value, 4)
Next
End Sub

328:デフォルトの名無しさん
07/11/02 11:21:34
>>326本当にごめんなさい、マクロは本で読んだことしかないのですが
繰り返し作業ができると書いてあったので自力で調べましたがうまく
いかなかったです。

変換前  02375290 
変換後  TKDME0237D5290 

です。

>>327 ありがとうございます。一度やってみます。!!


329:デフォルトの名無しさん
07/11/02 11:25:11
>>327
できました。ありがとうございました。
昼までに作業が終わりそうです。

330:デフォルトの名無しさん
07/11/02 11:57:42
それこそVBAじゃなくてワークシート関数で出来るだろ・・・

331:デフォルトの名無しさん
07/11/02 12:16:48
あっ「EXCELは得意です 自分なんでもできますよ」と、経歴詐称して
高単価で潜り込んだ前職テレアポの派遣社員のような気がする。

332:デフォルトの名無しさん
07/11/02 12:28:17
="TKDME"&LEFT(A1,4)&"D"&RIGHT(A1,4)
こうかな
これくらいならこっちのほうが楽だけど普通はマクロでやるわな

333:デフォルトの名無しさん
07/11/02 12:44:43
VBAをマクロの区別が付いてなさそうなやつが「普通」とか言ってもなぁ

334:デフォルトの名無しさん
07/11/02 12:58:44
普通は”マクロ”でやるよ

335:デフォルトの名無しさん
07/11/02 13:13:24
今時の流れだと、極力シート関数を使うほうがOpenOfficeでも使えていいと思うが。
# しかし、:,; の扱いが違っているからたまにめんどくさい……

336:デフォルトの名無しさん
07/11/02 13:21:21
ワークシート関数だと、>>327と同じことはできないわけだが。

337:デフォルトの名無しさん
07/11/02 13:26:13
具体的に何が出来ない?
んな再利用もしにくいしょうもないコードをいちいちVBAで記述しろ、と?
ワークシート関数で出来ることはワークシート関数でやるのがEXCELの基本でしょ
ただ単に「おれって出来るんだぜ~」みたいな痛い自慢をしたいならともかく、生産性に
大きな違いがないなら、汎用性やオペレーションに気を使うのが「普通」の会社人ってもんでそ

338:デフォルトの名無しさん
07/11/02 13:57:25
>>327
A1:B10に文字列が設定されてたとして、ワークシート関数だとどう操作するのさ?

339:デフォルトの名無しさん
07/11/02 13:58:02
>>337の間違い。

340:デフォルトの名無しさん
07/11/02 14:04:20
ワークシート関数の方が「いちいち」感があるのは俺だけか?
それとも、何か痕跡を残さず実行できる、アクロバティックな方法があるのだろうか。

341:デフォルトの名無しさん
07/11/02 14:15:26
>>337
普通に考えて、そのセル自身をワークシート関数の結果で置き換えることが、1stepではできない。

342:デフォルトの名無しさん
07/11/02 14:23:29
>338
C1にワークシート関数打ち込んでD10までコピペしろよ

>>341
だからな、毎回やるオペレーションなら、んなしょうもないコードじゃなくて、
ユーザー定義関数を作るとか、VBSだし、そもそも1回こっきりなら一番速いのは
正規表現使えるエディタで置換だ
んで、定常オペレーションでも単なるテキストオペレーションなら、そこはEXCELにこだわらずに、
VBSでD&Dとか考えるべき
VBAに妄執を抱いて他の選択肢が頭にない時点で、おみゃあはセンスが欠如しとる

343:デフォルトの名無しさん
07/11/02 14:29:56
ちと推敲足らずに意味不明のくだりがあった スマソ


344:デフォルトの名無しさん
07/11/02 14:50:08
>>342
> >338
> C1にワークシート関数打ち込んでD10までコピペしろよ

それだと>>327とは違う結果になるよね。

> >>341
> だからな、毎回やるオペレーションなら、んなしょうもないコードじゃなくて、
> ユーザー定義関数を作るとか、VBSだし、そもそも1回こっきりなら一番速いのは
> 正規表現使えるエディタで置換だ
> んで、定常オペレーションでも単なるテキストオペレーションなら、そこはEXCELにこだわらずに、
> VBSでD&Dとか考えるべき
> VBAに妄執を抱いて他の選択肢が頭にない時点で、おみゃあはセンスが欠如しとる

どう考えても、327みたいなかき捨てのVBAマクロを書いた方が早いし簡単。

345:デフォルトの名無しさん
07/11/02 14:54:29
>>327程度のマクロが、何かこいつの劣等感を刺激したんだろうか

346:デフォルトの名無しさん
07/11/02 15:39:33
あかんな
VBAとマクロの区別が曖昧なバカに何を言っても無駄だとはよく分かった

347:デフォルトの名無しさん
07/11/02 16:32:41
「おれって出来るんだぜ~」みたいな痛い自慢をしたいのは、>>337=342のように見えるのだが。

348:デフォルトの名無しさん
07/11/02 16:40:32
>>337=346だとしたら痛い

349:デフォルトの名無しさん
07/11/02 17:14:48
>>337
使い捨てマクロは全否定ですか、そうですか。
一行野郎も全否定なんでしょうね。

350:デフォルトの名無しさん
07/11/02 17:25:03
VBAとマクロって区別するようなものではないだろ

351:デフォルトの名無しさん
07/11/02 17:31:52
だって同じ定義だもん

352:デフォルトの名無しさん
07/11/02 17:42:03
VBAは言語の種類。マクロは、それで書いたプログラム。
Excel4のもマクロです。(使う人はもういないだろうけど)

353:デフォルトの名無しさん
07/11/02 17:54:26
>>323も書いてるけど
自分だけが使うようなものじゃないなら、極力VBAを使わない覚悟が必要だよね。
なんでもできるもん!系統の駄目な子って、まずドキュメントを残そうとしないし。

354:デフォルトの名無しさん
07/11/02 18:11:11
シート関数を駆使したセルを置いておく香具師も、必ずしもドキュメントを残さないがな。

355:デフォルトの名無しさん
07/11/02 18:37:29
子供の言い訳みたいなこと書かないで良いから

な?

356:デフォルトの名無しさん
07/11/02 21:22:24
今回のケースは、どう見てもマクロの方が楽だし目的にも合ってる。
何で粘着するのかわからん。

357:デフォルトの名無しさん
07/11/02 21:43:03
どうでもいいけど、ごたくは>>327と同等のことをワークシート関数で書いてから言え

358:デフォルトの名無しさん
07/11/02 21:49:01
Unix文化に触れたら、文句言いまくりそうだなw

359:デフォルトの名無しさん
07/11/02 22:00:53
うわ!どう見てもテキストエディタで置換するだけで済む話をまだ引っ張ってるよw

間抜けすぎだよ>>356


360:デフォルトの名無しさん
07/11/02 22:04:04
なんで粘着してんだこいつ

361:デフォルトの名無しさん
07/11/02 22:06:33
>>359
お前はそれで一生やってればいいさ

362:デフォルトの名無しさん
07/11/02 22:08:10
エディタ使うくらいだったら、ワークシート関数の方がまだましだな。

363:デフォルトの名無しさん
07/11/02 22:10:58
まさかマクロに劣等感もたれるとは思わなかった。

364:デフォルトの名無しさん
07/11/02 22:12:48
連投するほど悔しがらなくても良いんだぞぉ
悔しがるのは「マクロマクロ」連呼しちゃう自分の間抜けさに対してになー
一つのことにこだわるのは正しいように見えるけど、他の選択肢を考えられない時点で脳が硬化してる

自覚できてよかったな(^ω^)

365:デフォルトの名無しさん
07/11/02 22:23:35
かわいそうだな書くのに1分もかからないようなマクロ見て
怯えてるなんて

366:デフォルトの名無しさん
07/11/02 23:32:48
>>364
ふつー、最も簡単な解決法を示せば、それで終わりだろ。
で、それがマクロだったと。

367:デフォルトの名無しさん
07/11/02 23:33:36
>>364
>>357

368:デフォルトの名無しさん
07/11/02 23:40:02
もう勝ち逃げさせてやろうぜ。
相手にしても利益なし。

369:デフォルトの名無しさん
07/11/02 23:41:51
VBAの唯一の利点はエクセルのインストールされてないPCなんてほとんどないことぐらいか。
出先でも他人のPCでもとりあえずなんとかできるのはけっこう助かる。

370:デフォルトの名無しさん
07/11/02 23:45:42
シート上のセルの値を変更したいんだろ?
VBAマクロがベストマッチというのに異論が出るのが不思議。

371:デフォルトの名無しさん
07/11/02 23:51:59
多分>>321がファビョってたんだと思うけど、ワークシート関数じゃ>>327みたいなことはできませんからwww

372:デフォルトの名無しさん
07/11/03 00:28:04
自分>>321だけど騒いでたのは他の人だよ
別に>>321はマクロを使うことを否定するつもりで書いたんじゃないし、
この場合マクロを使ったほうが適切だと思う
俺はVBA使ってるとつい VB+出力(たまたまそれがExcelだっただけ)
みたいにしたくなってしまうので、なんとかしないといけないなあと思っただけ

373:デフォルトの名無しさん
07/11/03 00:31:38
×出力 ○入出力
どうでもいいけど一応

374:デフォルトの名無しさん
07/11/03 00:31:46
正直スマンかった。

375:デフォルトの名無しさん
07/11/03 01:42:06
1文字変数使うやつは駄目

376:デフォルトの名無しさん
07/11/03 02:47:50
>>375
悔しいのはわかるがそんな短絡的なことでどうする?

377:375
07/11/03 02:56:53
いや、残念ながら君の想定する人物と俺は違う
また無差別認定か
前々から同じこと書いてるだろに
馬鹿なやつだな
自分から心に余裕のないのを晒してどうするのさ
ま、それは置いてとにかく1文字変数はやめろ

コーディング規約を考えていない
それがVBA系にゴロゴロいる駄目なやつの共通点だ


378:デフォルトの名無しさん
07/11/03 03:00:09
目的はコーディングじゃないから仕方ないだろ。

うごけばいい

規約なんて勉強しなくても

うごけばいい

379:デフォルトの名無しさん
07/11/03 03:04:53
iも駄目かね

380:デフォルトの名無しさん
07/11/03 03:11:00
悔し紛れのがまだましで
なんの脈略もなく一文字変数はだめだって
それだけって単なるあほだろ

381:デフォルトの名無しさん
07/11/03 05:47:01
ifのあとのthenは無駄だよな


382:デフォルトの名無しさん
07/11/03 07:35:52
A1表記を使わないというコーディング規約を定めたがColumnsで断念したことあるにょ!

383:デフォルトの名無しさん
07/11/03 08:07:54
一文字変数は後から読む側にとっては大変だ
定義しないでVariantで頻繁に使われてるとさらに困難

384:デフォルトの名無しさん
07/11/03 08:51:37
>>379
ループ変数でも、
実際にはループ自体に添字とか何らかの意味はあるはずだから
そちらを使うほうが分かりやすい。

For文内で汎用ループ変数として使うのはさほど問題ない気もするが
最近はExcelでもIntegerで足りない事が結構ある。とはいえ
Dim i as Long は駄目だな。あくまでInteger限定。

「i」にも、「ただのループ変数だよ。使い捨てだから後から参照しないよ」
程度の暗黙の了解はあるけれど、
型と同様、通じない人(というか無視して組む人)もいるのでお薦めはしない。

385:デフォルトの名無しさん
07/11/03 08:52:48
>>382
それっぽっちのことで断念するのかよ
全然問題にもならないと思うが

386:デフォルトの名無しさん
07/11/03 13:17:42
>>381

それ考えると、UNIXのシェルスクリプトは医大だよな。

ifの終りはendifじゃなくてfiだよ。

387:デフォルトの名無しさん
07/11/03 14:52:09
>>386
UNIX のシェルスクリプトといえば
[ と ] が演算子だと知ったときに感動しました


388:デフォルトの名無しさん
07/11/03 14:52:57
>>387
演算子じゃなくてコマンドだよ


389:デフォルトの名無しさん
07/11/03 15:18:11
>>385
どうやって回避するの?
Columns("A:C")って記法は固定みたいなんだけど

390:デフォルトの名無しさん
07/11/03 15:28:54
Columns使わなきゃならんの?

391:デフォルトの名無しさん
07/11/03 15:40:41
>>390
n列おきにセル幅を設定するって部分があって
chrでASCIIコードに増分与えようかと思ったけど、可読性が極度に落ちるのと、
どうせ再利用する機会が多いんで、結局10進to26進関数を組んで回避したことがあったんだ

392:デフォルトの名無しさん
07/11/03 17:58:02
URLリンク(www.ne.jp)

393:デフォルトの名無しさん
07/11/03 18:00:52
Columns("A:C").Hogehoge()



Dim r As Range
Set r = Union(Columns(1), Columns(2), Columns(3))
r.Hogehoge()

だそうな

394:デフォルトの名無しさん
07/11/03 18:07:50
可読性はようわからん

Dim r As Range
Dim i As Integer
Set r = Columns(2)
For i = 5 To 14 Step 3
Set r = Union(r, Columns(i))
Next
r.Select
With Selection.Interior
.ColorIndex = 40
.Pattern = xlSolid
End With


395:デフォルトの名無しさん
07/11/03 18:13:57
>>392-394

>>382 == >>391 じゃないけど
ひとつ賢くなったような気がする
ありがとう


396:デフォルトの名無しさん
07/11/03 18:15:31
Unionは知らなかった
勉強になった
サンクス!

397:デフォルトの名無しさん
07/11/03 18:23:30
>>392
こんなんあったのか

  Dim I As Integer
  For I = 1 To Rng.Areas.Count
      Rng.Areas(I).Value = I
  Next I

なんか便利そう


398:デフォルトの名無しさん
07/11/03 18:27:46
変態的解決法もあるね

4列おきに2列の操作するとか

With ThisWorkBook.Worksheet(1)
For intClm=1 To 16 Step 4
Set rngBuf = .range(.cells(1,intClm),.cells(65536,intClm+1))
'(処理を記述)
Set rngBuf=Nothing
Next
End With

399:デフォルトの名無しさん
07/11/03 18:37:06
俺メモ

Sub hoge()
Dim r As Range
Dim i, j, k As Integer
k = 0
For i = 2 To 8 Step 2
For j = 3 To 9 Step 3
If k = 0 Then
Set r = Cells(i, j)
k = 1
Else
Set r = Union(r, Cells(i, j))
End If
Next
Next
r.Select
For i = 1 To r.Areas.Count
For j = 1 To r.Areas(i).Areas.Count
r.Areas(i).Areas(j).Value = CLng(i - 1) * r.Areas(i).Areas.Count + CLng(j - 1)
Next
Next
End Sub


400:デフォルトの名無しさん
07/11/03 18:39:30
400

401:デフォルトの名無しさん
07/11/06 14:12:24
ExecuteExcel4Macroを使うことで、Bookを開かずに値を取得することは出来ました。
Bookを開かずに書き込む方法がわかりません。
何かヒントでもあればよろしくお願いします。


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