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


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

Excel VBA質問スレ Part9



1 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 15:42:51 ]
ExcelのVBAに関する質問スレです

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

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


577 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 21:34:00 ]
>>574
多分functionとrangeを使ってどうにかこうにか書くのだと思うのですが上手くいかない

578 名前:デフォルトの名無しさん mailto:sage [2009/01/18(日) 21:36:51 ]
>>577
ヒント
Workbook_SheetChange
Application.EnableEvents = False

579 名前:教えてください [2009/01/20(火) 00:51:55 ]
質問です。初心者です。
複数のブックに散らばっている同じ名前のシートを、1ブックの1シートにまとめたいのですがうまくいきません。
msgbox "5"までは表示されるので、次の行がおかしいのだと思います。
「motosheet.」の記述を消すとマクロ自体は動作するのですが、コピー元のブックではなくてコピー先のブックを参照してしまいます。
なぜか、rangeの親オブジェクトを記述すると「実行時エラー 1004 アプリケーション定義またはオブジェクト定義エラー」となります。
1行前はrangeの親オブジェクトを記述しても問題ないのに・・・
本当に困っています。よろしくお願いします。



580 名前:教えてください [2009/01/20(火) 00:52:34 ]

Private Sub CommandButton2_Click()
Application.ScreenUpdating = False

Dim motobookspath As Variant
Dim motobookpath As Variant
Dim 先ブック入力済み最終行番号 As Long
Dim データ貼り付け開始行番号 As Long
Dim sakirange As Range
Dim motorange As Range
Dim motobook As Workbook
Dim motosheet As Worksheet
Dim 入力済み最終行番号 As Long

motobookspath = Application.GetOpenFilename(filefilter:="Exclブック,*.xls", MultiSelect:=True)
MsgBox "1"



581 名前:教えてください [2009/01/20(火) 00:53:00 ]

For Each motobookpath In motobookspath
先ブック入力済み最終行番号 = ThisWorkbook.Worksheets("データ").Range("i1").End(xlDown).Row
データ貼り付け開始行番号 = 先ブック入力済み最終行番号 + 1
MsgBox "2"

Set sakirange = ThisWorkbook.Worksheets("データ").Cells(データ貼り付け開始行番号, 1)
MsgBox "3"

Set motobook = Workbooks.Open(Filename:=motobookpath)
Set motosheet = motobook.Worksheets("データ")
MsgBox "4"

入力済み最終行番号 = motosheet.Range("i1").End(xlDown).Row
MsgBox "5"
Set motorange = motosheet.Range("a2", Cells(入力済み最終行番号, 19))

motorange.Copy Destination:=sakirange
motobook.Close savechanges:=True
Next

Application.ScreenUpdating = ture

End Sub

582 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 01:06:50 ]
Set motorange = motosheet.Range("a2", Cells(入力済み最終行番号, 19))

Set motorange = motosheet.Range("a2", motosheet.Cells(入力済み最終行番号, 19))

583 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 06:51:42 ]
巷ではこういうコードが普通にあんのかね。

584 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 11:38:28 ]
誰もがプログラミングの専門家じゃないからね。
入門書を斜め読みして断片的な知識で「動けばいい」程度のコードを書いてる人のが圧倒的に多いよ。

585 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 19:28:45 ]
超初心者で申し訳ありませんが・・・
エクセルのシートにある数字と文字列をCSVファイルに下記のように出力したいです。

(エクセル) 
      123,鈴木
      1013,田中
(出力) 番号,名前
     0123,鈴木
     1013,田中

自分で作ってみたところ、下記のように文字列になってしまいます。
(出力) ”番号”,”名前”
     ”0123”,”鈴木”
     ”1013”,”田中”

となってしまいます。
どのようにすれば良いのでしょうか。
よろしくお願い致します。



586 名前:579 [2009/01/20(火) 21:14:18 ]
>>582
うぉー!! ありがとうございます!!!!
2日悩み続けてました。CellsオブジェクトもThisworkbookの子オブジェクトとして認識されて
しまっていたのですね。
でも悩みに悩んでいるといろんなことを考えるから、勉強にはなりますよね。

>>583
もっと違った記述方法があるんですかね?教えてください。

587 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 21:48:51 ]
>>585
どんなプログラムを作ったの?

