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


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

Excel VBA質問スレ Part8



1 名前:デフォルトの名無しさん mailto:sage [2008/08/25(月) 23:16:33 ]
ExcelのVBAに関する質問スレです

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

★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)

363 名前:高島彩 [2008/09/29(月) 15:57:37 ]
ワークシートつかわないでVBAでRSSの値とるやり方おしえて

364 名前:HIRO ◆225xxx6ZSE [2008/09/29(月) 16:07:10 ]
   , - ,----、 
  (U(    ) 
  | |∨T∨  皆さん、>>363をよろしくお願いします。
  (__)_)

365 名前:高島彩 [2008/09/29(月) 16:12:29 ]
       ____
      /∵∴∵∴\
     /∵∴∵∴∵∴\
    /∵∴∴,(・)(・)∴|   / ̄ ̄ ̄ ̄ ̄ ̄ ̄
    |∵∵/   ○ \| <  >>364 氏ねよ!!
    |∵ /.  ミ  | 彡 |   \_______
    |∵.|  \___|_/|    ___
     \|   \__ノ /   /     \  
       \___/    /∧      \
      /      )  | ×       | _     _
     / ,イ 、  ノ/   |●(     ―= ̄ `ヽ, _
    / / |   ( 〈 ∵. ・\  〈__ >  ゛ 、_―
   | !  ヽ  ー=- ̄ ̄=_\_(/ , ´ノ
   | |   `iー__=―_ ;, / / /   
    !、リ  -=_二__ ̄_=;, / / ,'
        /  /       /  /|  |
       /  /       !、_/ /   〉
     / _/             |_/
     ヽ、_ヽ

366 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 21:36:04 ]
>>363
ごく普通にやればいいだけだよ
VBやCでやるのと同じように

つーか、ワークシート使わない方法になると>>1にも書いてある通り
VBAではなくVB分野になるのでスレ違いだな
あとは自分で調べましょう

367 名前:HIRO ◆225xxx6ZSE [2008/09/30(火) 00:14:01 ]
   , - ,----、 
  (U(    )  >>366
  | |∨T∨  ありがとうございます。
  (__)_)

368 名前:デフォルトの名無しさん [2008/10/01(水) 00:19:39 ]
www.nicovideo.jp/watch/sm3058430
ニコ動で一時期流行った侵略ゲームをExcelで再現してみたのですが、
やはり(?)あまり速度が出ません。
いろいろ頑張ってみたのですが、自分の限界に達したようなので、
速度が向上する方法がありましたらアドバイスをいただけると助かります。

uproda11.2ch-library.com/src/11122054.zip.shtml

369 名前:368 [2008/10/01(水) 00:36:04 ]
バージョン:Excel2007
OS:Vista

私の環境では、ウィンドウを最大化しておかないと何故かフリーズしやすいです。
フリーズというか、画面は固まりますが裏では動いています。

370 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 03:44:42 ]
>>368
全く試さない上でVBA素人の俺が脊髄反射レス

・基点となるセルからoffsetで上下左右1ずつ隣のセルの値を取得して、
それを評価した方がいいんジャマイカ

・セルのプロパティのアクセスを都度行うのは重いから、
一度マップ範囲を c = Range("x:y") のように配列に入れて、
値から何とかした方がいいんジャマイカ

・ScreenUpdating を最初から False に(ry
嘘ですごめんなさい


371 名前:デフォルトの名無しさん [2008/10/01(水) 07:26:33 ]
Private Sub CommandButton1_Click()
Randomize

Dim hsXmax As Integer 'マップの横最大値
Dim hsYmax As Integer 'マップの縦最大値
Dim hsMap() As Integer 'マップの戦闘力格納用配列変数
Dim i As Integer '行番号
Dim j As Integer '列番号
Dim hsMaxPow As Integer '最大戦闘力
Dim x As Integer 'For用

hsXmax = Cells(6, 57).Value
hsYmax = Cells(5, 57).Value

ReDim hsMap(1 To hsYmax, 1 To hsXmax)

For x = 1 To 1000

Application.ScreenUpdating = False

'マップに戦闘力を設定。マップの一番外側は必ず白色
For i = 2 To hsYmax - 1
For j = 2 To hsXmax - 1
If Cells(i, j).Interior.Color <> RGB(255, 255, 255) Then '白色以外のセルに戦闘力を設定
hsMap(i, j) = Int((99 * Rnd) + 1)
End If
Next j
Next i



372 名前:デフォルトの名無しさん [2008/10/01(水) 07:27:04 ]
'戦闘結果算出
For i = 2 To hsYmax - 1
For j = 2 To hsXmax - 1
If hsMap(i, j) <> 0 Then 'セルに戦闘力が設定されている場合
'そのセルを含め、上下左右のセルの戦闘力の最大値を取得する
hsMaxPow = WorksheetFunction.Max(hsMap(i, j), hsMap(i - 1, j), hsMap(i, j - 1), hsMap(i + 1, j), hsMap(i, j + 1))
If hsMap(i - 1, j) = hsMaxPow Then '上のセルが最大だった場合は、上と同じ色にする
Cells(i, j).Interior.Color = Cells(i - 1, j).Interior.Color
ElseIf hsMap(i, j - 1) = hsMaxPow Then '左のセルが最大だった場合は、左と同じにする
Cells(i, j).Interior.Color = Cells(i, j - 1).Interior.Color
ElseIf hsMap(i + 1, j) = hsMaxPow Then '下のセルが最大だった場合は、下と同じ色にする
Cells(i, j).Interior.Color = Cells(i + 1, j).Interior.Color
ElseIf hsMap(i, j + 1) = hsMaxPow Then '右のセルが最大だった場合は、右と同じ色にする
Cells(i, j).Interior.Color = Cells(i, j + 1).Interior.Color
End If
End If
Next j
Next i

Application.ScreenUpdating = True

Next x

End Sub

373 名前:368 [2008/10/01(水) 07:43:19 ]
↑はソースのコピペです。
一応貼っときます。

戦闘力はランダムのはずですが、
何故か名古屋が強い気がします・・・

374 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 14:08:29 ]
>>368
フリーズは再現できなかったけどとりあえず軽くしてみた
やったことは
1.色を配列に入れてこねくり回すようにした
2.色が変化しない時は再設定しないようにした
3.気に入らなかったのでElseifをSelect Caseにした

