最近ExelのVBAを覚え始めました。
困っていることがあります。売上の一覧シートからから提出用の
シートに項目別に貼り付けの作業をEXCELで行っているのですが。
以前はマクロで記録してまったく同じ作業を繰り返していたのですが。
最近支店が毎月のように増えるのでそのたびに
Range("E2:E6").Select←「1つ支店が増えるとの範囲を<E6>を<E7>に変更する」
Application.CutCopyMode = False
Selection.Copy
Range("I2").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
と支店が増えるたびにコピー範囲を1つ増やしていました。しかしコピーする項目分(売上・平均.....etc)だけ編集で直すのも大変なので、なんとかフォームで支店数を入力するとその値に対してコピーを行ってくれるものを作りたいのですが・・・・・。
挑戦しましたが・・・どうしてもとんでもない値をコピーしてくるか、エラーが表示されてしまいます。
よろしくお願いします。。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

これでどうでしょう


まずフォームで支店の数を入力します これをindexとします
あとはセレクトの部分を下記内容にすれば出来ないでしょうか

A ="E2:E" & index
Range(A).Select
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。
おかげで出来ました。
「A ="E2:E" & index 」を「A ="E2:E" & index + 1」に
したところ、目的の範囲をコピーしてくれました。
助かりました。ありがとうございます。
また何かありましたら。よろしくお願いします。

お礼日時:2001/10/21 15:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Q[×]ボタン.Enabled = False は可能?

済みません,質問が二つあります。

1.メインフォームから,BorderStyle = 1 のダイアログフォームを Modeless で開くのですが,このフォームを右上の[×]ボタンで閉じさせたくありません。[×]ボタンをクリックしても凹まないようにし(Disabled にし),さらに表示も淡色にする方法があれば,教えていただきたく存じます。

2.テキストボックスに入力された文字列が,ファイル名として有効かどうかを簡単に判定する方法はありますか? つまり,ファイル名に「\/:,…」などが使われていたら NG,しかしパス名で使われている分には OK といった判定が簡単にできるのでしょうか?

どうかよろしくお願いいたします。

Aベストアンサー

こんにちはmaruru01です。
1.について
単に[×]で閉じないようにするなら、FormのUnLoadイベントでCancelをTrueにしてやればよいと思います。
2.について
サンプルを作ってみました。ついでにファイル名が存在するかどうかのチェックもつけました。
No.3の方が言っているように、Open For InputまたはOutputでファイルを開いてみて、エラー値で判断します。
pathNameにファイル名(フルパス)を入れて、今回の質問では、-1が返ったら、ファイル名としては無効(不正なファイル名)ということになります。
参考になれば幸いです。
では。


'ファイルの存在チェック及び、不正ファイル名チェック
Public Function NGfileName(ByVal pathName As String) As Integer

  Dim Num As Integer

  NGfileName = 0
  Err.Number = 0

  On Error Resume Next

  'inputモードでファイルの存在チェック
  Num = FreeFile
  Open pathName For Input As #Num
  If Err.Number = 0 Then
    NGfileName = 1 'ファイルが存在する
  End If
  Close #Num

  If NGfileName = 1 Then Exit Function
  Err.Clear

  'outputモードで不正ファイル名チェック
  Num = FreeFile
  Open pathName For Output As #Num
  If Err.Number <> 0 Then
    NGfileName = -1 'ファイル名が不正
  End If
  Close #Num

  If NGfileName = 0 Then Kill pathName
  Err.Clear

End Function

こんにちはmaruru01です。
1.について
単に[×]で閉じないようにするなら、FormのUnLoadイベントでCancelをTrueにしてやればよいと思います。
2.について
サンプルを作ってみました。ついでにファイル名が存在するかどうかのチェックもつけました。
No.3の方が言っているように、Open For InputまたはOutputでファイルを開いてみて、エラー値で判断します。
pathNameにファイル名(フルパス)を入れて、今回の質問では、-1が返ったら、ファイル名としては無効(不正なファイル名)ということになります。
参...続きを読む

QApplication.ScreenUpdating = Falseで結果変わることありますか?

Application.ScreenUpdating = Falseすると超高速化されるので
これにしたいのですが、ただ画面が更新されないだけど結果には
影響することはありませんよね?

Aベストアンサー

ありません
画面の制御を行っているだけで
計算等の要素をもっていないので
処理の結果が変わることはありません

QRangeクラスのSelectメソッドが失敗しました。

VB5.0でExcel97のファイルを作成するプログラムを作成しています。
今まで順調にエクセルのほうで、コピーしたり移動したりしていたんですが
以下のようなエラーが出るようになってしまいました。
何のタイミングで出てきたかがわからないので困っています・・。

Exsheet1にアクティブシートを設定しています。
(1)の範囲をコピーして(2)の部分を先頭に貼り付けようとしています。

(1)ExSheet1.Range("A6:Z6").Copy
(2)ExSheet1.Range("A7").Select
(3)ExSheet1.Paste

(2)で、「Range クラスの Select メソッドが失敗しました。」
というエラーが出ます。

前後を詳しく書いていないので、わかりにくいと思いますが
こういったエラーが出る場合の対処方法など教えてください。
よろしくお願いいたします!

Aベストアンサー

エクセルのVBA中だけでは下記はコピーをすることを確認しました。
Sub test01()
Set ExSheet1 = Worksheets("sheet1")
ExSheet1.Range("A6:Z6").Copy
ExSheet1.Range("A7").Select
ExSheet1.Paste
' ActiveSheet.Paste
End Sub
私は前からExSheet1.Range("A7").Pasteのようなのが出来ないのに、そう書いてエラーを起こし、なぜSheetに貼りつけなければ行けないのか不思議だったです。ActiveSheet.Pasteでもだめでしょうね。

QRange("A" & x) + Range("A" & x+1) +

Range("A" & x) + Range("A" & x+1) + Range("A" & x+2) + ・・・ + Range("A" & x+n)

x:変数(基準点)
n:定数(A列のセルをいくつ足し併せるか、を指定。)


上記プログラムをループ的に行うには、どういう書き方をすれば良いでしょうか?
Do ~ Loop 文 などを使うのでしょうか。

お詳しい方、教えて下さい。
必ずお返事致します。

Aベストアンサー

>上記プログラムをループ的に行うには、どういう書き方をすれば良いでしょうか?
>Do ~ Loop 文 などを使うのでしょうか。
との質問には、#1のuruzさんが言われているように、For Nextが適していると思います。

ただ回す考え自体を除外してもよいのであれば、Sum関数を利用した方が、エリアが広い時は高速に処理を行う事が出来ます。


Option Explicit

Private Const x As Long = 1
Private Const N定数 As Long = 65535

Sub Test()
  Dim dbl1 As Double
  Dim dbl2 As Double
  Dim cur結果

  '----------------
  ' 検証1(回す)
  '----------------
  dbl1 = Now
  cur結果 = サンプル1(N定数)
  dbl2 = Now
  MsgBox "サンプル1(回す):" & cur結果 & vbTab & "計測時間" & dbl2 - dbl1

  '----------------
  ' 検証2(Sum)
  '----------------
  dbl1 = Now
  cur結果 = サンプル2(N定数)
  dbl2 = Now
  MsgBox "サンプル2(Sum):" & cur結果 & vbTab & "計測時間" & dbl2 - dbl1
End Sub

Function サンプル1(n As Long) As Currency
  Dim i As Long
  For i = 0 To n
    サンプル1 = サンプル1 + Range("A" & x + i)
  Next i
End Function

Function サンプル2(n As Long) As Currency
  Dim rng始点 As Range
  Dim rng終点 As Range
  Dim rng範囲 As Range
  
  Set rng始点 = Range("A" & x)
  Set rng終点 = rng始点.Offset(n)
  
  Set rng範囲 = Range(rng始点, rng終点)
  サンプル2 = WorksheetFunction.Sum(rng範囲)
End Function

>上記プログラムをループ的に行うには、どういう書き方をすれば良いでしょうか?
>Do ~ Loop 文 などを使うのでしょうか。
との質問には、#1のuruzさんが言われているように、For Nextが適していると思います。

ただ回す考え自体を除外してもよいのであれば、Sum関数を利用した方が、エリアが広い時は高速に処理を行う事が出来ます。


Option Explicit

Private Const x As Long = 1
Private Const N定数 As Long = 65535

Sub Test()
  Dim dbl1 As Double
  Dim dbl2 As Double
  Dim cur結果

  '...続きを読む

QLabel2.visible=false

任意の関数式を入れるとグラフを描くプログラムを作りました。表示するのに時間がかかる(といっても1秒程度ですが)ので「計算中!」と赤で表示させ、グラフが描き終わると消したいと思い、グラフ開始時にLabel2.Visible=True、終了時にLabel2.Visible=Falseを付けましたが、思惑通りには行きません。何故でしょう。おわかりになる方、教えてください。

Aベストアンサー

.NET以降,DoEvents (System.Windows.Forms.Application.DoEventsメソッド) の使用は推奨されません。
DoEventsはVB6までやVBAのような,マルチスレッドが扱えない言語における代替策でしかなく,
長時間かかる処理 (だいたい50ms:WinRT APIにおける非同期処理の目安) を超えるようであれば,その処理はバックグラウンドスレッドで処理すべきです。

VB 2005以降であれば,BackgroundWorkerコンポーネントをFormに配置し,
・Label2.Visible = False後,配置したBackgroundWorkerのRunWorkerAsyncメソッドを呼び出す
・グラフの点の計算をBackgroundWorkerのDoWorkイベントに記述する。
※このイベントの中で,Formのコントロールやコンポーネントに触ることができないので注意して下さい。
・BackgroundWorkerのRunWorkerCompletedイベントで,グラフの描画やLabel2.Visible = Trueを行う。
という方法で処理を行います。
# VB 2012以降で.NET 4.5以降をターゲットとする場合では,Async/Awaitを使う方法が推奨されます。

ref) MSDN: 方法 : バックグラウンドで操作を実行する
http://msdn.microsoft.com/ja-jp/library/hybbz6ke.aspx

.NET以降,DoEvents (System.Windows.Forms.Application.DoEventsメソッド) の使用は推奨されません。
DoEventsはVB6までやVBAのような,マルチスレッドが扱えない言語における代替策でしかなく,
長時間かかる処理 (だいたい50ms:WinRT APIにおける非同期処理の目安) を超えるようであれば,その処理はバックグラウンドスレッドで処理すべきです。

VB 2005以降であれば,BackgroundWorkerコンポーネントをFormに配置し,
・Label2.Visible = False後,配置したBackgroundWorkerのRunWorkerAsyncメソッドを呼び...続きを読む


人気Q&Aランキング

おすすめ情報