[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 05/06 20:10 / Filesize : 248 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Excel VBA質問スレ Part4



1 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 09:03:22 ]

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

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

前スレ
pc11.2ch.net/test/read.cgi/tech/1180192018/


2 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 09:03:38 ]

・過去スレ

01 pc11.2ch.net/test/read.cgi/tech/1054356121/
02 pc11.2ch.net/test/read.cgi/tech/1168308855/
03 pc11.2ch.net/test/read.cgi/tech/1180192018/


4 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 07:04:47 ]


5 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 23:06:44 ]
cells.offset

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



8 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 23:15:55 ]
>>5 条件付き書式でダメなのか?

9 名前:5 mailto:sage [2007/09/18(火) 23:15:56 ]
>>6.
offsetが目的に使えそうです。
有難うございます。

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


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




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

12 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 21:50:24 ]
>>11
可能だけど>>2★3★4

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

14 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 20:25:27 ]
ツッコミどころが多すぎてどこから突っ込んで良いものやら・・・

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

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

こうしろ



16 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 20:33:44 ]
上のコードで動くのか。。。

17 名前:前スレ984 mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 23:39:49 ]
あのねぇ・・・Valueにリストを入れるなよ・・・

19 名前:14 mailto:sage [2007/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 名前:デフォルトの名無しさん [2007/09/21(金) 20:32:14 ]
application.workbooks(BookName).worksheets(SheetName)



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

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

下記のように

a
--
b
--
c
--
d

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

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

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

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


22 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 12:00:22 ]
可能
range
For each

23 名前:21 mailto:sage [2007/09/22(土) 14:23:27 ]
22さんありがとうございます。

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

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

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

25 名前:21 mailto:sage [2007/09/22(土) 15:24:48 ]
>>24さん

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

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

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

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

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

28 名前:21 mailto:sage [2007/09/22(土) 16:19:33 ]
すいません、↑間違えました
>>26さんでした(^^;)

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

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

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

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



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

32 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 17:16:20 ]
ちょっと待て、実は24も分かってないとか。

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

34 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 18:18:59 ]
For Eachが理解できないやつにExcel VBAを教えるのも無理な話

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

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

36 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 20:02:44 ]
自演乙

37 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 20:54:31 ]
いや冷たいのは事実

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

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

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

40 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 21:24:50 ]
クレクレが必死だな



41 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 00:36:16 ]
ヒント:dim文が3行set文2行コード3行でできる

42 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 00:53:27 ]
ハズレ

43 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 05:45:25 ]
美しい美しくない以前に・・・・・

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

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

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

48 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 11:23:57 ]
Excel2000で、officeのクリップボードではなくWindowsのクリップボードに変数の値をコピーする方法を教えてください

50 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 13:17:15 ]
>>49
DataObject使うかWin32API使え

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



51 名前:デフォルトの名無しさん [2007/09/23(日) 13:36:33 ]
〉〉48

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

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

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



52 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 13:38:32 ]
そして誤字 脱字orz

53 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 14:18:24 ]
誰か罵倒しているのか?

54 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 20:40:34 ]
>>54
考え自体は肯定も否定もしないがそのレスは何なのw
そう思ってたからみんなスルーしてただけだろ。

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

56 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 21:36:01 ]
>>55
まぁここはExcel VBA雑談スレだからなぁ

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

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

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

58 名前:デフォルトの名無しさん [2007/09/24(月) 14:13:20 ]
OS:winxp2
ver:2003

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

59 名前:58 [2007/09/24(月) 14:14:27 ]
× 初期値を格納したのですが、・・・



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

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



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


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

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

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

65 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん [2007/09/25(火) 00:44:51 ]
VBみたいにuserformにメニューバーて追加できますか?
ツールバーなら出来るみたいだけど。
メニューエディタは見当たらないし仕様上無理ですか?

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

68 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 02:09:59 ]
>>66
無理
ただしOCX自作するならその限りではない

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

70 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん [2007/09/25(火) 20:54:34 ]
3番目はそれで特定できるけど
下はSheet1.Cells(1,1)じゃないとダメってことだろ
Sheet1.Activateすれば下でも通るでしょ

72 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん [2007/09/25(火) 21:28:21 ]
とりあえずじゃないだろ

74 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 23:25:51 ]
65はアホ?

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

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


77 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 19:53:46 ]
SelectionChangeイベントでそれなりには作れる

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

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

80 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 22:01:53 ]
ヘルプ嫁



81 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 22:17:02 ]
そこでgotoですぜ。旦那w

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

84 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 23:40:49 ]
>>81
Continueは?

85 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 00:12:17 ]
if not 〜 end if

86 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 00:34:22 ]
>>79
CommandButton1だったら

CommandButton1.BottomRightCell.Address

とか

87 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 07:15:14 ]
Cells(1, 1)

89 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 12:29:11 ]
あたりまえ



91 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん [2007/09/27(木) 23:09:36 ]
>>86
回答ありがとうございます。
やっと調査できるきっかけができました。

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

94 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 08:25:32 ]
>>93
普通に

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

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

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

97 名前:96 mailto:sage [2007/09/29(土) 21:23:05 ]
検索ワード変えたら見つかりました、すんまそん>Run

98 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 21:37:58 ]
偉そうな弁舌はオブジェクト構造を理解してからにしな

102 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 02:18:31 ]
今日の日付で保存したいのですが・・・
1001.xls みたいに

103 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 04:30:07 ]
そんぐらいググレカス

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

105 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 08:18:00 ]
>>101

106 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 09:42:52 ]
糞VBAなんて偉いやつは使わん、いいかげんに使えるから良いのさ

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

108 名前:107 mailto:sage [2007/10/03(水) 10:27:19 ]
OSは2000でExcel2002です、連投すいません

109 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 11:17:43 ]
>>108
Excel コントロール配列
でググってみ

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

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

【方法A】
Dim myObj As New class


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



111 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 05:46:41 ]
>>110
オブジェクト指向を勉強してくれ

113 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 08:21:51 ]
>>109
出来ました、ありがとうございます

114 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 15:43:42 ]
今のエクセルは>>111で動くほどおばかさんにもやさしいのか

116 名前:デフォルトの名無しさん [2007/10/04(木) 15:44:12 ]
>>112
今勉強中

117 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 21:26:51 ]
>>110
機能的には同じ。

118 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 21:38:34 ]
ハズレ

119 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 22:06:03 ]
とりあえず
Set dataFolder = FSO.GetFolder(pathName)




121 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 00:26:22 ]
分かると思うけど後半3行は単なるコピペミスなので気にしないこと

123 名前:110 [2007/10/05(金) 02:47:11 ]
>>121
なるほど!さんくすです!勉強になりました!

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

125 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 10:55:49 ]
失敗から学べることは多いが
性交から学べることは何一つない

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

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

127 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 00:30:12 ]
半可通が朝っぱらから何を語ってんだか

128 名前:デフォルトの名無しさん [2007/10/06(土) 07:12:43 ]
能書きスレ

129 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 15:16:25 ]
>>114
とても勉強になりました。ありがとうございます

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



131 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 19:58:00 ]
んなーこたーない

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

133 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 20:29:30 ]
そうなん?でもnothingしないと解放してくれないときもあるぞ

134 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 20:40:38 ]
>>133
例をあげてみてよ

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


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

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

137 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/10/07(日) 15:23:10 ]
これはひどい

139 名前:デフォルトの名無しさん [2007/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 mailto:sage [2007/10/07(日) 16:04:40 ]
>他の列は空白でかまいません。時間さえ一秒ごとに埋まってくれれば…。 ×
他のセルは空白でかまいません。時間さえ一秒ごとに埋まってくれれば…。○

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



141 名前:デフォルトの名無しさん mailto:sage [2007/10/07(日) 17:12:34 ]
>>137
範囲は文字通りrange

>>138
黙ってろ

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

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

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

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

こんでいいはず

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

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

146 名前:137 [2007/10/07(日) 21:13:17 ]
>>141
レスありがとう御座います。

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

147 名前:デフォルトの名無しさん mailto:sage [2007/10/07(日) 21:57:20 ]
このスレをRangeで検索

148 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん [2007/10/08(月) 08:56:22 ]
Excelのセルにコマンドボタンを貼り付けたセルをコピーしたときに
コマンドボタンをも貼り付けるにはどうすればいいのでしょうか?
動的にコマンドボタンを作成する方法でもいいのですが・・・

150 名前:デフォルトの名無しさん mailto:sage [2007/10/08(月) 09:12:41 ]
君は調べるって事がそんなに嫌いなのか?

www.google.co.jp/search?num=100&hl=ja&q=%E5%8B%95%E7%9A%84%E3%81%AB%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95&lr=lang_ja



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

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

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

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

153 名前:デフォルトの名無しさん mailto:sage [2007/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 [2007/10/08(月) 12:38:42 ]
>>144さん
パート2で、10秒おきに行を挿入するマクロを
書いていただいた方ですか?あの時は、ホント助かりました。
先月までバリバリ使ってました。ありがとうございました。

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

教えて君ですみません。


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

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

156 名前:デフォルトの名無しさん mailto:sage [2007/10/08(月) 23:32:55 ]
もうやだ・・・

157 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/10/09(火) 19:35:21 ]
列に書かれた文字を、1度出てきたら他を除いて
ListboxのListに書き出す書き方ってどうするんですか?
   あああ         あああ
   いいい         いいい
   えええ  −−−> えええ
   あああ         おおお
   いいい
   おおお
なかなか、うまく除けないです。

159 名前:デフォルトの名無しさん mailto:sage [2007/10/09(火) 19:40:53 ]
collectionでも使え

160 名前:デフォルトの名無しさん mailto:sage [2007/10/09(火) 19:54:28 ]
Select Distinctでも使え



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

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

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

164 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 03:33:51 ]
可能です

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

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


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

168 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 09:32:29 ]
グラフやPivotウィザードの作るマクロは意味不明


169 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 09:37:25 ]
>>163
SpecialCells

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




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

172 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 20:43:45 ]
エクセルだと

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

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


173 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 22:21:36 ]
hippos-lab.com/blog/node/115

174 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 22:22:34 ]
わーどうしようもない

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


176 名前:デフォルトの名無しさん mailto:sage [2007/10/11(木) 02:55:31 ]
>>169
ありがとうございます

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

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

sub sample()
start:
dim i as integer

178 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/10/11(木) 20:16:41 ]
>>177

TypeName関数

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

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

ttp://officetanaka.net/excel/vba/speed/s11.htm
のように配列使った検索はFindメソッドより遙かに早いくらいなんで、
速度求めるなら組み込みメソッドに拘るなんてバカらしい



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

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


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

183 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 05:31:12 ]
ないよ

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


185 名前:exc [2007/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 [2007/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 名前:デフォルトの名無しさん [2007/10/12(金) 07:19:21 ]
>>184
個人用EXCEL活用法
pc11.2ch.net/test/read.cgi/bsoft/982393911/l50


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

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


189 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 08:19:35 ]
>>184
株とかFXでいいやん

190 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 08:33:47 ]
>>188
で?



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

192 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 09:24:30 ]
> >>187もあわて者
そうでもない

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

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

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


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

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


195 名前:193 [2007/10/12(金) 18:52:20 ]
>>194
ありがとうございます。
帰ったら早速やってみます。

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


197 名前:デフォルトの名無しさん mailto:sage [2007/10/12(金) 20:19:53 ]
Excelで?

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


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

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

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

200 名前:デフォルトの名無しさん mailto:sage [2007/10/13(土) 03:52:50 ]
これかな
www.amazon.co.jp/products/dp/4774122513/




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

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

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

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

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


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

204 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 02:16:11 ]
>>203
Open "hoge.exe" For Binary As #1

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

206 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 06:50:26 ]
ネタじゃなしに、マジにEXEを作れると思ってんの?

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

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

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


209 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 16:39:43 ]
なんか、VBとVBAを混同してる人な予感

210 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 17:05:58 ]
>>110
すごい遅レスだけど、@はSet行で実際にNewされてオブジェクトが生成されるけど、
Aはオブジェクトはその行では生成されないという違いがある。
つまり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 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 17:19:27 ]
>>210
スゲェ。長年のモヤモヤが一気に晴れた

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

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

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

215 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 20:37:02 ]
>>214

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

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

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

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

218 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 22:16:50 ]
>>208
WSHを勉強してみてごらん

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

できるよ


220 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 22:21:44 ]
>>216
ありますよ



221 名前:216 [2007/10/17(水) 23:03:56 ]
>>200
知っているのがありましたら教えてください。

222 名前:216 [2007/10/17(水) 23:04:28 ]
スマソ
>>220
知っているのがありましたら教えてください。

223 名前:デフォルトの名無しさん [2007/10/17(水) 23:16:39 ]
>200でいいんじゃね?

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

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


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

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

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

229 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 12:55:48 ]
やっぱりヘルプが一番だな。

230 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 13:51:26 ]
うむ



231 名前:デフォルトの名無しさん [2007/10/18(木) 15:09:52 ]
とはいえ良い勉強になったな

232 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 mailto:sage [2007/10/18(木) 20:46:01 ]
>>233
「引数は省略できません」とエラーがでました。

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

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

237 名前:デフォルトの名無しさん [2007/10/18(木) 23:20:51 ]
すいません、質問があります。

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

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

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


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

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

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

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

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

ADOかDAOってのが通例



241 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 11:38:16 ]
>>237
呼び出し方が間違っている


242 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 12:06:34 ]
ADOかDAOか、全然使ったことないからわからんな。

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

243 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 15:42:20 ]
何故かVBEのツールボックスが選択できなくなってしまいました
(白抜きになっている)
どう対処したらよいでしょうか

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

246 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 17:11:36 ]
>>245
RowとMAX組み合わせりゃ関数でできるだろ

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

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

249 名前:245 mailto:sage [2007/10/22(月) 17:35:53 ]
>>246,247=248
即レスありがとうございます!

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

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

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

これで直った



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

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

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

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

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

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




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

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

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

253 名前:デフォルトの名無しさん [2007/10/25(木) 19:13:55 ]
[VBA] Public 宣言された変数の有効期間
ttp://support.microsoft.com/kb/408871/ja

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

254 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 20:14:28 ]
基本じゃね?

255 名前:デフォルトの名無しさん [2007/10/25(木) 20:24:46 ]
基本だったのか。。。

256 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 20:53:25 ]
>>253

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



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


257 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 21:05:03 ]
>原因
>この動作は、VBA の仕様に基づく制限です。

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

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

259 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 22:01:26 ]
>>257
ハズレ

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

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

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



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

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

263 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 21:39:05 ]
また勘違いした奴が…

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

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


265 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 00:41:39 ]
InputBoxじゃね

266 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 06:20:26 ]
はぁ?

267 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 07:00:41 ]
Refedit

268 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 14:42:32 ]
>>267
ありがとうございます
でも調べてみると色々問題ありそうですね
ttp://www.h3.dion.ne.jp/~sakatsu/Excel_Tips08.htm


269 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 16:09:03 ]
すいません。
教えて頂きたいです。

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

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

お願いします。

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



271 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 18:14:28 ]
それって四十八手の一種か?

272 名前:257 [2007/10/27(土) 18:23:43 ]
>>269
Public変数は使うなよ


273 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 19:09:05 ]
>教えて頂きたいです。

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


わろす



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


275 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 19:29:57 ]
俺Office持ってません

276 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 20:27:04 ]
どうせ専学だろ

277 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 20:29:25 ]
OpenOfficeのCalcのスクリプトの質問はここでいいですか?

278 名前:デフォルトの名無しさん mailto:sage [2007/10/27(土) 21:59:02 ]
当然ながらダメです

279 名前:デフォルトの名無しさん [2007/10/27(土) 22:18:37 ]
鼬害←最近読み方を覚えた

280 名前:デフォルトの名無しさん [2007/10/28(日) 00:35:06 ]
excelのvbaって何で使うんだろう?



281 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 01:46:49 ]
日本語で(r

282 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 08:01:15 ]
opentechpress.jp/developer/06/11/22/0059225.shtml

283 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 09:25:25 ]
winXP excel2003

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

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

285 名前:デフォルトの名無しさん [2007/10/28(日) 09:34:47 ]
>>283

dim sht as String
sht = ActiveSheet.Name
MsgBox sht


286 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 13:12:58 ]
というかアクティブシートって既にセレクトされてないか?

287 名前:デフォルトの名無しさん [2007/10/28(日) 13:17:11 ]
simatta!
tsuridattanoka...

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

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

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

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

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

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



291 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 20:50:33 ]
そうでもないか

292 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 02:14:30 ]
Copy と Paste 多用してるけどw

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


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

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

開発側
Windows XP Pro SP2
Office XP

利用者側
WindowsXP, 2000
Offece XP, 2003

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

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

296 名前:295 [2007/10/30(火) 10:30:54 ]
書き忘れ

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

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

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


298 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 21:22:21 ]
>>295
GetOpenFilename でサエコれ

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

300 名前:デフォルトの名無しさん [2007/10/30(火) 23:25:54 ]
作れる



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

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

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

302 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 02:44:48 ]
型変換関数って知ってるか?

303 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 02:48:53 ]
Format(.Value, .NumberFormatLocal)

304 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 07:53:39 ]
あれ?
.Textじゃダメなんだっけ?

305 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 08:53:50 ]
>>303
こんなことやってる奴も居るんだなw

306 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 12:36:56 ]
あれ?Textは「######」とか返してくるの知らないの?

307 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 12:49:11 ]
それでも表示通り

308 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 13:02:53 ]
画面表示と印刷の結果も違ったりするよね。

309 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 14:45:11 ]
>>306
おぉ試したら確かに#が返ってきた
非表示だと""が返るのな
勉強になるな〜

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

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



311 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 00:32:27 ]
図々しい教えて野郎ばっか来るのな

312 名前:VBA初心者 [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 16:57:10 ]
大丈夫って何が?

314 名前:VBA初心者 [2007/11/01(木) 17:09:46 ]
>>313

合っていますか?

315 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 19:50:13 ]
なんで聞く前に試さないの?

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

317 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 20:48:26 ]
よく読め。
やってみたと書いてるじゃないか。

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

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

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

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

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



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

322 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 06:50:21 ]
↑関数で出来ることをわざわざVBAでやってた俺だ w

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

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

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

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

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

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


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

327 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん [2007/11/02(金) 11:21:34 ]
>>326本当にごめんなさい、マクロは本で読んだことしかないのですが
繰り返し作業ができると書いてあったので自力で調べましたがうまく
いかなかったです。

変換前  02375290 
変換後  TKDME0237D5290 

です。

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


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

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



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

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

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

334 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 12:58:44 ]
普通は”マクロ”でやるよ

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

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

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

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

339 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 13:58:02 ]
>>337の間違い。

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



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

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

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

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


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

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

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

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

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

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

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

348 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 16:40:32 ]
>>337=346だとしたら痛い

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

350 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 17:25:03 ]
VBAとマクロって区別するようなものではないだろ



351 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 17:31:52 ]
だって同じ定義だもん

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

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

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

