Excel VBA 質問スレ Part19

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
2デフォルトの名無しさん:2011/05/19(木) 06:37:40.54
ExcelのVBAに関する質問スレです

★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)
3デフォルトの名無しさん:2011/05/19(木) 09:09:18.28
>1,2 乙
4デフォルトの名無しさん:2011/05/19(木) 10:09:31.25
おっつ
5デフォルトの名無しさん:2011/05/19(木) 16:40:20.76
Cells(1+i, 1) = "=COUNT(B1:H1)"

のような形でfor文で回して各行の合計をそれぞれ表示させたいのですが
B1:H1の部分を足していく(B2:H2、B3:H3…)
のようにするにはどうすればいいのでしょうか?
6デフォルトの名無しさん:2011/05/19(木) 17:20:01.87
Cells(1+i, 1) = "=COUNT(B" &1+i & ":H" & 1+i & ")"
7デフォルトの名無しさん:2011/05/19(木) 17:35:11.40
そんなのに応えるなよw
8デフォルトの名無しさん:2011/05/19(木) 18:39:40.63
vbaのコードをカラー印刷する方法ってある?
MS XPS Document Writerを使っても白黒にしかならないんだけど。

VB2008ならMS XPS Document Writerでカラー印刷できるのに、
VBAはなんでカラー印刷にならないんだろうか?
9初心者です:2011/05/19(木) 20:32:24.73
質問させてください

A5からH1000程度のデータ表があります。
このプログラムを実行すると、構文エラーがでてきます。
Loop Until Cells(gyou, retu) = "" にカーソル位置が来て。LOOPに対応するDoがありませんと表示されます。

Sub サイコロ()
Dim ymaru As Integer, imaru As Integer
Dim gyou As Integer, retu As Integer
ymaru = 0
imaru = 0
gyou = 6
retu = 8

10初心者です:2011/05/19(木) 20:33:40.06
続きです。

Do
If Cells(gyou, retu) = "○" Then
ymaru = ymaru + 1
imaru = 0
If ymaru >= 3 Then
Call 連同初買引売
Else
ymaru = 0
imaru = imaru + 1
If imaru >= 3 Then
Call 連同初売引買
End If
gyou = gyou + 1
Loop Until Cells(gyou, retu) = ""
End Sub

11初心者です:2011/05/19(木) 20:34:00.92
続きです

'サイコロ 連日同一サイコロ 初値買い〜当日引値売り
Sub 連同初買引売()
Cells(gyou, retu).Offset(0, -6).Copy
Cells(gyou, retu).Offset(0, 7).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End Sub

Sub 連同初売引買()
Cells(gyou, retu).Offset(0, -6).Copy
Cells(gyou, retu).Offset(0, 8).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End Sub

一体、Donosysoriのどこが間違っているのでしょうか?
あと、サブルーチンのcellsの使用法は間違っていませんか?
12デフォルトの名無しさん:2011/05/19(木) 20:44:12.79
end IFの数を数えたことがあるか?
13デフォルトの名無しさん:2011/05/19(木) 20:54:29.56
インデントとか適当なんだろうなあ
14デフォルトの名無しさん:2011/05/19(木) 20:58:45.19
>>8
実は俺もコードをカラー印刷する方法を知りたい。
誰か教えて。
15デフォルトの名無しさん:2011/05/20(金) 00:04:30.61
まず服を脱ぎます
16デフォルトの名無しさん:2011/05/20(金) 03:56:03.69
ソースをVisualStudioにコピペして印刷
17デフォルトの名無しさん:2011/05/20(金) 04:00:23.88
>>9
Ifが3つあるのにEnd Ifが1つしかない
変数gyouとretuの内容が下のSubに伝わっていない
188=14 実は同一人物ですw:2011/05/20(金) 09:59:30.88
>>16
うまくいきました。ありがとうございます。
16さんもやってますか?

しかし、XPS Document Writerは
いちいち上にパス名が表示されてうざいのですが、
これを全く表示しない方法ってある?
16さんのような使い手ならご存知かと。。。
19デフォルトの名無しさん:2011/05/20(金) 10:52:03.99
>>6
ありがとうございます、うまくいきました!
20デフォルトの名無しさん:2011/05/20(金) 14:17:20.63
【問題】以下は、コマンドボタンを押した時に選択されているセルの中央に横線を引くプロシージャである。@、Aにあてはまるコードは何か書け。

Private Sub CommandButto1_Click()

Dim myLeft1 as long
Dim myTop1 as Long
Dim myWidth1 as Long
Dim Target1 as Range

@

myLeft1 = Target1.Left
myTop1 =Target1.Top + Target1.Height / 2
myWidth1 = Target1.Width + Target1.Left

Set MyLine1 = A

End Sub
21デフォルトの名無しさん:2011/05/20(金) 14:56:37.69
@set〜
A〜addline〜
22デフォルトの名無しさん:2011/05/20(金) 16:17:49.65
なぁ、いつからここはVBAのドリルを解くスレになったんだ?なんて突っ込まないから、
もう少し解いて面白い問題出してくれよ。
23デフォルトの名無しさん:2011/05/20(金) 19:02:36.23
>>22
お前のためのスレです
24デフォルトの名無しさん:2011/05/21(土) 12:11:23.03
ユーザーフォームのコマンドボタンの形を四角ではなく、矢印や丸などに変えたいのですが、どなたかやり方を教えて頂けないでしょうか?
よろしくお願いします。
25デフォルトの名無しさん:2011/05/21(土) 12:31:21.42
>>24
VB6と同じやり方で
26デフォルトの名無しさん:2011/05/21(土) 12:33:40.94
>>25
やってみろや
27デフォルトの名無しさん:2011/05/21(土) 13:58:52.29
>>24
Excelの機能でボタンの形を変えるのは無理
丸とか矢印の画像をボタンかイメージか何かのコントロールに貼り付ける
28デフォルトの名無しさん:2011/05/21(土) 17:40:04.28
ある特定範囲内の列の文字をSplit関数で文字分割したいんだが
区切り文字がないセルになるとエラーが出てそこで止まってしまう。解決方法あったら教えて下さい



  A
1 1/2
2 1/3
3 1/4
4 5
5 1/6


Sub split()

Dim i As Integer, tmp As Variant

For i = 1 To 5
    tmp = Split(Cells(i, 1), "/")
    Cells(i, 1) = hp(1)
Next i

End Sub


この場合、i=4のところで処理が止まってしまいます。
29デフォルトの名無しさん:2011/05/21(土) 17:46:27.32
セルの文字数が0以上判定
文字列内部に/があり、かつ前後に文字列が少なくとも1つあることを判定
条件達成で処理
30デフォルトの名無しさん:2011/05/21(土) 17:55:26.00
>>29
ありがとう
ちなみに内部に"/"の判定だけでよくて、前後の文字は関係なかったです
31修行の身:2011/05/21(土) 20:31:24.67
誰かマクロを教えてくださいm(_ _)m
・シート1の『〔○曜日〕』から『 /他』まで、といった感じで各曜日の文章を1セルにまとめ、シート2に出力したい。ただし各週文章数はランダムのためそれに対応できるのが良いです。
・A1の文字列から日付を抽出してシート2に出力したい。
-----シート1-----
  A
1 5月9日(月)〜5月13日(金)
2 "〔月曜日〕"
3 "●文章1"
4 "●文章2"
5 "●文章3"
6 " /他"
・・・
----------
シート1の情報をシート2に以下のように出力したいです。
-----シート2(別シート)-----
  A    B
1 5/9   "〔月曜日〕●文章1●文章2●文章3 /他"
2 5/10  "〔火曜日〕●文章1●文章2 /他"
・・・
5 5/13  "〔金曜日〕●文章1 /他"
----------
32デフォルトの名無しさん:2011/05/21(土) 20:48:13.19
とりあえず
>>2のテンプレ★5を読んでこい

やってみたなら
できたとこまででいいからコード晒しとけ
33デフォルトの名無しさん:2011/05/21(土) 20:54:58.23
めっちゃ簡単だから、スレルール違反だろうと教えたがり君が喜々として語り出すかもw
34デフォルトの名無しさん:2011/05/21(土) 21:20:34.80
>>33
スレルールを述べよ
35デフォルトの名無しさん:2011/05/21(土) 21:24:45.12
英語のWeb辞書ページのHTMLからソースを抜き出して
複数の単語の意味を並べたHTMLを作ろうとしています。

ほぼできたのですが、ファイル出力すると発音記号が
「?」に変わってしまいます。

一旦単語ごとにセルに出力していますが、たとえばassureでは、
セルではきちん「əˈʃʊə」「əʃɔː」となっており、
そこからメモ帳に手動コピペしても「əˈʃʊə」「əʃɔː」となります。
しかしVBAで出力すると「????」です。

なにか対策はありますでしょうか。
36デフォルトの名無しさん:2011/05/21(土) 21:35:57.45
>>35
unicode
37デフォルトの名無しさん:2011/05/21(土) 22:21:39.12
>>36
ありがとうございます。できました。
発音記号に気づく前に改行が文字化けすることに気づいて、
削除したりいろいろしてましたが無駄でしたorz

今日はじめてVBA(というか組み込みC以外)のプログラムを触りましたが、
やれることも手段も多すぎて疲れました…面白いですがw
38デフォルトの名無しさん:2011/05/21(土) 22:30:49.33
MSに文句言っとけ
39デフォルトの名無しさん:2011/05/21(土) 22:37:40.72
>>34
★1 OSとExcelのバージョンくらい書け
★2 VBA使わないExcelの質問禁止
★3 VBAでExcel本体を操作する用途以外はスレ違い
★4 同上
★5 丸投げお断り
★6 わからなければマクロの記録試せ
40デフォルトの名無しさん:2011/05/21(土) 22:54:05.46
【問題】以下は、コマンドボタンを押した時に選択されているセルの中央に横線を引くプロシージャである。【@】【A】にあてはまるコードは何か書け。

Private Sub CommandButto1_Click()

Dim myLeft1 as long
Dim myTop1 as Long
Dim myWidth1 as Long
Dim Target1 as Range

【 @ 】

myLeft1 = Target1.Left
myTop1 =Target1.Top + Target1.Height / 2
myWidth1 = Target1.Width + Target1.Left

Set MyLine1 =【 A 】


End Sub
41デフォルトの名無しさん:2011/05/21(土) 22:55:32.13
@set〜
A〜addline〜
42デフォルトの名無しさん:2011/05/21(土) 23:41:02.65
〜 とは何だよ?正しく書きましょう
43デフォルトの名無しさん:2011/05/22(日) 00:02:24.90
@set 以下略
A前略 addline 以下略
44デフォルトの名無しさん:2011/05/22(日) 00:08:18.48
略したとこがどうしてもわかりません。教えてください。ずっとわかりません
45デフォルトの名無しさん:2011/05/22(日) 00:21:42.79
つーかさ、この問題文だと
Set MyLine1
する必要無いよなw

MyLine1の変数宣言がこのプロシージャ内に無いのを見ると
モジュールレベルで宣言されていて別の処理で使うのだろうが
問題として適切じゃないねw
46デフォルトの名無しさん:2011/05/22(日) 01:20:57.00
どうやったら早くプログラム組めるようになる?
それともやっぱり早さよりも正確さの方が重要かな?
47デフォルトの名無しさん:2011/05/22(日) 04:03:36.57
以下はセルに円を描画するマクロ ???に入る式を答えよ

Sub en(tx, ty, hankei) '中心X 中心Y 半径
Dim a, b, c, d, e, f, g, z
a = hankei ^ 2
b = hankei
c = 0
Do
If b > 0 Then
d = -1
Else
d = 1
End If
If c > 0 Then
e = 1
Else
e = -1
End If
f = Abs(b ^ 2 + (c + d) ^ 2 - a)
g = ???
If f > g Then
b = b + e
Else
c = c + d
End If
Cells(c + ty, b + tx).Interior.Color = 0
If c = 0 And e = 1 Then Exit Sub
Loop
End Sub
48デフォルトの名無しさん:2011/05/22(日) 05:02:07.07
ヘボコード読むより、1から作った方が早くて速いんだが
あえて答えるとbとc入れ替えてdをeに

因みに、正しくは「セルの塗りつぶしで円を表現する」な
49デフォルトの名無しさん:2011/05/22(日) 09:03:41.76
エクセルのVBAでマクロを作ったのですが、2003で作って動作確認して、
2010で動かしてみようとしたのですが、最初の立ち上がった時にいろいろ仕込んだメッセージが出た後に、
画面が灰色になり強制終了されているようです。
理由が分かりません。誰か分かりませんか?
50デフォルトの名無しさん:2011/05/22(日) 09:13:39.59
まずはうp
51デフォルトの名無しさん:2011/05/22(日) 09:15:54.87
>>50 えー何を?
52デフォルトの名無しさん:2011/05/22(日) 09:40:00.26
問題がおきるブック

うpしたくないとか、うpできないとか言うなら、さようなら
53デフォルトの名無しさん:2011/05/22(日) 09:42:09.83
問3 一からコード書いてセルの塗りつぶしで楕円を表現しなさい
26行以内 時間無制限
54デフォルトの名無しさん:2011/05/22(日) 09:42:19.66
>>52 えーごめんなさい。会社のデータもちょっとかんでるのでうpできないです。
55デフォルトの名無しさん:2011/05/22(日) 12:30:57.35
>>49ですが、自己解決しました。ありなっとー。
56デフォルトの名無しさん:2011/05/22(日) 13:05:23.59
>>47
問題がおかしいけど、たぶん出題者の意図としては

g = Abs(c ^ 2 + (b + e) ^ 2 - a)

>>53 そもそも提示されたソースだけでは>>47が楕円になるし、いくらなんでも26行は長杉
57デフォルトの名無しさん:2011/05/22(日) 16:06:27.34
>>56
> g = Abs(c ^ 2 + (b + e) ^ 2 - a)
その解答は、既に>>48が書いてるじゃん

f = Abs(b ^ 2 + (c + d) ^ 2 - a)
g = Abs(c ^ 2 + (b + e) ^ 2 - a)
> bとc入れ替えてdをeに
58デフォルトの名無しさん:2011/05/22(日) 17:07:10.83
>>46
お前は早く作ると不正確なコードになるのか?
だとしたら意味ねー。
59デフォルトの名無しさん:2011/05/22(日) 22:02:28.94
>>58
残念ながらちょっと複雑なコードになってくると
雑になるんだな。
やっぱ正確さは前提だよな。
じっくりすることにするわ
60デフォルトの名無しさん:2011/05/23(月) 00:06:34.87
>>59
動作の精査が取れた使い回しの効く部分は、
部品化しておいて、機能やカテゴリごとに標準モジュールやクラスに纏めておくと、
その部分は速く正確に作れるよ。
特に同じ様なものを複数作る時はフォーマットになるスケルトンを先に作ってからやると最終的には速く作れるわさ。
6116才♀ :2011/05/23(月) 07:41:28.04
16才♀ですが・・僭越ながら問題出しますっ!!><

問題:
セルに「さやか」と入力すると
・新規シート作成
・そのシート以外の全てのシート削除
・ブック保存
・ブック閉じる
以上を警告メッセージなしで行うプロシージャを絶対作成しなさい><
62デフォルトの名無しさん:2011/05/23(月) 08:14:31.84
ネコマタか……
63デフォルトの名無しさん:2011/05/23(月) 08:17:32.29
面白いと思ってるのか?
64デフォルトの名無しさん:2011/05/23(月) 08:34:40.33
>>61
髪型がツインテールなら考える
65デフォルトの名無しさん:2011/05/23(月) 08:41:01.31
>>61
なんか悪意的仕様にしか見えない。
66デフォルトの名無しさん:2011/05/23(月) 08:50:32.67
そこまでしなくてもパソコンの電源OFFでいいじゃん
67デフォルトの名無しさん:2011/05/23(月) 14:34:40.30
セルに「さだこ」と入力すると
・新規シート作成
・ry
68デフォルトの名無しさん:2011/05/23(月) 16:11:01.63
>>61
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If (Target.Cells = "さやか") Then
Application.DisplayAlerts = False
Worksheets.Add after:=Worksheets(Worksheets.Count)
For i = 1 To Worksheets.Count - 1
Worksheets(1).Delete
Next
ThisWorkbook.Save
ThisWorkbook.Close
End If
End Sub
69デフォルトの名無しさん:2011/05/23(月) 18:00:10.05
>>68
シェアウェアの期限が切れたら自動的に消滅しますみたいなコードだよな
70デフォルトの名無しさん:2011/05/23(月) 21:00:16.51
さらにパスつきで保存するとよい
まあ簡単に破れるけどね
71デフォルトの名無しさん:2011/05/23(月) 21:59:18.05
>>60
おk
つまりは今までのコードを見直して整理して
使いまわしできそうなものはガンガン使いまわしていくのが
早道ってことだな
がんばるぜぃ!!
72デフォルトの名無しさん:2011/05/23(月) 22:18:04.33
VBAの標準モジュールやクラスモジュールを
エクスポートして管理してる人って少なそう

VB6始め、一般の言語では超基本的なことなのにな

この間、VBEのプロジェクトエクスプローラに、D&Dでモジュールインポートしたら
VBA10年以上使ってるっていう上司に驚かれて、それ知らないことにこっちが驚いた
エクスポートだってD&Dで出来るのに、コピペでの使いまわしはしても
D&Dどころか、メニューからのインポート、エクスポートすらしたこと無いとか言われたよ
73デフォルトの名無しさん:2011/05/23(月) 22:28:09.38
モジュール削除しようとしたらエクスポートするか聞いてくるだろ
知らない人なんていないだろ10年もやってんなら
74デフォルトの名無しさん:2011/05/23(月) 22:38:10.58
いやつかわんだろエクスポートとインポート
75デフォルトの名無しさん:2011/05/23(月) 23:04:06.39
>>73
VBA10年の彼がエクスポートを知らなかったとは書いてないよ

彼が『知らなかった』のはD&Dでのエクスポート、インポート
普通のエクスポート、インポートは『やったこと無い』だけで知ってはいたよ
76デフォルトの名無しさん:2011/05/23(月) 23:43:31.08
>>75
エクスポート/インポートしたことないんなら D&D でできること知らなくても
当たり前だと思うが。

> VB6始め、一般の言語では超基本的なことなのにな

そもそも VBA 以外の言語は大抵わざわざエクスポート/インポートせずに普通
に管理できる。もちろん VB6 も。
77デフォルトの名無しさん:2011/05/23(月) 23:44:24.39
>>72
何を持って一般的な言語と定義するか分からないから何とも言えないけど、
VisualStudio系のは標準モジュールやクラスモジュールは作成した時にすでにファイルとして存在するから、
取り込む時には「新しい項目の追加」で「既存の項目」を選択して取り込むので、
インポート、エクスポート機能はむしろVBA特有の機能だと思ったけど。
JAVAとかは知らない。何か言語の問題って言うよりフレームワークの問題って気もするし。
78デフォルトの名無しさん:2011/05/24(火) 00:00:53.53
基本的だと言ってるのは独立したファイルとして管理して使い回すことじゃないの?
79デフォルトの名無しさん:2011/05/24(火) 00:26:41.37
そこは>>72がすっ飛ばして書いているからその通りなのか他の言語でもエクスポートするもんだと思って書いたのかは
伝わらない。
しかしすでに二人エクスポートするもんだと思って書いたと判断した人が出たのは確か。
80デフォルトの名無しさん:2011/05/24(火) 00:31:55.57
> VBAの標準モジュールやクラスモジュールを
> エクスポートして管理してる人って少なそう
81デフォルトの名無しさん:2011/05/24(火) 00:39:21.87
一人
82デフォルトの名無しさん:2011/05/24(火) 01:02:41.91
>>78
その通りです。

>>79
確かに書き方に不備があったかもしれませんね。

多くの言語で、逐一エクスポート的な操作をしなくてもファイルとして存在するのは周知の事実で
インポート的な操作手順や機能・項目名などの多少の違いくらい補完してくれるだろうと思って
端折りすぎてしまいました。
83デフォルトの名無しさん:2011/05/24(火) 06:08:38.91
???の部分を察して埋めなさい(7点)

Function irekae(a)
Dim b(), c, d, e
c = UBound(a, 1)
d = UBound(a, 2)
???
For e = 0 To c
For f = 0 To d
b(f, e) = a(e, f)
Next
Next
irekae = b
End Function
84デフォルトの名無しさん:2011/05/24(火) 06:42:27.95
Exit Sub
85デフォルトの名無しさん:2011/05/24(火) 06:49:37.16
Redim b(d,c)って言いたいんだろうが変数fの宣言も抜けてる
ちなみにExcel VBAじゃ1オリジンの配列もよく使う
Transposeを使わないのは正解ではある
86デフォルトの名無しさん:2011/05/24(火) 07:04:15.58
え?正解は
Dim f
だろ?
87デフォルトの名無しさん:2011/05/24(火) 07:34:19.69
>>86
不正解
88デフォルトの名無しさん:2011/05/24(火) 07:48:40.98
いい加減、ウザいよ
出題のレベルも低すぎな上に穴ありすぎだし
89デフォルトの名無しさん:2011/05/24(火) 07:58:13.32
嫌だなみんな
出題者の意図は察して埋めろと言う事だから動く動かないより
こんなしょぼいコードで偉そうに出題してすみません的なコメントが入るのが
一番しっくり来るだろ?
90デフォルトの名無しさん:2011/05/24(火) 08:07:52.20
出題のレベルが低すぎるのは確かだな
ちなみに>>87>>83じゃない。
91デフォルトの名無しさん:2011/05/24(火) 21:57:51.81
一行とは書いてない
つまり、低劣なコードに見えてこれを破綻のない至上なるコードへと書き換えなければならないのだ
92デフォルトの名無しさん:2011/05/24(火) 21:59:57.69
途中でexitで抜ければいいだけ
93デフォルトの名無しさん:2011/05/24(火) 22:02:23.66
return false
だろJK
94デフォルトの名無しさん:2011/05/25(水) 00:12:20.44
maxCell = Range("A1").End(xlDown).Row
でA列の一番の下の文字列の位置を取得しますが、
本当にそれより下の列には最後まで何も入力されていないかどうかをチェックするにはどうすればいいのでしょうか?

if(maxCell == Range("A10000").End(xlUp).Row)
という方法が思いつきますが、これがベターと言えるのでしょうか?

95デフォルトの名無しさん:2011/05/25(水) 00:18:42.57
countaで。
96デフォルトの名無しさん:2011/05/25(水) 02:03:37.50
>>94
1行目の式と比較すればベターだけどベストじゃない
最大行数はExcelのバージョンによって違うから、最終行はいちいち求めた方が汎用性が高い
maxCell = Range("A" & Rows.Count).End(xlUp).Row

ただしこれでも完璧じゃない
97デフォルトの名無しさん:2011/05/25(水) 02:53:11.75
>>53
傾いた楕円 じゃね

これのレーンのとこで使ってるぜ
http://xlsg.net/cgi-bin/updown2/updown2.cgi?mode=download&id=339
98デフォルトの名無しさん:2011/05/25(水) 04:05:11.00
× maxCell = Range("A" & Rows.Count).End(xlUp).Row
○ maxCell = Cells(Rows.Count, 1).End(xlUp).Row

99デフォルトの名無しさん:2011/05/25(水) 06:51:36.01
>>96は俺じゃないが、どっちでも同じだよ。
アホかまったく。
前者はピリオド打った時入力候補が出るメリットがある。
100デフォルトの名無しさん:2011/05/25(水) 07:11:45.12
かなり複雑な構成のブックで1億回ぐらい実行することを想定してるんだよ
たぶん
101デフォルトの名無しさん:2011/05/25(水) 07:44:09.70
後、End(xlUp).Rowを使うなら先に最終行に何も入っていない事を確認しないとね。
102デフォルトの名無しさん:2011/05/25(水) 07:58:15.49
> >>96は俺じゃないが
103デフォルトの名無しさん:2011/05/25(水) 09:05:21.45
>>83
irekae = WorksheetFunction.Transpose(a):ExitFunctionとでも引っかけたつもりが、>>85にTransposeに言及されて黙ってしまったのか?
104デフォルトの名無しさん:2011/05/25(水) 10:37:26.02
>>101
それもあるけど、それでもまだ完璧じゃない
105デフォルトの名無しさん:2011/05/25(水) 10:58:25.13
完璧じゃない
完璧じゃない

なんで口先だけで、コードを示さないの?
106デフォルトの名無しさん:2011/05/25(水) 11:01:53.87
㋙㋪゚㋬゚㋢゙㋖㋤㋑
   ●█▀█▄
107デフォルトの名無しさん:2011/05/25(水) 11:06:42.99
オートフィルターでも考慮してるんだろ?
フィルタリングされてるとすっ飛ばすからな。
いずれにしても完璧なコーディングできるやつなんて滅多にいねーよ。
掲示板の回答で細々と書くやつはアホだ。
108デフォルトの名無しさん:2011/05/25(水) 11:09:53.50
1つもデータがない場合ってのもあるな
xlUpの結果が1行目だった場合、先頭行にデータが入ってるかどうかも確認しないと
109デフォルトの名無しさん:2011/05/25(水) 11:12:10.91
もっと簡単にできるけどなあ
110デフォルトの名無しさん:2011/05/25(水) 11:16:41.91
>>108
先頭行にはタイトルがあるのが常識だからそれは考えなくていいだろ?
Findメソッドでもできるけど、一般的じゃねーな。
111デフォルトの名無しさん:2011/05/25(水) 11:23:12.15
おおかた完璧じゃないって言ってるやつはFindメソッドのこと言ってるんだろうな。
オートフィルター対策でFindメソッドなんて、もともとフィルターがかかってるなら仕方がない部分もあるが
VBAでオートフィルターはかけてはいかん。
112デフォルトの名無しさん:2011/05/25(水) 11:28:40.56
>>110
常識?なんだそりゃ
113デフォルトの名無しさん:2011/05/25(水) 11:29:55.19
>>112は先頭行にタイトル書かないのか?
馬鹿じゃね?
114デフォルトの名無しさん:2011/05/25(水) 11:37:38.47
112じゃないけど、人が見たり印刷したりするものには一番上にタイトル入れるけど
VBAで読み書きするだけのデータシートにはタイトル書かないことも多い
VBA側にタイトルに相当するもの(定数、列挙体)があれば完全に事足りるからな
115デフォルトの名無しさん:2011/05/25(水) 11:46:17.72
先頭行の見出しは普通だが、A2からA列最終行までのときA2にデータがあるかどうかのチェックが必要なケースはあるよな。
For i = 2 To 最終行なんて下手な書き方なら偶々対策はされてるが。
116デフォルトの名無しさん:2011/05/25(水) 12:03:21.08
xlUpの話だろ馬鹿か?
117デフォルトの名無しさん:2011/05/25(水) 12:05:17.32
↑意味不明
118デフォルトの名無しさん:2011/05/25(水) 12:08:52.33
>>117
学校行け餓鬼
119デフォルトの名無しさん:2011/05/25(水) 12:11:15.61
どうしたの?ボク
彼女にふられたの?
120デフォルトの名無しさん:2011/05/25(水) 12:15:31.94
121デフォルトの名無しさん:2011/05/25(水) 12:19:58.86
122デフォルトの名無しさん:2011/05/25(水) 12:23:24.22
もしもしは死ねよ
123デフォルトの名無しさん:2011/05/25(水) 12:49:09.87
>>119
煽りが足りない
124デフォルトの名無しさん:2011/05/25(水) 13:35:43.08
ヴァカの相手は程々にしないとな。
>>115はxlUpの話だよなぁ。
125デフォルトの名無しさん:2011/05/25(水) 15:54:12.02
㋙㋪゚㋬゚㋢゙㋖㋤㋑
   ●█▀█▄
126デフォルトの名無しさん:2011/05/25(水) 16:27:26.54
セルに入ってるのがタイトルかデータかなんて自動判別するのは不可能
ここで回答するのは無理
自分で作り分けるしかない
127デフォルトの名無しさん:2011/05/25(水) 16:51:28.98
i=appliaation.rows.count
do until cells(i,1)〈〉゙゙
i=i-1
loop
みたいなのもう出た?
128デフォルトの名無しさん:2011/05/25(水) 20:52:35.47
>>126
そういう話じゃないと思うなぁ。
A2以下にデータがないとき、Range("A65536")End(xlUp).Rowは1になるが
行番号1のA1が空白か空白じゃないかって話だろ?
129デフォルトの名無しさん:2011/05/25(水) 22:06:41.51
見出し部分は別に無ければいけないもんじゃ無いし、
有ったとしても1行だけとは限らない。
どっちにしてもデータの最上部に対して何らかの仕組みを作っておかないと、
最上部に1件データが有ったとしても0件と見なしてみたり、
データ開始行より上の行をデータ最終行と見なしたりする。
だから考慮しなくていいと言うもんでもないと思う。
130デフォルトの名無しさん:2011/05/25(水) 23:15:44.60
データ開始行より上の行をデータ最終行と見なしたりするのは>>115に出てるな。
この仕組みが何年たっても「大和の吊るし柿」でへたなりに固まってるやつ見るけどw
131デフォルトの名無しさん:2011/05/26(木) 00:51:04.54
>>129
>最上部に1件データが有ったとしても0件と見なしてみたり、
>データ開始行より上の行をデータ最終行と見なしたりする。
下は俺もやっとわかったが、上がどうも想像がつかない。
たとえばどういうとき?
132じゃが山さん:2011/05/26(木) 02:50:51.29
〜問題〜
いろいろとエスパーして???を埋めなさい(15点)

Sub tyokusen(sx, sy, ex, ey)
Dim a, b, c, d, e, f, g, z
f = 1
If sx > ex Then f = -1
g = 1
If sy > ey Then g = -1
a = sx
b = sy
If Abs(ex - sx) < Abs(ey - sy) Then
c = Abs((ex - sx) / (ey - sy))
d = 0.5
Do
d = d + c
If d > 1 Then
d = d - 1
a = a + f
End If
b = b + g
Cells(b, a).Interior.Color = 0
If b = ey Then Exit Sub
Loop
Else
???
End If
End Sub
133デフォルトの名無しさん:2011/05/26(木) 07:55:18.33
>>131
1行目からデータ部として使っている場合。

1行目にしかデータがない時、.End(xlUp).Rowで1が取得出来るけど、
全ての行に対してデータがなかった場合も1が取得される。
だからこのままではデータが0件なのか1件なのか見分けが付かない。

て言うか、散々前にそれ言ってる人がいるから今更こんな事言うと「だからそう言ってるじゃん!!」って
心の叫びが聞こえてくる様な気がするよ。
134131:2011/05/26(木) 08:43:26.93
>>133
そういうことなら
「最上部に1件データが有ったとしても0件と見なしてみたり」って言うより
「最上部にデータが無くても1件と見なしてみたり」じゃないの?
これなら俺でも分ったよ。
135デフォルトの名無しさん:2011/05/26(木) 10:10:31.61
>>134
それは作りによりけり。
同じこと。
136デフォルトの名無しさん:2011/05/26(木) 10:53:36.21
先頭行にタイトル入れないこともあるって人に聞きたいんだが、たとえばどういうものを作るときそのようになる?
どうも想像力が弱いのか俺には思いつかん。
137デフォルトの名無しさん:2011/05/26(木) 11:31:32.04
バイナリのダンプリストをバイト単位でセルごとに取り込んだり、列が項目として意味をなさない場合と、
シートをワーク用に使用した場合とか。ワーク用にシートを使う場合はどの項目に何が入っているのかは使用書に記述しておけばいいし、
それを見られたくないならVerryHiddenとかで非表示にしておけばいい。
138デフォルトの名無しさん:2011/05/26(木) 11:50:49.24
なるほどデータベース的に使わない場合ね。
139デフォルトの名無しさん:2011/05/26(木) 16:45:46.47
ワークシートを単なるデータ置き場として使う場合

タイトルってのは「人間がシートを直接見る」時に必要な物だから、
データの入出力をフォームやVBAだけでやる場合はタイトルなんか必要ない
実際、そういうアプリは世の中にたくさんある

