如何释放形状对象变量或将其重置?

时间:2018-10-12 07:59:31

标签: excel vba

我有以下代码,这些代码会触发自动给出数字以调整单元格范围内的形状。

<?php
$meta_query  = WC()->query->get_meta_query();
$tax_query   = WC()->query->get_tax_query();
$tax_query[] = array(
    'taxonomy' => 'product_visibility',
    'field'    => 'name',
    'terms'    => 'featured',
    'operator' => 'IN',
);

$args = array(
    'post_type'           => 'product',
    'post_status'         => 'publish',
    'posts_per_page'      => 1,
    'meta_query'          => $meta_query,
    'tax_query'           => $tax_query,
);

$featured_query = new WP_Query( $args );
if ($featured_query->have_posts()) {
    while ($featured_query->have_posts()) : 

        $featured_query->the_post();         
        $product = get_product( $featured_query->post->ID );
        $price = $product->get_price_html();            
        $sales_price_from = get_post_meta( $product->id, '_sale_price_dates_from', true );
        $sales_price_to   = get_post_meta( $product->id, '_sale_price_dates_to', true );
        $sales_price_date_from = date( "j.m.Y", $sales_price_from );
        $sales_price_date_to   = date( "j.m.Y", $sales_price_to );
        $sales_date = '<p class="offer_date">Angebot vom '.$sales_price_date_from.' bis '.$sales_price_date_to.'</p>';
        ?>

        <div class="wochenangebot"> 
        <h2>Wochenangebot</h2>
            <div class="wochenangebot_content">
            <a href="<?php the_permalink(); ?>">
                <h3><?php the_title(); ?></h3>
                <?php echo $sales_date; ?>
                <?php var_dump($sales_price_to) ?>
                <?php the_content(); ?>
            </a>
            <span class="price"><?php echo $price; ?></span>

            <div class="legal-price-info">
            <p class="wc-gzd-additional-info">
                <span class="wc-gzd-additional-info tax-info variation_modified" style="display: inline;">inkl. MwSt.</span>
                <span class="wc-gzd-additional-info shipping-costs-info variation_modified" style="display: inline;">zzgl. <a href="https://nussundgenuss.de/unser-service/" target="_blank">Versandkosten</a></span>
            </p>
        </div>  
            <a class="button" href="<?php the_permalink(); ?>">Hol es dir</a>
            </div>
            <aside>
            <?php 
                if ( has_post_thumbnail( $loop->post->ID ) ) 
                    echo get_the_post_thumbnail( $loop->post->ID, 'shop_catalog' ); 
                else 
                    echo '<img src="' . woocommerce_placeholder_img_src() . '" alt="Placeholder" >'; 
            ?>
            </aside>
        </div>

<?php   endwhile;
}
?>  

我遍历工作表的所有形状,如果它们在Sub numShape() Dim masqueA As Range Dim cpt As Integer Dim shapeTemp As shape Set masqueA = Range("b33:l42") cpt = 1 For Each shapeTemp In ActiveSheet.Shapes If Not Intersect(masqueA, shapeTemp.TopLeftCell) Is Nothing Then shapeTemp.TextFrame.Characters.Text = cpt cpt = cpt + 1 End If Next shapeTemp End Sub 范围内,我给它们增加数字(1,2,3 ....)。它能满足我的要求。
但是,如果我移动一个形状的位置,例如,我将编号1的形状与编号2的另一个形状交换,然后重新触发上述代码,则这些形状将保留其初始编号。其中使形状编号1放置在编号2之后的形状。
我尝试了不同的方式来重置形状,方法是通过与上述相同的循环:

masqueA

shapeTemp.TextFrame.Characters.Text = ""

它将形状文本设置为空,但是当我重新执行shapeTemp.TextFrame.Characters.Text = vbNullString 时,我仍然遇到相同的问题。所以我尝试用:

释放变量对象的内存
Sub numShape()

还是同样的问题。

所以我的问题是:
-形状对象如何管理文本?
-我将文本设置为形状的原始方式会导致此问题吗?

干杯!

1 个答案:

答案 0 :(得分:0)

您的问题不是形状的文本无法修改-每次调用例程时都会对其进行修改。您只是一次又一次地给他们分配相同的文本。

原因是Shapes集合按创建顺序返回工作表的形状,而不是其位置。

以下代码循环遍历您范围内的所有单元格(从上至下,从左至右),检查形状是否在该单元格内开始并为其提供下一个数字。

Sub numShape()

    Dim masqueA As Range
    Dim cpt As Integer
    Set masqueA = Range("B33:L42")
    cpt = 1

    Dim row As Long, col As Long
    For row = 1 To masqueA.Rows.Count
        For col = 1 To masqueA.Columns.Count

            Dim shapeTemp As Shape
            For Each shapeTemp In ActiveSheet.Shapes
                If Not Intersect(masqueA.Cells(row, col), shapeTemp.TopLeftCell) Is Nothing Then
                    shapeTemp.TextFrame.Characters.Text = cpt
                    cpt = cpt + 1
                End If
            Next shapeTemp
        Next col
    Next row

End Sub

如果要从左到右排序,请将colrow的for循环交换。