375 名前:374 mailto:sage [2008/10/01(水) 14:08:53 ]
Option Explicit
Sub CommandButton1_Click()
Randomize

Dim hsXmax As Integer 'マップの横最大値
Dim hsYmax As Integer 'マップの縦最大値
Dim hsMap() As Integer 'マップの戦闘力格納用配列変数
Dim hsColor() As Long 'マップの色格納用配列変数
Dim hsColor_old() As Long 'マップの色格納用配列変数(比較用)
Dim i As Integer '行番号
Dim j As Integer '列番号
Dim hsMaxPow As Integer '最大戦闘力
Dim x As Integer 'For用
Dim hsCells As Object
hsXmax = Cells(6, 57).Value
hsYmax = Cells(5, 57).Value
ReDim hsMap(1 To hsYmax, 1 To hsXmax)
ReDim hsColor(1 To hsYmax, 1 To hsXmax)
ReDim hsColor_old(1 To hsYmax, 1 To hsXmax)

With Range(Cells(1, 1), Cells(hsYmax, hsXmax))
'シートから色を取得
For i = 2 To hsYmax - 1
For j = 2 To hsXmax - 1
hsColor(i, j) = .Cells(i, j).Interior.Color
Next j
Next i

376 名前:374 mailto:sage [2008/10/01(水) 14:10:02 ]
For x = 1 To 1000
Application.ScreenUpdating = False
'マップに戦闘力を設定
'マップの一番外側は必ず白色
For i = 2 To hsYmax - 1
For j = 2 To hsXmax - 1
If hsColor(i, j) <> vbWhite Then '白色以外のセルに戦闘力を設定
hsMap(i, j) = Int((99 * Rnd) + 1)
End If
Next j
Next i
hsColor_old = hsColor
'戦闘結果算出
For i = 2 To hsYmax - 1
For j = 2 To hsXmax - 1
If hsMap(i, j) <> 0 Then 'セルに戦闘力が設定されている場合
'そのセルを含め、上下左右のセルの戦闘力の最大値を取得する
hsMaxPow = WorksheetFunction.Max(hsMap(i, j), hsMap(i - 1, j), hsMap(i, j - 1), hsMap(i + 1, j), hsMap(i, j + 1))
Select Case hsMaxPow
Case hsMap(i - 1, j) '上のセルが最大だった場合は、上と同じ色にする
hsColor(i, j) = hsColor(i - 1, j)
Case hsMap(i, j - 1) '左のセルが最大だった場合は、左と同じにする
hsColor(i, j) = hsColor(i, j - 1)
Case hsMap(i + 1, j) '下のセルが最大だった場合は、下と同じ色にする
hsColor(i, j) = hsColor(i + 1, j)
Case hsMap(i, j + 1) '右のセルが最大だった場合は、右と同じ色にする
hsColor(i, j) = hsColor(i, j + 1)
End Select
End If
Next j
Next i


377 名前:374 mailto:sage [2008/10/01(水) 14:10:48 ]

'マップ(シート)に色を反映
For i = 2 To hsYmax - 1
For j = 2 To hsXmax - 1
If hsColor(i, j) <> hsColor_old(i, j) Then
.Cells(i, j).Interior.Color = hsColor(i, j)
End If
Next j
Next i

Application.ScreenUpdating = True
Next x
End With
End Sub



378 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 15:41:37 ]
どこかのセルが変更された時に処理(以下、処理A)が走るようにしています。

最初の処理(以下、処理B)でセルを変更しています。
処理Bのときだけ処理Aを走らせないようにしたいのですが、
どうしたらいいでしょうか。

379 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 16:09:13 ]
>>378
Application.EnableEvents = False
かな?

380 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 16:31:03 ]
>>379
まさにそれでした。ありがとうございました。

最初「Application.EnableEvents = False」の一行見たとき意味わかりませんでしたが、
ググッたら使い方でてきて何とかなりました。

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

381 名前:368 [2008/10/01(水) 22:30:32 ]
>>370
>>374
ありがとうございます。
予想以上に速くなりすぎていて驚きました。
色を配列に入れるところまで考えが至りませんでした。

ところで、戦闘力はランダムのはずなのに勝者に偏りがありすぎます。
いくつかのマップで10戦ずつやってみたところ、
愛知県マップ・・・名古屋9勝、西三河1勝、東三河0勝
「目(上中下の3色)」マップ・・・上9勝、中0勝、下1勝
「田(4色)」マップ・・・左上8勝、左下2勝、右上0勝、右下0勝
という結果で、左上に近いほど強いとしか思えません。
謎です・・・