355 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 18:37:29 ]
子供の言い訳みたいなこと書かないで良いから

な?

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

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

358 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 21:49:01 ]
Unix文化に触れたら、文句言いまくりそうだなw

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

間抜けすぎだよ>>356


360 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:04:04 ]
なんで粘着してんだこいつ



361 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:06:33 ]
>>359
お前はそれで一生やってればいいさ

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

363 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:10:58 ]
まさかマクロに劣等感もたれるとは思わなかった。

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

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

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

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

367 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:33:36 ]
>>364
>>357

368 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:40:02 ]
もう勝ち逃げさせてやろうぜ。
相手にしても利益なし。

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

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



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

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

373 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 00:31:38 ]
×出力 ○入出力
どうでもいいけど一応

374 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 00:31:46 ]
正直スマンかった。

375 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 01:42:06 ]
1文字変数使うやつは駄目

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

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

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


378 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 03:00:09 ]
目的はコーディングじゃないから仕方ないだろ。

うごけばいい

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

うごけばいい

379 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 03:04:53 ]
iも駄目かね

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



381 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 05:47:01 ]
ifのあとのthenは無駄だよな


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

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

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

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

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

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

386 名前:デフォルトの名無しさん [2007/11/03(土) 13:17:42 ]
>>381

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

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

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


388 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 14:52:57 ]
>>387
演算子じゃなくてコマンドだよ


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

390 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 15:28:54 ]
Columns使わなきゃならんの?



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

392 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 17:58:02 ]
www.ne.jp/asahi/hishidama/home/tech/excel/range.html#COLS

393 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん [2007/11/03(土) 18:13:57 ]
>>392-394

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


396 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 18:15:31 ]
Unionは知らなかった
勉強になった
サンクス!

397 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 18:39:30 ]
400



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

402 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 14:32:32 ]
>>401
「開かずにできた」というのは、気のせいじゃないか?

403 名前:デフォルトの名無しさん [2007/11/06(火) 14:48:06 ]
>>402
タスクバーには表示されなかったんだけどなあ・・・

404 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 14:54:51 ]
>>403
どうやってやったんでしょう?教えてください。

405 名前:デフォルトの名無しさん [2007/11/06(火) 15:06:02 ]
>>404
ExecuteExcel4Macro("'C:\[Book1.xls]Sheet1'!R1C1")
これでBook1のSheet1でA1の値を取得できているようです。
裏技とか書いてました。

406 名前:デフォルトの名無しさん [2007/11/06(火) 15:15:23 ]
追記
ファイルの中にExcelを2つ用意して、1つにプログラム。
もう1つをBook1としてSheet1のA1に何か書いときます。
で、Book1は開かずにプログラムを書いた方だけ開いて、
ユーザーフォームのラベルに表示させました。

407 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 15:23:13 ]
これは、すごい

408 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 17:05:41 ]
それは参照してるわけだから
参照先でどうやっても参照元は変えられないでしょ
超ウラワザがあるかもしれんが結局裏でADO操作してとかだから
それならADOでやればいい
そんな都合のいいお手軽な方法はないよ

409 名前:デフォルトの名無しさん [2007/11/06(火) 17:28:23 ]
>>408
ありがとうございます。
当方初心者でADOが何かすらもわかりません。
もう一度勉強します。

ありがとうございました。

410 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 18:11:52 ]
"表示せずに"ならいくらでも誤魔化しようがあるけど
"開かずに"は不可能
ExecuteExcel4Macroも"開かずに"ではなく"表示せずに"だし
裏技でもなんでもない



411 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 18:12:41 ]
開かずにってどうせ見えなければいいんじゃないの?

412 名前:デフォルトの名無しさん [2007/11/06(火) 22:18:18 ]
ボタンのテキストを書き換えるのに

Set s = ActiveSheet.Shapes("Button 1")
s.Select
Selection.Characters.Text = "hogehoge"

とすれば書き換わりますが、ボタンがセレクトされるのがイヤなので
s.Characters.Text = "hogehoge"
としたら、「オブジェクトは、このプロパティまたはメソッドをサポートしていません」
と怒られました。セレクトせずにテキストを書き換えるにはどうしたらいいですか?



413 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 22:50:06 ]
まず、そのわがままな性格を何とかしれ

414 名前:デフォルトの名無しさん mailto:sage [2007/11/06(火) 22:52:52 ]
ヒント:Caption

415 名前:412 mailto:sage [2007/11/07(水) 00:00:59 ]
>414
UserFormオブジェクトのプロパティCaptionを使えばいいようですが
UserFormオブジェクトはどうやって取得するのでしょうか?

416 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 00:12:36 ]
聞く前に試せば?
オブジェクトには名前が付いてるでしょ

417 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 00:35:50 ]
>>412
Dim s As Shape
Set s = ActiveSheet.Shapes("Button 1")
s.TextFrame.Characters.Text = "HELLO"

みたいよ

418 名前:412 mailto:sage [2007/11/07(水) 00:50:19 ]
>417
ありがとうございました。解決できました。
selectしたら、textFrameを書かなくてもいいんですね。。。

419 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 03:15:53 ]
つーか、「選択したもの」のキャプションを変えるか、「TextFrame」のキャプションを変えるかの違い。

420 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 06:23:01 ]
UserFormの場合は?



421 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 13:57:32 ]
しつけーよカス


422 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 15:42:24 ]
VBAといえどもプログラミングするなら
使い込んで慣れるよりも調べ方を覚えるほうが先

423 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 16:19:38 ]
>>422
その通りだね
VBAっていうよりも仕事をする上で必要な事かもね。
調査がうまい人ってその時々の対応に長けてるところがあるしね。

424 名前:デフォルトの名無しさん [2007/11/07(水) 16:25:31 ]
たびたびすみません。
昨日、bookを開かずに作業が不可能なのは理解できました。
ありがとうございました。
今日は、
『それなら、タスクバーに開いてるbookが表示されないように』
と言われて調べてますが、どうもよくわかりません。
よろしくお願いします。

425 名前:デフォルトの名無しさん [2007/11/07(水) 16:34:07 ]
>>424
質問スレだからガンガン質問し続けるのは悪くはないが何をしようとしてるの?
あと、どうもよくわからないって何が分からないのかな?
質問の意図をちゃんと把握できていないと自分のためにならないよ。
聞かれた事を右から左に受け流すだけなら誰でも・・・

426 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 16:34:52 ]
>>424
Application.Visible = False

じゃないの?
実行するとExcelが見えなくなって操作不能になるから
注意してね。

427 名前:デフォルトの名無しさん [2007/11/07(水) 16:44:43 ]
ありがとうございます。
ユーザーフォームで作業をし、エクセルのbookをデータベースとして
使うシステムを作ってます。
タスクバーに作業中のbookが出てくるのはよろしくないということで
それを見えないようにという指示でした。
『何をどう書けばいいかわからない』って、甘えすぎですね。
すみません。
Application.Visible=False、やってみます。
ありがとうございます。


428 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 16:46:01 ]
いや、だから、やってからレスしろって・・・

429 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 16:47:42 ]
>>428
天然の人みたいだから、もう細かい話はいいんじゃね?w

430 名前:デフォルトの名無しさん [2007/11/07(水) 17:02:03 ]
天然で申し訳ないです。
早くレスした方が良いのかと思って。
Application.Visible = Falseで出来ました。
ありがとうございました。



431 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 17:29:36 ]
>>427さんが今作っているもので質問があります。
・ユーザーフォームで作業する。
・ブックをデータベースとして使う。
・タスクバーに作業中のブックが表示されないようにする。
ブックでデータ管理をしているように読めるのですが、
データってxmlとかで管理するものじゃないでしょうか?
ちょっと分からなかったのでどなたか助言をお願いします。

432 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 17:38:50 ]
>>431
ここはExcel VBAの断片的な質問のスレだろうから、
427タソが最終的に何をどうしたいのかっていう問題は、
どうでもよいと思いますが。

433 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 17:40:24 ]
AさんBさんCさんのA.xlsB.xlsC.xlsを
まとめるXさん用ってパターンだってあるだろ

434 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 17:41:57 ]
>>432
断片的なのでどうしたいかとかは関係ありません。
427さんのやりたい事とか関係なしにデータ管理の仕方について教えて頂きたいです。

435 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 17:49:39 ]
>>434
データ管理?
そういう作業はExcelじゃなくてAccess

pc11.2ch.net/test/read.cgi/tech/1064900050/

436 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 18:22:34 ]
EXCELだけでRDB組んだときはマジで泣けた


437 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 20:46:15 ]
xmlってデータベースとしてそんないいものかどうか
OSの違いを吸収できるのは利点だろうが
速度的に根本的に欠陥あるだろ

438 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 21:21:51 ]
xmlでDBやってる奴が居て、どうしてもxmlじゃなきゃ困るんだけど遅くて叶わないというので
ソース見てみたら、初心者入門サイトに載ってるような真っ当なコード書いてるので手直ししてやった
結果、1100%程度の速度アップ(同じ処理が11分の1の時間で終了)に成功した

遅い、ダメだ、と文句だけ言うのは簡単だが、バカとナントカは使いよう
xmlは汎用性重視な為、普通に使ってたのでは限定用途では利点が活きにくい
しかし使い方次第では限定用途特化型のものを超えることはなくても、
実用に充分なパフォーマンスを発揮することも可能な場合が多い
まぁxmlの使い方というよりは頭の使い方の問題かもな

439 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 21:44:54 ]
どういうネタ?
笑わせたいの?

440 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 22:01:08 ]
>>439




441 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 22:23:12 ]
よくわかんないけど
xmlって使われてるの設定ファイルぐらいだよね
いい使い方おちえて?

442 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 22:25:03 ]
Excel 2007ワークブックとか、XMLHTTPでネットワーク通信とか、
設定ファイルどころでなくあちこちで使われている。

443 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 22:42:08 ]
いい使い方おちえて?

444 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 23:05:39 ]
<?mso-application progid="Excel.Sheet"?>
<hoge>
<fuga>fuga</fuga>
hoge
</hoge>

445 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 23:07:53 ]
むかーしから「OSや言語が違うけれどデータ型を双方向に変換したい」
という需要があった。そのためには「型名」と「値」を文字列で書いちゃえば
いいんだけれど、昔のコンピュータはいまほど処理速度もメモリもなくて
利用されることはあまりなかった。

90年代から、コンピュータの性能が向上してきて文字で書いても大丈夫になってきた。
そのころ「データ交換するときにXML使えばいいんじゃね?文字コードの扱いも整理されているし」と
考えた人たちがいて、使ってみたら便利だったんで今みたいに使われるようになった。

元々XMLは、SGMLの進化版だから「形式的な文章」を表記するための規格。
データ交換のために考えられたものではない。が、データ交換によく
利用されている。

というわけで、1台のPCで完結するようなシステムでは
XMLの出番はあまりない。設定ファイルの記述にXMLが利用されている理由は、
オブジェクトのシリアライズデータを人が読んだりテキストエディタで編集したり
したいからだと思われ。

446 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 23:13:22 ]
むかーしの話は関係なくてHTMLが流行っただけ。

447 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 02:24:15 ]
ここは半可通がほろ酔い気分で講釈たれるスレじゃねーぞ

448 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 08:59:41 ]
>>447
自己紹介?

449 名前:デフォルトの名無しさん [2007/11/08(木) 14:59:18 ]
テキストファイルから先頭の1行を読み込んで返すFuncitonを
作成したのですが、なぜか特定のCSVファイルだけ、先頭の2行を1行分にして抽出してきてしまいます。
"1行目 2行目"
のような感じです。
何が原因でどう対処すればいいか困っています。だれ偉い人教えてください!

Public Function ReadOneLine() As String
 Dim Fso As Object
 Dim Tso As Object
 Dim line As String
 Set Fso = CreateObject("Scripting.FileSystemObject")
 'ファイル名を指定する
 Set Tso = Fso.OpenTextFile(FileName:=m_strInputFile, IOMode:=1)
 With Tso
  'ファイルポインタが終端になければ(空ファイルでなければ)
  If .AtEndOfStream <> True Then
   line = Tso.ReadLine
   Debug.Print line
  End If
  .Close
 End With
 'オブジェクトの解放
 Set Tso = Nothing
 Set Fso = Nothing

 ReadOneLine = line
End Function

ちなみにCSVファイルの文字コードはShift-JISで改行コードはCR+LFです。




450 名前:デフォルトの名無しさん [2007/11/08(木) 15:14:31 ]
>>449
特定のCSVファイルって?



451 名前:デフォルトの名無しさん [2007/11/08(木) 15:41:07 ]
>>449
知人からサンプルでもらった5つのCSVファイルの中の1個だけ、
上記の症状になってしまうんです。

秀丸エディタでそのCSVファイルを開いて
文字コードや改行コード、コンマの数や""の有無を確認したのですが、
他のCSVファイルと特に変わったところが無いのです。




452 名前:451 [2007/11/08(木) 15:42:31 ]
間違えちゃった

× >>449

>>450


453 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 15:53:35 ]
バイナリエディタで確認してみたら?

454 名前:デフォルトの名無しさん [2007/11/08(木) 16:08:17 ]
>>451
困ったねー
その症状がどういうときに発生するかつかめれば打開できるんだろうね
>>449なら何か打開できそうな気がするけどな・・・

455 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 16:13:35 ]
実は長い1行で単に折り返してるから2行だと思い込んでるなんて落ちだと寒いね

456 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 16:17:44 ]
可能ならそのcsvファイルをアップロードしてみたら?

457 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 16:21:07 ]
>>455
予想外の動きしてるときほど見落とすもんなぁ
症状からして普通にありそだな

458 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 16:21:55 ]
pc11.2ch.net/test/read.cgi/tech/1190192944/337

459 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 16:33:16 ]
>>449-451
FAQだと思うんだがExcelのセルの中で改行されていると
CSVで出したときそこにLFだけが入るから
別のプログラムでそれを読み込むと2行(以上)に
なっているように見えることがあるし
LFを正しく処理していない場合は1行に2行分はいることになる



460 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 16:53:51 ]
>>459
FileSystemObject.ReadLineはCR+LFだけではなく、LFのみでも改行とみなして一行読み込む。
(ただし、CRのみの場合は改行とはみなさない。)

やはり、バイナリエディタできちんと改行コードがあるかどうかを確認するのが先決だね。



461 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 18:24:32 ]
CRLFとLFの混在ならFSOじゃなくてADOで処理だね


462 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 18:39:12 ]
OS XP
EXCEL 2000

shellでリモートデスクトップを呼び出す所までは、
自分で調べて理解出来たのですが、
呼び出したリモートデスクトップに値を投入するやり方がわかりません。

どなたかご教授願います。

463 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 18:44:37 ]
>リモートデスクトップに値を投入する

すいませんが、意味不明です

464 名前:462 mailto:sage [2007/11/08(木) 18:49:39 ]
>>463
申し訳ございません、プログラミングをする事が初めてなので…

リモートデスクトップを呼び出してそこに
サーバ名等を投入し接続ボタンまで自動的に押すマクロが組みたいのです。

465 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 19:11:40 ]
>>464
Excelからウィンドウズのリモートデスクトップ接続を起動して別PCに接続したいのかな?

>>shellでリモートデスクトップを呼び出す所までは、自分で調べて理解出来た
もしそうだったらここ参考になるかな?
www.atmarkit.co.jp/fwin2k/win2ktips/519rdcons/rdcons.html

打開できたらどうやったか書き込んでねー。

466 名前:462 mailto:sage [2007/11/08(木) 19:14:14 ]
>>465
ありがとうございます、頑張ってみます。

>打開できたらどうやったか書き込んでねー。
ご期待に添えられるように(苦笑)

467 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 20:33:56 ]
sendkeys

468 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 20:39:51 ]
キーボードから入力されたかのように、現在の入力フォーカスのあるウィンド
ウにデータを送ります。
特殊キーを送る場合は、次のとおり。
{ENTER} Enter キー
{ESCAPE}, {ESC} Esc キー
{TAB} Tab キー
{INSERT} Insert キー
{DELETE}, {DEL} Delete キー
{BACKSPACE}, {BS}, {BKSP} Back space キー
{LEFT} ← キー
{RIGHT} → キー
{UP} ↑ キー
{DOWN} ↓ キー
{PGUP} Page Up キー
{PGDN} Page Down キー
{HOME} Home キー
{END} End キー
{PRTSC} Print Screen キー
{SCROLLLOCK} Scroll Lock キー
{BREAK} Pause キー
{NUMLOCK} Num Lock キー
{CAPSLOCK} Caps Lock キー
{F1} 〜 {F12} F1 〜 F12 キー (ファンクションキー)
+ Shift キー
^ Ctrl キー
% Alt キー
** +, ^, % で、複数のキーを対象にする場合は、() でキーを囲む。
+(AB) は、シフトキーを押しながらの AB になります。
** 画面コピーとしての {PRTSC} を sendkeys することはできない。
Windows API などを使用して対処するしかない。
** 同じキーをリピートするには、{RIGHT 6} とすると → が 6 度押された
動作になる。

469 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 20:44:28 ]
>>466
EXCEL VBAでもできるけど、厳密に言うとスレ違い
そういうのはWSHからSHELLオブジェクトで処理するのが普通
ただMSTSCコマンドにはパスワード指定オプションがないみたいなので、
その辺りはSendkeysでキーを送ってやるなりする必要がある

繰り返すけどEXCELでやる必然性は全くないので

470 名前:462 mailto:sage [2007/11/08(木) 22:28:25 ]
>>467
>>468
本当にありがとうございます。
まだまだ自分の勉強が足りませんでした。

>>469
WSHというのは調べてみるとVBS…ですかね?
エクセルで機能の一覧表があってその横にボタン作ってウマー
なんて考えていたんですが。
ありがとうございました、勉強してみます。



471 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 23:00:24 ]
caption で上付文字は入力できますか?
a^2をきちんと表示したいんですが。

472 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 23:24:34 ]
>>470
Excelからスクリプトを引数付きで呼べばいい

473 名前:デフォルトの名無しさん [2007/11/09(金) 11:27:51 ]
If Range("a1").Value > 10 Then _
error_msg = MsgBox("error", vbOKCancel + vbInformation)

If error_msg = vbOK Then Exit Sub

End Sub

-----
この場合、「error_msg」の変数定義は何になるんですか
variantにしても「型が一致しません」と出てしまいます(;_;)

474 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 11:34:52 ]
1つずつステップで確認してみ

475 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 11:37:06 ]
>>473
VBAのエディタ上でMsgBoxの上にキャレットを置いてF1キーを押す

476 名前:473 [2007/11/09(金) 12:13:36 ]
ありがとうございました!
いけました

if total_value <> 0 and total_value <> "" then

の場合、total_valueの変数定義はvariantにするしかないんでしょうか。

こちらではstringでもいけるようなんですが、ということはstringは整数を内包している?

477 名前:449 [2007/11/09(金) 12:16:46 ]
バイナリエディタで調べてみたところ、
その先頭行だけCRでした。ショック。。(他の行はCR+LF)

