Excel VBA質問スレ Part7 at TECH
[2ch|▼Menu]
[前50を表示]
800:デフォルトの名無しさん
08/08/13 11:30:00
>>799
共通する部分の処理でプロシージャを作り
Callで呼べばいい

801:デフォルトの名無しさん
08/08/13 11:50:00
>>800 ありがとうございます!!
さっそく試してみます。

ステートメントを早くいろいろ覚えないと
後で「こんなステートメントあったんだ!じゃぁあの時
もっと簡単にプログラムできたじゃん!」って思うことが多いです(;;
もっとよく勉強します。
本当にありがとうございました。

802:デフォルトの名無しさん
08/08/13 11:55:04
>>801
>後で「こんなステートメントあったんだ!じゃぁあの時
>もっと簡単にプログラムできたじゃん!」って思うことが多いです(;;

それが糧になるんだよ。決して無駄にはならないさ。
# 仕事なら話は別だが。

803:デフォルトの名無しさん
08/08/14 10:48:11
アクティブシート上にあるすべてのボタンを消去するのって
ActiveSheet.Buttons.Delete
じゃ駄目なんですか?
いくら実行しても何も起こらないんですが。

804:デフォルトの名無しさん
08/08/14 10:58:14
画面に向かって「消えろー」って10回叫べば消えるかも

805:デフォルトの名無しさん
08/08/14 11:13:52
for each

806:デフォルトの名無しさん
08/08/14 11:27:47
>>803
゙ボタン゙と言っているのはオートシェイプ?マクロ用のボタン(名前忘れた)?

807:デフォルトの名無しさん
08/08/14 11:53:50
>>806
オートシェイプです。

すいません、今調べたら
ActiveSheet.DrawingObjects.Delete
という命令でシート上のボタンはすべて消せることがわかりました。

追加で質問なんですが、一行目に配置されたボタンだけを残し、二行目以降のボタンをすべて消去する方法ってありますか?


808:デフォルトの名無しさん
08/08/14 12:07:36
>>807
プログラム化するならわからんが、オブジェクトの選択(矢印の付いたアイコン)
で範囲選択したら、その領域内に含まれる図形は全て選択できるからデリートで消す

809:デフォルトの名無しさん
08/08/14 12:24:34
>>808
デリートでセルを消してもそのセル上のボタンは幅が0になるだけで線になって残りません?
完全に消去する方法が知りたいのですが。

810:デフォルトの名無しさん
08/08/14 12:48:34
>>809
セルの行削除・列削除では消えませんよ。
図形描画のツールバーを出して、オブジェクト選択のボタンを使うべし。

811:デフォルトの名無しさん
08/08/14 14:23:44
1行1件のデータシートがあります。
顧客 製品 台数
A あ 1
A あ 1
B あ 1
B あ 1
B い 1

これの顧客Bだけ範囲選択して
B あ 2
B い 1  という結果を別シートに出したいのです。
・選択1行目をコピー貼り付け
・2行目以降、前回顧客と製品名が一致したら台数インクリメント
・Activecell.Rows.Count数だけループ
という方法でなくもっといいのはありますか?


812:デフォルトの名無しさん
08/08/14 17:16:40
CountIf

813:デフォルトの名無しさん
08/08/14 17:52:52
>>811
ピボットテーブル知ってる?

814:デフォルトの名無しさん
08/08/14 18:17:46
>>811
オートフィルタの抽出を別場所にする

815:デフォルトの名無しさん
08/08/14 18:22:52
>>811
おいらならオートフィルタで指定の顧客名を抽出して、
if (cells(i,2).value = cells(i+1,2).value) daisu++}
ってインクリメントするかな。


816:デフォルトの名無しさん
08/08/14 18:24:49
すいません。文法間違えました。
javascriptとしても間違えております・・・比較演算子違うし。

if cells(i,2).value = cells(i+1,2).value then
daisu = daisu + 1
end if

でした。本当に申し訳ない。

817:811
08/08/14 18:32:04
目的は別シートに貼り付けるため、なのです。
全体を集計するのであればピボットで済みますが、そうではなく
必要な部分だけ抜き取って(項目も無し)それだけ集計して貼り付けたいのです。

手作業ではコピー、貼り付けしたあと、台数を修正して余計な行を削除
なんですがこれを自動化したいだけです。
標準の集計やピボットを利用するには、項目行もコピーしてシートも新しくせねばならず
また、完成した集計表では顧客名や製品名に勝手に空欄が出来てしまうので
使いたい形に修正するだけで作業が余計に感じます。

818:デフォルトの名無しさん
08/08/14 18:35:25
これはマクロの記録で十分対応できるレベルだろ

819:デフォルトの名無しさん
08/08/14 18:52:49
・選択部分を新しいシートにコピペ
・製品を軸に昇順に並べ替え
・製品名が変わるまでloop、んでカウント
・一番上の台数に代入
・代入した行にフラグ
・フラグ立てた行以外削除

こんな感じ?その情報でやるなら。
操作者が範囲を選択する時点で、選択ミスの可能性があるから、俺ならやらん。

きっと製品名は凄い沢山あるんだろうね。VBAスレで聞くって事は。

820:y
08/08/14 21:33:06
>>817
うーん。ピボットテーブルはなるべく敬遠したいとのことですが、
必要な部分だけ抜き取ったり、ある項目だけの台数を合計したり、というのは
やはりピボットテーブルが本領を発揮する場面だと思うんですね。
「項目行もコピーしてシートも新しくせねばならず」とありますが、
ひとつピボットテーブルを作ってしまえば、あとはその設定を変えながら
運用すればいいわけです。
VBAでピボットテーブルも操作できることはご存知ですよね?
抜き出したい顧客に合わせてピボットテーブルの抽出アイテムを変えたり、
抽出結果を任意の別シートに貼り付けたりするような、手作業では
面倒な部分をVBAで自動化すればいいと思うんです。
全体をVBAで実現するやり方で考えていらっしゃる方もおられるので、
そちらも検討した上で、もう1つの考え方として受け取ってください。


821:y
08/08/14 21:43:08
ピボットテーブルで処理する例です。

Sub ch_pivot()
Dim item As PivotItem, kName As String
kName = InputBox("顧客名を入力してください")
With Sheets("Sheet2")
With .PivotTables("ピボットテーブル1")
.PivotCache.Refresh
.PivotFields("顧客").PivotItems(kName).Visible = True
For Each item In .PivotFields("顧客").PivotItems
If item.Name <> kName Then item.Visible = False
Next
End With
Range(.Cells(5, 1), .Cells(.Rows.Count, 3).End(xlUp)).Copy _
Destination:=Application.InputBox("貼り付け先を指定してください", Type:=8)
End With
End Sub

822:y
08/08/14 21:46:09
>>822のコードは、次のような前提で動作します。
(下のように設定されていないと動作しません)

○データシート
>>811のデータは"Sheet1"という名前のワークシートにおかれているとする。

○ユーザー定義の名前
・任意の名前(ここでは"pivotSource")を定義する。参照範囲は次のようにする。
 =OFFSET(Sheet1!$A$1,0,0,COUNTA(Sheet1!$A:$A),3)

○ピボットテーブル
・使用するデータの範囲を"pivotSource"とする
・レイアウトは行に"顧客"と"製品"。データに"台数"(集計方法は合計)。
・名前は"ピボットテーブル1"
・配置する場所は"Sheet2"という名前のワークシートの$A$3。
・顧客ごとの集計を非表示に
・列の総計を非表示に


823:y
08/08/14 21:59:43
すみません。「>>822のコード」→「>>821のコード」の間違いです。
あとピボットテーブルはピボットテーブルウィザードなどを利用して
自分で設置してください。(セル範囲の名前の定義も自分で。)


824:デフォルトの名無しさん
08/08/14 22:49:18
グラフを複数作成しようとしていますが、速度が10秒/1グラフと遅く
特に書式設定が速度的に遅いと感じます。

書式、データ数は同じで、データ内容だけ異なります。
グラフはチャート毎に1シートに描いているものです。
(埋め込みグラフじゃないほう?)

グラフの雛形的なものを使って複数グラフを作成し、
少しでも高速化したいと考えています。

実施したのですがデータの設定の順番が異なるのか、うまくいきません。
何かグラフコピーペーストのセオリーのようなものがあれば教えてください。


825:デフォルトの名無しさん
08/08/14 23:26:51
>>824
screenupdate=Falseは既に実施しております。

826:デフォルトの名無しさん
08/08/15 00:29:15
データの数とグラフの数が多いと遅くなると思いますよ。
オブジェクト数が多いとExcelの動作が劇的に重くなるのは仕様なのかな?
グラフ1つ作成するのに10秒かかるんだったらマクロの記録でグラフ作成するコード作って
比較してみればいいんじゃないですか?

827:デフォルトの名無しさん
08/08/15 05:25:40
>>826
マクロの記録を参考に、いらない部分を削り、作成しました。
それで遅いので、複数グラフ作成で速くする方法はないかと考えました。


828:デフォルトの名無しさん
08/08/15 05:45:16
質問があります。
正方行列(2×2)を一行(1×4)で表したとき、関数で配列(2×2)を作り、
さらにこの配列を関数で計算する方法が分かりません。例えば
1 2
3 4
の行列をエクセルシート上でA1:D1に1,2,3,4と入力したとき
=test(A1:D1)として配列(2×2)を作ります。

Function test(data As Range)
Dim A(1, 1) As Double
k = 1
For i = 1 To 2
For j = 1 To 2
k = k + 1
A(i - 1, j - 1) = data(k - 1)
Next
Next
test = A
End Function

このとき行列式(=1*4-2*3)を計算するため
=determ(test(A1:D1))とすると、#VALUE!となって困ってます。

Function determ(B As Double)
determ = B(0, 0) * B(1, 1) - B(0, 1) * B(1, 0)
End Function

いろいろ試してみたのですが、どうも配列の扱いがよく分からなくて。
XP Excel2003ですがよろしくお願いします。

829:デフォルトの名無しさん
08/08/15 07:13:14
第一要因
 determ関数の引数が配列ではない
 配列を引数に取る場合は
 B() As Double
 のように、配列変数の後ろに () を付けなければならない

第二要因
 引数の型が合ってない
 配列を返す関数では、関数内で型を指定していても
 返される値はVariant型の配列となる

第三要因
 配列の要素数が合ってない
 シート上には0行目0列目が無いので、
 配列(1, 1) つまりは 配列(0 To 1, 0 To 1)
 を関数の結果として返すと、自動的に
 配列(1 To 2, 1 To 2)
 のように下限要素が0から1に変換される

以上を踏まえてdetermの方を
Function determ(B() As Variant)
  determ = B(1, 1) * B(2, 2) - B(1, 2) * B(2, 1)
End Function
とすれば動くと思う

ところで、>>828の例は質問用に簡素化しただけで、実際は配列要素数を決め打ちではなく精査してるよね?
あと、A(i - 1, j - 1) = data(k - 1) で、全部 -1 やってるのは何か意味有るの?

830:828
08/08/15 07:54:20
>>829
早速ありがトン
急いで試してみたけど、なんかうまくいかない...

全部-1にしてるのは、配列は0から始まるって教わったので。
お察しの通り、本とは大きい行列なので、簡略化したんだけど。
=test(A1:D1)で配列をシートで見たけど合ってた。

ちょっとこれから会社なので、夜にまた試してみるよ。

831:デフォルトの名無しさん
08/08/15 08:53:51
最低限、君が書いた例通り、A1:D1に1,2,3,4と入れて
=determ(test(A1:D1))
とする分には問題なく動く
上手く行かないとすれば、実際のコードに適応する上で君が何か間違ってるからだろう

あと、0から始まるのはそうなんだが、
For i = 1 To 2
For j = 1 To 2
k = k + 1
A(i - 1, j - 1) = data(k - 1)

For i = 0 To 1 '<- 1〜2ではなく0〜1
For j = 0 To 1
A(i, j) = data(k)
k = k + 1 '<- 変数kのインクリメントを後回しに
とすれば、3カ所の -1 は不要なんだが、何故わざわざi,j,kに1多い数を入れて -1 してるのかなぁと

832:デフォルトの名無しさん
08/08/15 12:57:16
Excelでタブを作るのは無理ですか?

833:デフォルトの名無しさん
08/08/15 14:24:13
へるぷみー。
テキストボックスに入力された名前を
新規のワークシートに付ける際に、例えば「あいうえお」という
名前のシートが既にあるにもかかわらず
テキストボックスに「あいうえお」と書かれた場合は
自動で「あいうえお1」次にまた「あいうえお」と入力されてしまった場合は
「あいうえお2」になるようにしたいと思い、
下記のようなコードを入力してみました。
(sheetnameがテキストボックスのオブジェクト名です)
Dim i As Integer, cnt As Integer, n As Integer
cnt = Worksheets.Count
n = 1
If CheckBox.Value = True Then
For i = 1 To cnt
Do Until sheetname.Value <> Worksheets(i).Name
sheetname.Value = sheetname.Value & n
n = n + 1
Loop
Next i
Worksheets.Add after:=Worksheets(cnt)
ActiveSheet.Name = sheetname.Value
End if

このコードだと
「あいうえお」→「あいうえお1」→「あいうえお11」
→「あいうえお111」
という風になってしまいました。
できるシリーズの本とかで調べたりWeb検索してみたりしたのですが
解決策が見つかりませんでした。
よろしくお願いします。

834:デフォルトの名無しさん
08/08/15 15:52:13
>>833
どこがVBAの質問なんだか。単純な名前生成の問題じゃないか。
毎回シート名に"n"を継ぎ足すんじゃなくて、都度入力された名前に"n"を継ぎ足せばいいだろ。
オブジェクト変数を使いまわすんじゃなくて、一時変数で処理する癖をつけた方がいいな。

835:デフォルトの名無しさん
08/08/15 17:07:40
>>832
何のタブかわからんが、ブックのタブならツールバーで作る手がある

836:デフォルトの名無しさん
08/08/15 18:48:16
>>832
ユーザーフォームでタブを云々ならマルチページなりタブストリップなりをコントロールから追加

837:デフォルトの名無しさん
08/08/15 19:03:27
ひとつのシートに複数のタブブラウザーみたいなのを作りたいと思っています。

838:デフォルトの名無しさん
08/08/15 19:27:20
複数のシートにしちゃいけないの?

839:デフォルトの名無しさん
08/08/15 20:10:50
ひとつのシートに複数のタブじゃないとダメなんです。できませんかねぇ。

840:デフォルトの名無しさん
08/08/15 20:16:54
わざわざシートタブがあるのにそれを使わずに更にタブをつける理由も抜きに、「できませんかねぇ」じゃねぇよ。

841:デフォルトの名無しさん
08/08/15 20:19:42
やろうとすれば出来るけど面倒

842:828
08/08/15 20:21:18
>>831
たびたびありがとー

朝はバタバタしててできなかったけど解決しますた^^
ご指摘のとおりにFor文は0〜1にした方がすっきりしますね。

教科書とか読むとほとんど1〜だったのでなんか理由があるのかと
なんとなくこうしてました。

これで行列のいろんな演算ができそうです。
感謝、感謝

843:デフォルトの名無しさん
08/08/15 20:38:15
ひとつのシートにタブを複数にする理由は本当はプログラムを組んでPOSシステムみたいなものを作りたいのですが知識がなく、それをExcelでと考えています。面倒でも構いませんから教えていただきたいです。

844:デフォルトの名無しさん
08/08/15 20:43:01
>>843
道具には向き不向きというものがあるよ

845:デフォルトの名無しさん
08/08/15 21:33:42
>>842
配列についてはExcel VBAのヘルプで Option BASE で検索してみて


846:デフォルトの名無しさん
08/08/15 21:52:43
>>843
ボタンをタブに見立てて仮想的に実装すれば良い

これで解らないなら君には無理
諦めるか金払って作ってもらえ

847:828
08/08/15 22:03:14
>>845
Option BASEで配列の最小値を0か1に選択できるのか
これは便利だわ
さんくす!

848:デフォルトの名無しさん
08/08/15 22:26:03
Option BASEは基本使っちゃいけない機能の1つ

初心者がパッと見る限りは便利そうに見えるが
コードの明示性が著しく損なわれる

Option Private
Option Compare
も同じく、プロシージャや関数で逐一指定するのが正しい
逐一指定ではコードが長くなり冗長だと言う奴も居るが、冗長とは単に長いだけではなく無駄に長い意味もなく長いということで
これらの逐一指定は、それらの参照レベルや比較方式などを明示するという意味を持っているので冗長とはならない

グローバル変数の多用を害とするのも同じような理由から

849:y
08/08/15 23:03:56
Option BASE 1 が期待通りに機能しない場合もあるので、それも頭に入れておいたほうがいいかも。
これを宣言していても、「Array 関数またはキーワード ParamArray を使って作成する配列の添字の最小値は 0 」
となってしまいます(ヘルプ参照)。Split関数が生成する配列も同様に Option BASE 1 の影響を受けません。


850:デフォルトの名無しさん
08/08/15 23:17:43
>>834
ありがとうございます!
一時変数なるものについて勉強してから
それをヒントにもう一度よく考えてみます。

851:デフォルトの名無しさん
08/08/15 23:19:17
それは「期待通りに機能しない」とは違う。
プログラムに置いて「期待通りに機能しない」というのは、
仕様書きに反する結果を返す場合などに使用する言葉。
「仕様通りに機能しない」とほぼ同義である。

Array、ParamArray、SplitなどがOption BASE 1の影響を受けないのは、
確立された仕様で常に同じ結果になるので、これが思惑通りじゃなかった場合は
「間違った期待をしていた」ということになる。
仕様を間違って覚えていたら、思惑通りに動かないのは当然のことだからね。

852:y
08/08/15 23:33:36
あ、なるほど。その通りですね。


853:デフォルトの名無しさん
08/08/15 23:43:46
別にそこまで字面にこだわるようなものじゃないと思うが。
期待通りに機能しない、というのは単純に使用者が想定しがちな
一貫性を提供しない、ということだろう。

854:z
08/08/16 00:21:47
Application.Application.Application

855:デフォルトの名無しさん
08/08/16 06:50:42
OPTION BASEってプロシージャで1回しか宣言出来ないのがなぁ。
ま、OPTIONだから当然なんだけどね。

他の言語はあまり数知らないけど、配列で0からスタートしない言語ってあるのかな。
2系列しか言語知らないけど、配列は0から始まる。って覚えてるから違和感はないな。


856:デフォルトの名無しさん
08/08/16 06:57:54
>配列で0からスタートしない言語ってあるのかな

最近のCOBOLは違うかどうかまでは知らんけど、少なくともCOBOL85は1からスタート

857:828
08/08/16 07:38:49
>>848
ご忠告ありがとー
Opttion BASE 1だと配列に格納する場合の添字と
配列から取り出すときの添字の値が同じだし、

行列の添字が一致するので便利と思ったけど、
使うときは注意したいと思います。

最終的には数千の行列を計算したいので逐一指定だけでは大変かと
思っていたけど、初心者の私にはまずこれでやってみます。

>>849
yさんありトンです
過去レスで配列のこともいろいろ書かれてますが
読み返すと少しずつ分かってきました。

Array関数などはまだ使ったことがないけど、
使うときにはOption Baseに添字が影響されないことを思い出します。

皆さん大変勉強になりました。初心者の質問に真摯に対応していただいて
なんかうれしいです。ありがとうございます。

858:デフォルトの名無しさん
08/08/16 10:59:40
VBが嫌なのは普通に長さ0の配列を作れないこと

859:デフォルトの名無しさん
08/08/16 11:00:38
ちょっと古い質問ですまんが、>>736
>> Const DATA_N As Integer = 50
>数値型、文字列型の定数で型指定するな
これってどういうこと?
Const DATA_N = 50
の方がいいってこと?

860:y
08/08/16 11:58:13
>>858
長さ0の配列って、どんなことに便利なんですか?
アイテムを持っていないCollectionのようなイメージでしょうか。

861:デフォルトの名無しさん
08/08/16 12:09:50
>>860
こういう一貫性のあるコードを書くことができる:
Dim anArray() As String
anArray = Split("") ' Variant()ならArray()でよし

For Each eachCell In [~~:~~]
ReDim Preserve anArray(UBound(anArray) + 1)
If pred(eachCell) Then anArray(UBound(anArray)) = eachCell
Next eachCell
別に例としてはなんでもいいんだけれども、
とにかく『空』の表現がないといろいろと面倒。

862:y
08/08/16 12:48:05
ありがとうございます。空の状態から1つずつ追加する、みたいなイメージのコーディングが可能に
なるわけですね。にしても、Split("")という表現でそれを実現できるとは...
ローカルウィンドウで確認すると、代入直後の変数anArrayの型がString(0 to -1)なんてなっているあたり、
Base0の理屈からすれば正しいのかもしれないですが、たしかに普通じゃないですね。


863:デフォルトの名無しさん
08/08/16 13:14:19
VBAならEnptyでいいのでは?


864:デフォルトの名無しさん
08/08/16 13:45:38
JAVAあたりだと、配列数をredimする必要もなく、どんどんputして行けるんだよね。
それが良いとは一概に言えないけど、VBだとそこらへんが不便。

865:デフォルトの名無しさん
08/08/16 15:58:34
Enpty?

866:デフォルトの名無しさん
08/08/16 17:16:54
>>864
たぶんjava.util.List<E>のことを言っているのだと思うが、Javaでも
配列じゃダメ(というわけでもないがReDim無いので相当に面倒)だがね。

VBは標準でDictionary揃えていないあたりコレクションの取り扱いが面倒。

867:デフォルトの名無しさん
08/08/16 17:53:35
は?コレクションならあるだろ

868:デフォルトの名無しさん
08/08/16 18:02:01
エンプティダンプティ

869:デフォルトの名無しさん
08/08/16 18:10:33
>>867
コレクションっていうのはJavaでいうコレクションのことね。
SetやらMapやらQueueやら。

870:デフォルトの名無しさん
08/08/16 21:07:46
アホが

871:デフォルトの名無しさん
08/08/16 21:08:17
Jamaだよ

872:デフォルトの名無しさん
08/08/17 00:35:10
設定としては再計算を自動にしているのですが、マクロでやると、
エクセルのコマンドバーに「再計算」が表示されます。そこを自動にするため、
SendKeys "{F9}", True
を書いてみたものの何の役にも立っていません。
どのようにしたら、いいでしょうか?
ご教示願います。



873:デフォルトの名無しさん
08/08/17 00:49:14
年月日時間の計算なのですが、
VBAで hoge = cells(1,1).value - cells(1,2).value とすると型が一致しないと怒られますが、
ワークシート関数で、 =A1-B1 とやると、うまく計算してくれます。

ワークシート関数にはVBAには無い自動整形機能などが付いているのでしょうか。

874:デフォルトの名無しさん
08/08/17 00:49:59
言い方がおかしかったです・・・・。
どんなVBAの機能で計算されているのでしょうか。

875:デフォルトの名無しさん
08/08/17 01:52:48
>>872
Sheet.Calculate使えばいいでしょ

>>873-874
そもそもVBAとExcelの演算はぜんぜん別物。
Excelの計算はVBAの機能などではない。

876:デフォルトの名無しさん
08/08/17 01:54:13
あー、わざわざSheet指定じゃなくて、Application.Calculateの方がよさそうだな。

877:y
08/08/17 02:01:48
>>872
URLリンク(support.microsoft.com)
ただし、Excel2002や2003でも、再計算をしても「再計算」の文字が消えない、
という状況はよくあるようですし、私も時々経験します。理由は分かりませんが、
シート上の数式の個数が多いと起こりやすい気がします。
しかし実際には、きちんと計算されているようです。

ちなみに、マクロで再計算を実行したい場合は、SendKeysよりもCaluculateメソッド
のほうが妥当です。

878:y
08/08/17 02:03:20
>>875 すみません。被りました。

879:872
08/08/17 02:52:19
2003 XPです。
再計算はされていません。再計算に続けてワークシートイベントのcalculateが
動くようにしているつもりなのですが、再計算のために手動でのF9キーを
押すと、きちんと再計算後のイベントが働き、目的が達成されます。
ただ、今日は、状況、目論見等の説明がうまく書けてないので、また、来ます。
夜遅くに、ありがとうございました。


880:デフォルトの名無しさん
08/08/18 17:05:33
すみません。ご指導お願いします。。
100万行以上あるテキストファイルを、1万行づつ分割して
元のデータの形式、区切り文字、列のデータ形式
を指定し、エクセルシートに取り込んむVBAは可能でしょうか?
可能であるならどのようにしたらいいのでしょうか?(Accessは使わず)
  宜しくお願いします。


881:デフォルトの名無しさん
08/08/18 18:19:56
>>880
で、幾ら払うの?

882:y
08/08/18 18:54:52
>>880
偶然ですが、ちょうど私も500万件の氏名+ふりがなデータを使って
似たようなテストをやっている最中です(遊びで)。うちの場合は
1シートあたり5万行ずつで100シート分です。理屈としてはできるはずですが、
途中何が起こるかわからないので「可能です」とは言えません。

テキストファイルの取り込み方は、まず「テキストファイル VBA」とかで検索してみてください。
たくさん出てきますよ。


883:デフォルトの名無しさん
08/08/18 19:40:16
>>880
Excelのバージョンによらない解決法は、
1. テキストファイルを順次読み込み、1万行分のファイルを作る
2. Excelの機能でテキストファイルを読み込む
3. 読み込んだシートをBookのシートにコピー
4. 1にもどる

884:デフォルトの名無しさん
08/08/18 19:41:52
>>882
どう考えても「可能」だろ。
適当なこと言うなよ。

885:デフォルトの名無しさん
08/08/18 19:50:10
名前とふりがなで1件50バイトとして5万行で2.5MB
100シートだから250MB
おれはexcelで30MB以上のファイル開いたことないなー

886:デフォルトの名無しさん
08/08/18 20:05:49
Excelにデータを読み込むのが目的じゃなくて、読み込んだデータを何かに使うのが目的じゃないのか?
だとしたら、SQLiteとかの方がいいかもしれんぞ。

887:デフォルトの名無しさん
08/08/18 20:09:55
いや、だったらmdbでいいだろ

888:y
08/08/18 20:35:22
>>884
あ、可能なんですね。失礼しました。
こんなに件数が膨大だと、メモリの関係で途中で止まってしまうとか、その他不測の事態が
起こったりしないとは言い切れず、従って「可能」とも言い切れず...みたいな心境でした。

氏名生成を16:00頃に開始して、今でようやく400万件です。
テキストファイルで120Mbになっています。どうなることやら...


889:デフォルトの名無しさん
08/08/18 20:43:24
というか、excelに向いてる事、向いてない事を考えろよ。

出来る。と向いているは全く違うぞ?
yみたいに遊びで試すなら何やっても良いけど、
仕事で使うなら、excelで大量のデータ処理をするなんて考えは捨てるべき。

と思ったけど、yは500万件の氏名データ持ってる時点で遊びじゃない。
もっと色々と自覚したほうが良い。

890:デフォルトの名無しさん
08/08/18 20:52:46
>>880
速度気にせずその条件を実現するなら単にループを二重に回せば良いだけだろ。

外側はDo...Loopで、テキストファイルのデータが終わったら終了。
内側はFor...Nextで、1 To 10000のカウンタループ。

外側のループで新規シート作ったら、内側のループで1行分のデータを読み込み、
シートに入力していけば良い。データが無くなったらExit Doで一気に外側のループも抜ける。
内側のループ内でやることは、データが3行でも100行でも1000000行でも変わらない
まあ、データ量が多い場合は1行ずつ読み込まないで、全体を変数に取って処理したり
逐一セルに代入するより配列介した方が早いとかはあるけどな

内側のループ内でやること、つまり1行分を読み込んでExcelに適用することすら解らないと言うなら、
>>1★5読んで出直すか、>>881も言うように金払って作ってもらえ。

因みに、作成できるシートの数はシートの内容や環境依存で、
内容では使用行列数もそうだが修飾が大きく影響し、環境では主に物理メモリのサイズが影響する。

>>889
> と思ったけど、yは500万件の氏名データ持ってる時点で遊びじゃない。
持ってるんじゃなくて、プログラムのテストや勉強用で作る場合もあるだろ。
俺もVBAじゃなういが、自作プログラムのテスト用に住所氏名などの仮想データを数十万件と用意したこともある。
実用ではなくテストや勉強や遊び用なら、データは同じ氏名の繰り返しでも何ら問題ないからな。
俺の場合は10件くらいの適当な住所氏名の繰り返しにしたが。

891:y
08/08/18 21:03:44
>>889
誤解ですよ〜(泣)。500万件の個人情報を握っているわけではなく、
このソフトで氏名を生成しているだけです。
URLリンク(www.vector.co.jp)
>>890が察してくださった通り、大量の仮想データを使ったテストをしようとしています。


892:デフォルトの名無しさん
08/08/18 21:36:25
Excelの仕様くらい調べてくれよ・・・

893:デフォルトの名無しさん
08/08/18 21:47:54
何勘違いしてるの?

894:デフォルトの名無しさん
08/08/18 21:52:50
どうしてもExcel VBAじゃないとだめなん?
今時珍しいぞあんな低速言語

895:デフォルトの名無しさん
08/08/18 21:54:06
yが来るようになってから、このスレが変になった

896:デフォルトの名無しさん
08/08/18 22:02:30
依存するのは物理メモリか?

897:デフォルトの名無しさん
08/08/18 22:04:15
>>895
いいじゃん。活気があって。

898:デフォルトの名無しさん
08/08/19 00:04:23
>>880は特に「単一のブックで」といった事は書いていないようだが
その辺は暗黙の了解なのだろうか

899:デフォルトの名無しさん
08/08/19 11:22:06
みなさんありがとうございます。。
補足させてください。
フォルダの中に複数のテキストファイルがあります。
それをVBAで1シートに1テキストファイルづつで取り込んで
(区切り文字(#)、列のデータ形式(文字列)を指定して)
作成済みのマクロを実行し、出力させたいのですが。。
データが大きいので5シートで1つのファイルにしたいです。
フォルダの中にはテキストファイルが100ほどあるので、結果、エクセルファイルが
20できればいいのですが。。
できればデスクトップに新しいフォルダが作成されて
その中に出力されていくようにしたいです。
お力を貸してください。よろしくお願いします。

900:デフォルトの名無しさん
08/08/19 11:28:39
現在、ユーザーフォーム上でワークシートを表示させるべく
スプレッドシートを設置することはできましたが、
このスプレッドシート上にチェックボックスを表示させる方法が分かりません。
何か良い方法があれば教えてください。お願い致します。

901:デフォルトの名無しさん
08/08/19 21:35:33
>>899
質問というより丸投げの典型例

902:デフォルトの名無しさん
08/08/19 21:37:14
>>899
ファイル名は連番のノンブルとか付いてるのかい?

フォルダに入ってるバラバラのファイル名のファイルを全部読み込む。
って言うならばVBAの範疇超えてるからスレ違い。

903:y
08/08/19 22:38:26
>>900
SpreadsheetコンポーネントのSheetオブジェクトは、Excelシートと比べてとてもシンプルな機能しかなく、
OLEObjectsプロパティも持っていないため、CheckBoxなどのコントロールを追加する領域自体が見当たりません。
コンポーネントのヘルプにもとくに触れられていないようです。
普通にユーザーフォーム上にCheckboxを配置するだけでは足りないのですか?


904:デフォルトの名無しさん
08/08/20 14:35:52
よろしくお願い致します。
OS:XP エクセル2003 VBAのことは、まったくの初心者です。
質問なのですが、下記のようなチェックボックス7にチェックが入れば、
チェックボックス8〜11に自由にチェックが入れれるようになり、
逆にチャックボックス7にチェックが入ってない場合は、
チェックボックス8〜11のチェックはクリアされ、
チェックできないものを作りました。

ここから、チェックボックス7にチェック入れたあとは、
必ずチェックボックス9〜11のどれかにチェックが入っている状態
(ラジオボタンのような)で、チェックボックス7にチェックが
入ってなかったら、8〜11のチェックがクリアで尚且つ、
チェックができなくなるようにするにはどうすればよいでしょうか? 
よろしくお願い致します。

Private Sub CheckBox7_Click()
If CheckBox7.Value = True Then
CheckBox8.Enabled = True
CheckBox9.Enabled = True
CheckBox10.Enabled = True
CheckBox11.Enabled = True
Else
CheckBox8.Value = False
CheckBox9.Value = False
CheckBox10.Value = False
CheckBox11.Value = False
CheckBox8.Enabled = False
CheckBox9.Enabled = False
CheckBox10.Enabled = False
CheckBox11.Enabled = False
End If
End Sub

905:y
08/08/20 17:04:59
>>904
>ここから、チェックボックス7にチェック入れたあとは、
>必ずチェックボックス「9〜11」のどれかにチェックが入っている状態
とありますが、文脈からすると「8〜11」のつもりでしょうか?

8〜11にラジオボタン的な挙動をさせるには、
@CheckBox8〜11にそれぞれClickイベントプロシージャを作成
A各プロシージャには、自分以外のCheckBoxの値は全てFalse、自分の値だけをTrueにするコードを記述
すればよいかと思います。なお、「自分以外のCheckBoxの値は全てFalse」の部分は、
別にプロシージャを作成して、各イベントプロシージャから呼び出すようにすれば合理化できます。

CheckBox7がTrueになった直後は、8〜11のうちどれをTrueにするのか、とか、
8〜11のうち既にTrueになっているものがClickされたらどうするのか、などの点が
はっきりしませんが、方針さえ決めてしまえば簡単に修正できるはずです。


906:デフォルトの名無しさん
08/08/20 18:53:18
こいつの口調、癇に障る。
ただそれだけで、消えてほしいと願う。

907:デフォルトの名無しさん
08/08/20 19:57:47
お前が消えればいいじゃん

908:デフォルトの名無しさん
08/08/20 20:50:56
>>906
お前の方が癇に障って癪だわ。お前が消えろ。

909:デフォルトの名無しさん
08/08/20 21:22:01
自作自演ヒドス

910:デフォルトの名無しさん
08/08/20 23:10:50
匿名掲示板でコテハンを長く名乗るって事は、それだけのリスクがあると言う事。
自分の向学の為ならば、コテを名乗る必要はどこにもない。

仮に間違った事を回答したとしても、責任なんてない。逃げるのも簡単。
それが匿名掲示板だから。

自分で退路を塞ぐだけでも愚かな事なり。

911:デフォルトの名無しさん
08/08/20 23:27:26
そんなのどうでもいいわ。ここはExcel VBAのスレだろ

912:デフォルトの名無しさん
08/08/20 23:27:31
コテハンがそんな大層なもんかね
何か勘違いしてるんじゃないの

913:デフォルトの名無しさん
08/08/20 23:45:02
退路っていうのは間違っても訂正しないことなんだろうか

914:デフォルトの名無しさん
08/08/20 23:47:48
荒れてますな〜w

915:デフォルトの名無しさん
08/08/20 23:49:41
>>914
マクロだけにねプッ

916:デフォルトの名無しさん
08/08/21 08:41:58
>>905

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

917:デフォルトの名無しさん
08/08/21 21:14:17
すんません。質問させてください。

違う部署の人にヘルプを頼みまして、条件に合致する物にフラグを立ててくれたんです。
後で処理するんで、文字列の最後尾に記号をくっつけといてもらったのですが、
よりによって、アスタリスクが最後尾に付いてました。

適切に指示しなかった私が悪いと思い、今後は別の記号か、
別のセルに数字でフラグを立ててもらう事にしたのですが、
そこで質問です・・・。

autofilterも、replaceも、*はワイルドマークとして機能しているようですが、
エスケープシーケンスは存在しますでしょうか。
文字列としての*を判定させたい場合の処理などが可能でしたら教えてください。


918:デフォルトの名無しさん
08/08/21 21:22:29
[*]

919:デフォルトの名無しさん
08/08/21 21:43:27
ありがとうー

920:デフォルトの名無しさん
08/08/21 21:59:10
質問です。
他のxlsファイルを読み込んでいろいろ作業するのを、マクロの記録からやると
切り替えごとにWindows("hoge.xls").Activateになりますよね?
これだとファイル名を変えると動かなくなるのでなんとかしたいのですが
元の方はThisworkbook.Activateに置き換えすると済みますが
相手ファイルも同様に使いやすくするにはどうしてますか?

GetOpenFileで指定したファイルをどこかの非表示セルに書き込んで
それを読み込む方法しかないのでしょうか?
他にいい保存場所ないのかなぁ?

921:デフォルトの名無しさん
08/08/21 22:14:15
起動中のエクセルファイルには、起動順に番号が割り当てられている。
ファイル名を指定しなくても、
Workbooks(n).Activate
(nは数字)という形で、n番目に開いたファイルをアクティブにできる


922:デフォルトの名無しさん
08/08/21 22:16:17
一時的にマクロを停止させ、
その間にワークシートを操作するプログラムを組みたいのですが躓いています。

waitメソッドを使えば実現できるかと思ったのですが、
マクロは停止するけれどもワークシートが操作不可能です。

実現するべく何が良い方法があればご教授ください。

923:デフォルトの名無しさん
08/08/21 22:18:11
doevents

924:デフォルトの名無しさん
08/08/21 22:25:07
>>920
hoge=Activexworkbook.nameで開いたファイル名を取得

925:デフォルトの名無しさん
08/08/21 22:25:33
コントロール配列使えないVBAももうちょっと頑張ってくれればいいのにな。
vbe.netとかつくって欲しい。

926:920
08/08/21 22:32:10
>>924
それだと毎回ダイアログ画面で指定しなきゃいけませんよね?
ファイル名を変えちゃったときに、一度指定してもらうだけで済ませたいのです。

927:y
08/08/21 22:48:28
>>926
非表示セルか非表示シートのセルでいいのでは。
個人用マクロブックとか、外部テキストファイルとか、いろいろ考えられますが、
複雑になるだけだと思うので。


928:デフォルトの名無しさん
08/08/21 23:30:45
総合スレよりこっちの方が良さそうなのでこちらで質問します。
ワークシート上に配置したコンボボックス(フォームではなくActiveXの)に初期値として、
今日から5日前〜今日から10日後の日付をセットしたいのですが、うまくいきません。
ユーザーフォームだとUserform_Initializeの中に記述すればいいんですが、
同じ様にはできません。どうすれば良いでしょうか。
clickイベントでも試しましたがコンボボックスはchangeイベントしかダメなのかな?

929:デフォルトの名無しさん
08/08/22 02:32:27
>>928
UserformにはUserformのイベントがあり、ThisWorkbookにもイベントがある。
Private Sub Workbook_Open()
For i = 4 To 0 Step -1
Sheet1.ComboBox1.AddItem Date - i, 4 - i
Next
Sheet1.ComboBox1.ListIndex = 0
End Sub


930:928
08/08/22 07:23:05
>>929
そっか、ブックを開いた時にイベント発生させれば良かったのか。
ありがとうございました。

931:デフォルトの名無しさん
08/08/23 03:58:17
相対参照を含む数式を位置関係を考慮してずらしてコピーする方法はありますでしょうか
コピー元C5セル:=B5
コピー先C10セル:=B10
のようにコピーしたいのですが
Range(C10).formula=Range(C5).formula
のようにするとC10が=B5になってしまいます。
調べてもFillDownというものしか出てこず離れたところにコピーするやり方が分かりません。
すみませんがご存知の方教えていただけないでしょうか

932:デフォルトの名無しさん
08/08/23 06:33:53
>>931
Range("C10").FormulaR1C1 = Range("C5").FormulaR1C1

933:デフォルトの名無しさん
08/08/23 14:03:39
>>932
ありがとうございます
意図したことが出来ました


934:デフォルトの名無しさん
08/08/23 15:59:51
VBA使って関数や数式のコピーってどうなのよ。
モジュールに数式書いてくれればすぐわかるのに、
数式のコピーって、いちいちプロパティで調べないといけないから面倒なんだけど。

なんでそんな事するの?死ぬの?

935:デフォルトの名無しさん
08/08/23 16:14:09
>>934
あなたは13日後にしにます

936:デフォルトの名無しさん
08/08/23 17:40:05
呪殺予告きたー!
これは逮捕だな

937:デフォルトの名無しさん
08/08/23 21:27:46
>>934の言っている意味がわからない。
数式コピーされると死ぬの?呪殺されちゃうの?

938:デフォルトの名無しさん
08/08/23 21:53:17
なれないVBAで苦労しているのですが、オートシェイプ周りの制御はどうすれば
良いんでしょうか。移動や変形どころか、アクセス方法すら分からずじまいで。

取っ掛かりだけで十分なので、教えていただければ幸いであります。
流れ読まずにすまんですたい。

939:デフォルトの名無しさん
08/08/23 22:00:01
なにがしたいの?

940:側近中の側近 ◆0351148456
08/08/23 22:09:37
>>938
(っ´▽`)っ
マクロの記録でやってみればいいじゃん

941:デフォルトの名無しさん
08/08/23 22:20:50
>>939
「頂点の編集」がグリッド無視するのをどうにかしたり、直線を他のオートシェイプに置換できないかなと。

>>940
あーなるほどこんな手が。取っ掛かりが掴めました。ありがとうございます。

942:側近中の側近 ◆0351148456
08/08/23 22:27:25
(っ´▽`)っ
テンプレに
わからなければ、とりあえず「マクロの記録」をやってみましょう
がないことに驚き☆

943:デフォルトの名無しさん
08/08/23 22:33:10
Excell2007でVBAでプログラム組んで動かしたんだけど
かなり実行に時間がかかってしまう・・・

今のパソコンはC2Dの2.4Gでメモリ2GでXP何だけど
ハードを新しくするのとOSをVistaにするのどっちが効果的ですか?

944:デフォルトの名無しさん
08/08/23 22:34:16
真逆の選択肢に見えるのが面白いw

945:デフォルトの名無しさん
08/08/23 22:39:42
>>943
64bit Vistaにしたまえ

946:y
08/08/23 22:50:05
>>943
もうご存知かもしれませんが、>>724もとりあえず参考までに。



947:デフォルトの名無しさん
08/08/23 22:50:45
>>934
出来てありがとうって言ってるのにその追い討ちはわけがわかりませんww
数式コピーできなくても死にはしませんよ
VBAに書くと柔軟性が失われるから外出しにしておきたいのです。
再利用性を高めるのに最も良い方法は命令をコマンドにすることです。数式に限らずSQLなどの柔軟性の高い命令は外出しが良いのです。

948:デフォルトの名無しさん
08/08/23 22:52:21
リストボックスで複数選択した分だけ
H列の11行目から4行ずつ下へオートフィルを使ったコピーで展開したいんだけど、
コードがうまく思いつかなくて四苦八苦してます。


リストから複数選択した分をjに入れたとして、
コードは
Range("H7:H10").AutoFill Destination:=Range("H7:H10+j")


としたけど中々コードが思いつかずわかりません・・・
VBA始めて2週間、本やネットで検索してもリストボックスの扱いがあまりなく苦労してます。

949:側近中の側近 ◆0351148456
08/08/23 22:55:51
>>947
(っ´▽`)っ
それだったら、数式をConst String型にしておいたほうがいいよ☆
数式のコピーよりも分かりやすいような気がする。
数式のコピーだと、>>934のように、数式がソース上どこにも出てこないことになるから。

950:デフォルトの名無しさん
08/08/23 22:59:06
>>943
スレ違いだけど
チューニングという選択がいいと思うよ
まずは使い終わった計算式を削除してみること

951:側近中の側近 ◆0351148456
08/08/23 22:59:11
(っ´▽`)っ?
>柔軟性の高い命令
今気づいた。動的に数式が変わるっていうこと?
それだとConstじゃダメだね。

952:側近中の側近 ◆0351148456
08/08/23 23:01:30
>>943
(っ´▽`)っ
「マクロの記録」で生成されたプログラムだと、
.selectが多くできるけど、これを無くすとかね。
range("A1").select
selection.value = 1

range("A1").value = 1

953:側近中の側近 ◆0351148456
08/08/23 23:20:09
>>948
(っ´▽`)っ ほ〜れほ〜れ☆
Range(Cells(7, 8), Cells(10, 8)).AutoFill Destination:=Range(Cells(7, 8), Cells(10 + j * 4, 8))

954:デフォルトの名無しさん
08/08/23 23:21:37
>>951
動的には変えませんが、数式はユーザに変えてもらうカスタマイズポイントです

955:側近中の側近 ◆0351148456
08/08/23 23:30:25
>>954
(っ´▽`)っ
ほうほう。
じゃあ、セルに名前をつけて、それでアクセスするといいかも。
Range("C10").FormulaR1C1 = Range("C5").FormulaR1C1
これだと、C5ってなんだ?ってことになる。ソース上はわからない。
ワークシートのC5を見ればわかるけどね。
たとえば、セルC5に"カスタマイズSQL"という名前を付ければ
Range("C10").FormulaR1C1 = Range("カスタマイズSQL1").FormulaR1C1
と書くことができる。
ソース上もわかりやすくなってイイ!>>934の不安も払拭される。

セルの名前は「挿入」→「名前」→「定義」で設定できるよ☆

956:側近中の側近 ◆0351148456
08/08/23 23:31:13
(っ´▽`)っ
間違えた☆

たとえば、セルC5に"カスタマイズSQL"という名前を付ければ
Range("C10").FormulaR1C1 = Range("カスタマイズSQL").FormulaR1C1
と書くことができる。

957:948
08/08/23 23:32:54
>>953
できた!サンキューです♪
胸のつっかえが取れました(o^-')b

Rangeじゃ駄目だったんですね。
これで次の勉強に進められます。

ありがとうございますヾ(o゚∀゚)ノ゛

958:デフォルトの名無しさん
08/08/24 00:23:56
VBAで課長の背骨をヘシ折る事は可能?
あと、栗とか剥ける?VBAで。

ググッても全然HITしない。

959:デフォルトの名無しさん
08/08/24 00:33:29
ああ、できるよ。

960:デフォルトの名無しさん
08/08/24 00:59:57
>>956
ありがとう
一応名前付き範囲は知ってるよ
君はのりのりですごい親切だね
また今度教えてね

961:デフォルトの名無しさん
08/08/24 01:06:38
うぜーよ

962:デフォルトの名無しさん
08/08/24 01:35:44
>>959

うっそマジ?
じゃあ例えば

Sub 課長()

Dim 課長 As Integer
Dim ボディ As Boolean
Dim 吐血 As Integer

課長 = 1
吐血 = 101


Do Until 課長 = 吐血

If Cells(課長, 1) = "" Then
ボディ = True
課長 = 課長 + 1
End If

Loop

MsgBox "課長は吐血しました。もうやめて下さい。"

End Sub

とかで課長吐血する?VBAで吐血する?

963:デフォルトの名無しさん
08/08/24 01:46:31
そのコードじゃ無理だけどな

964:デフォルトの名無しさん
08/08/24 09:10:49
VBAでルーチン組んでから、椅子で殴れば良いじゃん。

965:デフォルトの名無しさん
08/08/24 10:12:58
ハードディスクのデータをクリーンにするプログラムを組んでプレゼントしなさい。

966:デフォルトの名無しさん
08/08/24 10:20:17
VBAでできるけどスレ違い。Excel関係ないから。

967:デフォルトの名無しさん
08/08/24 10:52:44
2003です。
マクロの記録からオートシェイプをやったけど
そのまま実行すると塗りつぶし無しだけがキャンセルされてしまいます。

ActiveSheet.Shapes.AddShape(msoShapeOval, 257.25, 109.5, 39.75, 21.75).Select
Selection.ShapeRange.Fill.Visible = msoFalse
Selection.ShapeRange.Fill.Solid
Selection.ShapeRange.Fill.Transparency = 0#
Selection.ShapeRange.Line.Weight = 1.5
Selection.ShapeRange.Line.DashStyle = msoLineSolid
Selection.ShapeRange.Line.Style = msoLineSingle
Selection.ShapeRange.Line.Transparency = 0#
Selection.ShapeRange.Line.Visible = msoTrue
Selection.ShapeRange.Line.ForeColor.SchemeColor = 64
Selection.ShapeRange.Line.BackColor.RGB = RGB(255, 255, 255)
どうすれば塗りつぶし無しに出来ますか?


968:側近中の側近 ◆0351148456
08/08/24 11:07:37
>>967
(っ´▽`)っ
Selection.ShapeRange.Fill.Solid
を削除しましょう。


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

4635日前に更新/336 KB
担当:undef