382 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 23:44:27 ]
>>381
謎でもなんでもないじゃん。
・hsMapの値が整数で0-100程度でしかないから最大値を取るセルが複数できやすい。
・Select Caseで上左の順でチェックしているから上や左が優先されやすい。
つまり、上や左から侵食されやすい傾向があるわけ。

最大値を取るセルが複数ある場合に微妙に優先度を調整するか、
値の変動幅を大きく取って最大値を取るセルが一つになるようにするかってところかな。

383 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 05:20:47 ]
Excel2000 で 255文字以上のフルパスの存在チェックで DIRでチェックしようとすると「ファイルが見つかりません。」になるんですが回避するにはどうすれば良いですしょうか?

if dir( 255文字以上のパス ) <> "" then


384 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 05:48:56 ]
Set fs = CreateObject("Scripting.FileSystemObject")
If fs.fileExists(ぱす) = False Then
でいけたかも。他にあれば教えてください。

385 名前:368 [2008/10/02(木) 07:45:57 ]
>>382
それは私も考えました。
それが原因なら、判定の順序を「下→右→上→左」とすれば、
下や右が強くなるはずです。

順序を変えてやってみましたが、
名古屋8勝、西三河2勝、東三河0勝
上7勝、中3勝、下0勝
左上7勝、左下1勝、右上2勝、右下0勝
と、やはり左上に近いほど強いようです。
まあ、10回程度だと偶然偏りができることも考えられますが・・・

386 名前:374 mailto:sage [2008/10/02(木) 10:40:57 ]
>>365
比較する順序ではなく色を入れ替えるタイミングの問題では?

 Select Case hsMaxPow
   Case hsMap(i - 1, j) '上のセルが最大だった場合は、上と同じ色にする
     hsColor(i, j) = hsColor_old(i - 1, j)
   Case hsMap(i, j - 1) '左のセルが最大だった場合は、左と同じにする
     hsColor(i, j) = hsColor_old(i, j - 1)
   Case hsMap(i + 1, j) '下のセルが最大だった場合は、下と同じ色にする
     hsColor(i, j) = hsColor_old(i + 1, j)
   Case hsMap(i, j + 1) '右のセルが最大だった場合は、右と同じ色にする
     hsColor(i, j) = hsColor_old(i, j + 1)
 End Select

と更新前の色を入れてやれば少しは改善するかもしれません

387 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 14:59:02 ]
マクロを実行してファイルを閉じ、再び同じウィンドウで
マクロ入りのファイルを開いても、マクロが実行できません。

VBAを使っていろいろ処理して終了させます。
処理の中では画面更新の抑制やら色々やってます。

マクロを実行したbookを閉じてから、マクロが入った
ファイルを開くと、右クリックで新規ウィンドウ等を
やらない限りは必然的に、既に開いているExcelを使って
ファイルが開かれると思うのですが、そうなるとマクロが
動かないんです。

セキュリティの問題ではなくマクロが無いファイルのような
そんな扱いです。やはり、色々標準の機能を殺しているのが問題で
それが終了しても保持され続けているのが問題なのでしょうか??

388 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 15:20:53 ]
>>387
セキュリティの設定は何になっているんですか?
低になっていてかつApplication.EnableEventsがFalseだった場合
マクロは自動実行されないはずなので何も起きていないだけでは?

389 名前:デフォルトの名無しさん [2008/10/02(木) 20:31:10 ]
1行目と3行目を選択(1行目を選択してからCtrl+3行目を選択)すると、
Range("1:1,3:3").Select
と言うコードが得られますが、
変数を用いて、a行目とb行目を選択する場合には、どのように記述すれば良いのでしょうか。

よろしくお願いします。

390 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 20:41:43 ]
>>389
Dim a As Integer, b As Integer
Rows(a & ":" & b).Select

391 名前:390 mailto:sage [2008/10/02(木) 20:45:59 ]
動かなかった・・・orz

Dim a As Integer, b As Integer
a = 1: b = 3
Range(Rows(a).Address & "," & Rows(b).Address).Select




392 名前:デフォルトの名無しさん [2008/10/02(木) 21:42:23 ]
お世話になります。
for loopの入れ子でループを抜けたいときは
gotoするのが一般的なんでしょうか?
gotoってあんまり使うなと言われているので
For intI = 3 To 65535
For intJ = 1 To 255
'条件が一致すればここからいっきに2つのループを抜けたい
Next intJ
Next intI

あとループ変数って単純にi,j,kとするか
なにかしらわかりいい名前をつけるのかどちらがいいのでしょうか
よろしくお願いします。

393 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 21:48:27 ]
多重ループ脱出は数少ないgotoの出番だぞ。
(無論そのための仕組みが存在する言語なら話は別だが)

ループ変数はi, j, kとするのが単純かつ分かりやすい。
intIですらやめてくれと言うところだ。

394 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 22:11:03 ]
なるほど そうでしたか
ありがとうございました

395 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 22:40:28 ]
>>393
プログラムが大きくなってくると1文字の変数は探しにくい
やりたいことにもよるだろうが
1文字で済ませる癖は付けないほうがいいと思う

396 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 23:09:51 ]
>>395
それはプロシージャを分割した方がいいんじゃないかな

397 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 23:23:45 ]
クラスモジュールと
標準モジュールの違いがいまいちわからん

クラスはオブジェクトとして使ったりコンパイルしてDLLとして参照すると
名前でプロシージャーを呼び出せるってことなのか?