588 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 22:07:54 ]
>>579
まず変数名に日本語を使うところからダメだわ。

589 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 22:14:47 ]
>>588
それは場合によりけりだな

590 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 22:21:17 ]
場合というか,使われ方とか規模とか書く人とかによるな
どちらかに決めて使い分けはしない

591 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 00:29:10 ]
俺も変数名に日本語使うの抵抗あるけど
日本語使うとコードが分りやすくなるような気もするから
使おうかなとも思うけど…
でも抵抗あるんだよなー

592 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 00:39:52 ]
英語だと既存の関数名、メソッド、プロパティ、その他予約後などと被る時、
ローマ字で書くのは嫌いだから日本語で書いちゃう

593 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 01:02:53 ]
>>592
確かに!
日本語で書けば被らないな
てことは日本語で書いたほうが合理的だな

594 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 05:44:10 ]
ActiveXコントロールのテキストボックスをワークシート上で使う場合、
Heightを文字の大きさの2倍以上にしないと、文字が崩れますが
解決法はありますか?

595 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 07:15:08 ]
日本語は入力が面倒臭いのが難点。



596 名前:デフォルトの名無しさん [2009/01/21(水) 20:02:04 ]
Excel2003にて、インターネット上からXMLを取得して利用するツールをつくって
いるところなのですが、文字化けを起こします。

Dim get_xml As Object
Set get_xml = CreateObject("MSXML2.DOMDocument.3.0")
get_xml.async = False
get_xml.Load (src_url)

抜粋するとこのようなコードです。
このときに、 ‖ この文字だけが、半角?に変換されてしまいます。get_xml.Load
した直後で既に?に変わってしまっているのですが、どうすれば解消するでしょうか?
取得するxmlはUTF-8で、IE等のブラウザから見ると正常に‖と見えます。
よろしくおねがいします。

597 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 20:23:54 ]
>>596
>>1★3,★4

598 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 22:56:21 ]
>>597

失礼しました。。。

599 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 17:46:03 ]
日本語の変数名に関しては、漢字のみの送り仮名無し。って条件ならOKにする事が多いなぁ。
送り仮名が入ると面倒だよね。
あとは、変数名一覧表を作っておく事が絶対条件かも・・・。

600 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 18:10:08 ]
>>599
Option Explicitは必須だね。
なまじわかりやすすぎて、同じ意味の別の熟語に無意識に脳内変換しちゃうことがある。

601 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 19:03:30 ]
質問です。宜しくお願いします

セルA1には、「8:00」がはいっているとして、

Option Explicit

Sub test1()
UserForm1.TextBox1 = Range("a1").Value
UserForm1.Show
End Sub

これで、テキストボックスに「0.33333333」じゃなく、
きちんと時刻を表示させるにはどうすればよいですか。

602 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 19:27:06 ]
右辺をRange("A1").TextとかFormat$(range("A1").Value,"h:mm") など。
TextはA列のセル幅が狭いと##とかなるけど。

603 名前:質問です [2009/01/22(木) 20:03:19 ]

Sub test()

Cells(1, 1).Activate
Do Until ActiveCell = ""
入力値 = ActiveCell
If 入力値 Like "*[C,CX*,O,OX*,O2,O2X*,Fe]" = True Then
If 入力値 Like "*[O,OX*]" = True Then
If 入力値 Like "*O" = True Then
処理 = 1
ElseIf 入力値 Like "*X2" = True Then
処理 = 2
End If
ElseIf 入力値 Like "*[Fe,Fe*]" = True Then
If 入力値 Like "*Fe" = True Then
処理 = 3
ElseIf 入力値 Like "*X2" = True Then
処理 = 4
End If
Else
If 入力値 Like "*[O2,C]" = True Then
処理 = 5
ElseIf 入力値 Like "*X2" = True Then
処理 = 6
End If
End If