とりあえずCRも改行コードとして認識できる方法を探してみようと思います。

>>461
私の経験からADOを利用したCSVファイルの先頭行の読み出し方法は
レコードセットのFieldsオブジェクトを参照する方法しか思い浮かばないのですが
他にも良い方法がありますか?


478 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 12:36:14 ]
>>476
それ普通にIntegerかDoubleで受ければいい
空白は0になる
関係ないけど変数定義じゃなくて型と呼んでくれ

479 名前:デフォルトの名無しさん [2007/11/09(金) 13:41:20 ]
>> 478
ありがとうございます

480 名前:デフォルトの名無しさん [2007/11/09(金) 16:06:09 ]
xpで2003です。
ユーザーフォームのリストボックスに表示されている値を
新しいシートに入れたいのですが。
リストボックスの値の元になっているシート上のデータは使えません。
チェックされているかどうかに関係なく、表示されている値全てをそれぞれセルに入れたいのです。
どなたかよろしくお願いします。



481 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 16:19:08 ]
With Worksheets("Sheet1")
.Range(.Cells(1, 1), .Cells(UserForm1.ListBox1.ListCount, 1)).Value = UserForm1.ListBox1.List
End With


482 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 16:22:37 ]
Dim i As Integer
For i = 0 To UserForm1.ListBox1.ListCount - 1
Worksheets("Sheet1").Range("A1").Offset(i, 0).Value = UserForm1.ListBox1.List(i)
Next

483 名前:デフォルトの名無しさん [2007/11/09(金) 16:34:44 ]
>>481,482様
本当にありがとうございます。
希望通りに出来ました。

484 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 19:13:23 ]
>>477
なんでレコードセットが出てくるんだよ
ストリームだストリーム


485 名前:477 [2007/11/09(金) 21:32:11 ]
>>484
なるほど。ちょいリファレンス読みながらやってみます。

486 名前:477 [2007/11/10(土) 11:57:28 ]
おかげさまでなんとかできました。
作ったサンプルになります。

'改行コードがCRのデータ抽出
Sub StermTest()

 Dim stm As ADODB.Stream
 Dim strFile As String
 Dim line As String

 Set stm = New ADODB.Stream
 strFile = "hoge.csv"

 stm.Type = adTypeText  'ストリーム内のデータ型を設定する
 stm.Charset = "Shift_JIS" '読み取り時の変換文字コードを設定する
 stm.LineSeparator = 13  'CR=13 改行コードを設定する
 stm.Open
 'Streamオブジェクトにファイル内容を読み込む
 stm.LoadFromFile strFile
 
 '1行目を抽出する
 line = stm.ReadText(-2)
 Debug.Print line

 stm.Close
 'オブジェクト解放
 Set stm = Nothing
End Sub

>>484
こんな感じですよね?

487 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 19:35:46 ]
>>484

>こんな感じですよね?
yes(^ω^)b

488 名前:デフォルトの名無しさん [2007/11/12(月) 14:42:07 ]
皆様、お疲れ様です。
 
ユーザーフォーム上に多数のテキストボックスやコンボボックスがあります。
クリアボタンを押す時に
「編集中の内容は破棄されます」とメッセージで出すのですが、
保存ボタンを押しているのであればこのメッセージは出しません。

If combobox1.value=worksheets("sheet1").cells(2,2)(保存ボタンでこのセルに入力されます).value Then
Else
If MsgBox ("編集中〜破棄されます",vbOkCancel) =vbCancel Then
Exit Sub
End If
End If
この考え方でよろしいのでしょうか?
試してみると、両方ともに同じ数値が入っていてもメッセージボックスが立ち上がってしまいます。

489 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 15:24:59 ]
cells(2,2).value

490 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 15:25:25 ]
>>488
> この考え方でよろしいのでしょうか?
いい。

If分にbreak pointを設定して、止まったらイミディエイトで「?worksheets("sheet1").cells(2,2).value」、
「?combobox1.value」として内容を確認してみるべし。




491 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 15:30:25 ]
valueついてたか(汗

492 名前:488 [2007/11/12(月) 17:24:42 ]
ありがとうございます。
やってみようと思った矢先、違う項目について言われたので
そちらに時間をとられてます。
考え方が間違ってなかったとわかり、心強いです。

493 名前:デフォルトの名無しさん [2007/11/12(月) 21:41:20 ]
質問なのですが、

メインのsubから、複数受けて、1個の値を返すというのは、わかったのですが、
3つの値を受けて、5つの値を返す、functionもしくはsubを作りたいのですが可能でしょうか?

その場合の記述方法を教えていただきたいのです。お願いします。

494 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 21:45:34 ]
sub savu(a,b,c,d,e)
a = 1
b = 2
c = 3
d = 4
e = 5
end sub

495 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 21:46:19 ]
ByRefを使えばできるけど多用するのは良くない
返す5つの値をひとまとめにしたクラスを作ってそのオブジェクトを返す

496 名前:495 mailto:sage [2007/11/12(月) 21:49:11 ]
VB.NETスレと間違えてた
クラスは大げさだから構造体か、>>494でもいいよ

497 名前:494 [2007/11/12(月) 21:49:36 ]
>>495
ありがとうございます。

classというのがあるのですねw
独学のため、知りませんでした。勉強してみます!

498 名前:494 [2007/11/12(月) 21:53:04 ]
あ・・・>>494がありましたw
ちょっと調べてみます。

ありがとうございます。

499 名前:494 [2007/11/12(月) 22:02:47 ]
連続で、ごめんなさい。
これじゃ、だめなのはわかってるのですが乗せますw
こんな感じの事がしたいんです。

Sub TEST()
Dim a, b, c, z
a = 1
b = 2
c = 3
Call TEST2(a, b, c) ←ここで、Test2にa,b,cを入れて、Test2のd,e,f,g,hの値を取得したい
z = d + e + f + g + h←取得したd,e,f,g,hを使って計算したい。
End Sub

Sub TEST2(d, e, f, g, h)
Dim d, e, f, g, h
d = a * 2
e = b * 3
f = c * 4
g = a * b
h = a * c
End Sub

500 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 22:05:03 ]
Sub TEST2(a, b, c, d, e, f, g, h)



501 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 22:17:23 ]
>>499
Sub TEST()
Dim a, b, c, z, d, e, f, g, h
a = 1
b = 2
c = 3
Call TEST2(a, b, c, d, e, f, g, h)
z = d + e + f + g + h
MsgBox (z)
End Sub

Sub TEST2(ByVal a, ByVal b, ByVal c, ByRef d, ByRef e, ByRef f, ByRef g, ByRef h)
'略(一緒)
End Sub

d, e, f, g, hの組み合わせに何か意味があるんだったら、
ユーザー定義型を使ったほうが見やすくなる

502 名前:494 [2007/11/12(月) 22:18:01 ]
>>500
なるほど!できました!
3個いれて5個入れたいなら、最初から8個にしとけって事ですねw
このやり方って、当たり前なんですかね〜。自分の頭の固さにがっかりですわw
ありがとうございました。

503 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 00:36:21 ]
> 当たり前なんですかね

当たり前ではない
見づらいコードなだけでメリットがない
誰かが書いていた通りクラスか構造体を使うか、戻り値を配列で返却するのが普通

504 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 00:48:09 ]
型一緒なら配列でいいしょ

505 名前:494 [2007/11/13(火) 08:55:56 ]
>>503 >>504
ありがとうございます。
昨日はじめたばかりで、配列・クラス・構造体を知らないんですw
勉強して、すっきりさせたいと思います。

506 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 14:37:54 ]
クラス、構造体は使わなくても何とかなるけど、配列を使わないで
プログラミングは困難だね

がんばってね

507 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 18:47:42 ]
>>505
出力引数を使うんだったらByVal/ByRefはサボらず書くように

508 名前:デフォルトの名無しさん [2007/11/13(火) 23:22:28 ]
VBAで記述した関数( 例 func() )をワークシートから呼び出す場合に
SUM関数を呼び出す場合などのように引数のツールチップを表示させる方法がわかりません。

509 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 02:14:05 ]
イベントとコントロール使わないと無理ジャマイカ?

510 名前:488 [2007/11/14(水) 09:19:31 ]
先日はありがとうございました。

If combobox1.value = worksheets("sheet1").cells(2,2).value And _
combobox2.value = worksheets("sheet1").cells(2,3).value And _
textbox1.text = worksheets("sheet1").cells(2,4).value Then

Userform.show

Else
Msgbox "〜" 
End If

イミディエイト
?worksheets("sheet1").cells(2,2).value
19(19の前に半角の空白があきます)
?combobox1.value
19

このようになり、同じ数値がそれぞれ入っているのにメッセージボックスが開いてしまいます。
Andの使い方が悪いのでしょうか?
それともイミディエイトの表示のように半角の空白があるのが悪いのでしょうか?

よろしくお願いします。



511 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 09:37:30 ]
>>510
空白が悪い。

512 名前:488 [2007/11/14(水) 09:52:31 ]
>>511
ありがとうございます。


513 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 09:56:40 ]
>>510
>>combobox1.value = worksheets("sheet1").cells(2,2).value And _
>>combobox2.value = worksheets("sheet1").cells(2,3).value And _
>>textbox1.text = worksheets("sheet1").cells(2,4).value

こいつを満たしてないからメッセージボックスが出ます。

514 名前:488 [2007/11/14(水) 10:25:19 ]
>>513
ありがとうございます。
条件を満たしていない理由を知りたかったのです。
どうやら型が違ったようです。

515 名前:デフォルトの名無しさん [2007/11/14(水) 10:26:15 ]
Range("A1").Formula = "= IF(H5="""","""",IF(ISERROR(VLOOKUP(H5,table!$A$1

こういう感じで、A1セルに関数を入れるとき、関数の途中でアンダーバーによる改行
を行うことは可能ですか?
改行を入れると必ず次の行で、「修正候補:ステートメントの最後」が出てしまいます。

516 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 15:44:25 ]
改行できないので、あきらめてそのまま記述するかバッファを介して&で連結しましょう

e.g)
strBuf=IF(ISERROR(
strBuf=strBuf & "VLOOKUP(H5,Table!$A$1,FALSE)"
strBuf=strBuf & "),"hoge","fuge")

ってな感じで

517 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 15:47:07 ]
↑二重引用符で囲ってないところは脳内補完ヨロ

518 名前:515 [2007/11/14(水) 18:34:20 ]
>>516
自己レスでおま。
以下のようにするといけました・・・。

IF(ISERROR(VLOOKUP _
& "(H5,テーブル!$A$50:$B$97

519 名前:デフォルトの名無しさん [2007/11/14(水) 21:43:58 ]
基本的なところなんですが、

Cells(1,1).Value = "(" & a & ")"

とすると、a=100とすると、(100)とでると思ったのですが、-100と出ました。
これは、文法が間違っているのでしょうか?

520 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 21:54:09 ]
Excelでは数値としての(100)も-100を意味する。
書式設定でも負の値の表現に括弧で括る表記が選べるのを見たことがあるだろう。

一番手っ取り早い対処法は、おそらく"'(" & a & ")"のようにアポストロフィを頭に置くこと。
ほか正攻法があると思うが、やったことないので詳しくは知らない。



521 名前:デフォルトの名無しさん [2007/11/14(水) 21:57:45 ]
>>520
ありがとうございました!できました。
確かに、書式設定で見ると()もありますね。

522 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 20:26:50 ]
すみませんこちらのスレで質問させて下さい

FileSystemObjectを使ってGetFolderでネットワークのパスを取得すると
\・・・\ のような文字化けを起こすのですが、どのように回避すればよいのでしょうか?

523 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 21:06:33 ]
文字コード

524 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 21:40:36 ]
すみせん。
プログラムを教えて欲しいのですが、
Excelで入力されているIPアドレスを
頭以外、全て三桁で表すようにするにはどうすればいいのでしょうか?

例えば、
99.1.2.3 → 99.001.002.003
という風に変換したいです。

525 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 22:04:15 ]
>>524
Excel関数の質問はスレ違い

Excel総合相談所 61
pc11.2ch.net/test/read.cgi/bsoft/1192713147/


ついでに、

(1)IPアドレスの入っている列を . で区切って4列にする。区切るには「データ(D)→区切り位置(E)」を使う
(2)4列の各々の値を =text(a1, "000")&"."&text(b1, "000")&"."&text(c1, "000")&"."&text(d1, "000")&"."のような式で、ゼロを補って出力する

でOKなはず

526 名前:524 mailto:sage [2007/11/15(木) 22:15:29 ]
>>525
ご丁寧にありがとうございます。
試してみます。

527 名前:デフォルトの名無しさん [2007/11/16(金) 10:16:27 ]
msgboxのタイトルをシートで一括設定したいのですが、方法が分かりません(*_*)

528 名前:デフォルトの名無しさん [2007/11/16(金) 11:07:16 ]
Dim XXX As String
XXX = workbooks("book1").worksheets("sheet1").cells(1,1).value
※cell(1,1)に表示したい文
MsgBox XXX

間違ってる?

529 名前:デフォルトの名無しさん [2007/11/16(金) 11:20:14 ]
>>528
ありがとうございます
get_value = MsgBox("計算が終了しました", vbOKOnly + vbInformation, "給与合算")
上記の「給与合算」にあたる部分ですね・・・。

530 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 11:57:11 ]
msgbox "hoge", vbinformation, range("sheet1!A1").value
とかじゃ駄目なのか?



531 名前:デフォルトの名無しさん [2007/11/16(金) 12:09:59 ]
>>530
なるほど、その手がありましたか

ところで関係ないですが、文字列を「hoge」「huge」にするのって、
何か意味があるんですか。

532 名前:デフォルトの名無しさん [2007/11/16(金) 12:15:10 ]
すいません、この間もここの方たちに助けていただいたものです。
また、力を貸していただきたいです。



SA-2 1 s5004878815 8635A129
2 s5004878811
3 s5004879056
4 s5004879819
5 s5004879066



このように列が並んでいて、一行ごとに20行列を挿入させたいです。
ネットで関連サイトからコピペしてみましたが、1度マグレでできましたが
もうできません。
ここにいる方達にとっては、簡単すぎるのかも知れませんが
私にはわかりません。

よろしくお願いします。

533 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 12:49:10 ]
おちつけ。
行と列は別物だ

534 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 12:55:37 ]
>>532
>>ネットで関連サイトからコピペしてみました
このコピペしたロジックの処理はちゃんと理解できてるの?
もし理解できているならどこがおかしいか?むことができると思うけど・・・

>>533 の件は同意w

535 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 12:59:27 ]
>>531 "hoge"等は、特に意味の無い文字列とかの場合に
使われる文字だよ

>>530 の場合はメッセージBOXに"hoge"と表示される

536 名前:532 [2007/11/16(金) 13:02:59 ]
ご返答ありがとうございます。
今一行ずつ地道に挿入し続けています。指が痛くなってきました笑

列と行間違えてますね、ごめんなさい。

ロジックもほとんどわからないです。
ごめんなさい。



537 名前:デフォルトの名無しさん [2007/11/16(金) 14:29:58 ]
これで、いいんじゃね?w(爆

Selection.EntireRow.Insert
Selection.EntireRow.Insert
Selection.EntireRow.Insert
Selection.EntireRow.Insert
Selection.EntireRow.Insert
Selection.EntireRow.Insert
Selection.EntireRow.Insert
Selection.EntireRow.Insert
Selection.EntireRow.Insert
Selection.EntireRow.Insert
Selection.EntireRow.Insert
Selection.EntireRow.Insert
Selection.EntireRow.Insert
Selection.EntireRow.Insert
Selection.EntireRow.Insert
Selection.EntireRow.Insert
Selection.EntireRow.Insert
Selection.EntireRow.Insert
Selection.EntireRow.Insert
Selection.EntireRow.Insert
End Sub

538 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 14:54:12 ]
謝らなくていいから、一般的に説明できないなら具体的な例を示してくれ
それに対してどういうマクロを動かしてどうダメだったのか
自分で理解する気がないならそもそもスレ違い

539 名前:デフォルトの名無しさん [2007/11/16(金) 15:10:22 ]
>>532
紙にフローチャートでも書いてみると理解しやすいかもわからん。


540 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 16:04:54 ]
>>532
隣の列に連番を振って下に同じ連番をコピー

   A B
1 aaa 1
2 bbb 2
3 ccc 3
4 ddd 4
5 1
6 2
7 3
8 4

B列で並べ替え



541 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 16:05:40 ]
詰まっちゃったな
何とか理解してくれ

542 名前:532 [2007/11/16(金) 16:13:03 ]

537様のをボタンをつくりました。
ありがとうございました。

理解しようと本などを読んだりしていますが、難しいです。
みなさまどのように学んで、自分で作れるようになったのでしょうか。
すごすぎです。

だめだったのは、テンプレが6行ごとに1行空白行を挿入で
私が数字を変えたため、できなくなったと思います。



543 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 16:24:05 ]
>>542,532
とりあえず解決(?)したようでよかったね。

>>理解しようと本などを読んだりしていますが、難しいです。
それは多分ただ眺めたって感じなのかも・・・
とりあえず例題などを実際に入力してフローを理解する必要が最低でもあると思います。
これができればどっかでつまづいた場合でもネットで調べるなり自力で応用力がつくと思いますよ。

>>だめだったのは、テンプレが6行ごとに1行空白行を挿入で
>>私が数字を変えたため、できなくなったと思います。
この説明じゃ相談されても困るよね・・・
相談の仕方も勉強の一つです。頑張って下さいね!

544 名前:537 [2007/11/16(金) 16:24:16 ]
Σ(・∀・)うそ、マジでっ
いつもクレクレ君の俺が役に・・・(T-T)

545 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 16:25:23 ]
>>544
やったじゃんwww

546 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 16:27:21 ]
なんでもいいから一般的なプログラミング言語が一つでも身についてたら他のはすぐ使えるからな
この板では先に他のが使えた人が多いんじゃないの

547 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 21:08:42 ]
書けないなら、まず「新しいマクロの記録...」をしてみればいいと思うのだが。
そこから読解できるだろ?

548 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 21:14:04 ]
プログラミング経験がないと無理だろ

549 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 21:20:07 ]
>>457
っつーかExcelVBAの本読んでるんだから、
読んで手を動かして理解することくらいできるんじゃないのかなぁ・・・

もちろんマクロを記憶させて読解するのもありだよ。
条件として分からない時確認する本やサイトがある事ね。

550 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 21:20:39 ]
>>547
だったw



551 名前:デフォルトの名無しさん mailto:下げ [2007/11/16(金) 23:18:41 ]
すいません、エクセルVBAで数万件のデータを処理するプログラムを作っているのですが、
VBAはクソ遅いんで、C++で自作のdllを組み込んでやろうと思うのですが、
ぐぐっても有益な情報は得られませんでした。
分かりやすく解説したホームページなどありませんでしょうか?

552 名前:デフォルトの名無しさん mailto:下げ [2007/11/16(金) 23:21:11 ]
あ、OSは2000sp4、エクセルは2000、cはBCCを使ってます。
ちなみにCPUはPEN2、360mhz、メモリ192mb・・・・

