[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 2chのread.cgiへ]
Update time : 04/22 19:53 / Filesize : 149 KB / Number-of Response : 514
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


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

Excel VBA質問スレ Part12



1 名前:デフォルトの名無しさん mailto:sage [2009/07/14(火) 19:07:54 ]
ExcelのVBAに関する質問スレです

前スレ pc12.2ch.net/test/read.cgi/tech/1241885130/

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

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

129 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 22:37:38 ]
>>116
けつからやんのか。頭良いな。


130 名前:123 mailto:sage [2009/07/21(火) 22:40:21 ]
レスありがとうございます。
無事できました。>>127さんのようにしました。

131 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 00:02:50 ]
>>129

基本中の基本。
君の頭が○○なだけです。

132 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 00:21:45 ]
こんなんピボットでやれば一発だわwwwww

133 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 01:32:28 ]
>>131
おまえにいってねえからwww

134 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 18:03:46 ]
また堕ちるぞ

135 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 23:04:58 ]
>>133

ワロスw

136 名前:デフォルトの名無しさん [2009/07/23(木) 00:42:00 ]
現在Excelで作ったxmlを特定のURLへ送信するプログラムを作成しています。
(Microsoft XML version2.0使用)

Sub xml()
Dim aaa As Integer
aaa = "001"
Dim bbb As String
bbb = "001"

Dim xmlDoc As MSXML.DOMDocument
Dim xmlPI As IXMLDOMProcessingInstruction
Dim node(3) As IXMLDOMNode
Dim attr As MSXML.IXMLDOMAttribute

Set xmlDoc = New MSXML.DOMDocument