標準だと他のモジュールのって呼び出せない?

398 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 23:39:33 ]
>>389
union(rows(a),rows(b)).Select

399 名前:368 [2008/10/02(木) 23:51:05 ]
>>374
ありがとうございます。
強さが均等になりました。
言われてみれば、あのプログラムでは左上が強くなるのも当然ですね。
実は、初期はちゃんと古いマップから色を持ってきていたのですが、
高速化のためにいろいろやっているうちに、古いマップを省略してしまったようです。

400 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 00:02:25 ]
>>395
ループ自体をForで探せばいいじゃない。
あと、ループ変数をi, jとしないなんてVB以外では聞いたことないってただの個人的経験だけど。

401 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 09:05:00 ]
>>397
VBA分野の話じゃないね、スレ違い



402 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 09:26:22 ]
>>392
2重ループ脱出はForとDoを併用するのが常套手段

For intI = 3 To 65535
  Do Until intJ = 255
    Exit For
  Loop
Next intI

403 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:39:08 ]
Do/Loopを使うと速度が落ちちゃうじゃないか、とか言ってみる。

404 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 20:28:55 ]
>>402
それは無い

405 名前:デフォルトの名無しさん [2008/10/03(金) 22:13:12 ]
ループ抜けの話が出ていたので、質問をさせてください。
例えば、

for i = 1 to 100
if cells(i,1).value like "hoge" then
set cl = cells(i,1)
end if
next

のような形で、該当する最初のセルに処理をした時点でループを抜けるにはどのように記述すれば良いのでしょうか。
上記だと2つ以上の該当があった場合、後のセルがsetされてしまいます。

406 名前:>401 [2008/10/03(金) 23:22:31 ]
( ゚д゚)

407 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 23:40:02 ]
>>405
セルをセットした後にExit For

408 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 00:55:23 ]
ほとんど基礎もできていませんがアドバイスお願いします

自宅にパソがないので平日会社で試すしか方法がないのですが、何枚かのエクセルファイルを開きセルA6に別の表から拾った値を引っ張ります
これがシートならば全シートを選んでVLOOKの式でもA6に入れればいいのでしょうが各ファイルを別々に保存しなければなりません

一度一つのファイルにまとめて入力後またばらしてもいいのですがそれならファイルを開けて手入力する手間とさほど変わりません
多くて40ファイルです

どうぞよろしくお願いしますm(_ _)m

409 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 01:25:38 ]
>>408
その情報だけだと使えそうな手段は2つくらいしか思いつかない
1.VBAで表をまとめてLOOKUP
2.VBAで該当する値を直接取りにいく

>一度一つのファイルにまとめて入力後またばらしてもいいのですが
何がしたいのかよく分からないw

>ファイルを開けて手入力する
これは目視で値を確認していって該当する値を移すってことでしょうか?

>多くて40ファイルです
40ファイル見るだけなのかすべて更新するのかどちらでしょうか・・・

410 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 01:47:52 ]
早速のレスを有難うございます。説明が至らずすみません
おそらくあまりに初級なので難しく捕らえていらっしゃるかもしれません
見に行く表にはA列に番号(12桁)B列にも番号(9桁)がありこれが多くても40種の意味です。重複はしていない番号ばかりです
そしてA列の番号がファイル名にもなっている1枚シートしかないファイルのセルA4に先程の12桁が入っているがセルA6に今までは手入力で9桁番号を入れていました
目視です。一応FIND窓で捜しはします…

独立させずシートとしてまとめたら一度に処理できるかと考えたのですが、、

411 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 02:00:03 ]
すみません余りに眠いのでちょっと離れます

なお40種は40行の意味です



412 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 09:52:11 ]
>408,410
横レスします。
状況を私なりに解釈し、不足するところをおたずねします。
1 参照元ファイル(以下ブックと呼びます)は最大40個ある
 (408の下から2行目の記述から)

2 参照元ブックにはそれぞれ40行×2列(A列、B列)のデータがある
 (410の上から3行目の記述と411の「40種は40行」の記述から)

3 (結果を求める)作業用ブックのA4セルに12桁の番号が入っている
 (410の上から4行目の記述)

4 作業用ブックのA6セルには今まで9桁番号を手入力していたが → これを自動で表示させたいってこと?

質問
Q1 上の解釈でいいんでしょうか?
Q2 40個のブックはそれぞれシートは何枚ですか? 1枚ずつだったら40シートの1ブックにまとめられませんか?


413 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 12:46:49 ]
レスを有難うございます
まず参照元と作業用の違いを私自身があまりわかってないかもしれません。携帯からのカキコで字数が限られ申し訳ないです(>_<)
@A→参照する表は1ブックでそこに多くて40行2列、少ない時は10行2列くらいの表が1シートだけに表記してあります
BC→OKです

Q2→確かにひとつのブックにまとめればいいのですが、保存が1ブック1シートでないといけないのです(請求書みたいな感じ)
なおかつそのブック名もセルA4の番号をつけないといけません

15ブックくらいなら目視&手入力でもいけますが日によって30-40ブックとなると間違いや画面の一杯さで
頭がくらくらしてしまい、楽な方法がないかとお尋ねしてみました

まだ言葉足らずかと思いますがどうぞよろしくお願いいたします

414 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 14:25:37 ]
初心者にありがちなこと:
 やりたいことの自分なりの稚拙な解決方法を思いつくのだが、その具体的なやり方がわからずに
 ぐだぐだと質問&回答を続ける。