553 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 23:22:02 ]
>>551
スレ違いな上に 下げ って何だよ?

554 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 23:24:33 ]
くそ仕事遅せーくせにマグロかよ

555 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 23:29:07 ]
>>553
これでも下がると思ったが、下がってませんでした?すいません。
>>554
?????

556 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 00:00:48 ]
探し方が悪いだけだろ
DLL呼ぶ方法なんていたってポピュラーだし
VBA用に特殊なことしてるわけでもないし


557 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 03:26:26 ]
>>551
ネイティブよりVBAのが遅いのは確かだが、たかだか数万件のデータで
クソ遅いなんて思うほどなら、お前の技術不足と言わざるをえない

558 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 05:52:53 ]
>>551
どんなことやってるんだ?
VBAでも数万件くらい普通サクサクだぞ?

559 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 08:42:22 ]
API VBA でググれば出てくると思うけど、そういう事ではない?

560 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 11:16:07 ]
ぐだぐだ言わないで答え教えてやれよ。
stacallな関数をexportしたdllを作って、vbaでdeclare sub/functionすればいい。
知らない単語はググれ。



561 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 11:27:44 ]
まー確かにやる内容によっては、遅いっちゃ遅いな。
T5500+Excell 2007で、次のコードが2.5秒くらいかかるし。
For i = 1 To 10000
  Cells(i, 1).Value = Rnd()
  Cells(i, 2).Value = Cells(i, 1).Value
Next

やりたい内容と、いまどれくらいかかてるか、どれくらいにしたいかを書いたほうがいいな。
C/C++にしたから、なんでも自動的に劇的に速くなるわけじゃないぞ。

意外とVBAって速いんだぞ。

562 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 11:31:42 ]
ちなみに上のコード、screenupdatingをfalseにすると、1.4秒くらいになるけど、
それでも遅いっちゃ遅いな。

563 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 12:26:18 ]
直接セルに値代入が遅いのはTips

Dim buf(9999, 1) As Variant
For i = 0 To 10000 - 1
 buf(i, 0) = Rnd()
 buf(i, 1) = buf(i, 0)
Next
Range("A1:B10000") = buf

564 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 12:45:14 ]
>>563
便乗で聞いちゃうけれど、
装飾情報(フォント、セルの色など)を高速に書き込む方法ってのは
あるの?

565 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 12:50:45 ]
>>563
いや、そういうことが言いたかったわけじゃないんだけどね・・・

566 名前:551 mailto:sage [2007/11/17(土) 13:05:19 ]
みなさんどうもです。頂いたキーワードで再度ググッて見ます。
やってることは、バイナリファイル(構造化されたデータ)を開いて、
項目ごとに対応する日本語に置き換えて、セルに放り込んで表示、
という物です。
データ数は4万ぐらいです。1つのデータについて項目の個数は50個ぐらいですね。

567 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 13:40:09 ]
>>546
よくわからんがこんなことですか?

With Range("A1:B10000")
 .Font.Size = 12
 .Font.ColorIndex = 3
 .Interior.ColorIndex = 4
 .Borders.ColorIndex = 3
End With

568 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 14:17:18 ]
>>561
DLL呼ぶって言ってるんだから
単純なデータ操作じゃなくて、時間のかかる数値計算でもやるんじゃね

569 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 14:22:47 ]
>>561
>>568の言うとおり。
そうだろねーじゃなきゃ>>551で『VBAはクソ遅い』なんて言えないもんね。


570 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 18:04:17 ]
>>563
Variantは使わない方がいいぞ

「セル範囲の値を取得する」変数はVariant型である必要があるが
「セル範囲に代入する値を一時格納する」配列変数はVariant型である必要は無い

これも件のTipsの一部なので覚えておくように



571 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 18:06:22 ]
>>566
ありそがちなのを挙げてみる
String型の連結を何度も使用している -> 固定長StringもしくはByte、Integerの配列を使え
読み込んだバイナリをForループでコピーしている -> RltMoveMemory
セルに1つづつ代入している -> String型の2次元配列を作って一気に代入
読み込んだ一時データを作業用シートに入れている -> 問題外

572 名前:546 mailto:sage [2007/11/17(土) 18:52:12 ]
>>547
やっぱり、そんな感じになるのか。
わざわざサンスコ

573 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 18:55:57 ]
C++でdll作って云々というレベルの人がなんでAPI知らないんだよ w

574 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 19:01:11 ]
>>573
さぁ…DLLばっか作ってたんじゃね?w
んでもってAPIは苦手で覚えもしなかったとかw

575 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 19:06:16 ]
VB.NETで書けば?w
ヘタにC++で書くより速いよ

576 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 10:07:48 ]
>>568
数値計算もね、意外とVBAでも速いんだよ

577 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 10:12:29 ]
>>566
4万×50個のデータをセルに表示するってこと?だとすると、どうあがいても速くはならない。
それとも、「対応する日本語への置き換え」が遅いのか?だったら、今どうやってるか書いてみるべし。

何が遅いのかわからない?計測しろ、今すぐ。

578 名前:577 mailto:sage [2007/11/18(日) 10:15:43 ]
>>577
> 4万×50個のデータをセルに表示するってこと?だとすると、どうあがいても速くはならない。
これは、C/C++でDLLを作っても速くはならないってこと。念のため。

579 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 10:18:34 ]
>>571
> 読み込んだバイナリをForループでコピーしている -> RltMoveMemory
つLet

580 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 10:56:22 ]
もうちょっと具体的に内容と時間がかかってる箇所を書けば、具体的な回答が返ると思うぞ。

まー、速いCPU使ったり、メモリ増設したりってのが劇的にスピードを速くする近道だったってな
こともあるかもしれないけど。



581 名前:デフォルトの名無しさん [2007/11/18(日) 23:14:07 ]
ユーザーフォームを印刷する方法ありませんか?
ネットで検索すると出来ないと書いてあったんですが
本当は裏技があるとかんぐっています。

582 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 23:30:30 ]
PrintScreen

583 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 23:58:08 ]
>>581
Win32API使うといいよ

でもスレ違いだからあとは自分で調べてね

584 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 00:03:52 ]
CopyMemoryだろ、普通

585 名前:デフォルトの名無しさん [2007/11/19(月) 01:36:29 ]
CSVファイルにADOを使って接続する際に、
各列のデータ型をschema.iniで定義できますが、

Excelのワークシートに接続する際には
どうやって定義すればいいんでしょうか??

586 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 06:01:38 ]
>>584
なにがどう普通なんだ?

587 名前:デフォルトの名無しさん [2007/11/19(月) 07:54:01 ]
printrormだったか、formprintだったかたしか命令あったきがする。
今携帯からなので、あとは自分で調べてみてくれ

588 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 10:25:49 ]
>>586
RltMoveMemoryとか書いちゃう奴がいるから、CopyMemoryを普通にしといたほうがいいんだよ

589 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 22:38:44 ]
>>588
だから何がどう普通なんだよw

590 名前:デフォルトの名無しさん [2007/11/19(月) 23:45:57 ]
【OS, Office】2000

エクセル4.0マクロ(関数)ってOffice2007でもサポートされてますか?拡張子.xlsで。
昔作ったファイルがVistaで動作するかどうか知りたいのです。
MSのサイトで検索したところ、どうやら使えはするようなのですが、
買って実験しろ、ってのは最終手段でお願いします。



591 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 23:47:27 ]
余裕で使える

592 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 07:56:12 ]
>>589
CopyMemoryの方が直感的で間違わないだろ。
だからそれを普通にしといたほうがいいんだよ。
RltMoveMemoryとか書くアホでも使えるし。

593 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 08:55:51 ]
>>592
本来MoveMemoryな関数をCopyMemoryって本当に直観的か?
なんか無批判にAPIビューアの宣言を盲信してんだか、
自分がそれに慣れてるから勝手に直観的とか思い込んでるだけじゃね?w

594 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 09:43:47 ]
Rltと書いたのがよほど悔しかったんだな

595 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 09:47:00 ]
なんだか良くわからんが、::MoveMemoryが普通だろ。

596 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 10:08:12 ]
>>594
おまえ何がそんなに悔しいの?

597 名前:585 [2007/11/20(火) 10:11:46 ]
お取り込み中失礼しますが
どなたか>>585もよろしくお願いします

598 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 10:43:42 ]
>>597
マクロの記録で、データ→外部データの取込み→テキストファイルのインポートでウィザードを操作してみれば大体分かる。

599 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 11:17:07 ]
>>596
RtlMoveMemoryとか書こうとするから恥かくんだよwww

600 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 11:53:05 ]
599 名前:デフォルトの名無しさん 投稿日:2007/11/20(火) 11:17:07
>>596
RtlMoveMemoryとか書こうとするから恥かくんだよwww




601 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 11:59:51 ]
>>599
なんだ、お前がいいたかったのは結局typoなのか
2ちゃん初心者なのかしらんが、んなことでいちいち粘着すんな、きめえ

602 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 14:25:21 ]
>>600=601
必死だな、お前

603 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 22:19:10 ]
最後に言ったら勝ちだもん系の粘着がくっだらねえことで暴れて見苦しいったらねえな
二度と出てくんなよクズども>>601-602

>>597
君は以前にLFで悩んでた人かね
これ精読すれ
support.microsoft.com/kb/257819/ja/

これを読めばEXCELワークシートにはテーブル定義がないってのが分かるはず
じゃあどうするかって、答は書いてあるから好きに悩んでくれ

604 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 23:11:28 ]
両方宣言すればいいじゃない。
Declare Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

605 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 00:20:30 ]
>>604
これはどうすんだ?
Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlCopyMemory" (Destination As Any, Source As Any, ByVal Length As Long)


606 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 00:33:30 ]
もうどうでもいい

607 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 00:46:00 ]
>>605
kernel32.dllを見てみろ。RtlCopyMemoryなんて存在しない。

608 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 00:52:32 ]
>>607
ほんとだ、なら604の案が無難だな

609 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 09:47:47 ]
Win32APIの知識のない奴ばっか

610 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 10:34:06 ]
609含めて、ね。



611 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 10:56:06 ]
きめぇ

612 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 11:03:04 ]
いつまで続くんだよ・・・
>>571から数えて今日で5日目だぞ・・・

613 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 11:05:44 ]
Nowから「今月の末日の最終秒の日時」を得るにはどうしたら良いでしょう?
「今月の末日の最終秒」は、たとえば今日だと2007/11/30 23:59:59です。

614 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 11:26:19 ]
>>613
来月の1日から1秒ひけばいい。

615 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 11:38:14 ]
DateAdd("s", -1, DateAdd("m", 1, DatePart("yyyy", Now) & "/" & DatePart("m", Now) & "/1"))

616 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 12:02:32 ]
>>612
もうほっとこーぜ。

617 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 13:05:30 ]
>>615
ありがとうございました。
感動しました。

618 名前:デフォルトの名無しさん [2007/11/21(水) 13:20:34 ]
中の値はどうでもよくて、
結合したセル自体を他の場所にペーストして、
結合セルを増やしたい。
簡単そうなのになんでできないんだorz



619 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 16:53:25 ]
>>618
普通にできるけど?
何がしたいんだ?

620 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 01:04:02 ]
Office2002
WindowsXP

AppActivateの使い方がわかりません。
shellの所でタイトルの指定が出来ないです。

どなたかお教え下さい。



621 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 02:14:43 ]
知りません

622 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 03:30:13 ]
>>621
それはすまんかった

623 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 15:29:59 ]
>AppActivateの使い方がわかりません。
よhelp
>shellの所でタイトルの指定が出来ないです。
そのとおり。できない。よhelp


624 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 19:18:11 ]
WSHからApplication.ExecuteExcel4Macroでマクロを呼べますが、
VBAの文を実行する方法はないのでしょうか?
昔は出来たとか聞きましたが

625 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 21:40:00 ]
VBAで関数書いて呼ぶしかないんじゃないかなぁ

626 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:05:31 ]
>>624
今でも出来るよ

627 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:28:46 ]
ひょっとして、application.runが知りたいのか?

628 名前:デフォルトの名無しさん [2007/11/23(金) 22:34:37 ]
CSVファイルをエクセルで開いたときに、
012,345を一つのセルに表示させようとして、
="0120,345"としても"0120,345"としても
元の通りに表示されません。
どうすればよいでしょうか?

629 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:42:31 ]
>>628
VBAの話だったら、CSVファイルの拡張子をtxtにいったん変えて、マクロを記録しながら
読み込むとどうすればいいかわかるかもよ。

630 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:45:26 ]
>>624
var oExcel = new ActiveXObject( "Excel.Application" );
var oWorkBook = oExcel.WorkBooks.Open("C:\\test.xls");
var oModule = oWorkBook.VBProject.VBComponents.Add(1);
var sCode = "sub VBAMacro()\r\n" +
" msgbox \"VBA Macro called\"\r\n" +
"end sub";
oModule.CodeModule.AddFromString(sCode);
oExcel.Run("VBAMacro");
C#のサンプルを参考にしたのでJScriptね



631 名前:629 mailto:sage [2007/11/23(金) 22:47:28 ]
あれ?今手元で実際に試してみたら、ちゃんとCSVファイルをダブルクリックで
普通に読めたけど。
カンマつき数値になるのがいやだってこと?

632 名前:629 mailto:sage [2007/11/23(金) 22:49:43 ]
あ、勘違い。
やっぱり>>629で。

633 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:50:32 ]
>>624
import win32com.client
oExcel = win32com.client.Dispatch('Excel.Application')
oWorkBook = oExcel.WorkBooks.Open('C:/test.xls')
oModule = oWorkBook.VBProject.VBComponents.Add(1)
sCode = 'sub VBAMacro()\r\nmsgbox "VBA Macro called"\r\nend sub'
oModule.CodeModule.AddFromString(sCode)
oExcel.Run('VBAMacro')

Pythonね

634 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:58:28 ]
次はRubyあたりでお願い

635 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:59:26 ]
どの言語でも一緒だろ

636 名前:628 [2007/11/23(金) 23:14:05 ]
>>629
0120,345が、120,345になるのでゼロサプレスされないようにしたいです。
で、,がそのままだと、区切り文字になってセルが変わってしまうので、
それも回避したいのです。
アドバイスありがとうございます。
ちょっとやってみます。

637 名前:628 [2007/11/23(金) 23:23:42 ]
マクロで記録してみましたが、
CSV上は、"0123,456"で保存されていますが、
表示はやはり120,345になります。
セルを文字列形式にして、入力してみましたが
マクロの中身も打ったままになってます。
うーむ簡単なようで、難しいです…

638 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:25:33 ]
拡張子をtxtに変えたか?

639 名前:628 [2007/11/23(金) 23:53:01 ]
>>638
開いたときにウィザード形式で選んで開けるのですが、
マクロを記録した状態で、txtファイルを開くと、
マクロにはBook1!Macro1と表示されるだけで、実行できません。
根本的にやりかたを間違っているのかもしれません。


640 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:58:36 ]
Excelにまかせるとかなり勝手なことされるから
自前でテキストファイル開いてセルに流し込んでる




641 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:02:04 ]
で、"0123,456"はセルに0123,456と表示されたのか?
Yes→根本的にExcel Macroの使い方がわかってないから、これ以上俺からはアドバイスしない
No→やり方が間違ってる。できるはず。だけどやっぱり俺からはもうアドバイス無しね。

じゃ、がんばって。

642 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:04:47 ]
あーひとつだけ追加でアドバイスしとこう。
Excelのバージョン書かないと、やり方を教えようにも教えられないよ。

643 名前:デフォルトの名無しさん [2007/11/24(土) 00:26:29 ]
>>640
DBの項目をCSV形式で出力したものを、
エクセルで開いているだけなので、
出力時にエクセルで開いた時とテキストで開いたときの表示が
同じようにするしかないかな〜と思っています。

>>641
セルには123,456と表示されました。
マクロ使うのは初めてです。
保存先を変更したら記録を残せました。
ファイルをオープンした処理が残っているだけで、
出力に関する記録は残ってませんでした。


>>642
バージョンは2003です。

普通のやり方ではうまくいかないような気がするので、
もうちょっと考えてみます。
アドバイスありがとうございました。


644 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 01:27:31 ]
日本語も勉強してこい

645 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 01:52:37 ]
いや、普通にExcelでオープンすればできるから。
他の板にExcelスレないんか?

646 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 01:55:15 ]
いや、ちょとまて。俺のは2007だから出来てるのかもしれんな・・・

647 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 02:00:56 ]
とりあえず、俺の環境で記録したマクロ貼っとく。Excel2007な。
Sub Macro1()
ChDir "C:\temp"
Workbooks.OpenText Filename:="C:\temp\test.txt", Origin:=932, StartRow:=1 _
, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False, Comma:=True _
, Space:=False, Other:=False, FieldInfo:=Array(Array(1, 2), Array(2, 2)), _
TrailingMinusNumbers:=True
End Sub


648 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 02:02:04 ]
ファイルの内容書き忘れた。
"012,345",1234
"123,456",2345

649 名前:628 [2007/11/24(土) 10:23:33 ]
2003だとこのようなマクロになっていました。

Sub Macro1()
ChDir "C:\Documents and Settings\Owner\デスクトップ"
Workbooks.OpenText Filename:= _
"C:\Documents and Settings\Owner\デスクトップ\Book1.txt", Origin:=932, StartRow:= _
1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=False _
, Space:=False, Other:=False, FieldInfo:=Array(1, 1), _
TrailingMinusNumbers:=True
Columns("A:A").EntireColumn.AutoFit
End Sub

表示は2行で各行1セルでこのように表示されていました。
123,451,234
1,234,562,345

2007の試用版落としてできるか確認してみます。
お手数おかけしました。


650 名前:645 mailto:sage [2007/11/24(土) 11:10:20 ]
さて、Excel2000でもやってみたら、>>647と同じマクロになって、ちゃんとセルに012,345と
表示されたわけだが・・・。




651 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 11:26:48 ]
どうやっても表示形式の問題としか考えられんのだが。。。

652 名前:645 mailto:sage [2007/11/24(土) 11:31:31 ]
あー、わかった。
データの形式を「文字列」に指定して無いでしょ。
マクロで言うと、FieldInfo:=Array(1, 1)の最後の1がデータ形式をあらわしてて、
文字列は、xlTextFormat(=2)を指定する必要がある。

653 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 12:11:35 ]
ああ、そういうオチでしたか。
しかし、その程度のExcelの知識もマクロの知識もなく、調べ方もわからない奴がこの先どうやっていくんでしょうね。

654 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 17:45:54 ]
何かある度にこういう掲示板で聞いては、教えたがりが出てくるのを待つんでしょ? w

655 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 17:55:51 ]
まともな回答が一発で出てこないのが醍醐味ですな


656 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 19:22:35 ]
つ、つられないぞ
俺はそんな質問には、絶対。。。

657 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 16:17:32 ]
平日にばかり質問が集中してるのは

「これですか?ええ!プログラムしちゃいますよ!自分何でも出来ますから!」
とかデカいこと抜かして
「教えてください 大量にあるので終わらないんです・・」
と、ここで教えてくん