ここはVBAスレだから、そういうデータ置き場としての使い方は普通に良くあることとして話を進める
140デフォルトの名無しさん:2011/05/26(木) 16:58:38.23
>>139
だからそう言ってるじゃん!!
141デフォルトの名無しさん:2011/05/26(木) 19:19:07.52
Excel本来の表計算ソフトとして使う場合はタイトルが必要ってことだな。
俺ならデータ置き場としてしか使わないならExcelなんか使わないな。
Excelでやる人はExcelに備わった機能を使いたいんだろうけど、大概のものは自作できるし。
142デフォルトの名無しさん:2011/05/26(木) 19:29:01.57
>>141
Excelの機能を使うにはほとんどタイトルいるぞ?
むしろExcelの機能を使わない人がタイトルをつけないんだと思う。
143デフォルトの名無しさん:2011/05/26(木) 19:39:36.25
>>142
そう言われればそうだけど、ソートとかWorksheetFunctionならタイトル要らないな。
でもソートとかWorksheetFunctionレベルならほとんど自作できるよなぁ。
データ置き場にする人がExcelの何を使いたいのか分らなくなったわ。
144デフォルトの名無しさん:2011/05/26(木) 19:41:28.76
タイトルがないと使えないエクセルの機能なんかあったっけ?
145デフォルトの名無しさん:2011/05/26(木) 19:49:37.88
>>144
ピボットとかオートフィルターとかフィルタオプションとか統合とかいろいろあるんじゃね?
146デフォルトの名無しさん:2011/05/26(木) 19:51:51.92
オートフィルターは別にタイトルいらないんじゃない?
147デフォルトの名無しさん:2011/05/26(木) 19:56:45.96
>>143
わざわざDBに接続しなくても、ブックを閉じて開いても値を残せる一番手っ取り早い場所だからな。
ファイルを複数にする必要もないし。
148デフォルトの名無しさん:2011/05/26(木) 19:56:48.85
>>146
やってみたらたしかにそうみたいだけど、先頭行を空白にするくらいなら普通タイトルを入れるんじゃない?
149デフォルトの名無しさん:2011/05/26(木) 20:06:17.26
>>148
え?
オートフィルター設定する時に項目から設定するかデータから設定するか選べない?
バージョンによって違うのだろうか・・・
150デフォルトの名無しさん:2011/05/26(木) 20:33:09.23
>>149
Excel2007にはそういうのはないみたいだな。
もしかしてソートと勘違いしてない?
151デフォルトの名無しさん:2011/05/26(木) 22:38:10.34
Excelはピボットを使うための道具なんだからタイトル入れるのはjsk
152デフォルトの名無しさん:2011/05/26(木) 22:41:10.81
ここはVBAスレだったか。まぁいいか。
153デフォルトの名無しさん:2011/05/26(木) 23:55:15.21
すみません、教えて下さい。
あるエクセルファイルに、別ブックからシートをコピーしたいのですが、
実行時エラー9と怒られてしまい、コピー出来ません。

Workbooks(OpenFileName).Worksheets("Sheet1").Copy
のような形にしているのですが、何がいけないのがご教示いただけますでしょうか。
154デフォルトの名無しさん:2011/05/27(金) 00:47:09.05
>>153
ブック名とシート名を確認
一番多いのがシート名の間違い
155デフォルトの名無しさん:2011/05/27(金) 01:48:06.59
>>154
ご指摘ありがとうございます。
たびたび申し訳ありませんが、
マクロ起動ファイルとは、別のブック内のデータをソートしたいのですが、
どうやっても起動元が並び変わってしまいます。

別ブックをActivateにしても、Withを使ってもうまく動きません・・・
一時間以上悩んでいるのですが、さっぱりです。。
156155:2011/05/27(金) 02:26:02.46
すみません自己解決しました。
157デフォルトの名無しさん:2011/05/27(金) 06:22:50.57
〜ボーナス問題〜
???を察して埋めなさい

Sub チンチロリン(s1, s2, s3)
If ??? Then MsgBox "シゴロ"
End Sub
158デフォルトの名無しさん:2011/05/27(金) 09:53:19.54
ダイアログメッセージをループして各処理毎に変数の値を表示したいのですがどうすればいいのでしょうか?
m = "iはインデックス"
mes = i & m
MsgBox "mes", vbOKOnly, "Err"
ではエラーになります
159デフォルトの名無しさん:2011/05/27(金) 09:58:36.32
同様に、シートも
str1 = i & "月シート"
Set ws1 = Worksheets(str1)
のように変数str1をセットすると""を付けてもエラーになります
文字列+数値の変数を式の中に入れて処理させるにはどのようにすればいいのでしょうか?
160デフォルトの名無しさん:2011/05/27(金) 10:05:54.50
>>157
IF s1 * s2 * s3 = 120 Then

'3つの出目をかけ合わせて120になるのは、4,5,6の組合せしか無い
161デフォルトの名無しさん:2011/05/27(金) 10:11:59.62
>>158
それをそのままコピペして使ってみたが別にエラーにならなかったよ。
何かほかの部分でエラーが出てるのでは?
ちなみに、 MsgBox "mes",  のダブルクォーテーションはいらんだろう。
162デフォルトの名無しさん:2011/05/27(金) 10:17:31.93
>>159
こっちも別にエラーの起こる要素が無い。
別の理由でエラーが起こってるはずだ。
163デフォルトの名無しさん:2011/05/27(金) 10:25:35.35
>>161-162
ごめんなさい、今までmesの部分でエラーが出ていたのですが、もしかしたらExcelのバージョン問題だったかもしれません
家のは95でして(苦笑)
ただ、シート部は出来ませんでした
shi = "月"
str = i & shi
Set ws1 = Worksheets(str)
ではインデックスが有効範囲にありませんと出てしまいます
164163:2011/05/27(金) 10:29:16.50

ごめんなさい、出来ました
インデックスがおかしかったようです
皆さん、ごめいわくをおかけ致しました
165デフォルトの名無しさん:2011/05/27(金) 15:09:06.01
初心者です

エクセルに入力したテストの点数を
80以上を優
70-79を良
60-69を可
と表示したいのですが上手くいきません
おかしいところがどこか教えてください

Function 成績評価1(ten As Variant)

Dim score As String
Dim seiseki As Variant

score(1) = "優": score(2) = "良": score(3) = "可": score(4) = "不可"

ten = Left(ten, 4)

If ten >= 80 Then seiseki: i = (1)
If 70 <= ten And ten >= 79 Then seiseki: i = (2)
If 60 <= ten And ten >= 69 Then seiseki: i (3)
If 59 <= ten Then seiseki: i = (4)

成績評価1 = score(i)

End Function
166デフォルトの名無しさん:2011/05/27(金) 15:20:41.39
宣言
配列宣言
引数チェック
引数加工
入力値
167デフォルトの名無しさん:2011/05/27(金) 15:26:53.53
>>166
俺宛でいいのかな

つまり基礎すら出来てないってことですか?
168デフォルトの名無しさん:2011/05/27(金) 16:03:19.00
基礎がどうかは知らんけど、VBAではあんまり見掛けない構文だね
俺が似たようなコード書くならconstとかemumとか使うかも試煉
169デフォルトの名無しさん:2011/05/27(金) 16:59:02.40
みんな優しいな…

ハッキリ言ってやれよ
おかしいのは>>165の知能だと!!
170デフォルトの名無しさん:2011/05/27(金) 17:14:48.73
エキスパートのスタンダード終わったんだけど、これからプログラムを作成するにはどういう本がお勧めですか?
最初からそう教えてくれればいいのに!の2冊は読みました。
知識はあるけど、プログラムの作り方がいまいちわからない初級者です。
171デフォルトの名無しさん:2011/05/27(金) 17:20:48.19
エンジニアなんとかとかスキルアップコレクションとかパフォーマンスなんちゃらとか


そういうのじゃないんだよね
172デフォルトの名無しさん:2011/05/27(金) 17:50:07.88
VBAの絵本
173デフォルトの名無しさん:2011/05/27(金) 19:49:19.16
大きな本屋に行って自分で探せ、ヴォケ
174デフォルトの名無しさん:2011/05/27(金) 20:20:01.17
>>最初からそう教えてくれればいいのに
おー、こんな本あったのか。
VBAはExcelについてるヘルプとMSDNくらいしか見たことなかったが
読んでみるかな
175デフォルトの名無しさん:2011/05/27(金) 20:21:03.98
>>170
実際にプログラムを作成しはじめれば、いいんじゃないか。
そうすれば、どういう勉強をすればいいか見えてくると思う。

とくに仕事で他の人が使うプログラムを作ると
ユーザーインターフェイスとか
いろいろな柔軟性とか
が大事だとよく分かる。



176デフォルトの名無しさん:2011/05/27(金) 22:08:41.54
>>165
× If 70 <= ten And ten >= 79 Then seiseki: i = (2)
× If 60 <= ten And ten >= 69 Then seiseki: i (3)

○ If 70 <= ten And ten <= 79 Then seiseki: i = (2)
○ If 60 <= ten And ten <= 69 Then seiseki: i = (3)
177デフォルトの名無しさん:2011/05/28(土) 02:58:50.94
テーブルの、ある行の適当なセルに文字をいれたら
その行全体の色が変わるようにしたいんですが
やり方がわかりません
マクロを使わずにできるならその方法も教えてください
よろしくお願いします
178デフォルトの名無しさん:2011/05/28(土) 03:29:59.68
>>177
A1〜Z1の色を変えたいなら
条件付き書式
=COUNTA(A1:Z1)>0
をA1〜Z1に設定すれば、どこかにデータを入れると書式が反映される
179デフォルトの名無しさん:2011/05/28(土) 04:06:11.82
>177
Private Sub Worksheet_Change(ByVal Target As Range)
    Target.EntireRow.Interior.ColorIndex = 7
End Sub
とか
180デフォルトの名無しさん:2011/05/28(土) 06:15:42.13
〜問題〜
配列と数字Nを渡すとランダムにN個の要素を配列で返す関数を作りなさい
181デフォルトの名無しさん:2011/05/28(土) 07:28:41.81
>>180
何で引数もランダムで作成する数もNなんだ?
引数意味ねーじゃん。
182デフォルトの名無しさん:2011/05/28(土) 08:01:53.76
配列を返さないこともある、だろ。
183デフォルトの名無しさん:2011/05/28(土) 09:10:55.74
>>179
データ消しても色がつくじゃん。
184デフォルトの名無しさん:2011/05/28(土) 09:12:11.50
>>181
頭悪すぎ
185デフォルトの名無しさん:2011/05/28(土) 09:18:06.36
>>184
お前がな
186デフォルトの名無しさん:2011/05/28(土) 10:02:48.56
>>185
読めカス
187デフォルトの名無しさん:2011/05/28(土) 10:12:46.54
>>186
死ねゴミ
188デフォルトの名無しさん:2011/05/28(土) 10:13:57.83
引数が3なら要素数が3の配列を返すということだろ
189デフォルトの名無しさん:2011/05/28(土) 10:26:48.98
>>188
空気読め
190デフォルトの名無しさん:2011/05/28(土) 10:37:00.71
おまいらファイト!w
俺は意味は分ったけど>>180も「重複なしで」を追加すればもう少し分り易かったかもね。
ようするに配列から重複なしでランダムにN個取り出せって話だな。
検索すれば玉石混淆でそこらへんにいっぱい転がってるけど。
191デフォルトの名無しさん:2011/05/28(土) 13:00:23.64
>>190
質問に明記されてないのに、「重複なし」と決めつけるのはいかがなものか
192デフォルトの名無しさん:2011/05/28(土) 13:18:12.39
プログラマなら想定して答えるべきだな
SEならしらん
193デフォルトの名無しさん:2011/05/28(土) 13:32:21.57
一つは
A1に文字列
A2は空白
A3に文字列

と歯抜けになっている

もう一つは
A1に文字列
A2は文字列
A3に文字列

とすべてのセルに文字列が入力
とあった場合上から文字列のあるセル「だけ」を順番に見て行く方法とかって
どうすればいいのでしょうか?
当然両方とも同じプログラムを使用する想定です。

たとえば
上から一行一行見て行って
文字列がある最後の列まで見て
空白行じゃなければ処理をする、空白行は無視するってやり方もあるのですが
どうしてもパフォーマンスが悪くなるので
194デフォルトの名無しさん:2011/05/28(土) 13:32:25.61
プログラマなら想定とか察してとか通用するからいいが、
仕様書を作る側の立場の人は誰が見ても分かるものを作るのが基本。
それが出来ないとSEにはなれない。
195デフォルトの名無しさん:2011/05/28(土) 13:39:26.26
>>193
どうせ上から順番に見なければいけない処理ならデータの最終行までループしてやって空白の時だけ処理飛ばせばいいんじゃないの?
196デフォルトの名無しさん:2011/05/28(土) 13:45:01.69
>>191
重複なしなら簡単すぎて問題にもならんよ。
197デフォルトの名無しさん:2011/05/28(土) 14:03:22.01
SEとプログラマは違うのか?
198デフォルトの名無しさん:2011/05/28(土) 14:18:00.86
構築・開発系とかなら、設計・仕様・コードレビューやQAとかするのがSEだろ
コーディングや現場ドキュメント作成しかしない奴は底辺プログラマ
規模的に全部する(せざるを得ない)のが広義のプログラマ

部署も島も違うが、近くで見る限りはこんな感じだな
199デフォルトの名無しさん:2011/05/28(土) 15:50:12.31
Range("A1:AR100")を選択してセルに入っている値が1よりも大きければ
色をつけるマクロを組みたいのですが
If Range("A1:AR100").Value >= 1 Then
Range("A1:AR100").Interior.ColorIndex = 37
End If
これで実行したら「型が一致しません」とエラーが出ました。
手直しをお願いします。
200デフォルトの名無しさん:2011/05/28(土) 15:53:46.39
当たり前だ
201デフォルトの名無しさん:2011/05/28(土) 16:01:23.67
>>199
For Each c In Range("A1:AR100")
  If c > 1 Then c.Interior.ColorIndex = 37
Next
202デフォルトの名無しさん:2011/05/28(土) 16:02:00.89
>>200
答える気がないんなら
いちいちつまらん茶々を入れるな
203デフォルトの名無しさん:2011/05/28(土) 16:09:09.99
>>202
答える気がないんなら
いちいちつまらん茶々を入れるな
204デフォルトの名無しさん:2011/05/28(土) 16:12:40.89
>>201
できました!
ありがとうございます
205デフォルトの名無しさん:2011/05/28(土) 22:04:29.40
>>195
それがベストですか?
206デフォルトの名無しさん:2011/05/28(土) 22:09:05.40
パチンコ禁止デモ



大阪にて北朝鮮系ヤクザが在特会に襲撃!!!!!!
http://www.nicovideo.jp/watch/sm14536643

パチンコを死守する北朝鮮系ヤクザ!!!






207デフォルトの名無しさん:2011/05/29(日) 00:59:58.67
>>205
ベスト?俺はベストなんて常にないと考えて作っているけど。
例えば今回のケースだと、ひょっとしたら配列数式とかを使えば空白を除いた表を
数式で隣に配置出来るかも知れないし、
それを使った方が効率いいかも知れない。そういった調べたり考えたりしてモアベターな方法を使って行くもんだと思ってるし、
どんな方法を使ってもそれよりいい方法がないとは言い切れない。
この方法がベストですなんておこがましい事は今までも言った事がないし、
これからも言うつもりもないよ。
208デフォルトの名無しさん:2011/05/29(日) 13:50:54.06
とある編集用のシートを作っています、
文字列置換ダイアログの「検索する文字列」と「置換後の文字列」のリストに任意のリストを設定したいと思っています。
普段は過去に検索or置換した文字列がリストに入っていると思うのですが、そのリスト内容をvba側で操作したいのです。

技術的に可能であれば教えていただけないでしょうか。よろしくお願いします。
209デフォルトの名無しさん:2011/05/29(日) 14:06:01.52
>>208
ユーザーフォームで検索ダイアログ作りましょう
そうすれば自由自在です
210デフォルトの名無しさん:2011/05/29(日) 14:36:00.85
>>209
返答ありがとうございます。
やはりフォーム作成が一番手っ取り早いですか。。
後出しになってしまいますが、制約があり可能であればフォームを作成せずに行いたいのです。
211デフォルトの名無しさん:2011/05/29(日) 15:01:01.77
>>210
やっぱりこう言った場合はAPIでダイアログからコールバックでセンドメッセージだなと
適当な文字の羅列を書いてみるが気にするな。
212デフォルトの名無しさん:2011/05/29(日) 15:21:37.65
>>210
最初に画面が多少チカチカしてもいいんなら、
SendKeysで検索ダイアログを必要な回数だけ開いてやるって手がある
ただしこの方法だと項目の追加はできるけど削除はできない
213問題マン:2011/05/29(日) 16:09:00.99
〜スペシャル問題〜
???に入るベストな式を答えなさい(135点)

Sub bezier2d(x1, y1, x2, y2, x3, y3)
Dim a, b, c, d, e, f, g, h, i
a = 2 ^ 10
b = a * a
c = x1 * b
d = y1 * b
e = ???
f = ???
g = 2 * x3 - 4 * x2 + 2 * x1
h = 2 * y3 - 4 * y2 + 2 * y1
For i = 0 To a
Cells(d / b, c / b).Interior.Color = 0
c = c + e
d = d + f
e = e + g
f = f + h
Next
End Sub
214デフォルトの名無しさん:2011/05/29(日) 16:50:18.59
JKの宿題スレときいて
215デフォルトの名無しさん:2011/05/29(日) 18:11:08.35
>>213
あのね、問題ってのは
「何を読ませるか」「何を考えさせるか」「どう解かせるか」
ってのを考察出来ない人には作れないものなのよ

君が毎度出してるのは、問題でもなんでもない
そもそも、自分より上手、目上の奴に問題出そうてのが間違いだ
216デフォルトの名無しさん:2011/05/29(日) 20:34:53.68
>>215
まったくだ。>>213のはいつも面白くない。
見たくもないオナニーを無理矢理見せ付けられてる感じだ。
217デフォルトの名無しさん:2011/05/29(日) 21:21:41.26
>>213
VBAの宿題スレでも立てて一人で問題だしてろ
218デフォルトの名無しさん:2011/05/29(日) 21:43:16.97
答えないと、「おまえら、解らないから言い訳代わりに叩いてるだけだろ」とか言ってきそうだけど
皆、そんな煽りに乗せられて答えるなよ。

答えたらつけ上がって、いつまでもくだらない問題もどきを投下してくる。
ここでまともな質問に回答している奴らが、このくらい難なく解けるのは皆解ってるから
一人くらい「おまえら解らないんだろ」とか勘違いして言ってくる奴が居ても放っておけってことで。
219208:2011/05/29(日) 21:51:45.68
>>211
sendmessageでそんな使い方もいけるんですね、ちょっと調べてみます。

>>212
後だしばかりになってしまいすみません、
リストは何パターンかあるのでリフレッシュできるのが望ましかったです。
お手数掛けました、ありがとうございます!
220問題さん:2011/05/30(月) 02:33:09.84
おまいらパーフェクトな反応ごちそうさまです
悪意はないんで少し弁解させてください・・・><

>>215
>何を読ませるか どういう計算で二次ペジェ曲線を表現するプログラムか
>何を考えさせるか 曲線間を1024等分した時のx,yの最初の増減値
>どう解かせるか すでに分かっているg,hの式の形から
いや別に俺は下手で構わないんだが・・
なんでそんなに上手アピールしてんぢょwwぴょwww

>>216
1レスで済むようなプロシージャがオナニーに見えるのかい?

>>218
そんなに答えないことに布石打たなくても大丈夫だぜww
数学知らなくてもプレゼンハムでググればお前でも分かるよ
くだらない問題に上のほうで嬉々として反応してたように見えるが・・
そんなに嫌なら誰か答えたら終わりにするぜ!

ってかこれはいろんな人に知ってほしい
俺は先週これ知った時感動したぜ
221デフォルトの名無しさん:2011/05/30(月) 07:42:03.34
>>220
>ってかこれはいろんな人に知ってほしい

チェーンメールならぬチェーン書き込み乙
ブログでも立てて独りでやれ
掲示板でやるな
222デフォルトの名無しさん:2011/05/30(月) 07:52:52.92
>>220
悪意が無くて弁解も終わったならとっとと消えるべきだな。
ここは質問スレであって出された問題に答えるスレではない。
自分で問題スレ作ってそこでやれば興味のある奴は来てくれるだろう。
もっともそんなオナニー問題出してる様ではすぐに過疎スレになってDat落ちするだろうけどな。
223デフォルトの名無しさん:2011/05/30(月) 08:04:55.47
予想通りの反応過ぎてワロタw

この子、なんでこんな風になっちゃったんだろう?
余程ストレスやコンプレックスが強いのかな?

つーか215にも見当違いなこと答えてるし
単純に頭が悪いのかな?
224デフォルトの名無しさん:2011/05/30(月) 08:18:24.75
頭が悪いん云々以前にいわゆる基地街
知能じゃなくて知性に欠けているな
225デフォルトの名無しさん:2011/05/30(月) 08:23:02.29
お前↑の馬頭には加わってなかったが、お前みたいな馬鹿相手に1回答えたことを反省。
そもそも答えても返事がなかったもんな。
226デフォルトの名無しさん:2011/05/30(月) 09:18:38.45
名前見ても知性知能共に低いのが伺える

「問題マン」って、、、、、問題抱えた男ですかw
それはそれで本質的には間違ってないんだが、それは周りが呼称する場合で
自ら名乗るなら、普通は「出題マン」とかだよな
227デフォルトの名無しさん:2011/05/30(月) 10:22:18.68
質問させてください
VBAというのはAuto_Open()ではなく、A1とA2の値が違った場合とか、
C1の値が変更された瞬間にマクロが作動して「値が変わりました」とかのダイアログが
表示されたりは出来ないのでしょうか?
自分でマクロを「実行」しなければいけないのでしょうか?
228デフォルトの名無しさん:2011/05/30(月) 10:28:15.18
>>227
ユーザー定義関数
イベント
好きな方を使って下さい
229デフォルトの名無しさん:2011/05/30(月) 10:31:27.20
> A1とA2の値が違った場合
A1、あるいはA2の値が変更された上でA1とA2の値が違う場合なら
Worksheet_Changeイベントで可能
変更された上ではなく、ブックを開いた時点で違いが有ればということなら
Auto_OpenやWorkbook_Openで確認すれば良い

> C1の値が変更された瞬間
Worksheet_Change
230デフォルトの名無しさん:2011/05/30(月) 20:45:16.21
>>220
てめえのスレじゃねーんだよカス
231デフォルトの名無しさん:2011/05/30(月) 22:27:24.38
はじめてここで質問させていただきます。

『ファイル名を指定して実行』ダイアログを開き
PostMessage または SendMessageでフルパスを入力して
プログラムを実行しようとしていますが、
キーが送られません。(名前の欄に文字が送られません)
SendKeyではうまくいくのですが、
スクリーンロックを考えているので使えません。
何かいい方法があれば教えてください
232デフォルトの名無しさん:2011/05/30(月) 23:24:21.95
>>231
shell でやれば?
233デフォルトの名無しさん:2011/05/31(火) 00:49:22.73
.Cells(n, 1) = sh.Cells(i, "A")
.Cells(n, 2) = sh.Cells(i, "B")
.Cells(n, 3) = sh.Cells(i, "C")
.......AX欄まで続く

これをRangeでシンプルに書くとどうなるか、エスパーの方教えてください。
こんな風↓に考えたのですが、どうしても範囲が合わずエラーになってしまいます。

.Range("A" & n - x, "CQ" & n) = sh.Range("A2", "CQ" & x)

234233:2011/05/31(火) 00:54:20.85
誤 ".......AX欄まで続く"
正 ".......CQ欄まで続く"
235問題マン:2011/05/31(火) 01:02:14.54
時間切れです><
あれ?おまいらあからさまな間違いにつっこまないとかあれ?
>>222
消えてほしい理由がわからんな〜
答えて楽しめばいいじゃない^^
それとわかる範囲の問題に嬉々として反応してくれる人がいるみたいだぜ〜?
あと俺スレ立てできない><
>>223
予想通りレスが予想通りwwwイライラすんなよww
ただベジェ曲線レベルの段階でこうなったのは実は想定外だったぜ><
>>226
つっこむとこそこかよww
>>230
遅いぜー 今言っても説得力が・・

〜おまいらでもすぐわかるサービス問題〜
???に入るできるだけ短い式を答えなさい
sub チンチロリン(s1,s2,s3)
if ??? then Msgbox "5です(ゾロ目じゃないぞ)"
End sub
236デフォルトの名無しさん:2011/05/31(火) 01:16:21.60
>>233
sh.Range("A" & i & ":CQ" & i).Copy (.Cells(n, 1))
237デフォルトの名無しさん:2011/05/31(火) 06:29:38.20
>>235
>消えてほしい理由がわからんな〜
スレチな上にいつも問題が面白くない。

そっちこそVB6スレでもコマンドボックスとか_clicとかわけ分からない事かいて
フルボッコにされて追い出されたからって、
このスレに必死にしがみ付いている理由が分からないんだけども。
238233:2011/05/31(火) 06:59:54.24
〉〉236
ありがとうございます!
239デフォルトの名無しさん:2011/05/31(火) 07:55:10.81
問題マンコはなんでこんなにみんなから嫌われてるのに自殺しないの?
240デフォルトの名無しさん:2011/05/31(火) 23:53:03.85
>>231
ほらよ。

Option Explicit

Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hParent As Long, ByVal hChildAfter As Long, ByVal lpszClass As String, ByVal lpszWindow As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Any) As Long

Sub hoge() 'Win7
Dim h As Long, i As Long, com As String

com = "c:\hoge\hogehoge"
Shell "rundll32 shell32.dll,#61"
h = FindWindowEx(0&, 0&, "#32770", "ファイル名を指定して実行")
h = FindWindowEx(h, 0&, "ComboBox", vbNullString)
h = FindWindowEx(h, 0&, "Edit", vbNullString)
For i = 1 To Len(com): SendMessage h, &H286, Asc(Mid$(com, i&, 1&)), 0&: Next
End Sub

でも何でShellとかShellExecuteでやらないの?
241大門さん:2011/06/02(木) 00:30:18.23
1〜9の4つの数字を四足演算で10にできるかどうか
判定できるマクロを作りたいのですが
どうしたらいいでしょうか?
242233:2011/06/02(木) 00:49:18.50
以下はフォルダ内のデータを転記するためのマクロの一部なのですが、wbには開くためのパスワード"password"が設定されています。
ブックの"password"をマクロで入力し開くにはどうしたらよいか教えてください。

Dim fn, wb, myPath
myPath = ThisWorkbook.Path & "\"
fn = Dir(myPath & "*.xls")
Set wb = Workbooks.Open(myPath & fn)

' ↓こんな感じかと考えながらもうまく動作しないです。。
Workbooks.Open Filename:=wb, Password:="password"
243問題マン:2011/06/02(木) 03:21:24.09
おまいらテンション落ちすぎだぜ!

>>237
その人をよく知らないんだがたぶん
引数がランダムになるとか重複なし抽出のほうが速いとか言ってる人じゃね?

>>239
ありがとうございます^^

>>242
これはここの人は厳しいから教えてもらえないんじゃね?
答え見た悪意ある人がマクロから虱潰しでパス突破しようとするかも
244デフォルトの名無しさん:2011/06/02(木) 08:00:04.64
>>242

Dim fn as String, myPath as String
Dim wb as Workbook
myPath = ThisWorkbook.Path & "\"
fn = Dir(myPath & "*.xls")
Set wb = Workbooks.Open(FileName:=myPath & fn, Password:="password")
245233:2011/06/02(木) 18:30:37.98
242
ありがとうございます!
m(_ _)m
246デフォルトの名無しさん:2011/06/02(木) 21:10:25.53
テキストボックスを配置して入力された文字を検索したいのですが
検索する文字列が1行の場合
http://www.moug.net/tech/exvba/0090008.htm
ここに書いてある内容でできたのですが、例えば2行


のように入力して2種類検索したい場合どのようにすればよいでしょうか?
よろしくお願いします。
247デフォルトの名無しさん:2011/06/02(木) 21:41:54.03
既存の検索機能では1種類の文字列での検索しか出来ない

2種類の文字列での検索がしたければ、既存の検索機能を2回まわすか
自前で検索機能を作るかだな

俺は正規表現で検索できるものを自作して使ってる
「2つの文字列」ではなく「2つの文字」なら、正規表現ではなくLike演算子でも可能
248デフォルトの名無しさん:2011/06/02(木) 22:40:01.75
a or b
249デフォルトの名無しさん:2011/06/02(木) 22:40:34.68
>>247
スキルの低い回答者お断り
250デフォルトの名無しさん:2011/06/03(金) 00:19:50.69
課金アイテム購入するニダ
251デフォルトの名無しさん:2011/06/03(金) 00:56:21.85
テキストボックスを文字列に格納して二種類に分割しれば良いだけでは
252問題マン :2011/06/03(金) 09:10:26.52
うわー
ググったらパスつきマクロの破り方まで簡単に出てきたわ・・

>>249
煽ってる暇あったらスキルの高い回答を書くんだチンカス!
253デフォルトの名無しさん:2011/06/03(金) 09:29:25.55
とゆーかつい最近だろ別ブックのパス制御の話
254246:2011/06/03(金) 13:33:56.75
答えてくださった皆さんありがとうございます。
しかし、どの本もそうですがやりたいと思った事が書いてない
ということがほとんどな気がします。
ネットが便利すぎるだけかもしれませんが
皆さんの書いたコード見てると凄いなーと感心しっきりです。
255 忍法帖【Lv=1,xxxP】 :2011/06/03(金) 20:00:22.46
置換について質問です
Selection.Replace What:="1", Replacement:="99"
"99"の部分を別シートのA1の値にすることはできますか?
環境はエクセル2000です
256デフォルトの名無しさん:2011/06/03(金) 21:28:55.20
>>255
Replacement:=Worksheets("Sheet2").Range("A1").Value
257ninja:2011/06/03(金) 22:26:17.24
>>256
ありがとうございます
258デフォルトの名無しさん:2011/06/04(土) 10:28:39.89
VBではbeep音の周波数を変えられるそうですが
VBAでは可能でしょうか?
259デフォルトの名無しさん:2011/06/04(土) 11:43:05.15
VBでもWin32API使わないと周波数は変えられないし
VBAでもWin32API使えば周波数は変えられる
260デフォルトの名無しさん:2011/06/04(土) 22:26:44.82
セルの数字の最大値を記録していきたしのですが、
そのような関数orマクロはないでしょうか?

例えば、A1セルの値が

100→130→180→150→120

と変化した場合、180の値をどこかのセルで表示させたいのです。
宜しくお願い致します。
261デフォルトの名無しさん:2011/06/04(土) 22:30:45.08
Worksheet_Changeで変化があるたびにどっか別のシートに記録しておいたものと
比較して大きければそれを保存しておくとか
262デフォルトの名無しさん:2011/06/05(日) 08:23:13.97
循環参照上等で組んだらこうなったわさ。
第一引数にこの数式の入ったセル位置を、第二引数に対象のセル位置を設定して、
標準モジュールに以下の関数を書いて、ユーザー定義関数として使うわさ。

Option Explicit

Function hoge(IN_KeepValueCell As Range, IN_vValue As Variant) As Variant
Static vMaxValue As Variant
Static bFirstFlg As Boolean

つづく
263デフォルトの名無しさん:2011/06/05(日) 08:33:49.82
>>262の続き

If IN_KeepValueCell.Count <> 1 Then
hoge = "複数セルは選んで欲しくないべさ"
Exit Function
End If
If Not bFirstFlg Then
vMaxValue = IN_KeepValueCell.Value
bFirstFlg = True
End If
If IN_vValue <> vbNullString Then
If IsNumeric(IN_vValue) And IN_vValue > vMaxValue Then vMaxValue = IN_vValue
Else
vMaxValue = 0
End If
hoge = vMaxValue
End Function

だれか循環参照対応コテ入れして・・・orz
264デフォルトの名無しさん:2011/06/05(日) 16:38:47.56
test.xlsと同じ層にある n KB以下のファイルを削除するにはどうしたらいいでしょうか?
265デフォルトの名無しさん:2011/06/05(日) 16:46:44.84
>>264
FileLenかFileSystemObjectの.Sizeプロパティでブックのサイズ取得してループで回す
指定のサイズ以下なら削除
266デフォルトの名無しさん:2011/06/05(日) 17:22:18.47
>>265
ありがとうございました
267デフォルトの名無しさん:2011/06/06(月) 18:12:23.01
「コメントが無いセルにはコメント挿入、ある行には削除」
というマクロですが、以下で良いでしょうか?

一応自分の環境では動いていますが…時々矢印の表示が残ることがあります

Sub Comment_Add_Clear()
If ActiveCell.Comment Is Nothing Then
ActiveCell.AddComment ""
ActiveCell.Comment.Visible = True
Else
ActiveCell.ClearComments
End If
End Sub
268デフォルトの名無しさん:2011/06/06(月) 20:00:11.35
300行くらいのデータ2列を
配列(300,2)に格納して別シートにコピーしたりなどで
扱おうと思ってるのですが
これって配列の使い方としてまちがってますか?
なんとなく大量のデータを記憶させておくのってよろしく
ないのかな?と思ってしまいます。
269デフォルトの名無しさん:2011/06/06(月) 20:32:56.17
>>268
「など」じゃわからんよ
もっと具体的に、何と何をやりたいのか
シートから別のシートにコピーするだけならCopyメソッドの方が簡単だし
270デフォルトの名無しさん:2011/06/06(月) 22:18:12.38
配列を介すと値しかコピーされないが
値だけのコピーなら、配列を介さず
コピー先範囲.Value = コピー元範囲.Value
で事足りる
271デフォルトの名無しさん:2011/06/06(月) 22:57:16.01
コピー以外のことは考え中です。。
フォーマットの違う他シート2、シート3に
それぞれシート1からコピーしようとしたときに
配列使った方が便利なのかな?と思いました。
 300行2列程度なら>>269さんのやり方がベストなのでしょうか?
いまいち配列のいきる使い方がわからないです。
272デフォルトの名無しさん:2011/06/06(月) 23:04:45.88
失礼
コピー先範囲.Value = コピー元範囲.Value
この方式でした。
273デフォルトの名無しさん:2011/06/06(月) 23:10:36.43
>>271
言ってることがよくわかんない。
何で無理して配列使わなきゃならんかな。
配列の使い方を勉強したくてその過程で出て来た問題なのか、
その問題に当たったから配列使えば解決出来そうと思ったのか、どっちなんだ?
274デフォルトの名無しさん:2011/06/06(月) 23:31:04.50
>>271
まあ小学校卒業してから
また質問すればいいんじゃないか?
実際に使うわけじゃないだろ?

暇があるっていっても、
みんなお前よりは忙しいんだからさ
自重しろハゲ
275デフォルトの名無しさん:2011/06/06(月) 23:56:40.27
>>268
基本思考はあってる。
でもそれ実装した奴はそんなもん当たり前のレベルで知ってる。
なので好きにしろ。
276デフォルトの名無しさん:2011/06/07(火) 05:47:24.61
>>270
それって配列を介してるじゃん。
コピー元範囲.Valueは2次元配列だ。
277デフォルトの名無しさん:2011/06/07(火) 06:46:40.32
配列じゃなくて配列変数の話だって文脈でわかれ
278デフォルトの名無しさん:2011/06/07(火) 07:09:28.89
そのマクロを第3者が使うとして、、、その第3者にしてみたら要求を満たしていれば、
とんでもなく遅いとかとんでもなく速いとかでなければ中身がどうだろうと関係ないわけ
で、なんで配列に拘るのか?
279問題マン :2011/06/07(火) 08:11:30.11
ウン百回もコピーするならいったん配列に格納したほうがいちいち参照しないぶん無駄がないぜ
280デフォルトの名無しさん:2011/06/07(火) 08:14:15.84
1,1〜9,9のセル範囲の偶数列偶数行にランダムに10個●が配置されています。
輪にならないようになるべく少なく○を置いて全ての●と繋げるにはどうすればいいでしょうか?
あと試す度に違う結果になるようにしたいです。><
281デフォルトの名無しさん:2011/06/07(火) 08:43:18.19
>>279
嘘書くんじゃねーよ。
まさしく問題マンだなw
282デフォルトの名無しさん:2011/06/07(火) 09:15:23.38
コピペだけならペをうん百回繰り返した方が良くね?
283デフォルトの名無しさん:2011/06/07(火) 09:47:15.68
>>280
手作業で
284デフォルトの名無しさん:2011/06/07(火) 11:00:11.15
>>280
スレ違い
285デフォルトの名無しさん:2011/06/07(火) 12:24:21.34
問題マンは無駄云々を語るにはまだ早い。
286デフォルトの名無しさん:2011/06/07(火) 14:40:08.93
>>281
無駄なコードがないって意味では?

俺なら
配列 = 元範囲
配列を回して書式やデータちぇっく
新範囲=配列
ってするけど
287デフォルトの名無しさん:2011/06/07(火) 15:02:14.43
宜しくお願いします。次のマクロを作りました。

Sub 色によって判別()

Dim 行 As Long
For 行 = 27 To 120

If Cells(行, 122).Interior.ColorIndex = 47 Then'これが赤色のとき
Cells(行, 247).Value = 5

If Cells(行, 122).Interior.ColorIndex = 44 Then'これが黄緑色のとき
Cells(行, 247).Value = 1

Else
Cells(行, 247).Value = 0

   End If
End If
Next 行
End Sub

列DR27〜120の色によって、それぞれの行IMの数字を変えたく、
上記のマクロを製作したのですが、最初のIFの条件(赤色の時)は上手く良くのですが、
2番目のIFの条件(黄緑色の時)が反映されず困っています。修正点等宜しくお願いします。
OS=windowsXP EXCEL=2000 です。
288デフォルトの名無しさん:2011/06/07(火) 15:10:27.21
>>287
Sub 色によって判別()
  Dim 行 As Long
  
  For 行 = 27 To 120
    If Cells(行, "DR").Interior.ColorIndex = 47 Then 'これが赤色のとき
      Cells(行, "IM").Value = 5
    Else
      If Cells(行, "DR").Interior.ColorIndex = 44 Then 'これが黄緑色のとき
        Cells(行, "IM").Value = 1
      Else
        Cells(行, "IM").Value = 0
      End If
    End If
  Next 行
End Sub
289デフォルトの名無しさん:2011/06/07(火) 15:18:58.78
>>287
いくつも場合分けする時はSelectを使った方がいいよ

Sub 色によって判別()
  For 行 = 27 To 120
    Select Case Cells(行, "DR").Interior.ColorIndex
      Case 47 'これが赤色のとき
        Cells(行, "IM").Value = 5
      Case 44 'これが黄緑色のとき
        Cells(行, "IM").Value = 1
      Case Else 'その他
        Cells(行, "IM").Value = 0
    End Select
  Next 行
End Sub
290デフォルトの名無しさん:2011/06/07(火) 15:27:34.37
>>286
冗談はやめましょう。
291デフォルトの名無しさん:2011/06/07(火) 17:03:10.27
>>287です。

>>288
>>289
お二人とも本当に有難うございます!
問題解決しました!
わざわざコードまで教えていただき感激です。
]>>289
そんなやり方があったとは知りませんでした。
重ねて有難うございます!活用します!
292デフォルトの名無しさん:2011/06/07(火) 20:07:11.59
まともな質問には優しいお前ら
293デフォルトの名無しさん:2011/06/07(火) 21:29:11.78
sub txtbox1_Change ()

  call 処理

end sub

というプロシージャが
txtbox2、txtbox3・・・・
と10個程度続く場合、ひとつの
プロシージャにまとめることはできませんか?

txtbox1から10のいずれかがChangeで
call 処理
というような。

294デフォルトの名無しさん:2011/06/07(火) 22:11:53.16
>>293
WithEventsでぐぐれ
295問題マン:2011/06/07(火) 22:47:35.04
べろべろばー
>>287
IfでやるならInterior.ColorIndexを何度も参照しないように
いったん変数に入れたほうが無駄がないぜ!

>>293
新しくClass1を挿入
Public WithEvents mytx As MSForms.TextBox
Public Sub init(a)
Set mytx = a
End Sub
Private Sub mytx_Change()
処理
End Sub

グローバルにインスタンス作成
Dim myclass(10) As New Class1

以下を作動させる(名前違ったら適当に変えてね)
For a = 1 To 10
Call myclass(a).init(Sheet1.OLEObjects("TextBox" & a).Object)
Next

で試したら最初はうまくいったけどいじってたら効かなくなったぜ!
変数myclassを保持してる間だけ有効
テキストボックスごとに処理を変えるならMe.mytx.Nameを処理に渡して分岐させれ
296デフォルトの名無しさん:2011/06/07(火) 22:51:16.71
>>295
やはりクラスモジュールを使用するのですか。

検索して勉強しても
いまいちクラスが理解できないんですよね。

297デフォルトの名無しさん:2011/06/08(水) 00:51:32.59
.netならまだわかるけどVBAでのクラス構築がいまいちわからん
定義エラーでまくり
298デフォルトの名無しさん:2011/06/08(水) 14:11:51.75
>>295
ヒントが出れば、答え探してきて、コピペ回答するくらいはできるんだな
299デフォルトの名無しさん:2011/06/08(水) 16:41:04.83
今日から始めるんですけど、
ボタン押す→図出現→適当なセルに文字入力→図に反映
って難易度的にはどのぐらい?
300デフォルトの名無しさん:2011/06/08(水) 18:51:41.24
中級
301デフォルトの名無しさん:2011/06/08(水) 18:52:39.54
五段階の2
1は変数が理解できるレベル
302デフォルトの名無しさん:2011/06/08(水) 19:51:41.90
段階少なくね?
5はどれくらいのレベルなのさ?
303デフォルトの名無しさん:2011/06/08(水) 20:36:44.94
>>302
タッチタイピングできる
304デフォルトの名無しさん:2011/06/08(水) 20:55:39.25
開発者より詳しい
305デフォルトの名無しさん:2011/06/08(水) 22:32:33.14
このスレで他人の回答にいちいちケチを付けるのがレベル5
306デフォルトの名無しさん:2011/06/08(水) 22:37:13.37
CSV出力をすると、書式が日付のセル(例:2011/06/08)が
"2011/06/08"のようにダブルクォーテーション付きとなってしまいます。
2011/06/08のようにダブルクォーテーション無しで出力するには
どうすればよいのでしょうか?
307デフォルトの名無しさん:2011/06/09(木) 00:53:06.24
>>306
直接CSV形式でやる方法はない
VBAでコンマ区切りの文字列を自分で作ってテキストファイルに出力するしかない
308デフォルトの名無しさん:2011/06/09(木) 01:16:45.19
VBAの入門書はひと通り読んで、
フォーム入力とか、抽出、転記はかけるようになってきた。
発展というか、入門書より、実用的な本でおすすめありますか?

経験上、やはり、ネット検索より、本のほうが理解しやすいみたいです。
309問題マン:2011/06/09(木) 04:11:04.42
クラスでつっこみ所を用意したのにスルーされたぜ
>>280
これのマップ生成で使ってるぜ
ttp://www42.atwiki.jp/syugyou?cmd=upload&act=open&pageid=236&file=ttt.zip

>>296
エクセル2030ごろには同コントロール共用イベント→個別イベント
って流れになってるから大丈夫だぜ!

>>297
昔このスレの人がVBAのクラスは糞だから使わないほうがいいって言ってたぜ!

>>298
そうかwwwコピペに見えたかwwwww

>>299
ノンマクロでもけっこうなもん作れるから中級だぜ!

>>306
>>307だな
フォーマットを理解すればどんなファイルでもOPENステートメント使って自力で出力可能だぜ!

>>308
これに答えると宣伝乙っていわれるぜ!
Excel VBA アクションゲーム作成入門
310デフォルトの名無しさん:2011/06/09(木) 17:53:05.76
セル内の数値秒の間、1秒ごとに繰り返すプログラムを作ろうとしているのですが実行時エラーが出てしまいます.

Public Function myFunc()
If 秒数セルが0 Then
Application.OnTime Now + TimeValue("00:00:01"), myFunc, False
Else
秒数セル -1
処理
→ Application.OnTime Now + TimeValue("00:00:01"), myFunc
End If
End Function

エラー発生個所は矢印のところです。
OS=windowsVista EXCEL=2007です。
311デフォルトの名無しさん:2011/06/09(木) 17:59:50.02
事故解決しました
312デフォルトの名無しさん:2011/06/10(金) 07:42:52.29
ホントだ。キチガイがいる
313デフォルトの名無しさん:2011/06/10(金) 23:02:03.02
宜しくお願いします。

コードが長くて書けないのですが、EXCELのバグではないか?
という局面に直面しています。次の手順をVBAで踏むと

@シートAで複数のセルをセレクトコピーして、別のシートBへ貼り付けます。

A次に、シートBで複数のセルをセレクトコピーして、シートAへ貼り付けます。

@は問題ないのですがAの際、どういうわけか@でコピーされた内容
(シートAのセルデータ)が貼り付けられてしまうのです。


Application.CutCopyMode = False Copy も使用しています。

EXCE2000でです。宜しくお願いします。
314デフォルトの名無しさん:2011/06/10(金) 23:05:22.31
1行ずつ実行していって動作を調べろ
315313:2011/06/10(金) 23:09:21.10
事故解決しますた!
すいません。
全然違う単純ミスでした。
すいません!
316デフォルトの名無しさん:2011/06/10(金) 23:13:24.22
またお前か
317デフォルトの名無しさん:2011/06/10(金) 23:34:26.53
大体、掲示板に質問してくるレベルでExcelのバグか!?なんて100年早いわ

疑いたくなることあるけどw
318問題マン:2011/06/11(土) 02:50:56.99
前田敦子のどこがいいんだぜ

>>310
他サイトだとどう解決したか書いてけ!って怒られたりするぜ
2chだからどーでもいいけど

>>312
後付けで問題禁止とかファビョり出した人のことかい?
触れないであげようぜ・・忘れたい過去みたいだからさ・・

>>317
俺なんか自動保存をバグだと思ってたぜ!
319デフォルトの名無しさん:2011/06/11(土) 05:59:50.15
初心者です。変数の定義の質問です。

Dim v (1 to 10, 1 to 10) As Variant

v の後の(1 to 10, 1 to 10)の意味がわかりません。
詳しい方教えてください。お願いします。


320デフォルトの名無しさん:2011/06/11(土) 06:29:32.78
>>319

(1 to 10) なら以下のような入れ物を用意するということ
□□□□□□□□□□

(1 to 10, 1 to 10)ならこんな感じ
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
321デフォルトの名無しさん:2011/06/11(土) 10:30:57.94
そう言えば前スレでテーブルジャンプに付いて質問した者だけど、自己解決したから挙げさせて頂くわさ。
配列か何かにジャンプテーブルを作って、それでテーブルジャンプをしたいんだけどって言う質問で、
スレチだからダメって言われたけど、何かVBAで普通に簡単に出来たわさ。

標準モジュール側
Sub hoge()
Dim sJmpTbl(2) As String
Dim ocls1 As New cls1
Dim vMtdNm As Variant
sJmpTbl(0) = "hoge1"
sJmpTbl(1) = "hoge2"
sJmpTbl(2) = "hoge3"
For Each vMtdNm In sJmpTbl
Call CallByName(ocls1, vMtdNm, VbMethod)
Next
End Sub

クラスモジュール側(クラス名:cls1)
Sub hoge1()
Call MsgBox("hoge1が呼ばれました")
End Sub

Sub hoge2()
Call MsgBox("hoge2が呼ばれました")
End Sub

Sub hoge3()
Call MsgBox("hoge3が呼ばれました")
End Sub

かなり端折って書いたけど、こんな感じで片付いたわさ。
322デフォルトの名無しさん:2011/06/11(土) 10:32:06.55
いれものじゃねーよ
メモリ上にその値を確保すんだよ
323デフォルトの名無しさん:2011/06/11(土) 10:38:07.35
値の領域だから入れ物でいいじゃん。
324デフォルトの名無しさん:2011/06/11(土) 10:40:11.65
メモリ上の領域を分かり易く入れ物に例えたんじゃない?
それに値を確保するってどういう事?
俺には領域を確保している様にしか見えないんだけど。
325デフォルトの名無しさん:2011/06/11(土) 10:41:39.40
>>322
>メモリ上にその値を確保すんだよ

その値ってどの値なんだよ (w
326デフォルトの名無しさん:2011/06/11(土) 11:01:18.66
何言ってるんだよ
その値って言えばほら、そこにあるその値の事だろ


w
327デフォルトの名無しさん:2011/06/11(土) 11:42:59.08
319です。
>>320
ありがとうございます。すごくわかりやすかったです。

ちなみに >>321
Dim sJmpTbl(2) As String
(2)はどのようなことをさすのでしょうか?
stringが文字列型なので2文字分の入れ物を確保?ってことでいいのでしょうか。
328問題マソ:2011/06/11(土) 12:05:25.87
>>327
そのとおり
329デフォルトの名無しさん:2011/06/11(土) 12:06:14.85
330デフォルトの名無しさん:2011/06/11(土) 12:15:56.07
327です。
>>328
ありがとうございます。
327 での2文字分の表示は As string * 2 と何か違う点がありますか?

331デフォルトの名無しさん:2011/06/11(土) 13:52:38.70
ここで聞くよりググった方が早いだろうと思うんだが?
332デフォルトの名無しさん:2011/06/11(土) 17:53:45.25
だな。あっさり騙されているみたいだし。
333デフォルトの名無しさん:2011/06/11(土) 21:07:39.82
騙されてたのか。悲しいぜ。
頼みますだれか 327 の(2)について教えてください。
お願いします。 
334 忍法帖【Lv=1,xxxP】 :2011/06/11(土) 21:20:36.35
シート上にあるすべての埋め込みグラフを少し下に移動させたいのですが
Dim Move As Chart
For Each Move In Charts
Move.IncrementTop 50#
Next Move
メソッドまたはデータメンバが見つかりません。とエラーが出ます。
335デフォルトの名無しさん:2011/06/11(土) 21:28:24.07
書いてある通り
336デフォルトの名無しさん:2011/06/11(土) 21:28:30.56
>>333
>頼みますだれか 327 の(2)について教えてください。

>>319-320 見てもわからないってこと?

あと option base でぐぐっておけば幸せになれるかもしれない。
337デフォルトの名無しさん:2011/06/11(土) 21:29:55.18
>>333
まさか釣りや煽りの類じゃないだろうな?

     _______                     __
    // ̄~`i ゝ                    `l |
    / /        ,______   ,_____    ________  | |  ____ TM
   | |     ___ // ̄ヽヽ // ̄ヽヽ (( ̄))   | | // ̄_>>
   \ヽ、   |l | |    | | | |    | |  ``( (.  .| | | | ~~
      `、二===-'  ` ===' '  ` ===' '  // ̄ヽヽ |__ゝ ヽ二=''
                         ヽヽ___//   日本
         ______________  __
         |vba 配列                .| |検索|←をクリック!!
          ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄   ̄ ̄
         ◎ウェブ全体  〇日本語のページ
338デフォルトの名無しさん:2011/06/11(土) 22:38:09.49
>>336
>>337
ありがとうございました。
(2)    は 0 to 2 って意味なんですね。
339デフォルトの名無しさん:2011/06/12(日) 16:50:56.28
WEBクエリでテーブルの一部分だけを抜き出すことってできますか?
340デフォルトの名無しさん:2011/06/12(日) 17:52:54.53
すいません初心者で質問です。

ボタンを押したときテキストをexcelで読み込み、
線を引いて2箇所ソートを掛けて保存をするものを作りました。
ここで問題なのですが、テキストを読み込んで線を引いて、ソートもOK
で保存もちゃんとできたものは作れました。

ですが、ソートをするときに
ActiveSheet.Range("A2:W500")
.sort key1:O列昇順
key2:G列昇順
この記述を入れているせいで、保存が終了した際にexcelがプロセスに残ってしまっており
2回目の処理を行う際にエラーがおきてしまいます。
プロセスを終了しないとどんどん溜まっていきます。。。

シートにはいくつかデータがあるので、2箇所だけソートを掛けるとほかの
データはソートがかからないので、データがある範囲を指定しています。

何かほかの記述方法はありますか?
宜しくお願いいたします。
341デフォルトの名無しさん:2011/06/12(日) 19:37:25.23
>>340
プロセスに残るって言うことは他の何らかしらからEXCELを操作してるんだよね。
そこで使ってるObjectの設定にもよるだろうから何とも言えないけど、
とりあえずこんなページ見付けたんで参考に。
http://homepage1.nifty.com/rucio/main/technique/teq_15.htm
342デフォルトの名無しさん:2011/06/12(日) 19:39:46.56
>>341
ありがとうございます。
明日会社で試したいと思います。

もしわからなかったら、コードを記述させて頂きますので
どなたか宜しくお願いします・・・
343デフォルトの名無しさん:2011/06/12(日) 21:35:20.56
>>340
setステートメントでワークブックを掴んだら、参照をきちんと解放しろ
どのオブジェクトでも同じだ

set myWorkbook As Workbook
(略)
set myWorkbook = Nothing
344デフォルトの名無しさん:2011/06/12(日) 22:03:48.19
>>343
>set myWorkbook As Workbook

Dim じゃねーのか?
345デフォルトの名無しさん:2011/06/12(日) 22:15:40.44
>>344
すまんCreateObjectのから消したからミスった
346デフォルトの名無しさん:2011/06/12(日) 23:21:25.50
WorkbookやWorkSheetのオブジェクトは、わざわざNothing代入しなくても変数スコープが外れた時点で参照は解放されるよ
これは、どのオブジェクトでも同じだ

もちろん「変数スコープが外れた時点で」なので、モジュールレベルでオブジェクト変数を宣言している場合は
処理を終えても(プロシージャを抜けても)参照は保持されたままなので、解放したければNothing代入する必要があるが
プロシージャレベルでの宣言なら処理を終えたら(プロシージャを抜けたら)、Nothing代入を記述しなくても、
自動的にNothing代入と同じ処理が入る

問題なのは「参照」ではなく「プロセス」の方で、主にActiveX.dllではなくActiveX.exeの場合に起こる
これらはQuit、Exit、Close、Terminateなどの終了や閉じる系のメソッドを実行してやらないと
参照は解放されているのにプロセスが残るという事態が起きる

この問題は、Nothing代入して参照をきちんと解放したところで解決しないどころか
Nothing代入しちゃうと、当然ながらQuitもCloseも出来なくなっちゃうので、そんな無駄な解放処理やるまえに
きちんと終了処理を行わないとダメだ
347デフォルトの名無しさん:2011/06/12(日) 23:41:57.11
>>346
Excelに限定される話じゃないけど、暗黙で生成されたオブジェクトを掴んだ場合、
明示的に解放する手段なくない?
348デフォルトの名無しさん:2011/06/13(月) 04:11:44.87
だからVBAにDisposeはないって
言ってるじゃないですかァーッ
349デフォルトの名無しさん:2011/06/13(月) 05:21:59.77
円のオートシェイプ表示まではできたけど、表示した円に文字入力するのがわからないです
350デフォルトの名無しさん:2011/06/13(月) 07:37:47.00
つ マクロの記録
351リアル問題マソ :2011/06/13(月) 08:17:04.29
以前プロシージャレベルでもNOTHING入れるのが礼儀とか怒られたぜ!
352デフォルトの名無しさん:2011/06/13(月) 09:19:31.44
参照先をオブジェクトからnotingに入れ直すだけで、一度捕らえたオブジェクトはGC以外では解放されない仕様じゃなかったっけ
353デフォルトの名無しさん:2011/06/13(月) 13:39:31.81
>>349
Shapes.Characters.Text

>>350
2007だとオートシェイプ関係は記録できないことがある
354デフォルトの名無しさん:2011/06/13(月) 15:02:10.11
>>351
それが正解。
基本的にスコープが切れた所で開放されるけど、
場合によってゴミが残ってメモリリークが発生する事がある。
355デフォルトの名無しさん:2011/06/13(月) 15:04:35.60
ない
終了
356デフォルトの名無しさん:2011/06/13(月) 16:02:26.18
無いと言うのと知らないと言うのは違う。
357デフォルトの名無しさん:2011/06/13(月) 16:04:51.82
>>356
ねーよ
358デフォルトの名無しさん:2011/06/13(月) 16:25:19.59
なんでもかんでも最後にNothingするのはプロが無駄に記述量を増やすために書くってのが多い。
プロはわざと冗長に書くことがある。
アマチュアは無駄なことは書かずに最短距離でいきましょう。
ExcelのVBEのプロシージャレベルのRange型とかWorksheet型なんて100%書く必要はない。
359デフォルトの名無しさん:2011/06/13(月) 18:24:59.12
すいません。
セレクトセルが移動していっても、
元をたどれると便利なので、

セルアドレス = Selection.Address()

Range("セルアドレス").Select


とよくやって元を辿るのですが、

Range("セルアドレス").Select

の部分で理由は分からないのですがエラー(デバック)になって、
これを使えない時があります。

何かルールがあるのでしょうか?

EXCE2000 WindowXPです。
360359です。例えば・・・:2011/06/13(月) 18:32:53.35
Sub 1回追加()

If ActiveCell.Offset(0, -1).Range("A1").Value = "250" Then

  セルアドレスA = Selection.Address()

ActiveCell.Offset(0, -23).Range("CX1").Select 'ActiveCell.Offset(0, -23)で一番左端の列Aに移動。CXは両建判別列
Select Case Selection.Value

Case 1

Range(セルアドレスA).Select
ActiveCell.Offset(0, -23).Range("W3:DH3").Select
Selection.Insert Shift:=xlDown
Selection.Insert Shift:=xlDown
Range(セルアドレスA).Select
Application.Run "売りに買いで両建2回トレードに変更"

↓が選択され次のマクロに移り================

Sub 売りに買いで両建2回トレードに変更()

セルアドレス = Selection.Address()

Worksheets("倉庫").Select
Range("DT33:DW53").Value = ""
Worksheets("損益").Select
Range("セルアドレス").Select   ←ここでエラーになってしまいます!
361デフォルトの名無しさん:2011/06/13(月) 19:04:14.02
>>360
セルアドレスの中身見てみ
原因がわかるよ
362デフォルトの名無しさん:2011/06/13(月) 19:06:14.89
>>358
なにか問題起こされると困るし
かといっていちいち細かく説明するのも面倒だから
とりあえずやっとけって言うやつが諸悪の根源
363359です。例えば・・・:2011/06/13(月) 19:14:57.33
>>361
分かりました!有難うございます!
元々選択されているのに再度選択していました!
364デフォルトの名無しさん:2011/06/13(月) 19:27:36.15
いや、その程度の知識しか持ち合わせていないなら
とりあえずNothingは付けておいた方がいい。
開放されるのが分かってて付けないなら構わないが。
365デフォルトの名無しさん:2011/06/13(月) 19:34:14.17
>>364
お前がもっと勉強しろ
366デフォルトの名無しさん:2011/06/13(月) 19:40:50.83
うむ
367デフォルトの名無しさん:2011/06/13(月) 19:42:00.95
>>363
本当にそれが問題か?
368359です。例えば・・・:2011/06/13(月) 19:47:15.68
>>367
すいません。考えたのですが分からないのです。
教えてください。
369デフォルトの名無しさん:2011/06/13(月) 19:57:52.07
>>368
Range("セルアドレス").Select

Range("セルアドレス).Select
370デフォルトの名無しさん:2011/06/13(月) 19:59:00.15
>>369
Range("セルアドレス).Select

Range(セルアドレス).Select
371デフォルトの名無しさん:2011/06/13(月) 20:19:34.02
>>365
まだ分からないのか。
開放されない事象が有るから言ってるんだ。
人に勉強とやかく言う前に本当にそういう事象が無いのか確認してから言ってくれ。
それが出来ないなら迂闊にないなんて言わない方がいいし、
人に勉強しろなんて言うのはもっての他だ。
372デフォルトの名無しさん:2011/06/13(月) 20:34:56.40
>>371
まあまあ、そんなに怒ることでもないわさ。
私も一つ知ってるけど、言うと荒れそうだから黙ってるわさ。
373デフォルトの名無しさん:2011/06/13(月) 20:49:42.27
>本当にそういう事象が無いのか確認してから
これって不可能じゃないかな?

発生する事象をだしてもらえれば話が早いのに…
374デフォルトの名無しさん:2011/06/13(月) 20:50:31.43
>>371
>>372
だからないって
375デフォルトの名無しさん:2011/06/13(月) 20:51:24.10
>>373
悪魔の証明
376デフォルトの名無しさん:2011/06/13(月) 20:56:18.90
まぁ、お前らそう興奮して反応するなって。
別にしらねぇならそれでいいじゃないの。死ぬわけでもなし
377デフォルトの名無しさん:2011/06/13(月) 21:01:37.77
この不況下じゃその油断が野垂れ死にを招く
378デフォルトの名無しさん:2011/06/13(月) 21:04:04.74
>>372
再現可能なら荒れないよ
今は「ある」「ない」の水掛け論だから荒れてんの
379デフォルトの名無しさん:2011/06/13(月) 21:07:47.84
循環参照の例は常識だから不適
380デフォルトの名無しさん:2011/06/13(月) 21:10:04.44
>>379
常識でも何でもないと思うが。
ならばNotingを付けるのも常識だろう。
381デフォルトの名無しさん:2011/06/13(月) 21:11:58.65
>>380
Nothingつけただけじゃメモリリークする
馬鹿は黙ってろ
382デフォルトの名無しさん:2011/06/13(月) 21:13:58.87
> 基本的にスコープが切れた所で開放されるけど、
> 場合によってゴミが残ってメモリリークが発生する事がある。

> 基本的にスコープが切れた所で開放されるけど、
> 場合によってゴミが残ってメモリリークが発生する事がある。

> 基本的にスコープが切れた所で開放されるけど、
> 場合によってゴミが残ってメモリリークが発生する事がある。
383デフォルトの名無しさん:2011/06/13(月) 21:14:11.42
すいません、やはりわからなかったので教えてください・・・

'エクセル起動
Set a_xls = New Excel.Application

With a_xls.Application
.Workbooks.OpenText _
     〜省略〜
FieldInfo:=Array( _
Array(1, 2), Array(2, 2), Array(3, 2), Array(4, 2), Array(5, 2))

ActiveSheet.Range("A2:W500") _
.Sort Key1:=Range("O2"), order1:=xlAscending, _
Key2:=Range("G2"), order2:=xlAscending
End With

.ActiveWorkbook.SaveAs FileName:= _
Replace(strFileNm, ".txt", ".xls"), FileFormat:= _
xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _
, CreateBackup:=False

End With

a_xls.Quit
Set a_xls = Nothing

こう書いているのですが、ソートを掛けるところを記述すると
excelが終了せずプロセスに残ったままになってしまいます。

何か書き方などアドバイスいただけませんか。お願いします
384デフォルトの名無しさん:2011/06/13(月) 21:21:45.38
何だ、循環参照の話が出たから分かってるのかと思ったが全然分かって無かったみたいだな。
なら俺が説明しても理解出来ないかも知れないな。
385デフォルトの名無しさん:2011/06/13(月) 21:27:44.33
>>377
厳しい世界…なんだ、な
386デフォルトの名無しさん:2011/06/13(月) 21:31:38.96
> 常識でも何でもないと思うが。
> ならばNotingを付けるのも常識だろう。

> 常識でも何でもないと思うが。
> ならばNotingを付けるのも常識だろう。

> 常識でも何でもないと思うが。
> ならばNotingを付けるのも常識だろう。
387デフォルトの名無しさん:2011/06/13(月) 21:34:47.15
388デフォルトの名無しさん:2011/06/13(月) 21:39:07.64
>>386
はずかしい><
389デフォルトの名無しさん:2011/06/13(月) 21:43:46.71
オブジェクトの参照って次の理解でいい?

オブジェクトは変数に参照を設定することで使用できるようになる。
変数のメモリアドレスにオブジェクトへ参照アドレスが確保され、
処理の際に変数→メモリ→オブジェクトの呼び出しが行われる。

呼び出されたオブジェクトの実体は、利用しなくなったらシステム側が回収
(おかしな挙動しないようにしまっちゃう)する。

変数にNothingをセットすると、変数の持つメモリアドレスが無しに書き換える。
これにより、変数へのアクセスにより、不要なオブジェクトの呼び出しが無くなる。

つまり、変数の持つメモリアドレスをクリアし、オブジェクト召還を変数から出来なくするが、
実体の回収を保証するものではない。
390デフォルトの名無しさん:2011/06/13(月) 21:44:59.10

初心者なのだけど、

Excel VBA で書いたプログラムの拡張子は、どんな文字なのかオセーテ!
391デフォルトの名無しさん:2011/06/13(月) 21:44:59.80
>>383
>Set a_xls = New Excel.Application

新しいブックオープンするんじゃダメなん?
392デフォルトの名無しさん:2011/06/13(月) 21:47:29.79
>>390
えくすぽーとしてみたまえ
393デフォルトの名無しさん:2011/06/13(月) 21:48:41.52
>>390
.vba
394デフォルトの名無しさん:2011/06/13(月) 21:49:12.10
395デフォルトの名無しさん:2011/06/13(月) 21:51:37.82
>>394
IDも見れないのと思ったがここ出ないんだった

とりあえず内容みような、言ってること違うから、多分
396デフォルトの名無しさん:2011/06/13(月) 21:54:17.60
>>395
15分待ってやるよ
397デフォルトの名無しさん:2011/06/13(月) 21:55:30.55
398デフォルトの名無しさん:2011/06/13(月) 21:58:28.51
やれやれだ。
ここまで>>386-388みたいに煮えくり返っている奴に説明するのも馬鹿馬鹿しいな。
人の話を聞かないで決めつける時点でプログラマとしての素質が無いと分かってる奴に説明するのも何だしな。
こう言う奴は結局自分で適当に調べて間違った事をずっとそのまま覚えているんだろうな。
お前みたいに失礼な奴に教えるとでも思っているのか?土下座して出直せ。
399デフォルトの名無しさん:2011/06/13(月) 21:58:52.31
>>393
Thanks a lot!
400デフォルトの名無しさん:2011/06/13(月) 22:00:36.88
>>398
Nothingつけただけじゃメモリリークする
馬鹿は黙ってろ
401デフォルトの名無しさん:2011/06/13(月) 22:04:09.61
>>391
前に質問していてその内容が340にあるんですが、

ブックだけを開いてテキストの読み込みは可能ですか。
どうもソートかけるてるところをコメントアウトすると
正常に終了するので、どうしたもんかと試行錯誤しているんですが
よくわからない状態です・・・
402デフォルトの名無しさん:2011/06/13(月) 22:06:54.83
>>400
これでお前はまたひとつ勉強する機会を失った訳だ。
そうやって底辺PGとしてそのまま這いつくばっていればいいさw
403デフォルトの名無しさん:2011/06/13(月) 22:08:31.69
>>402
Nothingつけただけじゃメモリリークする
馬鹿は黙ってろ
404デフォルトの名無しさん:2011/06/13(月) 22:11:04.46
>>401
>ブックだけを開いてテキストの読み込みは可能ですか。
vbaだから、基本的になんでもありだと

ただ、この一文だけじゃなんのことだか?
405デフォルトの名無しさん:2011/06/13(月) 22:13:13.30
クラスやフォームを使わなければ起きない。
406デフォルトの名無しさん:2011/06/13(月) 22:16:10.22
>>405
そうだとすると、私が知ってるのと同じかも知れないわさ。
407デフォルトの名無しさん:2011/06/13(月) 22:19:32.11
GoTo >>351
408デフォルトの名無しさん:2011/06/13(月) 22:20:35.94
>>401
自分のWorkbooksのOpenTextを使えば済む話じゃないのか?
何か妙な勘違いをしている気がする。
409デフォルトの名無しさん:2011/06/13(月) 22:21:03.60
まだ続いてたんか
でNothingしないとメモリリークする例は出たか?
410デフォルトの名無しさん:2011/06/13(月) 22:22:16.09
>>404
ですね、すいません。

と言うか、なんで
ActiveSheet.Range("A2:W500") _
.Sort Key1:=Range("O2"), order1:=xlAscending, _
Key2:=Range("G2"), order2:=xlAscending
End With
ここだけで、プロセスが残ってしまうのが良くわからないんですよね・・・
411デフォルトの名無しさん:2011/06/13(月) 22:47:16.97
>>410
sortは環境によっては、おかしくなることがあるみたい

知らないで書くけど、
最後のquitはcloseじゃダメなん。
412デフォルトの名無しさん:2011/06/13(月) 22:57:25.98
そもそもメモリリークしたかどうかってどうやって調べるのよ
413デフォルトの名無しさん:2011/06/13(月) 23:02:21.95
>>412
長年の経験と勘
単に外部プロセスやOSがキャッシュとして保持している場合があるから難しい
414デフォルトの名無しさん:2011/06/13(月) 23:12:31.57
賢くない人の平凡でしょぼいな回答をありがとう
415デフォルトの名無しさん:2011/06/13(月) 23:17:34.07
しょぼいなってどこの方言?
416デフォルトの名無しさん:2011/06/13(月) 23:26:17.84
>>411
なるほど、どうなんだろう
今は家だからできないんだけど試してみるかな・・・
417デフォルトの名無しさん:2011/06/13(月) 23:38:44.33
>>415
面白い回答をどうぞ
418デフォルトの名無しさん:2011/06/13(月) 23:39:20.29
>>383
このコードみると
With は1個なのに
End With は2個あるけど
コピペミス?
419デフォルトの名無しさん:2011/06/13(月) 23:42:33.24
>>418
はい、すいませんコピペミスと言うか

今日色々やっててその残骸です。無視してください
420デフォルトの名無しさん:2011/06/13(月) 23:42:37.20
省略の部分
421デフォルトの名無しさん:2011/06/13(月) 23:43:46.93
>>417
えぇ?!俺?
422デフォルトの名無しさん:2011/06/13(月) 23:59:20.64
>>421
うむ
おもろー
423デフォルトの名無しさん:2011/06/14(火) 00:26:23.25
>>409
過去レス読んでろノロマ
424デフォルトの名無しさん:2011/06/14(火) 02:13:19.89
例示もソースもコードも貼れないで脳内で完結してるだけなのになんでわざわざ恥をさらしにくるの?
マゾなの?
気持ちいいの?
425デフォルトの名無しさん:2011/06/14(火) 02:31:02.29
ここの奴らはスルースキル低いなw
426デフォルトの名無しさん:2011/06/14(火) 03:26:07.70
俺もUserFormでメモリリークする事例は知ってるが、Nothingとは無関係だしなぁ。
Set *** = Nohingを書かないとメモリリークして、書くとメモリリークしない例は俺は知らない。
427スーパー問題マン:2011/06/14(火) 03:52:05.88
つまりnothingでジェネレーションを下げないとVBAのガベージなんとかが解放してくんないし、
逆にnothingで参照が切れることでガベージなんとかのリストから外れて残る可能性がある

ってことでFA?
428デフォルトの名無しさん:2011/06/14(火) 03:56:49.71
何がFA?
中の細かな動作までわかる奴いないと思うけど
429デフォルトの名無しさん:2011/06/14(火) 04:24:14.86
こんにちは、質問いいですか?

VBAでオブジェクトをシリアライズし文字列をセルに保存することはできますでしょうか?
430デフォルトの名無しさん:2011/06/14(火) 09:45:15.39
Nothing派は旗色悪いな
起死回生でみんなを黙らせる書き込みはないんかな?
431デフォルトの名無しさん:2011/06/14(火) 10:21:45.74
Nothing代入しないで起こる問題は
Nothing代入しても同じように起こる

Nothing代入によって発生しない問題は
Nothing代入しなくても起こらない

プロシージャレベルの参照変数にプロシージャの最後でNothing代入するのは
完全に無意味で、これの有無によって何かが変わることは無い
432デフォルトの名無しさん:2011/06/14(火) 10:24:42.70
俺はnoting派じゃないがnotingは入れてる

条件処理で空else書くのと同じ扱いだな
実際俺が無知なだけで、notingにすばらしい効果があるのかも知れないし
433デフォルトの名無しさん:2011/06/14(火) 10:30:22.49
コードの明示性を上げるために、自動型変換が働くところでも
文字列型変数 = CStr(整数型変数)
とかやるのは無駄じゃないけど、Nothingは無駄以外の何ものでもない
434デフォルトの名無しさん:2011/06/14(火) 12:21:58.97
Application.
とかもその類いだな
でも空elseはNotingと同じじゃんシステム上のメモリリークのリスク回避でなく、コーディングでのリスク回避だと思うんだが

つまりシステム上要請されるコードではなく、規約の上に従う一種のルール
であれば完全否定もするものじゃないな

Notingが明示的な解放ではないと言うスタンスならば
435デフォルトの名無しさん:2011/06/14(火) 12:23:46.95
>>430
何も例を挙げていないのに人の話を聞けとか言うやつしかいないよ
436デフォルトの名無しさん:2011/06/14(火) 12:28:27.19
書いておいてあれだが日本語がひどすぎだわ俺
437デフォルトの名無しさん:2011/06/14(火) 12:56:07.51
同じくnothing は基本的に入れない派なんだが、createobject やnewでインスタンスを新たに生成した場合は最後にnothing をいれるようにしてる。
もしかしてこれも無意味だったりする?
教えてエロい人

438デフォルトの名無しさん:2011/06/14(火) 13:16:38.11
メモリリークってどうやって調べるの?
439デフォルトの名無しさん:2011/06/14(火) 13:28:31.63
無意味がどの意味で使われてるかいまいち
まとめるとこんなかな

宣言する派

├宣言したら解放される説
├宣言しても解放されないが、メモリリークリスクが減る説
│├GCが自動的に回収するけど想定外エラーとか困る分派
│└回収されるとは限らないから可能な限り明示する分派
├メモリリークリスクは変わらないけど、コードの明示になる説└みんなしてるじゃん説

宣言しないよ派

├┬dirpose実装しろ説
│└参照先が変更されるだけで破棄が保証されないから宣言が無意味じゃん説
├GCにまかせろー(バリバリ)説
├気にするようなシステム作ってないだろ説
├面倒くさい説
├参照先が変更されるだけで破棄が保証されないじゃん説
└ソースよこせ説
440デフォルトの名無しさん:2011/06/14(火) 14:31:20.39
>>438
タスクマネージャで大体分るんじゃない?
441デフォルトの名無しさん:2011/06/14(火) 14:41:09.79
エクセル終了させたら全部解放される程度のことを問題にするな
442デフォルトの名無しさん:2011/06/14(火) 23:43:08.95
質問です
対象はシートが"対象者"、"コピー元"と人名のシートが複数枚あるブックです
人名のシートは"対象者"シートに書かれている人名でシート名が付けられています
対象者のシートには1〜3列目まで人名を含んだ文字列、それ以降の列がデータとなっており、
1列目から3列目までを順にチェックして、一致する人名のシートにその列をコピーしたいです。

そこで処理を記述してみたのですが、コピーを繰り返すうちに
「リソース不足のため、このタスクを完了することができません。
選択するデータを少なくするか、ほかのアプリケーションを終了して再度試してください。
元に戻さずに続けますか?」と出てしまい、処理が終了してしまいます。

検索して同様の事象の対処法として、クリップボードをクリアするために必要なコピー処理の
直後に1つのセルのみコピーする処理やCutCopyMode=Falseにする処理を入れてみましたが
状況は変わりませんでした。

なんらか対処法ご存知の方教えていただけないでしょうか?
443442:2011/06/14(火) 23:46:50.21
書いたソースは下記のような感じです(1/2)

Private Sub CreatePersonalSheet()
nCheckColumn= 1
nPersonCnt = ThisWorkbook.Worksheets("対象者").UsedRange.Rows.count - 1
Do While nCheckColumn < 3
nRow = 2
Do While nRow <= nPersonCnt + 1
sPersonSheet= ThisWorkbook.Sheets("対象者").Cells(nRow , 1)
nPersonEndline= ThisWorkbook.Worksheets(sPersonSheet).UsedRange.Rows.count
With ThisWorkbook.Worksheets("コピー元")
.Range("A1").AutoFilter Field:=nCheckColumn, Criteria1:="*" & sPersonSheet& "*"
444442:2011/06/14(火) 23:52:56.15
続きです(2/2)

If (.AutoFilter.Range.nCheckColumns(1).SpecialCells(xlCellTypeVisible).count > 1) Then
.Rows(1).Hidden = True
.Range("A1").SpecialCells(xlCellTypeVisible).Copy _
ThisWorkbook.Worksheets(sPersonSheet).Rows(nPersonEndline+ 1)
.Cells(1, 1).Copy
Application.CutCopyMode = False
' 作業シートよりコピー完了した行を削除
.Range("A1").SpecialCells(xlCellTypeVisible).delete
.Rows(1).Hidden = False
End If
.AutoFilterMode = False
End With
nRow = nRow + 1
Loop
nCheckColumn = nCheckColumn - 1
Loop
End Sub

前レスでなぜかインデントが消えてしまいました、すみません
どなたか分かる方見えたらお願いします。
445デフォルトの名無しさん:2011/06/15(水) 01:15:41.49
>>442
    Do While nCheckColumn < 3
        ...
        nCheckColumn = nCheckColumn - 1
    Loop
無限ループしてないか?
446442:2011/06/15(水) 01:26:49.22
>>445
そこは実際のソースだと分かりづらい部分があったんで何箇所か修正したときに直し忘れてました
nCheckColumn = nCheckColumn +1ですね
ご指摘ありがとうございます

あと>>442の4行目「対象者のシートには〜」は「コピー元のシートには〜」でした。
間違いが多くてすみません
447問題マソ:2011/06/15(水) 07:44:30.67
ググったらnothingは7年前から議論して結論でてないみたいだぜ

>>446
ちょっとブックうpしてみて
448デフォルトの名無しさん:2011/06/15(水) 07:49:25.77
結論は出てるよ
ただ、悪魔の証明で、Nothing無しでも全てのケースに置いて絶対に問題が「無いという証明」は不可能なので
悪魔の証明ってのを理解してない奴だけが結論出てないと勘違いしているだけ
449デフォルトの名無しさん:2011/06/15(水) 08:12:49.67
最近は礼儀とか作法とか書く馬鹿が減っただけでも少しは向上したのかもね。
450デフォルトの名無しさん:2011/06/15(水) 18:11:04.35
ユーザーフォームを作成してて、
何度か実行していると、突然

指定されたオブジェクトが見つかりません

みたいなエラーがでて、フォームが開けなくなることがあるんですが、
フォームに問題があるのでしょうか?
上書き保存時にもエラーがでることもあります。

コードを新規BOOKに移植しても同じでした。
451デフォルトの名無しさん:2011/06/15(水) 18:41:06.55
ブックあるいは再現する最小のコード、デザインをうp
話はそれからだ
452デフォルトの名無しさん:2011/06/15(水) 18:54:35.56
>>451
特定のBOOKではなく、いくつかのファイルで発生します。
エクセル、OSともに再インストールしたけど、再発しました。

内容は複雑なものではなく、
with構文
Application.ScreenUpdating
txt1.Value = Val(txt2.Value) - Val(txt3.Value)
if Else構文
を使い、
フォームのコンボボックスや
テキストボックスに入力したものを
シートに転記する、といったようなものです。

エクセル2007
Celeron 2.53
MEM 1024M です。
453デフォルトの名無しさん:2011/06/15(水) 19:11:06.50
ユーザーフォームを何度か実行(Show)すると問題が起きるのか
ユーザーフォーム上でなんらかの処理を何度か実行すると問題が起きるのか解らんが
前者なら何のコントロールもコードも乗せてない空のユーザーフォームでも再現するか
後者なら、空のユーザーフォームにボタンを1つ配置して、コードは書かずにそれを
何度か押すだけでも再現するか確認しろ

これで問題が再現するなら、MSにバグ報告しな
これで問題が再現しないなら、コードに問題があるわけだから
問題が再現する最小のコードをきちんと探って
変に略したりせずに書くように
454デフォルトの名無しさん:2011/06/15(水) 19:13:40.51
>>448
Nohitng付けとけ派は
事実と推論できるものが証明できるかどうかを問題にしてるんじゃない
事実として良いかを問題にしてるんだ

VBAの実行環境に対する信頼性の問題だよ
455デフォルトの名無しさん:2011/06/15(水) 20:10:51.67
今日初めてユーザーフォームの存在を知ったが、
汎用性はありそうだけど、
繰り返し処理に弱そうなイメージなんだがどう思う?
456デフォルトの名無しさん:2011/06/15(水) 20:11:46.31
>>455
余裕
457デフォルトの名無しさん:2011/06/15(水) 21:50:41.90
>>452
似たような症状になったことある。
どういう基準でなるかわからなかったけど、
ユーザーフォームをデバッグしてると、急に
パスが見つかりません、みたいなエラーがでる。
ツリーでひらいても、同じでひらけない。

ぐぐっても、ユーザーフォームがなにか悪さしてる、
程度しかわからなかった。

458デフォルトの名無しさん:2011/06/15(水) 22:43:34.39
「時間指定によるマクロの実行のご質問お願いします(エクセル2003)」
「A1に 23:00:00と入力し B2からB11に 101から110までの数字を入力しています
右隣(C2)に数字をコピーするマクロですが下記のようにマクロ記録終了いたしました」

Sub 時間ですコピーです()
'
' 時間ですコピーです Macro
'

'
Range("B2:B11").Select
Selection.Copy
Range("C2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Range("A2").Select
End Sub

「毎日A1表示時刻に実行するマクロを下記の通りやってみましたが指定時間に実行できません」


Sub 時間ですコピーです()
'
' 時間ですコピーです Macro
間省略
Application.CutCopyMode = False
Application.OnTime TimeValue("A1"), "時間ですコピーです"
End Sub
「ご指導の程お願いします」

459デフォルトの名無しさん:2011/06/15(水) 22:53:09.77
Workbook_Openに無限ループで書くか
タスクを使う
460デフォルトの名無しさん:2011/06/15(水) 23:07:19.71
>>458
Application.OnTime TimeValue(Range("A1")), "時間ですコピーです"
じゃね?
461デフォルトの名無しさん:2011/06/15(水) 23:11:29.15
>>460あほか
462デフォルトの名無しさん:2011/06/16(木) 00:23:51.75
実用性で考えたらタスクだろうね。
>>459の人が言ってる様にタスクで立ち上げて
Workbook_Openに処理を書き込む様にすれば大丈夫。
最後にブックを保存して閉じることを忘れずに。
463デフォルトの名無しさん:2011/06/16(木) 08:30:13.09
>>459 462
ありがとうございます タスクの意味があまり分かっていませんで
一度くぐってやってみます
464デフォルトの名無しさん:2011/06/16(木) 10:04:59.11
質問させてください。
マクロでシートの中の「"」を一度に消したいのですが、文字列として認識してくれないため行き詰まっています。
手動の置換でなら出来るのですが、マクロで処理する方法があればご教授ください。
よろしくお願いします。
465デフォルトの名無しさん:2011/06/16(木) 10:26:14.91
>>463
コントロールパネル開いてごらん
466デフォルトの名無しさん:2011/06/16(木) 10:27:33.42
>>464
エスケープシーケンス
文字コード
おすきにどうぞ
467デフォルトの名無しさん:2011/06/16(木) 10:51:40.71
>>465
はい やってみました
タスクと言うところクリックして タスクの追加とか・・・ありますね
初めて開きました  お昼休みに一度やってみます

何度もありがとう
468デフォルトの名無しさん:2011/06/16(木) 10:53:31.08
>>464

testしてないけど

Replace(Cells(n, n), Chr(34), "")とかは?

Chr(34)は半角 "
469デフォルトの名無しさん:2011/06/16(木) 12:57:54.54
>>464

Cells.Replace What:="""", Replacement:=""
470デフォルトの名無しさん:2011/06/16(木) 15:33:22.65
フォームのコンボボックスのオブジェクト名を
一括で変更するにはどうしたらいいでしょうか?

cbo内容1 〜 cbo内容10
と連番にしたです。
471デフォルトの名無しさん:2011/06/16(木) 15:49:59.61
全部ならeach
472デフォルトの名無しさん:2011/06/16(木) 15:53:24.87
>>466>>468>>469
返信ありがとうございます。
しかし、何度やってもダメでした。
VBのバージョンが6.5なのですが、古くてダメなのでしょうか。
473デフォルトの名無しさん:2011/06/16(木) 16:08:42.34
>>472
バージョンに限らず駄目でしょう。
あれの扱いは文字列ではありません。
474デフォルトの名無しさん:2011/06/16(木) 16:14:54.76
ごめん、頭のシングルクォートと間違えた
475デフォルトの名無しさん:2011/06/16(木) 16:15:29.56
フォームって言っても
フォームツールなのか、ユーザーフォームなのかで
話は変わってくるわけだが
476デフォルトの名無しさん:2011/06/16(木) 16:16:15.85
>>475
ユーザーフォームです
477デフォルトの名無しさん:2011/06/16(木) 16:32:47.17
Call Cells.Replace("""","")

でも駄目?>>469の人の書き方ちょっと変えただけだけど。
478デフォルトの名無しさん:2011/06/16(木) 16:47:21.02
VBなんちゃらとかchr使うとかなかったっけ
479デフォルトの名無しさん:2011/06/16(木) 17:00:19.20
タブオーダーってすごく使いにくいですね。
表みたいに配置したテキストボックスが
40個とかあったら、大変。
D&Dとかソートでできたら楽なのに。

みんなは一個ずつちまちま移動しているのですか?
480デフォルトの名無しさん:2011/06/16(木) 17:14:45.75
>>477
やはりダメなようです。
他の文字ではちゃんと処理してくれるのでプログラムは合っているのですが
ダブルクォーテーションだけが処理してもらえません。
481デフォルトの名無しさん:2011/06/16(木) 17:33:33.40
ダメだって単に言われてもな。

どのようにコーディングしてどのようにダメなのか実例を示してくれ
482デフォルトの名無しさん:2011/06/16(木) 17:52:33.77
http://www.moderns.co.jp/blog/category.php?k=Windows
この状況によくなるんだけど、解決方法はないんですか?
483デフォルトの名無しさん:2011/06/16(木) 19:04:28.87
宜しくお願いします。

例えばIf〜文の条件式で(必ずしもifでなくてもOKです)、
真であれば

次の行のプログラムをEnd subまで読み込まない。

または、

指定した行のプログラムまで読み込まずにジャンプする。

というようなことは出来ないでしょうか?
宜しくお願いします。

Windows XP EXCEL2000です。

484デフォルトの名無しさん:2011/06/16(木) 19:13:09.45
if false then
なんたら
endif
485デフォルトの名無しさん:2011/06/16(木) 19:24:21.23
>>483
>次の行のプログラムをEnd subまで読み込まない。

どう使いたいのかがよく分からないけど、フラグ設けて再帰するとか?

>指定した行のプログラムまで読み込まずにジャンプする。

GOTO文があるけど、これの多用はお勧め出来ない。
If文のネスト加減で難しいならこれもやっぱりフラグ設けてその分岐で目的の行に
飛ばした方がいいと思うよ。
486デフォルトの名無しさん:2011/06/16(木) 20:07:38.82
>>481
すみません、言葉が足りないようでした。
例えば、>>477さんのプログラムを実行すると、何も変更されないままプログラムが終了するのです。
ダブルクォーテーション以外の文字を指定するとちゃんと置換されてプログラムが終了します。
487デフォルトの名無しさん:2011/06/16(木) 20:35:40.61
Call Cells.Replace(""","")だろ低脳共
488デフォルトの名無しさん:2011/06/16(木) 20:36:54.82
怨エラーなんちゃら

chr(34)
489デフォルトの名無しさん:2011/06/16(木) 20:57:24.02
Excel2007/2010 で、vba側から条件付き書式を4つ作ると
最上位にあるプロパティがコード側から
うまく操作できないぽい。既出でしょうか? orz
ウォッチウィンドウでSelection.FormatConditionsを見ると
Item1とItem4のFormula1が同じ値になってる。
Item1の方の.font.colorとか.font.colorindexを変化させても
反映されない。Item4側が変化したりする。
490デフォルトの名無しさん:2011/06/16(木) 21:03:28.53
>>487
それ、>>477と何が違うの?
491デフォルトの名無しさん:2011/06/16(木) 21:06:35.78
>>490
老眼がきてんのか?おっさん
492デフォルトの名無しさん:2011/06/16(木) 21:14:18.66
Call Cells.Replace("""","")
Call Cells.Replace(""","")
なるほど、ダブルクォートが3つか。

ドヤ顏のとこ悪いけど、それじゃ走りもしないよん。
493デフォルトの名無しさん:2011/06/16(木) 21:21:37.32
>>486
俺はちゃんと置換されるが?
494デフォルトの名無しさん:2011/06/16(木) 22:30:48.07
>>493さんが成功していて>>486が失敗してんだから
>>486の書き方に間違いがあるんでしょ。

ごちゃごちゃ言わずにさ、その部分どういうふうに書いているのかサンプルのデータと一緒にここに書いてみたら?
あれこれ言ってるよりその方がよっぽど早いでしょ。
495デフォルトの名無しさん:2011/06/17(金) 00:04:44.82
>>494
失礼しました。
以下のデータになります。

エクセルのシートは「”あ”」のようにダブルコーテーションでくくってある文字の集合です
試しにシートのダブルコーテーションを全角から半角に書き直し、
Macro2の「Chr(&H8168)」を""とすると、消すことが出来ました。
しかし全角の”を消すことができません。


Sub Macro1()
'
' Macro1 Macro
'
'
Cells.Select
Call Cells.Replace("chr$(&H8168)", "")
End Sub

Sub Macro2()
'
' Macro2 Macro
'

'
Cells.Select
Selection.Replace What:="Chr(&H8168)", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
End Sub
496デフォルトの名無しさん:2011/06/17(金) 00:07:05.35
>>495
"”"
497デフォルトの名無しさん:2011/06/17(金) 00:30:23.09
ぜwwwんwwwかwwwwくwwwww
498デフォルトの名無しさん:2011/06/17(金) 00:31:14.20
>>495
ありがとうございます
499デフォルトの名無しさん:2011/06/17(金) 00:41:12.66
全角のダブルクォーテーション…

書かなきゃいいじゃんww
500デフォルトの名無しさん:2011/06/17(金) 01:01:08.59
システム作るときならまあ、ユーザー入力だから想定はするけど・・・
質問で全角とは予想GUY
501デフォルトの名無しさん:2011/06/17(金) 01:03:05.83
>>464
> マクロでシートの中の「"」を一度に消したいのですが
502デフォルトの名無しさん:2011/06/17(金) 01:34:17.77
久しぶりによくで来た釣りだったな
503442:2011/06/17(金) 03:41:09.22
コピーを繰り返すとリソース不足でエラーが発生する件で相談中だったものです。
事象の再現するようにテストデータとブックを作りました。
下記のURLから取得してみていただけないでしょうか?

ttp://www1.axfc.net/uploader/Sc/so/245613
DLキーは[VBA442]です

どなたか力を貸していただけると助かります。
504デフォルトの名無しさん:2011/06/17(金) 04:45:19.74
Copyではなく
Value = Valueによる代入にしたらエラー出なかったし
Copyの場合の「実行〜エラー」までより遙かに短い時間で全処理終わったよ
505エスパーマン:2011/06/17(金) 04:49:53.92
同レベルなので初見でエスパー余裕でした
506デフォルトの名無しさん:2011/06/17(金) 15:32:49.48
マクロを実行した時に指定したセルの中身が、
例えばA1の中身が「あ」なら終了して、それ意外なら実行するという様なコードを教えてください
507デフォルトの名無しさん:2011/06/17(金) 17:09:59.17
これは流石にどう見ても釣り
508デフォルトの名無しさん:2011/06/17(金) 18:54:18.09
>>507
分からないならそう言えよ
509デフォルトの名無しさん:2011/06/17(金) 18:58:24.68
If Worksheets("sheet1").Cells(1, 1).Value = "あ" Then
Exit Sub
Else

End If


これで満足したか? >>508
510デフォルトの名無しさん:2011/06/17(金) 19:07:39.42
>>506の切り返しに期待
511デフォルトの名無しさん:2011/06/17(金) 19:08:38.13
誤字に突っ込めよ
512デフォルトの名無しさん:2011/06/17(金) 20:14:46.42
>>506
「あ」じゃないときだけ実行すれば、「あ」のとき終了と同じことになる。
513デフォルトの名無しさん:2011/06/17(金) 20:23:36.82
>>512
506レベルなら「では"あ"ではないってどうやって(ry」になるんじゃね
514442:2011/06/17(金) 20:55:52.08
>>504
出来ました、ありがとうございます

しかし原因がよく分からなかったのですが、今回のようにフィルターかけて可視領域だけを
コピーするような連続領域でないコピーみたいな特殊な処理はCopyは使わないほうがよいということですか?
515デフォルトの名無しさん:2011/06/17(金) 21:08:10.51
て言うか>>508みたいな反応に驚いたw
マジだったんだ。すまんかったな。
516デフォルトの名無しさん:2011/06/17(金) 21:14:11.34
ユーザーフォームに
リストボックスとボタンを置いて

ボタンに
Private Sub CommandButton1_Click()
Me.ListBox1.ListIndex = -1
End Sub
と書くと選択が解除されるのですが

リストボックスに
Private Sub ListBox1_Click()
Me.ListBox1.ListIndex = -1
End Sub
と書くと選択が解除されません。

これどうやったら選択解除出来ますか?
517デフォルトの名無しさん:2011/06/17(金) 22:47:14.19
>>516
何がしたいんだ?
518デフォルトの名無しさん:2011/06/17(金) 23:06:55.55
押し間違えさせない為に
奇数行に線(---------------------)を入れてて
それをクリックした時に選択状態にしない様にしようと
思ってやってみたんですが解除出来なくて。
飾りじゃない行をクリックしたら値をシートにセットして
アンロードする様にしています。
見栄えの問題なので絶対必要って訳じゃないんですが。
519デフォルトの名無しさん:2011/06/17(金) 23:43:23.81
Meをフォーム名にしてみても動かない?
520デフォルトの名無しさん:2011/06/17(金) 23:49:59.23
とグルボタンで
デフォルトがoff(押し込まれた状態)の状態
にする方法ってある?
521デフォルトの名無しさん:2011/06/18(土) 00:12:12.06
>>520

UserForm1.ToggleButton1.Value = True
UserForm1.show
かな?かな?
522デフォルトの名無しさん:2011/06/18(土) 00:24:01.87
>>521
フォームを使わず、
Sheet1にActiveXコントロールのToggleButtonをつかった場合です。
したがって、Sheet1にコードを書いた場合です。
523520:2011/06/18(土) 00:27:21.90
訂正
ToggleButtonで
デフォルトがon(押し込まれた状態)にする方法ってある?
フォームを使わず、
Sheet1にActiveXコントロールのToggleButtonをつかった場合です。
したがって、Sheet1にコードを書いた場合です。

524デフォルトの名無しさん:2011/06/18(土) 01:03:15.72
>>514
原因は「可視領域のコピー」にある

例えば、300件のデータがあって、そのうちフィルタを抜けて表示されたセル(行)が10件あったとしよう
あのコードでコピーされる行数は何行?

おそらく君は10行がコピーされると思ってるのだろう
しかしそれは間違いで、正しくは2003以前なら「65536-300+10 = 65246行」だ
だって、データが入ってない301〜65536行目も「可視領域」だろ
六万数千行もの膨大な範囲のコピーを数百回繰り返せば、流石にリソース不足にもなるさ
こんなのは、予備知識が無くてもデバッグ出来る奴ならすぐに気付くこと
だって、各処理の戻り値や変数の変化や内容を確認するという、一番初歩的なデバッグで気付けるから

「可視領域のコピー」ではなく「可視領域『かつデータが入っている領域』のコピー」あるいは
空セルを非表示にした上での「可視領域のコピー」なら、コピー処理でもエラーにはならないはず
まあ書式不要なら、Value = Valueの方が良いとは思うけどね

とりあえず、まともにデバッグが出来ないうちは、どんなに複雑なコードが書けても
「プログラムが組める」「VBAが使える」うちには入らないので、デバッグの仕方はきちんと身につけましょう
このくらいの単純で短い処理ならいいけど、もっと複雑で長い処理になると、
こういうスレで金を貰える訳でもない赤の他人らは、面倒がって相手にしてくれなくなるよ
525デフォルトの名無しさん:2011/06/18(土) 01:25:47.00
>>518
ググったんだけど
ClickイベントをMouseUpイベントにしたらできたよ
例えば、リストボックスのValueが"-----"ならListIndex=-1
とか
526デフォルトの名無しさん:2011/06/18(土) 01:50:15.08
>>525
出来ました!ありがとうございます
527丸投げ請負マン:2011/06/18(土) 06:27:00.34
丸投げこいや!!
528デフォルトの名無しさん:2011/06/18(土) 06:31:45.94
こいと言っても、君のレベルじゃまともなもの作れないでしょ
529デフォルトの名無しさん:2011/06/18(土) 08:27:29.63
>>523
右クリック→プロパティでTrueにしたら出来たけどさ

(excel2007)
530デフォルトの名無しさん:2011/06/18(土) 10:12:21.87
OS:Windows2000
ExcelVer:Excel2003質問させてください。
処理の高速化が目的です。

ブックA1〜ブックAnまでに書かれた同一フォーマットのデータを
ブックBに集計しています。

Bに書かれたマクロで、現在Workbooks.openメソッドを使ってA1〜Anを参照しているのですが、
Workbookオブジェクトをopenせずに参照する方法はないでしょうか。

よろしくお願いします
531デフォルトの名無しさん:2011/06/18(土) 10:33:01.55
あるjpeg画像をサイズ変更して新しいファイルに出力しなおす、ってexcel vbaでできますか?
532デフォルトの名無しさん:2011/06/18(土) 11:00:44.25
できる
533デフォルトの名無しさん:2011/06/18(土) 11:19:23.50
>>530
ある
534デフォルトの名無しさん:2011/06/18(土) 20:07:18.88
>>483
です。
遅レスすいません。

>>484
>>485
有難うございます。
if false then

GOTO文を組み合わせることで解決できました。
感謝です。
535デフォルトの名無しさん:2011/06/18(土) 21:05:58.03
>>534
それは駄目だ
GOTO文を使わなくていいように考え直せ
536デフォルトの名無しさん:2011/06/18(土) 21:40:29.90
エクセルのVBA初心者が見る参考書でお勧めはなんでしょうか?
プログラム言語は全くわかりません。エクセルのVBA以外は扱えます。
537デフォルトの名無しさん:2011/06/18(土) 21:50:43.35
>>536
Excel VBAデバッグ編 実践のツボ(九天社)

もう会社なくて絶版だけどまだ十分見つかると思う
自称初心者は是非買っとけ
538デフォルトの名無しさん:2011/06/18(土) 23:13:07.25
エクセルのVBA以外は使える…
539デフォルトの名無しさん:2011/06/19(日) 00:04:43.31
>>536
参考書?
参考書もいいけど、VBAに限らずMicroSoftの製品はまず見ておくべき所があるよ。
それはMicrosoft Developer Network、通称MSDNと呼ばれるページ。

たとえばEXCELのVBAならここ。
http://msdn.microsoft.com/ja-jp/library/ee814735.aspx#Y2000

最初は小難しい様に見えるかもしれないけど、よく読み解いて行くと
VBAがどんなものか、かなり手っ取り早く解るはず。
540デフォルトの名無しさん:2011/06/19(日) 00:11:20.67
vbaで2chに書き込むことってできる?
ブラウザ起動してとかじゃなくて
541デフォルトの名無しさん:2011/06/19(日) 00:21:32.48
>>540
つXMLHTTPオブジェクト
542デフォルトの名無しさん:2011/06/19(日) 00:37:45.61
おおちょっと勉強してみます
ありがとうございます
543デフォルトの名無しさん:2011/06/19(日) 00:40:02.83
>>540
出来る、>>541の言うようにXMLHTTP使えばVBSですら出来る。

但し、単純にSendすれば良いだけのところに書き込むよりちょっと難しい。
とりあえずCookieが解ってないと無理。まぁ、それ以前に、単純にSendすれば良いだけの
ところへの書き込み方すら解らないとかなら問題外だけどねw

でもCookie含めたHTTPの基礎知識があれば、CookieにしてもSendするデータにしても
仕様は公開されているから簡単に出来るだろう。

スレ違いなので、具体的な解説はここではできないけどね。
544丸投げスルーマン:2011/06/19(日) 02:26:39.56
やっぱり丸投げはスルーします・・><

>>531
できるぜ!、
変更したいサイズにフォームをセット→GetOpenFilename→LoadPicture→SavePicture
でいけると思う
駄目だったらapiのGetObjectとGetBitmapBitsでフォームの画像データの二次元配列がとれるから、後は気合で

>>536
すげーな
俺なんてなんとかテーブルもワークシート関数もろくに知らないぜ!

>>540
エクセルをブラウザがわりって昔誰かが作ってたぜ!

>>543
Cookieは仕組みがおかしいよなw
俺はFunction CookieWriteとかでググってどっかからコピペしたぜ!
545デフォルトの名無しさん:2011/06/19(日) 12:59:18.76
VBA初心者です。
開発支援ツール(アドインなど)で便利なものがありましたら
教えてください。
546デフォルトの名無しさん:2011/06/19(日) 14:11:07.10
アドインも自分で作ってこそ漢!!
547デフォルトの名無しさん:2011/06/19(日) 14:13:37.68

便利かどうかは個々が判断するものだ

君が何を便利と感じるかなんて知らん

自分で探して自分で便利かどうか試せ
548デフォルトの名無しさん:2011/06/19(日) 15:17:59.11
1             1
2       エンターキー三回で三行分空ける

4             2
・      エンターキー四回で四行分空ける




              3
      エンターキー二回で二行空ける
              4

「入力されてるセルを、エンターキー連打すれば連打するだけ空きセルを作る(改行する)」ってな感じの設定にするにはどうすればいいですか?
549デフォルトの名無しさん:2011/06/19(日) 15:21:16.56
EclipseとかのIDEにVBA開発用プラグインとかないのかな?
550デフォルトの名無しさん:2011/06/19(日) 16:14:04.07
>>548
そのワークシートに
押されたキーがエンターキーならば、セルを挿入する(縦にずらす)
というコードを書けば?
551デフォルトの名無しさん:2011/06/19(日) 19:23:20.55
>>550
マクロを利用して作ってみたんですが、エンターキーは無理そうなので、ctrlとxで空欄を作ることができました。
ですが、一つのセルだけにしか効果がないようなので、オートフィルする必要がありそうです。
そして、その方法が分かりません・・・・。>>551は現時点のマクロです。
訂正よろしくお願いします。
552デフォルトの名無しさん:2011/06/19(日) 19:28:34.24
Sub Macro7()
'
' Macro7 Macro
'
' Keyboard Shortcut: Ctrl+x
'
Range("A1:B1").Select
Range("B1").Activate
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Range("B2").Select
End Sub
なお、熟練者の方々なら見てもらえれば分かるかも知れませんが、ctrlキーとxを押せば「そのとなりのセルも一緒に空欄にする」となっています。
どうかご教授おねがいします。
553550:2011/06/19(日) 19:58:37.33
>>551
キー押下げのイベントがないみたいですね。
なので>>550のようにはできませんでした。すみません。

ショートカット登録でよければ、
Selection.Insert
の一文だけでいいと思います。

登録キーはCTRL+xみたいによく使うのはやめた方がいいです。
例えばCTRL+Shift+Iとかにすればいいと思います。
554デフォルトの名無しさん:2011/06/19(日) 19:58:46.10
>>549
ある
555デフォルトの名無しさん:2011/06/19(日) 20:00:02.90
>>554
どこにあるの?
556デフォルトの名無しさん:2011/06/19(日) 20:01:28.65
押入れにしまってたはず
557デフォルトの名無しさん:2011/06/19(日) 20:34:44.43
>>551
>>553の人が言ってるのをパクってEnterキーでやるやつに挑戦してみたわさ。

VBEで
シート側に記述
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Call hoge
End Sub

標準モジュール側に記述
Option Explicit

Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Long

Sub hoge()
On Error GoTo Err_Handler
If GetAsyncKeyState(vbKeyReturn) Then
ActiveCell.Insert
End If
Exit Sub

Err_Handler:
Call MsgBox("もう入れられません><")
End Sub

結構適当だから何か起こるかも知れないわさ・・・
558デフォルトの名無しさん:2011/06/21(火) 00:18:05.28
ユーザーフォームを見やすく作るのには
textboxのスタイルや
BackColorとかフォントとかどんなのが定番なんですか?

ネットにもなかなか参考になるレイアウトがなくて。
559デフォルトの名無しさん:2011/06/21(火) 00:21:22.76
設定ファイルから読み取るようにして
利用者に任せる
560デフォルトの名無しさん:2011/06/21(火) 00:42:41.20
とりあえず文字をでかくして、容赦なくボタンに色をつける。
下手に小奇麗なデザインより、利用者を最優先する思い切った作りの方が
意外と喜ばれる事が多い。
561デフォルトの名無しさん:2011/06/21(火) 23:53:28.36
>>560
フォーム自体の色(背景色)って
グレー系のほうがいいのか迷う俺はどうしたらいいですかね?
どれが視認性いいんだろ。
突き詰めるとカラーコーディネーターとかになるんだろうけど。

テキストボックスは、昔ながらのへっこんだ感じがいいのか、(Falseのときは透過にする)
時代は、フラットな感じなのかわからない。
562デフォルトの名無しさん:2011/06/22(水) 00:42:43.63
何のツールかによるな。
身内で使うツールなんかだったら色は自分の好みとセンスでってところはあるけど、
銀行系の上流システムに取り込まれるファイルを出力する様な、上流のユーザーさんが使うツールとかだったら
思いっきり地味に作って無難にしておくかな。
ボタンの配置は作業手順に併せて、ボタンの大きさとフォントは統一するか、
特によく使うボタンは大き目に作っておくかってくらいだけど、
まぁあくまで自分だったらと言う話だけど、制約が無ければ折角のEXCELなんで
フォームは使わないでシートを駆使するかな。
バリデートは出来る限りシートの数式に仕込んで集約したセル1こ見ればいい様にしたいし、
ボタンもシェイプにしといてリボン型とかにしとくと大分イメージが変わるし。
563デフォルトの名無しさん:2011/06/22(水) 01:15:37.41
>>562
営業・売上日報や請求明細書関連です。
自分でつくって、せいぜい3人程度でしか使わないなら、シート使ったほうがいいのかな。
必死に勉強してフォームとかクラスとかできるようになってきたんだが。

シート駆使ってどんな感じなのですか?
564デフォルトの名無しさん:2011/06/22(水) 01:24:24.97
>>562
入力フォームを処理をシートで済ませるってことですか?
たしかにフォームで、テキストボックスを表状に並べたりしましたが
見にくいなって思ってました。

複数行ある上記のテキストボックスの表の各行の合計を自動で計算するのに
クラス勉強したり。

やればやるほどフォームの利点がわからなくなってきました。
エクセルVBAのユーザーフォームの利点ってなにかあるんでしょうか?
565デフォルトの名無しさん:2011/06/22(水) 02:09:20.99
>>564
フォームを使うことで他のフレームワークで作ったものと、統一性を図ることが出来る。
例えばアドインファイルにしておいて、立ち上がり時にEXCELのアプリケーションを非表示にしてフォームを表示すれば
見た目VBやC#で作ったのと体して変わらない様なものが作れる。
後はフォーム特有のイベントが有った様な無かった様な・・・
まぁ今までEXCELでフォーム使わないで困ったこと無かったけどね。
逆にファイルを閉じた場合、フォーム中心に考えていたら変数にファイルが閉じる前の値を
継続して使わせたい時、結局シートや外部ファイルに値を残したりそれなりの仕組みを作らなければならないことを考えると、
最初からシートでいいじゃんて事になったり、INIファイルもコントロール用のシートを作ることで
外部ファイルにしなくてもまかなえたりする。
まぁでもあくまで自分だったらということであまり拘らないでいいと思うよ。
566デフォルトの名無しさん:2011/06/22(水) 02:20:56.81
ああ、別にアドインファイルにしなくてもEXCELのアプリケーション非表示にすればいけるかな?
567デフォルトの名無しさん:2011/06/22(水) 17:54:06.24
セルに入力されている数値分だけ、その行すべてコピーして下に数値分挿入ってどんな構文書けばいいでしょうか。

コピー挿入が終われば、次の行の数値を読んで、また同じ処理を繰り返したいです
568 【東電 84.2 %】 :2011/06/22(水) 19:08:59.28
>567
丸投げなら ビジネスsoft板/Excel総合相談所97 へどうぞ
569デフォルトの名無しさん:2011/06/22(水) 21:02:39.15
Valueプロパティって、エクセルのシートへの文字入力、値の取得以外にも
役割があるんですか?

参考書勧めてたらユーザーフォームの項目でも見慣れる形で出てきたのですが・・・

もうひとつですが、変数の宣言に関しての質問です

「Dim 変数名 As データ型」と宣言方法はなると参考書に書いてますがAs データ型以降は省略しても
大丈夫なんでしょうか?(´・ω・`)初学者で困っています
570デフォルトの名無しさん:2011/06/22(水) 21:14:38.54
>>569
value省略してたら、数字が文字列として転記されたりする。

as移行を省略したら、宣言する意味がない。
571デフォルトの名無しさん:2011/06/22(水) 21:44:40.10
>>569
その辺、その参考書には書いてないのか。
なんちゅう参考書だ。

まずValueは値。シートに限らず、また、文字列に関わらず値を司るプロパティ。

変数の型は省略すると、Variantと言う型が割り当てられるけど、これがメモリを16バイト以上食う。
例えばInteger型などは2バイトしか使わないが、この型で済む様な値しか扱わない様な場合、
型を設定しなければしない分だけ無駄なメモリ領域を消費し圧迫して処理速度にも影響を与える事もある。

とりあえずコードを書く際、先頭行にOption Explicitと書いて、使う変数は例えVariantであってもそれを
明示的に型指定する様に記述する事をお勧めする。

特に型の指定は後々Object指向言語を使う事になった場合、VBAとは比較にならないくらい
色々な制限や使い方があるので、そちら方面に進みたいならせめて型の宣言は常に行う癖を付けておいた方がいいと思う。
572デフォルトの名無しさん:2011/06/22(水) 23:43:36.89
環境 OS WinXP Excel2003

Felicaカードリーダを用いて、VBAのユーザーフォームで、Felicaカードの読み込み機能を作成しています。
ユーザーフォームが表示されている場合のみ、カードの読み込みを受け付けたいのですが、
VBAってApplication.onTime以外に、イベントのような扱いはできないものでしょうか?
573デフォルトの名無しさん:2011/06/23(木) 00:25:28.22
>>572
APIでフォームのハンドル探せばいいんじゃないの?
574デフォルトの名無しさん:2011/06/23(木) 06:06:50.62
WinAPIやハンドルなんて解らないとか言い出しそうだが
Excelとは関係ない部分なので、なんにしろスレ違いだな。
575デフォルトの名無しさん:2011/06/23(木) 07:23:46.36
>>573
ご返答ありがとうございます。フォームのハンドル関連からググッてみます。

>>574
たしかにWinAPI等詳しいと呼べるちしきはないですね。
ただ、Excelの機能で待ち受け状態が擬似的にできればよいので、
そのような方法がないかさがしておりました。

どちらにしろ、お二方ご返答ありがとうございました。
576デフォルトの名無しさん:2011/06/23(木) 09:53:12.59
できるよ
577デフォルトの名無しさん:2011/06/23(木) 12:04:53.33
VBAで組み込み関数と同じ名前の変数を作ってしまったんだ。(先頭の文字が小文字になっている変数)

インテリセンスがうまくきかなくなってしまったんだけど…どうしたら元に戻せますか?
578デフォルトの名無しさん:2011/06/23(木) 16:27:12.09
>>577
dimを消す
579デフォルトの名無しさん:2011/06/23(木) 18:01:56.89
>>578
消してあります。
なのにちゃんと機能してくれません…

クリーンがあればよかったとつくづく思います
580デフォルトの名無しさん:2011/06/23(木) 18:41:41.79
>>579
再度宣言し直す
例えばmsgboxと、変数を作ってしまったら
Dim MsgBoxと、VBEに書いてから
このDim〜を消す
581デフォルトの名無しさん:2011/06/23(木) 18:58:24.32
エクスポートしてインポートするといいんだな
582デフォルトの名無しさん:2011/06/23(木) 19:06:12.15
印刷時の印字濃度を制御するコーディングは可能でしょうか?

めちゃくちゃ薄い印字がしたいのです。
583 忍法帖【Lv=2,xxxP】 【東電 84.1 %】 :2011/06/23(木) 19:49:39.54
>582
プリンタドライバでの設定じゃダメなの?
584デフォルトの名無しさん:2011/06/23(木) 19:58:52.19
できるよ
585デフォルトの名無しさん:2011/06/23(木) 20:05:49.55
それを実現するための、メソッドとプロパティを教えていただけませんか?
586デフォルトの名無しさん:2011/06/23(木) 22:18:53.61
>>580,581
できたっ…本当にありがとう…!
587デフォルトの名無しさん:2011/06/23(木) 23:03:07.11
印字濃度が変更できるプリンタってそんなにないでしょ
できてもせいぜい3段階ぐらいだよね
制御方法も機種ごとに全然違うし

それよりも文字や罫線を明るい灰色に変更してグレースケールかカラーで印刷した方がよくない?
588デフォルトの名無しさん:2011/06/24(金) 07:39:40.50
やっぱり無料なんですかね。どうしてやりたかったというと、社内のインク代節約を実現したかったからです。
589デフォルトの名無しさん:2011/06/24(金) 11:18:06.47
ドラッグ&ドロップを常に切り取りにする方法ってある?
vbaとは関係ないがw
590デフォルトの名無しさん:2011/06/24(金) 11:24:48.25
× ドラッグ&ドロップを常に切り取りにする方法
○ ドラッグ&ドロップを常に切り取り貼り付けにする方法
591デフォルトの名無しさん:2011/06/24(金) 11:26:38.49
>>589-590
Shiftを押しながらドラッグ&ドロップ
592デフォルトの名無しさん:2011/06/24(金) 11:29:25.34
Shiftを押すのは邪魔くさいので、
どこかのチェックボックスをon/offすることでできない?
593デフォルトの名無しさん:2011/06/24(金) 12:26:55.78
お前らそろそろEXCEL-DNAに移行しろよ。
幸せになれるぞ。
594デフォルトの名無しさん:2011/06/24(金) 12:47:48.76
なんたよDNAって
595デフォルトの名無しさん:2011/06/24(金) 12:53:45.82
>>592
Shiftキー連打しろ
596デフォルトの名無しさん:2011/06/24(金) 13:25:20.40
>>594
http://exceldna.codeplex.com/

VBAの代わりにC#やVB.NETが使えるようになる。
Visual studio(EXPRESSで十分)で開発できるだけでも効率が上がるし、
処理速度もC#>VBAだし、今のところ欠点が見あたらない。
Excel97でも動くそうだぞ。
597デフォルトの名無しさん:2011/06/24(金) 13:51:41.45
On Error Gotoについて質問です。(EXCEL 2003)

現在DBのような規則的に並んでいるデータからキー値を取得して、
そのデータをデザインしたフォーマットに基づきEXCELファイルに出力させようとしています。
  ※↑は説明用に作りました。(キー値は手入力の為、どうしても重複する事がしばしば)


上記のマクロ組んでいるのですが、キー値が被ってエラーが発生する事があります。
なので、キー値が被っていたら次のデータへいくように下記のようにエラー処理をいれてみました。
悩んでいるのは、エラー発生時に全て定義したGOTO文へ飛んでしまうのですが、回避策ありますでしょうか?

sub TEST()

On Error Goto NEXT

if CheckKeyData then 'キーチェックし重複であれば NEXTへ
 Goto NEXT
end if

sheets("aaa").select 'もし、ここでありもしないシートを選択したとしても、NEXTへいってしまいます。

NEXT:

end sub

よろしくおねがいします。
598デフォルトの名無しさん:2011/06/24(金) 13:53:32.53
>>597 です。

説明不足失礼しました。
キー値はEXCELに手入力で打ち、EXCELからマクロ実行するとDBのようなファイルへアクセスし、
データひっぱってくるよにしています。
599デフォルトの名無しさん:2011/06/24(金) 14:04:28.53
ラベルを2つに分ける
600デフォルトの名無しさん:2011/06/24(金) 14:09:02.59
>>596
なん……だと……
エクセルをdotnetで動かせるわけじゃないよな?
601デフォルトの名無しさん:2011/06/24(金) 14:09:07.52
>>599
ラベル効果を無効にしてしまうような機能があればと思いましたが、
やっぱりラベル複数用意しないと回避はできないのですね・・・
ありがとうございました。
602デフォルトの名無しさん:2011/06/24(金) 14:43:02.06
On Error GoTo 0を入れれば
603デフォルトの名無しさん:2011/06/24(金) 14:50:39.84
>>600
http://goo.gl/RtO4B

ここ日本語だから順番に読めば感じが掴めると思う。
スレチすまん。
604デフォルトの名無しさん:2011/06/24(金) 23:25:43.21
自分でチェックしてGotoするなら、On Errorいらないと思うんだが...
605デフォルトの名無しさん:2011/06/24(金) 23:40:03.96
VBAでシストレしてる人
データはどこからとってる?
606デフォルトの名無しさん:2011/06/25(土) 00:34:59.95
散布図に最初は目盛りの最大値を自動で合わせる状態にして計算をして
計算が終わったらxとyの目盛りの最大値を比べて高い方の値に両方を合わせたいのですがどうすればいいでしょうか
sheet1のグラフ2です
607デフォルトの名無しさん:2011/06/25(土) 01:36:28.25
事故解決しました
608デフォルトの名無しさん:2011/06/25(土) 11:00:02.63
VBAでindirectするにはどうしたらいいですか?
例としてセルA1に"Sheet2!B2"と書いてあって、A1の通りSheet2!B2に"×"と記入する
609デフォルトの名無しさん:2011/06/25(土) 11:02:58.48
前スレにありました
事故解決しました
610デフォルトの名無しさん:2011/06/25(土) 12:06:31.50
>>603
EXCELのVBE上で入力補完付きで編集出来る様になるなら期待するけど、
そうじゃなきゃVS上で作ってdllにして参照した方が早いからイラネ
611デフォルトの名無しさん:2011/06/25(土) 12:50:21.80
Xについての4次方程式を解きたいのですが
これはゴールシークを使ってどのようにすればいいのでしょうか?
よろしくお願いします。
612デフォルトの名無しさん:2011/06/25(土) 13:25:09.72
UserForm1を二つ表示することは可能でしょうか?
同じのを二つ作らないとだめなんですかね
613デフォルトの名無しさん:2011/06/25(土) 18:16:00.74
不可能なはず
でも、同じのを2つ作れば完璧に解決することなんだから、それでいいじゃん
どんなに複雑なフォームだろうと、全く同じのを作るなら、ほとんど手間かからないし
614デフォルトの名無しさん:2011/06/25(土) 18:29:54.16
コピペして終わりだろ・・・
615デフォルトの名無しさん:2011/06/25(土) 21:57:41.25
他のブックに現在開いているブックから
セルの中に変数名を含む式を記述する方法について質問です。
dim 数字 as integer
Workbook.Worksheets("Sheet1").Cells(1, 1).Formula = "=数字 * 100"
とやると、「=数字 * 100」とそのまま入ってしまい上手くいきません。
どのように記述すれば良いのでしょうか?
よろしくお願いします。
616 忍法帖【Lv=2,xxxP】 【東電 75.4 %】 :2011/06/25(土) 22:08:11.44
>615
).Formula = "=" & 数字 & "* 100"
617デフォルトの名無しさん:2011/06/25(土) 22:51:51.08
Month関数を使いたいのですが
month()と小文字になって、配列がありませんとエラーになります
どうしたら良いですか?
618デフォルトの名無しさん:2011/06/25(土) 22:56:24.22
定義されてないんだろ
619デフォルトの名無しさん:2011/06/25(土) 23:16:35.44
month という 変数 を宣言してない?
620615:2011/06/25(土) 23:32:36.09
>>616
答えてくれてありがとうございます。
助かります。
621デフォルトの名無しさん:2011/06/25(土) 23:35:40.75
>>617
文を書いてみろ
622デフォルトの名無しさん:2011/06/26(日) 00:03:04.90
A1にaaa.xls
A2にbbb.xls
と合った場合に
もしExcelファイルと同じフォルダにaaa.xlsやbbb.xlsがあった場合
それぞれリンクをつけてそのボタンを押下すると自動的に起動させたいのですが
可能でしょうか?

当然なかった場合にはリンクは張らない状態です
623デフォルトの名無しさん:2011/06/26(日) 00:14:20.37
できる
624 忍法帖【Lv=1,xxxP】 :2011/06/26(日) 00:26:36.65
IF文について質問です
If c >= 1 Then 〜
「1」を別のワークシートのA3〜Z3までの値にする場合
どのように書いたらいいのでしょうか?
625デフォルトの名無しさん:2011/06/26(日) 00:42:44.00
なんか同じ奴がつまらん質問を繰り返しているようだが
気のせいか?
626デフォルトの名無しさん:2011/06/26(日) 00:53:01.60
ヒント:ゴッゴル先生
627デフォルトの名無しさん:2011/06/26(日) 05:53:52.09
>>614
ユーザーフォームの内容によってはエクスポートして、ユーザーフォーム名だけ変えてインポートした方が早い

>>624
論理演算かループで
628デフォルトの名無しさん:2011/06/27(月) 01:22:08.21
(ブック名)は既に開いています。 二重に開くとこれまでの変更内容が失われます。
といったエラーが出ることについて質問があります。
Dim thisBook As Workbook
Set thisBook = ThisWorkbook
Set Workbook = Workbooks.Open(thisBook.Path & "\test.xlsx")
ThisWorkbook.Activate
中略
Workbook.Worksheets("Sheet1").Cells(1, 1).Value = ID
というようにこれだと1回目の書き込みは上手く行きますが
2回目以降が上記のエラーが出て上手くいきません。
http://www.excel.studio-kazu.jp/kw/20071007202040.html
ここを参考に
If flg = False Then の下にブックが開いていない場合の処理として開くように
Set Workbook = Workbooks.Open(thisBook.Path & "\test.xlsx")
と書いてみたのですが駄目でした。
どこが悪いのか教えて頂けると非常に助かります。よろしくお願いします。
629デフォルトの名無しさん:2011/06/27(月) 05:57:42.37
1回処理が終わる毎にちゃんと閉じてるの?
閉じずに開くばかりじゃ、エラーも当然だろw

2回目にまた開くなら、1回目が終わったところできちんと閉じる
1回目が終わっても閉じないなら、2回目は新たに開くのではなく
既に開かれているものを利用する

そんな当たり前のことをちゃんとやれば問題ないと思うが
630デフォルトの名無しさん:2011/06/27(月) 11:24:28.95
質問させてください

エクセルのバージョン(2010とか2000とか)を調べる方法を教えてください お願いします
631デフォルトの名無しさん:2011/06/27(月) 11:43:07.35
Application.Version
632631:2011/06/27(月) 11:46:34.09
Application.Versionでぐぐってこういうのがあった
2010は持ってないから知らん

sVer = Application.Version
Select Case sVer
Case "12.0"
MsgBox "Excel2007"
Case "11.0"
MsgBox "Excel2003"
Case "10.0"
MsgBox "Excel2002"
Case "9.0"
MsgBox "Excel2000"
Case "8.0a"
MsgBox "Excel97 SR-1"
Case "8.0"
MsgBox "Excel97"
Case "7.0"
MsgBox "Excel95"
Case Else
MsgBox "不明"
End Select

633デフォルトの名無しさん:2011/06/27(月) 12:20:10.64
質問する前にちょっとはググれよ。
2chに書くのもGoogleの検索窓にキーワード書くのも手間は変わらんだろ?
634デフォルトの名無しさん:2011/06/27(月) 12:22:19.72
ありがとうございます!
635デフォルトの名無しさん:2011/06/27(月) 19:46:29.94
非表示シートを再表示するのに Worksheet.Visible = True とすると
「'Visible' メソッドは失敗しました」と出るのですが、原因が判りません
表示したシートに対して Worksheet.Visible = False は動きます
環境はWin7、Excel2003です
よろしくお願いします
636デフォルトの名無しさん:2011/06/27(月) 19:56:23.91
対象が間違っている
637デフォルトの名無しさん:2011/06/27(月) 20:08:48.59
それだとFalseの方も動かないと思うんですよ
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("aaa")
ws.Visible = True
 :
ws.Visible = False
638デフォルトの名無しさん:2011/06/27(月) 20:36:20.98
>>637
Excel2000だと、自動計算か何かの設定によってVisibleが失敗するってバグがあった気がする
2003はどうかなあ

変数wsがどっかで変更されてない?
とりあえずテスト用のプロシージャを作って最小限のコードで試してみ

Sub 表示テスト()
  Dim ws As Worksheet
  Set ws = ThisWorkbook.Worksheets("aaa")
  ws.Visible = False
  ws.Visible = True
End Sub
639デフォルトの名無しさん:2011/06/27(月) 21:05:56.79
>>638
XP、Excel2000ではエラー出なかったです
今Excel触れないので後日テスト用コードを試してみようと思います
640デフォルトの名無しさん:2011/06/27(月) 22:09:04.34
Range("A1").Formula = "=SUM(A2:A3)"
と、上のような足し算等をCellsを使ってやりたいのですが
Cells(1, 1).Formula = "=SUM(Cells(1, 2):Cells(1, 3))"
と書いても駄目で、他にも試してみましたが上手くいきませんでした。
どのように書けばよろしいでしょうか?
よろしくお願いいたします。
641デフォルトの名無しさん:2011/06/27(月) 23:24:08.01
>>640
Cells(1, 1).Formula = "=SUM(" & Cells(1, 2).Address(0, 0) & ":" & Cells(1, 3).Address(0, 0) & ")"
642デフォルトの名無しさん:2011/06/27(月) 23:25:42.26
>>640
訂正。>>641だとSUM(B1:C1)になる

Cells(1, 1).Formula = "=SUM(" & Cells(2, 1).Address(0, 0) & ":" & Cells(3, 1).Address(0, 0) & ")"
643640:2011/06/28(火) 00:20:40.00
>>642
ありがとうございます。
Address(0, 0)と書くとは全くしりませんでした。
勉強しておきます。
ありがとうございました。
644デフォルトの名無しさん:2011/07/02(土) 09:12:51.83
VBAで再帰使うとすぐスタックオーバーフローとか出るね
645デフォルトの名無しさん:2011/07/02(土) 09:33:55.55
まぁ「すぐに」って言うのもどれぐらいを指してすぐなのかと言うのはあるけど、俺も再帰処理はキライ。
階層を持つ様なものを生成させる場合でも、なるべく避けるな。
646デフォルトの名無しさん:2011/07/02(土) 12:16:24.74
Rangeのデフォルトプロパティについて質問です。

For Each r In Range("A1").Value
  Debug.Print r
Next

↑で1行目でエラーが発生するのは分かるのですが、

For Each r In Range("A1")
  Debug.Print r
Next

↑のようにValueプロパティを省略した場合に、
エラーが発生しない理由が分かりません。

Rangeでプロパティを省略した場合は、
デフォルトであるValueプロパティが選択されると思っていたのですが、
何か別のプロパティが選択されているのでしょうか?
647デフォルトの名無しさん:2011/07/02(土) 13:45:02.52
For Each r In Range("A1")
 の Range("A1")
 は Valueプロパティ(又は他のプロパティ) が省略されたものではなく
 Rangeオブジェクト(が返される)だから
648デフォルトの名無しさん:2011/07/02(土) 14:52:05.30
Rangeの既定のプロパティはValueではない

バージョンによってヘルプの記載もよくわからない状態になってるんだが
すくなくとも、2007のヘルプで Range.Cells プロパティ を見てみると
>Item プロパティは、Range オブジェクトに対する既定のプロパティであるため
と書いてある

オブジェクトブラウザで確認するとホントは_Defailtっていう隠しプロパティだったいする
で、こいつが場合によってItem(=Cells)のようにふるまったりValueのようにふるまったりする
なので、この場合は
For Each r In Range("A1").Cells と同じ意味
明示的にこう書く方が解りやすくて俺は好きだ

まあ、あんまりデフォルトプロパティを使うのはよくない
649デフォルトの名無しさん:2011/07/02(土) 15:11:21.83
C#とかだとデフォルトプロパティが禁止されたから、意識するべきではあるな
VBAもやがて.NETに移行するのかも知れんし
650デフォルトの名無しさん:2011/07/02(土) 16:09:28.63
いいねぇ.Net。
C#Aとかになって、今のモジュールやクラスモジュールごとにモジュールを分けるんじゃなくて、
名前空間ごとにファイルを分けたり、継承だけじゃなく、ポリモーフィズム効かせられたり、
ジェネリックやデリゲートやラムダ式とか使えれば最高なんだけどね。

もっとも、今までのVBAの資産があるから中々難しいだろうけどね。
651デフォルトの名無しさん:2011/07/02(土) 18:56:05.91
>>650
つ EXCEL-DNA
652デフォルトの名無しさん:2011/07/02(土) 21:13:58.22
>>651
だからファイルが分かれるなら余りうま味が無いって。
VSからdllファイル作った方が早い。入力補完も効くし。
653デフォルトの名無しさん:2011/07/03(日) 00:26:18.34
むしろデータとアルゴリズムの分離って意味ではファイルが分かれた方が良くね?
アドイン化した後のファイルの配布の管理が面倒だけど。
654デフォルトの名無しさん:2011/07/03(日) 07:20:43.64
>>653
>むしろデータとアルゴリズムの分離って意味ではファイルが分かれた方が良くね?

それはどんなシステムとして使うかによりけりだけど、
ファイルを分割して各機能を分けるくらい大掛かりなものなら
データはAccessやSqlServer、Olacleなどで持って、ロジック部は.NetFrameworkやJavaとかで作成して、
出力物としてExcelを使う様にした方がそれぞれの長所を活かせる。

そうなると、基本ロジック部は.NetFrameWorkやJavaとかで扱うことになるから、
益々Excel-DNAとやらの出番は無くなることになると思うよ。
655デフォルトの名無しさん:2011/07/04(月) 10:30:14.23
VB.netちょっとやってて
VBAに来てナンジャコリャーって思うのが
「コロンイコール(:=)」これ

イコールとどう違うの?
656デフォルトの名無しさん:2011/07/04(月) 10:56:04.89
プロパティ設定
dotnetでもあるだろ
657デフォルトの名無しさん:2011/07/04(月) 11:36:15.90
>>654
>益々Excel-DNAとやらの出番は無くなることになると思うよ。

試しもしないで必死に避難してるの?
まあ、それはさておき、

VSが使える > ファイルが分割される
.NETが使える > ファイルが分割される
って言う人もいるだろうよ。
俺はVBA資産が多いのでいきなりは移れないけど、面白い
アイデアだと思うよ。
658デフォルトの名無しさん:2011/07/04(月) 12:18:41.51
ファイル分割ってのがいまいちわからんな
ソリューションファイルとかbinフォルダが生成されるとかだと、エクセルやアクセスが単体で動作出来なくなるじゃないですか、やだー!
いずれdotnetに移行するとは思うけど、VSからリリースされ、かつオフィスソフト単体で製造出来るVBA.NETになると思いたい
相互開発可能な形で、モジュールインポート見たいにプロジェクトに組み込まれる方式ににていただきたい
659デフォルトの名無しさん:2011/07/04(月) 12:51:13.43
>>657
避難してどうする。

ファイルが分かれるってメリット大じゃん。
あの糞使いにくいVisual Basic Editorわなくて済むんだから。
一旦Visualstudio使い始めるとVisual Basic Editorは苦痛でしかないよ。
660デフォルトの名無しさん:2011/07/04(月) 13:07:11.96
あのIDE使いにくいところもあるんだが
わざわざ手打ちしてるのに勝手にインテリセンスに修正したり、インテリセンスにあるのに別候補に書き換えたり
機能を個別に設定出来ないし
まじでストレス溜まる
661デフォルトの名無しさん:2011/07/04(月) 19:01:41.43
Excel2007

フォーム上に貼りつけたボタンに付いては例えば
xxbtn.Enabled=True
xxbtn.Enabled=False
みたい有効・無効を設定できるけど
シート上に貼りつけたボタンに付いては
有効・無効を設定できますか?それ以前にそのボタン名をどうやって
取得できるのかってのもあるんですけど。。。
662デフォルトの名無しさん:2011/07/04(月) 20:44:12.54
>>657
だからそうなるんなら、最初からVS使えって話。
VS上で.NetFrameWorkの言語から
EXCELを操作すればいい。
663デフォルトの名無しさん:2011/07/05(火) 10:30:21.42
>>662
もう一回だけ言うけど、試してから文句言ったら?

VisualstudioからEXCEL使おうとすると、普通はあのめんどくさいCOM経由で
アクセスする必要があるだろ?EXCEL-DNAなら.NETの機能を使用しつつ、
COM経由のアクセスの面倒さを回避できるんだよ。
豊富な.NETの機能もつまみ食いできるしな。

試してから気にくわなければ、使わなければ良いだけだと思うけど。
664デフォルトの名無しさん:2011/07/05(火) 23:25:31.30
C とか C++ ならいざ知らず、VB.NET とか C# ならたいして面倒じゃないだろ。
どうみても試す価値なしだと思うので、俺には不要。
665デフォルトの名無しさん:2011/07/06(水) 00:16:45.31
>>664
C#はデフォルトプロパティの省略ができないだけでなく、パラメタの規定値の設定ができない
ExcelをCOMオブジェクト経由で呼び出すのは非常に面倒、というか冗長
Type.Missingの嵐になる

分からないなら、お前さんのExcelVBA上で、パラメタの省略を一切せずに全てカンマを入れてみろ
666デフォルトの名無しさん:2011/07/06(水) 00:27:50.43
俺もどこの馬の骨が作ったか分からない
大して人柱にも精査されていない
ひょっとしたらウイルスが仕込まれているかもしれない様なのを手放しで入れるのは嫌だな。
667デフォルトの名無しさん:2011/07/06(水) 07:42:25.55
>>665
4.0以降ならそんなこともないんじゃなかったっけ?
668665:2011/07/06(水) 07:56:59.76
>>667
RCWのこと?4.x系で書いたことないからよく知らんのだけど
確かにオプションで引数、名前付き引数が追加されたようだね
COM資産は未だに影響が大きいようだ

でも大体Excelのバージョンは決めうちできないから遅延バインディングで
書くことになるだろうし、リフレクションを通さなくちゃいけなかったりと割と面倒
VBだともうちょい楽に書けるようだけど
669デフォルトの名無しさん:2011/07/06(水) 11:46:25.28
>>665
この御仁たぶんC#もまともに使ったこと無いでしょ。
相手するだけ無駄だと思うよ。
670デフォルトの名無しさん:2011/07/06(水) 13:46:21.72
つか、Excel-DNAが何者か良くわかってないで書いてる奴大すぎ。
まず、ここ読んでね。
http://supermab.com/wp/%E3%81%AA%E3%81%9C-excel-dna-%E3%81%AA%E3%81%AE%E3%81%8B%EF%BC%9F/
671661:2011/07/06(水) 14:59:21.71
回答してくれそうな雰囲気なしなんでこの質問は閉じます
672デフォルトの名無しさん:2011/07/06(水) 15:45:34.74
ボタンを押したらオートシェイプを出すっていうプログラムが書けたのですが、
押すたびに座標をずらして図を表示させたいのですがボタンの判定をifの条件式
に入れる方法ってありますか?
673デフォルトの名無しさん:2011/07/06(水) 16:22:57.35
>>671
質問ならならあげとけよ
Sheet1.Shapes("Button 1").ControlFormat.Enabled = False
Sheet1.CommandButton1.Enabled = False
とか

>>672
ボタンの判定をifの条件式に入れるってどういう意味だ?
普通はボタンを押してからコードで判定すると思うんだが
674デフォルトの名無しさん:2011/07/06(水) 16:35:15.41
>>673
ボタンを押すたびに座標に数値をプラスしていく感じかとおもって
if ボタンが押される then 座標に値を足す
みたいにできないかと思いまして
675デフォルトの名無しさん:2011/07/06(水) 21:03:31.39
ひょっとしてボタンってキーのこと?
だったらAPI使えば出来るよ。スレチだけど。
676デフォルトの名無しさん:2011/07/06(水) 23:14:11.08
>>674
ボタンを押したら、シェイプを(ずらして)表示させるんだろ?
つまり、ボタンを押した処理の中で判断すればいいのでは

イベントとかよくわかってないレベルの人か?
677デフォルトの名無しさん:2011/07/06(水) 23:38:20.63
VBAでウィルスって作れるの?
678デフォルトの名無しさん:2011/07/06(水) 23:46:03.09
ファイルの特定の二列の入力値の組み合わせは4種類しかありえなくて、その4種類の組み合わせに応じて
その行の他の列のセル内容を転記するかどうかを決めさせたくて、FindやIfを使えば簡単に書けそうだと思って
朝からこの時間まで格闘してましたが、できませんでした・・・

 A B C  D
1○○
2○×
3×○
4××
5○○
6×○
7××
8○×

単純化するとこうなっていて(行の多さはファイルによって変動し、常に8行とは限らない。ただしA〜の横方向の入力内容は常に固定)。
そして、Cells(i, A) と Cells(i, B)の組み合わせが

AB=○○ → 何もしない
AB=○× → 何もしない
AB=×○ → その列の(C,D...)はコピー対象
AB=×× → 何もしない

そしてまずCells(i, A) と Cells(i, B)の組み合わせが○×の行が一つもないファイルは閉じて
一つでもあるファイルは、個々の行をコピーするようにしたいのですが・・・・簡単に見えて全くできませんでした

「○×」の行が一つもないかどうかをフラグで返す方法だけでも宜しいので、ヒントなり戴けないでしょうか?
679デフォルトの名無しさん:2011/07/07(木) 00:07:49.13
>>678

いまひとつ何がしたいのか分からないんだけど
普通にこんな感じで駄目ですか?

ファイルを開いて

フラグをOFFに

(行について繰り返し開始)
 もしこの行が空白なら行についての繰り返しを抜ける

 もしこの行のA列が○ かつ B列が×ならフラグをONにする

 行をひとつ進める 
(ここまで行についての繰り返し)

もしフラグがONならコピー処理をする

ファイルを閉じる



680デフォルトの名無しさん:2011/07/07(木) 00:30:35.64
>>678
'指定範囲で○×の行を探す あればTrue なければFalse
Function checkOX(CheckRange As Range) As Boolean
    Dim i As Long
    checkOX = False
    If CheckRange.Columns.Count <> 2 Then
        MsgBox "2列を指定してください"
        Exit Function
    End If
    For i = 1 To CheckRange.Rows.Count
        If CheckRange.Cells(i, 1).Value = "○" And CheckRange.Cells(i, 2).Value = "×" Then
            checkOX = True
            Exit Function
        End If
    Next
End Function
681デフォルトの名無しさん:2011/07/07(木) 00:40:23.24
>>678
ヒント:imp演算子
682デフォルトの名無しさん:2011/07/07(木) 01:10:44.50
>>681
長いことBASIC使ってるけど、そんな演算子初めて知ったわ
一つ勉強になった
ただ、.NETで廃止されてるらしいし、この先使うことない知識だろうけど
683デフォルトの名無しさん:2011/07/07(木) 01:25:25.68
Excel2007のマクロが遅いことで質問させてください
あるフォルダにあるすべてのブックの各シートを一枚のシートに貼り付けなおすマクロを作っています。
ただExcel2003では問題無く動くのですが、
Excel2007で互換モードまたはxlsmで保存しなおして動かすと
最初は早く処理されているのですがだんだん処理が遅くなっていきます。
(Application.ScreenUpdatingはTrueのままですがFalseでも変わりありません)

また、処理が遅いときにExcelの画面外をクリックすると(Excelを非アクティブにすると)
途端に処理が高速に戻ります。

同じ経験をした方等、対処方法わかるかたはいらっしゃいますでしょうか?
684デフォルトの名無しさん:2011/07/07(木) 03:48:59.52
セルをバリアント型に入れて計算していて
途中でApplication.WorksheetFunction.Sumなど使いたいとき
バリアントの特定領域をRange型に変換するスマートな方法教えてください。
685デフォルトの名無しさん:2011/07/07(木) 05:22:58.04
>>684
ホントにセルがバリアント型変数に入ってるなら、その変数はすでにRange型だが?
Rangeに対してオフセットとりたいならRange.OffsetプロパティとかRange.Rangeプロパティ使え

Set c1 = Range("B2:C11")
Set c2 = c1.Range("B1:B10")
これでc2はC2:C10のRange型だぞ

だがまあ多分そういうことじゃないんだろうけど

バリアントの変数に入ってるのが値の配列なら
実際のセル(Range)に代入するしかないんじゃね

VBAで配列の特定範囲を切り出すスマートな方法はしらね
先頭からならReDim Preserveってのもなくはないが、もともと配列は
途中でサイズ変更するような用途向けではない
まあ必要なら関数1個つくっとけば良いだけだし
686デフォルトの名無しさん:2011/07/07(木) 05:56:44.44
>>685
Set c1 = Range("B2:C11")
Set c2 = c1.Range("C2:C10")
↑これやってみましたけど出来ませんでした。

Dim sh As Worksheet
Set sh = ThisWorkbook.Worksheets("Sheet1")
Dim cB As Variant
cB = sh.Range(sh.Cells(1, 1), sh.Cells(10000, 20))

Dim rng As Range
Set rng = cB.Range(cB.Cells(1, 10), cB.Cells(10000, 10)) ←イメージとしては、こんな風にRange型に入れたいです
687デフォルトの名無しさん:2011/07/07(木) 06:18:14.88
>>685
すいません出来ましたSetが付いてないだけでした
ありがとうございました!
688デフォルトの名無しさん:2011/07/07(木) 07:07:50.04
>>684
VBAを使わない。
全部Excel側でやる。
689678:2011/07/07(木) 07:22:58.09
ありがとうございました!
助かりました
690デフォルトの名無しさん:2011/07/07(木) 23:00:11.25
>>665
> C#はデフォルトプロパティの省略ができないだけでなく、
> パラメタの規定値の設定ができない

C# 4.0 も知らない情弱か...、かわいそうになってきたよ。

>>668
よく知らないなら、ROM って1人で Excel-DNA とやらを使ってろよ。
また恥かくだけだぞ。

>>669
流石にこれは恥ずかしすぎ。
誰からも相手されてないんだろうな (w
691デフォルトの名無しさん:2011/07/08(金) 00:08:11.90
またキモいExcel-DNA儲が湧いてきたな
692デフォルトの名無しさん:2011/07/08(金) 00:18:16.68
どこをどう読んだら儲に見えるんだ?
693デフォルトの名無しさん:2011/07/08(金) 10:24:44.57
A1からD10まで0を入れたいんだけど
C列はそのまま放置したい
っていう時に
For s = 1 To 10
Sheet1.Range("A" & s) = 0 'A1からA10までを初期化
Sheet1.Range("B" & s) = 0 'B1からB10までを初期化
Sheet1.Range("D" & s) = 0 'D1からC10までを初期化
Next s
こうやってるんだけど、他に方法ある?
694デフォルトの名無しさん:2011/07/08(金) 10:53:33.56
A1:B10 と D1:D10 じゃだめなのかい
695デフォルトの名無しさん:2011/07/08(金) 10:55:26.22
cellsでfor2つにネストしてC以外の時に処理させるとか
696デフォルトの名無しさん:2011/07/08(金) 10:56:50.97
そんな感じで
ループで1行ずつ入れずに
(A1:B10) = 0
みたいなことをやりたい
697デフォルトの名無しさん:2011/07/08(金) 11:17:43.63
セル選択
selection.formulaR1C1=゙0゙
698デフォルトの名無しさん:2011/07/08(金) 11:49:43.55
c列をどっかにコピー
a:d列に0入れる
c列を戻す

とか
699デフォルトの名無しさん:2011/07/08(金) 11:49:55.09
Sheet1.Range("A1:B10").Select
Selection.FormulaR1C1 = 0
Sheet1.Range("D1:D10").Select
Selection.FormulaR1C1 = 0
で、できました
ありがとうございます。

どうでもいいけど
「で、できました」って
「こうするとできました」じゃなくて、
驚愕みたいな「う、うわっ」みたいに読めるよね
700デフォルトの名無しさん:2011/07/08(金) 12:38:47.57
>>699
693よりコード悪化してるぞ

まだ
Range("A1:B10").Value = 0
Range("D1:D10").Value = 0
のほうがマシ
701デフォルトの名無しさん:2011/07/08(金) 12:54:36.03
しかし汎用性のないコードだな
702デフォルトの名無しさん:2011/07/08(金) 14:45:52.41
>>701
仕様に汎用性がないんだよ
>>693読んで自分でコード書いてみろ
703デフォルトの名無しさん:2011/07/08(金) 15:29:19.08
>>692
そういうことにしないと否定できないんだろ。察してやれ。
704デフォルトの名無しさん:2011/07/08(金) 16:27:03.67
>>700
本当だ、こっちの方が早い
実際のプログラムは4列x60行で
最初のループだと置換が終わる処理まで約6秒かかっていたのが
>>699で約2秒
そのコードにしたら約1秒で終わった。
705デフォルトの名無しさん:2011/07/08(金) 16:49:15.41
そんなに違いあるのか
706デフォルトの名無しさん:2011/07/08(金) 16:52:40.89
PCの性能もあるだろうけど
A:1に0 A:2に0 A:3に・・・って60までループするより
A:1からA:60まで全部0!!(どかーん)
のほうが圧倒的に速いのは確定的に明らか
707デフォルトの名無しさん:2011/07/08(金) 19:52:44.00
VBAでももちろんだけど、
.NETのようなアウトプロセスでのアクセスだと顕著に差が出るよね
708デフォルトの名無しさん:2011/07/09(土) 12:34:25.78
オートシェイプに文字を書くのが調べてもわかりません
709デフォルトの名無しさん:2011/07/09(土) 14:16:54.34
>>708
よく見かけるのはこんな感じ

Dim Shape1 As Object
Set Shape1 = ActiveSheet.Shapes.AddShape(msoShapeRectangle, 50, 50, 100, 100)
Shape1.Select (True)
Selection.Characters.Text = "hello"
710デフォルトの名無しさん:2011/07/09(土) 17:20:44.99
入力されている文字の左から1文字が1か2かで色をつけて他は空白にしたいのですがどうしたらいいですか

Private Sub Worksheet_Change(ByVal Target As Range)

With Target.Interior
Select Case Target.Left(Target.Text, 1) 'ここがわからない
Case "1"
.ColorIndex = 3
Case "2"
.ColorIndex = 5
Case Else
.ColorIndex = xlNone
End Select
End With

End Sub

あとできればRange("B2:Y35")の間だけこの色の変更が効くようにしたいのですがそこも教えて欲しいです
711デフォルトの名無しさん:2011/07/09(土) 17:21:38.14
すみませんメモ帳でやったらうまくインデントできませんでした
Private Sub Worksheet_Change(ByVal Target As Range)

With Target.Interior
Select Case Target.Left(Target.Text, 1) 'ここがわからない
Case "1"
.ColorIndex = 3
Case "2"
.ColorIndex = 5
Case Else
.ColorIndex = xlNone
End Select
End With

End Sub
712デフォルトの名無しさん:2011/07/09(土) 18:22:08.14
>>710

Private Sub Worksheet_Change(ByVal Target As Range)

If Application.Intersect(Target, Range("B2:Y35")) Is Nothing Then Exit Sub

With Target.Interior
Select Case Left(Target.Value, 1)
Case "1"
.ColorIndex = 3
Case "2"
.ColorIndex = 5
Case Else
.ColorIndex = xlNone
End Select
End With

End Sub
713デフォルトの名無しさん:2011/07/09(土) 20:33:06.03
>>712
できましたありがとうございます
714デフォルトの名無しさん:2011/07/09(土) 21:11:21.20
x = cells(a,b).c
xにaを返すためにはcを何にしたらいいんですか
715デフォルトの名無しさん:2011/07/09(土) 21:19:51.45
事故解決しました
716デフォルトの名無しさん:2011/07/10(日) 09:00:57.77
>>702
701じゃないけど、汎用性持たせるとこんな感じか?

Sub Test()
  Call NumericalInitialize([A1:B10,D1:D10])
End Sub

Sub NumericalInitialize(IniRange As Range)
  IniRange.Value = 0
End Sub

あるいは

Sub Test()
  Call InputValue([A1:B10,D1:D10], 0)
End Sub

Sub InputValue(InputRange As Range, Optional Value As Variant = Empty)
  InputRange.Value = Value
End Sub

とか。
でも、

[A1:B10,D1:D10].Value = 0

で良い気がする。
Range("A1:B10").Value = 0
Range("D1:D10").Value = 0
みたいに2行で書かざるを得ないものを、ParamArray使った自作関数で、
1行書き出来るようにするとかならまだしも、元から1行書き出来る上に、
関数化しない方が処理の明示性が高いくらいなので、関数化の旨味も少ない。
717デフォルトの名無しさん:2011/07/10(日) 22:38:57.11
一般の仕事で使えるマクロってどんなものがあると思う?
データ収集と解析以外あんまり使い道内容に思うんだが
718デフォルトの名無しさん:2011/07/10(日) 23:04:45.74
学校で、残響時間計算プログラムの課題が出て、途中までやりましたが、
分からずに困っています。
壁の吸音力の計算の下からが、全然分かりません。
どなたか、教えてください。

Excel file
ttp://www1.axfc.net/uploader/Sc/so/253823
マクロ
ttp://www1.axfc.net/uploader/Sc/so/253831

キーワードは「kadai」です。
よろしくおねがいします。
719デフォルトの名無しさん:2011/07/10(日) 23:45:16.05
>>717
帳票作成は?
昔さんざんやらされたけど w
720デフォルトの名無しさん:2011/07/10(日) 23:48:51.00
>>717
汎用的なものは作れんでしょうに
721デフォルトの名無しさん:2011/07/11(月) 00:56:39.90
>>718
スレ違い

学校の課題であるというのもスレ違い要素の一つだが、何よりExcelVBAとは関係ない質問だ
単に言語選択としてたまたまVBA使ってるだけで、C#でもVB6でも出来るような類の処理は
全てスレ違いなのでそこんところよろしく

ここはVBAでExcelのブックやシート、標準オブジェクト類を操作する話以外はスレ違いだから(>>2参照)
722デフォルトの名無しさん:2011/07/11(月) 01:02:12.23
>>721
御指摘ありがとうございます。

すみませんでした。
723デフォルトの名無しさん:2011/07/11(月) 01:31:42.69
>>718
やってみた

http://www1.axfc.net/uploader/File/so/65864

pass:kadai

式はググって使った 0.162*容積/-総面積*loge(1-平均吸音率)
で試してみたら満席のほうが長くなったぜ><
たぶん違うから自分で直してね!

wav生成のほうは離散フーリエがわからんからやってないぜ
724デフォルトの名無しさん:2011/07/11(月) 07:40:26.84
XP Excel2007です。
WEBクエリでページをシートに読み込んでるんですが、続けてるとアクセス出来なくなります。
WEBクエリのアクセスをブラウザからに見せる事は出来ますか?ユーザーエージェントを書き変えて送信とか。

別に攻撃しようとかじゃ無いんです。1秒に1回くらいアクセス出来ればいいです。
725724:2011/07/11(月) 07:44:21.18
HttpSendRuqestやHttpAddRequestHeadersで検索したけど、
WEBクエリにどう応用していいか分かりませんでした。
VBA始めてそんなに長くないので、あんまり詳しくないです。
726デフォルトの名無しさん:2011/07/11(月) 09:57:44.86
>>709
ありがとうございます!!
727デフォルトの名無しさん:2011/07/12(火) 17:04:27.70
>>724
1秒に1回で逮捕された奴いるの知らないの?まじで気をつけた方が良いよ。
相手サーバがバグとも言える「仕様」でエラー頻発で逮捕。
岡崎図書館事件
http://librahack.jp/
728デフォルトの名無しさん:2011/07/12(火) 19:04:09.39
>>727
館長の基地外発言が話をヤヤこしくしたあれか
729デフォルトの名無しさん:2011/07/12(火) 19:57:31.14
パスワードかなんかが暗号化せずに鯖においてあったなんて話もあるんだっけ、あそこ
730デフォルトの名無しさん:2011/07/12(火) 21:45:56.66
逮捕されたけど結果は無罪だったじゃん
前例があるからこそ、今後はあんなバカな逮捕劇は起こらんのじゃないか?
731デフォルトの名無しさん:2011/07/13(水) 01:09:34.47
>>730
楽観的だなぁ・・・日本という国は技術がある者ほど割を食うIT後進国なのに・・・
Winny作ったやつは逮捕されても当然としてもその罪状が幇助罪だったから、開発者はみんな明日は事故的に火の粉をかぶると怯えたもんだ
732デフォルトの名無しさん:2011/07/13(水) 01:52:55.34
あれは怯えている設定にして無罪を勝ち取ろうとした戦術だろ。
実際には、ふ〜んて感じだった。
blogでDQN行為を自慢して炎上するようなもんだ。
733デフォルトの名無しさん:2011/07/13(水) 02:47:15.39
>>732
職業プログラマやってる友人やその仲間の話なんだけど
734デフォルトの名無しさん:2011/07/13(水) 07:22:33.01
案外、皆Winny系統のアプリ使いまくっていて、
巻き添え逮捕に怯えていたとかそんなところだったりしてw
735724:2011/07/13(水) 08:50:40.24
>>727
そんな事件あったって知りませんでした。やっぱ相手サーバが拒否してる事はやっちゃダメか・・・
春ごろまではOKだったのに、リニューアルされたら急にアクセス規制がきつくなりました。
ソニーエンタメの影響かなあ

とりあえず串とwait関数で気長にやります。
736デフォルトの名無しさん:2011/07/13(水) 22:23:06.60
 きちんとしたデータを作ればVBAで工場の予定表も作れるし、
注文書も納品書もできるし、棚卸しだって効率的にできる。
極論すれば工場の経営や管理ができるんだから汎用的
だと思うよ。
737デフォルトの名無しさん:2011/07/14(木) 01:07:25.51
>>734
だーかーらー
プログラマとして物作りを阻害する警察の動きに不安を感じたんだってば
>>727のリンク先読んでから出直せよ

そんなことじゃ見せかけの民主主義かつ、中国共産党による言論統制、政府を守るためなら国民は死んでもいいって社会が日本でも永遠に続く
原子力発電のためなら国民やその子供が死んでもお構いなし、旧ソ連以下の日本のまんまだ
738デフォルトの名無しさん:2011/07/14(木) 07:22:12.93
何か剥がれてきたw
739デフォルトの名無しさん:2011/07/14(木) 08:17:14.43
初心者なので上手く伝わるかどうかわからないのですが

二個の図を同時に生成する時に、その二つをグループ化させた状態で生成する事ってできるでしょうか?
740デフォルトの名無しさん:2011/07/14(木) 18:34:58.06
はい、出来ます
741デフォルトの名無しさん:2011/07/14(木) 19:07:26.21
グループ化させた状態で作成?
2つ作成してからグループ化?
742デフォルトの名無しさん:2011/07/15(金) 09:57:06.25
開始
図1個目作成
図2個目作成
図1と図2をグループ化
終わり

これで同時生成かつグループ化した状態で出現したように見える
743デフォルトの名無しさん:2011/07/15(金) 11:56:58.05
指定したテキストファイルの行数を返してくれる1行のステキ関数ってない?
744デフォルトの名無しさん:2011/07/15(金) 12:10:18.83
自作
745デフォルトの名無しさん:2011/07/15(金) 23:10:53.46
エクセルで十字カーソルが表示できない?
折れ線グラフを見るときに便利なんだが。
746デフォルトの名無しさん:2011/07/16(土) 00:09:54.01
最近の質問者は丸投げが多いな。
自分でここまで調べたけけど、ここからが分からない
と言った感じが全く見受けられない。
747デフォルトの名無しさん:2011/07/16(土) 06:36:34.90
教えたがりが多いので問題ナッシン
748デフォルトの名無しさん:2011/07/16(土) 07:52:38.71
Excel2007
ブックを閉じられないようにするにはWorkbook_BeforeCloseでCancel=Trueですよな?
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim res As Variant

MsgBox "閉じる?", vbYesNo
If res = vbNo Then
Cancel = True
End If

End Sub
として、閉じるときに「閉じる?」のメッセージボックスは出てくるんだけど"いいえ"を選択しても閉じられてしまうんですけど。
749デフォルトの名無しさん:2011/07/16(土) 08:46:05.63
>>743
> 指定したテキストファイルの行数を返してくれる1行のステキ関数ってない?

split まあ帰ってくるのは数字ではないが・・・
750デフォルトの名無しさん:2011/07/16(土) 09:15:48.78
>>748
res に何も入ってないんでは?

以下サンプル

Private Sub Workbook_BeforeClose(Cancel As Boolean)
If vbNo = MsgBox("閉じる?", vbYesNo) Then
Cancel = True
End If
End Sub
751デフォルトの名無しさん:2011/07/16(土) 09:39:25.07
>>750
あっ〜そうだ!w
すんませんでしたぁm(_ _)m
752デフォルトの名無しさん:2011/07/16(土) 10:20:47.55
>>743
ステキ関数はないけど1行で書くのは可能
Debug.Print CreateObject("Scripting.FileSystemObject").OpenTextFile("c:\test.txt", 8).Line - 1
ただしファイルの末尾が改行コードじゃなかった場合は1行少ない数値が取得されるんで、
そのあたりをちゃんと処理するには面倒なコードが必要
753デフォルトの名無しさん:2011/07/16(土) 20:07:47.72
何を調べればよいか解らないんだよたぶん
754初心者:2011/07/17(日) 08:09:27.83
初心者質問です。
sheet1 に A1から 
A B C
1 1 C b
2 3 A a
3 1 B a
4行目以降も各列にランダムに数字、文字がつづきます。

以前VBAプログラムをおしえていただいたのですが、途中、
a=range("A1").CurrentRegion.resize(,3).select     とありました。

これの resize(,3) の意味が解りません。
上のプログラムの意味を教えてください。お願いします。


755 忍法帖【Lv=2,xxxP】 【東電 61.3 %】 :2011/07/17(日) 09:02:32.10
>754
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_cell.html

resize(,3) は resize(1,3) と同じ意味のはずだから、>754の結果は
A1:C1の範囲(1行×3列)が選択されるはず
756初心者:2011/07/17(日) 09:34:21.06
>>755
resize(1,3)とおなじ意味だったのですか。ありがとうございます。

もう1つ聞きたいことがあるのですがすみません、よろしくおねがいします。
さっきの
a=range("A1").CurrentRegion.resize(,3).select
の下に、
for z= 1 to ubound(a,1)-1
とあるのですが ubound(a,1)-1 の意味がわかりません。
下記サイトでuboundを調べたのですが、、、よくわかりません。
http://msdn.microsoft.com/ja-jp/library/cc437658(v=vs.71).aspx

すみませんが少し教えてください。お願いします。
757755:2011/07/17(日) 10:03:01.80
>754,756
試してみたら違ってました。ゴメンナサイ
当該範囲の行×3列 ということでした。(1行ではありません!)

range("A1").CurrentRegion. っていうのは>755で示したページの説明にもあるように
A1セルで [Ctrl]を押しながら[*}(ノートPCなら[Shift]を押しながら[* : け])を押した範囲
なので、このときに5行×5列が選択されたとしたら、5行×3列に選択し直される、ということです。

ちゃんと試してから書き込まないとダメですね、反省
758デフォルトの名無しさん:2011/07/17(日) 10:29:49.96
>756
a=range("A1").CurrentRegion.resize(,3).select って、ほんとですか?
a=range("A1").CurrentRegion.resize(,3) までならわかるけど(選択したセル範囲を配列に入れる)

ためしに
a = Range("A1").CurrentRegion.Resize(, 3).Select
MsgBox (UBound(a, 1))
だとエラー(実行時エラー13:型が一致しません)になりました。

a = Range("A1").CurrentRegion.Resize(, 3)
MsgBox (UBound(a, 1))
ならば選択セル範囲の行数が表示されました。
差し支えなければ当該マクロの関係する部分を示してくれませんか?
759デフォルトの名無しさん:2011/07/17(日) 10:37:52.96
はじめまして

ある莫大なテキスト文があります。これをコピーしExcelのシートsheet1にはりつけました。
いくつかの行にある文字 例えば 「金額は、~円」という文字か含まれていたとします。
質問ですが、~に書かれている数字をすべて拾い上げSHEET2にはりつけていく方法
おしえていただきたいのですが。長文てすみません。

宜しくお願いします。
760 忍法帖【Lv=2,xxxP】 【東電 75.5 %】 :2011/07/17(日) 10:42:46.76
>759
val関数で可能です。
http://officetanaka.net/excel/vba/function/Val.htm
761デフォルトの名無しさん:2011/07/17(日) 10:54:21.90
760
ありがとうございます。
サンプルの678は、表示できないですか?
762760:2011/07/17(日) 11:01:38.11
>761
Sub Sample()
 Dim str As String
 str = " 123.45+678"
 MsgBox Val(str) '123.45を表示します ←
 str = "1,000"
 MsgBox Val(str) '1を表示します
End Sub
のことですね。 +記号 で一連の数字が途切れているためです。
小数点や3桁毎の区切りはつながった数字とみなします。
763760:2011/07/17(日) 11:04:29.42
762の自己レス

アレ?
 str = "1,000"
 MsgBox Val(str) '1を表示します
3桁毎のカンマはダメなのか。
764初心者:2011/07/17(日) 11:36:32.72
>>758
すみません、a=range("A1").CurrentRegion.resize(,3).select  ではなく
a=range("A1").CurrentRegion.resize(,3).value でした。 ほんとうにすみません。
msgboxをつかってこんな確認もできるのですね。勉強になりました。

765デフォルトの名無しさん:2011/07/17(日) 11:55:49.30
おしえていただきたいです
findで検索し、findnextで次を検索します。

最後まで行ってから最初にもどらない方法おしえてもらいませんか
766デフォルトの名無しさん:2011/07/17(日) 12:03:44.55
>>759
"金額は、"でSplit、For 〜 Uboundで回してVal
Forは1からにすること
767デフォルトの名無しさん:2011/07/17(日) 12:04:20.66
>>765
教科書通りに書けば戻りません
むしろ最初に戻す方が手間がかかる
768デフォルトの名無しさん:2011/07/17(日) 12:04:26.27
>765 ここがわかりやすいと思う
http://officetanaka.net/excel/vba/tips/tips123b.htm
769デフォルトの名無しさん:2011/07/17(日) 15:22:55.77
下手くそなとこを教えない方がいい。
770デフォルトの名無しさん:2011/07/18(月) 08:19:31.06
100列300,000行のデータがあります
これの、行列入れ替えたテキストファイル作りたいのですが、ExcelVBAではやはり不可能でしょうか?
771デフォルトの名無しさん:2011/07/18(月) 08:26:58.63
おしえて下さい
あるセルに長い文字列があります。
数字と文字が含まれています。数字のみを取得する方法はないですか。
valだと最初の数字のみの取得になります。
数字すべてを取得したい。
772デフォルトの名無しさん:2011/07/18(月) 08:48:46.31
>>770
一列取り込んで一行出力を繰り返すだけ。
>>771
RegExp使うのが一番手っ取り早い。でなければ、一文字ずつ走査していくしかないな。
数字以外の文字を空白に変換→Splitで分割→数字の入っている要素のみ取り出す、とか
773デフォルトの名無しさん:2011/07/18(月) 09:39:32.71
772
ありがとうございます
でも文字列のみどうやって空白にできるのですか。
774デフォルトの名無しさん:2011/07/18(月) 10:02:59.80
Mid$でちまちま置換していく。
For off = 1 To Len(s)
 If Not Mid$(s, off, 1) Like "#" Then Mid$(s, off, 1) = " "
Next
大体こんな感じ?
775デフォルトの名無しさん:2011/07/18(月) 12:30:26.91
>>53
$がつくのとつかないのでは意味はどう変わるのでしょうか?
776デフォルトの名無しさん:2011/07/18(月) 12:49:05.21
Mid/Mid$関数の話なら、$が付く方の返り値はString、付かない方はVariant。
受け側がString以外の時はVBAが型変換してくれるのだから、
$が付かない方を選んで不要なコストを追加する理由は無い、
って話が前に出ていた気がする。
ステートメントの方は忘れた。わざわざVariantで受け付けるとかあるのかなあ。
777デフォルトの名無しさん:2011/07/18(月) 14:23:51.57
Like "#" の意味 御教示を。
778デフォルトの名無しさん:2011/07/18(月) 14:39:31.93
>777
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_find.html
任意の1文字の数字(0-9)を示します
779778:2011/07/18(月) 14:42:17.11
なので、小数の場合は都合が悪いことになるはず。
123.45 が 123 と 45 という別々の数字と見なされる。
780デフォルトの名無しさん:2011/07/18(月) 14:53:44.81
そこまでいくと、>>771の意図している数字の定義を確認する必要があるな。
指数表記は流石に無いとしても、コンマ表記や符号等も考えられるし。
781デフォルトの名無しさん:2011/07/18(月) 15:01:07.05
>771は ひょっとして>759ですか?
もしそうだとしたら、前提条件をはっきり示してもらわないと。

「実は小数点やマイナス値もあるから〜」ってこと(条件後出し)だと回答をもらえませんよ。
782775:2011/07/18(月) 15:11:58.04
>>776
ありがとうございます。
783デフォルトの名無しさん:2011/07/18(月) 15:12:38.15
>>776
Midステートメントで$を付けるのは無意味。
784デフォルトの名無しさん:2011/07/18(月) 15:17:20.83
エクセルにcsv等のテキストファイルをドラッグアンドドロップすると新たにワークブックとして開かれますが、
このときに自動で処理をしたいのですが、これに対応するイベントはあるんでしょうか?
無いとしたらイベント以外になにか方法はありますでしょうか?
785デフォルトの名無しさん:2011/07/18(月) 15:24:28.86
はい771=759です。

言われる通り、少数、負符号は考慮します。それ以外は無いです。
三桁おきのカンマもないです。文字列から数字のみを抽出したいです。

苦肉策として区切りコマンドを実行しマクロ記録する方針でかんがえてます。
もっとスマートにできないかなと思っで書き込みました。
786デフォルトの名無しさん:2011/07/18(月) 17:02:56.46
>785 元データが1列なら、少数やマイナス値を含む数字で区切る処理はこんな風になります。
3桁毎のカンマにも対応するには '← のところを変更してください。
Option Explicit
Dim sh_i As Excel.Worksheet, sh_o As Excel.Worksheet
Dim tate As Long, i As Integer, retsu As Integer
Dim str_i As String, flg As Boolean, flg_sv As Boolean
Dim wk As String, str_o As String, num_o As Double
Sub test()
  Set sh_i = ActiveSheet: Set sh_o = Worksheets("Sheet2")
  tate = 1: str_i = sh_i.Cells(tate, 1).Value
  Do While (str_i <> "")
    retsu = 1: flg = False
続く
787デフォルトの名無しさん:2011/07/18(月) 17:05:05.34
    For i = 1 To Len(str_i)
      wk = Mid(str_i, i, 1): flg = (InStr(1, "0123456789.-", wk) > 0) '←
      If i = 1 Then
        str_o = wk: flg_sv = flg
      Else
        If flg = flg_sv Then
          str_o = str_o & wk
        Else
          If flg_sv Then
            sh_o.Cells(tate, retsu).Value = str_o
            retsu = retsu + 1
          End If
続く
788 忍法帖【Lv=2,xxxP】 【東電 82.9 %】 :2011/07/18(月) 17:07:26.12
          str_o = wk: flg_sv = flg
        End If
      End If
    Next i
    If flg_sv Then
      sh_o.Cells(tate, retsu).Value = str_o
    End If
    tate = tate + 1: str_i = sh_i.Cells(tate, 1).Value
  Loop
  Set sh_i = Nothing: Set sh_o = Nothing
End Sub 以上
789786:2011/07/18(月) 17:11:38.07
数字部分だけの抽出ではなく、文字列部分もsheet2に出力したいのであれば、
If flg_sv Then と、これに対応する End If をコメント化してみてください。 
790デフォルトの名無しさん:2011/07/18(月) 17:18:17.06
お手数おかけいたしますが、、、、知恵を拝借いたしたく

http://www.dotup.org/uploda/www.dotup.org1802759.zip.html
解凍パス Excel 中身 testtest.xls

テキストボックスに入っている文字列に対して検索する処理を考えています
sample1では複数の検索対象文字列があっても選択されるのは見つかった最初の
語句のみなんで続けて次の対象文字列も選択させたいの(sample2)、ですが、、
ここで行き詰っています。
---------------------------------------------------------------------
検索用のボタンを押すことによって続けて検索させたいのですが、
Instr関数の部分でエラーになっています。
findpos = 1にすればエラーにはならないものの当たり前のことながらsample1
と変わらない動作になってしまいますし。

sample2においてどうすればいいか教えてください。m(_ _)m
791デフォルトの名無しさん:2011/07/18(月) 17:36:01.39
>>786

771です。ありがとうございました。
いただいたプログラムをサブルーチンに組込み、試してみようと思います。
文字列はどの変数に割り当てるのでしょうか。
結果はどの変数になるのでしょうか
792786:2011/07/18(月) 17:50:15.73
>791
入力側の文字列は str_i に入れて先頭から一文字ずつ調べてます。
出力側は str_o に一文字ずつ連結していき、数字かどうかの判定結果が
変わる都度、それまでの str_o を出力側シートに書き込んでいます。

>790
findpos の値をどこかのセルに書き込んでおくのがわかりやすいと思う。
Private Sub UserForm_Initialize() の処理の中に「当該セルに 1 を設定」を
組み込んでおくだけでいいし。
793786:2011/07/18(月) 18:12:26.12
自己レス
>786の num_o As double は不要でした。文字列の str_o をこれに
転記してから出力シートに書き込もうかと思って定義してたけど、
str_o を直接書き込んでも問題なかった。
794デフォルトの名無しさん:2011/07/18(月) 19:28:31.68
>>792
790です。もう少し考えてみます
後でまたするかもしれませんが、よろしくです。
795デフォルトの名無しさん:2011/07/19(火) 12:33:37.91
792
771です
何度もすみません
例えば、CELL(1.1)に数字を3つ含む文字列かあったとします。
CELL(1.10)CELL(1.11)CELL(1.12)に出力するにはどうすべきですか
796デフォルトの名無しさん:2011/07/19(火) 12:40:20.97
少しは自分で考えようぜ

>>2
> ★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
>    コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
>    ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
>
797デフォルトの名無しさん:2011/07/19(火) 21:54:50.55
そもそもCELL(1.10)ってなんだ?
798デフォルトの名無しさん:2011/07/19(火) 22:06:28.67
とりあえず何を聞きたいのか処理ごとにまとめてくれるESPいないかね
799デフォルトの名無しさん:2011/07/19(火) 23:15:30.78
CELL(1.10)はCells(1, 10)の書き間違いだってエスパーじゃなくてもわかるだろ
この程度のことがわからない役立たずはレス付けるな
800デフォルトの名無しさん:2011/07/19(火) 23:39:26.58
Cells(1, 10)をCELL(1.10)を書き間違えることに寛容なおまいらww
801デフォルトの名無しさん:2011/07/19(火) 23:56:35.17
幼稚園児に怒っても仕方ないだろ
802デフォルトの名無しさん:2011/07/20(水) 00:11:28.41
>>799
そこじゃねえよ

>>771から続いてる流れが、結局どこを目指してるのかを聞かせてくれ
何をしたがっててどういう状況で果たしてどのような処理をしたいのだろうか

この程度のことがわからない役立たずはレス付けるな
803デフォルトの名無しさん:2011/07/20(水) 02:40:21.35
CELL(1,10)をコンパイル時にCells(1,10)にできないやつはレスつけるな
804デフォルトの名無しさん:2011/07/20(水) 05:24:13.30
>>802

        ____
        /     \
     /   ⌒  ⌒ \   何言ってんだこいつ
   /    (●)  (●) \
    |   、" ゙)(__人__)"  )    ___________
   \      。` ⌒゚:j´ ,/ml j゙~~| | |             |
__/          \  |__| | |             |
| | /   ,              \n||  | |             |
| | /   /         r.  ( こ) | |             |
| | | ⌒ ーnnn        |\ (⊆ソ .|_|___________|
 ̄ \__、("二) ̄ ̄ ̄ ̄ ̄l二二l二二  _|_|__|_
805デフォルトの名無しさん:2011/07/20(水) 06:18:03.19
何がやりたくてどこに向かってるかよくわからんのは確かだが
とりあえず>>795は正規表現覚えたほうがいいんじゃね
CELL(1.1)はCells(1,1)だとして、マイナス記号と小数点も考慮すると
(俺も正規表現あんまり自信ないんだが)
Sub test()
    Dim regEx, Matches, Match
    Dim col As Integer
    Set regEx = CreateObject("VBScript.RegExp")
    regEx.Pattern = "-?\d*\.?\d+"
    regEx.Global = True
    Set Matches = regEx.Execute(Cells(1, 1).Text)
    For Each Match In Matches
        Cells(1, 10 + col).Value = Match.Value
        col = col + 1
   Next
End Sub
でいけるんじゃね
とりあえずこれ理解するまで勉強してくれ
806デフォルトの名無しさん:2011/07/20(水) 09:54:25.54
仮にエクセルのB列にURLの一覧があるとします。
各ページ内のメタタグを抽出したいです。

C列には「description」D列には「keywords」
を抽出するにはどうすれいいでしょうか?

初歩的な質問かもしれませんが、よろしくお願いします。
807デフォルトの名無しさん:2011/07/20(水) 10:34:31.99
771か?
お礼くらい言っとけよ
808デフォルトの名無しさん:2011/07/20(水) 11:48:43.49
お礼とかいらないから
809デフォルトの名無しさん:2011/07/20(水) 12:04:26.56
回答とかいらないから
810デフォルトの名無しさん:2011/07/20(水) 13:25:03.28
質問とかいらないから
811デフォルトの名無しさん:2011/07/20(水) 14:21:51.37
夢とか
希望とかいらないから
812デフォルトの名無しさん:2011/07/20(水) 14:52:57.70
いらないシリーズごくろうさん
813デフォルトの名無しさん:2011/07/20(水) 17:21:04.88
ねぎらいとかいらないから
814デフォルトの名無しさん:2011/07/20(水) 20:45:13.30
>>786
771です。プログラム実行しました。
たいへん役に立ちそうです。ありがとうございました。

一つだけ気になった点。sheet1に、もし空白行があったらそこで
アウトプットがとまってしまうようです。この辺も改善できればお願いします。
815デフォルトの名無しさん:2011/07/20(水) 20:49:10.63
VBAは初めてです。回答よろしくお願いします。

★1 OS:xppro Excelのバージョン:2003
任意の選択したセル(複数可)の行番号をコピー、その後、コピーした行番号をペースト
というのをショートカットキーを使う形でつくりたいと考えています。

詰まってるところは、@行番号のコピー方法。(ROW関数を上手いこと使えばいいのかなと思っています)
Aペーストの方法。(普通にCtrl+Vでも可能なのでしょうか?)

なにぶん初めてなもので、書き方もよくわかっていません。よろしければ初心者向けの参考サイトなども教えていただけないでしょうか?
816デフォルトの名無しさん:2011/07/20(水) 20:55:12.00
>>807

771です
見る暇もなく返信遅れたようです。
817デフォルトの名無しさん:2011/07/20(水) 21:03:33.82
>>806
ひとつの方法として
1. IEオブジェクトを生成し B列にあるURLでページを開く
2. ページを開いたIEオブジェクトからメタタグの情報を取得する
って感じかな?
818デフォルトの名無しさん:2011/07/20(水) 23:45:22.40
>>815
コピー、ペーストってのは、基本的にはクリップボードに対する情報のやりとりなので
@コピー処理でクリップボードに値をセットしてあげれば、A貼り付けは普通に行える
クリップボードに対する処理はググれば出てくる。簡単なサンプル書いてみた

Sub rownumberCopy()
    Dim r, c
    Dim s As String
    Dim cb As New DataObject
    Set r = Selection
    If TypeName(r) <> "Range" Then
        Exit Sub
    End If
    For Each c In r
        s = s & CStr(c.Row) & vbCrLf
    Next
    cb.SetText s
    cb.PutInClipboard
End Sub

選択範囲が複数列だったらどうするとかは考慮してない

VBA初心者なら、サイトよりなんか入門書を買う方がいいと思うが
ある程度使えるようになれば後はググれば大概なんとかなる
819デフォルトの名無しさん:2011/07/21(木) 00:14:40.61
ググったことしかないから俺はいつまでたっても底辺なのか…
820デフォルトの名無しさん:2011/07/21(木) 13:56:52.70
806です。
>>817さん、そのやり方だと、ちょっと時間が掛りすぎてしまいませんか?
できれば、スマートに出来ればありがたいのですが・・・。
どなたか教えてください!お願いします!
821デフォルトの名無しさん:2011/07/21(木) 15:02:36.08
>>820
スマートで速い方法なんて無い。
822817:2011/07/21(木) 15:15:50.64
>>820
スマートにですか.....ふむ

スマートかどうか?だけど
実際自分が過去にやった事がある方法を紹介してみる

該当URLのHTMLファイルをダウンロード(APIの"URLDownload"なんかで)した後
VBAでテキストファイルとして読み込ませてしまう
あとは文字列検索(InStr関数とかMid関数とかとか駆使して)目的の情報をさがす

・HTMLファイルがShiftJIS以外で書かれていたら文字コード変換しないとダメだったりする
・実行時の見た目はスッキリするけど コードは複雑になるかも
823817:2011/07/21(木) 15:24:32.28
誤 APIの"URLDownload"なんかで
正 APIの"URLDownloadToFile"なんかで
824デフォルトの名無しさん:2011/07/21(木) 16:59:13.56
>>820
スマートと言うなら、Excelではなく、javascript使ったら?

コード変換もいらない

で、その結果Tableにでも出力してExcelに張り付ける

jquery メタタグ で検索かければ参考にはなると思う

板違いはゴメンだけど
825817:2011/07/21(木) 18:29:49.12
>>820
この種のWebページの情報取得 自動化は
相手サーパに負担をかける恐れがある事を承知しておいてね

実際 >>822 の開発時 コードがループしてしまい
相手サーバーから IPブロックされた事があるんで
(そん時は、たしか1週間ぐらいアクセスできなかった)
826デフォルトの名無しさん:2011/07/21(木) 19:17:52.46
岡崎市図書館事件の中の人ですか?
827817:2011/07/21(木) 19:23:41.93
ちがうよ
自分の場合は、とある"海外のHサイト"を巡回する為に 作成した時のことなので
828デフォルトの名無しさん:2011/07/21(木) 22:10:24.79
すいません
accessで、DataGridを使ってデータを表示したいんですがやり方がわかりません。
DataGrid.value や DataGrid.Textにデータを入れようとすると行番号が不正ですというようなエラーが出ます。
何か設定が足りないようなんですが、なんかサンプルないでしょうか?
829デフォルトの名無しさん:2011/07/21(木) 22:57:20.68
丸投げしといてもっとスマートなやり方とかどんだけ高貴なお方だよww
830デフォルトの名無しさん:2011/07/21(木) 22:59:09.42
831デフォルトの名無しさん:2011/07/22(金) 13:12:49.86
>>829
ちょっとくぐったら
件のお方 他質問サイトへも投稿してるみたいね
ttp://okwave.jp/qa/q6890739.html
これ自体 悪い事とは思わないけど

CreateObject("MSXML2.XMLHTTP")を使った
タイトルを抽出するコードは、教えてもらった事あるみたいだから
それの応用だけなんだけどなー

自分でなんとかしようとする気ナッシングだね
832デフォルトの名無しさん:2011/07/22(金) 15:12:38.29
すいません。ぐぐっても原因がわからないので質問をば…

セルに入力された値が「-1のとき…追加する」「1のとき…使用する」「2のとき…削除する」になるように、
RangeのNumberFormatへ表示形式を設定したいのですがうまくいきません。

もしわかるのであれば、その部分だけのコード教えていただけるとありがたいです。

また、条件が2個の状態の場合設定できるのですが、条件が3個になったとたんエラーになります。
NumberFormatへの登録数上限があるのでしょうか?
833デフォルトの名無しさん:2011/07/22(金) 16:54:05.66
806です。
他のサイトで教えていただき解決しました。
大変お騒がせしました。
834デフォルトの名無しさん:2011/07/22(金) 20:20:39.52
>>832
NumberFormatはセルの表示形式を指定するものなのに
条件が2個、3個って一体何の話なんだ?
835デフォルトの名無しさん:2011/07/22(金) 21:35:56.15
>>832
公式なドキュメントになぜかあまり具体的な記述がないけど、
仕様は以下のとおりで、最初の2つまでしか条件は書けない
http://excel.life.coocan.jp/index/indexcell_disp_skoron_j.html

あえてやりたいならVBAを使って
Worksheet_Change
で現在のセルの値を見て、動的に NumberFormatLocal で設定するとか、ちょっと無理をする必要がありそう
836デフォルトの名無しさん:2011/07/22(金) 23:16:25.37
正負以外に任意の条件書けるとはしらなかった
837デフォルトの名無しさん:2011/07/23(土) 01:09:34.53
IE使わずにhtmlソースを取得するのってどうやるの?
838デフォルトの名無しさん:2011/07/23(土) 01:14:52.59
XMLHTTPでも使えば?
スレ違いだし、腐るほどサンプル転がってるから詳細は省くが
839デフォルトの名無しさん:2011/07/23(土) 01:28:26.99
>>838
大体理解できました。ありがとうございます
もう一つ質問したいのですが
板のURL(例えばhttp://hibari.2ch.net/tech/)を入力したら
現行のスレッドタイトルをA列に、そのスレッドのURLをB列に取得したいのですがどのようにすればいいでしょうか
840デフォルトの名無しさん:2011/07/23(土) 06:37:06.02
「板のURL」を「板のスレッド一覧のURL」に変換して
そいつを取得して解析して、解析結果をセルに代入すれば良いだけだよ

でも、URLの変換やsubject.txtの解析は
Excelとはなんら関係のないスレ違いな話なので詳細は省くが

とにかく、>>2★3,★4に該当するスレ違い、ルール違反な質問なので
もうこの件ではここで質問しないでね
841デフォルトの名無しさん:2011/07/23(土) 07:56:54.26
わかる人だけ解答してください
842デフォルトの名無しさん:2011/07/23(土) 12:07:22.66
わかるけどスレチだから回答しない
知識自慢したいお子様と違って俺はスレのマナーをちゃんと守る大人
843デフォルトの名無しさん:2011/07/23(土) 12:31:02.64
わからないんですね
わかります
844デフォルトの名無しさん:2011/07/23(土) 13:25:43.12
VBAでやりたいならスレチじゃないと思うけど
845デフォルトの名無しさん:2011/07/23(土) 13:48:19.15
>844
★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分野の話ではないので、ここでは聞かないでください。

846デフォルトの名無しさん:2011/07/23(土) 14:08:23.79
excelのVBAでRange("A1")にある複数行のテキストをA列に1行ずつ分けたいのですがどうしたらいいですか

Range("A1")に





ってあるとして、それを
A1 あ
A2 い
A3 う
A4 え
A5 お
としたいのです
847デフォルトの名無しさん:2011/07/23(土) 14:34:17.56
>846 配列からセル範囲に一度に転記ってできたっけ?
Sub test()
 a = Split(Range("A1").Value, Chr(10))
 For i = 0 To UBound(a)
  Range("B1").Offset(i, 0).Value = a(i)
 Next i
End Sub
848847:2011/07/23(土) 14:38:51.25
847はテストのためにB列に出力するようにしましたが B1 を A1 にしたらいいです。
849デフォルトの名無しさん:2011/07/23(土) 14:41:59.66
おお!ありがとうございます!
850デフォルトの名無しさん:2011/07/23(土) 22:39:55.27
>>847
やってみた

Sub Sample()
a = Split(Range("A1").Value, Chr(10))
Cells(1, 1).Resize(UBound(a), 1).Value = WorksheetFunction.Transpose(a)
End Sub
851デフォルトの名無しさん:2011/07/24(日) 05:08:46.45
ここは微積分もC#もできない僕チンが
ぶいびーえーででかい面するスレなんだから
スレチな話は僕チンのわかる範囲にしてください><
852デフォルトの名無しさん:2011/07/24(日) 08:20:32.67
嫌味のつもりなのかもしれないが、全然効果が無い件について
853847:2011/07/24(日) 09:20:59.93
>850
ワークシートファンクションはほとんど使ったことがありませんでした。ありがとうございます。
854デフォルトの名無しさん:2011/07/24(日) 23:05:54.80
A1=0.6 B1=A
A2=0.3 B2=B
A3=0.1 B3=C

と記入してあって、
A列の通り60%の確立でB列の"A"を、30%の確立で"B"を選ぶ
というのをさせたいのですが、どうしたらいいでしょうか?
知恵を貸してください。
855デフォルトの名無しさん:2011/07/24(日) 23:19:18.40
ネズミ−RND
856デフォルトの名無しさん:2011/07/24(日) 23:29:34.74
>>854
A1〜A3を配列にいれる(仮に変数AA)
100倍する

AA(1):60、AA(2):30、AA(3):10

AA(1)にはそのまま、AA(2)にはA1-A2の合計、AA(3)にはA1-A3の合計のように数字を足しこんだ値とする

AA(1):60、AA(2):90、AA(3):100

合計を求める(この場合は100)
ここまでが準備

値の選択では、RND関数を使ってまず合計値まで(0から99まで)の乱数 N を生成し、

N <AA(1) (0から59までの値) なら1番目
AA(1)<= N <AA(2) (60から89まで) なら2番目
AA((2)<= N (90以上) なら3番目

が選択されたとみなす
もっとうまいやり方がありそうだけど、ぱっと思いつくのはこんな感じ

…考えたら整数にする必要もないし、配列AAを用意する必要すらないかもしれんが
857デフォルトの名無しさん:2011/07/24(日) 23:57:37.00
>>856
ありがとうございます
858デフォルトの名無しさん:2011/07/25(月) 00:47:35.09
>>854
Sub aaa()
  r = Rnd(1)  '乱数を発生
  
  s = 0
  i = 1
  Do
    s = s + Cells(i, 1)
    If r < s Then b = Cells(i, 2)  '確率に従ってB列のデータを選ぶ
    i = i + 1
  Loop Until b <> "" Or i > 3  'ここにデータの個数を書く

  Debug.Print b  '結果の表示
End Sub
859デフォルトの名無しさん:2011/07/25(月) 04:31:07.13
スレチだがそのパターンだけだとして
=IF(RAND()<A1,B1,IF(RAND()<(A2/(1-A1)),B2,B3))
860デフォルトの名無しさん:2011/07/25(月) 06:42:01.60
その並び順なら
0.6  A   1 ←=A1+C2
0.3  B 0.4 以下同様
0.1  C  0.1 
という表を作って=INDEX(B1:B3,MATCH(RAND(),C1:C3,-1))でいいんじゃね?
普通は下のような昇順の表を作って=LOOKUP(RAND(),A1:B3)
0   C
0.1  B
0.4  A
861デフォルトの名無しさん:2011/07/25(月) 06:44:53.82
なんだここはVBAスレか
862デフォルトの名無しさん:2011/07/25(月) 09:16:03.35
>>859
それ違う
863デフォルトの名無しさん:2011/07/25(月) 09:26:24.70
>>835
832です。
ご回答ありがとうございました。やっぱり2つまでしか設定できないんですね。
もうちょっと試行錯誤してみます。
ありがとうございました。
864デフォルトの名無しさん:2011/07/25(月) 09:38:57.28
>>862
答えは合うよ?
条件が多いとLOOKUPの方が簡単だと思うが。
865デフォルトの名無しさん:2011/07/25(月) 11:31:27.63
>>864
ワークシート関数を一から勉強し直せ
866質問させてください@:2011/07/25(月) 12:15:03.97
セルに数式を直接入力したいと思い、VBAで以下のような記述を行っていますが、セルに設定したい変数が
EXCEL上にそのまま出力されてしまい、思うように動作してくれません。
(入力する数式をVBE上でDebug.printを用いて見てみたところ、変数の値は想定通りに変化していました)
どのあたりにミスがあるのか、教えていただけませんか?よろしくお願いいたします。

867質問させてくださいA:2011/07/25(月) 12:53:55.39
>>866の続きです。

@:入力したい数式を別に用意
   Dim CalcStr As String
   CalcStr = "=IF(ISERROR(SetSh & ""!"" & ""CN"" & HikGyo),"""",IF(SetSh & ""!"" & ""CN"" & HikGyo = """","""",SetSh & ""!"" & ""CN"" & HikGyo))"
   (EXCEL上では、上記式の右辺の内容がそのまま出力されてしまう。変数SetSh、HikGyoはその名前のまま、『&』もそのまま)

A:設定した数式を、任意のセルに設定
   ActiveSheet.Range("DD" & MyGyo).Formula = CalcStr
868デフォルトの名無しさん:2011/07/25(月) 13:35:41.82
セルにセットした数式みると、セルを指定してないね

実際は、こんな数式をセルにセットしたいのかなぁ?
=IF(ISERROR(テストシート!CN100),"""",IF(テストシート!CN100 = """","""",テストシート!CN100))
869デフォルトの名無しさん:2011/07/25(月) 13:45:55.41
>>867
CalcStr = "=IF(ISERROR(" & SetSh & "!" & CN & HikGyo & "),"""",IF(" & SetSh & "!" & CN & HikGyo "="""",""""," & SetSh & "!" & CN & HikGyo & "))"
870867,868:2011/07/25(月) 14:31:38.34
>>868

セットしたい数式は、まさにおっしゃる通りのものです。
SetShがシート名(String型配列から取り出す)、CNは列指定のための文字列(固定)、SetShは行数(処理の進行に応じて加算)です。

Aの式だけだと、セルに数式を設定したことにはならないのでしょうか。
というよりも、@の段階でセルを設定する必要がある、という解釈が正しいのでしょうか。


871867,868:2011/07/25(月) 14:52:54.11
>>869

修正版の提示、ありがとうございます!

@:ISERRORの後の括弧も文字であるため、&で連結する必要があった
A:変数の部分に関しては""で括る必要がない(=文字列のみ2重のダブルクォートで囲めばよい)と考えていた

であるということでしょうか。
ひとまず、家の環境で試してみます。

※スレのルールを無視して申し訳ありませんでした。
この問題で悩んでいる環境は、WindowsXP・Excel2003という環境です。
これから試してみる環境は、Windows7・Excel2010です。
872デフォルトの名無しさん:2011/07/25(月) 16:17:39.99
こういう低レベルな処理で訳解らなくなってる奴って、
大抵連結で繋ぎすぎとか入れ子を重ねすぎとかやらかしてるよね
能力もないのにベテランぶって一括一発で処理を書こうとするから解らなくなる

CellAddress = "CN" & HikGyo
CellPath = SetSh & "!" & CellAddress
とかやって、3ヶ所有る「SetSh 〜〜〜 HikGyo」を「CellPath」に変えるだけでも
かなり解りやすいコードになるはず

CalcStr = "=IF(ISERROR(" & CellPath & "),"""",IF(" & CellPath & "="""",""""," & CellPath & "))"
873デフォルトの名無しさん:2011/07/25(月) 18:22:48.81
> CalcStr = "=IF(ISERROR(" & CellPath & "),"""",IF(" & CellPath & "="""",""""," & CellPath & "))"
これがベテランのコードですか。
874デフォルトの名無しさん:2011/07/25(月) 20:56:28.40
VBAのベテランつうのも何かな
875デフォルトの名無しさん:2011/07/25(月) 22:19:07.48
妥協点としては悪くないよ。
ワークシートの数式なんて元々泥臭くなりがちだし。
876デフォルトの名無しさん:2011/07/26(火) 00:24:25.71
>>873
それが最良の正解って事ではなく、方法論の一つとして
CalcStr = "=IF(ISERROR(SetSh & ""!"" & ""CN"" & HikGyo),"""",IF(SetSh & ""!"" & ""CN"" & HikGyo = """","""",SetSh & ""!"" & ""CN"" & HikGyo))
よりは
CellAddress = "CN" & HikGyo
CellPath = SetSh & "!" & CellAddress
CalcStr = "=IF(ISERROR(" & CellPath & "),"""",IF(" & CellPath & "="""",""""," & CellPath & "))"
の方が良いだろってだけの話じゃねーの?
877超ベテラン:2011/07/26(火) 03:53:04.47
まー一人で触るもんなら最終的に文字数が短くなるのがジャスティス
878デフォルトの名無しさん:2011/07/26(火) 10:37:38.10
>>865
俺は859じゃなく860なんだが、お前がワークシート関数に詳しいとは思えんなぁ。
879デフォルトの名無しさん:2011/07/26(火) 10:56:48.74
>>860の補足だが
0.6 A  0
0.3 B  0.6 ←=C1+A1
0.1 C  0.9 ←=C2+A2
こんな表作って=LOOKUP(RAND(),C1:C3,B1:B3)でもよかったな。
INDEXとMATCHを使うまでもなかったわ
880デフォルトの名無しさん:2011/07/26(火) 12:14:57.86
>>859の式って40%の確率でサイコロを2回振ることになるけど、それで正確な確率が求まるの?
1つの式の中ではRAND()は1回にしないとまずいんじゃない?
881デフォルトの名無しさん:2011/07/26(火) 12:27:26.64
>>880
求まる。
10万個くらい式を入力して数えたら?
=IF(RAND()<A$1,B$1,IF(RAND()<(A$2/(1-A$1)),B$2,B$3))
882デフォルトの名無しさん:2011/07/26(火) 12:42:10.77
別にさいころを二度振っても答えは出る。
頭の固いやつは理解出来ないのかなぁ。
865=880なのか?
883デフォルトの名無しさん:2011/07/26(火) 21:04:50.59
大学の情報科学の課題です、まったくてがつけられていないです・・・
回答よろしくお願いします。


反応速度式が次式で表される二次反応がある。
t=0におけるAの濃度が[A0]である時、[A]の時間変化を数値計算を用いて求めるプログラムを作成せよ(エクセルVBA)。尚、kは下表を用い、A0は任意に入力できるようにする。

−d[A]/dt=k[A]^2

反応 k/L mol^-1s^-1
2NOBr→2NO+Br2 0.80
2NO2→2NO+O2 0.54
H2+I2→2HI 2.42×10^-2
D2+HCl→DH+DCl 0.141
2I→I2 7×10^9
H++OH-→H2O 1.5×10^11

質問はここであっていたでしょうか・・??
884デフォルトの名無しさん:2011/07/26(火) 21:06:57.31
質問スレではあるがお前が思っているような場所ではない
帰れ
885デフォルトの名無しさん:2011/07/26(火) 22:27:43.29
ただいま
886デフォルトの名無しさん:2011/07/26(火) 22:39:33.05
ただいマンボウ
887デフォルトの名無しさん:2011/07/27(水) 06:36:00.31
>>883
そういうのは大学で聞けよ
何のために大学行ってるんだよ?
自分の知らないことを教えて貰うためだろ

今、大学以外で教えを乞うて、大学では自力で課題をこなしたかのように見栄を張ってもなんにもならない
解らないことは解らないと正直に言って、きちんと教わってこい
888デフォルトの名無しさん:2011/07/27(水) 07:38:10.69
ユーザーフォームでもシートでも場所はどこでもいいので何かファイルをD&Dしたら
そのファイルのパスを取得したいのですがどうしたらできますか?
889デフォルトの名無しさん:2011/07/27(水) 07:47:14.33
>>888
Excel2003のVBAにて、ファイルのドラッグ&ドロップでファイルパスとファイル名の...
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1317565268

やりたいのはこれ?
890デフォルトの名無しさん:2011/07/27(水) 07:49:29.40
>>889
おぉありがとうございました
調べてから質問するようにします
891デフォルトの名無しさん:2011/07/27(水) 07:53:00.68
これってユーザーフォームでも同様にできるんですか?
892デフォルトの名無しさん:2011/07/27(水) 08:07:18.65
859ですが一瞬でもラウンドを2回まわすような式は避けるのがジャスティス
893デフォルトの名無しさん:2011/07/27(水) 10:50:13.38
本人がそう言うなら仕方ないが、俺にワークシート関数を一から勉強しなおせって言ったやつどこ行った?
答えが出ることも理解できない馬鹿なんだから、あまり偉そうなこと言わん方がいいね。
894デフォルトの名無しさん:2011/07/27(水) 11:34:02.42
Openoffice使ってVBA勉強したくなったんだが、正直何から手つけて良いのかわからん
オススメの本とかある?
895デフォルトの名無しさん:2011/07/27(水) 12:38:50.05
>894
素直にExcel使った方がいいんじゃないかな?
ダウンロードして2ヶ月お試しして、身につかなかったらあきらめる、でいいのでは?
(さらに使いたければ内部カレンダを巻き戻す、と)
896 【東電 75.1 %】 :2011/07/27(水) 13:08:01.94
>894
KingsoftOfficeのことかな?
897デフォルトの名無しさん:2011/07/27(水) 13:38:24.36
>>894
OpenOfficeはいい参考書が少ない
素直に本物のExcelの期間限定版を無料ダウンロードした方がいい
あと、本を買うときはちゃんと2010に対応したやつを選ぶこと
バージョンが違うとメニューのデザインなんかが変わるから、初心者はそこでつまづく
898デフォルトの名無しさん:2011/07/27(水) 15:43:46.71
仕事で使っているファイルの印刷範囲指定を楽にするため、マクロ記録を使いながら
フォームコントロールで印刷ボタンを作りました。
ただ、その顧客情報によってファイルの名前を変えて一つ一つ保存している為、
ファイル名が変わると印刷マクロが機能しません。
他の方法を調べた結果、アドインとして登録しようと思い、早速実行してみました。
が、「実行時エラー424 オブジェクトが必要です」と表示され動きません。
ネットで調べながらやってはいるのですが、どこを修正すべきなのか分かりません……
申し訳ありませんが、お知恵を貸して頂けないでしょうか?
以下がそれぞれの式になります。

1:アドイン(ファイル名=印刷アドイン)
Sub印刷マクロ()
'
If (vbYes <> MsgBox("印刷します。よろしいですか?", vbYesNo)) Then
Exit Sub
End If

Range("A1:Z41").Select
ActiveSheet.PageSetup.PrintArea = "$A$1:$Z$41"
ActiveWindow.SelectedSheets.PrintOut Copies:=1
ActiveSheet.PageSetup.PrintArea = ""
End Sub

2:実行用マクロ
Sub テスト()

Application.run macro:=”印刷アドイン!印刷マクロ”

End Sub
899デフォルトの名無しさん:2011/07/28(木) 09:16:56.73
まずはエラー箇所の特定を。
そのメッセージボックスで中断だかってボタンあるでしょ?
それでわかるはず
900デフォルトの名無しさん:2011/07/28(木) 11:33:24.46
ちょっと教えて下さい。
テキストファイルをOpen Input で読み込んで、例えば
===== hello =====
の行を半角空白でsplitしてhelloの文字列を抜き取りたいのですが
splitするときに、先頭に=があるとアプリケーション定義またはオブジェクト定義のエラーです。と怒られるのですが、なぜエラーになるのでしょうか。また回避するベストな方法は何でしうか。
宜しくお願い致します。
901デフォルトの名無しさん:2011/07/28(木) 11:36:20.99
底の部分のコード晒しなさいよ
902デフォルトの名無しさん:2011/07/28(木) 12:06:34.20
>>900ですが解決しました。ありがとうございました。
903デフォルトの名無しさん:2011/07/28(木) 23:20:45.41
コマンドボックスの内容が変わったら別のプロシージャを呼び出し
そのプロシージャ内でComboBox1の内容を判断して
果物だったら"いちご" "みかん"等をComboBox2から選びたいのですが
一番したの行からどのように記述すれば良いか悩んでいます。
分かる方どのようにすれば良いのかアドバイス頂けると助かります。
よろしくお願いします。

Private Sub UserForm_Initialize()
With ComboBox1
.AddItem "果物"
.AddItem "野菜"
End With
End Sub

Sub ComboBox1_change()
Dim a As String
Call test(a)
End Sub

Sub test(ByVal a As String)
904デフォルトの名無しさん:2011/07/29(金) 00:20:48.48
前も見たような気がしなくもない
905デフォルトの名無しさん:2011/07/29(金) 00:41:37.10
>>903
testの引数のaはどうする予定なんだ?
多分こんな感じだろ

Sub ComboBox1_change()
    Call make_combo2(ComboBox1.Text)
End Sub
Sub make_combo2(s As String)
    ComboBox2.Clear
    Select Case s
        Case "果物"
            ComboBox2.AddItem "いちご"
            ComboBox2.AddItem "みかん"
    End Select
End Sub
906デフォルトの名無しさん:2011/07/29(金) 00:53:26.74
他の方法として 選択肢が少ないなら
Sub test(ByVal a As String)
 Select Case a
  Case "果物": ComboBox2.List = Array("いちご", "みかん", "ぶどう")
  Case "野菜": ComboBox2.List = Array("だいこん", "とまと", "こぼう")
 End Select
End Sub
とか
あとは.RowSource 使ってシートからもってくるとか
907デフォルトの名無しさん:2011/07/29(金) 06:21:42.56
ユーザーフォームの実行1回に対して、ComboBox1の選択は基本的に1回しか行わないなら
AddItemで一つずつ入れたり、逐一Arrayで配列作ったりしてもいいけど
ComboBox1を何度も選択変更するならこうだな

Private buf As Collection

Private Sub UserForm_Initialize()
  Set buf = New Collection

  ComboBox1.AddItem "野菜"
  buf.Add Array("にんじん", "たまねぎ", "じゃがいも"), "野菜"

  ComboBox1.AddItem "果物"
  buf.Add Array("りんご", "みかん", "かき"), "果物"
End Sub

Private Sub ComboBox1_Click()
  ComboBox2.Clear
  ComboBox2.List = buf(ComboBox1.Text)
End Sub

一度しか実行されない UserForm_Initialize は多少複雑になってもいいから
何度も実行される ComboBox1_Click の処理量を減らす
908デフォルトの名無しさん:2011/07/29(金) 08:10:34.66
>>899
返信遅れました、すみません

メッセージボックスの表示は「はい」か「いいえ」しか表示されていません……
範囲指定〜印刷までの式か、アドイン登録の方法か、どちらかが間違っているんでしょうか?
909903:2011/07/29(金) 14:28:59.51
>>905-907
答えてくださってありがとうございます。
一つのプログラムに対してもいくつも方法があるんですね。
ホントありがとうです。
910デフォルトの名無しさん:2011/07/29(金) 14:54:44.44
>>908
実行時エラーのでたコードを特定しないと前に進まないと思うよ
EXCELのバージョンによるかもだけど
エラーメッセージが出たとき「デバック」が選べるはず

実行時エラーのでたコードが特定されてないので
違ってるかもだけど ちょっと気になった点を

アドインは開いていないと 通常使えないハズだけど開いている?
(Excel本体では見えないけど VBEからだと確認できる)
あと
アドイン・ファイル名は 印刷アドイン.xla とかじゃない?
Application.run macro:="印刷アドイン.xla!印刷マクロ"
だと思うんだけど
911デフォルトの名無しさん:2011/07/29(金) 16:02:21.24
>>910
アドバイスありがとうございます。
仰る通り、アドイン名.マクロ名で打ち込んだらファイル名を変えても問題なく動作しました。
無知な質問にお答え頂き本当にありがとうございました。

912デフォルトの名無しさん:2011/07/30(土) 01:36:12.16
複乳さんに質問なのじゃが
VBAでpersonal.xlsbを作る方法は、マクロの記録でダミーのを作ってから、以外にありますか?
913デフォルトの名無しさん:2011/07/31(日) 02:35:41.66
vbaでクローラ作るのって無謀っていうか馬鹿ですか?
914デフォルトの名無しさん:2011/07/31(日) 02:54:23.95
>>913
クロールする範囲にもよるけどVBAじゃ効率悪いと思う
915デフォルトの名無しさん:2011/07/31(日) 03:05:37.35
2chの指定した板の中を延々と特定の文字列が含まれたレスを見つけるまでクロールする奴です
考えているのはsubjectから板一覧を取得してそこからdatを一つ一つ見ていくというものなんですがやっぱVBAじゃやめたほうがいいですか
916デフォルトの名無しさん:2011/07/31(日) 03:40:36.89
>>915
たしか連続で読み込みを続けるとアクセス規制されるんじゃなかったっけ?
917デフォルトの名無しさん:2011/07/31(日) 04:58:38.36
>>913
VBで作ってからvbaで実現する方法考えたほうが絶対に早い
読み込みだけなら割とすぐに作れる。書き込みはかなり面倒だけど
vbaはクラス作るのもややこしい上、面倒
918デフォルトの名無しさん:2011/07/31(日) 13:11:01.72
>>913
馬鹿かどうかは判らんが友達にはなりたくないタイプ
919デフォルトの名無しさん:2011/07/31(日) 13:37:59.87
本では標準モジュールにコードを書くよう指導されてますが
SheetやThisWorkbookにコードを書く是非や長所・短所について教えてください
920デフォルトの名無しさん:2011/07/31(日) 13:52:44.08
長所や短所なんてのは、特性に対して個々が勝手に判断するものだ
同じ特性でも、人によって長所に感じることも有れば短所に感じることもある
自分のプログラミングスタイルの変化によって、以前は短所に思えていた特性が
長所に思えるようになることもあるし、その逆も然り

なので、長所や短所という視点ではなく、それぞれの特性という視点で情報を集め
それらが長所か短所かは、自分の作る物やプログラミングスタイルに照らし合わせて
自分で判断しな

で、標準モジュール、クラスモジュール、ブックやシートの付随モジュールそれぞれの特性は
ググればいくらでも出てくるから自分で調べな
921919:2011/07/31(日) 14:06:01.39
アホが釣れてる(藁)
922デフォルトの名無しさん:2011/07/31(日) 14:15:20.78
VBAは結構やってるけどクラスは1回もやったことない
何に使うの
923デフォルトの名無しさん:2011/07/31(日) 14:41:25.06
>>922
真っ当に使うならラップして似非オーバーロードするくらいしか思いつかん
一人で作る分にはあまり恩恵に預かれない
複数人が関わって、標準モジュールだと問題ありの場合に出番だと思う
今時そんな事してるところがあるのかは知らんけど(メンテ除く)
924デフォルトの名無しさん:2011/07/31(日) 16:01:23.27
ある程度VBAは使いこなせてますが
変数やプロシージャのスコープのことがさっぱりわからないんです。

分り易く理解するコツや
こう考えたりこうイメージしたら分りやすいよ
みたいなアドバイスはありますか?
925デフォルトの名無しさん:2011/07/31(日) 16:17:25.96
load
initialize
show
の違いは何かと聞いておるのだ
926デフォルトの名無しさん:2011/07/31(日) 17:01:02.89
>>922
エクセルのセルが優秀すぎて、VBAだとほとんど出番が無い
927デフォルトの名無しさん:2011/07/31(日) 18:50:28.13
>>921
真っ当な意見に、論で言い返せない故の悔し紛れ?
928デフォルトの名無しさん:2011/07/31(日) 19:24:57.20
優秀過ぎてというか
下手に手を出すと地獄を見そうだから
触らぬ神に祟り無しっていう態度
929デフォルトの名無しさん:2011/07/31(日) 22:35:48.28
いろんなbookやsheetを扱ってるとき
単に cells(1,1).value とすると、どこのbookのどのシートを指しますか?

これに関連して、
activeとかselectの概念って、
ある時において、bookもsheetもcellのそれぞれについて、activeなものとselectされてるものが存在してるのでしょうか?
930デフォルトの名無しさん:2011/07/31(日) 22:56:10.07
1.activebook.activesheet

2.yes
931デフォルトの名無しさん:2011/07/31(日) 22:56:58.54
>>929
ええとね、まずアプリケーションが一番上にいて、
その中にActiveなBookがいて、更にその中にActiveなSheet、SelectされたSheetがいて、
更にその中にSelectされたRangeやActiveなCellがいるんじゃない?
だから何も考えずに複数のBookを扱って対象のBookを選ばずにActiveなBookに対して処理を行うと、
本当は違うBookに処理を行いたかったのに、最後に開いたBookを処理しちゃったり
する様なことが起きるんだと思うよ。
932デフォルトの名無しさん:2011/07/31(日) 23:06:23.23
実数を扱うとき
SingleとDoubleは、どっち使ったほうが使いやすいですか?

場合によるだろうけど一般的な話で。
933デフォルトの名無しさん:2011/07/31(日) 23:11:21.01
>>929
標準モジュールの場合はアクティブなブックのアクティブなシート、
シートモジュールの場合は、そのモジュールの属するシート、
ブックモジュールの場合、Cellsは標準モジュールと同じでアクティブなブックのアクティブなシートだが、
Worksheetsは、アクティブなブックのものではなくモジュールの属するブックのものになる。

activeとselectは、単一のセルやシートに対して有効な操作の対象となっているものがactive、
複数のセルやシートに対して有効な操作の対象となっているものがselect、因みにbookにselectは無い。

文字入力はCtrlキーを押しながら確定しない限り、基本的に単一セルが対象だが、Deleteキーによる消去は複数セルに有効。
シートでも削除や移動は複数シートに対して行えるが、名前の変更は複数選択していても表示状態の単一のシートに対してしか行えない。

このように、セルやシートでは複数に対して有効な操作と、単一のもののみに有効な操作があるのでactiveとselectが存在している。
934デフォルトの名無しさん:2011/07/31(日) 23:14:03.26
>>931
例えばですよ、CTRLを押しながらSHEETをクリックすれば
たくさんsheetが選べますよね
これがたぶん複数のsheetがselectされた状態だと思うんですよ
で、目の前に見えてるsheetがactiveなシート。

複数のsheetを選んでたら[作業グループ]と出るので分かります。
この状態で、「あ」と入力すると、なんとすべてのシートで「あ」が入力されるんです。

ということは、その状態ではactiveセルは各シートごとに複数存在するってこと?
935デフォルトの名無しさん:2011/07/31(日) 23:19:22.74
>>934
Select>Activeってだけだろ
もしかして四則演算ができない人?優先順位って概念は分かる?
936デフォルトの名無しさん:2011/07/31(日) 23:20:57.88
例えばsheetを3つ作って、
それぞれで別のセルを複数選択すると、
なんと各シートで別々の場所のセルが複数選択されてるのと単一のセルがactivateになってるのが各シートで記憶されてるんですよ。

これはどういうこと?
activecellは、常にsheetの数だけ存在する?
937デフォルトの名無しさん:2011/07/31(日) 23:23:50.65
性器のダイハツ券をしました。

もしsheetを複数選択すればその瞬間にすべてのシートにおいて同じセル住所が選択された状態になり、同じセル住所がactivateされた状態になるんですよ。
938デフォルトの名無しさん:2011/07/31(日) 23:32:54.70
また発見。
sheetを複数selectして
マクロでselectionに文字を書き込んだら
その選択したすべてのシートの同じcell番地がすべて文字列で埋まりますわ
939デフォルトの名無しさん:2011/07/31(日) 23:35:53.18
知っとるけのけ?
2つシートをselectしてて
マクロでcells(1,1).value="うんこ"を実行したら
どのシートに「うんこ」と表示されると思う?

(1) 2つのシートのA1
(2) 1つのシートのA1
(3) どちらでもない
940デフォルトの名無しさん:2011/07/31(日) 23:37:22.08
いやぁ、そりゃ複数選択して処理を行っているんだから同じ処理が走ると思うよ。
むしろ、選択して違う処理が走ったら問題じゃないかと思うんだけど。
941デフォルトの名無しさん:2011/07/31(日) 23:39:47.30
>>940
あなたの回答は(1)ですね
残念、はずれ
政界は(2)でした
942デフォルトの名無しさん:2011/07/31(日) 23:40:49.72
ああ、>>940>>937>>938へのレスね。
943デフォルトの名無しさん:2011/07/31(日) 23:43:00.88
>>941
一つと言うよりActiveなシートの方に反映されるでしょ?
SelectとActiveはその辺ちょっと違うし。
944デフォルトの名無しさん:2011/07/31(日) 23:44:31.34
次の問題。

2つシートをselectしてて
マクロでactivecell="まんこ"を実行したら
どこに「まんこ」と表示されると思う?

(1) 2つのシートの2つのactivecell
(2) 1つのシートの1つのactivecell
(3) どちらでもない
945デフォルトの名無しさん:2011/07/31(日) 23:53:51.74
>>944
へぇ、両方のシートに反映されるんだ。
これは意外。内部的に一つ目とどう違う処理が走ってるの?
946デフォルトの名無しさん:2011/07/31(日) 23:54:23.80
変数で実数を扱うとき
SingleとDoubleは、どっち使ったほうが使いやすい?
947デフォルトの名無しさん:2011/07/31(日) 23:54:42.43
ユーザフォームのイベントを一時的に禁止する方法はないでしょうか?
下の様にコードを書いているのですが
※P2_StartPage,P2_EndPage はComboBoxです

★の所でChangeイベントが出てしまい正しい初期値が設定できません
UserForm_Initialize実行後は
 P2_StartPage.Value = 1
 P2_EndPage.Value = 1
となって欲しいのですが実際には
 P2_StartPage.Value = ""  '空白
 P2_EndPage.Value = 1
となってしまいます

Changeイベントが出てるのでこうなるのは分かるで
取り合えず今はコードを工夫してなんとか しのいでいますが

そもそもとしてイベントを一時的にでも禁止する方法はないでしょうか?
※Application.EnableEvents = False
を入れてみても止まらなかった

改行が多すぎます!! といわれたので分けます
948947:2011/07/31(日) 23:55:20.74
続きです
Private Sub UserForm_Initialize()
  With P2_StartPage
   .ListRows = 10
   For i = 1 To 99
     .AddItem
     .List(.ListCount - 1) = i
   Next
   .Value = .List(0)  '★
 End With
 With P2_EndPage
   .ListRows = 10
   For i = 1 To 99
     .AddItem
     .List(.ListCount - 1) = i
   Next
   .Value = .List(0)  '★
 End With
End Sub

Private Sub P1_StartPage_Change()
  If Val(P1_StartPage.Value) > Val(P1_EndPage.Value) Then
    P1_EndPage.Value = P1_StartPage.Value
  End If
End Sub

Private Sub P1_EndPage_Change()
  If Val(P1_StartPage.Value) > Val(P1_EndPage.Value) Then
    P1_StartPage.Value = P1_EndPage.Value
  End If
End Sub
949デフォルトの名無しさん:2011/07/31(日) 23:55:33.89
>>945
それは複乳さんが答えてくれるよ。
お〜い、いるかな?
950デフォルトの名無しさん:2011/08/01(月) 00:02:04.04
サブルーチンを呼ぶとき、
Call ○○○

○○○
と単に書くのと
どっちが望ましい?
951デフォルトの名無しさん:2011/08/01(月) 00:12:29.19
>>950
戻りが欲しいとかでない限り、明示的にcallで呼んだ方が
第三者から見ても後から自分で見てもいいと思うぞ
952デフォルトの名無しさん:2011/08/01(月) 00:20:44.24
>>950
Callを使わないなら括弧で括らない。
何かそんな話をこのスレでずっと前に言ってた様な・・・
まぁ>>951の通りでいいと思う
953デフォルトの名無しさん:2011/08/01(月) 00:24:39.54
>>952
ttp://home.att.ne.jp/zeta/gen/excel/c04p11.htm

こことか読んでみるといいと思うぞ
954デフォルトの名無しさん:2011/08/01(月) 07:40:27.86
自分は引数が無いSubプロシージャを呼び出す時に
明示的にCallを書くことがある位だなあ。
識別子だけで浮いているのが気持ち悪いので。
955デフォルトの名無しさん:2011/08/01(月) 12:21:00.71
>>932
場合による
「一般的」は存在しない
956デフォルトの名無しさん:2011/08/01(月) 12:48:21.55
迷ったらDouble
957デフォルトの名無しさん:2011/08/01(月) 13:35:13.05
Single=計算スピードが速い、メモリ節約、有効桁数が少ない
Double=計算が遅い、メモリ食う、有効桁数が多い(精度が高い)

ちゃんと考えて使い分けろ
958デフォルトの名無しさん:2011/08/01(月) 16:51:12.99
いきなり伸びてるが産業
959デフォルトの名無しさん:2011/08/01(月) 19:41:56.46
わたしはむか〜しBASICという言語で、それこそ「マイコンBASICマガジン」に投稿するほど、BASICの達人でした。
その後プログラミングは全くやってませんが、VBAを始めました。

どの入門書・初心者向けの本を見ても、
「変数のスコープ」だとか、「サブルーチン」をバンバン使う書き方とか、モジュールの概念(標準モジュール・フォームモジュール・シートモジュールの使い分けなど)とか、
一番知りたい情報がないんです。

これらはどのように学べばいいですか?
昔BASICやってたので、プログラムとはどういうものかという知識はあります。
まだ大型書店には行ってませんが、もしそういう本があれば行ってみるつもりです。
960デフォルトの名無しさん:2011/08/01(月) 20:00:37.21
>>959
今は本ではなくネットで勉強する時代に変わりました
本は物理的に大きさが限られているため、現代の複雑なプログラムをすべて説明するのは
場所が足りなくて不可能だからです
「VBA スコープ」などのキーワードで検索してください
961デフォルトの名無しさん:2011/08/01(月) 20:25:34.73
>>959
時代が経過して、今では構造化言語、オブジェクト指向型言語、関数型言語とどんどん様変わりし、
貴方の時代のPGとは考え方も組み方もまるで変わっています。
その中でもVBAは構造化言語とオブジェクト指向言語の中間に位置する、
今の貴方の立場としては比較的覚え易い言語と言えますが、
今後の事を考えると最新のVBやC#などを最初から全て覚え直すつもりで勉強した方が、
周り道の様ですが結局速くいろんな言語に対応出来る様に思います。
特にC#などは、今までやっていたであろうBASICの知識と混合する事なく覚える事が出来るでしょう。
一つの世代が変わった言語でPGを組むと言うのは、それ程までに容易では無いと言えます。
962デフォルトの名無しさん:2011/08/01(月) 22:58:56.01
でも「いつかはCを覚えたい」と思ってるなら先にやっといた方がいいよね
後回しにするといろいろ面倒
知識レベルならともかく、いざ実装しようとすると面倒臭くて死にそうになる
963デフォルトの名無しさん:2011/08/02(火) 02:41:23.34
Dim x as String
x = tes1 & "abc" & qr & "tes2"
ってあったとして(tes1,tes2,は長さ不明の文字列)(qrは長さ不明の数字の文字列)
xの中から"abc"の後ろの数字の部分を抜き取るにはどうしたらいいでしょうか

例えばxが
goiwhabc123oajfa だったら123を返す
とか
fabc1512few だったら1512を返す
こんな感じです
964デフォルトの名無しさん:2011/08/02(火) 02:41:54.08
"tes2"じゃなくてtes2で変数でした
965デフォルトの名無しさん:2011/08/02(火) 07:27:49.71
Val(Mid$(x, InStr(x, "abc") + 3))
超不真面目にやるならこんな感じだな。
966デフォルトの名無しさん:2011/08/02(火) 08:20:06.57
せいきひょうげん!
せいきひょうげんを使う!
967デフォルトの名無しさん:2011/08/02(火) 08:43:33.73
性器表現とは?
露出狂になるんですか?
968デフォルトの名無しさん:2011/08/02(火) 09:20:58.28
つかそれqrそのものじゃないのか?
969デフォルトの名無しさん:2011/08/02(火) 09:28:41.23
Quality of Rifeですか?
970デフォルトの名無しさん:2011/08/02(火) 09:33:04.34
VBではRnd
VBAではRand()

どうにかならんか?
971デフォルトの名無しさん:2011/08/02(火) 09:37:11.15
あれっ
asc("○")ってVBではアスキーコード番号を教えてくれる関数だったと思ったが
VBAでは全角を半角に変える関数になってないか?
972デフォルトの名無しさん:2011/08/02(火) 09:48:42.84
おろどきました。
シート3つあれば、それぞれについてアクティブセルが記憶されてるんです
例えば3つの各シートで全く別のセル住所をアクティブにしておいて
下のマクロを実行するとよく分ります。

Sub てすと()
Sheets(1).Activate
ActiveCell = "うんこ"
Sheets(2).Activate
ActiveCell = "まんこ"
Sheets(3).Activate
ActiveCell = "ちんこ"
End Sub
973デフォルトの名無しさん:2011/08/02(火) 10:20:06.41
何がおどろきなのか判らん
974デフォルトの名無しさん:2011/08/02(火) 10:20:29.36
VBAから他のソフトのボタンとか操作できる?
975デフォルトの名無しさん:2011/08/02(火) 10:22:45.23
Excel 2003 , Win7 で、
ワークシート上に、スクロールバーを置いて、それにより、セルの値を増減させたいです。
しかし、うまくいきません。
・スクロールバーを右clickして、そのプロパティを出します。
・LinkedCell の値に、Sheet1!B10などと、表示したい目的地のセルを書き込みます。
・しかし、プロパティの枠の中のLinkedCellの枠に「Sheet1!B10」と打ち込んで、
 リターンをすると、そのプロパティの枠の中が消えてしまい、
 真っ白になってしまいます。何度やっても書き込めません。
・スライドバーやスピンボタン、どちらもできませんでした。

スライドバーやスピンボタンで、指定したセルの値を変化させる方法は、
上記では間違っているでしょうか?
どうやってやれば実現するでしょうか?

宜しくお願いします。
976デフォルトの名無しさん:2011/08/02(火) 10:57:39.30
>>974
できるけどSendMessageとかAPI使うしボタンのハンドル取得するまでが大変
UWSとか他アプリを操作するソフトをShellで起動した方が簡単
977デフォルトの名無しさん:2011/08/02(火) 11:13:10.62
Form_InitializeとForm_Loadの違いとは?
978デフォルトの名無しさん:2011/08/02(火) 13:04:35.54
>>970
VBAにRand()なんてあったか?
979デフォルトの名無しさん:2011/08/02(火) 13:28:48.97
>>978
無いと思っているのか?
980デフォルトの名無しさん:2011/08/02(火) 19:57:26.26
>>979
VBAにはRandは無いと思うぞ
Randはワークシート関数
そしてVBAにもRndはあるんだが
981979:2011/08/02(火) 20:08:59.88
釣れた(ワラ
982デフォルトの名無しさん:2011/08/02(火) 20:27:15.49
恥ずかしい勘違いをしてしまったことに気付いたときに
誤魔化しとしてつぶやく言葉・・・・・それは

     釣れた(ワラ
983979:2011/08/02(火) 20:32:55.48
(爆)
984デフォルトの名無しさん:2011/08/02(火) 20:39:50.45
(核爆)
985979:2011/08/02(火) 20:45:58.42
986デフォルトの名無しさん:2011/08/02(火) 21:20:07.88
A1:E50の中で一番下に要素がある行を返すのと一番右に要素がある列を返す方法を教えてください
987デフォルトの名無しさん:2011/08/02(火) 21:37:33.45
988デフォルトの名無しさん:2011/08/02(火) 21:49:59.32
>>986
1つもなかったら0を返す

Sub aaa()
  r = 50
  Do While r >= 1 And cat1(r) = 0
    r = r - 1
  Loop
  c = 5
  Do While c >= 1 And cat2(c) = 0
    c = c - 1
  Loop
  Debug.Print r, c
End Sub

Function cat1(r)
  If r >= 1 Then s = WorksheetFunction.CountA(Range(Cells(r, 1), Cells(r, 5)))
  cat1 = s
End Function

Function cat2(c)
  If c >= 1 Then s = WorksheetFunction.CountA(Range(Cells(1, c), Cells(50, c)))
  cat2 = s
End Function
989977:2011/08/02(火) 21:52:00.99
>>987
I'm afraid I do not speak English, nor do I read it.
It would be really, truly, absolutely helpful, if you could provide me with some information regarding 'Form methods' in Japanese.
990デフォルトの名無しさん:2011/08/02(火) 22:10:45.94
>>987
とても役立ちました
ありがとうございます!
991デフォルトの名無しさん:2011/08/02(火) 22:11:59.47
992デフォルトの名無しさん:2011/08/02(火) 22:35:42.98
"<"から">"まで(下のでいう<koko>,<kokomo>)を見つけ出してそれを改行コードのvbCrLfに置換したいのですがどうしたらいいでしょうか?
"abc<koko>def<kokomo>ghi"
置換後は
"abc" & vbCrLf & "def" & vbCrLf & "ghi"
このようにしたいです
<>内またその外の文字数は不明です

お願いします
993デフォルトの名無しさん:2011/08/02(火) 22:53:27.76
ユーザーフォームのラベルの文字の書式について

ワークシートに"123"とあり、2だけ赤字
これをラベルに反映されるにはどうしたらよいでしょうか?

forecolorではNullとなりエラーとなったので質問します。
994デフォルトの名無しさん:2011/08/03(水) 00:02:15.55
一つのラベルじゃ無理
桁ごとにラベル用意するかピクチャボックススに書く
995デフォルトの名無しさん:2011/08/03(水) 01:34:36.97
>>992

Sub AAA()
Dim A As String
A = "abc<koko>def<kokomo>ghi"
A = Replace(Replace(A, "<koko>", vbCrLf), "<kokomo>", vbCrLf)
MsgBox A
End Sub
996デフォルトの名無しさん:2011/08/03(水) 02:00:41.18
For i = 1 To r
For le = c To 5
For te = 5 To le - 1
If Cells(i, le).Value = Cells(i, te).Value _
Then Cells(i, le).Clear
Next te
Next le
Next i

rは要素がある最大行,cは要素がある最大列
これで重複を消そうとしたのですがうまくいきません
どうしたらいいでしょうか
997デフォルトの名無しさん:2011/08/03(水) 02:07:48.95
すみませんstep -1を付けたらうまくいきました
forを逆からやるときってstepでマイナスつけないといけないんですね・・・
998デフォルトの名無しさん:2011/08/03(水) 20:14:45.49
age
999デフォルトの名無しさん:2011/08/03(水) 21:05:41.49
______  ___________
         V
    _____
   /::::::::::::::::::::::::::\                  _
  /::::::::::::::::::::::::::::::::::::::\             /  ̄   ̄ \
  |:::::::::::::::::|_|_|_|_|           /、          ヽ はぁ?黙ってろデブw
  |;;;;;;;;;;ノ   \,, ,,/ ヽ          |・ |―-、       |
  |::( 6  ー─◎─◎ )          q -´ 二 ヽ      |
  |ノ  (∵∴ ( o o)∴)          ノ_ ー  |     |
/|   <  ∵   3 ∵>          \. ̄`  |      /
::::::\  ヽ        ノ\           O===== |
:::::::::::::\_____ノ:::::::::::\        /          |
1000デフォルトの名無しさん:2011/08/03(水) 21:06:45.39
うんこチンチン
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。