良い質問方法:
 やりたいことをまず具体的に書く。やりたいことというのは、ユーザレベルでの話し。

415 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 15:03:16 ]
すみません本当に初心者なもので……

やりたい事は毎日新たに発生するブックのセルA6に、セルA4に対応した9桁の番号を拾ってきて自動入力し保存するという事です
セルA4に対応した番号は他のブックに見に行きます

この表現ではどうでしょうか? あまりに簡単な作業かもしれませんが良い方法があればよろしくお願いします

416 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 16:11:49 ]
致命的に説明が下手だな。とはいえ、普通の奴はこんな感じが標準なのかもしれんが。
商品マスタ(Product.xls)と注文ブック(Order.xls)ということにして、仕様を書いてみた。

[前提]
1.Product.xlsのSheet1のA:B列に何らかのデータが入力されている
2.毎日Excel Bookが40ファイル程度できる
3.そのBook名は[12桁の文字列].xls(以降、Order Bookと表記)
4.Order Bookには1シート(以降、Orderシート)しか存在せず、そのシートのA4には[12桁の文字列]が設定されている

[やること]
1.毎日発生するOrder BookのOrderシートのA6に、Product.xlsから取得したデータを設定し上書き保存する
2.データの取得方法は、Product.xlsのSheet1!A列の中から、[12桁の文字列]を探し、適合する
  行が合った場合は対応するB列の値を持ってくる

[異常処理]
1.Order Book名とA4の内容が異なる場合は***する
2.[12桁の文字列]が見つからなかった場合は***する

[疑問]
>多くて40行2列、少ない時は10行2列
これはどのタイミングでどのような理由で変更されるのか?


417 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 16:16:17 ]
それから簡単、簡単言うな。
お前が超絶難しいと思ってるものでも、ソルバ一発で解決できる類の問題もあれば、
単純作業を自動化するだけなのに、プログラム的にはすげー面倒な場合もある。

418 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 17:42:54 ]
はぁー言われてみたらその通りです。こういう表現をするんですね? 確かにこのように書け、と言われたらできるのかどうか

それで1点、OrderBook名には「請求書M...」みたいにセルA4に日本語が3文字ついていたかもしれません

また、10コか40コかはメール受信によって左右されます。メールの添付をどこかのフォルダに保存し何等かのマクロを実行するとよそにそれに対応した9桁の番号が、
検索されるのか作成されるのかするのでそれを本日分として拾ってくるわけです。でセルA6は空白なので入力して完成させる…

自分は記録マクロしかできないのですが、もし自分がVBAに詳しければ@OrderBookのシート1を一つのブックにまとめる
AProductシートもそこに挿入BVlookupでセルA6に値入力Cシートをばらして保存
とかが簡単に出来るのかな?のイメージでした;ω;
スミマセン

419 名前:412 mailto:sage [2008/10/05(日) 17:49:34 ]
>408,410,413,415
もう一回自分なりに解釈したものを書きます。
1 参照元ブック(1シート)は日々内容が変わるけど、A列、B列にデータが記録されている。
 (内容が固定されていないということは413の「多くて40行2列、少ない時は10行2列くらいの表が」から推測)

2 結果を求める(作業用)ブックは複数生まれる
 (413の「保存が1ブック1シートでないといけない」ということと、
  「15ブックくらいなら目視&手入力でもいけますが日によって30-40ブックとなると」から推測)

3 作業用ブックは「ひな型」となるものを呼び出してA4セルに12桁の番号を入力し、A6セルには参照元
 ブックから自動参照した結果が表示されたところで「12桁の番号」をブック名として名前を付けて保存する

4 上記3を15〜40回繰り返す

これでいいのかな?

もし、参照元ブックの名前が固定されているんであればVBAじゃなくてもできそうだけど。
作業用ブックのひな型のある範囲に参照元ブックのデータをまるごと外部参照でもってきておいて、
A6セルにVLOOKUP関数を書いたらいいんじゃないかな。
外部参照って言い方が正しいのかわからないけど、ヘルプで
「ほかのブックやアプリケーションへのリンクを設定する」を見てみてください。

420 名前:412,419 mailto:sage [2008/10/05(日) 17:50:56 ]
ありゃ、回答を書いているうちに質問者さんからの書き込みがあった。419はなかったことにしてください。

421 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 18:16:27 ]
お世話になります
3.の行程上でセルA4には12桁の番号が既に入った状態で届きます。こちらで入力はしません

VLOOKもいいのですが作業用ブックの開け閉めが面倒いというか少ない時はいいのですが、多い時にはどれがどれやらわからなくなるのです



422 名前:420 mailto:sage [2008/10/05(日) 18:41:03 ]
>421
↑のことも入れて、もう一回自分なりに解釈したものを書きます。
1 参照元ブック(1シート)は日々内容が変わるけど、A列、B列にデータが記録されている。
 (内容が固定されていないということは413の「多くて40行2列、少ない時は10行2列くらいの表が」から推測)

2 結果を求める(作業用)ブックはメールにて複数送られてくる
  なので、作業用ブックに個々に計算式等を入れるのは無理(あるいは極力回避)

3 作業用ブックのA4セルには既に12桁の番号が入力されていて、
 ・現状では  参照元ブックを開いてA列に一致する行のB列の番号(9桁)をA6セルに入力して保存(の繰り返し)
 ・したいこと マクロブックを開いてマクロを実行したら、複数の作業ブックを手動で開かなくても
        それぞれのブックのA6セルに自動的に対応する9桁の番号が記録されている
  ※作業対象のブックを指定する作業は手動か?
   (作業対象ブックが保存されているフォルダを指定できれば自動化も可能)

423 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 18:52:53 ]
出来の悪いSEと出来の悪いクライアントのgdgdな打ち合わせの例

424 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 19:10:08 ]
確かに文章だけで説明する事がこんなに大変とは!

'作業対象のブック指定は手動?'の意味が今一つわかりませんがデスクトップにでも予めフォルダごと保存しておいて、作業をしてもらおうか?という算段です
というのも引継ぎでは手入力推奨でしたのでネットワークの中で何かやると怒られるかも?とか考えたり

ま、推奨程度ですからきちんとセルA6に番号が拾えていたら結果オーライだと思うのですが…

425 名前:422 mailto:sage [2008/10/05(日) 20:00:20 ]
>424
流れとしてこんな感じかな? 画面更新をしないようにすれば画面がチラつきません。
1 作業ブックが収められているフォルダ中のエクセルファイルの一覧取得
2 参照元ブックを開く(ついでに2列×数十行のデータを配列に取得)
3 参照元ブックを閉じる
4 上記1で取得したファイル一覧からひとつずつ処理
(1) カレントブックを開く
(2) A4セルの値を取得
(3) 配列を調べて対応する値をA6セルに書き込む
(4) カレントブックを閉じる(変更確認ダイアログを非表示にしておくといい)
(5) (1)〜(4)の繰り返し
5 終了(画面更新再開)

処理がちゃんと進んでいるか確認するために、マクロを記録したブックに
A列:カレントブック名(もしくはフルパス)
B列:A4セルの値
C列:A6セルに書き込んだ値
を上から順に書き込んでみるといい。その場合は画面更新を停止しないように。


426 名前:デフォルトの名無しさん [2008/10/05(日) 20:02:14 ]
ググったのですが適切な単語が思いつかなかったので質問させてください。
関数を自作しようと思ったのですが、
その関数が代入されるセルのオブジェクトを取得することは可能でしょうか?
入門サイトを一通り見たのですが、そのような記述が見つかりませんでした・・・。
可能であれば関連するキーワードか、簡単な実装方法など教えていただけるとうれしいです。

427 名前:デフォルトの名無しさん [2008/10/05(日) 20:02:53 ]
よろしくお願いします。

OS:XP、Excel2003

Module5で、Public Sub AAA() という関数を作成して
Module1で使おうとすると「名前が適切ではありません」というエラーが出ます。
Module1に関数を作成して、Module5使うことは出来ています。
これは、モジュール名の順番みたいなものが関係しているのでしょうか?


428 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 20:30:01 ]
質問です。(WinXP,Excel2003)
マルチスレッドで処理をしたいのですがうまくいきません。
以下のテストコード(スレッド系関数の宣言は省略)で、セルへの書き込み自体は問題なく出来るのですが、
エクセル終了時や保存時等ににエクセル自体が落ちてしまいます。
どこが問題なのでしょうか?ご教示お願いします。

'----モジュール------
Public Const STILL_ACTIVE As Long = 259
Public Function testThread(ByVal n As Long) As Long
  Dim i
  For i = 1 To 10
    Sheet1.Cells(1, n) = i
    DoEvents
  Next i
  testThread = 0
End Function
'----シート------
Private Sub test_Click()
  Dim hThd, idThd, dwExCode As Long
  hThd = CreateThread(0&, 0&, AddressOf testThread, 1, 0&, idThd)
  Do
    DoEvents
    If (GetExitCodeThread(hThd, dwExCode)) Then
      If (dwExCode <> STILL_ACTIVE) Then Exit Do
    End If
  Loop While True
  CloseHandle hThd
End Sub

429 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 21:11:43 ]
>>425
は、はぁ、、そんなかんじかと思いますがそれは記録マクロでできる作業なのでしょうか……
あまりな初級な質問ですみません

430 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 21:36:03 ]
作ってくださいとちゃんと言えよ、アホ

431 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 21:37:46 ]
>>428
ド素人がVBAでマルチスレッドを使おうとするのが問題



432 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 22:21:52 ]
は、はぁ、、例えばコードを書いてもらう事を作るといいますか?
作ってください!お願いします(^人^)
でももしかして記録マクロでもできる人はできるのかと思ったり(自分では無理ですが)……

何か自分の知らない簡単な方法があるような気がしてならなかったり?

433 名前:デフォルトの名無しさん [2008/10/05(日) 22:32:39 ]
コード書いてもらう事は、作る事に他ならないが・・・。
作るって、何を作る事だと思う?

と言うか、作成依頼はスレ違い。

自分でやって、分からない事を聞くようにしておくれ。

434 名前:425 mailto:sage [2008/10/05(日) 22:39:17 ]
>432
このスレのbPの
★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
   コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
   ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
は見てなかったようですね。

自分は明日の夕方以降ならなんとか対応できると思いますが、急ぐんだったら
この件のやりとりの部分 を印刷でもして職場でVBAのわかる人に見せてください。
マクロの記録だけではほとんどできません。条件分岐とか繰り返しとかファイル処理とかいろいろ
あります。
あるフォルダの中のディレクトリ一覧を取得して印刷する部分だけでも↓みたいになります。
www.excel.studio-kazu.jp/mag2/backnumber/mm20041012.html

435 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 22:39:41 ]
皮肉もわからないとかw

436 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 22:44:42 ]
dirなりなんなりでファイルをリストアップして、オープンしてfindしてrange.valueに代入してセーブしてクローズする
ってだけの簡単なことなんだけど、細かいところが不明なんで丸々作るめんどくさいのでパス。

437 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 22:46:49 ]
>>425でわかんないなら、もうこのスレ向きの話題じゃなくなった。

438 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 22:47:20 ]
マァマー(´・ω・`)

439 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 23:08:07 ]
>>434
エクセルの学校の添付を有難うございました

私自身は忘れているとはいえ?ベーシックくらいは少し学んだのですが全く身についていないようですorz
手でやると、1回なら簡単な作業なのに文章にするとこんなにややこしくなるとは!!
ちょっとこの週末は時間がなかったのですが確かに自分であれこれ試してみたいと思います
会社では現在は時間が全くありませんがそのうち手薄になれば挑戦してみます!

440 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 23:30:16 ]
昔かじった言語でも、1年経つとほとんど動かせなくなるんだよね。
以前仕事で、とあるScript言語で食ってたんだけど、1年経ったら全部忘れてた。

441 名前:デフォルトの名無しさん [2008/10/05(日) 23:32:35 ]
>>426は自己解決しました。(というかバグが別の場所にあることが分かった)
で、もう一つ質問させてください。
自作関数の演算結果を複数のセルに表示したいのですが、
Function func()
func = 1
ActiveCell.Offset(1).Value = 2
End Function
こうやるとこけてしまいます。
funcの返り値でなくActiveCell.Valueに代入すると循環参照で怒られます。
どうにか解決する方法はないのでしょうか?



442 名前:427 [2008/10/05(日) 23:38:12 ]
>>427
お願いします。

443 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 23:54:28 ]
>>427,>>442
Module5に作成してModule1で呼ぶのも
Module1に作成してModule5で呼ぶのも
問題なく出来ている

つまり「Module5に作成してModule1で呼ぶ」こと以外に問題があるということだ
ちょっとした自分のミスに気付かず、首を捻り続けたりソフトを疑ったりなんてよくあることだ

まずは新規ブックを作成して、標準モジュールを5個挿入し
Module5にPublic Sub AAA()
Module1にAAAの呼び出しプロシージャだけ書いて実行してみろ
それでダメならExcelもしくはOfficeはたまたWindowsを再インストールした方がいい
これで問題なく実行できるなら、自分のミスに気付いてないだけだ

444 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 01:10:32 ]
>>440
プロの人でさえ1年で!?

なんとか頑張ってみますと書いたものの、あの業務量を思うと頑張る暇などとてもなくゆーうつ・・・

はぁー、、楽したい。。

445 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 01:44:55 ]
>>441
ttp://support.microsoft.com/kb/170787/ja

446 名前:441 mailto:sage [2008/10/06(月) 02:03:42 ]
>>445
こんな・・・制限が・・・あった・・・なん・・・て・・・orz
VBAなんか大っ嫌いだうわあぁぁん
ありがとうございました。本当に助かりました。

447 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 02:41:53 ]
厨ばっか湧いて来やがるのはなぜだ

448 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 05:32:26 ]
なんかゴネてる人さあ、、、
まずは、A6にvlookup入れて値コピーで上書きするマクロでも作ったら?
ファイル開いたり保存するのは取り敢えず手動としても、目視手作業で
入力してるよりよっぽど楽になると思う。
そこから徐々に、自動でできる部分を増やしてけばいいんじゃねーの?
あんたがVBA習得するまで仕事が待っててくれるならいいけどさ、
なんも出来ねーくせに余計なことばか考えて、自分で仕事増やしてるだけじゃね?

449 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 09:12:10 ]
>>444
月100時間勉強するのを三ヶ月位続ければ、あとは楽になるよ

450 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 19:17:30 ]
皆様お疲れ様です
>>448
それはいい考えだと、本日早速セルA6にA4を見て予め用意した表から拾って来てくれ頼む!を打ち込んだところ………
後ろにもう一枚嫌なシートがあってなんと式がセルA6にそのまま表示されてしまうていたらく
後ろのシートとなんかリンク?が貼ってあるかのような得体のしれなさでもう素直にFIND窓で目視で探しました
件数も15件くらいでしたし
他の仕事があまりに立て込んでてそのシート間の関係さえ検討できないほどの忙しさなのです

もうフラフラです
皆様も季節柄お体気をつけて!

451 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 19:30:13 ]
えーと、このスレはVBAでプログラミングする人の為のスレだから、
Excelの使い方はよそで聞いて&愚痴ってくれ。



452 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 20:24:01 ]
記録マクロで挑戦したんですよ〜 一月100時間3ヶ月をいつか夢見て……

453 名前:434 mailto:sage [2008/10/06(月) 20:52:44 ]
>408,〜,452
作ってみました。長いので2件に分けます。
' DEBUG と書かれた行はテストのためにマクロを記録しているブックのアクティブシートに
処理対象ブックのフルパス、12桁の番号、FINDで求めた9桁の番号を表示させるためのもので、
丸々1行消しても動くと思うけど、こちらでは試してません。
例外処理は入れてません。フォルダーのパスとか検索範囲とかもプログラムで直接指定してますが、
マクロを記録しているブックに設定できるようにするとメンテがラクですね。
詳しい方には添削してもらえるとありがたいです。
Option Explicit
Dim BK_M As Excel.Workbook, TATE As Long ' DEBUG
Dim BK_I As Excel.Workbook, BK_O As Excel.Workbook
Dim SEARCH_PATH As String, FILE_NAME As String

Sub prog_408()
Set BK_M = ActiveWorkbook ' DEBUG
' 参照するだけとなるブックのフルパスやファイル名は適当に変えてください。
Workbooks.Open Filename:="D:\TEST_FOLDER\PRODUCT\PRODUCT.xls"
Set BK_I = Workbooks("PRODUCT.xls")

TATE = 3 ' DEBUG
' 変更対象となる10〜40個のブックが記録されているフォルダです。
' このフォルダにはメールで送られてくるという処理対象だけのブックを置いておくこと。
SEARCH_PATH = "D:\TEST_FOLDER\"
FILE_NAME = Dir(SEARCH_PATH & "*.xls", vbNormal)
Do While FILE_NAME <> Empty ' 繰り返し
  Call PROC_1
Loop
BK_I.Close
Set BK_I = Nothing
Set BK_M = Nothing ' DEBUG
End Sub

454 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 20:53:51 ]
続きです。
Private Sub PROC_1()
Dim WK_PATH As String, BANGO_12 As String, BANGO_9 As String
Dim c As Excel.Range

WK_PATH = SEARCH_PATH & FILE_NAME
Workbooks.Open Filename:=WK_PATH
Set BK_O = Workbooks(FILE_NAME)
With BK_M.Worksheets(1)        ' DEBUG
  .Cells(TATE, 1).Value = WK_PATH  ' DEBUG A列に処理対象ブックのフルパスを書き込む
  BANGO_12 = BK_O.Worksheets(1).Range("A4").Value
  .Cells(TATE, 2).Value = BANGO_12 ' DEBUG B列に「12桁の番号」を書き込む
End With ' DEBUG
' 次行のA2:A41は実際のデータの開始位置と考え得る最大の範囲を指定してください。
Set c = BK_I.Worksheets(1).Range("A2:A41").Find(BANGO_12, LookIn:=xlValues)
If c Is Nothing Then
  BANGO_9 = ""
Else
  BANGO_9 = c.Offset(0, 1).Value ' ←ここで9桁の番号が求められました
End If
BK_O.Worksheets(1).Range("A6").Value = BANGO_9 ' ←やりたいこと はこの部分です
BK_M.Worksheets(1).Cells(TATE, 3).Value = BANGO_9 ' DEBUG C列に「9桁の番号」を書き込む
BK_O.Close
Set BK_O = Nothing

TATE = TATE + 1 ' DEBUG
FILE_NAME = Dir()
End Sub

455 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 21:37:47 ]
y様に頼めば全て解決

はい次の方

456 名前:448 mailto:sage [2008/10/06(月) 21:40:19 ]
今までさんざんシートは1枚だと言ってたのは嘘か。
もうあきれて物も言えん、、、

457 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 10:54:20 ]
マンマー(´・ω・`)