そんな寒い背景を想像してしまいます(><

658 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 17:05:47 ]
グラフのプロット点の右クリックからできる
近似曲線の追加って、多項式近似で7次以上やる方法ないのだろうか

659 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 18:13:03 ]
あるよ
やりかたは自分で調べてね

660 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 18:28:31 ]
役に立たないスレw



661 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 18:53:41 ]
そうでもないか

662 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 19:10:54 ]
自分で最小二乗法実装すれば
やりかたは調べたら簡単に見つかる

663 名前:デフォルトの名無しさん [2007/11/26(月) 08:54:48 ]
VBAできる?
って聞かれて、
どの程度だったら出来ますって言って恥ずかしくないんでしょう?

664 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 11:53:02 ]
その質問をした人にそう聞いてみればいいじゃん

665 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 12:00:18 ]
回答者の質が低すぎる

666 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 12:01:44 ]
と、放置されたクレクレくんは怨みを抱いた

667 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 12:55:31 ]
>>666
× と、放置されたクレクレくんは怨みを抱いた
○ と、放置された日本語が変なクレクレくんは怨みを抱いた


668 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:57:05 ]
>>657
別にそれでも全くかまわないけど、お前はかまうの?

669 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 15:02:34 ]
結果出せばいいんです

670 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 18:22:42 ]
ここまで俺の自作自演



671 名前:デフォルトの名無しさん [2007/11/26(月) 19:30:05 ]
WinXP, Excel2000

マクロを起動して
Dim src As Range
Set src = Sheets("Sheet1").Cells.CurrentRegion
Set src = Sheets("Sheet1").Range("a1").CurrentRegion
とすると、srcはどちらのSetでも意図したとおり
たとえば、 $A$1:$C$2 のように設定されます。

しかし、自作関数を起動して同じコードを実行すると、
src.Addressは$1:$65536とか$A$1になります。

最初に起動したのがマクロか関数かによって結果が違っているようなのです。
関数起動で.CurrentRegionの意図した結果を得るにはどうしたらいいですか?

672 名前:671 mailto:sage [2007/11/26(月) 19:42:08 ]
関数起動の場合でも、マクロ起動と同じブックを見ていることは確認しています。
セルの値も合ってました。

673 名前:デフォルトの名無しさん [2007/11/26(月) 19:57:18 ]
(1) xp 2002 旧機
(2) xp 2003 比較的に新機 で、
同一のマクロを実行して(visible、 enableeventsはfalseにしている)、
(1)では6秒
(2)だと12秒
(エクセルのオプション設定も同一です。)

どうしてこんなに、違うのか理由がわかりません。なにか、試してみることがありましたら、教えてください。


674 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 20:02:54 ]
>>673
同一のマクロの内容等にもよる。

675 名前:デフォルトの名無しさん [2007/11/26(月) 20:15:25 ]
マクロは、計算はほとんどなく、条件判断とそれに応じた書き込みです。
calculationをfalseにしたら、その分、かえって遅くなったぐらいです。


676 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 20:19:02 ]
んじゃ
書き込みが遅くなったんじゃね?
書き込みしないで比較したら?
そんなに知りたいならいくらでも調べようがあるでしょ

677 名前:673=675 [2007/11/26(月) 20:22:06 ]
screenupdatingもfalseです。


678 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 20:24:34 ]
>>671
再現する最小構成のブックをうp

>>673
マクロの内容を部分的に伏せたりせず全貼り(何レス消費してもいいよ
orブックごとうp

それが出来ないorしたくないならさようなら

679 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 20:28:29 ]
比較的に新機 とやらのマシンのメモリが足りんとかの落ちじゃ?

680 名前:デフォルトの名無しさん [2007/11/26(月) 20:31:15 ]
>>678
手元にないので、今日はできない。明日気が向いたら、アップするかも。

>>676
中断させて、測ってみます。




681 名前:673 [2007/11/26(月) 20:34:25 ]
あっ、言われてみれば、その可能性があったです。旧機はメモリーを増やしていたw
サンクス


682 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 20:40:42 ]
エクセル以前の問題だな

683 名前:671 mailto:sage [2007/11/26(月) 21:06:09 ]
>680
アンタ何者?
アップする場所がわからないので、ここに書いておきます。
---標準モジュール----ここから
Option Explicit
Sub sample1()
Dim src As Range
Set src = Sheets("Sheet1").Cells.CurrentRegion
Set src = Sheets("Sheet1").Range("a1").CurrentRegion
End Sub
Function fun1() As Integer
Dim src As Range
Set src = Sheets("Sheet1").Cells.CurrentRegion
Set src = Sheets("Sheet1").Range("a1").CurrentRegion
sample1
fun1 = 1
End Function
Sub sample2()
Dim r As Integer
r = fun1()
End Sub
---標準モジュール----ここまで
set のところにブレークポイントを置いておく。
[Sheet1]の中身
A1:C2の範囲に、何か適当に数値を入れる。E5に =fun1() を入れる。

マクロsample1、sample2をステップ実行する。srcをsetしたところでイミディエイトウィンドウに
?src.Address
を入力する。$A$1:$C$2となるのが、意図した動作。
E5のセルを編集して確定すると、fun1内でブレークする。
?src.Address
をしても、$1:$65536とか$A$1になる。sample1の中に入っても同様。

684 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 21:32:11 ]
エクセルのバージョン違うなら当然なんじゃないかと。
気になるなら旧機に2003入れてやって見ろ。

685 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 22:29:12 ]
今ひとつ何がしたいんだかよく分からんけど、
> E5のセルを編集して確定すると

これじゃカレントセルがE5になるから、CurrntRegionが全セルになるんジャマイカ?

686 名前:671 mailto:sage [2007/11/26(月) 22:47:05 ]
>685
E5セルを編集するのは、関数を実行するためのひとつの方法です。
E5を編集しない方法で、関数を実行しても同じ結果になります。

687 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 23:18:24 ]
>>671
union

688 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 01:49:11 ]
何がしたいんだか皆目分からんし解読する気もないけど、とりあえずCurrentRegionに
こだわらずメソッド変えた方が良い>>686

689 名前:671 mailto:sage [2007/11/27(火) 07:57:38 ]
関数起動とマクロ起動とで動作が違うと非常にやっかいなのです。
CurrentRegion以外にも動作が違うものがあるのか?とか
問題が発散してしまうのです。

690 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 08:29:09 ]
関数起動とマクロ起動の違いが原因で起こってる動作の違いじゃないから



691 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 11:13:10 ]
初心者な質問で悪いけど
Range("A1:W引数")って感じに記述したいのですが可能ですか?
出来るなら引数部分の記述方法も教えて下さい

692 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 12:05:11 ]
>>691
普通に文字列の連結でいけます。
Range("A1:W" & 引数)
あと、range(cells(1,1), cells(引数, 23))という書き方もできます。

693 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 15:09:18 ]
> range(cells(1,1), cells(引数, 23))
をやるときは親に注意
初心者がよくやらかす間違いというか失敗です

694 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 15:43:10 ]
worksheet.range(x1, y1, x2, y2)って書き方ができたら良かったのに。

695 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 16:19:34 ]
シートオブジェクトとx1, y1, x2, y2を渡すとその範囲のRangeオブジェクトを返す関数でも作っておけばいいじゃん
アドインなり個人用マクロブックなりに入れておけば、SONOPCでは汎用的に使えるし

696 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 16:30:33 ]
main しか書いたこと nain です

697 名前:デフォルトの名無しさん [2007/11/27(火) 18:33:32 ]
前から、失礼します。
Range("A1:W" & 引数) という書き方は初めて見て、びっりしています。
後ろが出来たら、前も出来そうなんだけど、どう書いたらいいのですか。
今いろいろとやっていても出来なかった。
初心者の失敗とやらも教えてください。

698 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 18:59:36 ]
>>697
それって1+2=を3と教えられて、じゃあ2+1=は?って聞いてる様なもんだぞ
答え(書き方)を聞くんじゃなくて、足し算(文字列の連結)について勉強しろ

699 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 19:07:15 ]
>697
イルカチャンに
複数セルの文字列と数値の結合について
質問してごらん。どのようなことができるか、書いてあるよ。

700 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 19:10:10 ]
Range(chr$(引数 + 64) & 引数 & ":" & chr$(引数 + 64) & 引数)



701 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 19:28:17 ]
Range("A" & 引数 & ":W" & 引数)

702 名前:デフォルトの名無しさん [2007/11/27(火) 20:17:41 ]
サンクス all
>>701 特に。


703 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 21:51:52 ]
次は 1+3 の計算だな w

704 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 00:10:19 ]
Cells(1,1).Formula = "=1+3"


705 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 01:51:55 ]
アドインに記述してあるマクロのキーボードショートカットを
.xlaのままで指定することはできますか?

706 名前:671 mailto:sage [2007/11/28(水) 19:32:51 ]
なぜヘンな動作になるかサッパリわからないので
マクロ起動でデータを設定したときにCurrentRegionして名前をつけ
function起動時は名前を使うこととします

707 名前:671 mailto:sage [2007/11/28(水) 21:10:32 ]
別におかしな現象が起こりました。.findメソッドは、関数起動だとNothingしか返しません。
関数起動だと、セル関係の便利機能は使えないのですか?
そんな制限に関する解説はどっかにありませんか?
発生する例をあげておきます。

シートのA1:A9に1,2,3,4,....と入れておく
標準モジュールはじめ
Option Explicit

Function func1()
Dim found
sub1 Range("A1:A9"), found, 4
func1 = 1
End Function

Sub sub1(r As Range, found, value)
Set found = r.Find(value)
End Sub

Sub substart()
Dim found
sub1 Range("A1:A9"), found, 4
End Sub
標準モジュール終わり

適当なセルに=func1() として関数起動した場合と
マクロsubstartを実行した場合とで、.Findの結果が違います。

708 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 21:16:29 ]
ああ気持ち悪い

709 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 23:25:35 ]
そもそもマクロも関数が実行されるわけだが
関数起動ってのはいったいなんだ?

710 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 23:34:27 ]
セルに=関数()
って入力するやつだろう
本能的にvbaにワークシート関数混ぜるのは避けていたが
正解だった



711 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 23:48:04 ]
>>707
2007でやってみたけど挙動は同じ
とりあえず、おかしな現象とか決めつけないで、
まずはRangeの前のシートを省略してたりするおかしなソースから直したらどうか

712 名前:671 mailto:sage [2007/11/28(水) 23:55:18 ]
>711
簡単のためにシートを略しただけであって、シートをつけても同じです。
.Findのところを
Dim ofst
ofst = Application.Match(value, r, 0)
Set found = r.Cells(ofst)
としたら、関数起動とマクロ起動が同じ動作になりました。。
XP SP2、Excel2000です。

713 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 00:06:17 ]
>>712
シート略したらアクティブシートが変われば結果がかわるじゃないか
両方の動作が同じかどうか本気で検証したいのなら、
操作手順などで結果が分からないようにソース書きなよ

714 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 00:07:36 ]
×結果が分からないように
○結果が変わらないように


715 名前:671 mailto:sage [2007/11/29(木) 00:20:09 ]
いきなり汎用化して考えず、まずはひとつのシートのみが存在するブックで考えています。
ステップ実行して、Rangeオブジェクトのaddressやvalueが同じであることも確認しています。
しかし、.Findの結果が異なるのです。

716 名前:デフォルトの名無しさん [2007/11/29(木) 00:26:03 ]
任意の文字数の文字型変数aaがあって、aaの右側2文字が
G2という文字の場合、その文字を除いた文字を表すようにしたい。
範囲Rの中でやるので、動作が早い文を書きたい。



717 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 00:47:20 ]
IIF(Right(aa,2)="G2",LEFT(aa,LEN(aa)-2),aa)

718 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 01:07:47 ]
>>715
VMwareにXP SP2とExcel2kだけ入れてやってみたら、確かに同じ現象になったよ
原因は分かんないけどOfficeのSPとかあててみたらどうだろうか
単にセルが編集モードになって一部機能制限があるとかなのかもしれんけどね

>>717
それはかなり遅いと思う・・・
こう書くだけで倍くらい早くなるよ

If Right$(aa, 2) = "G2" Then
変数 = Left$(aa, Len(aa) - 2)
Else
変数 = aa
End If


719 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 01:35:26 ]
>>715
support.microsoft.com/kb/170787/ja
www2.moug.net/bbs/exvba/20070914000025.htm

720 名前:671 mailto:sage [2007/11/29(木) 02:10:19 ]
>719
ありがとうございます。
関数起動の場合は、input以外のセルは見ないほうがいいのですね。
ということは、今動いているように見えるinput以外のセル参照も止めたほうがいいですね。

inputのRangeに対しては、.Findは使えるのかな?
.CurrentRegionの結果を含有するような範囲をinputに入れれば.CurrentRegionは使えるのかな?

実験して後で報告します。



721 名前:691 mailto:sage [2007/11/29(木) 09:40:46 ]
回答してくれた人達、ありがとうございます。
もう一つ気になったのですがフォームに配置したテキストボックスとかにインデックスはつけられないんです

722 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 10:02:50 ]
>>720
> 実験して後で報告します。

いや、もういいから。
結果は君の心の中に・・・。


723 名前:デフォルトの名無しさん [2007/11/29(木) 11:11:33 ]
文字列群の中から、特定の文字を含む文字列を検索するのは
Likeでいいのでしょうか?

724 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 11:21:23 ]
それでもいいけど、instrという関数も用意されてる

725 名前:デフォルトの名無しさん [2007/11/29(木) 12:59:11 ]
>>724
If InStr(xxx, "x") > 0 Then
ですね?
ありがとうございます。

726 名前:デフォルトの名無しさん [2007/11/29(木) 18:57:16 ]
checkMsg.okMsg = Range("A1").Value

上みたいに、変数同士を、ピリオドでくっつける(?)のは
何でググったら分かりますか。名称とか使い方とか・・・

727 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 19:03:23 ]
>>726
おそらくcheckMsgとokMsgの両方に同じ値を入れるのを
1ステートメントでやりたいんだろうけど、そういう構文はVB、VBAには存在しないよ
存在しないんだから、何でググっても無駄

checkMsgが親(Classとか)でokMsgがプロパティだってなら話は別だけど

728 名前:デフォルトの名無しさん [2007/11/29(木) 19:10:20 ]
>>727
ありがとうございます
ちゃんと動いているからw、後者っぽい・・・
CSVを取り込んで、シートに並べるプログラムなんですよね

729 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 21:34:00 ]
変数に代入されてる値はなに?

730 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 22:45:22 ]
>>726
ユーザー定義型
他言語で言うところの構造体



731 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 23:44:49 ]
新規にワークブックを作成するとき、

Set (オブジェクト変数) = Workbooks.Add

とすると、(オブジェクト変数)で操作できるけど、
既にあるExcelファイルを、(オブジェクト変数) にしたいときはどうすればいいの?

732 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 01:23:11 ]
thisworkbookやらactiveworkbookやら
Workbooks("hoge")やら

733 名前:716 [2007/11/30(金) 01:30:58 ]
>>717 >>718
サンクス。昨夜は寝てしまったw

お礼を兼ねて、以下、折れの意見
iif文は10年以上前、dbxlだったか、lotusかexcelであったかわからないが、よく使っていた。
今年、久々にexcelを扱うようになって、調べて、iif文は使えない(使われていない)ものと思っていた。
iif文を使えるためには入れ子でエラーを発生させない論理力が特に大事だが、入れ子が深くなるほど、if文より早いため、高速if文と呼ばれていたよw
今回、for each文で、2万セルで試して見た。セル状況にも寄るが概して、iif文の方がif文よりも少し早いと言えるね。


734 名前:デフォルトの名無しさん [2007/11/30(金) 02:03:56 ]
質問です。
◆やりたいこと
下記関数に、仮にA1:D10範囲のグラフデータを渡すとした場合
関数内部でA1:B10とA1:C10とA1:D10と1行づつずらして
複数の散布図を作成したい
◆わからないこと
rangeから1行取得し、ずらすというやり方がわからず、
下記コードの?の部分をどうするか悩んでいます。
宜しくお願いします。

function グラフ作成(rng as range)as boolean
'rangeから
for i=0 to ?
range1=?
range2=?
union(range1,range2)
'散布図作成(省略)
next i
End Function


735 名前:デフォルトの名無しさん [2007/11/30(金) 02:49:05 ]
>>729
代入する値は自由に設定出来る。
んで、代入した値がinputしたcsvに有るか無いかで
そのcsvの素性を判断するような感じ。

736 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 05:02:22 ]
>>733
IIFのほうがIFより遅い
セル状況にもよるとか意味不明


737 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 06:00:15 ]
そもそも階層なんてなるべく浅くするもんだが

738 名前:734 [2007/11/30(金) 08:58:37 ]
>>734
わかりずらかったので加筆します。
Rng=Range(A1:D10)から
Rng1=Range(A1:A10)を
一行だけ取り出す方法はあるのでしょうか?
もしなければ他の方法があれば教えてください

739 名前:デフォルトの名無しさん [2007/11/30(金) 09:58:28 ]
ユーザー定義変数+二次元配列

これをがんばって(`・ω・´)習得する。

740 名前:moge mailto:sage [2007/11/30(金) 10:14:58 ]
>>738
range("A1:D10").columns(1)



741 名前:デフォルトの名無しさん [2007/11/30(金) 11:34:43 ]
Dim A() as variant
Dim a as intger
Dim x as integer
ReDim A(x) as variant
x=0
a=1

Do while cells(a,1) <> ""
A(x)=cells(a,1).value
x=x+1
a=a+1
Loop

cells(5,5)=A(x)+A(x-1)+A(x-2)

とやりたかったのですが、
A(1)になった時にA(0)に入った値が消えています。
どこが間違っているのか御教示ください。
よろしくお願いします。

742 名前:moge mailto:sage [2007/11/30(金) 11:59:34 ]
>>741
もう間違いだらけで、指摘何か無意味

743 名前:デフォルトの名無しさん [2007/11/30(金) 13:28:44 ]
>>742
ありがとうございます。
自力で少しずつ直しています。
Dim A() as variant
Dim a as intger
Dim x as integer

x=0
a=1

Do while cells(a,1) <> ""
ReDim Preserve A(x)
A(x)=cells(a,1).value
x=x+1
a=a+1
Loop

こんな感じで実物はうまく回るようになったと思います(ミスはまだありそうですが)

744 名前:moge mailto:sage [2007/11/30(金) 13:30:57 ]
あのさー、VBAのエディタからコピペしろよ。
それとoption explicitもしろ

745 名前:デフォルトの名無しさん [2007/11/30(金) 14:11:57 ]
英語の大文字、小文字って使い分けられるんでしたっけ。

まぁintgerは、ペタバイトの容量を扱える超変数定義だけど

746 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 14:39:17 ]
しかしVBAのエディタっていつまでたっても進歩しないな
VisualStudioはタブ付いたり、関数折畳んだり出来んのに
VBAときたらいまだにホイールころころも出来ないとか・・・

>>743
最低限、コンパイルが通るソースを示しましょう
メニューの[デバッグ]→[VBAProject のコンパイル]を選択すれば確認できます

747 名前:moge mailto:sage [2007/11/30(金) 15:34:40 ]
mousewheel fixくらいは、デフォルトでfixしとけってことだな

748 名前:デフォルトの名無しさん [2007/11/30(金) 20:13:25 ]
>>740

>>738
> range("A1:D10").columns(1)
ありがとうございます。
しかしうまくいきませんでした。
列番号が返ってくるみたいです。

>>739
その方法も考えましたが別の問題がありやめました。
そるはRangeではなく、配列データから、グラフを描けるやり方がわからないのです。

できれば簡単そうなRangeで解決できればと考えています。


749 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 20:20:42 ]
>>748
返ってくるのはrangeだよ。
「列番号」って何だよ。

750 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 20:28:38 ]
なんか同じような質問が多いな。
unionなんか使う必要ないんじゃね?ダイレクトに始点と終点を指定してrangeを作れよ



751 名前:デフォルトの名無しさん [2007/11/30(金) 21:08:05 ]
コンパイルでエラーがでるのでヘルプをみたのですが、勘違いみたいです。
A1:D10からA列とC列のような飛び飛びの列からも散布図を描きたいので。
あとできるかぎり関数内で閉じていたいので関数へ引き数でRangeを渡して内部で計算したいのです。
なのでrng=Range("A1:D10")を引き数で渡して、
内部でSet rng1=Range(UNION(Range("A1:A10"),Range("C1:C10")))範囲をグラフデータにセットしたいのです。
そのためにRange("A1:A10")の一列をrngから取得したいと考えています。

752 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 05:56:40 ]
もやは、釣りなのか何なのかわからなくなってるが。
VBAのIDEでCtrl+Gしてから次のコードを実行してみろ。

Set Rng = Range("A1:D10")
Set Rng1 = Rng.Columns(1)
Set Rng2 = Rng.Columns(3)
Set Rng3 = Union(Rng1, Rng2)
Debug.Print Rng.Address
Debug.Print Rng1.Address
Debug.Print Rng2.Address
Debug.Print Rng3.Address

753 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 13:16:12 ]
>>752
できました。sを付け忘れていました。ありがとうございました

754 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 15:43:38 ]
初心者のお願いで大変恐縮なのですが、次の動作をするためにはどのようなマクロを組めばよろしいのでしょうか?
どなたか御教示いただけませんでしょうか?

1.A列各行にあ入力済みの数値(入力数はデータにより一定ではない)を
  B列とC列とを結合したセルにコピー(表の体裁上、結合しています)
2.コピー先の行間は表の関係から8行ずつ空ける
3.この一連の動作を行う回数はA列に値が入っている数とする(=count(A:A))

今までは回数指定もできず、下記の超初心者な式を必要分だけコピー、修正していたのですが
データ数が多い場合、この修正作業自体がミスを誘発してしまうので、もっと機械的に
処理できるようなマクロを使いたいと思っています。

Range("A1").Copy Range("B1:C1")
Range("A2").Copy Range("B10:C10")
Range("A3").Copy Range("B19:C19")
        ・
        ・
        ・
私の能力では、本を見てもネットで調べてもわかりませんでした。
どうぞよろしくお願いいたします。


755 名前:754 mailto:sage [2007/12/01(土) 15:45:16 ]
スミマセン。↑
A列各行にあ入力済み→A列各行に入力済み
です。

756 名前:731 mailto:sage [2007/12/01(土) 16:05:50 ]
>>732
やっぱりそれしかないのか。

757 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 16:44:45 ]

a=要素数をセット
b = 1
for j=1 to a
Range( "A" & j ).Copy Range("B" & b , ":C" & b)
b = b + 9
next

758 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 17:28:46 ]
>>757

> Range( "A" & j )
質問者ではないが横から失礼。
これいつも困るんだけど英語の部分が変数のときはどうしていますか?

759 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 17:39:14 ]
cells(j,k)

760 名前:デフォルトの名無しさん [2007/12/01(土) 18:01:57 ]
Excel Hack
ttp://www.amazon.co.jp/gp/product/4873113474/



761 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 19:20:13 ]
>>754
値だけでいいならB1:C1に =OFFSET($A$1,(ROW()-1)/9,0) って入れて
B1:C9を選択してフィルコピーすれば済むと思うんだけど

どうしてもVBAで書式までコピーしたいならEndプロパティ使ってA列のデータ末尾取得して
その範囲に対してFor Each回し、初期値を1にした変数使って
Cells(変数, 2).MergeAreaにコピーした上で、変数の値を9増加してやればいいだろ

これで解らないようなら>>2★5ね

762 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 19:34:12 ]
>>758
Dim hoge As String
hoge = "A"
Range(hoge & 1)
とか?

763 名前:754 mailto:sage [2007/12/01(土) 20:09:56 ]
>>757
>>761

お陰様で、うまく機能するようにできました。
ありがとうございました

764 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 22:06:52 ]
>>762
変数に、Aとかでなく数値でもってるとき。
具体的な書き方がわからず悩んだことがあって。

765 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 22:22:58 ]
>>764
つ Chr(変数)

766 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 23:23:09 ]
真に受けないように

767 名前:デフォルトの名無しさん mailto:sage [2007/12/02(日) 00:17:56 ]
昔Niftyで配布されてた、お宝ファイルって誰か持ってませんか?

768 名前:デフォルトの名無しさん mailto:sage [2007/12/02(日) 00:31:53 ]
持ってるかどうかは解らないが持っていたのは確か
削除した記憶はないから何処かに残ってるだろうが
探すの('A`)マンドクセ
少なくとも内蔵HDDには入ってないだろうから

769 名前:デフォルトの名無しさん mailto:sage [2007/12/02(日) 00:36:41 ]
>>764>>759で駄目な理由はあるの?

770 名前:デフォルトの名無しさん mailto:sage [2007/12/02(日) 00:52:23 ]
>>769
つ Chr(変数 +64)



771 名前:デフォルトの名無しさん [2007/12/02(日) 03:43:08 ]
質問です。よろしくお願いします。
excel に対しADOで接続したとき、そこでデータベース的にデータをadd/updateできるのは
普通の使い方ですが、このときデータではなく、関数を挿入することって出来ますか?

普通ならformula関数で関数をセットするところを、ADO経由で行うことが出来ますか?という質問です。



772 名前:デフォルトの名無しさん mailto:sage [2007/12/02(日) 07:48:04 ]
Function プロシージャを使いなさい。

773 名前:デフォルトの名無しさん mailto:sage [2007/12/02(日) 09:57:08 ]
>>770 AA列とかどうするんだよw

774 名前:デフォルトの名無しさん [2007/12/02(日) 10:44:52 ]
>>773
つ Chr(変数1 +64) &Chr(変数2 +64)


775 名前:デフォルトの名無しさん mailto:sage [2007/12/02(日) 11:55:04 ]
ダメすぎ。

776 名前:デフォルトの名無しさん mailto:sage [2007/12/02(日) 14:05:08 ]
>>771
自己レスです。ADOだけでは無理だとしても、

excel側に、"="で始まる文字列データを見つけたら関数につっこみ直すというプロシジャを用意しておき、

ADOでとりあえずいったん"=..."の関数を意味する文字列を作って、それを文字列データとして
フィールドにセットしてから、用意したプロシジャをたたけばいいのかなと考えました。それでやってみます。



777 名前:デフォルトの名無しさん mailto:sage [2007/12/02(日) 17:10:37 ]
> 普通ならformula関数で関数をセットするところを

いや、普通じゃないから
普通はRange(Cells)オブジェクトのFormulaプロパティを使うから
ADOを使う意味なんて全くない、どころかデメリットしかない

778 名前:デフォルトの名無しさん mailto:sage [2007/12/02(日) 18:47:49 ]
>>767
昔のお宝なんて今は常識みたいなものだから、分かってる人には必要ない。
俺の書き込みもお宝に多数取り上げられたが、今では全然たいしたことないテクニックばかり。

779 名前:デフォルトの名無しさん mailto:sage [2007/12/02(日) 19:35:19 ]
>>773-775
つ IIf(変数 > 26, Chr(CInt((変数 - 1) / 26) + 64), "") & Chr(((変数 - 1) Mod 26) + 65)


780 名前:デフォルトの名無しさん mailto:sage [2007/12/02(日) 20:48:40 ]
>>779
しつこい



781 名前:デフォルトの名無しさん mailto:sage [2007/12/02(日) 21:57:03 ]
>>779
だめだめだな

782 名前:デフォルトの名無しさん mailto:sage [2007/12/02(日) 23:56:25 ]
>>778
特定されるからどの章かは言わないけど、かつてとある章を編集してどんな内容だったか
見たいんです。
この間、HDDが壊れて、このスレ読んでてバックアップしたCD-R読もうとしたら読めなかったorz

783 名前:デフォルトの名無しさん mailto:sage [2007/12/03(月) 00:25:07 ]
>>782
日本語でOK

784 名前:デフォルトの名無しさん mailto:sage [2007/12/03(月) 00:36:50 ]
ファイルを保存していたHDDが壊れて、そのファイルの存在を忘れてたので気にならなかったんですが、
このスレを読んでいてその存在を思い出して、バックアップしたCD-Rから読もうとしたけど読めなかったんです。

785 名前:デフォルトの名無しさん mailto:sage [2007/12/03(月) 06:50:42 ]
いや、だから日本語で(ry

786 名前:exc [2007/12/03(月) 07:20:43 ]
>>783
>>785
どうして日本語じゃないと思ったの?

787 名前:デフォルトの名無しさん mailto:sage [2007/12/03(月) 07:22:51 ]
自分が読めなかったからだろ。
書くほうも読むほうも語学力無さ過ぎだな。哀れ。

788 名前:デフォルトの名無しさん mailto:sage [2007/12/03(月) 09:45:24 ]
バックアップしたCD-Rが読めなくなっていてリストアできないから、
誰かファイル持ってませんかってことだろ。

789 名前:デフォルトの名無しさん mailto:sage [2007/12/03(月) 09:52:53 ]
当時参加してた人にお願いしてみるとか。
Office Tanakaの中の人とか。

790 名前:デフォルトの名無しさん mailto:sage [2007/12/03(月) 13:28:48 ]
あー、俺も持ってた(けど、どっかいった)
MS Help形式で結構便利だった気がする



791 名前:デフォルトの名無しさん mailto:sage [2007/12/03(月) 13:50:24 ]
>かつてとある章を編集してどんな内容だったか見たいんです。

日本語で(ry

>このスレ読んでてバックアップしたCD-R読もうとしたら読めなかったorz

日本語で(ry

792 名前:デフォルトの名無しさん mailto:sage [2007/12/03(月) 14:23:24 ]
なんで粘着してんだこいつ

793 名前:デフォルトの名無しさん mailto:sage [2007/12/03(月) 15:40:05 ]
質問があります。以下のようなプログラムがあるのですが、
この場合のWithってどういう意味なのでしょうか?
With Range("a1")
Do
If F = False Then Exit Do
i = (i + 1) Mod 10
.Value = i
DoEvents
Loop
End With
実行すると、A1にiの値が表示されます。
Range("B5").Value=i と同じ意味になるのでしょうか?
なぜ、Withを使うのでしょうか?

794 名前:デフォルトの名無しさん mailto:sage [2007/12/03(月) 15:47:25 ]
もしかしてキャッシュしてるのかなあ
一旦Range("a1")を変数に代入するのと同じなのか、
Range("a1").Valueと毎回指定するのと同じなのか
実際どっちなのかは知らないから俺も教えてほしい

795 名前:デフォルトの名無しさん mailto:sage [2007/12/03(月) 15:47:56 ]
>>793
read the fucking manual

796 名前:デフォルトの名無しさん mailto:sage [2007/12/03(月) 15:51:35 ]
>>784
後でうpする

797 名前:796 mailto:sage [2007/12/03(月) 16:56:49 ]
持ってるはずだけど、見つからなかったのでうp断念

798 名前:デフォルトの名無しさん mailto:sage [2007/12/03(月) 18:23:03 ]
With Range("a1")

→ .Value = i

End With

withは記述を簡略化できる。
本来 Range("a1").Value = i と書くべき所、withからEnd Withの間は .Value = i と書くだけでおk
Range("a1")の分書くのが楽になったんだぜ☆(ゝω・)v

799 名前:デフォルトの名無しさん mailto:sage [2007/12/03(月) 18:28:45 ]
速度が早くなる。
『高速化 VBA』 で検索したらいろんな方法が学べるよ

800 名前:793 mailto:sage [2007/12/03(月) 18:54:43 ]
>>794 >>798 >>799
ありがとうございました。
そういった意味合いがあったんですね。凄く理解できました。

>>794
No!



801 名前:デフォルトの名無しさん mailto:sage [2007/12/03(月) 19:39:52 ]
まぁ、そういう意味じゃ>794の前者だな。

802 名前:デフォルトの名無しさん mailto:sage [2007/12/03(月) 20:49:50 ]
set r = Range("A1")
r.Value = i
とどちらが速いですか?


803 名前:デフォルトの名無しさん mailto:sage [2007/12/03(月) 21:08:45 ]
試せよ

804 名前:デフォルトの名無しさん mailto:sage [2007/12/03(月) 21:19:18 ]
ここの質問者は、自分で出来ること(試せること、調べられること)すら
やろうとはせず、「調べても解りません、困ってます」とか言い出す

805 名前:デフォルトの名無しさん mailto:sage [2007/12/03(月) 21:23:11 ]
>>802
そっちの方が断然速い

806 名前:デフォルトの名無しさん mailto:sage [2007/12/03(月) 21:33:43 ]
1文字変数は馬鹿の所業

807 名前:デフォルトの名無しさん mailto:sage [2007/12/03(月) 21:37:05 ]
>>794
試せよ

808 名前:デフォルトの名無しさん mailto:sage [2007/12/03(月) 21:44:01 ]
>>806
残念、ハズレ

809 名前:デフォルトの名無しさん mailto:sage [2007/12/03(月) 21:46:34 ]
どうしてレベルの低い奴しか来なくなったんだろう

810 名前:デフォルトの名無しさん mailto:sage [2007/12/03(月) 21:48:30 ]
RTFM



811 名前:デフォルトの名無しさん [2007/12/03(月) 22:04:32 ]
2007つかえねー

812 名前:デフォルトの名無しさん [2007/12/04(火) 09:03:23 ]
下記グラフの生データからVBAのみで度数分布図を作成したいと考えています。
区間0.000〜0.400、区間数n=4として
Data(2,10)AS Variant
rng AS Range
gdata(4,2)AS Variant
rng=Range("A1:B10")
Set Data(2,10)= rng '←@この代入は可能ですか?
(ここでいろいろ計算した結果下記のグラフ作成データが得られるとする)
gdata=Array({0.000,0.100,0.200,0,300},{1,3,4,2})
Chart.Add
〜Source gdata '←Aグラフデータ設定方法はRangeでなくても可能ですか?
以下Chart.Typeを棒グラフに設定
〜〜
-------
Range("A1:B10")の範囲に
選手,打率
松井,0.352
古田,0.221
新井,0.153
間中,0.262
亀井,0.301
田中,0.192
萩原,0.153
喪菜,0.082
田淵,0.274
井坂,0.225


813 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 09:33:43 ]
配列への代入は、配列へのポインタを示せばいい

Data = rng.value

814 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 12:58:43 ]
>>806
お前時代遅れのハンガリアンとか使ってない?
あとコメントもだらだらと毎行書いてそうだなw

815 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 13:12:53 ]
一文字変数くらいで読みにくくなるような長い関数を書くのが間違い

816 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 13:39:03 ]
iがIntegerなのは普通
rがRangeなのも普通

817 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 13:49:06 ]
グローバル変数に3文字省略名とか付ける奴は死刑

818 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 14:24:52 ]
for each c in r

819 名前:デフォルトの名無しさん [2007/12/04(火) 17:53:15 ]
r でなく、rng の折れは死刑かwww


820 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 18:12:42 ]
>>814
JAVAみたいになんでもクラスな言語でハンガリアンの型表現は意味ないが
VBAでハンガリアンが時代遅れとか関係ないだろ
時代遅れって・・・流行りでやってるとでも思ってんのかよw



821 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 18:28:31 ]
カスコーダーがいくら力説したところで、コーディング規約を考えてないヤツはカス
しかも正当化にまで至ってるのはカスを越えてクズだな

822 名前:sage [2007/12/04(火) 18:46:15 ]
SolverのShowRef(マクロ実行)って死んでるの?


823 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 19:01:14 ]
%&@!#$

824 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 19:08:44 ]
>>820
クラスの中はふつーJAVAでもハンガリアンだろ

825 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 19:54:35 ]
一文字変数だがiとかcは普通だしExcel VBAのヘルプでも使ってるぞ?
オマイは
For lngCounter = 1 To lngLastRow
などとやりそうだなw

826 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 20:26:31 ]
>>821
俺はそこらのカスとチームは組まないからコーディング規約などない
一人で勝手に作って納入してる

827 名前:デフォルトの名無しさん [2007/12/04(火) 20:41:49 ]
VBAをチームでコーディングw
釣りだとしてもおもしろすぎ

828 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 20:45:34 ]
規模次第で珍しくもないが

829 名前:デフォルトの名無しさん [2007/12/04(火) 20:51:51 ]
はいはい、すごいねー
わざわざVBAでコーディングすることもあるよねー

830 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 20:57:27 ]
客がデータ加工されてるシート欲しがるんだから
わざわざもないだろw




831 名前:デフォルトの名無しさん [2007/12/04(火) 21:04:35 ]
Month(Date)、Day(Date)から文字として、5月4日の場合、05や04をを得るにはどう書けばいいですか。

832 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 21:10:43 ]
format で mmやddにして、さらに Cstr で文字に

833 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 21:13:36 ]
俺もよくチームがコーディングでVBAしてる
欲しがるから仕方ない

834 名前:デフォルトの名無しさん [2007/12/04(火) 21:16:57 ]
ま、可読性を考えずにコードを組むやつに利口なやつはいない

これだけは真理だな

835 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 21:19:42 ]
下層のプログラマーの愚痴だろどうせ
楽できるからな

836 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 21:27:27 ]
>>827
最下層の会社にしかそんな依頼は来ないが
そういう依頼が来ることがあるのは確かだよ

837 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 21:42:32 ]
Accessあたりじゃチーム案件も珍しくないけどな


838 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 22:02:35 ]
俺もよくチームがコーディングでAccessしてる
珍しくないから仕方ない

839 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 22:10:53 ]
自分のやってることは珍しいことではない

そう思い込んで安心したいのは人間の真相心理です
その逆で、人とは違うことをしたいという心理も、主に幼い頃や若い頃にはありますが


840 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 22:11:08 ]
あほだなむしろコーディング効率のいいVBAのほうが
大きな仕事に向いてるだろ
小さなプログラムの最適化は他の言語だろうが



841 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 22:44:28 ]
>>832
formatは文字型を返すんだが。