604 名前:質問です [2009/01/22(木) 20:04:18 ]
ElseIf 入力値 = "*[Au,AuX*,Ag,AgX*,Pt,PtX*,Au1,Au1X*,Ag1,Ag1X*,Pt1,Pt1X*]" = True Then
If 入力値 Like "*[Au,AuX*,Ag,AgX*,Pt,PtX*]" = True Then
If 入力値 Like "*[Au,Ag,Pt,]" = True Then
処理 = 7
ElseIf 入力値 Like "*X2" = True Then
処理 = 8
End If
ElseIf 入力値 Like "*[Au1,Au1X*,Ag1,Ag1X*,Pt1,Pt1X*]" = True Then
If 入力値 Like "*[Au1,Ag1,Pt1]" = True Then
処理 = 9
ElseIf 入力値 Like "*X2" = True Then
処理 = 10
End If
Else
処理 = 11
End If
Else
処理 = 12
End If
ActiveCell.Offset(0, 1).Activate
ActiveCell = 処理
ActiveCell.Offset(1, -1).Activate
Loop
End Sub

どうも分岐がうまくいかないのですが。

605 名前:質問です [2009/01/22(木) 20:05:07 ]
以下、その処理文字列です。
対象に[*]があることで違う分岐を選んでいそうですが、
ほかのものも予想外の分岐をするのですがなぜでしょうか。
(説明が下手ですいません)
J0015-1*2
J0015-2*2
J0235-2PtAuX10
H0053-1PtX2
H0036-2C
H0037-1CX2
J0004-1*2-O
J0004-1*3-O1X2
J0004-1*3-OX2
H0053-1Pt1X2




606 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 21:16:29 ]
NAMAE = Cells(1, 1)
KUMI = Cells(2, 1)
If NAMAE = "" Then
NAMAE = "*"
End If
If KUMI = "" Then
KUMI = "*"
End If

row1 = 3

Do While Cells(row1, 1).Value = ""
Set aaa = Cells(row1, 2).Find(What:=NAMAE, LookAt:=xlPart)

Set bbb = Cells(row1, 3).Find(What:=KUMI, LookAt:=xlPart)

If Not aaa Is Nothing And Not bbb Is Nothing Then
'条件が合ったときの処理
End If
row1 = row1 + 1
Loop

変数のNAMAEとKUMIを検索項目にして目当ての行を見付けるプログラムを作ってます。
例えばNAMAEに入力があればKUMIがスペースでもNAMAEが一致する行をすべて検索できるようにしたいのですが、
上のようにすると検索対象の一覧の中で名前(row1, 2)が一致しているのに、組(row1, 3)がスペースの行が検索に引っかかりません。
一覧の中で検索対象セルの入力有無に関わらず、検索に引っ掛けるようにするにはどうしたらいいでしょう?
質問がわかりにくいとは思いますがお願いします。

607 名前:606 mailto:sage [2009/01/22(木) 21:23:56 ]
すいませんまちがえました。

上の
Do While Cells(row1, 1).Value = ""   



Do While Cells(row1, 1).Value <> ""
の間違えでした。

608 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 22:23:09 ]
読む気になれない・・・。

609 名前:606 mailto:sage [2009/01/22(木) 23:37:24 ]
すいません。
最善の処置かはわかりませんが、自己解決しました。
スレ汚し失礼しました。

610 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 00:05:26 ]
特定のEXCELシートが開いている時にはそのシートを閉じ、
開いていなければ何もしないという処理って可能ですか?

611 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 00:08:50 ]
>>610
ブックじゃなくてシート?

612 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 00:28:23 ]
>>610
ブックなら可能
やりかたは自分で調べろ

613 名前:610 mailto:sage [2009/01/23(金) 00:29:16 ]
>>611
間違えました。
シートではなくブックです。
失礼しました。

614 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 01:04:27 ]
>>613
Workbooks( ).Close

615 名前:610 mailto:sage [2009/01/23(金) 01:16:51 ]
>>614
それって全部閉じませんか?
ブックAでマクロを起動するとブックAはそのままでブックBを閉じる機能なんですが。
そしてブックBが閉じている状態で起動してもエラーがおきないようにしたいです。



616 名前:603 [2009/01/23(金) 01:22:49 ]
長かったので問題の箇所まとめました。

If 入力値 Like "*[C,O,O2,Fe]" = True Or 入力値 Like "*[CX,OX,O2X]*" = True Then

この分岐で(入力値)
J0235-2PtAuX10
H0053-1PtX2
を拾ってしまうんですが、何が原因でしょうか。

617 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 01:25:39 ]
>>615
Workbooks( ブックB ).Close
エラー処理、またはエラー処理をしなくても済むような方法は自力で調べて考えろ
調べても考えてもわからなかったら、そこで始めて人に聞け

618 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 01:37:15 ]
XP SP3 Excel 2002 SP3

ユーザフォームのShowModalをFalseに設定しています。

ユーザーフォームには、複数のテキストボックス、チェックボックス
コマンドボタンを配置しています。

ユーザフォームとワークシート間を移動した時の
イベントを教えて下さい。

Activate,Deactivateを試しましたが、該当しないようです。

宜しくお願いします。

619 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 01:47:47 ]
>>616
色々な文字列のうち、どれがLikeの条件にヒットするか試してみたけど、法則が見えない
ttp://momoiro.s4.x-beat.com/up/img/momoiro08659.png

620 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 01:54:13 ]
>>618
該当するイベントは存在しないので、何か別の方法を考えるしかない。
例えばタイマーで一定時間ごとにアクティブなウィンドウを調べるとか、
はっきり言ってかなり面倒な方法しかなかったと思う。

621 名前:618 mailto:sage [2009/01/23(金) 02:06:26 ]
>>620

有難う御座います。

やはりそうですか。ほかに力技でも考えてみます。

長いこと調べていたんで、これですっきりしました。

622 名前:デフォルトの名無しさん [2009/01/23(金) 02:11:43 ]
>>619
そうですね。いろいろ試しているんですが、きびしいです。
Likeにクセあるんだろうと思いながら使えない気がしてます。
入力値をもっと制限する方法も検討しながらもう少し探ってみます。


623 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 02:17:18 ]
あのさ、偶に勘違いしてる人が居るけど、Like演算子の文字クラスで
[AB,CD,EF]とした場合、AB CD EF のどれかに一致するものではなく
A B , C D E F のどれかに一致するものという意味になる
つまり「 , 」は区切り文字ではなく検索文字のひとつに過ぎない

>>619の記述だと、B1のは「末尾が C , O S F e のどれかで終わるもの」という意味で
C1の記述だと「C X , O 2 のどれかが含まれるもの」という意味になる
その正しい仕様を理解していれば、○の付いてるものは正しく仕様法則に従っていることが解る

AB CD EFのどれかで終わる場合にマッチさせたければ、"*AB"、"*CD"、"*EF"の3条件をOrで重ねるか
Like演算子ではなく正規表現で"(AB|CD|EF)$"とするべきだ

624 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 02:19:54 ]
>>622
こうなったらRightとInstrで1個ずつ調べるしかないと思う

625 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 02:25:34 ]
>>619
たとえば、"*[CX,OX,O2X]*"は、
CかXか,かOか2を最低一つ含むという意味では?



626 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 02:26:37 ]
>>623
なるほど、つまり
"*[C,O,O2,Fe]" → "*[,2CeFO]"
"*[CX,OX,O2X]*" → "*[,2COX]*"
ということか。納得いった。
VBAの解説してる某有名サイトは間違ってんだな

627 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 02:28:49 ]
>>617
ありがとうございます。
その.closeでエラー回避する方法あるんですね。
調べてみます。

628 名前:デフォルトの名無しさん [2009/01/23(金) 02:33:57 ]
>>625
>>626
そうなのですか。
確かにそれなら納得がいきます。
参考にしたサイトを間違えたかも。
ありがとうございます。

長いコードを書くことが確定した。

629 名前:623 mailto:sage [2009/01/23(金) 02:40:06 ]
>>626,>>628
OfficeTANAKAかな?

まあ解説サイト作ってるからといって全てを熟知してるわけじゃないし
レベルも様々だから仕方ないさ
まあ、あの人レベルはそんなに低くもなく高くもなくだが
もっとレベルの低い人がデタラメばかり書いてる解説サイトもあるから過信は禁物

630 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 02:51:41 ]
>>615
プログラムってのはひとつの発想に固執せず、
いろんな角度から発想を転換してみるのが上達のコツ
こういう時はエラーが起きないよう注意するより、
エラーを無視すればいいんだよ

on error resume next
workbooks("B.xls").close
on error goto 0

631 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 04:24:46 ]
出来るなら
一度保存して閉じるけど


632 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 04:26:53 ]
そういうことじゃなくて、そもそも目的のブックが開いてない可能性があるのよ。

633 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 04:46:04 ]
もし
開いていたら
閉じる


634 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 09:08:26 ]
>>602
ありがとうございます

635 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 21:32:21 ]
A1とA2セルの書式設定の表示形式をyy.mm.ddにして
A1セルに文字列で「09.08.07」と入力して

a = Cells(1, 1)
Cells(2, 1) = Mid(a, 1, 2) & "/" & Mid(a, 4, 2) & "/" & Mid(a, 7, 2)

上のような処理を実行すると何故かA2セルに「07.09.08」と順番が入れ替わって表記されてしまいます。
何故なんでしょう?
EXCELは2000です。



636 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 21:32:44 ]
>>610
開いている全てのワークブックの名前をDoで回し取得、
該当ブックが有れば.close

637 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 21:39:01 ]
>>635
年/月/日が月/日/年になってしまう時は、コントロールパネルかツール/オプションで地域の設定を見直す

638 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 21:43:34 ]
>>636
全ブック回すならFor Eachの方がコードがシンプルになるけど負荷が大きくなる。
エラーを無視するのは行儀は悪いが一番処理は速い。
エラー処理をきちんと書く、例えばエラーメッセージを出すとか実行結果をエラーコードとして返すのが王道だけど
片手間で作る小規模なコードでは大げさすぎる。

どの方法を使うかはケースバイケースだ。

639 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 21:58:53 ]
>>637
地域と言語のオプションやEXCELのツール→オプションを見ましたが不自然な場所は内容に見えるのですが。
もう少し詳しくお願いします。


640 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 22:06:36 ]
>>639
ExcelじゃなくてWindowsのコントロールパネルの地域と言語のオプションだよ。
どこかのセルに「9/8/7」ってキーボードから入れたらどうなる?
「2009/8/7」になるか「9/8/2007」になるか。


641 名前:630 mailto:sage [2009/01/24(土) 22:09:05 ]
>>638
>エラーを無視するのは行儀は悪い
エラー処理って大そうに考えてる人多いみたいだけど、
俺はエラー処理ってのはプログラムの効率化を図る手段だと思ってる

実際にErrorステートメントなんか存在しなくても、
厳密なプログラムを書けば99.9%(経験上100%)同じことはできる

Errorステートメントってのは、あらゆる場面を想定した厳密なプログラムを
書かなくてもいいように効率化(手抜き)をするためのモンじゃないの?

642 名前:635 mailto:sage [2009/01/24(土) 22:15:04 ]
>>640
639の地域と言語のオプションというのはもちろんコントロールパネル内のやつの一項目です。
変なところは無いみたいですし、そもそも購入してからいじった覚えもありません。

現状どのEXCELシートでも9/8/7と入力すると2009/8/7に置き換わって問題ないようにみえます。


643 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 22:19:03 ]
>>642
A1セルに09.08.07じゃなくて、9/8/7っていれてみ

644 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 22:22:37 ]
確認するんならA2セルに9/8/7と入れてみるべきじゃないかな
書式の問題かもしれないし

645 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 23:11:33 ]
>>643>>644
A1A2セル共に9/8/7と入れれば09.08.07に自動で置き換わりますので書式には問題は無い様に思えます。
ちなみにA1セルに9/8/7と入力して635の処理を走らせると2009/8/7が20/9//8/に置き換わるだけでした。

それとMid関数を利用してピリオドをスラッシュに置き換えても結果は同じ07.09.08でした。

この処理の目的としては日付欄なのに入力の際にピリオドを直接入力している間違った記述を一括で直したいというのがあるのですが
どうしてこんな順番入れ替わりがおこるのかが本気で謎です。




646 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 23:48:18 ]
>>645
DateSerialをかますんだ!

Dim s As String
If TypeName(Range("A1").Value) = "String" Then
  s = Range("A1").Value
  Range("A1").Value = DateSerial(Left(s, 2), Mid(s, 4, 2), Right(s, 2))
End If

647 名前:635 mailto:sage [2009/01/25(日) 07:49:29 ]
>>646
確認しましたが、それで大丈夫みたいですね。
ありがとうございました。

648 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 17:56:18 ]
Open ファイル名 For 開き方 As #ファイル番号

というコマンドの「#」の意味を調べてみたんですが
言及されてなくてわかりません。
この#にはどんな意味があるのでしょうか?

649 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 18:08:33 ]
あるブックをアクティブにすると同時にマクロを走らせることって可能ですか?

650 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 18:25:52 ]
>>648
「#」は「ナンバーサイン」とも言う。そして、例えば「2番目のvoid」を「void#2」とも書く。
その意味を込めてMS-BASICで採用された仕様だ。

651 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 18:55:24 ]
>>649
Workbook_WindowActivate

652 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 19:04:08 ]
>>650
ほえー!ずぅっとシャープだとばかり思ってました。
番号を表す「ナンバーサイン」という記号だったんですね。
勉強になりました。ありがとうございます。

>>649
そのブックに、Auto_Open()のモジュール名で記述されたプログラムは
ブックを開くと同時に実行されます。

653 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 19:08:00 ]
開くときではなくアクティブにしたときでしょ?

654 名前:652 mailto:sage [2009/01/25(日) 19:12:30 ]
確かに。読み間違えました。
どうもすみません。

655 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 19:40:49 ]
>>651
ありがとうございます。

もう一つ質問です。

非アクティブ状態のシートのアクティブセルの参照はどうすればいいでしょうか?
現在ブックBがアクティブ状態で

Cells(1, 1) = Workbooks("A.xls").Worksheets(1).ActiveCell.Offset(0, 1)

のような処理はオブジェクトはプロパティ・メソッドをサポートしてないと言われました。
ブックAをアクティブにしたくないのですけど、やはりブックAをアクティブにしてからでないと無理ですかね?



656 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 20:29:26 ]
そもそも、ちょっと考えてみれば当然のことだが
アクティブじゃないシートにはアクティブなセルなど存在しない

それにActiveCellはWorksheetオブジェクトのメンバではなくExcelオブジェクトのメンバなので
上位オブジェクトを指定するならExcel.ActiveCellのようになり、Excel以外は指定できない

つまり、「(A):非アクティブなシートのアクティブセル」って概念自体が間違いであり
君がやりたいことは「(B):非アクティブなシートが最後にアクティブだったときにアクティブだったセルの取得」
と表現するのが正しい

というわけで、存在しないもの(A)は取得できないので、(B)を取得するには
任意のシートにアクティブセルが存在するようにしてやる(任意のシートをアクティブにする)か、
アクティブセルの移動を監視記録するのどちらかだな
表示を止めてアクティブにしたのが見えないようにも出来るが、それでも前者が嫌なら後者しかない

657 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 21:02:48 ]
うぜーよ

658 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 22:30:01 ]
べつにうざくはないが、よくそこまで親切にレスできるのかと関心する
職場で部下に教えるならまだしも、2ちゃんで赤の他人に教えるだけで

659 名前:デフォルトの名無しさん [2009/01/25(日) 23:23:32 ]
EXCEL97です
ActiveSheet.PageSetup.LeftHeader = "&18 1月12日 &A"
このなかの1月12日の部分をnow()+2かstring型の変数を使いたいのですが方法はありますか

660 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 23:36:15 ]
ActiveSheet.PageSetup.LeftHeader = "&18 " & Format(Now() + 2, "m月dd日") & " &A"

661 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 23:51:02 ]
>>656
丁寧にありがとうございます。

>アクティブじゃないシートにはアクティブなセルなど存在しない
これが確認できれば出来れば十分です。


662 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 16:18:41 ]
ActiveとSelectを混同してると見た
俺がちょっと前までそうだったから

663 名前:デフォルトの名無しさん [2009/01/26(月) 19:12:35 ]
質問です。
データをシステムから取り込んだエクセルファイルなんですが、
セル内の数値の先頭に半角スペースがついてしまいます。
たぶんこれが原因で、数値の大小がおかしくなります。

例えば

変数=20.222
if 変数>10.333 then

これで =falseとなるんですが何か対処法はないでしょうか。
セルをダブルクリックしてEnterで先頭のスペースは消えて数字扱いとなります。
セルの書式は未選択状態です。
ファイルがで手元にないので詳しいことはすいません。


664 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 19:51:29 ]
>>663
変数="20.222 "
if value(trim(変数)) > 10.333 then

665 名前:664 mailto:sage [2009/01/26(月) 19:58:01 ]
すまん、ワークシート関数と勘違いしました。
val(trim(変数))



666 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 20:58:54 ]
>>663
元のデータは変えちゃいけなくて、VBAでなんとかするなら上のレスのとおり。
修正してもいいんならシート全体を選択してコピー→そのまま貼り付けして、
黄色いびっくりマークをクリックして「数値に変換」

667 名前:デフォルトの名無しさん [2009/01/26(月) 20:58:56 ]
質問よろしいでしょうか。
乱数を生成させて、結果によって単純な算術演算を行うプログラムで統計を取っています。
会社のPCで結果が出るまでに2時間はざらなのですが、

会社のCPUがpen4 3Ghz
自宅のCPUがcore i7 940 2.93Ghz

単純なプログラムなので、劇的にはかわらないまでもすこしは早くなるかと思ったんですが、
逆に遅くなりました。
8コア中 1コアしか使用率があがらなかったので、単純にクロック数の問題だと思うのですが、
VBAで8コアフルに稼動させるようなソースは書けるんでしょうか?

しかし、前の乱数値の結果が次に影響するような演算なので、
追い越してなにかを処理しておくというのは意味なさそうです。

668 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 21:00:29 ]
>>663
csvでも取り込んでいるのかな? csvファイルの仕様がおかしいんで内科医?

669 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 21:04:13 ]
>>667
そりゃ無理だ。VBAが今後マルチスレッド化されたとしても、単純なプログラムでは1コアしか使いようがない。
まさかとは思うが、シートの更新を止めてないとか言わないよな。

670 名前:667 [2009/01/26(月) 21:10:32 ]
>>669
ですよね;−;
シートの更新は止めています。
シートへのアクセスも極力抑えて、演算に必要な数値はすべて配列で確保しています。
実行時間は単純に量の問題です、10億試行とかそういう回数なので…

671 名前:デフォルトの名無しさん [2009/01/26(月) 21:11:18 ]
www.nicovideo.jp/watch/sm5947975

672 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 21:14:15 ]
>>668
単純なcsvの読み込みなら、たとえ "  123   " みたいにダブルクォートで囲ってあっても
強制的に数値化されてしまうので逆に困るくらい。

673 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 21:17:18 ]
>>670
そんなに回数が多いならVBAじゃなくてもっと演算向きの言語にしなよ。
必要ならそいつをVBAで起動すればいいんだし。

674 名前:デフォルトの名無しさん [2009/01/26(月) 21:18:21 ]
664-666
ありがとうございます。
明日試してみます。


675 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 21:23:52 ]
>>670
10億回程度のループならそんなに多いとは思わんけどな。

無駄に時間のかかるプログラムって、アルゴリズムやコーディングに問題があることが多いけど、
誰か詳しい人には相談した?
それから基本的なこととしては、Variant型の変数は使ってないよな?

あとは乱数の発生を別のプロセスにやらせてファイルにどんどん書き出していくとか、
そもそも数値計算にVBAを使うこと自体が疑問なので、全体をコンパイラで書き直すとか。



676 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 21:26:21 ]
675の言うことには耳を貸さないのが吉

677 名前:667 [2009/01/26(月) 21:43:17 ]
いろいろアドバイスありがとうございます。
すいません統計などと洒落たことを言ってしまいましたが、
プログラム自体はパチスロ機のシミュレータです。
自分ひとりでつかうならいいんですが、
プログラム知識0の人へのインターフェイスや出力、視覚化も兼ねているので…。
そして残念なことに、このシミュレータの作成は片手間でやらないといけないので、
うまいこと作り直す時間も知識もありません…。
同じ課でたまたまプログラムの知識があった私が任されています…
ので同じ課にはわかる人はいません…。
もちろん実機担当に質問はできますが、手一杯だとは思います…。

アルゴリズムはやりようがあると思いますがなるべく実機に近くなるようにしています。
実機はもちろん人の操作によって一連の流れになるので、
アルゴリズムも単純な上から下です。

実行時間は現状でそれなりに満足しています。
10億試行は最終的段階なので、普段は5分とかそういうレベルです。

ただ、環境(CPU)による違いがなかったので質問した次第です。
気遣いありがとうございました。






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

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

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