Set xmlPI = xmlDoc.appendChild(xmlDoc.createProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-8"""))

Set node(1) = xmlDoc.appendChild(xmlDoc.createNode(NODE_ELEMENT, "TEST", ""))
Set node(2) = node(1).appendChild(xmlDoc.createNode(NODE_ELEMENT, "test1", "")): node(2).Text = aaa
Set node(2) = node(1).appendChild(xmlDoc.createNode(NODE_ELEMENT, "test2", "")): node(2).Text = bbb

'作成されたxml確認用
xmlDoc.Save ("test.txt")
End Sub


@set nodeに入れたaaaとbbbですが、1と表示されてしまいます。001と表示するにはどうしたら良いのでしょうか。
A作成された値(xml)を特定のURLへ送信したいのですが、どのライブラリ?等を利用すれば宜しいでしょうか
 (値を送ると、<result>NG</result>といった値が返却される予定です)

すみませんがお力添え頂けると幸いです。

137 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 02:07:25 ]
>>136
Excel 2007 + MSXML3 (MSXML2がなかった)とVBScript 5.0 + MSXML2 (Officeがなかった)の2環境でやってみたが、
いずれもbbbのほうは001になったぞ。

それをHTTPで送りたいのなら、MSXML.XMLHTTPRequestを使えばいい。



138 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 03:52:34 ]
変数についてなんですが、

-----------------------------------

Dim 値 As Integer

値 = Range("A1")   

Range("A1").FomulaR1C1 = "COUNTA(R[1]C[1],R[1]C[10])"    'A行
Range("A1").Copy
Range("A1").PasteSpecial (xlCellTypeValue)

Range("B1").Activate
Activecell,offeset(1,値).Select    'B行

---------------------------------------------------------

上記のようなコードで実行するとA行で集計されたはずの数値がB行に来た段階で代入されていないようなのですが、
変数というのは、宣言の時点で代入される数値が決まっていないといけないのでしょうか?


139 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 06:29:56 ]
Range("A1").FomulaR1C1 = "=COUNTA(R[1]C[1],R[1]C[10])"    'A行

いこーるつけなさい

140 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 07:47:58 ]
>>138
エスパーするとやりたいのはこういうこと?
Dim 値 As Integer
値 = WorksheetFnction.CountA(Range("B2:K2"))
Range("B1").Offeset(1,値).Select


質問に直接答えれば宣言はいつしてもいいけど変数の使い方がおかしい
Integer→Rangeに変えてSet 値 = Range("A1")
最後の行をActiveCell..Offeset(1,値.Value).Select

141 名前:デフォルトの名無しさん [2009/07/23(木) 18:06:57 ]
>>138
Activecell,offeset(1,値).Select    'B行
      ↑
点の種類間違ってる
最後の行はたぶんoffeset→offset

クライマックスの2行まとめて
Cells(2,2+値).Select 'ともかけるます

>>140

変数の使い方はあってない?

Range("A1")
を取得すると
Range("A1").Value
を返すしIntegerで足りるし
値.Copy とかやるでもないし

142 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 18:36:20 ]
Excel2007です。

赤丸(背景色は透明)を作りたいのですが、背景色を透明にできません。
Shape.Line.BackColorの編集でできそうなのですが、検索方法が悪いのか見つかりません。(この予測は間違いですか?)

 Dim myShape As Shape

 With ThisWorkbook.Worksheets("Sheet1")
  Set addCell = .Cells(intRow, intCol)

  Set myShape = .Shapes.AddShape(msoShapeOval, addCell.Left, addCell.Top, addCell.Width, addCell.Height)

  myShape.Line.ForeColor.RGB = RGB(255, 0, 0)
  myShape.Line.Weight = 2
 End With

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

143 名前:デフォルトの名無しさん [2009/07/23(木) 18:48:15 ]
>>142
myShape.Fill.Visible = msoFalse

144 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 19:52:54 ]
>>143
無事、透明になりました。ありがとうございます。

145 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 22:14:47 ]
>>141
あっ、そういう風に見れば
間違ってるのは変数「値」にA1の値を代入するタイミングだな

146 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 23:31:01 ]
>>137
ありがとうございます!

147 名前:デフォルトの名無しさん [2009/07/25(土) 12:07:00 ]
エクセル2000を使用しています。

コンボボックス2個、テキストボックス1個、コマンドボタンのユーザーフォームで
シートに以下の図のようにデータがあります。
コンボボックス1にA列の値、コンボボックス2にB列の値を入れて、
コマンドボタンを実行すると、該当するC列の値をテキストボックスに表示する
にはどうすればいいですか?

A  B C
1 ああ  カカ  100
2 ああ  キキ  200
3 ああ  クク  300
4 いい  ケケ  400
5 いい  ココ  500

コンボボックス1に「ああ」、コンボボックス2に「クク」なら
テキストボックスは「300」になるようにしたいです。

よろしくお願いします。



148 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 12:24:06 ]
曖昧だな

149 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 12:35:45 ]
1とA、2とBの合致をANDでもいいから組み合わせて、そのセルを変数に格納して、テキストボックス=セル(変数、3).バリューすればいいかも!

150 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 12:44:08 ]
vbaが体系的に勉強できるサイトや本でおすすめあれば教えてください。

151 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 12:48:49 ]
>>150
ここでROMがお奨め(;゚д゚)ァ


152 名前:デフォルトの名無しさん [2009/07/25(土) 13:27:13 ]
項目1, 項目2, 項目3, 項目4, 項目n・・・(最大:n=255)
あああ, ううう, えええ, くくく, ・・・
いいい,    , おおお, けけけ, ・・・
   ,    , かかか,    , ・・・
   ,    , ききき,    , ・・・

(最大:行=65535)

とあった場合、

項目1, 項目2, 項目3, 項目4・・・
あああ, ううう, えええ, くくく
いいい, ううう, おおお, くくく
あああ, ううう, かかか, くくく
いいい, ううう, ききき, くくく
あああ, ううう, えええ, けけけ
いいい, ううう, おおお, けけけ
あああ, ううう, かかか, けけけ
いいい, ううう, ききき, けけけ
 ・
 ・
 ・

のように、データを詰めて別のシートの同じ位置(例:A1)から出力したいです。
※行・列は可変データです。

153 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 13:29:47 ]
>>150
151もおすすめだけど「体系的」ではないわなw
確かスレ違いだったと思うから紹介はしないが適当にググればいくつか出てくるからサイトさがしはそんなに難しくない

本買うなら最初はあまり分厚いのでなくて初心者向けの簡単な入門書やってみれば
自分が身につけたいことが見えてきて次に本買うときは自分の好みに合った本選びできる

154 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 13:37:24 ]
>150
excel vba 入門 に一致する日本語のページ 約 183,000 件中 1 - 10 件目 (0.35 秒)


155 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 13:39:59 ]
>>152
これって
丸投げというか、依頼じゃね
何がわからないか書かないと答えられないだろ

156 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 13:45:47 ]
>>152
nhngdおk

157 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 13:59:52 ]
>152
この例だとfor〜nextループ4重で行数は2×1×4×2=16行。
組み合わせの問題で項目数が不定ということは再帰処理ができるとわかりやすいんだろうけど・・・・
「excel vba 再帰」でググったら再帰プログラムができるらしい。

ひとつ間違えると無限ループになるし、項目数最大256個が大丈夫なのか、やってみないと
なんともいえない。




158 名前:157 mailto:sage [2009/07/25(土) 17:28:56 ]
>152
行基準(再帰処理)でやろうとしたら、こんがらがってしまい中断。列基準だとなんかできそう。

先に列数(4)と、列毎の行数を調べ、配列に設定。この際添え字は0〜列数+1とし、
配列(0)と配列(列数+1)の内容は1にしておく。
その結果、配列(0)=1、配列(1)=2、配列(2)=1、配列(3)=4、配列(4)=2、配列(5)=1 となる。

左端列(A列:列番号1)は当該列の要素("あああ"、"いいい"の2種類をそれぞれ左側の組み合
わせ数1回繰り返したものを右側の組み合わせ数(1×4×2=)8回出力する。
→あああ、いいい を8回
B列(列番号2)は当該列の要素("ううう")の1種類をそれぞれ左側の組み合わせ数2回繰り返した
ものを、右側の組み合わせ数(1×4×2=)8回出力する。
→ううう、ううう を8回
C列(列番号3)は当該列の要素("えええ"、"おおお"、"かかか"、"ききき")の4種類をそれぞれ
左側の組み合わせ数2回繰り返したものを、右側の組み合わせ数2回出力する。
→(えええ を2回、おおお を2回、かかか を2回、ききき を2回)を2回
D列(列番号4)は当該列の要素("くくく"、"けけけ")の2種類をそれぞれ左側の組み合わせ数
8回繰り返したものを、右側の組み合わせ数1回出力する。
→くくく を8回、けけけ を8回

列数がNで、n列目の出力を考えた場合、
要素数は 配列(n)
左側の組み合わせ数は 配列(0)×配列(1)×・・・×配列(n−1)
A列の場合も配列(0)=1があるので計算に支障なし
右側の組み合わせ数は 配列(n+1)×・・・配列(N−1)×配列(N)
最右列の場合も配列(N+1)=1があるので計算に支障なし

159 名前:157 mailto:sage [2009/07/25(土) 17:35:38 ]
>158の続き

>152の例だと「項目3」が えええ、おおお、かかか、ききき、えええ、・・・という
順番だけど、えええ、えええ、おおお、おおお、かかか、かかか、ききき、ききき・・・の
並びの方が組み合わせ順としては自然だと思う。項目4も同様に同じものが8回ずつ繰り返す
ことになります。

>152 ここまで示したらできますか?

160 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 18:55:00 ]
よくわからないけど、列ごとにソートしたいのか?
格納用の配列(65534、254)を用意
ソート用の配列(65534、0)を用意
列をカウントする変数iを用意

for i=0to254
ソート用の配列に列データを格納、ソート
格納用の配列(65534、i)にソートしたデータを格納

最後にシートに格納した配列を流し込む

161 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 20:12:03 ]
>>152
死ぬほど遅いけどこういうことか?

Sub test()
For Each c In Range(Cells(1, 1), Cells(65535, 255))
If (c.Value = Empty And c.Rows > 1) Then
c.Value = c.Offset(-1, 0).Value
End If
Next
End Sub

162 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 21:10:28 ]
>>152
1.まず、項目1...nの要素を数える
2.数えた要素を掛け算、K1xK2x...xKn
3.2.で得られた数値が必要な行数なので、
  各項目ごとに各要素で必要行数だけ埋める

163 名前:162 mailto:sage [2009/07/25(土) 21:13:15 ]
すまそ

2.数えた要素の、最小公倍数を求める

164 名前:162 mailto:sage [2009/07/25(土) 21:16:14 ]
すまそ

だれか、2.の正解を頼む

165 名前:162 mailto:sage [2009/07/25(土) 21:18:27 ]
ああ、最初の162で正解でした

166 名前:162 mailto:sage [2009/07/25(土) 21:22:58 ]
>>152
の質問で
あああ, ううう, おおお, くくく
の組み合わせが必要かどうかで答えが変わるね

スレよごし、すまそ

167 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 00:54:28 ]
環境
・WindowsVista
・Excel2002

A1〜A10の合計をC2に表示させるマクロを作りたいのですが上手くいきません。
自分で作ったのは以下の通りです。

Sub practice()
Dim i As Integer
For i = 1 To 10
Cells(2, 3) = Cells(i, 1) + Cells(i, 1) + Cells(i, 1) + Cells(i, 1) + Cells(i, 1) + Cells(i, 1) + Cells(i, 1) + Cells(i, 1) + Cells(i, 1) + Cells(i, 1)

Next i
End Sub

アドバイスを頂けると助かります。
よろしくお願いします。





168 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 01:01:07 ]
どううまく動かないか説明もせずにアドバイスとな

169 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 01:12:49 ]
説明不足で申し訳ありません。

上手くいかないというのは合計の値がオートSUMで計算した合計と一致しないということです。



170 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 01:21:21 ]
やりたいことはコレか?

Sub practice()
Dim i As Integer
Dim sum as Integer
sum = 0
For i = 1 To 10
sum = sum + Cells(i, 1)
Next i
Cells(2, 3) = sum
End Sub

171 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 01:26:42 ]
>>167
元マクロ無視して書けばこういうこと?

Sub practice()
range("c2") = worksheetfunction.sum(range("a1:a10"))
End Sub

172 名前:167 mailto:sage [2009/07/26(日) 01:28:41 ]
>>170
値が一致しました。ありがとうございました。


173 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 03:50:40 ]
どうせ小数をintegerで計算したってオチだろ

174 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 08:32:13 ]
セルを各々9回余分に加算してたんだろ

175 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 09:25:18 ]
動かないとかエラーが出てるとか書く時はどう望んだ風に動かないとかどんなエラーメッセージが出てるとか書け

>>1に書いたとしても、読みもしないんだろうなぁ。

176 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 09:33:22 ]
エスパーだけどループ処理を使ってSUMさせる課題か何かだな

177 名前:デフォルトの名無しさん [2009/07/26(日) 13:48:35 ]
よろしくお願いしますm(__)m

Excelで店舗の営業日報を作れるデータを作成しました。
他人がそのデータを使うワケなのですが、

データに打ち込んで、上書き保存などはできるが、
データそのものを複製やコピーする事を防止する事は可能ですか?

また、暗証番号機能などで、その複製のロックを管理する事は可能でしょうか?
あるとすればどのような手段でデータをその人に預ければよいのでしょうか。

わかりずらいかも知れませんが
よろしくお願いしますm(__)m





178 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 14:00:33 ]
>>177
マルチ 芯でください

179 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 16:08:32 ]
できる

で、マルチならどこなのか晴れYO

180 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 16:09:31 ]
54 :名無しさん@そうだ選挙にいこう :2009/07/26(日) 13:28:31
よろしくお願いしますm(__)m

Excelで店舗の営業日報を作れるデータを作成しました。
他人がそのデータを使うワケなのですが、

データに打ち込んで、上書き保存などはできるが、
データそのものを複製やコピーする事を防止する事は可能ですか?

また、暗証番号機能などで、その複製のロックを管理する事は可能でしょうか?
あるとすればどのような手段でデータをその人に預ければよいのでしょうか。

わかりずらいかも知れませんが
よろしくお願いしますm(__)m

181 名前:デフォルトの名無しさん [2009/07/26(日) 17:25:08 ]
自分>>177です。

マルチとは
『他でも質問してる』
って意味なのですね。

すみませんm(__)m
ドコで質問すればベストか、また、
色んな人に聞けばもしかしたら、と思い書き込みしてしまいましたm(__)m

ご迷惑おかけしましたm(__)m

さしつかえ無ければ>>179さん、簡単にでも教えていただけませんでしょうか?
よろしくお願いしますm(__)m

182 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 17:29:37 ]

女子大生or女子高生なら、即解決w



183 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 17:53:50 ]
☆質問例☆

Excelで店舗の営業日報を作れるデータを作成しました。
他人がそのデータを使うワケなのですが、

都内の中学校にかよう15歳の女子中学中学生ですが、最近中学1年の妹の胸が大きくなってきて困ります。
まだ中学生なのに私よりも膨らみが目立っているのが少し悲しいです。

一緒にお風呂に入るとよくわかります。
妹は私の気持ちに気がつくどころか、ことあるごとにさわったりもんだりしてくるのです・・・。

データに打ち込んで、上書き保存などはできるが、
データそのものを複製やコピーする事を防止する事は可能ですか?

また、暗証番号機能などで、その複製のロックを管理する事は可能でしょうか?
あるとすればどのような手段でデータをその人に預ければよいのでしょうか。

今日もスポーツブラの下から手を入れてきて、声を堪えるのに大変でした。

わかりずらいかも知れませんが
よろしくお願いしますm(__)m

184 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 18:13:54 ]
俺は貧乳でもOKだよ。

185 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 22:33:47 ]
XP,OFFICE 2007
初心者&初カキコです。
いきなりすみません。
配列変数 A(3,100)があるとして、
A(2,0)〜A(2,100)や、A(3,0)〜A(3,100)といった各一次元配列の平均をそれぞれ出したいのですが、
全ての平均を出す場合は
.Average(A)
ですが、各次元毎だと、方法が解りません。
どなたか指導をお願いします。


186 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 22:48:03 ]
環境
・WindowsVista
・Excel2007

SheetAに貼った画像の中から選択したものを一つSheetBに貼りたいんですが
どうすればいいですか?



187 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 22:58:51 ]
>186
マクロの自動記録は試してみましたか?
当方Excel2003ですが、自動記録してできたソースの1〜2行コメント化するだけで、できましたよ。



188 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 23:02:24 ]
>185
凡人なので、for 〜 next ループで回しながら、合計と件数を調べてわり算で求める方法しか知りません。
これ以外の回答をお望み?

189 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 23:03:27 ]
>>187
ありがとうございます
やってみます

190 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 23:29:12 ]
>188
出来るだけ早くしたくて。。
すみません。実は50×100×10000の三次元配列なので、それやると時間が半端ないんです。


191 名前:188 mailto:sage [2009/07/26(日) 23:34:11 ]
>185,190
情報の後出しイクナイ

192 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 23:37:25 ]
>>186ですが、自動記録を使ってやってみました
でもだめでした・・

Sheet2にある複数の図のうち、異なる図をコピーしても、すべて

Sheets("Sheet2").Select
Selection.Copy

となってしまいます
コピーする図を選択するにはどのようにすればいいんですか?

193 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 23:39:54 ]
>>191
そんなの後出しじゃないだろ。
質問の内容から想定してしかるべき。

194 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 23:41:24 ]
for 〜 nextで変数を複数設定したい場合はどうすればできますか?

たとえば変数iが「5 to 101 step 24」で変数kが「5 to 20 step 5」として
cells(i,k).copy
selection.paste
みたいな感じで動作させたいです。


195 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 23:47:02 ]
>>191
「俺にはわからない。」と言えばいいんだよ。
>情報の後出しイクナイ
なんだこりゃ?ぶさいく。

196 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 23:47:19 ]
>191
確かに。後だしは良くないですよね。すみません。
出来るだけ簡単なシチュエーションにしたかったんです。
ところで、どなたか>185のやり方をご存知ないでしょうか?


197 名前:187 mailto:sage [2009/07/26(日) 23:59:08 ]
>192
当方の手順(マクロの自動記録)シートAに図形があって選択していない状態から
1 図形をクリック
2 メニューの編集−コピー
3 シートBのタブをクリック
4 メニューの編集−貼り付け
これだけです。できたソースは↓で、1行目だけ削除すればいい。
ActiveSheet.Shapes("Picture 1").Select ←これだけ削除
Selection.Copy
Sheets("SheetB").Select
ActiveSheet.Paste
実行する際は、マクロを呼び出す前にコピーしたい図形をクリックして選択
状態にしておくこと。シートBの貼り付け先を指定したいときは、自動記録
のときに当該セルをクリックする。



198 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 00:04:47 ]
>192
196ですが、世の中ギブアンドテイクって事で、試して見てください。
Worksheets("A").shapes(i).Copy
Worksheets("B").Activate
Active.Sheet.Paste

iの部分に画像が何枚目かを代入。

199 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 00:07:40 ]
>>197
>>実行する際は、マクロを呼び出す前にコピーしたい図形をクリックして選択
状態にしておくこと。

この作業無しでする方法はないですか?

200 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 00:22:25 ]
>>198
できました!
みなさんありがとうございました



201 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 01:24:29 ]
>>185
Range(Cells(1, 1), Cells(3, 100)) = a
として
各行の平均を出す

202 名前:デフォルトの名無しさん [2009/07/27(月) 01:28:15 ]
>>194

k = 5
For i = 5 To 101 Step 24
  If k > 20 Then Exit For
  '↑はkのTo 20があまり重要でないならいらない
  
  Cells(i,k).Copy
  Selection.Paste
  
  k = k + 5
Next

こんなんなったけどいいか?
これだと、変数iとkがいずれかはみ出したらループを抜ける。
これだと、(i,k)=(5,5),(29,10),(53,15),(77,20)の4回ループ内を実行する。

203 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 01:42:17 ]
>>202
ありがとうございます。
上記の方法で無事動作しました。
ちなみに変数にしたい要素が3つ以上ある場合というのは一般的にどういう処理が効率的でしょうか?
今はいちいちすべての場合分けをして記述していますが、それぞれの増減は規則性があるので
なんとか簡易にしたいと思っています。

204 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 01:53:41 ]
>>185
Sub test()
Debug.Print WorksheetFunction.Average(Range("A1:A100"))
Debug.Print WorksheetFunction.Average(Range("B1:B100"))
Debug.Print WorksheetFunction.Average(Range("C1:C100"))
End Sub

205 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 01:53:48 ]
>201
ありがとうございます。
やはりシートを利用するしかないんでしょうね。
それか個別の一次元配列変数を宣言して代入とか。
出来れば、.Average(A(2))とかの記述でその従属二次元配列が計算されるのを期待したんですが、
特定の次元を宣言するような関数なり構文はないんですね。。
今日はもう寝ます。明日会社だし。
ありがとうございました。

206 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 10:20:03 ]
>>203
「一般的」と「効率的」と「簡易」は両立が難しい。
何がやりたいのか自分でもわかってない気配がするが、まずは質問を絞れ。

ループ終了の条件が2つ以上ある時は無理にFor Nextを使わない。
Exit ForやGotoのような、プログラムの流れを強制的に変える命令は、
あまり使わない方がいい。

i = 5
k = 5
While (i <= 101) And (k <= 20)
  Cells(i, k) 以下略

  i = i + 24
  k = k + 5
Wend

207 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 10:44:58 ]
変数が大量にあって、ループの回数も多くなると、
ForとIfでもWhileでも、終了条件の判定回数が増えるから少し効率が落ちるね。
そういう時は最初にループの回数を調べしまうといい。

回数i = (101 - 5) / 24
回数k = (20 - 5) / 5
If 回数i < 回数k Then
  回数 = 回数i
Else
  回数 = 回数k
End If
i = 5
k = 5
For a = 1 To 回数
  Cells 以下省略
  i = i + 24
  k = k + 5
Next

あとはケースバイケース。
可能なら、こんなふうに数式を短縮してみるとか。

For a = 0 To 回数 - 1
  Cells(5 + 24 * a, 5 + 5 * a) 以下省略
Next



208 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 17:17:40 ]
strTextLine = "A,B,C,D,"
というCSVファイルがあって、これをDataという配列変数に
Data = Split(strTextLine, ",")
とすると

DATA[0]はA
DATA[1]はB
DATA[2]はC
DATA[3]はD

ですが

DATA[5]にナルが入るんでしょうか?
それとも最後のカンマは無視されるんでしょうか?

配列に入れて処理を加えた後に

strTextLine = Data(0)
For C = 1 To UBound(Data)
  strTextLine = strTextLine & "," & Data(C)
Next C

で戻してやると最後のカンマは生きているので、無視はされてないのではないかと思うのですが、確証が得たいので質問しました。

209 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 17:33:58 ]
あれ使うといいよ
イミディエイなんとか

210 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 18:53:26 ]
>>208
さすがにDATA[5]には何も入らんだろう。という挙げ足は置いといて。
たとえば元のデータが"A,,,B"で長さが0の文字列が無視されてしまったらどうなると思う?

211 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 18:57:25 ]
何百行あるか何千行あるかわからないテキストファイルを一行ずつ配列に入れたいんですが
LineInputを繰り返す度に毎回ReDimしながら代入するしかありませんか?
なんとなくRedimを繰り返すのは処理速度的にあまりスマートではないのではという懸念があるのですが。
一度LineInputの度に変数に+1して行数を求めてから
もう一度LineInputと代入を繰り返すのとどっちが良いでしょうか。

212 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 19:25:27 ]
俺なら最初に何行あるかを確認して、その分の配列をとり格納するようにすると思うけど、

スマートとかどうとか言う以前に目的を達成できたら、それで良いのでは?
デバッグの容易さとか保守性の容易さとかを考慮するのは大事だと思うけど。


213 名前:デフォルトの名無しさん [2009/07/27(月) 21:51:33 ]
>>208,209

イミディエイトウインドウのことですな。
DATA[4]なら

Debug.Print DATA(4)

で調べられますYo.
っていうかこの場合ローカル ウィンドウで直接見たほうが早くね?

214 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 23:35:50 ]
>>211
1行ずつ増やすんじゃなくて、たとえば100行とか200行単位で拡張していって、
最後に余った分はもう一度ReDimして削るようにすれば、だいぶ軽くなる。

行の長さの最大値とかファイルの大きさがある程度わかってれば、
もうちょっと別のアプローチもあるんだけど。

215 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 23:44:05 ]
>>211
ファイル全体を文字列変数に一気に読み込んだあと
Split関数で区切りを改行コードにして分割

216 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 00:35:54 ]
WindowsXPのOffice2003を使用しています。
型番や製品名の一覧があり、これらが別に用意されている製品の型番などの書かれたリストと
一字一句相違ない事を確認する作業を補助するマクロを作ろうとしています。

列Aに
aaa
bba
ccc
zzz

とあり、別のシートにリストがあって
aaa
bbb
ccc
ddd

の様に書かれていたら、列Aのbbaとzzzがリストにないのでそのセルを着色する、と言う処理を考えています。
この様なリスト総当たり的な判定、間違い探しを行う事は可能でしょうか。

ttp://paint.s13.dxbeat.com/up/src/paint_18511.jpg
画像は処理前後のイメージです。列Cにコピーするわけではありません。
実際にはリストもデータもそれなりの量があります。
(なお、ループ処理、次の行、列、リストへの移動などは別に変数を切ってある範囲を直指定するなど力業でやってしまう予定です。)

マッチングのやり方として、以下を考えています。
1.リストの先頭の文字列をデータの列Aの先頭から総なめして、次のリストの文字列へ、、の繰り返し。
2.何かしらの関数でリストを一括で読み込めて、データの列Aを上からマッチングしてくれるやり方。

2は希望ですが、何か良い手段がありましたらご教授お願いします。

217 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 00:42:41 ]
よし!ここでVLOOKUP関数だ!



218 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 00:46:43 ]
>216
そういう関数があるかは解りませんが、結局マッチングしなかったセルを色付けしないといけないので、
For〜Next構文を使用する事になると思いますので、1.をお勧めします。

219 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 00:53:48 ]
>>216
作業列を1列使えばワークシート関数だけでできるんだけど、VBA使わないとだめ?

220 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 00:54:27 ]
VLOOKUPと条件付書式を使えばできるんじゃないかな。
俺ならマクロでするけど。

221 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 00:58:52 ]
>>216
個人的お勧めは3.フィルタオプション

だけれどちょっと調べてよくわからないなら1.総ナメが堅いかな
結構な量あるとはいっても2003の行に入る分量なら
よほど下手なコード書かない限りたいして時間かからない

222 名前:216 mailto:sage [2009/07/28(火) 01:13:53 ]
皆さんレスありがとうございます。
>>217
調べてみました。まさにマッチングはこれだ!と言う感じでしたが、リストの別の値を代入するのではなく
色を付けたいのでどうして良いものか…  あ、何でも良いから値をマッチしたら変数に値を一旦格納して
その後if文で変数を見て色塗りを振り分ける、、って感じなら出来そうですね。

>>218
はい、1も考えてみます。パフォーマンスがやや心配ですが^^;
ループはいずれかの方法を使いますが、時間の関係と空のセルも多々あり得るので手を抜こうと画策中です。

>>219
実は既にデータシートに数式が入っていたりして、なるべく体裁をいじりたくないというのが一点と
列が20個ほど、列の数だけリストも存在し、行数は100〜200位なのでVBAの方が良いのかなと考えました。

>>220
はい、vlookupをちょっと調べてみます。
条件付き書式は多分勝手に組んじゃダメと言われそうなので回避する方向で考えています。

>>221
なるほど、オートフィルタの制限無しバージョンみたいな感じですね。しかもリストの範囲も指定できて出力も出来ると。
参考にさせていただきます。ただ、各ファイルで毎回設定各列を指定する必要がありそうですね。
上記データシートが一日に10〜20ファイル届いて捌かないと行けないので、もう少し自動化の道も探ってみます。


223 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 01:37:25 ]
>222
218です。20*200なら配列変数に格納してMatchなりVlookUpなりで検索かける方がセルに情報を読みに行く時間が短縮出来ますよ。ほんと僅かですけど。
変数格納もRangeオブジェクト使えば一瞬ですし。

224 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 01:42:13 ]
223です。
はあ?って思われたでしょうね。
誤爆しました。223は忘れて下さい。時間は同じでした。


225 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 07:35:38 ]
すいません、Excel2003なんですが質問が二つあります。

1.セルに複数行のデータがある場合、指定行だけ参照することはできますか?

2.セルに入力されたパスが読み取り専用のフォルダかどうか調べることはできますか?

よろしくお願いします。

226 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 07:49:41 ]
>>225
1については、セルの折り返しでなく改行入力ならば、改行をカウントして文字列抜き出す
2はFSO使えばおk

227 名前:デフォルトの名無しさん [2009/07/28(火) 10:02:18 ]
Excel2003 XPです。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

で渡されるTargetが連続した複数のセル範囲である場合、行を1行に
変更する処理を行いたいのですが、とりあえず力技で以下のように
しています。

myRange1 = Target.Address
myRange2 = myRange1
If InStr(myRange1, ":") Then
myRange = Split(myRange1, "$")
myRange2 = myRange(1) & myRange(2) & myRange(3) & Left(myRange(2), Len(myRange(2)) - 1)
End If

要は"$"で列行列行に分割して文字列を作り直しているのですが、
何とも見難いのでもっとスマートなコマンドやテクニックは無いでしょうか?

よろしくお願いします。




228 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 10:36:53 ]
>>215
ありがとうございます!
すばらしくスマートです。

229 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 12:20:58 ]
>>227
とりあえず$記号をまとめて消したいなら
myRange2 = Replace(Target.Address, "$", "")

あと、そのプログラムにはバグがあるよ。
選択された領域が2つ以上に分かれて離れていた場合、2つ目以降がすべて消えたり
$記号が残ったりする。

それよりも、セルが1個の時と複数の時を区別する意味がわかんないし、
$を消す理由もよくわからん。普通はTargetはそのまま使うもんだし。
たぶん、他の部分でもカンチガイしてる可能性が高い。

何がやりたいのか全部書いてみ?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<149KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef