●EXCEL・VBA質問スレ Part2●
at TECH
[前50を表示]
650:デフォルトの名無しさん
07/08/19 14:14:45
Excelから切り離して動かせばいい
操作はウィンドウメッセージを使うことになるがそう面倒でもあるまい
VBAの範疇を出る話なので、あとはご自分で
651:デフォルトの名無しさん
07/08/19 14:16:25
ユーザーフォームから入力すれば良いかも?
652:デフォルトの名無しさん
07/08/19 18:50:37
Dim time As Variant
Function settime() As Variant
time = Timer
End Function
Function gettime() As Double
gettime = Timer - time
End Function
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
mytime = Format(gettime, "####.00")
ThisWorkbook.Application.Caption = mytime
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
settime
End Sub
653:649
07/08/19 21:34:16
>>650
ありがとうございます。Excelから切り離すってことはVBかなんか使って別アプリにしてしまう
ということですよね?VBA以外やったことないんですが・・・これを機に勉強しようかな
>>651
ありがとうございます。
あくまで入力作業中のおまけというかアクセサリ的なものとして表示させておくつもりだったので
その発想はなかったです。試しにやってみたらフォーム上のtextboxへの入力中ならちゃんと
タイマーを表示するマクロも動き続けますね。とりあえずこの方法でやってみます。
>>651
わざわざコードまで書いてもらって恐縮です。
言葉足らずで申し訳ありませんでしたが、入力確定後にかかった時間を表示するだけじゃなく
入力中もかかってる時間を表示させ続けたいのです。
654:デフォルトの名無しさん
07/08/19 21:45:48
>>639
エラーでます
655:デフォルトの名無しさん
07/08/20 02:39:20
こんな有用なスレがあったんですね。
早速ですが、1つ教えてください。
Excelで、次のようなことがしたいのですが、どのようにしたら良いでしょうか。
・事前に、ユーザーが新規ブックを開いておく
・そのままの状態で(ボタンなどを押すことなく)
・PCのCOMポートから送られてくる文字を、順番にセルに書き出す。
ボタンを押して....のようなイベントの発生による関数の起動ではなく、
COMポートの受信割込発生をイベントとした関数の起動がしたいのです。
現在は、
シート上に作ったボタンを押すことで、セルに書かれた数字/文字を、PCのCOMポートからRS232Cで送り出したり、
同じくシート上に作ったボタンを押すことで、COMポートを開いて受信状態となり、
数字/文字を受信したら罫表に書き込んだり などは、結構何度も作っているのですが、
今回は、「ボタンを押さなくても」自動的に受信できないかと思うのです。
何か特別な方法が必要でしょうか、あるいは、VBAの関数にすでに用意されているのでしょうか?
宜しくお願いします。
656:デフォルトの名無しさん
07/08/20 06:35:04
Private Sub Workbook_Open()
処理
End Sub
657:デフォルトの名無しさん
07/08/20 21:11:30
1,エクセルの左側にあらかじめ設定している列を折りたためる、ボタンがあるシートがあるんですけど、
どのように設定すればいいのでしょうか?
2、functionを使用して、同じ計算式をマクロに計算させようとすると、5倍位時間がかかるようになりました。
どのような対策を取ればいいのでしょうか?
658:デフォルトの名無しさん
07/08/20 21:21:42
1 そのまんま。そのボタンに列の表示非表示を切り替えるマクロを登録すればいいだけ。
2 ワークシート関数よりユーザー定義関数の方が遅いのは当然だが、そういうことじゃないのか?
違うなら日本語で質問してくれ。あとそのFunctionの内容も書くこと。
659:デフォルトの名無しさん
07/08/20 22:26:26
>>657
1.グループ化の事か?
660:631
07/08/21 01:22:25
本やみなさんの意見を参考にしながら一応、出来たのですが
Sub セル範囲を指定して格子罫線を引く()
Dim Rng As Range
Set Rng = Application.InputBox("セル範囲を指定してください", "セル範囲の指定", Type:=8)
Rng.Borders.LineStyle = xlContinuous
End Sub
少し、改造すれば、セル範囲を指定してセルの色を塗り替えるにもできます(せっかく、作ったので、良かったら参考にして下さい)
これに、キャンセルしたときに「入力されませんでした」と表示するようにしたいのですが、どうもわかりません
Sub セル範囲を指定して格子罫線を引く2()
Dim jis As Range
Set jis = Application.InputBox("セル範囲を指定してください", "セル範囲の指定", Type:=8)
If jis <> "" Then
Rng.Borders.LineStyle = xlContinuous
else
msgbox"シート名が入力されませんでした"
End If
End Sub
上のソースだとエラーになってしまいます
お手数ですが、ご指導お願いします。
661:デフォルトの名無しさん
07/08/21 06:33:33
サンプル
Dim returnData As Variant
returnData = Application.InputBox("データを入力してください", Type:=1)
If VarType(returnData) = vbBoolean Then
MsgBox "キャンセルされました"
Exit Sub
End If
MsgBox "処理を続行します"
662:デフォルトの名無しさん
07/08/21 06:58:45
>>660
インプットボックスメソッドはエラー処理が必要
On Error Resume Next
Set jis = Application.InputBox("セル範囲を指定してください", "セル範囲の指定", Type:=8)
On Error GoTo 0
こんな感じ。ヘルプ見てね!
あと入力されなかった時はキャンセルにしてしまう場合
If jis Is Nothing Then Exit Sub
663:662
07/08/21 11:16:43
こんな感じかな?
Sub セル範囲を指定して格子罫線を引く662()
Dim Rng As Range
Application.DisplayAlerts = False
On Error Resume Next
Set Rng = Application.InputBox( _
prompt:="セル範囲を指定後 [ OK ] を押して下さい。" _
& Chr(13) _
& "【セルを選択しないと [ OK ] は無効です。】", _
Title:="罫線を引くセル範囲を指定してください", _
Default:="", _
Type:=8)
On Error GoTo 0
Application.DisplayAlerts = True
If Rng Is Nothing Then
MsgBox "中止します"
Exit Sub
Else
Rng.Borders.LineStyle = xlContinuous
End If
End Sub
664:デフォルトの名無しさん
07/08/21 17:59:15
>>660
あなたにとって自慢したい自信作かもしれないけど?敢えて苦言を
>本やみなさんの意見を参考にしながら一応、出来たのですが
何もしないで、OKまたはキャンセル押したらエラーになるよね?
これは「出来た」には程遠い!糸口がみつかった程度。
エラーが出るうちは未完成ですね
>(せっかく、作ったので、良かったら参考にして下さい)
恐らく参考にならないでしょう
Sub セル範囲を指定して格子罫線を引く2() ←コンパイルした?
宣言してない変数があるんだけど。
>If jis <> "" Then
これはマズイよね、"" は文字列だから、変数 jis が String じゃないとエラー起こす。
665:657
07/08/21 22:49:15
>>658
回答ありがとうございます。
1、については、>>657さんの回答で要領を得ました。
2、ワークシート関数よりユーザー定義関数の方が遅くて当然との事ですが、
なんらかの方法で、処理速度を上げられないだろうかとかんがえております。
内容は、単純な関数です。(セル内に同じ計算を必要とするため、マクロ化を検討しています。)
666:デフォルトの名無しさん
07/08/21 23:28:34
>なんらかの方法で、処理速度を上げられないだろうかとかんがえております。
ワークシート関数を使え。
マクロ(VBA)でやりたいなら、ワークシート関数を空きセルに貼ってしまえ。
667:デフォルトの名無しさん
07/08/21 23:39:03
>マクロ(VBA)でやりたいなら、ワークシート関数を空きセルに貼ってしまえ。
遅いんじゃない?
ワークシート関数をVBA上で使うと速いけど。
必要なデータは配列に格納し一気に処理(セル参照を頻繁にしないこと)が最速!
668:デフォルトの名無しさん
07/08/22 00:13:58
>>667 そうだね
速度重視ならワークシート上で計算しない設定に。もちろん数式は使わない
セル参照も最小限に。理想は、
シート上の必要なデータを配列に一気に格納、
結果は全て配列に格納し一気にシート上に書き込む
669:631
07/08/22 00:30:23
>>661-663 わざわざ、ソースを全部書いて頂いて、本当に申し訳ありませんでした
お騒がせしました
670:デフォルトの名無しさん
07/08/22 06:36:51
>>665
>内容は、単純な関数です。(セル内に同じ計算を必要とするため、マクロ化を検討しています。)
実際のコード晒してみれば?
具体的には、Cells( i ,j ) がコードに頻繁に出ると遅くなります。特にLoopの中は避けるべき。
私が始めて作った物は、データ取る為に2万回、書くために30万回、頻繁にCells( i ,j ) が...
おまけに Selectしまくってましたので
処理が終るまで30分以上かかってましたが、つくり直したら20秒ほどで出来た!
671:デフォルトの名無しさん
07/08/22 11:45:58
エクセルでバイナリエディタって作れますか?
672:デフォルトの名無しさん
07/08/22 12:30:58
もちろん作れるよ
673:デフォルトの名無しさん
07/08/22 18:03:10
>>672
ありがとう!
674:657
07/08/22 21:00:20
>>666
出来れば、マクロ内で処理したいと考えております。
シミュレーションファイルを作成中でして、他セルにも複雑な式が入っているので、
単純な関数なら、マクロに放り込んでしまいたいのです。
>>667>>668
配列は考えていませんでしたが、計算結果を返すセルが決まってないため、ユーザ定義関数を使おうと思ったしだいです。
>>670
function A(b,c,d,e)
b=(c+d)/2
A=b*e
end
こんな単純な計算を、10〜20個織り込み、かつシート上で近似値を算出する計算式を使っているので、
時間がかかります。
675:デフォルトの名無しさん
07/08/22 21:20:16
>配列は考えていませんでしたが、計算結果を返すセルが決まってないため、ユーザ定義関数を使おうと思ったしだいです。
理由になってないんじゃない?
配列を拒否するなら私は手を引くよ!
676:デフォルトの名無しさん
07/08/22 21:31:34
すみません。どなたかご存知でしたらお教えください。
VBAでsleepに該当する命令ってなんでしょうか?
WSHで、WScript.sleep(250)みたいな感じでやっているんですが、
これをVBAでやりたいです。
677:デフォルトの名無しさん
07/08/22 21:44:35
319 名前:名無したん(;´Д`)ハァハァ[sage] 投稿日:2007/08/22(水) 16:08:34 ID:aEA9W/2t
URLリンク(kissho2.xii.jp) 目欄
344 名前:名無したん(;´Д`)ハァハァ[sage] 投稿日:2007/08/22(水) 18:55:20 ID:YevU/rPG
>>319はウイルス。拡張子が怪しすぐる
らき☆すた 27
スレリンク(ascii2d板)
678:デフォルトの名無しさん
07/08/22 21:56:37
>>676
標準モジュールに
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
679:デフォルトの名無しさん
07/08/22 22:07:05
>>678
ありがとうございます。できました。
こんなテクあるんですね。勉強になりました。
680:デフォルトの名無しさん
07/08/22 22:08:37
>>657
オレも
>>656
Timer関数
681:デフォルトの名無しさん
07/08/22 22:10:12
↑誤爆
682:デフォルトの名無しさん
07/08/22 22:39:11
恐れ入ります、質問を失礼します。
Dim st4 As String
Dim r1 As Range,
st4 = Mid(r(1).Offset(2).Value, 5, 10) & "-" & Mid(r(1).Offset(3).Value, 2, 10)
こんな感じで13-1とか2-9といったst4にしたいのですが、
-の後が空欄の時があります。
そういったときは13-のようになってしまいますが、
-の後が空欄の時は13といったように-も表示させたくないです。
こういったことは可能でしょうか?
683:デフォルトの名無しさん
07/08/22 23:03:57
可能です
- は変数ハイフンに入れる
Dim ハイフン As String
3個の文字列を無条件で&で結合せず
IFで条件分岐してから結合すればよい
ハイフン = "-"
If Mid(r(1).Offset(3).Value, 2, 10) = "" then ハイフン = ""
st4 = Mid(r(1).Offset(2).Value, 5, 10) & ハイフン & Mid(r(1).Offset(3).Value, 2, 10)
684:デフォルトの名無しさん
07/08/22 23:12:03
>>683
おお、できましたぁ!!ありがとうございます!!!
これでボクの仕事がかなり減りました、感謝です♪
685:デフォルトの名無しさん
07/08/22 23:16:40
while ブロックで breakって出来ないの?
686:デフォルトの名無しさん
07/08/22 23:47:11
Exit使えよカス
687:デフォルトの名無しさん
07/08/22 23:53:55
か、かすう?
この俺様に向かって!
688:デフォルトの名無しさん
07/08/23 00:06:25
いつもお世話になります、1点質問を失礼します。無理やり上司から頼まれましたが、自分には無理難題です。
@もし○○○○の後7文字全てが半角英数字だったら、このセルの5文字目〜半角スペースに当たるまでをコピー、「α」とする
例
○○○○0120123456 ○
↓
α=0120123456
○○○○の後7文字に1文字でも全角文字が入っていたら、○○○○の一つ下の行の先頭から半角スペースに当たるまでを全てコピー「α」、さらに2つ下の行の先頭から「か」という文字に当たるまでをコピー、さらに○○○○から先の文字全てを繋げ「β」とする
○○○○あい12うえおあい
0120789123 ○○
Aか
↓
α=0123789123
β=Aあい12うえおあい
できればifでやりたいんですが、
Dim α As String, β As String
Dim r(1) as range '○○○○の行がr(1)とします
If Mid(r(1).Value, 5, 7) = 全部半角英数字 Then α=Mid(r(1).Value, 5)から" "まで
Else α=r(1).Offset(1).の先頭から半角スペースに当たるまで全て
β=r(1).Offset(2).の先頭から「か」に当たるまでをコピー&Mid(r(1).Value, 5, 99)
End if
すいません、自分ifの文に弱いものでかなり違うかもしれませんが、こんなマクロにしたいのです。宣言とかの理論は理解してます。お手数ですが、よろしくお願いします。
689:デフォルトの名無しさん
07/08/23 00:21:56
>>688
>>7文字全てが半角英数字
これって、記号類や半角カナはどうする?
とりあえず、半角・全角の判定だけでいいか?
それとも、英数字に限定?
690:デフォルトの名無しさん
07/08/23 00:30:25
とりあえず、半角・全角の判定のやり方だけど、
VBAには文字列の長さを調べる関数が3つある。
Len()、LenB()、LenMbcs()
の3つ。
Len()とLenMbcs()の結果が同じ→全部半角
Len()とLenMbcs()の結果が違う→全角を含む
と判定できる。
ただし、LenMbcs()はVBAには実装されてなくて、自分で書かないといけない。
書き方はMSDNに紹介されてる。
URLリンク(office.microsoft.com)
Function LenMbcs (ByVal str as String)
LenMbcs = LenB(StrConv(str, vbFromUnicode))
End Function
LenMbcs()は、半角で1、全角で2を返す関数。
691:デフォルトの名無しさん
07/08/23 00:35:39
>>689
失礼しました。
半角数字のみの時です、全角や記号や半角カナは×です。
692:デフォルトの名無しさん
07/08/23 00:50:08
'とりあえず、文字列strが数字かどうか判定する関数。
もっと少ない行数の書き方もあるんだが、あえてわかりやすく書いてみた。
Function IsNumberString(str As String) As Boolean
Dim i As Integer
Dim c As String
Const Number = "0123456789"
For i = 1 To Len(str)
c = Mid(str, i, 1)
If InStr(1, Number, c, vbBinaryCompare) > 0 Then
'c が数字だったので何もしない
Else
'c が数字ではなかった
IsNumberString = False
Exit Function
End If
Next i
IsNumberString = True
End Function
693:デフォルトの名無しさん
07/08/23 00:57:23
'strの中にある半角スペースを探して、
'その手前までをコピーする関数。
Function LeftEx(str As String) As String
Dim i As Integer
i = InStr(1, str, " ", vbBinaryCompare)
LeftEx = Left(str, i - 1)
End Function
694:デフォルトの名無しさん
07/08/23 21:25:50
今週からエクセルを使う仕事に就いて昨日マクロにはじめて触れた
初心者で申し訳ないのですが
ワークシートが2〜32まであり
各ワークシートのたとえばB5に以下のように入力したいのですが
ワークシート2のB5に2007/8/1
ワークシート3のB5に2007/8/2
:
ワークシート32のB5に2007/8/31
For sht = 2 To 32
Worksheets(sht).Select
Range("B5").Select
ActiveCell.FormulaR1C1 = "8/1/2007" + (sht-2)
Next sht
End Sub
これでは当然駄目でした。
今週末になれば自分で勉強しますが
できれば明日使いたいので
よろしければ教えてくださいませ何卒
695:デフォルトの名無しさん
07/08/23 22:03:21
俺の都合に合わせて、即答しやがれ糞共!!
ってわけですか
まぁそういうこと言う奴でも、こういう簡単な質問は
答えたくてウズウズしてる教えたがり厨が答えてくれるだろうけどw
696:デフォルトの名無しさん
07/08/23 22:08:02
Microsoft Access VBAの質問もここでおk?
Accessのスレないんだものorz
697:657
07/08/23 22:45:14
>>675
失礼しました。
698:デフォルトの名無しさん
07/08/23 22:45:18
>>696
moug に逝った方がいいんじゃね?
699:デフォルトの名無しさん
07/08/23 23:46:18
質問させてください。
VBA使って簡単な画像処理をしたいのですが、
画像の輝度値を求める関数って無いのでしょうか?
よろしくお願いします。
700:デフォルトの名無しさん
07/08/24 00:31:35
>>695
わざわざ質問スレに出張ってきて
こんな簡単な質問答えるやつは、
教えたがり厨だ!!
ってわけですか?
701:デフォルトの名無しさん
07/08/24 01:08:05
>>694
未テストだがこんな感じ
Public Sub SheetLoop()
Dim wksSheet As Worksheet
Dim dtDate As Date
Dim intOffset As Integer
Dim strbuf As String
dtDate = "2007/08/01"
For Each wksSheet In ThisWorkbook.Worksheets
strbuf = wksSheet.Name
If 2 <= CInt(strbuf) And CInt(strbuf) <= 32 Then
wksSheet.Cells(5.2).Value = Format$(dtDate + intOffset, "yyyy/mm/dd")
intOffset = intOffset + 1
End If
Next
Set wksSheet = Nothing
End Sub
702:デフォルトの名無しさん
07/08/24 01:24:03
>>701の注意点
シートの名称がイマイチ意味不明なのでとりあえずcintしたが、
これがSheet1とかのパターンが出てくると間違いなくエラーになるので、
isnumericで事前に回避するか、Sheet1系統でOKの場合は
"Sheet"&カウントで文字列連結してstrcompで見てやる必要がある。
今後の注意点
・1文字変数は使わない
・Activate,Select系は使わずオブジェクト経由でアクセスすること
・A1形式は極力使わない
・上記に伴いRangeを使う場面ではCellsで展開してから使用する
・セルに入れる値が日付や文字列や数値など、フォーマットが決まっている場合は
表示形式をNumberformatなどで事前に指定してやる
703:デフォルトの名無しさん
07/08/24 01:32:20
>>702
これって2月とかエラーにならね?
普通にDateAdd使えば?
704:703
07/08/24 01:33:57
うっは流し読みしすぎた
>dtDate = "2007/08/01"
で8月限定にしてんのか。すまん
705:デフォルトの名無しさん
07/08/24 02:46:23
X軸の数値 Y軸の数値
0 -1.5e-9
10 2.5e-8
20 4e-8
30 5e-7
40 6e-5
50 9e-3
のようなデータををX軸は普通、Y軸を対数にしてグラフ化しようとすると、
負の数を入力しようとしています。対数には負の数が入りませんとかエラーが
出ます。(それは当然分かります)
強行すると、この場合、X軸が0の場合を除いてグラフにしてくれます。
動作としてはそれで問題ないのですが、大量にグラフを作成しようとすると、
毎回エラーが出てうざったいのです。なんとかエラーメッセージを消去
して出なくしたいのですが、いい方法はないでしょうか。
706:デフォルトの名無しさん
07/08/24 02:53:19
>>705
事前に負の値を取り除く。
707:705
07/08/24 03:00:08
>>706
やはり、そういう感じでやるしかないのですか・・・
今はABSで絶対値にして逃げてるのですが。
708:デフォルトの名無しさん
07/08/24 05:38:20
そもそも負の値をとりうるデータを対数変換するってデータ処理としてどうよ?
709:デフォルトの名無しさん
07/08/24 07:38:02
>>707
それはおかしいだろう。対数を取りたいってことは負値はIllegalなんでないの?
或いは全体にオフセットを足すべきだったりはしない?
710:デフォルトの名無しさん
07/08/24 11:13:05
EXCEL VBAでフォームを使用して、ユーザーに
ファイルを選択してもらう仕組みを作りたいんですが可能でしょうか?
「参照」ボタンを用意して、ユーザーがクリックすると
フォルダ内のファイルが一覧表示されて、指定できるようなイメージです。
711:デフォルトの名無しさん
07/08/24 12:05:25
出来ますよ
必要なコントロールを配置して
> 「参照」ボタンを用意して、ユーザーがクリックすると
> フォルダ内のファイルが一覧表示されて、指定できる
をコードにすれば良いだけです
712:デフォルトの名無しさん
07/08/24 12:06:32
>>710
Dialogsオブジェクト
713:710
07/08/24 13:12:05
>>711,712
ありがとうございました!
ちょっと調べてみます!!
714:デフォルトの名無しさん
07/08/24 22:40:24
"俺の関数"というファイルにあるテーブルをVlookupした値を加工するユーザー定義関数を、"俺の関数.xla"の標準モジュールに作成しました。
他のファイルから"俺の関数"アドインを有効にしてみましたが、利用できません。どうすればいいですか?
Public Function 俺の関数(key)
fjFilename = "D:\Settings\俺\Application Data\Microsoft\AddIns\俺の関数.xla"
俺の関数 = WorksheetFunction.VLookup(key, Workbooks(fjFilename).Range("テーブル"), 2, 0)+1+2+3
End Function
715:デフォルトの名無しさん
07/08/25 10:10:50
>>710
Application.GetOpenFilename
716:デフォルトの名無しさん
07/08/26 09:28:40
URLリンク(sv2.st-kamomo.com)
↑
競馬の出走馬が並んだデータなのですが
これをレースごとに他のシートにコピペすることはVBAで可能でしょうか?
ちなみにレース場所は毎回異なります。
717:デフォルトの名無しさん
07/08/26 09:33:42
可能
718:デフォルトの名無しさん
07/08/26 09:34:33
>>717
可能だとするとどう命令すべきでしょうか?
719:デフォルトの名無しさん
07/08/26 09:41:35
>>718
「やれ!」
720:デフォルトの名無しさん
07/08/26 09:47:09
(・c_・` )ソッカー
721:716
07/08/26 11:23:09
マクロではできましたが今週の競馬開催の場所が毎回変わりますから
そこができないですね・・・
722:デフォルトの名無しさん
07/08/26 11:50:17
出来るけど、何か?
君が出来ないなら努力不足
723:デフォルトの名無しさん
07/08/26 11:54:41
>これをレースごとに他のシートにコピペすることはVBAで可能でしょうか?
↓
これをレースごとに他のシートにコピペすることはVBAで可能ですが、
どうやったらいいでしょうか?
724:デフォルトの名無しさん
07/08/26 12:09:18
マクロまでできたらそのマクロをいじれ
どういじればいいかは学べ
725:デフォルトの名無しさん
07/08/26 12:20:18
手でコピペは出来るんでしょ。
レースごとに分割する基準は何?
それをマクロに書けばいいだけ。
726:デフォルトの名無しさん
07/08/26 12:23:37
>レースごとに分割する基準
場所+レース番号 例) 札幌 9
または 馬番1〜大外枠
・・・
727:デフォルトの名無しさん
07/08/26 12:45:05
まずシートを作って
Sheets.Add
ActiveSheet.Name = 場所+レース番号 例) 札幌 9
あとは判るだろ
728:デフォルトの名無しさん
07/08/26 12:53:39
>>727
いやそれは分かるんだけどさ
競馬って毎週「札幌」があるわけじゃないのよ
10箇所以上の場所から2つ3つあるわけで・・・
729:デフォルトの名無しさん
07/08/26 13:04:45
変数
ヘルプ
これ以上書くことないな!
730:デフォルトの名無しさん
07/08/26 14:25:56
VBAマスターするコツってありますか?
反復演習・努力ですかね?
731:デフォルトの名無しさん
07/08/26 14:29:24
そもそも何を持ってマスターしたと言えるのか
誰もわからない(あるいは人によってマスターの基準が大きく異なる)ので、
誰もマスターしたなんて言わない。
732:デフォルトの名無しさん
07/08/26 14:53:26
初心者用の1冊をマスターしても実用性はないよな
733:デフォルトの名無しさん
07/08/26 16:24:13
最初は初心者用の入門書のとおりに実際に動かしてみる。
(一週間程度)
次は、簡単なオリジナルのコードを沢山作る。その際
他人に質問しないで自力で検索したりヘルプを見たりする。←最も重要
同時にVBA掲示板を閲覧し自分のレベルにあった質問で勉強する。
未だ、自分で質問はしない方が良いと思う。
(一ヶ月程度〜数年以上)
そのうち、ヘルプを見れば理解できるようになる。このレベルになれば
他人に質問しても相手に失礼じゃないと思う。
スクール行ったって資格は取れるかもしれないが実力がつくとは限らない。
やる気があれば独学で十分だとおもう。
734:デフォルトの名無しさん
07/08/26 16:46:44
俺の頭脳じゃ100年経ってもできないっぽい
実現させるには達人に出会ってお金を出して作ってもらう他ないな・・・
735:デフォルトの名無しさん
07/08/26 18:08:50
>>733
それ以前に、一般機能をひと通り理解してないと無理じゃない?
736:デフォルトの名無しさん
07/08/26 18:14:25
何を馬鹿なことを…
初心者用の本は斜め読み。
必要そうなとこだけを重点的に。
使いたいときだけさっと調べ(本屋、GOOOOOOOGLE)
出来そうじゃなかったらあきらめる。(どうしてもVBAでMSNメッセンジャー作りたいんです >< )
737:デフォルトの名無しさん
07/08/26 18:26:56
VBA本は初心者本ばかりか上級者向けとされている本ですら、
変数の命名規則が不明(どころか明示すらしない)だとか、見やすいコーディングを
考えないとか、速度に触れていないとか、後始末を省略してるとか、コレクションとか
クラスの使用法が全く記載されてないとか、そんなのばっかだから、その手の本の
まんまのコーディングはあんまり業務としての実用性はない
Excelレガシー問題ってこういう本の氾濫が大きいと思う
結局、リファレンスだけあればいいってことになる
738:デフォルトの名無しさん
07/08/26 18:35:13
初心者はプログラム自体にとっつきにくさと
わかりづらさから飽きがきやすいので
かなり偏った内容でも、とにかく楽しく、とにかく簡単で
実際にプログラミングしてみて動かせるような本が好ましい。
サンプルのついた本は腐るほどあるけど
一生使いもしないような題材だと萎えるから
そこのとこも吟味してほしい。
739:デフォルトの名無しさん
07/08/26 18:40:28
だからこそ>>736なんだが。
それにね、途中で興味がなくなったらそれはそれでいいんだよ。
VBAは何かの手段であって目的じゃないはず。
C++やc#でもやればいいんだよ。
740:デフォルトの名無しさん
07/08/26 20:57:33
>>735
そうですね。
一般機能のIF関数やVLOOKUPを使いこなせない人は苦労しそうだね?
741:デフォルトの名無しさん
07/08/26 21:36:12
自分に降りかかる/手が出せる範囲の仕事で滞りなく使えること。
VB「A」なら、↑でマスターしたって言っていいでしょ。
ということは「自分の仕事でVBA使って自動化/効率化したいこと」が
最高の教材になるんじゃないか?
職業プログラマの人は知らんけど。
もしそうなら別の言語マスターした方がよさそうだし。
742:デフォルトの名無しさん
07/08/26 21:43:30
VBAは簡単なのがいいね
C言語に何度も挫折した俺でも使える
VBにステップアップしようとしたけど.NET何たらになってて
よくわからなくて結局VBAに戻ってきた
743:デフォルトの名無しさん
07/08/26 22:12:14
With Worksheets(1).Range("a1:a500")
Set c = .Find(2, lookin:=xlValues)
If Not c Is Nothing Then
firstAddress = c.Address
Do
c.Value = 5
Set d = Worksheets(2).Range("a1:a500").Find(2, lookin:=xlValues)
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
End With
Loopんところでオブジェクトが無いとかって
エラーになるんですけどなんでですか?
途中で違うFindするとcの方のFindが無効になっちゃうのでしょうか?
744:デフォルトの名無しさん
07/08/26 23:13:40
ちゃんと例外処理しろよ
745:デフォルトの名無しさん
07/08/26 23:22:45
Loop While Not c Is Nothing And c.Address <> firstAddress
両方評価してからアンドの評価するからアウト
746:デフォルトの名無しさん
07/08/27 06:58:40
きたねーコードだな
747:743
07/08/27 09:52:45
>743ですが、Findのヘルプに載っている
使用例に下記一行を加えただけです。
Set d = Worksheets(2).Range("a1:a500").Find(2, lookin:=xlValues)
この一行が無ければ、動きます。
この一行を追記しただけでエラーになる理由が知りたいです。
748:デフォルトの名無しさん
07/08/27 12:55:18
なんで解らないのかが知りたいです。
749:デフォルトの名無しさん
07/08/27 14:11:31
>>747
むしろヘルプをコピっただけで
エラーになる俺に動く方法を教えてけれ
>c.Value = 5
をコメントアウトしないと
>Loop While Not c Is Nothing And c.Address <> firstAddress
のところで
cがNothingだから
c.Addrssがエラーになる
Loopのなかに
If c Is Nothing Then Exit Do
とか入れれば問題ないけど
これってヘルプが間違ってんの?
それとも条件しだいでは問題ないの?
750:デフォルトの名無しさん
07/08/27 14:34:19
>>743
> Loopんところでオブジェクトが無いとかって
> エラーになるんですけどなんでですか?
エラーメッセージを正確に書き写せばいいのに。
簡単な英語もわからないと不便だね。
751:デフォルトの名無しさん
07/08/27 18:21:56
エラーって日本語だろ?
752:デフォルトの名無しさん
07/08/27 20:16:40
屁理屈ばっかごねてるヴァカ
753:デフォルトの名無しさん
07/08/28 20:15:47
Excelのオートフィルタ機能を関数で表したいと思うのですが可能でしょうか
教えて下さい
754:デフォルトの名無しさん
07/08/28 22:05:01
ググレカス
755:デフォルトの名無しさん
07/08/28 22:05:53
>>753
> 可能でしょうか
お答えします、可能です
やり方は自分で調べてください
756:デフォルトの名無しさん
07/08/29 09:31:53
これを日本語訳に直してもらえないでしょうか?
Sub TTT()
Dim iR As Integer, iT As Integer, iK As Integer, iM As Integer
For iR = 1 To Cells(1, "A").SpecialCells(xlLastCell).Row
Select Case Cells(iR, "A")
Case "高橋"
iT = iT + 1
Sheets("高橋").Cells(iT, "A") = Cells(iR, "A")
Sheets("高橋").Cells(iT, "B") = Cells(iR, "B")
Case "亀井"
iK = iK + 1
Sheets("亀井").Cells(iK, "A") = Cells(iR, "A")
Sheets("亀井").Cells(iK, "B") = Cells(iR, "B")
Case "道重"
iM = iM + 1
Sheets("道重").Cells(iM, "A") = Cells(iR, "A")
Sheets("道重").Cells(iM, "B") = Cells(iR, "B")
End Select
Next
End Sub
757:デフォルトの名無しさん
07/08/29 09:38:03
潜水艦TTT()
薄暗さ、不-、整数、それ、整数、整数としてのiK、不-、整数
セル(1、「A」).SpecialCells(xlLastCell)の.Rowの選んだケースセルへの不-
=1、(不-、「A」) ケース"高橋"
それ=それ、+1
シート("高橋").Cells、(それ、「A」) =セル(不-、「A」)
シート("高橋").Cells、(それ、「B」) =セル、(不-、「B」) ケース"亀井"
iK iK=+1
シート("亀井").Cells(iK、「A」)=セル(不-、「A」)
シート("亀井").Cells(iK、「B」)=セル、(不-、「B」) ケース"道重"
不-=不-+1
シート("道重").Cells、(不-、「A」) =セル(不-、「A」)
シート("道重").Cells、(不-、「B」) =セル、(不-、「B」)終わりは次の終わ
りの潜水艦を選択します。
758:デフォルトの名無しさん
07/08/29 10:27:52
日本語になってねー
759:デフォルトの名無しさん
07/08/29 10:43:53
逆に言えば元の756だって英語か何かになっていたかというと、そうではないということ。
それはVisual Basicという言語なのだから。
760:デフォルトの名無しさん
07/08/29 10:53:21
それ以前に756動作しないし? 俺も釣られた?
761:デフォルトの名無しさん
07/08/29 12:42:40
>>760
元々別のシートにあるデータをコピペする動作だからね
マジで>>756どう構造か教えて欲しい
TTT というのは任意のタイトルだよね
Dim iR As Integer は整数型の変数の宣言だよね
その後のTo Cells とか SpecialCells(xlLastCell).Row とかが分からん
762:デフォルトの名無しさん
07/08/29 12:47:13
元のワークシートから名前別のワークシートにA列とB列の値を転記してるだけやん
763:デフォルトの名無しさん
07/08/29 13:54:32
>>756
Cells プロパティの記述が変体的?
764:デフォルトの名無しさん
07/08/29 14:09:33
ダメだ全然ワカンネ
VBAの初心者向きの本も理解できねぇ('A`)
765:デフォルトの名無しさん
07/08/29 14:33:56
VBAでプログラムを勉強しようとするのは無謀だな
VBの知識があってマクロ記録のソースから覚えれば早い
766:デフォルトの名無しさん
07/08/29 14:34:40
初心者向きなのに解かりづらい本が多いからね。
↓ こっちのサイトが私にはわかりやすい。
URLリンク(www6.plala.or.jp)
767:デフォルトの名無しさん
07/08/29 14:50:44
VBAって今後どうするの? フォーマットが公開されていないファイルは、
政府も使わないと言っている。2007でXMLも標準になったが、マクロが
仕込んであるのでは、公的には使えなくなるんじゃないのかな?
768:デフォルトの名無しさん
07/08/29 16:13:18
> 政府も使わないと言っている。
騙されてる奴が多いが「使わない」とは言ってない
国のやるポーズには、必ず逃げ道仕込んでおくものさw
769:デフォルトの名無しさん
07/08/29 18:31:56
通常VBA含んだExcelを他に配ったりしないんじゃないの?
自分の仕事を効率化するために使ってる人が大部分じゃない?
私は他人の作ったロックしたマクロを使ったことないし使うつもりも無い。
770:デフォルトの名無しさん
07/08/29 21:34:34
恐れ入ります、質問をお願いします。
会社でエクセルのマクロを使用していますが、困っています。
現状、共用ドライブにエクセルファイルを格納し、5人で使用しています。
使用する際は、それぞれ一人一人にパソコンが支給されており、支給された個人のパソコンから共用ドライブにアクセスし、入力
しています。
こういった状況で、マクロで入力する際、人の名前(入力者の名前)を自動的に取得、エクセル表の任意の場所に貼り付けすることはできないものでしょうか?
winXP エクセル2000です。
771:デフォルトの名無しさん
07/08/29 21:57:06
出来るんじゃないかな?ユーザー名を取得し履歴のように日時と一緒に書き込んだり
入力したセルのコメントに日時とユーザー名を記録する事も。
772:デフォルトの名無しさん
07/08/29 23:05:23
EXCELでVBAでDLLを使う場合、
そのDLLをxlsファイル内に埋め込む方法はありませんか?
773:デフォルトの名無しさん
07/08/29 23:16:04
ActiveSheet.OLEObjects.Add(
Filename:= "C:\Documents and Settings\Administrator\デスクトップ\xxx.dll",
Link:=False,
DisplayAsIcon:=False).Select
これはxlsファイル内にdllを保存するということでいい?
このファイルを外部に保存するにはどうしたら・・・
774:デフォルトの名無しさん
07/08/29 23:34:31
>>770
Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
775:デフォルトの名無しさん
07/08/29 23:37:36
>>772
ない。DLLはDLL。
素直にDeclare宣言して関数使いましょう。
776:デフォルトの名無しさん
07/08/29 23:44:06
>>775
宣言など使い方は通常通りでいいんだけど
配布ファイルが複数になるのが駄目なんだ
xls内にdllを保存し、
起動時にdllをカレントフォルダに保存。
dllを使った処理を行い、
終了時にdllを削除。
っていう流れがやりたい。
777:デフォルトの名無しさん
07/08/29 23:50:02
>>776
> xls内にdllを保存し、
これの意味が分からん。保存ってなんだ?
LoadLibraryしてFreeLibraryすりゃいいんじゃね?
そういう話じゃない?
778:デフォルトの名無しさん
07/08/29 23:51:09
ついでだ。
#If Win32 Then
Private Declare Function LoadLibraryEx Lib "Kernel32" Alias "LoadLibraryExA" _
(ByVal lpLibFileName As String, _
ByVal hFile As Long, _
ByVal dwFlags As Long) As Integer
Private Declare Sub FreeLibrary Lib "Kernel32" (ByVal hLibModule As Integer)
#Else
Private Declare Function LoadLibrary Lib "kernel" (ByVal f$) As Integer
Private Declare Sub FreeLibrary Lib "Kernel" (ByVal h As Integer)
#End If
779:デフォルトの名無しさん
07/08/29 23:57:50
>>777
A.xlsはマクロでB.dllを使用しています。
A.xlsを利用するためには同(又はパスの通った)フォルダにB.dllを置く必要があります。
ですが、
A.xlsの配布時にB.dllを同時に配布すればいいんですが、それは運用的に無理です。
また、ファイルの移動(複写)をする場合には、A.xlsのみの移動(複写)でシステムが動くようにする必要があります。
なので、
A.xls内にB.dllを埋め込み、実行時それをファイルとして抽出保存し、利用する必要があります。
780:デフォルトの名無しさん
07/08/30 00:03:16
いや、DLLはDLLなんだからファイル自体別。
埋め込むってのがよく分からんが、
DLLの配布がNGなら
DLLの関数をVBAで組めばいいって話じゃ済まないの?
要するに、DLLは無くして全部VBAで書けって話。
ダメなん?
781:デフォルトの名無しさん
07/08/30 00:07:13
>A.xls内にB.dllを埋め込み
テキストとしてシートに書くって事か?
782:デフォルトの名無しさん
07/08/30 00:08:55
とりあえず目的をはっきりさせてくれんと分からん。
DLLの配布が目的なのか、マクロの動作が目的なのか、それともその他、どれだ?
783:デフォルトの名無しさん
07/08/30 00:15:45
VBAで処理書くのは最後の手段。出来れば避けたい
DLLの関数を使いたい。
メールの添付ファイルみたいにxls中にdllを入れて、
マクロでそれを、dllファイルに書き出して利用したい。
メールはbase64だっけ
マクロの動作が目的
784:デフォルトの名無しさん
07/08/30 00:18:47
オブジェクトの挿入でファイルを添付できるんじゃね?
785:デフォルトの名無しさん
07/08/30 00:20:24
そういうことか。
でもExcelで出来るのかは怪しいな。
786:デフォルトの名無しさん
07/08/30 00:22:00
ぶ
オブジェクトの挿入で出来たぞ
ちょっと目鱗
787:デフォルトの名無しさん
07/08/30 00:23:02
>>784
添付はできてるんだけど、マクロでそれをファイルに保存ができない
788:デフォルトの名無しさん
07/08/30 00:45:33
実を言うと、俺も772と同じことを以前やろうとしたんだが、無理だった。
DLLを.xlsファイルに埋め込むことは出来るし、動的にDLL作成することもできるんだけど、
その中から関数を呼び出す方法が無くて。
Declare Function〜は、マクロ実行時にDLLが無いとエラーになるので使えない。
Cなら動的にLoadLibrary()→AddressOf()って方法もあるんだが、VBAの場合、
AdressOf()はコールバックのアドレスにしか使えなくて。
.xlsに埋め込んだ方法だけど、標準モジュールの中に何かの変数(配列)として入れておいた。
それで、実行時にファイルとして書き出す。dllが小さかったから出来た方法だけどね。
789:デフォルトの名無しさん
07/08/30 00:52:07
標準モジュールの中に何かの変数(配列)として入れておいた。
それで、実行時にファイルとして書き出す。
ここ詳しく教えて
@バイナリデータとして入れておいて
Aバイナリ書き出しでdll作成??
@がよく分からん
790:デフォルトの名無しさん
07/08/30 00:52:55
今日はもう落ちるんで、朝確認します
よろしくおねがいします
791:デフォルトの名無しさん
07/08/30 02:39:36
URLリンク(hisazin-up.dyndns.org)
このエクセルファイルの中にtest()ってマクロがあるから、実行してくれ。
デスクトップにasakusa.jpgっていう画像ファイルができる。
仕組みはソース読め。
792:デフォルトの名無しさん
07/08/30 07:50:46
>>791
落ちてるorz
長持ちするとこに再うpおねがいします
793:デフォルトの名無しさん
07/08/30 09:01:23
>>788
そういうときにはCallWindowProcとかEnumWindowsとかを使えばいいんだよ。
794:デフォルトの名無しさん
07/08/30 09:21:12
>>791 はウィルス?
ファイルは存在してるがブロックされる
795:デフォルトの名無しさん
07/08/30 12:01:12
>>792
普通に保存できたよ
796:デフォルトの名無しさん
07/08/30 17:32:03
VBAの変数って多次元の連想配列って無理?
PHP的に書くと $hensu['mojiretsu1'][0] $hensu['mojiretsu2'][1]
みたいな
797:デフォルトの名無しさん
07/08/30 17:44:55
collectionにcollectionを格納すれば可能
ちょっと辛いけど
798:デフォルトの名無しさん
07/08/30 17:45:13
PHPは知らんからVBA的に書いてくれ
799:デフォルトの名無しさん
07/08/30 17:57:27
>>797
うええめんどくせえ
DBのSELECT用の関数とかみんなどうやってんだ
$serectData[フィールド名][0] みたいに使えないんでしょ?
>>798
hensu("mojiretsu", 1) みたいな感じかなあ
800:デフォルトの名無しさん
07/08/30 18:41:36
const mojiretsu=0 as integer
でいいじゃん
801:デフォルトの名無しさん
07/08/30 19:31:39
>>791
これはとりあえず出来ました。
ただ、
340kbのDLLが.basにすると700kbくらいになって
それを300kb弱のxlsに入れて保存すると1300kbになって
それを他のシートの値を変更して、上書き保存すると2700kbになったorz
DLLをxlsにOLEオブジェクトで追加して
ActiveSheet.Shapes("Object 1").Copy
ってやるとクリップボードにDLL保存出来て、
手作業でどこかのフォルダに貼り付けは出来たんだけど、
それをマクロでやる方法が見つからなかった。
どなかた教えてください。
802:デフォルトの名無しさん
07/08/30 20:07:43
マクロで、オートフィルターの選択を、「すべて」にするようにしたいです。
Selection.AutoFilter Field:=5
でいいのでしょうか?最後の数字の意味がわかりません。
803:デフォルトの名無しさん
07/08/30 20:50:50
>>799
WSHのDictionaryObject使うと似たようなことはできると思ったよ
ただ凄く遅かったのと、Vbaからは使ったこと無いので自分で調べてみてくれ
804:デフォルトの名無しさん
07/08/30 22:05:39
>>802
F1でヘルプな
805:デフォルトの名無しさん
07/08/30 22:20:58
Dictionaryは使いにくいので書き換えを伴うときはVariant配列にしてしまう
参照用だけならCollectionで決まりなんだけどねぇ
806:デフォルトの名無しさん
07/08/30 22:50:33
もしご存知でしたら教えてください。
Findメソッドに関してなのですが、検索対象に"/"が文字列間に
含まれていると検出してくれません。
例:2007/8/30 など
"/"単体だと検出してくれるのですが、、
これはこのメソッドの使用なのでしょうか?
ぐぐってみたのですが参考になるようなものをみつけれなかったので。。
807:デフォルトの名無しさん
07/08/30 22:59:11
>2007/8/30
文字列じゃないだろ?検出しなくて当然!
808:デフォルトの名無しさん
07/08/30 23:09:34
VBAでクリップボードにコピーされてるDLLをファイルに落とす方法はありませんか?
809:デフォルトの名無しさん
07/08/30 23:17:42
>>807
ありがとうございます。
テキストボックスに入力された日付をString型の変数に格納したのですが
文字列にはならないのでしょうか?
2007:OK
/:OK
2007/:文字列型じゃない、、
一度SplitしてからFindすることにします。。
810:デフォルトの名無しさん
07/08/30 23:25:27
___
./ \
.| ^ ^ | あまり私をやらせない方がいい
| .>ノ(、_, )ヽ、.|
__! ! -=ニ=- ノ!___
/´ ̄ ̄ .|\`ニニ´/ `ヽ
,.、-  ̄/ | l  ̄ / | |` ┬-、
/ ヽ. / ト-` 、ノ- | l l ヽ.
/ ∨ l |! | `> | i
/ |`二^> l. | | <__,| |
_| |.|-< \ i / ,イ____!/ \
.| {.| ` - 、 ,.---ァ^! | | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄l
__{ ___|└―ー/  ̄´ |ヽ |___ノ____________|
}/ -= ヽ__ - 'ヽ -‐ ,r'゙ l |
__f゙// ̄ ̄ _ -' |_____ ,. -  ̄ \____|
| | -  ̄ / | _ | ̄ ̄ ̄ ̄ / \  ̄|
___`\ __ / _l - ̄ l___ / , / ヽi___.|
 ̄ ̄ ̄ | _ 二 =〒  ̄ } ̄ / l | ! ̄ ̄|
_______l -ヾ ̄ l/ l| |___|
811:デフォルトの名無しさん
07/08/30 23:44:08
>>808
またおまえか
812:デフォルトの名無しさん
07/08/31 08:08:37
>>811
方法おしえて
813:デフォルトの名無しさん
07/08/31 08:24:16
>>805
Collectionでも書き換え出来るけどね
814:デフォルトの名無しさん
07/08/31 09:23:41
>>809
エクセルでは日付は思うように出来ないことも有る。有る意味仕様
一例を挙げると
Sub Cstrのテスト()
Cells(1, 1) = Date
Cells(2, 1) = CStr(Cells(1, 1))
End Sub
トンでもない結果が出ると思う。
815:デフォルトの名無しさん
07/08/31 14:18:52
>>814 (809じゃないけど面白そうなんで試してみた)
Cells(1,1) → 2007/8/31
Cells(2,1) → 1931/7/8
ビックリ仕様ですね
816:デフォルトの名無しさん
07/08/31 21:55:56
> エクセルでは日付は思うように出来ないことも有る。有る意味仕様
ちゃんと理解してないから思うようにいかないだけ
817:デフォルトの名無しさん
07/09/01 06:59:50
>>814
CStrのヘルプみると引数に日付型は有効だけど
Cells(2, 1)の表示形式も日付に変わってる?
これは仕様というよりバグじゃ?
818:デフォルトの名無しさん
07/09/01 08:32:29
>>814
手元にExcel無いから自信が無いが、確か "'"+CStr(Cells(1,1)) って書けば正常表示された記憶がある
頭が数値の文字列入れるとExcelって数字で判断しちゃうんだよね、バグというより仕様でもいいんじゃね
>>809も頭にアポストロフィを足してやると正常になるかもよ
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4208日前に更新/289 KB
担当:undef