842 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 22:45:58 ]
>>841
CStr(Format(Day(Now()), "dd"))は駄目?

843 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 22:49:49 ]
Format$(now(),"mm")
Format$(now(),"dd")

844 名前:831 [2007/12/04(火) 22:57:44 ]
>>832さんへ
お礼に出来たものを書きます。
いろいろやってみて、最終的なものと思います。

Format$(Date,”mm dd”)
これで、今日なら、12 04と返してくれます。
いろんな応用を調べていました。おもしろいです。


845 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 23:04:31 ]
質問です
ユーザーフォームへのドラッグ&ドロップでファイルパスを取得するやり方を教えてください

846 名前:デフォルトの名無しさん mailto:sage [2007/12/05(水) 00:14:01 ]
VBAはパーソナルユースだと思ってた。

847 名前:デフォルトの名無しさん mailto:sage [2007/12/05(水) 00:24:25 ]
>>846
無茶させようとする人がいるのと、実際に無茶できるのが
悲劇の始まり。

848 名前:デフォルトの名無しさん mailto:sage [2007/12/05(水) 08:57:26 ]
>>834
よくコメントを書きまくれば可読性が上がると思い込んでるアフォがいるよな
コメントは少ない方が可読性は上がるということが分からないらしい

849 名前:デフォルトの名無しさん mailto:sage [2007/12/05(水) 10:03:23 ]
レベル低すぎー

850 名前:デフォルトの名無しさん mailto:sage [2007/12/05(水) 10:50:21 ]
>>848
ケースバイケースだな
ビジネスロジックの部分にコメント入れないのはダメダメだ



851 名前:デフォルトの名無しさん mailto:sage [2007/12/05(水) 11:14:08 ]
スレタイ嫁

852 名前:デフォルトの名無しさん mailto:sage [2007/12/05(水) 15:04:52 ]
2つのシートを比較して吐き出そうとしてるんだけど、怒られる。

Sub conpare()

Dim fromRange As Range
Dim toRange As Range

For Each fromRange In Worksheets("Sheet1").Range("E5:E132")
For Each toRange In Worksheets("Sheet2").Range("A1:A43")
If StrComp(fromRange.Value, toRange.Value, vbTextCompare) = 0 Then
Cells(fromRange.Row, 6).Value = "○"
End If
Next toRange
Next fromRange

End Sub

For Each fromRange In Range("E5:E132")
は通るんで、Worksheetsの使い方が悪いんだろうけど、良く分らん

853 名前:デフォルトの名無しさん mailto:sage [2007/12/05(水) 15:13:06 ]
・compare
・誰にどう怒られるのか
・要求仕様を明確に

854 名前:デフォルトの名無しさん mailto:sage [2007/12/05(水) 15:22:14 ]
そりゃあんた、その辺で吐き出そうとしているんだから掃除のおばちゃんに怒られるんだよ。

855 名前:デフォルトの名無しさん mailto:sage [2007/12/05(水) 15:26:50 ]
すまん。自己解決。
Worksheets("Sheet1")
sheet1に名前付けてたからそっちの名称じゃないと見つからんのな

856 名前:デフォルトの名無しさん mailto:sage [2007/12/05(水) 22:21:53 ]
(/∇≦\)アチャ-!ミテランナイ

857 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 09:19:46 ]
自分の恥ずかしさが?

858 名前:デフォルトの名無しさん [2007/12/06(木) 14:59:15 ]
デバックで、ステップ実行した時とそれ以外では結果が違うのです。
ステップ実行:きちんとセルに値が入る
普通に実行:セルは空欄のまま

プログラムには触っていませんがこのように結果が変わってきます。
どのような原因が考えられますか?

859 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 15:03:11 ]
考えられません

860 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 15:15:51 ]
>>858
その説明、漠然としているので原因なんて推測できないっすね。
多分なんかすっとぼけてるだけのような気がしますけど。。。
解決したらちゃんと教えてくださいね。



861 名前:858 [2007/12/06(木) 15:42:37 ]
わかりました。
漠然としてて申し訳ないです。

原因はExcelシートを指定してなかった為でした。
cells(x,y)
 ↓
objExcelSheet.cells(x,y)
で思った通りに動いてくれました。

ありがとうございます。

862 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 16:54:48 ]
過去数年間の見積りをEXCELでデータベースにしてあるのですが、リンクが無く
いくらデータベース化してても、結局サーバ内のファイルを手動で見に行くようになっています
そこでハイパーリンクを使ってセルクリックで開くようにしたいのです

サーバには↓のような感じで保存されていています
\\鯖\見積り\○×商事\H19年\ABC-001 複合プリンター一式.xls

今までのは手動でいれるしかないとしても、今後は登録する時に一緒にリンクをはっておきたいのです
つまり登録する時にあるセルに

=HYPERLINK("ファイルの保管場所",開く)

と記入したいのですが、いちいちファイルのプロパティから保管先をコピーするのが辛く…
VBA等でそういうのを入手する方法は無いでしょうか?

(ファイルを開くみたいな動作で保管先をクリップボードに読み出せるだけでもOKです)

863 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 16:58:35 ]
説明がドヘタすぎて理解できん

864 名前:デフォルトの名無しさん [2007/12/06(木) 18:23:16 ]
書くなら、理解できないことを書いてみればよいのにwww


865 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 18:37:21 ]
Dim あ As String
Dim い As String
Dim う As New DataObject

あ = "Excelファイル (*.xls),*.xls,CSVファイル (*.CSV),*.CSV,テキストファイル (*.TXT),*.TXT"
い = Application.GetOpenFilename(あ, 1, "ファイル名取得")
If い = "" Then Exit Sub
With う
.SetText い
.PutInClipboard
End With
>(ファイルを開くみたいな動作で保管先をクリップボードに読み出せるだけでもOKです)
はいはい解決解決

866 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 19:41:22 ]
コマンドボタンを押すとテキストボックスに入力された数字を読んで、
判定結果をラベルに表示するというプログラムを作りたいのですが、
テキストボックスの入出力やラベルへの入出力の文がわかりません。
調べ方が悪いのか、自分で解決できなくて困っています。
どなたか教えていただけませんか?

だらだらとわかりにくくてすみません。

867 名前:866 mailto:sage [2007/12/06(木) 20:00:16 ]
変数 = TextBox1.Value
で数字を読めることがわかりました。
Range("a1").Value = 変数 
で変数の値を表示させたらテキストボックスに入力した
まま表示されたので、よかったです。
引き続きラベルに表示させようとしていますが、
Label1.Value = 変数 
では「プロパティかメソッドをサポートしていません」と言われます・・・。

もうちょっと色々試してみます。

868 名前:デフォルトの名無しさん [2007/12/06(木) 20:16:46 ]
ファイルAがアクティブならば次の作業へ
開いてなければファイルAを開く 
という文章が上手くいきません。。

教えてください、お願いします。



869 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 21:10:59 ]
これはひどい

870 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 21:23:45 ]
>>867
LabelはCaptionだろ。インテリセンス使え。F1押せ。ヘルプ見ろ。

>>868
アクティブって何だ?誰がアクティブにするんだ?



871 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 21:24:32 ]
ファイルAが開いてない状態でマクロを実行すると
処理前にファイルAを開く
でいいんじゃないかな

872 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 21:28:02 ]
誰がおーぷんするんだよ?

873 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 22:13:32 ]
conpareの人です。
Sub compare()

 Dim fromRange As Range, toRange As Range, Str As String, flag As Boolean

 For Each fromRange In Worksheets("Result").Range("E5:E132")
  flag = False
  For Each toRange In Worksheets("sheet1").Range("A1:A43")
   If StrComp(fromRange.Value, toRange.Value, vbTextCompare) = 0 Then
    flag = True
   End If
  Next toRange
  If flag = True Then Cells(fromRange.Row, 7).Value = "○" Else Cells(fromRange.Row, 7).Value = "×"
 Next fromRange

End Sub

Sub compare2()

 Dim fromRange As Range, toRange As Range, Str As String, flag As Boolean

 For Each fromRange In Worksheets("Result").Range("E5:E132")
  flag = False
  For Each toRange In Worksheets("sheet2").Range("B1:B80")
   If StrComp(fromRange.Value, toRange.Value, vbTextCompare) = 0 Then
    flag = True
   End If
  Next toRange
  If flag = True Then Cells(fromRange.Row, 8).Value = "○" Else Cells(fromRange.Row, 8).Value = "×"
 Next fromRange

End Sub

874 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 22:13:42 ]
>>868
もっと句読点を使ってみたらどうでしょう

875 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 22:19:27 ]
この2つをまとめる事って出来るでしょうか?


876 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 23:11:31 ]
金玉のこと?

877 名前:866 mailto:sage [2007/12/07(金) 00:54:18 ]
>>870
出来ました!ありがとうございました!
ヘルプも見るくせを付けていきます、重ねてありがとうございました。

878 名前:873,875 mailto:sage [2007/12/07(金) 14:32:10 ]
自己解決

 Dim tempRange(2)

 tempRange(1) = Worksheets("sheet1").Range("A1:A43")
 tempRange(2) = Worksheets("sheet2").Range("B1:B80")

て出来ますね。これでまとめる事が出来ました

879 名前:デフォルトの名無しさん mailto:sage [2007/12/07(金) 14:46:30 ]
で、今度はワークシートでなく、出力されたcsvデータで比較しようとしました。
csvをワークシートとして開けた場合、展開されるのはsheet1が暗黙の了解だろうと
set tempRange = workbooks("temp.csv").Sheets("sheet1").Range("A1:A700")
と設定したのですが

Sub compare()

 Dim fromRange As Range, toRange As Range, tempRange As Range, Str As String, flag As Boolean
 workbooks.Open Filename:="D:\temp.csv", Format:=1
⇒set tempRange = workbooks("temp.csv").Sheets("sheet1").Range("A1:A700")

 For Each fromRange In Worksheets("Result").Range("E5:E132")
  flag = False
  For Each toRange In Worksheets("sheet2").Range("B1:B80")
   If StrComp(fromRange.Value, toRange.Value, vbTextCompare) = 0 Then
    flag = True
   End If
  Next toRange
  If flag = True Then Cells(fromRange.Row, 8).Value = "○" Else Cells(fromRange.Row, 8).Value = "×"
 Next fromRange

と、すると⇒で「インデックスが有効範囲にありません。(Error 9)」と怒られます
開け方悪いですかね?
set tempRange = workbooks("temp.csv").Worksheets("sheet1").Range("A1:A700")
でも怒られましたし、良く分らんです

880 名前:デフォルトの名無しさん mailto:sage [2007/12/07(金) 14:48:18 ]
csvファイルを開いたときのシート名はファイル名(のベースかも)じゃなかった?



881 名前:デフォルトの名無しさん mailto:sage [2007/12/07(金) 14:55:45 ]
うぜー
マクロを記録しながらマニュアルで操作して、どんなコードが生成されるか観察しろ

882 名前:デフォルトの名無しさん [2007/12/07(金) 18:43:42 ]
ActiveSheetでいいんじゃね?

883 名前:デフォルトの名無しさん mailto:sage [2007/12/07(金) 20:03:44 ]
シェルとセンドキーを使ってアプリを起動してますがメモ帳とかで日本語切り替えやファンクションなどのボタンは入れられますか?

884 名前:デフォルトの名無しさん mailto:sage [2007/12/07(金) 20:19:19 ]
もはや何でもありかいな

885 名前:デフォルトの名無しさん [2007/12/08(土) 00:32:10 ]
高校の授業でわからないところがあるのですが、

*
**
***
****
***** 

↑のようなメッセージボックスを表示させたいとき、

Sub ex_1() ←タイトル
a = ""            ←空のaの箱をつくる
For i = 1 To 5  ←iの値の範囲を指定
For j = 1 To i     ←jの値の範囲を指定
a = a & "※" ←?
Next j ←次のjへ
a = a & vbCrLf      ← a を aと 改行にする
Next i            ←次のiへ
MsgBox a         ←iをメッセージボックスに表示
End Sub

とある(矢印は自分のメモです。)のですが、5行目の意味がよくわかりません。
5行目の時点で、aという箱はどうなっているんでしょうか??
また、 i と j は a に関わってないように思えるのですが、どうしてaの行数・文字数が i と j で決まるのでしょうか?

886 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 00:43:49 ]
>>885
最初aの箱は空の状態

iの一回目のループで、
jは一回ループする。

aの箱には※が入る。←質問の答え
改行

iの二回目のループで、
jは二回ループする。
aの箱には※が二回入る。
改行



以下五回目まで続く。

887 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 00:46:39 ]
ああありがとうございます!
a & "※" は a と ※っていう意味じゃあなかったんですね。
これで徹夜せずにすみそうです。

888 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 06:14:11 ]
2重ループさせる意味が全くない

Dim strChr As String
Dim intCnt As Integer

For intCnt = 1 To 5
  strChr=String(intCnt,"*") & vbCrLf
Next
Msgbox strChr

889 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 06:15:35 ]
まちごうた

×  strChr=String(intCnt,"*") & vbCrLf
◎  strChr=strChr & String(intCnt,"*") & vbCrLf

890 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 09:00:27 ]
= は数学で言う"等しい"じゃなく代入するという事だと真っ先に習いそうなもんだが



891 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 10:46:13 ]
その真っ先の話じゃないのかな?この例文は

892 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 11:52:57 ]
高校でVBAやるのか
先生もよく解ってないんだろうな

893 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 11:55:39 ]
それにしても現場じゃ使うことのないロジックで授業すんなよ先生!って言いたくなる例文だな

894 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 11:58:37 ]
ループの練習でしょ
BASICの代わりなんだろう

895 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 12:37:47 ]
デメリットだらけの1文字変数の発生地は高校だったのか(~ε~;)

896 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 12:40:38 ]
一文字変数だがiとかcは普通だしExcel VBAのヘルプでも使ってるぞ?
オマイは
For lngCounter = 1 To lngLastRow
などとやりそうだなw


897 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 12:49:16 ]
慣習を理由に思考思索を放棄してる低偏差値のカスに言うことは何もございません(~ε~;)

898 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 12:49:41 ]
>>896
コピペ乙

899 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 13:21:48 ]
すいません
シートネーム"シート1"が、あるとき

For ii = 1 To Worksheets.Count
  sheet = Worksheets(ii).Name
  If (sheet = "シート1") Then
       :
End If
Next
で変数sheetが"シート"になって
(sheet = "シート1") がOKになるんですが
シートネームに、日本語+数字をつけるのはいけないんでしょうか。

900 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 13:39:20 ]
「シート1」の「1」が全角か半角かって話じゃね?



901 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 14:08:09 ]
これNGにした→(~ε~;)

902 名前:899 mailto:sage [2007/12/08(土) 14:17:17 ]
>>900
すいませんでした。
変数名がまちがってました。

反省

903 名前:デフォルトの名無しさん [2007/12/08(土) 17:13:17 ]
質問です。
Excel2003でIE6をVBAで操作しています。
Set objIE = CreateObject("InternetExplorer.application")
strURL = "http://・・・・
objIE.Navigate strURL
MsgBox objIE.Document.all(1).innerHTML

こういった感じでソースHTMLを確認しているのですが、
HPが表示されJavascriptで書き換えられている前のHTMLしか確認できません
ローカルウンドウで表示される他のDocumentも探ってみたのですが
どうも旨くいかず見つかりません。

書き換えられた後のHTMLデータを取得したいのですがヒントを御願い致します。。

904 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 18:07:36 ]
objIE.Visible=True

905 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 20:31:46 ]
objIE.Navigate strURL
ここでdocumentcompleteを待ってないせいじゃないのか?
MsgBox objIE.Document.all(1).innerHTML


906 名前:デフォルトの名無しさん mailto:sage [2007/12/09(日) 13:54:52 ]
コマンドボタンを押す度にコピー元が5行ずつ移動していくようにしたいのですが、
下記の構文では1回の移動しかしてくれません。
どなたか正しい構文を御教示願いないでしょうか?

i = 5
Range("A4:A8").Copy Range("B4")
Range("A4:A8").Offset(i, 0).Copy Range("B4")
i = i + 5

907 名前:デフォルトの名無しさん mailto:sage [2007/12/09(日) 14:13:24 ]
i を sub の外に

908 名前:デフォルトの名無しさん mailto:sage [2007/12/09(日) 14:23:49 ]
釣りにマジレス

909 名前:デフォルトの名無しさん mailto:sage [2007/12/09(日) 22:39:27 ]
>>907
sub の外に出しても、コマンドボタンに割り当てられたマクロを抜けたら
値が保持される保証はないので、偶然でも動けばいい人以外はNG

910 名前:デフォルトの名無しさん mailto:sage [2007/12/09(日) 23:45:24 ]
Public i as Long



911 名前:デフォルトの名無しさん mailto:sage [2007/12/09(日) 23:57:06 ]
>>910
おまえはすぐ上のレスも読めないのか

912 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 00:45:05 ]
iなのにLong(笑)

913 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 09:12:32 ]
>>912
910の案は間違っているからどうでもいいとして
i は Integer でも int でもなく Index のことだから型は関係ねえぞ

914 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 09:56:54 ]
もともとはintegerだし、Cとかでlong iとかやると変

915 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 11:06:42 ]
>>914
なんつーかそこまでして変数名を1文字にする意味がないと思うのは気のせい?

916 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 11:40:17 ]
日本語でOK

917 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 11:50:03 ]
>>915
気のせいじゃない
というか、誰も変数を1文字にする必要があるとか意味があるとかなんてことは一言も言ってない
単に状況によっては1文字変数にも不都合はないというだけの話

918 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 13:14:55 ]
そだね。For Nextのカウンターはiが普通
ハンガリアン狂いはリストでも聴いてなさい

919 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 13:17:59 ]
てっきりFor Nextかと思ったらそうじゃなかったか


920 名前:デフォルトの名無しさん [2007/12/10(月) 15:21:31 ]
すいません、ちょっと質問させていただきます。
ワークシート別に異なる編集処理を、同じ書式(同じメソッド名)で呼び出そうとしています。
現在、以下のように、Implementsを使用しようとしていますが、上手くいきません。

-ClassIF.cls- (PublicNotCreatable)
Public Function GetTestString() As String
End Function

-Sheet1-
Implements ClassIF
Private Function ClassIF_GetTestString() As String
  ClassIF_GetTestString = "てすと"
End Function

-ThisWorkbook-
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
  Dim TestIF  As ClassIF
  Set TestIF = Me.Worksheets.Item(1)
  MsgBox TestIF.GetTestString
End Function




921 名前:920 [2007/12/10(月) 15:24:16 ]
 (920のつづき)
上記のコードだと、コンパイルは通りますが、実行時に 「型が一致しません」 とエラーとなるので、
> Dim TestSh  As Sheet1
  Dim TestIF  As ClassIF
> Set TestSh = Me.Worksheets.Item(1)
  Set TestIF = Me.Worksheets.Item(1)
とすると、一旦エラーとなりますが、ステップ実行を継続すると以降は動くようになりました。
情けないのですが、何をどう間違えているのか、判断が付きません。