458 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 22:39:19 ]
408,410,411,413,415,418,421,424,429,432,439,450,452の人はもういなくなったのかな?


459 名前:デフォルトの名無しさん [2008/10/07(火) 22:54:35 ]
初心者でおじゃまします。

:= ←これはどういう時に使うものですか?

本見てもよくわかりませんでした('A`)

460 名前:デフォルトの名無しさん mailto:sage [2008/10/07(火) 23:59:42 ]
>459
詳しい人がいないようなので、未熟ながら小生がヒントを。
上の454のマクロに2カ所使ってありますが、いずれもメソッドのパラメータを指定してますね。
Workbooks.Open Filename:=WK_PATH
 →Openメソッドでフォルダのパスを指定(Openには読みとりモードも指定できますが、この場合は
  記載してないので規定値ということ)
Set c = BK_I.Worksheets(1).Range("A2:A41").Find(BANGO_12, LookIn:=xlValues)
 →Findメソッドで値検索を指定

VBAのエディタの画面でsortメソッドのHELPを見てください。10個以上のパラメータを指定できます。
省略できるものもあるので、どのパラメータをどのように指定するかをメソッドの行の中に(見た目は
改行されていてもひとつながりなら1行とみなす)続けて書くときに必要となるものです。

こういう説明でわかりますか?

461 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 00:02:45 ]
一般に名前付き引数と呼ばれている。



462 名前:460 mailto:sage [2008/10/08(水) 00:12:19 ]
一部訂正
→Openメソッドでフォルダのパスを指定 じゃなくて、
→Openメソッドでファイルのフルパスを指定 だった。

463 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 21:17:17 ]
>>453-454さん
お時間を割いて頂きたいへん有難うございました
ノートに早速書き写したところなんと2頁にも及ぶなんて!(記録マクロと大違い)
段落が判らないので近い内ネカフェに印刷しに行けたら、と思っています
本当にありがとうございました
また、余りの忙しさにお礼が遅れすみませんでした



あの後記録マクロに成功し開けたり閉じたり繰り返したりができないものの、VLOOKでショートキーを使い保存までこぎつけました
目視と比べとても楽ちんでした
ところがご指摘のとおり後ろにマクロ用?のようなシートがついているせいか?セルの表示が尋常でなく無理矢理値貼付けで乗り切ったのです
その後9桁の数字が入力されたブックをマクロに通す作業がありましたので






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

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

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