Excel VBA質問スレ Pa ..
[2ch|▼Menu]
577:デフォルトの名無しさん
09/01/18 21:34:00
>>574
多分functionとrangeを使ってどうにかこうにか書くのだと思うのですが上手くいかない

578:デフォルトの名無しさん
09/01/18 21:36:51
>>577
ヒント
Workbook_SheetChange
Application.EnableEvents = False

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



580:教えてください
09/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:教えてください
09/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:デフォルトの名無しさん
09/01/20 01:06:50
Set motorange = motosheet.Range("a2", Cells(入力済み最終行番号, 19))

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

583:デフォルトの名無しさん
09/01/20 06:51:42
巷ではこういうコードが普通にあんのかね。

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

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

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

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

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

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

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

587:デフォルトの名無しさん
09/01/20 21:48:51
>>585
どんなプログラムを作ったの?

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

589:デフォルトの名無しさん
09/01/20 22:14:47
>>588
それは場合によりけりだな

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

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

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

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

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

595:デフォルトの名無しさん
09/01/21 07:15:08
日本語は入力が面倒臭いのが難点。

596:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/01/21 20:23:54
>>596
>>1★3,★4

598:デフォルトの名無しさん
09/01/21 22:56:21
>>597

失礼しました。。。

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

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

601:デフォルトの名無しさん
09/01/22 19:03:30
質問です。宜しくお願いします

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

Option Explicit

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

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

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

603:質問です
09/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:質問です
09/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:質問です
09/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:デフォルトの名無しさん
09/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
09/01/22 21:23:56
すいませんまちがえました。

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



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

608:デフォルトの名無しさん
09/01/22 22:23:09
読む気になれない・・・。

609:606
09/01/22 23:37:24
すいません。
最善の処置かはわかりませんが、自己解決しました。
スレ汚し失礼しました。

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

611:デフォルトの名無しさん
09/01/23 00:08:50
>>610
ブックじゃなくてシート?

612:デフォルトの名無しさん
09/01/23 00:28:23
>>610
ブックなら可能
やりかたは自分で調べろ

613:610
09/01/23 00:29:16
>>611
間違えました。
シートではなくブックです。
失礼しました。

614:デフォルトの名無しさん
09/01/23 01:04:27
>>613
Workbooks( ).Close

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

616:603
09/01/23 01:22:49
長かったので問題の箇所まとめました。

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

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

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

618:デフォルトの名無しさん
09/01/23 01:37:15
XP SP3 Excel 2002 SP3

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

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

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

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

宜しくお願いします。

619:デフォルトの名無しさん
09/01/23 01:47:47
>>616
色々な文字列のうち、どれがLikeの条件にヒットするか試してみたけど、法則が見えない
URLリンク(momoiro.s4.x-beat.com)

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

621:618
09/01/23 02:06:26
>>620

有難う御座います。

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

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

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


623:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/01/23 02:19:54
>>622
こうなったらRightとInstrで1個ずつ調べるしかないと思う

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

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

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

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

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

629:623
09/01/23 02:40:06
>>626,>>628
OfficeTANAKAかな?

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

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

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

631:デフォルトの名無しさん
09/01/23 04:24:46
出来るなら
一度保存して閉じるけど


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

633:デフォルトの名無しさん
09/01/23 04:46:04
もし
開いていたら
閉じる


634:デフォルトの名無しさん
09/01/23 09:08:26
>>602
ありがとうございます

635:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/01/24 21:32:44
>>610
開いている全てのワークブックの名前をDoで回し取得、
該当ブックが有れば.close

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

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

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

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


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


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

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

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

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

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


643:デフォルトの名無しさん
09/01/24 22:19:03
>>642
A1セルに09.08.07じゃなくて、9/8/7っていれてみ

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

645:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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
09/01/25 07:49:29
>>646
確認しましたが、それで大丈夫みたいですね。
ありがとうございました。

648:デフォルトの名無しさん
09/01/25 17:56:18
Open ファイル名 For 開き方 As #ファイル番号

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

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

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

651:デフォルトの名無しさん
09/01/25 18:55:24
>>649
Workbook_WindowActivate

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

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

653:デフォルトの名無しさん
09/01/25 19:08:00
開くときではなくアクティブにしたときでしょ?

654:652
09/01/25 19:12:30
確かに。読み間違えました。
どうもすみません。

655:デフォルトの名無しさん
09/01/25 19:40:49
>>651
ありがとうございます。

もう一つ質問です。

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

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

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

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

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

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

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

657:デフォルトの名無しさん
09/01/25 21:02:48
うぜーよ

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

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

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

661:デフォルトの名無しさん
09/01/25 23:51:02
>>656
丁寧にありがとうございます。

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


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

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

例えば

変数=20.222
if 変数>10.333 then

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


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

665:664
09/01/26 19:58:01
すまん、ワークシート関数と勘違いしました。
val(trim(変数))

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

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

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

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

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

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

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

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

671:デフォルトの名無しさん
09/01/26 21:11:18
URLリンク(www.nicovideo.jp)

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

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

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


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

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

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

676:デフォルトの名無しさん
09/01/26 21:26:21
675の言うことには耳を貸さないのが吉

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

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

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

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

678:デフォルトの名無しさん
09/01/26 22:31:23
会社のCPUがpen4 3Ghz
自宅のCPUがcore i7 940 2.93Ghz
で逆に遅くなるってのは悲しいな
結局クロックが全てか
てか
実機担当って職業プログラマーが居る、その会社は何だろう
気になる


679:デフォルトの名無しさん
09/01/26 22:41:48
パチンコ機屋じゃないの?

680:デフォルトの名無しさん
09/01/26 23:30:39
>>678
うちは北森コアのPen4 3.4CGHzとi7 965(3.2GHz)を使ってるが
1スレッド処理でもi7の方が速いぞ

そもそもCPIもバス帯域もメモリコントロールも拡張命令も勝っているi7が
0.07GHz程度の実周波数の差程度でPen4に負けるのはおかしい
会社のPCがベースクロック3GHzの石を使ってOCしてるとかじゃなければ
君が自宅で使ってるi7のPCは、構成に問題有りで何処かに極端なボトルネックが
発生していると思われる

681:デフォルトの名無しさん
09/01/26 23:32:56
質問です。

EXCELシートにハイパーリンク貼って、そのシートをブラウザでプレビューすると
ブラウザにもハイパーリンクが表示されるけど
そのブラウザ上のリンクをクリックした時に
Private Sub Workbook_SheetFollowHyperlink
を起動することってやっぱ無理かな?

682:デフォルトの名無しさん
09/01/26 23:38:43
>>680
自宅PCは省電力でクロックダウンしているんじゃないか?

683:デフォルトの名無しさん
09/01/26 23:59:12
>>681
自分でHTMLとVBScript or JavaScriptでそういうコードを書けばできなくもないだろう。
つまり、VBAでは無理だ。

684:デフォルトの名無しさん
09/01/27 00:37:43
何かにCPUパワーを喰われてるとか
「遅くなった」のが実は0.01秒程度の差だったとか
もし自作ならドライバがちゃんと入ってないとか

685:デフォルトの名無しさん
09/01/27 04:47:10
CommandButtonでClickイベントが呼ばれたときに、そのボタンのキャプションを取得したいのですが、
よい方法はありませんでしょうか?

ネットのフォーラムなどの情報では、
 ActiveSheet.Buttons(Application.Caller)

 ActiveSheet.DrawingObjects(Application.Caller)
などでオブジェクトを取得できるとあるのですが、
プロパティがない、などと言われます。
代替手段はないものでしょうか?

環境:Excel2007



686:685
09/01/27 04:54:33
すいません。そもそも _ClickイベントやMouseDownなどではApplication.Callerは使えないですね。
どうしたらよいのだろうか

687:デフォルトの名無しさん
09/01/27 05:11:01
>>686
押したボタンのクリックイベントに適当に書くのが普通じゃない?




688:デフォルトの名無しさん
09/01/27 05:23:04
>>685
コマンドボタンには2種類あるでしょ。
挿入を選ぶとコントロール(部品)の一覧が出てきて
上段が「フォーム コントロール」、下段が「ActiveX コントロール」ってなってるやつ。
下段の方のボタン使ってる?

689:デフォルトの名無しさん
09/01/27 05:38:13
>>685
「マクロの登録」で登録されたマクロはコマンドボタンのクリックで呼び出される
Sub test()
  MsgBox ActiveSheet.Buttons(Application.Caller).Caption
End Sub

690:デフォルトの名無しさん
09/01/27 05:43:14
>>688
マクロが登録できるのはフォームコントロールの方だぞ

691:デフォルトの名無しさん
09/01/27 06:11:34
>>686
そもそもCommandbutton1のClickイベントで呼ばれるのはCommandbutton1_clickなんだから、
Private sub commandbutton1_click
  Msgbox commadbutton1.caption
End sub
で、いいんじゃねーの?
クラスモジュール使って擬似コントロール配列にしてるとしても、どうにでもなんじゃん
アホなの?

692:デフォルトの名無しさん
09/01/27 07:45:56
>>690
両方出来るぞ

693:685
09/01/27 10:53:06
教えて! Watch Excel VBA Application.caller エラー2023について
URLリンク(oshiete1.watch.impress.co.jp)

ここの方法でいけましたが、もう少しスマートな方法がないかな?と。

>>687 >>691
10個あったら、10個分イベントと名前の組をかかないといけないですよね。
冗長性があります。

>>689
ActiveXの方では無理っぽいです・・・

>>688
ActiveXの方を使っています。
やりたいことはボタンのキャプションを取得することなので、
できるのであればフォームコントロールの方でもよいのですが・・・

694:685
09/01/27 10:57:08
URL間違えました。こちらでした。

moug|即効テクニック | コマンドボタンのクリックイベント内でボタン名を取得するには
URLリンク(www.moug.net)


695:デフォルトの名無しさん
09/01/27 16:07:22
シート保護はprotectで非保護はunprotectでいいですか?出先なので簡単な質問ですが。

696:デフォルトの名無しさん
09/01/27 16:13:46
>>695
いんじゃね

697:デフォルトの名無しさん
09/01/27 16:19:40
ありが十匹!!

698:デフォルトの名無しさん
09/01/27 20:14:57
>>693
一つのプロシージャに1行ずつ書き足すのが冗長性があると言ってるってことは、
擬似コントロール配列を使ってクラスモジュールで処理してるとしか考えられない訳だから、
取りあえず今使ってるソース出せ
そしたら改良してやるから

699:デフォルトの名無しさん
09/01/29 09:07:22
すみません初心者ですが質問です。
Msgboxに「月度を入力してください」と表示
→インプットboxに月(1〜12までの数字)を入力する画面を出して尚且つ、
1〜12以外の数字または文字を入力したら、「1〜12の数字を入力してください」
というエラーメッセージが出る→最後にまたMsgboxが出てきて「○月度ですね」と
表示するにはどう組めばいいでしょうか。
○には入力した月数を出したいのですがよろしくお願い致します。

700:デフォルトの名無しさん
09/01/29 09:08:34
>>699
VB初心者スレへどうぞ。

701:デフォルトの名無しさん
09/01/29 11:00:04
>700
すみません、VBAの初心者スレは探しましたが無いみたいです。
どなたかお願い致します。

702:デフォルトの名無しさん
09/01/29 12:15:27
>>699
流れは大体できてるように見えるのだが・・・
「インプットboxに入れられたものを数値にして1〜12だったら抜ける」ってことを
Do〜Loopを使って組めばいいだけ

703:デフォルトの名無しさん
09/01/29 14:29:53
超初心者です。

何個か開いたファイルの中から、特定のファイルを探す。
という単純な事がしたいのですが
ファイル名が例えば「経理ファイル200812.xls」のように、
月によってYYYYMMの部分が変わってしまいます。
開いたファイルの中から、ファイル名に「経理ファイル」が付いているファイルをアクティブにしたい場合
どのようにすればよいでしょうか。
ワイルドカードが使えないかと思ってやってみているのですが
よろしくお願いします。


704:デフォルトの名無しさん
09/01/29 15:01:32
dim b as workbook
for each b in workbooks
if b.name like "経理ファイル*" then
b.activate
end if
next

705:デフォルトの名無しさん
09/01/29 15:53:30
>>704

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

706:デフォルトの名無しさん
09/01/29 18:39:44
質問です
h = 1
Do Until Cells(h, 6).Value = ""
If Cells(h, 3).Value = Cells(h + 1, 3) Then
Cells(h, 6).Value = Cells(h, 6).Value + Cells(h + 1, 6).Value
Rows(h + 1).Delete
End If
h = h + 1
Loop
2行のときは1行にできるのですが、3行以上のときも1行にしたい場合どのようにすればよいでしょうか

707:デフォルトの名無しさん
09/01/29 18:57:21
>>706
最初に見つけた位置のhを保存しといてそこに入れていく

708:707
09/01/29 19:00:08
違ったな
「Deleteしたときはhをインクリメントしない」かな?

709:デフォルトの名無しさん
09/01/29 19:45:32
End Ifの前にh = h - 1で解決しました
ありがとうございます

710:デフォルトの名無しさん
09/01/29 23:41:33
>>701
頭だけでなく眼が悪いんでしょうか。
VBA ( V B A ) のスレではなく、VB ( V B ) のスレへどうぞ。

711:デフォルトの名無しさん
09/01/29 23:59:42
OS XP
EXCEL2003

dteProductDay=format(date,゙yyyy/m/d゙)
cells(1,1)=dteProductDay
というように、システムの日付を整形してセルに表示させたいのですが、
フォーマット通りに表示されず1/29/2009となります。何が悪いのでしょうか。

712:デフォルトの名無しさん
09/01/30 00:09:19
>>711
書式を変えるか、または文字列で

713:デフォルトの名無しさん
09/01/30 02:12:09
>>711
的外れかも知れないが
表示するセル自体の書式を適切に設定しないとそうなる。
そのフォーマットだと、変数に代入された値は2009/1/29となるので
エクセルはこれを日付と認識し内部的に日付のシリアル値として値を保持するのでは。

たとえばdteProductDay=format(date,゙yyyy m d゙)
とするとセルには「2009 1 29」と表示される。


714:デフォルトの名無しさん
09/01/30 12:23:35
OS-XP
Office2003

Shiftキーを押しながらドラッグでセルの移動ができますが、
Shiftキーを押さなくても常にセルを移動することはできますか。

もしくはExcel上でのみ、Windowsの固定キー機能のように
Shiftキーを押しっぱなしにすることはできないでしょうか。

キーボードでなら、たとえば上に移動したい場合
ActiveCellを取得して、真上のセルと置換していけばできそうなんですが。

715:711
09/01/30 20:50:12
>>712-713
ありがとん

cells(1,1)= "'" & dteProductDayでうまくいきました。


716:7777
09/01/30 22:31:30
エクセルでシート1で例えばF団体をA列の1で書いてそれを
シート3のD列の3に自動記入させるマクロは分かるんだけど

シート1でF団体がA列の1以外になっても自動記入できるマクロある?
あるなら教えて

717:デフォルトの名無しさん
09/01/30 23:07:32
日本語で質問できない人お断り

718:デフォルトの名無しさん
09/01/30 23:08:56
>>716
Private Sub Worksheet_Change(ByVal Target As Range)
                        ~~~~~~~
どこに書き込まれたかはTargetという変数に入ってる

719:7777
09/01/30 23:13:26
718さん
意味がわかりません


720:デフォルトの名無しさん
09/01/30 23:18:17
日本語読めない人お断り

721:デフォルトの名無しさん
09/01/30 23:31:13
Worksheets("シート3").Range("D3") = Worksheets("シート1").Range("A1")
みたいにセル名が固定ならわかるけど、コピー元のセルが不定の場合はどうするかって質問でしょ?

722:デフォルトの名無しさん
09/01/30 23:53:13
F団体ってなんだろ…新しい宗教か?

723:7777
09/01/31 08:51:59
>>721
うん!!そのとおりです

724:デフォルトの名無しさん
09/01/31 09:19:07
>>723
A1とA2の両方に値がある場合はどちらを採用するの?

725:7777
09/01/31 09:52:09
>>724
1月23日 団体名  内容
       F団体
       

このときF団体がAの2列に書いてるけど
Aの2列にD団体を記入して
Aが3列になってもシート3のまとめシートには自動記入できるかなぁって

726:デフォルトの名無しさん
09/01/31 10:06:03
>>725
1対1対応ならなんの問題もないでしょう?

それから行と列を区別して書いてたほうが他人に伝わりやすいですよ。
ABCは列
123は行


727:7777
09/01/31 10:42:31
A列からD列の10行までの範囲がコピー範囲のときは
どうマクロ組むの?

728:デフォルトの名無しさん
09/01/31 11:15:45
>>727
マクロ記録してみたら?

729:7777
09/01/31 11:34:10
できました!
ありがとうございました。

730:デフォルトの名無しさん
09/01/31 11:39:37
俺が質問を理解できないうちに解決か

731:デフォルトの名無しさん
09/01/31 13:05:52
>>730
VBAを使うやつは問題をミクロにとらえ過ぎている。
もっとマクロなレベルで考えるんだ。
コピー元とコピー先の対応がどうなっているかだけ理解したらできるかできないか判断できるだろ?


732:デフォルトの名無しさん
09/01/31 15:18:32
EXCELを使うのは本来はすんごく高度なスキル(=異常な思考様式)が必要
そうでもない人、もしくはそういう発想をするのがヤな人がVBAを使うのだが、
VBAは最高級のBASICの一つで、これだけでも結構重量物
(VB.NETはこれは超ベテランが使う言語で、これからいきなり始めるのだ
けはやめたほうがいい)
VBAの入門に向いているのはExcelよりかAccessだね。Excelだと動作
は遅いはExcelと基本的に合わないわでロクなことないね。

733:7777
09/01/31 15:24:34
いやできてないんだけど
マクロ記録とは?

734:デフォルトの名無しさん
09/01/31 16:13:28
もういいから帰ってくれ!


735:7777
09/01/31 17:09:51
ひどすぎ

736:デフォルトの名無しさん
09/01/31 17:10:34
>>725
マクロの前に日本語を勉強した方が…
でも一応想像してみた

シート1
年月日  団体名  内容
1/23   F団体  陳情
1/26   D団体  年始挨拶
1/27   A団体  予算ヒア
みたいに日付ごとの日報が書いてあって
団体ごとに各シートに抽出したいんじゃないのか?
でもこれだったらわざわざ聞いてこないよな。

737:デフォルトの名無しさん
09/01/31 17:50:16
確かにそれだったらその辺のOL捕まえた方が手っ取り早いな。

738:デフォルトの名無しさん
09/01/31 19:48:09
長文ですがお許しを
最近クラスモジュールを勉強しているんですがプロパティの設定で
Letがうまくいきません。

WindowsXPSP3、Excel2003
クラスモジュール内容
Private m_TestValue As String

Public Property Get TestValue()
TestValue = m_TestValue
End Property

Public Property Let TestValue(ByVal New_Value As String)
m_TestValue = New_Value
End Property

で標準モジュールに
Public Sub Test()
Dim Test As Class1
Set Test = New Class1

Test.TestValue = "testtest"
MsgBox Test.TestValue
End Sub

として実行するとプロパティプロシージャの定義が一致していないというコンパイルエラーが出ます。
これはなぜでしょうか?

739:デフォルトの名無しさん
09/01/31 20:07:43
Public Property Get TestValue() As String
もしくは
Public Property Let TestValue(ByVal New_Value As Variant)

Getの戻り値の型と、Letの最後の引数の型
つまり、ひとつのプロパティの型は一致させてください


740:デフォルトの名無しさん
09/01/31 21:01:13

なるほど!Property Getの戻り値も型を指定する必要があるんですね。
m_TestValue変数の型を指定していてそれを返しているから
てっきりそれだけでいいと思ってた。

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

741:デフォルトの名無しさん
09/02/02 00:36:34
ブックAにブックBへのハイパーリンクを張って、ブックBの
Private Sub Workbook_Open()
内で色々と処理をしているのですが、
ブックA内のハイパーリンクをクリックした時にブックBを表示させずにその後の処理を実行する方法はありませんか?


742:デフォルトの名無しさん
09/02/02 00:57:32
初心者です。教えてください。
今フォームを使ってデータの抽出をするプログラムを作っています。
データは階層構造になっています。
仮に3階層あるとして、フォームにその3階層をプルダウンで指定してやると条件に一致したデータが表示されるようにしたいのです。
その際、上位階層をプルダウンで指定すると、その上位階層が包含する下位階層のみが
プルダウンで表示されるようにしたいのですが、どうしたらいいのでしょうか。
フィルタオプションを使用しようと思うのですが、可能でしょうか?
困っています。教えてください。

743:デフォルトの名無しさん
09/02/02 01:47:00
こんばんは。すみません、エクセルの質問させてください。

ブックAのシート1のA1にブックBのシート1のA1からA5を、足した結果をだしたい場合、どの様に入力すればよいですか?
どうかおしえてください。お願いします。



744:デフォルトの名無しさん
09/02/02 04:53:09
>>741
ハイパーリンクでは、ブックを非表示で開くことは出来ない
ハイパーリンクをボタンとかに変えて、ブックAのVBAからブックBを非表示で開きましょう
因みにVBAからブックを非表示で開く方法は、幾らでも情報有るから自分で調べましょう>>1★5

>>742
入力規則のリストの連動ならまだしも、Excel用ではなく汎用ActiveXのコンボボックスの連動は
Excelに関係ない話なのでスレ違いです>>1★3〜★4
とりあえずVB6用の方法がほとんどそのまま使えるし、サンプルも転がってる

>>743
WorksheetFunction.Sum
中に入る式は、普通にシート上で入力する式と同じだから解るよな?
まあ解らなくてもスレ違いだから自分で調べろってことになるが

745:741
09/02/02 21:58:13
>>744
741です。
お答えありがとうございます。
うーん、やはりハイパーリンクでは無理でしたか。

私の作った処理をもう少し詳しく言うと
ハイパーリンクをクリックするとそのセルがアクティブになることを利用して
ブックBのPrivate Sub Workbook_Open() の中で
Workbooks("B.xls").Worksheets(1).Cells(1, 1) = ActiveCell.Offset(0, 1)
みたいな感じでハイパーリンクの隣のセルの情報を転記するという処理を行っていたのですが。

例えばA1とA2のセルの上にセルと同じ大きさのボタンを作り、両方のボタンに同じマクロを登録して
A1の上に作ったボタンをクリックするとB1の情報を転記し、A2の上に作ったボタンをクリックするとB2の情報を転記する
という処理って作れますか?
ハイパーリンクみたいにクリックするとその下のセルがセレクトされるみたいな処理が作れればいいんですけど。


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

5144日前に更新/259 KB
担当:undef