目的は、多数のシートの処理を同じ書式で呼ぶことです。
(シートが多く、今後メソッドも増加することが予想されるので保守性を高めるため。)

また、試しに、CallByName(Me.Worksheets.Item(1), "OwnerStr", VbMethod) を試したところ、
「メモリが不足しています。」 となりダメでした。(Public Function OwnerStr() を追加。端末メモリは1G)

環境は、WinXP SP2 + Office2003 VBA:6.4.8869 です。
なお、開発環境の制約上、VBが使用できません。 何らかのアイデアを頂ければ幸いです。


922 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 16:31:58 ]
良くわからんけど、set testif=shとやったらちゃんと動いたぞ

923 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 17:55:51 ]
>>922
ありがとうございます。こちらでも試してみたのですが、動いたり動かなかったりです。
こちらの環境では、初めは動いても、ファイルを保存して開きなおすと動かなくなります。
しかも、そうなると、再び動くようにするにはどうすれば良いか分からなくなってしまう状況です。

  Set TestIF = Sh
  Sh.Range("A1:E5").Value = TestIF.GetTestArray  ←例えば2次元配列を返す
とか書ければスッキリするんですけど、そもそも確実には動かないので使い物になりません・・・


924 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 20:14:19 ]
>>923
セキュリティの設定を変更しないとダメだが、一応これなら2007ではうまくいった
2003は持ってるけどインスコめんどいので試してないからやってみれ
-ThisWorkbook-
Private Sub Workbook_Open()
On Error GoTo SECURITY_ERROR
Dim p As Variant
For Each p In ThisWorkbook.VBProject.VBComponents
Debug.Print p.Properties("Name").Name
Next p
Exit Sub
SECURITY_ERROR:
'support.microsoft.com/kb/282033/ja
Call MsgBox("セキュリティ設定によりマクロからVBAプロジェクトへのアクセスが禁止されています。", vbCritical, "セキュリティ エラー")
End Sub


925 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 20:29:36 ]
>>923
「動かなかったり」って時は、VBAProjectがコンパイルされてない時とイコールだったりしない?

926 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 21:16:12 ]
うーん、何かそのやり方違和感があるなぁ。
class Worksheet implements IFooじゃないところが。つまり、implementsを書かないworksheetが存在してもOKなところ。
じゃぁ、どうやればいいかって聞かれると、即答できない・・・

927 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 21:25:24 ]
iの型は何にすればいいんですか?

928 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 21:33:46 ]
>>927
整数型ならなんでもいいよ

929 名前:920 mailto:sage [2007/12/10(月) 21:33:47 ]
>>924
動きました! ありがとうございます!
923みたいに、配列を返してセルをまとめて埋めちゃうような処理でもバッチリ動きました。
処理を目にしても、なおピンと来ませんが、前もって1度アクセスしとくって感じですかね。
凄いなー・・・ そんなの絶対に分からないです。俺ももっと精進します・・・
応用を考えて、色々試して見ます。本当にありがとうございました。

>>925
コンパイルが通らないときは動きません。 通っても一旦終了するとダメだったりしてました・・・

>>926
そうなんですよね、”何となくダメっぽい” んですけど、どうすればいいかサッパリな事が多くて。


930 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 21:34:02 ]
相撲の世界では、雲龍型もしくは不知火型のどちらかだよね。



931 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 21:53:36 ]
今度からiは整数型にします><

932 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 22:23:26 ]
>>929
アフォか
実体を取得してないのにインプリメントしただけで参照が通るわけネーダロ
まあ、モジュール行ったり来たりの実用性に乏しいところを見ると、単なる実験だろうけど

以下のコードをSheet1の方に記述してから、このプロパティを呼び出してみ
Public Property Get MyEntity() As ClassIF
Set MyEntity = Me
End Property

それにしてもiはインデックスとか1文字変数野郎にはキチガイが多いな(~ε~;)


933 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 22:49:15 ]
iは整数型なんですってば><

934 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 22:52:11 ]
932が見えない
またキチガイが来てるのかw

935 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 23:01:11 ]
>>926
ベストなやり方とは言えないが、これで現状の処理に合わせたまま対応できるな
'参照設定 TypeLib Infomation
Private Sub Workbook_NewSheet(ByVal Sh As Object)
Dim m As CodeModule
Dim c As ClassIF
Dim t As TLIApplication
Dim v As Variant
Set t = New TLIApplication
Set c = New ClassIF
Set m = ThisWorkbook.VBProject.VBComponents(Sh.Name).CodeModule
Call m.AddFromString("Implements ClassIF")
For Each v In t.InterfaceInfoFromObject(c).Members
Call m.CreateEventProc(v.Name, "ClassIF")
Next v
End Sub

936 名前:920 mailto:sage [2007/12/10(月) 23:08:18 ]
>>932
機能を増やした時の保守性のため、ClassIF を抽象クラス的に使おうとしてます。
なので、できれば Sheet1 に外部からアクセス(Public定義)させたくないのです。
従って、ClassIFを返す意味がないのです。
それから、多分それだと動きません。(そもそも実行時に MyEntityを取得できない)
意図を読み違えていたらすいません・・・。


937 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 01:25:29 ]
アクセルロッドのコンテストを学校の課題でしており、
Sub Dilemma_of_Prisoners()
Dim TE1 As Boolean, TE2 As Boolean, preTE1 As Boolean, preTE2 As Boolean
Dim I As Integer, N As Integer
point1 = 0
point2 = 0
N = 5 ' 繰り返し回数
For I = 1 To N
TE1 = Player1(I, preTE2)
TE2 = Player2(I, preTE1)
preTE1 = TE1
preTE2 = TE2
If TE1 Then
If TE2 Then
point1 = point1 + 3
point2 = point2 + 3


938 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 01:25:35 ]
Else
point1 = point1 + 0
point2 = point2 + 5
End If
Else
If TE2 Then
point1 = point1 + 5
point2 = point2 + 0
Else
point1 = point1 + 1
point2 = point2 + 1
End If
End If
Next I
MsgBox "プレイヤー1=" & point1 & vbCrLf & "プレイヤー2=" & point2
Range("A1") = "プレイヤー1=": Range("C1") = point1
Range("A2") = "プレイヤー2=": Range("C2") = point2
End Sub

939 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 01:26:20 ]
↑判定ルーチン


'人間がプレイする場合のルーチン
Private Function Player2(kaisu As Integer, TE As Boolean) As Boolean
' プレイヤーが人間の場合
If kaisu = 1 Then
Reply = MsgBox("協調しますか?", vbYesNo, "(" & kaisu & ")回目")
Else
If TE Then
aite = "「協調」"
Else
aite = "「裏切り」"
End If

Reply = MsgBox("前回、相手は" & aite & "でした。" & vbCrLf & _
"協調しますか?", vbYesNo, "(" & kaisu & ")回目")
End If

If Reply = vbYes Then
Player2 = True
Else
Player2 = False
End If
End Function

940 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 01:28:58 ]
↑人間が入力する際のルーチン

コンピューター側の行動を書きに沿って作っているのですが、

1.しっぺ返し戦略
2.「裏切り」戦略
3.罰戦略
4.寛容戦略
5.でたらめ戦略
6.独自の戦略



941 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 01:29:30 ]
裏切り
Private Function Player1(kaisu As Integer, TE As Boolean) As Boolean
If kaisu = 1 Then
Player1 = False
End If
End Function

寛容
Private Function Player1(kaisu As Integer, TE As Boolean) As Boolean
If kaisu = 1 Then
Player1 = else
End If
End Function

942 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 01:30:32 ]
しかできず、他の方法に関して模索しております。

お知恵を頂けないでしょうか?

お願いいたします。


943 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 06:40:31 ]
★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。

944 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 11:52:41 ]
>>920
moduleに、
Public Function GetTestString(ByRef w As Worksheet) as Hoge
 Select Case w.Name
  ・・・
 End Select
End Function
とかやったほうが、何の問題もなく、すっきりしてる気がする。

945 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 12:57:52 ]
>>944
これはひどいww
これじゃプライベートなデータを全部公開しないと処理ができないじゃないかw

946 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 13:06:12 ]
え、まさかシートのコードモジュールをメインでプログラミングしてたりするのか?

947 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 13:16:31 ]
あー、違和感の原因がやっとわかった。
俺、アドインベースが基本だから、シートにコード書くこと今までほとんどなかった。

948 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 15:03:18 ]
カプセル化が必要な場合は、俺ならメンバにワークシートを持つクラスを定義する。

949 名前:デフォルトの名無しさん [2007/12/11(火) 16:36:37 ]
(コントロールツールボックスでは無い方の)
コントロールのオブジェクト名と値をVBAで
参照することはできますか?


950 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 16:49:14 ]
もっと具体的に



951 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 17:35:17 ]
>>946

> え、まさかシートのコードモジュールをメインでプログラミングしてたりするのか?
これをやると何か得するのですか?

952 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 17:41:36 ]
得しないよ?
つか、何で俺にそれ聞くの?

953 名前:949 [2007/12/11(火) 17:45:13 ]
>>950
フォームコントロールのオプションボタン1と2を
ブックを開いたとき、クリア(押されてない状態)に
したいのですが、コントロール名がないためやり方がわからなくて・・
後出しですみません。

954 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 17:51:11 ]
うーむ、UserForm1.OptionButton1.Value=0とは違うのか?

955 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 18:00:48 ]
フォームツールボックスのオプションボタンをシートに配置して使ってます。
こいつのプロパティを開いてもコントロールの名前がないのです・・

956 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 18:06:52 ]
>>953
Worksheets(1).Shapes(1) とかでアクセスできる
名前はないからリンクしているセルの番地で特定するとか
つけてるラベル名でやるとか、最悪インデックスを直値でやる
以下はセルA1とリンクしているコントロールを見つけだす例

For Each v In Worksheets(1).Shapes
 If v.ControlFormat.LinkedCell = "$A$1" Then
 End If
Next v

957 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 20:42:34 ]
シートにコードを書くのってフォームを呼び出すときぐらいっしょ

958 名前:920 mailto:sage [2007/12/11(火) 21:08:22 ]
みなさん、昨日はありがとうございました。
920のその後ですが、ゴリゴリ処理を追加して起動すると、再度エラーが起きるようになりました。
  For Each p In ThisWorkbook.VBProject.VBComponents
     Debug.Print p.Properties("Name").Name
  Next p
ここで、「'Properties'メソッドは失敗しました: '_VBComponent'オブジェクト」のエラーとなります。
しかも、確認のためステップ実行するとエラーは起きません。意味も分からず、試行錯誤の末、
  For Each p In Me.VBProject.VBE.CodePanes
     s = p.CodeModule.Name
  Next p
のように修正したところ、今のところ何故か動いてます。 理屈はまだまだサッパリです・・・。
一応、ご報告まで。


959 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 22:15:24 ]
他の人も言ってるけど、そのやり方止めたほうが良いと思うよ。
まぁ、将来にわたって自分ひとりしか使わないし、シートも追加しないしってことなら止めないが・・・。

960 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 22:19:00 ]
>>955
或る程度、分かってる人みたいなので手抜き

Set objSheet = Excel.Worksheets("ターゲットシート名とか")
For Each objShape In objSheet.Shapes
If objShape.Type = msoFormControl Then
If objShape.FormControlType = xlOptionButton Then
objShape.ControlFormat.Value = xlOff
End If
End If
Next

msoFormControlは結構、有名だと思ったけどそうでもないのね
デタラメこいてクサレコードを教えるヤツも出るぐらいだし(~ε~;)




961 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 22:24:05 ]
あ、あぼんされてる人だ

962 名前:デフォルトの名無しさん mailto:sage [2007/12/11(火) 22:55:25 ]
草レコード??
と思ってググったことはワイヤード以外ではナイショ♥
d.hatena.ne.jp/tonotonotono/20060707

963 名前:デフォルトの名無しさん [2007/12/11(火) 23:41:06 ]
r AS Range
n AS Integer
(rにはセル範囲が与えられているとして)
n=r.Areas.Columns(1).Count←行数を取得したい

どうすれば行数を取得できるでしょうか?

964 名前:920 mailto:sage [2007/12/11(火) 23:42:45 ]
>>959
ありがとうございます。おかげさまで、考え方が良くないという認識は持てました。
ただ、どうも"何故"という興味が消えなくてw 不具合か、使い方か、追求してみたいです。
ご忠告どおり、個人レベルは超えないようにして、
948さんの考え方等も色々試してみようと思います。 みなさん、ありがとうございました。


965 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 00:02:00 ]
>>963
Set r = Range("a2:d11")
n = r.Rows.Count
Range("a1") = n

966 名前:デフォルトの名無しさん [2007/12/12(水) 00:20:21 ]
>>965
ありがとうございました。
d AS Variant
n=300←(データ数。可変する)
Redim d(n,2)
(省略)←dにグラフの値を代入する

Chart.add
Activechart.setsource
d←配列データをもとにグラフを作成するにはどうすればよいのでしょうか?

967 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 00:25:01 ]
oshietekun
shirabenai kara
oshietekun

968 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 00:42:13 ]
>>967
いや、一ヵ月前から調べたが解決できなかったのがたまたまこの2つだったのです。



969 名前:デフォルトの名無しさん [2007/12/12(水) 10:47:08 ]
if thenで改行するのと、そのまま書き続けるのって
ひょっとして全然違う?

970 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 10:58:04 ]
>>960
とんでもないクサレコードだなおいw
それじゃ手あたり次第に同種のコントロールを設定しちまうだろw




971 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 10:59:21 ]
>>970
じゃあお前が教えてやれ

972 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 11:38:33 ]
>>969
Excel総合相談所 62
pc11.2ch.net/test/read.cgi/bsoft/1195214565/522-524
ここら辺でやり取りされてたけど、一緒だと思う。

973 名前:デフォルトの名無しさん [2007/12/12(水) 11:57:42 ]
>>972
ありがとうございます!

もうひとつ、ついでによろしいでしょうか?
変数を使ったセルの選択で、結合されている場合の
やりかたが分かりません。

Range("B & i : B & i+1").Select: triggerMsg = Selection.Value
もしくは
Range(""B" & i : "B" & i+1"").Select: triggerMsg = Selection.Value
これだと、ダメなんですよね。

974 名前:973 [2007/12/12(水) 12:09:48 ]
ひょっとして、これであってます?
dim range1 as range
Set range1 = Range("B" & i).MergeArea

975 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 12:57:10 ]
>>973
くくってる範囲が違う
Range("B" & i & ":B" & i+1")


976 名前:デフォルトの名無しさん [2007/12/12(水) 13:00:04 ]
>>966

> d AS Variant
> n=300←(データ数。可変する)
> Redim d(n,2)
> (省略)←dにグラフの値を代入する

> Chart.add
> Activechart.setsource
> d←配列データをもとにグラフを作成するにはどうすればよいのでしょうか?

配列データからグラフ作成、以外と難しいね

977 名前:デフォルトの名無しさん [2007/12/12(水) 13:03:16 ]
msgboxのvbokcancelで、キャンセルを選んだ場合に返される
値って、「vbcancel」なのか「false」なのか、どっちですか?

978 名前:973=977orz [2007/12/12(水) 13:06:09 ]
>>975
ありがとうございます!

こう?
Range("B" & i & ":B" & i + 1).Select

979 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 13:07:20 ]
ExcelのChartではできません。あきらめましょう。

980 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 13:08:47 ]
>>977
RTFM



981 名前:973 [2007/12/12(水) 13:18:44 ]
Sub yoyoyo()
Range("A" & 1 & ":A" & 2).Select: hoge = Selection.Value
MsgBox hoge
End Sub

型が違うって出てしまいます。
結合されたセルの値を取り出すには、
特別な作業が必要なんですかね。

982 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 13:43:20 ]
>>981
VBAの本買ってこい

983 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 13:48:02 ]
>>981
いつまでその調子で質問し続けるつもりだ?

984 名前:973 [2007/12/12(水) 13:50:13 ]
すんません

985 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 13:53:00 ]
>>981
一旦選択状態にする意味が分かんない。それすら分かってないレベルなら>>982
まとめて取得したいって意味なら、2次元配列で受け取る方法を考える。
つか、クイックウォッチを見ながらやってみ?


986 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 13:53:44 ]
>>984
もし本を読んだ上で質問していると思うけど、複数冊参考になる本は用意しておくべきだよ。
その本ごとに強調する部分は違うからね。
とりあえず本屋へGo!

987 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 13:55:16 ]
>もし本を読んだ上で質問していると思うけど
日本語でOK

988 名前:973 [2007/12/12(水) 15:55:32 ]
ありがとうございます
色々やってたら出来ましたぁ

989 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 16:25:37 ]
>>981

> Sub yoyoyo()
hoge AS Range
Set hoge = Range("A1:A2").Value
> MsgBox hoge
> End Sub


990 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 16:30:17 ]
>>989

>>981
修正。

Sub yoyoyo()
Dim hoge AS variant
Redim hoge(1,2)→行と列は忘れた。
Set hoge = Range("A1:A2").Value
MsgBox hoge
End Sub




991 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 16:34:05 ]
>>979

> ExcelのChartではできません。あきらめましょう。
どおりで一ヵ月ネットで探してもでてこないわけですね・・

ありがとうございました

992 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 16:44:29 ]
あきらめてシートに転記してグラフ化するがよろし

993 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 16:46:36 ]
うわ、次スレの季節。
はよせんと落ちてしまう〜、誰かヨロ

994 名前:981 [2007/12/12(水) 16:56:31 ]
>>990
助かります

995 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 17:08:28 ]
>>981
hogeは2次元配列になっている
Sub yoyoyo()
Range("A" & 1 & ":A" & 2).Select: hoge = Selection.Value
MsgBox hoge (1,1) & vbLf & hoge(2,1)
End Sub
としないと動かない。
だがちょっと待って欲しい。変数の宣言をした方が良いんではないだろうか。
Sub yoyoyo()
Dim hoge As Variant
hoge = Range("A1:A2").Value
MsgBox hoge (1,1) & vbLf & hoge(2,1)
End Sub
とすればSelectしなくても良いのではないかという声が聞こえなくもない。

996 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 17:24:03 ]
A1とA2は結合されてるのか。
だったら
Sub yoyoyo()
Dim hoge As Variant
hoge = Range("A1").Value
MsgBox hoge (1,1)
End Sub

997 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 17:26:18 ]
ひとりごとはチラ裏な

998 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 17:29:35 ]
Excel VBA質問スレ Part5
pc11.2ch.net/test/read.cgi/tech/1197448064/

999 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 17:32:23 ]
すまん間違いな
Sub yoyoyo()
Dim hoge As Variant
hoge = Range("A1").Value
MsgBox hoge
End Sub

MsgBox Range("A1").Value
の1行でもいいぞ。

1000 名前:1000get [2007/12/12(水) 17:45:26 ]
>>999
結合されていると、なぜかselect後の値取得が
使えないんです。

range("A1").select:hoge=selection.value

はエラーになる。



1001 名前:1001 [Over 1000 Thread]
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<248KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef